Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
Livebox + wifi Sagem XG76NA + kernel 2.6.21 + WPA - HowTo
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Polskie forum (Polish) Instalacja i sprzęt
View previous topic :: View next topic  
Author Message
Adasss
n00b
n00b


Joined: 19 Mar 2005
Posts: 15

PostPosted: Wed May 02, 2007 10:56 pm    Post subject: Livebox + wifi Sagem XG76NA + kernel 2.6.21 + WPA - HowTo Reply with quote

No cóż, jak się ludziom nudzi to różne dziwne rzeczy robią ;)

Ja pożeniłem te cztery kwestie wymienione w temacie :D

Jeśli ktoś chciałby to powtórzyć powinien zacząć od sprawdzenia, czy ma ten sam model dongla wifi usb.
Robimy to tak:

Quote:
# lsusb | grep Sagem | awk '{print $6}'


jeśli w odpowiedzi uzyskamy:

Quote:
079b:0062


to jak najbardziej się kwalifikujemy do śledzenia dalszej części (możliwa jest też odpowiedź 079b:004a oznaczająca adapter Sagem XG760A, ale ponieważ nie miałem go w rękach i nawet nie wiem, czy występuje u nas w naturze nie odpowiem na pytanie, czy ten scenariusz stosuje się również do niego).

Następny krok to konfiguracja jądra, w moim przypadku jest to 2.6.21 w oparciu o gentoo-sources. Od już bodaj 2.6.18 jądra zawierają driver Zydas zd1211rw, który oczywiście wykorzystałem. Kluczowe punkty konfiguracji to:

Quote:
CONFIG_IEEE80211=m
# CONFIG_IEEE80211_DEBUG is not set
CONFIG_IEEE80211_CRYPT_WEP=m
CONFIG_IEEE80211_CRYPT_CCMP=m
CONFIG_IEEE80211_CRYPT_TKIP=m
CONFIG_IEEE80211_SOFTMAC=m
CONFIG_IEEE80211_SOFTMAC_DEBUG=y
CONFIG_WIRELESS_EXT=y


Quote:
#
# Wireless LAN (non-hamradio)
#
CONFIG_NET_RADIO=y
# CONFIG_NET_WIRELESS_RTNETLINK is not set

#
# Obsolete Wireless cards support (pre-802.11)
#
# CONFIG_STRIP is not set
# CONFIG_ARLAN is not set
# CONFIG_WAVELAN is not set

#
# Wireless 802.11b ISA/PCI cards support
#
# CONFIG_IPW2100 is not set
# CONFIG_IPW2200 is not set
# CONFIG_AIRO is not set
# CONFIG_HERMES is not set
# CONFIG_ATMEL is not set

#
# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support
#
# CONFIG_PRISM54 is not set
# CONFIG_USB_ZD1201 is not set
# CONFIG_HOSTAP is not set
# CONFIG_BCM43XX is not set
CONFIG_ZD1211RW=m
CONFIG_ZD1211RW_DEBUG=y
CONFIG_NET_WIRELESS=y


Oczywiście opcji debug można się spokojnie pozbyć. Jeśli są tutaj, to tylko dlatego, że bez nich nie zorientowałbym się co dalej. Otóż dzięki nim z dmesg dowiedziałem się, że:

Quote:
AL2230S devices are not yet supported by this driver


Uwaga: od gentoo-sources-2.6.21-r1 poniższy wyróżniony fragment można sobie podarować :)
Co ewidentnie było przyczyną moich późniejszych problemów z zestawieniem połączenia. Poszperanie na sieci dało odpowiedź, że ten mało ciekawy napis zniknie w jądrze 2.6.22. Ponieważ jednak trzeba będzie pewnie jeszcze trochę poczekać na nie, poszperałem dalej znajdując to: http://www.mail-archive.com/netdev@vger.kernel.org/msg33585.html


Cóż więc było robić, zająłem się patchowaniem plików z katalogu /usr/src/linux-2.6.21-gentoo/drivers/net/wireless/zd1211rw/ zgodnie z opisami:

Quote:
This patch adds support for the next generation AL2230 RF chip which has
been spotted in a few new devices.

Signed-off-by: Daniel Drake <[EMAIL PROTECTED]>
---
zd_chip.c | 5 ++-
zd_rf.c | 2 +-
zd_rf.h | 2 +-
zd_rf_al2230.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++----------
4 files changed, 78 insertions(+), 20 deletions(-)

Index: linux/drivers/net/wireless/zd1211rw/zd_chip.c
===================================================================
--- linux.orig/drivers/net/wireless/zd1211rw/zd_chip.c
+++ linux/drivers/net/wireless/zd1211rw/zd_chip.c
@@ -67,11 +67,12 @@ static int scnprint_id(struct zd_chip *c
i += scnprint_mac_oui(chip->e2p_mac, buffer+i, size-i);
i += scnprintf(buffer+i, size-i, " ");
i += zd_rf_scnprint_id(&chip->rf, buffer+i, size-i);
- i += scnprintf(buffer+i, size-i, " pa%1x %c%c%c%c", chip->pa_type,
+ i += scnprintf(buffer+i, size-i, " pa%1x %c%c%c%c%c", chip->pa_type,
chip->patch_cck_gain ? 'g' : '-',
chip->patch_cr157 ? '7' : '-',
chip->patch_6m_band_edge ? '6' : '-',
- chip->new_phy_layout ? 'N' : '-');
+ chip->new_phy_layout ? 'N' : '-',
+ chip->al2230s_bit ? 'S' : '-');
return i;
}

Index: linux/drivers/net/wireless/zd1211rw/zd_rf.c
===================================================================
--- linux.orig/drivers/net/wireless/zd1211rw/zd_rf.c
+++ linux/drivers/net/wireless/zd1211rw/zd_rf.c
@@ -34,7 +34,7 @@ static const char *rfs[] = {
[AL2210_RF] = "AL2210_RF",
[MAXIM_NEW_RF] = "MAXIM_NEW_RF",
[UW2453_RF] = "UW2453_RF",
- [AL2230S_RF] = "AL2230S_RF",
+ [UNKNOWN_A_RF] = "UNKNOWN_A_RF",
[RALINK_RF] = "RALINK_RF",
[INTERSIL_RF] = "INTERSIL_RF",
[RF2959_RF] = "RF2959_RF",
Index: linux/drivers/net/wireless/zd1211rw/zd_rf.h
===================================================================
--- linux.orig/drivers/net/wireless/zd1211rw/zd_rf.h
+++ linux/drivers/net/wireless/zd1211rw/zd_rf.h
@@ -26,7 +26,7 @@
#define AL2210_RF 0x7
#define MAXIM_NEW_RF 0x8
#define UW2453_RF 0x9
-#define AL2230S_RF 0xa
+#define UNKNOWN_A_RF 0xa
#define RALINK_RF 0xb
#define INTERSIL_RF 0xc
#define RF2959_RF 0xd
Index: linux/drivers/net/wireless/zd1211rw/zd_rf_al2230.c
===================================================================
--- linux.orig/drivers/net/wireless/zd1211rw/zd_rf_al2230.c
+++ linux/drivers/net/wireless/zd1211rw/zd_rf_al2230.c
@@ -59,6 +59,18 @@ static const struct zd_ioreq16 zd1211b_i
{ CR240, 0x57 }, { CR9, 0xe0 },
};

+static const struct zd_ioreq16 ioreqs_init_al2230s[] = {
+ { CR47, 0x1e }, /* MARK_002 */
+ { CR106, 0x22 },
+ { CR107, 0x2a }, /* MARK_002 */
+ { CR109, 0x13 }, /* MARK_002 */
+ { CR118, 0xf8 }, /* MARK_002 */
+ { CR119, 0x12 }, { CR122, 0xe0 },
+ { CR128, 0x10 }, /* MARK_001 from 0xe->0x10 */
+ { CR129, 0x0e }, /* MARK_001 from 0xd->0x0e */
+ { CR130, 0x10 }, /* MARK_001 from 0xb->0x0d */
+};
+
static int zd1211b_al2230_finalize_rf(struct zd_chip *chip)
{
int r;
@@ -90,7 +102,7 @@ static int zd1211_al2230_init_hw(struct
int r;
struct zd_chip *chip = zd_rf_to_chip(rf);

- static const struct zd_ioreq16 ioreqs[] = {
+ static const struct zd_ioreq16 ioreqs_init[] = {
{ CR15, 0x20 }, { CR23, 0x40 }, { CR24, 0x20 },
{ CR26, 0x11 }, { CR28, 0x3e }, { CR29, 0x00 },
{ CR44, 0x33 }, { CR106, 0x2a }, { CR107, 0x1a },
@@ -117,10 +129,9 @@ static int zd1211_al2230_init_hw(struct
{ CR119, 0x10 }, { CR120, 0x4f }, { CR121, 0x77 },
{ CR122, 0xe0 }, { CR137, 0x88 }, { CR252, 0xff },
{ CR253, 0xff },
+ };

- /* These following happen separately in the vendor driver */
- { },
-
+ static const struct zd_ioreq16 ioreqs_pll[] = {
/* shdnb(PLL_ON)=0 */
{ CR251, 0x2f },
/* shdnb(PLL_ON)=1 */
@@ -128,7 +139,7 @@ static int zd1211_al2230_init_hw(struct
{ CR138, 0x28 }, { CR203, 0x06 },
};

- static const u32 rv[] = {
+ static const u32 rv1[] = {
/* Channel 1 */
0x03f790,
0x033331,
@@ -137,6 +148,9 @@ static int zd1211_al2230_init_hw(struct
0x0b3331,
0x03b812,
0x00fff3,
+ };
+
+ static const u32 rv2[] = {
0x000da4,
0x0f4dc5, /* fix freq shift, 0x04edc5 */
0x0805b6,
@@ -148,8 +162,9 @@ static int zd1211_al2230_init_hw(struct
0x0bdffc,
0x00000d,
0x00500f,
+ };

- /* These writes happen separately in the vendor driver */
+ static const u32 rv3[] = {
0x00d00f,
0x004c0f,
0x00540f,
@@ -157,11 +172,38 @@ static int zd1211_al2230_init_hw(struct
0x00500f,
};

- r = zd_iowrite16a_locked(chip, ioreqs, ARRAY_SIZE(ioreqs));
+ r = zd_iowrite16a_locked(chip, ioreqs_init, ARRAY_SIZE(ioreqs_init));
if (r)
return r;

- r = zd_rfwritev_locked(chip, rv, ARRAY_SIZE(rv), RF_RV_BITS);
+ if (chip->al2230s_bit) {
+ r = zd_iowrite16a_locked(chip, ioreqs_init_al2230s,
+ ARRAY_SIZE(ioreqs_init_al2230s));
+ if (r)
+ return r;
+ }
+
+ r = zd_rfwritev_locked(chip, rv1, ARRAY_SIZE(rv1), RF_RV_BITS);
+ if (r)
+ return r;
+
+ /* improve band edge for AL2230S */
+ if (chip->al2230s_bit)
+ r = zd_rfwrite_locked(chip, 0x000824, RF_RV_BITS);
+ else
+ r = zd_rfwrite_locked(chip, 0x0005a4, RF_RV_BITS);
+ if (r)
+ return r;
+
+ r = zd_rfwritev_locked(chip, rv2, ARRAY_SIZE(rv2), RF_RV_BITS);
+ if (r)
+ return r;
+
+ r = zd_iowrite16a_locked(chip, ioreqs_pll, ARRAY_SIZE(ioreqs_pll));
+ if (r)
+ return r;
+
+ r = zd_rfwritev_locked(chip, rv3, ARRAY_SIZE(rv3), RF_RV_BITS);
if (r)
return r;

@@ -227,7 +269,9 @@ static int zd1211b_al2230_init_hw(struct
0x481dc0,
0xcfff00,
0x25a000,
+ };

+ static const u32 rv2[] = {
/* To improve AL2230 yield, improve phase noise, 4713 */
0x25a000,
0xa3b2f0,
@@ -250,7 +294,7 @@ static int zd1211b_al2230_init_hw(struct
{ CR251, 0x7f }, /* shdnb(PLL_ON)=1 */
};

- static const u32 rv2[] = {
+ static const u32 rv3[] = {
/* To improve AL2230 yield, 4713 */
0xf01b00,
0xf01e00,
@@ -269,18 +313,37 @@ static int zd1211b_al2230_init_hw(struct
r = zd_iowrite16a_locked(chip, ioreqs1, ARRAY_SIZE(ioreqs1));
if (r)
return r;
+
+ if (chip->al2230s_bit) {
+ r = zd_iowrite16a_locked(chip, ioreqs_init_al2230s,
+ ARRAY_SIZE(ioreqs_init_al2230s));
+ if (r)
+ return r;
+ }
+
r = zd_rfwritev_cr_locked(chip, zd1211b_al2230_table[0], 3);
if (r)
return r;
r = zd_rfwritev_cr_locked(chip, rv1, ARRAY_SIZE(rv1));
if (r)
return r;
- r = zd_iowrite16a_locked(chip, ioreqs2, ARRAY_SIZE(ioreqs2));
+
+ if (chip->al2230s_bit)
+ r = zd_rfwrite_locked(chip, 0x241000, RF_RV_BITS);
+ else
+ r = zd_rfwrite_locked(chip, 0x25a000, RF_RV_BITS);
if (r)
return r;
+
r = zd_rfwritev_cr_locked(chip, rv2, ARRAY_SIZE(rv2));
if (r)
return r;
+ r = zd_iowrite16a_locked(chip, ioreqs2, ARRAY_SIZE(ioreqs2));
+ if (r)
+ return r;
+ r = zd_rfwritev_cr_locked(chip, rv3, ARRAY_SIZE(rv3));
+ if (r)
+ return r;
r = zd_iowrite16a_locked(chip, ioreqs3, ARRAY_SIZE(ioreqs3));
if (r)
return r;
@@ -358,12 +421,6 @@ int zd_rf_init_al2230(struct zd_rf *rf)
{
struct zd_chip *chip = zd_rf_to_chip(rf);

- if (chip->al2230s_bit) {
- dev_err(zd_chip_dev(chip), "AL2230S devices are not yet "
- "supported by this driver.\n");
- return -ENODEV;
- }
-
rf->switch_radio_off = al2230_switch_radio_off;
if (chip->is_zd1211b) {
rf->init_hw = zd1211b_al2230_init_hw;
-


Oczywiście po spatchowaniu kompilujemy (jak kto lubi, ja genkernelem, ze względu na konieczność użycia dmraid).

Następne kroki są już stosunkowo proste. Na pewno potrzebujemy emerge-ować net-wireless/wireless-tools i net-wireless/wpa_supplicant (to ostatnie ze względu na założenie, że będę używał WPA, co może koniecznością nie jest, ale jednak szczerze polecam po tym jak sobie trochę poczytałem o "ochronie" WEP-em).

Uwaga: wszędzie dalej używał będę w odniesieniu do mojego połączenia oznaczenia eth2, co wynika z tego, że mam też dwie zwykłe sieciówki (wykorzystujące oczywiście eth0 i eth1). Możliwe też, że w innych przypadkach właściwsze będzie wlan0.

Primo więc konfigurujemy /etc/conf.d/net, kluczowa jego część wygląda u mnie tak:

Quote:

config_eth2=( "dhcp" )
modules=( "wpa_supplicant" )
wpa_supplicant_eth2="-Dwext"


Następny w kolejce jest /etc/wpa_supplicant/wpa_supplicant.conf:

Quote:
network={
ssid="neostrada_XXXX"
scan_ssid=1
pairwise=TKIP
psk="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
group=TKIP
key_mgmt=WPA-PSK
proto=WPA
}


Oczywiście trzeba skonfigurować też odpowiednie ustawienia na Liveboxie. Myślę jednak, że to już nie będzie problemem. Oczywiście wartości ssid i psk trzeba sobie znaleźć/dobrać samemu. psk to oczywiście odpowiednik hasła z "konfiguracji wpa", a jako szyfrowanie wybrałem TKIP. W moim przypadku użyłem klucza 62-znakowego (dłuższy jak mi się wydaje z wcześniejszych eksperymentów pod Windozą nie zadziała na Liveboxie, mimo że da się wprowadzić jeszcze jeden znak).

No i na koniec stworzyłem symlinka /etc/init.d/net.eth2 na /etc/init.d/net.lo i popełniłem restart całości. No i aktualnie piszę ten mini-poradnik jako jedynego mając podpiętego ww. dongla stąd wniosek, że chyba mi się udało :D

P.S. oczywiście nie ma róży bez kolców - temperatura procesora wzrosła o prawie 10 stopni, ciekawostka. Jak ktoś może się wypowiedzieć z czego to wynika chętnie przeczytam.


Last edited by Adasss on Tue May 22, 2007 5:04 pm; edited 3 times in total
Back to top
View user's profile Send private message
Adasss
n00b
n00b


Joined: 19 Mar 2005
Posts: 15

PostPosted: Tue May 22, 2007 4:55 pm    Post subject: Reply with quote

Dobra wiadomość dla leniwych ;)

W gentoo-sources w wersji 2.6.21-r1 ręczne patchowanie źródeł jądra można już sobie darować. Co sprawia, że cała procedura staje się już duuużo prostsza. :)
Back to top
View user's profile Send private message
BeteNoire
Veteran
Veteran


Joined: 25 Sep 2005
Posts: 1827

PostPosted: Thu Jul 12, 2007 7:12 pm    Post subject: Reply with quote

Cudzysłów opisujący psk wydaje się niepotrzebny, bo przez w ten sposób wpisany klucz init nie startuje.
_________________
powered by power plant
Back to top
View user's profile Send private message
Adasss
n00b
n00b


Joined: 19 Mar 2005
Posts: 15

PostPosted: Wed Jul 18, 2007 10:53 pm    Post subject: Reply with quote

BeteNoire wrote:
Cudzysłów opisujący psk wydaje się niepotrzebny, bo przez w ten sposób wpisany klucz init nie startuje.


No cóż, u mnie działa z cudzysłowami.
Ale jeśli komuś nie działa, może zastosować się do powyższej uwagi i vice-versa.
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Polskie forum (Polish) Instalacja i sprzęt All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum