Comment 204 for bug 1239578

Revision history for this message
Larry Finger (larry-finger-lwfinger) wrote :

I am beginning to understand this problem, but I do not have a general fix.

In kernel 3.14, the authors of mac80211 changed the API (applications interface) for routine ieee80211_is_robust_mgmt_frame() to be able to intercept a certain kind of error. For those drivers that could not fit the new model, which includes the Realtek codes, they created a new entry point that used the old method. It was named _ieee80211_is_robust_mgmt_frame(), i.e. it has an underscore. For out-of-kernel drivers such as those in the rtlwifi_new repo, there must be code that determines at compile time which API needs to be used. Such code is in these drivers. If the kernel version is 3.14 or newer, use the underscored version. If older use the one without.

Why does it fail here? The reason is that Ubuntu applied the API change to their 3.13 kernels! Now the decision gets harder. If the kernel is 3.14, or if this is Ubuntu with version 3.13.11 + some unknown patch level, use the new API. That gets quite difficult; however, if I take the simple step of having all 3.13 versions use the new API, then I break every user of 3.13 that does not run Ubuntu. I refuse to do that for the following reason. Ubuntu should not have changed the API in mid 3.13!! In doing so, they make this kind of problem for everyone trying to provide out-of-kernel drivers. For me to fix the problem for Ubuntu users by breaking every other distro's users would be effectively to reward Ubuntu for what I consider to be their bad behavior.

How do I know this is the problem. First of all, the make log that was posted shows "warning: passing argument 1 of ‘ieee80211_is_robust_mgmt_frame’ from incompatible pointer type [enabled by default]". It is true that warnings can usually be ignored; however, when arguments have an incompatible pointer type, the end result will usually be a kernel crash. When that warning occurs for a routine that has changed API, it really sticks out. Secondly, I see this change in Ubuntu's 3.11.0-36 patch file.

What can Ubuntu users do? To my thinking, switching to a 3.14 or newer kernel would be best. If you really want to stay with Ubuntu's 3.13.0-36 kernel, then run the following command in the rtlwifi_new directory:

sed -i 's/ieee80211_is_robust_mgmt_frame/_ieee80211_is_robust_mgmt_frame/g' rtl8*/trx.c

That will change the code to the new API for every kernel. Of course, that will break every kernel older than 3.13, and the command should be run *ONLY* if you see warnings of the kind noted above. To revert that change, you will need to run 'git checkout -f'.

Sorry that it has taken so long to sort this out, but I really never expected the API to change in the middle of kernel 3.13 for any distro. If the tone seems to be too bitchy, remember that I'm really angry about what has happened, and all the time I have wasted on sorting it out. My comments here are a lot milder than the way I really want to say them.