Realtek SD Reader in HP d001nl (Ubuntu 15.10 Wily)

Recently I bought an HP Envy d001nl and I’m very happy with it, but yesterday I realized that the Realtek SD Reader was not working properly under Ubuntu 15.10 Wily. Not good, since I badly need the SD Card reader for copying photos from my Pentax K-30… Let’see what can be done.

First of all, it could be useful to exclude an hardware problem: I still have Windows 10 in my PC, barely used, but this time it proves to be useful, since it shows that the card reader is properly working. Using device manager I can find a few more details on this piece of hardware.

Windows Realtek SD Reader

It is a Realtke PCIE CardReader with device ID 522A.

Back to Ubuntu, I verify this info with:

daniele@envy:~$ lspci
02:00.0 Unassigned class [ff00]: Realtek Semiconductor Co., Ltd. Device 522a (rev 01)

A quick check on the Internet shows that the Realtek SD Reader is supported in the kernel since version 4.4, but unfortunately my Kubuntu version has kernel

daniele@envy:~$ uname -r
4.2.0-34-generic

The kernel module involved is rtsx_pci: a double check with the kernel source code shows device 522A missing in the 4.2 version, while present since 4.4.

The cleanest way to solve the problem is to build an updated kernel version, with the support for the card reader: there are a ton of pages that explain how to do that, so I won’t cover this kind of solution.

But suppose that you don’t want to change the kernel, there is still some chance to have the SD card reader properly working.

Disclaimer: I am not responsible of the damages you can do to your PC following this tutorial. Do it at your own risk.

That said, there should really be no problem if you take a bit of care.

The first step is downloading the kernel sources and the kernel headers:

daniele@envy:~$ apt-get source linux
daniele@envy:~$ sudo apt-get install linux-headers-generic

Four files are involved in the working of the Realtek SD reader:

include/linux/mfd/rtsx_pci.h
drivers/mfd/rtsx_pcr.h
drivers/mfd/rtsx_pcr.c
drivers/mfd/rts5227.c

The right way to proceed would be to backport the changes related to the device identified by the id 522A (to avoid problems due to the different kernel versions), but luckily the driver seems not to be changed much between versions 4.2 and 4.4. This means that we can use the files of the 4.4 (or more recent) kernel version straight away.

For my PC I choose to use the driver source code files found in kernel 4.5; they can be downloaded from the github kernel repository:

include/linux/mfd/rtsx_pci.h
drivers/mfd/rtsx_pcr.h
drivers/mfd/rtsx_pcr.c
drivers/mfd/rts5227.c

Once downloaded, go to the root of the kernel sources

daniele@envy:~$ cd linux-4.2.0

and copy respectively the above files in

rtsx_pci.h in include/linux/mfd/
rtsx_pcr.h in drivers/mfd/
rtsx_pcr.c in drivers/mfd/
rts5227.c in drivers/mfd/

Now it’s time to build the driver; copy your kernel configuration in the .config file to be used for kernel building

daniele@envy:~/linux-4.2.0$ cp -vi /boot/config-`uname -r` .config

Copy the Module.symvers from the kernel headers package (more info related to the Module.symvers file here)

daniele@envy:~/linux-4.2.0$ cp /lib/modules/$(uname -r)/build/Module.symvers ./

Build the modules:

daniele@envy:~/linux-4.2.0$ make prepare
daniele@envy:~/linux-4.2.0$ make modules_prepare
daniele@envy:~/linux-4.2.0$ make SUBDIRS=drivers/mfd/

If all is fine, using the following command

daniele@envy:~/linux-4.2.0$ ls drivers/mfd/*.ko | grep pci

you should see the line

drivers/mfd/rtsx_pci.ko

Remove the old driver (if loaded)

daniele@envy:~/linux-4.2.0$ sudo rmmod rtsx_pci

Make a backup copy of the old driver

daniele@envy:~/linux-4.2.0$ sudo mv /lib/modules/$(uname -r)/kernel/drivers/mfd/rtsx_pci.ko /lib/modules/$(uname -r)/kernel/drivers/mfd/rtsx_pci.ko_ORIGINAL

Copy the new driver and regenerates the module dependencies

daniele@envy:~/linux-4.2.0$ sudo cp drivers/mfd/rtsx_pci.ko /lib/modules/$(uname -r)/kernel/drivers/mfd/
daniele@envy:~/linux-4.2.0$ sudo depmod -a

Finally, load the driver

daniele@envy:~/linux-4.2.0$ sudo modprobe rtsx_pci

If the operations has been successful, once a SD card is inserted, you should see in the kernel log something like:

[ 4248.349559] rtsx_pci 0000:02:00.0: rtsx_pci_acquire_irq: pcr->msi_en = 1, pci->irq = 280
[ 4251.305275] mmc0: cannot verify signal voltage switch
[ 4251.433049] mmc0: new ultra high speed SDR50 SDHC card at address aaaa
[ 4251.447625] mmcblk0: mmc0:aaaa SU32G 29.7 GiB 
[ 4251.466839] mmcblk0: p1

and if you are using a desktop manager you should see the device:

Linux Realtek SD Reader