Posts Tagged ‘linux’

Thinkpad ACPI a Madwifi

21.01.2009, 22:55

Tym 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.