Rainy day in BirminghamEn Lima ha estado lloviendo bastante, y hace mucho frío, he estado ingeniándome maneras poco usuales de abrigarme, omitiré los detalles.
Estaba yo haciendo un downgrade forzado al kernel 2.6.24 pues suspender la laptop se rompió en 2.6.26 (y como siempre nadie hará caso al bug pues todos los hackers usan X60s que funcionan perfecto).
Entonces la situación es que tengo un módulo (r8180) que depende de su propia variante de ieee80211 (ieee80211-rtl), este módulo funciona perfecto con mi kernel 2.6.26 y funcionaba perfecto con el 2.6.24 antes de actualizar a 2.6.26. Ahora me decía que las versiones de los símbolos
ieee80211_wake_queue y
ieee80211_stop_queue no coincidian con las que [r8180] esperaba.
Oh misterio... lo primero, investigar con grep si es que en el código fuente de r8180 estaba alguna mención a una versión específica de ambos símbolos, el primer sospechoso fue un .h importado de ieee80211-rtl, pero no era eso...
Varios grep después me di cuenta de que quizá ieee80211-rtl podría ser el culpable, entonces salté a ese directorio a revisar si existía alguna mención a versiones y símbolos.
Ahí sí tuve suerte, el archivo Module.symvers generado al construir el módulo contenía una mención a los símbolos q buscaba:
0x7879cbbc ieee80211_stop_queue /home/diego/hack/rtl/eee/ieee80211/ieee80211-rtl EXPORT_SYMBOL
0x7eb7b0a4 ieee80211_wake_queue /home/diego/hack/rtl/eee/ieee80211/ieee80211-rtl EXPORT_SYMBOLEntonces, la gran interrogante era de dónde es que r8180 estaba leyendo la versión del símbolo conflictivo... ajá, los kernel headers del sistema!.
Resulta que en
/usr/src/linux se encuentra un Module.symvers con versiones para todos los símbolos de los módulos del kernel (igual al Module.symvers del código q yo estaba analizando), pues, como el kernel trae su propia versión de ambos símbolos, r8180 estaba leyendo desde ese archivo la versión del símbolo que necesitaba. Esto obvio estaba mal :). r8180 debía esperar la versión de esos dos símbolos que ieee80211-rtl iba a proporcionar.
Solución: editar /usr/src/linux/Module.symvers para que pongamos ahí la versión de los símbolos que ieee80211-rtl va a ofrecer al instalarse.
Nota obvia: hice la modificación porque sé que no voy a instalar nada más que use ieee80211 y porque sé lo que hago (o al menos creo saberlo). Esta no es una solución mágica para que tu módulo favorito vuelva a funcionar, es solo anécdota.
Queja anexa: ¿por qué no des-arreglan lo q sea que creyeron arreglar en 2.6.25+ y que rompió mi suspend/resume :(?.