<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Jacek Kołodziej — blog &#187; GNU/Linux</title>
	<atom:link href="http://blog.kolodziejj.info/category/software/gnulinux/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.kolodziejj.info</link>
	<description>β</description>
	<lastBuildDate>Fri, 18 Jun 2010 10:38:27 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Thinkpad ACPI a Madwifi</title>
		<link>http://blog.kolodziejj.info/2009/01/21/thinkpad-acpi-a-madwifi/</link>
		<comments>http://blog.kolodziejj.info/2009/01/21/thinkpad-acpi-a-madwifi/#comments</comments>
		<pubDate>Wed, 21 Jan 2009 20:55:16 +0000</pubDate>
		<dc:creator>Unit03</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[madwifi]]></category>
		<category><![CDATA[thinkpad]]></category>

		<guid isPermaLink="false">http://blog.kolodziejj.info/?p=96</guid>
		<description><![CDATA[Tym razem zwięźle, technicznie, &#8220;dla potomności&#8221;.
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 [...]]]></description>
			<content:encoded><![CDATA[<p>Tym razem zwięźle, technicznie, &#8220;dla potomności&#8221;.</p>
<p>Wpis dotyczy <a href="http://ibm-acpi.sourceforge.net/">thinkpad-acpi</a>, czyli w zasadzie niezbędnej dla posiadaczy <a href="http://pl.wikipedia.org/wiki/ThinkPad">Thinkpadów</a>, 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: <a href="http://ibm-acpi.sourceforge.net/">strona projektu</a>/<a href="http://www.thinkwiki.org/wiki/Thinkpad-acpi">artykuł na ThinkWiki</a>. Druga rzecz, to <a href="http://madwifi-project.org/">Madwifi</a>, czyli sterowniki dla bezprzewodowych kart sieciowych opartych na chipsecie <a href="http://www.atheros.com/">Atheros</a>.</p>
<p>Wersje, których użyłem: Kernel GNU/Linuks <a href="http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.28.tar.bz2">2.6.28</a>, <a href="http://downloads.sourceforge.net/ibm-acpi/thinkpad-acpi-0.22_v2.6.28.gz?modtime=1232066060&#038;big_mirror=0">thinkpad-acpi 0.22_v2.6.28</a> oraz <a href="http://downloads.sourceforge.net/madwifi/madwifi-0.9.4.tar.gz">Madwifi v0.9.4</a>.</p>
<p>Problem polega na tym, że po zaaplikowaniu patcha thinkpad-acpi pojawia się problem z kompilacją modułów ze sterownikami Madwifi:</p>
<p><code>cc1: warnings being treated as errors<br />
/home/unit03/temp/madwifi-0.9.4/net80211/ieee80211_wireless.c: In function 'giwscan_cb':<br />
/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<br />
/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<br />
/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<br />
/home/unit03/temp/madwifi-0.9.4/net80211/ieee80211_wireless.c:1593: error: too few arguments to function 'iwe_stream_add_event'<br />
/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<br />
/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<br />
/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<br />
...</code></p>
<p>Jest to spowodowane zmianą implementacji funkcji, o których mówią komunikaty powyżej.</p>
<p>Rozwiązanie problemu jest w zasadzie proste (z punktu widzenia programisty), ale wymaga zmian w kodzie źródłowym Madwifi. Opis &#8220;błędu&#8221; (o tym dlaczego w cudzysłowie, za chwilę) znajduje się w TRACu Madwifi pod numerem <a href="http://madwifi-project.org/ticket/2220">#2220</a>. <strong>To, co trzeba zrobić</strong>, to zaaplikowanie <a href="http://madwifi-project.org/attachment/ticket/2220/ieee80211_wireless.patch.txt">umieszczonego tam patcha</a>. <strong>Dla mniej obeznanych</strong> z aplikowaniem łatek, plikami diff, &#8220;ręczna naprawa&#8221;: w ulubionym edytorze otwieramy plik <kbd>net80211/ieee80211_wireless.c</kbd>, znajdujemy linię 1552:</p>
<p><code>struct iwscanreq {             /* XXX: right place for this declaration? */</code></p>
<p>i zaraz po niej dodajemy</p>
<p><code>        struct iw_request_info *info;</code></p>
<p>Następnie, po linii 1565:</p>
<p><code>char *current_ev = req->current_ev;</code></p>
<p>dodajemy</p>
<p><code>        struct iw_request_info *info = req->info;</code></p>
<p>Następnie, znajdujemy wszystkie wystąpienia funkcji <code>iwe_stream_add_event()</code> oraz <code>iwe_stream_add_point()</code>, i zaraz po pierwszym nawiasie dopisujemy wszędzie &#8220;<code>info, </code>&#8220;. Np., linia 1595:</p>
<p><code>        current_ev = iwe_stream_add_event(current_ev, end_buf, &#038;iwe, IW_EV_ADDR_LEN);</code></p>
<p>po naszej zmianie powinna wyglądać tak (pogrubiłem to, co zostało dodane):</p>
<p><code>        current_ev = iwe_stream_add_event(<strong>info, </strong>current_ev, end_buf, &#038;iwe, IW_EV_ADDR_LEN);</code></p>
<p>Taka sama sytuacja występuje w liniach 1608, 1612, 1626, 1639, 1650, 1665, 1680, 1689, 1709, 1733, 1759, 1778 i 1796.</p>
<p>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.</p>
<p>Jest jeszcze inny &#8220;błąd&#8221;, który możemy sami poprawić. Jeżeli przy kompilacji Madwifi dostaniemy taki komunikat:</p>
<p><code>/home/unit03/temp/madwifi-0.9.4/net80211/ieee80211_power.c: In function 'ieee80211_pwrsave':<br />
/home/unit03/temp/madwifi-0.9.4/net80211/ieee80211_power.c:240: error: implicit declaration of function '__skb_append'<br />
make[3]: *** [/home/unit03/temp/madwifi-0.9.4/net80211/ieee80211_power.o] Error 1<br />
make[2]: *** [/home/unit03/temp/madwifi-0.9.4/net80211] Error 2<br />
make[1]: *** [_module_/home/unit03/temp/madwifi-0.9.4] Error 2<br />
make[1]: Leaving directory `/usr/src/linux-2.6.28'<br />
make: *** [modules] Error 2</code></p>
<p>w pliku <kbd>net80211/ieee80211_linux.h</kbd> po linii 243:</p>
<p><code>#define __skb_append(a,b,c)     __skb_append(a, b)</code></p>
<p>dopisujemy</p>
<p><code>#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)<br />
#define __skb_append(a,b,c)     __skb_queue_after(c, a, b)</code></p>
<p>źródło: Madwifi, <a href="http://madwifi-project.org/changeset/3602">rewizja 3602</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.kolodziejj.info/2009/01/21/thinkpad-acpi-a-madwifi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
