Thinkpad ACPI a Madwifi
21.01.2009, 22:55Tym razem zwięźle, technicznie, „dla potomności”.
Wpis dotyczy thinkpad-acpi, czyli w zasadzie niezbędnej dla posiadaczy Thinkpadów, z GNU/Linuksem na pokładzie, nakładki (patch) na kernel linuksowy. Przyjmuję, że jeżeli ktoś już tu trafił, to wie co to dokładnie jest. Jeśli nie: strona projektu/artykuł na ThinkWiki. Druga rzecz, to Madwifi, czyli sterowniki dla bezprzewodowych kart sieciowych opartych na chipsecie Atheros.
Wersje, których użyłem: Kernel GNU/Linuks 2.6.28, thinkpad-acpi 0.22_v2.6.28 oraz Madwifi v0.9.4.
Problem polega na tym, że po zaaplikowaniu patcha thinkpad-acpi pojawia się problem z kompilacją modułów ze sterownikami Madwifi:
cc1: warnings being treated as errors
/home/unit03/temp/madwifi-0.9.4/net80211/ieee80211_wireless.c: In function 'giwscan_cb':
/home/unit03/temp/madwifi-0.9.4/net80211/ieee80211_wireless.c:1593: warning: passing argument 1 of 'iwe_stream_add_event' from incompatible pointer type
/home/unit03/temp/madwifi-0.9.4/net80211/ieee80211_wireless.c:1593: warning: passing argument 3 of 'iwe_stream_add_event' from incompatible pointer type
/home/unit03/temp/madwifi-0.9.4/net80211/ieee80211_wireless.c:1593: warning: passing argument 4 of 'iwe_stream_add_event' makes pointer from integer without a cast
/home/unit03/temp/madwifi-0.9.4/net80211/ieee80211_wireless.c:1593: error: too few arguments to function 'iwe_stream_add_event'
/home/unit03/temp/madwifi-0.9.4/net80211/ieee80211_wireless.c:1607: warning: passing argument 1 of 'iwe_stream_add_point' from incompatible pointer type
/home/unit03/temp/madwifi-0.9.4/net80211/ieee80211_wireless.c:1607: warning: passing argument 3 of 'iwe_stream_add_point' from incompatible pointer type
/home/unit03/temp/madwifi-0.9.4/net80211/ieee80211_wireless.c:1607: warning: passing argument 4 of 'iwe_stream_add_point' from incompatible pointer type
...
Jest to spowodowane zmianą implementacji funkcji, o których mówią komunikaty powyżej.
Rozwiązanie problemu jest w zasadzie proste (z punktu widzenia programisty), ale wymaga zmian w kodzie źródłowym Madwifi. Opis „błędu” (o tym dlaczego w cudzysłowie, za chwilę) znajduje się w TRACu Madwifi pod numerem #2220. To, co trzeba zrobić, to zaaplikowanie umieszczonego tam patcha. Dla mniej obeznanych z aplikowaniem łatek, plikami diff, „ręczna naprawa”: w ulubionym edytorze otwieramy plik net80211/ieee80211_wireless.c, znajdujemy linię 1552:
struct iwscanreq { /* XXX: right place for this declaration? */
i zaraz po niej dodajemy
struct iw_request_info *info;
Następnie, po linii 1565:
char *current_ev = req->current_ev;
dodajemy
struct iw_request_info *info = req->info;
Następnie, znajdujemy wszystkie wystąpienia funkcji iwe_stream_add_event() oraz iwe_stream_add_point(), i zaraz po pierwszym nawiasie dopisujemy wszędzie „info, „. Np., linia 1595:
current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, IW_EV_ADDR_LEN);
po naszej zmianie powinna wyglądać tak (pogrubiłem to, co zostało dodane):
current_ev = iwe_stream_add_event(info, current_ev, end_buf, &iwe, IW_EV_ADDR_LEN);
Taka sama sytuacja występuje w liniach 1608, 1612, 1626, 1639, 1650, 1665, 1680, 1689, 1709, 1733, 1759, 1778 i 1796.
Dlaczego nie jest to tak naprawdę błąd w ścisłym znaczeniu tego słowa? Błędy kompilacji spowodowało zaaplikowanie patcha thinkpad-acpi, a więc coś, czego używają tylko posiadacze Thinkpadów, ale żeby programiści Madwifi mogli im zapobiec, musieliby z każdą wersją wypuszczać oddzielne źródła przystosowane do ww. patcha. Wg mnie najlepiej, gdyby gdzieś na stronie o tym wspomnieli i udostępniali naprawdę prosty skrypt patchujący.
Jest jeszcze inny „błąd”, który możemy sami poprawić. Jeżeli przy kompilacji Madwifi dostaniemy taki komunikat:
/home/unit03/temp/madwifi-0.9.4/net80211/ieee80211_power.c: In function 'ieee80211_pwrsave':
/home/unit03/temp/madwifi-0.9.4/net80211/ieee80211_power.c:240: error: implicit declaration of function '__skb_append'
make[3]: *** [/home/unit03/temp/madwifi-0.9.4/net80211/ieee80211_power.o] Error 1
make[2]: *** [/home/unit03/temp/madwifi-0.9.4/net80211] Error 2
make[1]: *** [_module_/home/unit03/temp/madwifi-0.9.4] Error 2
make[1]: Leaving directory `/usr/src/linux-2.6.28'
make: *** [modules] Error 2
w pliku net80211/ieee80211_linux.h po linii 243:
#define __skb_append(a,b,c) __skb_append(a, b)
dopisujemy
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)
#define __skb_append(a,b,c) __skb_queue_after(c, a, b)
źródło: Madwifi, rewizja 3602.
