Lenovo S205 wifi woes

I finally decided to stop mincing about my netbooks wifi compatibility woes with Linux and fix them.  My friends and colleagues should be relieved that my constant moaning about the worst linux compatibility problem I’ve had with a computer in a long time will be over.  I should definitely thank them though, as it was their suggestions and research that has helped me solve this issue in the end.

The core problem I’ve had, along with a lot of other S205 users, is that the wifi doesn’t work out of the box with Linux.  This won’t affect every S205, just those that report their wifi hardware switch in a particular way.  The irony is that the wifi driver is loaded and works fine, it’s just that the kernel believes that the hardware disable switch for the wifi has been permanently set to disabled.  

As with lots of manufacturers, Lenovo produce their laptops with lots of variants, so you can choose the specification that suits you.  There may also be variants based on what parts they decided to put under the hood, even though two computers may functionally have the same spec.  They quite handily label these differences as models.  Commonly things like 10382JG and 1038DPG (Lenovo tend to use a consistent length string for the model info which also turns out to be handy).  You can find this model name here, /sys/class/dmi/id/product_name.

This bug appears to reference my problem, but unfortunately, it didn’t actually cure *my* problem.  

Those 3 links are various relevant bugs and patches, but a quick comparison of the models revealed that this didn’t fix my problem, simply because my model was different.  Looking at that patch shows that there is a quirks mechanism to detect  the S205 based on the product name.  If that’s the case then it looks at EC register 0x78 for the hardware switch.

The first thing to do was to confirm whether my computer used that same register, in which case I’d just need to enable the quirk.  Otherwise, I’d have to delve deeper, and add my own.

I downloaded acer_ec.pl from this site – http://code.google.com/p/aceracpi/wiki/EmbeddedController.  And gave it a run.

When I flipped the hardware switch it did appear to signal using the 0x78 EC register as suggested in the patch.  Since it did, it looked like all I’d need to do is enable the quirk the patch is designed to enable.  

Here be dragons – don’t do this unless you’ve read it all, and made backups.

I then started to prepare my computer to build kernel modules before laziness kicked in.  I found my acer-wmi.ko module in /lib/modules/$(uname -r)/kernel/drivers/platform/x86/ and  took a backup of it.  I then took a second copy of the file and modified it.  I found the existing reference to 10382JG and changed the 2 letters ‘2J’ at the end to DP to make it specify my module.  This was possible because the new value I wanted was an identical length to the existing one.  I then did an ls -l to check the files were the same length as a sanity check.  Once I copied the modified module back to it’s original location and rebooted I had wifi!  Theory confirmed.

The tool I used to modify the file was bless, since obviously using a text editor for that is generally not a good idea.  Just remember to make sure you switch to overwrite mode and that you don’t append any characters to the file.

Now all I need to do is ask the nice kernel people to add a reference to the quirk for this model.