Search Linux Wireless

wl1251 issues

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi, I've an htc dream(also known as G1,first google phone,same device
than the ADP1 )
I prefer GNU/Linux than android,mainly because of the small number of
free software applications for android,and also because I'm used to
GNU/Linux(I feel at home).
So I helped standardizing and debugging the htcdream kernel in order to
be able to run GNU/Linux (android has its own userland interfaces for
some periphericals/devices(I mean something like the sound driver,the
wifi driver etc...))

The wifi driver that ships with android is free software,the sources are
available here:
http://android.git.kernel.org/?p=platform/hardware/ti/wlan.git;a=summary

But unfortunately it uses non-standard userspace<->kernel interfaces.
The non-standard interfaces are used by a patched wpa_supplicant.
The non-standard wpa_supplicant depend on android.

But...there is a wl1251_sdio standard driver in the android kernel we
used,which is available here:
http://gitorious.org/htc-msm-2-6-32/leviathan-incoming/commits/android-msm-2.6.32-rebase
It is derived from the android-msm-2.6.32 branch of the android kernel
available here:
http://android.git.kernel.org/?p=kernel/msm.git;a=summary
At first I used this driver.
But unfortunately it didn't support Power saving modes,and so it
consumed the battery in about one hour.

Fortunately compat-wireless has support for Power saving.
So I used that locally and made tests.

So my goal is to have a working wireless driver with PSM and have
standard kernel interfaces(in order to be compatible with userland
applications),using the android ti wlan driver would be the last resort.

The wl1251_sdio depends on the msm sdcard controller which lives at:
drivers/mmc/host/msm_sdcc.c
it contains the flollowing patch:
sdio: add new function for RAW (Read after Write) operation
viewable here:
http://gitorious.org/htc-msm-2-6-32/leviathan-incoming/commit/03e2cd19cb8b0a486ef8b8f2bec60d3c1b88d8b4


In order to keep the conversation and the flow of mail manageable I will
start with the first issue which doesn't involve PSM.

Here's the setup:
*kernel:
http://gitorious.org/htc-msm-2-6-32/leviathan-incoming/commits/android-msm-2.6.32-rebase at the following commit:
sdio: add new function for RAW (Read after Write) operation

*compat-wireless 2010-07-31 with the following attached patches patches:
0011-wl1251-add-reset-handling.patch
0013-wl1251-prevent-scan-when-connected.patch
va_vormat-2.6.36.patch
debug.patch

all is built with openembedded(the compat-wireless recipe is not
commited in org.openembedded.dev because it's changing so often)

Here's the issue(this first issue doesn't involve PSM yet):
I connect trough wpa to the local access point at the wifi cafee(wrt54
somrthing,running an old openwrt with a 2.4 kernel and the proprietary
broadcom module)

I use dhcp to get an ip
The connection last for a while and then I've that:
wlan0     IEEE 802.11bg  ESSID:"essid_has_been_hidden_in_that_mail"  
          Mode:Managed  Frequency:2.432 GHz  Access Point:
00:23:69:XX:XX:XX  
          Bit Rate=1 Mb/s   Tx-Power=20 dBm   
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality=43/70  Signal level=-67 dBm  
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0
That seem connected.

root@htcdream ~ # ping 192.168.2.1
PING 192.168.2.1 (192.168.2.1): 56 data bytes
^C
--- 192.168.2.1 ping statistics ---
22 packets transmitted, 0 packets received, 100% packet loss

here's the wpa connection script output:
ot@htcdream ~ # sh wpa.sh
CTRL-EVENT-SCAN-RESULTS 
Trying to associate with 00:23:69:xx:xx:xx
(SSID='essid_has_been_hidden_in_that_mail' freq=2432 MHz)
Associated with 00:23:69:xx:xx:xx
WPA: Key negotiation completed with 00:23:69:xx:xx:xx [PTK=CCMP
GTK=CCMP]
CTRL-EVENT-CONNECTED - Connection to 00:23:69:xx:xx:xx completed (auth)
[id=0 id_str=]

the essid and mac address have been changed.

a while true;do dmesg -c;done gave a still flowing flow of messages:
here's a part of it:
[ 3233.009460] wl1251: IRQ
[ 3233.011016] wl1251: IRQ work
[ 3233.011199] wl1251: intr: 0x1
[ 3233.011260] wl1251: RX: FW +1
[ 3233.011260] wl1251: RX counter: 13
[ 3233.011291] wl1251: WL1251_ACX_INTR_RX0_DATA
[ 3233.011413] wl1251: rx skb 0xc4664c00: 144 B beacon
[ 3233.039428] wl1251: IRQ
[ 3233.039611] wl1251: IRQ work
[ 3233.039764] wl1251: intr: 0x8
[ 3233.039825] wl1251: RX: FW +1
[ 3233.039825] wl1251: RX counter: 14
[ 3233.039855] wl1251: WL1251_ACX_INTR_RX0_DATA
[ 3233.039947] wl1251: rx skb 0xc4664300: 18 B beacon
[ 3233.089447] wl1251: IRQ
[ 3233.089538] wl1251: IRQ work
[ 3233.089660] wl1251: intr: 0x1
[ 3233.089721] wl1251: RX: FW +1
[ 3233.089721] wl1251: RX counter: 15
[ 3233.089752] wl1251: WL1251_ACX_INTR_RX0_DATA
[ 3233.089874] wl1251: rx skb 0xc4664780: 18 B beacon
[ 3233.109436] wl1251: IRQ
[ 3233.109527] wl1251: IRQ work
[ 3233.109680] wl1251: intr: 0x8
[ 3233.109741] wl1251: RX: FW +1
[ 3233.109741] wl1251: RX counter: 0
[ 3233.109741] wl1251: WL1251_ACX_INTR_RX0_DATA
[ 3233.109863] wl1251: rx skb 0xc46649c0: 144 B beacon
[ 3233.159484] wl1251: IRQ
[ 3233.159637] wl1251: IRQ work
[ 3233.159790] wl1251: intr: 0x9
[ 3233.159851] wl1251: RX: FW +2
[ 3233.159851] wl1251: RX counter: 2
[ 3233.159881] wl1251: WL1251_ACX_INTR_RX0_DATA
[ 3233.159973] wl1251: rx skb 0xc4664780: 18 B beacon
[ 3233.160064] wl1251: WL1251_ACX_INTR_RX1_DATA
[ 3233.160186] wl1251: rx skb 0xc4664780: 18 B beacon
[ 3233.209472] wl1251: IRQ
[ 3233.209564] wl1251: IRQ work
[ 3233.209686] wl1251: intr: 0x1
[ 3233.209747] wl1251: RX: FW +1
[ 3233.209777] wl1251: RX counter: 3
[ 3233.209777] wl1251: WL1251_ACX_INTR_RX0_DATA
[ 3233.209899] wl1251: rx skb 0xc4664840: 144 B beacon


I've also a rt2070 card, should I make tests with that card instead?

Denis

Index: compat-wireless-2010-06-19/drivers/net/wireless/wl12xx/wl1251_sdio.c
===================================================================
--- compat-wireless-2010-06-19.orig/drivers/net/wireless/wl12xx/wl1251_sdio.c	2010-06-20 22:04:12.776553632 +0200
+++ compat-wireless-2010-06-19/drivers/net/wireless/wl12xx/wl1251_sdio.c	2010-06-20 22:06:30.375232047 +0200
@@ -131,6 +131,20 @@
 
 static void wl1251_sdio_reset(struct wl1251 *wl)
 {
+	extern int sdio_reset_comm(struct mmc_card *card);
+	struct sdio_func *func = wl_to_func(wl);
+	int ret;
+
+	sdio_claim_host(func);
+	sdio_reset_comm(func->card);
+	ret = sdio_enable_func(func);
+	if (ret)
+		goto release;
+
+	sdio_set_block_size(func, 512);
+
+release:
+	sdio_release_host(func);
 }
 
 static void wl1251_sdio_enable_irq(struct wl1251 *wl)
@@ -271,6 +285,9 @@
 	ret = wl1251_init_ieee80211(wl);
 	if (ret)
 		goto out_free_irq;
+	
+	/* we can power it down now until it's started */
+	wl->set_power(0);
 
 	sdio_set_drvdata(func, wl);
 	return ret;
Index: compat-wireless-2010-07-31/drivers/net/wireless/wl12xx/wl1251.h
===================================================================
--- compat-wireless-2010-07-31.orig/drivers/net/wireless/wl12xx/wl1251.h	2010-08-01 15:04:21.219724545 +0200
+++ compat-wireless-2010-07-31/drivers/net/wireless/wl12xx/wl1251.h	2010-08-01 15:05:22.307219824 +0200
@@ -381,7 +381,9 @@
 
 	u32 chip_id;
 	char fw_ver[21];
-
+	
+	bool associated;
+	
 	/* Most recently reported noise in dBm */
 	s8 noise;
 };
Index: compat-wireless-2010-07-31/drivers/net/wireless/wl12xx/wl1251_main.c
===================================================================
--- compat-wireless-2010-07-31.orig/drivers/net/wireless/wl12xx/wl1251_main.c	2010-08-01 15:04:32.919105073 +0200
+++ compat-wireless-2010-07-31/drivers/net/wireless/wl12xx/wl1251_main.c	2010-08-01 15:05:59.668541777 +0200
@@ -874,6 +874,13 @@
 
 	wl1251_debug(DEBUG_MAC80211, "mac80211 hw scan");
 
+	/*
+	 * FIXME: scanning while associated causes lockups,
+	 * so we don't allow that
+	 */
+	if (wl->associated)
+		return -EBUSY;
+
 	if (req->n_ssids) {
 		ssid = req->ssids[0].ssid;
 		ssid_len = req->ssids[0].ssid_len;
Index: compat-wireless-2010-07-31/include/linux/compat-2.6.36.h
===================================================================
--- compat-wireless-2010-07-31.orig/include/linux/compat-2.6.36.h	2010-08-01 15:28:00.299100291 +0200
+++ compat-wireless-2010-07-31/include/linux/compat-2.6.36.h	2010-08-01 15:28:26.847223098 +0200
@@ -8,6 +8,11 @@
 #define kparam_block_sysfs_write(a)
 #define kparam_unblock_sysfs_write(a)
 
+struct va_format {
+	const char *fmt;
+	va_list *va;
+};
+
 #endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36)) */
 
 #endif /* LINUX_26_36_COMPAT_H */
Index: compat-wireless-2010-07-17/drivers/net/wireless/wl12xx/wl1251.h
===================================================================
--- compat-wireless-2010-07-17.orig/drivers/net/wireless/wl12xx/wl1251.h	2010-07-18 18:55:22.054116356 +0200
+++ compat-wireless-2010-07-17/drivers/net/wireless/wl12xx/wl1251.h	2010-07-18 18:55:37.583421412 +0200
@@ -52,7 +52,7 @@
 	DEBUG_ALL	= ~0,
 };
 
-#define DEBUG_LEVEL (DEBUG_NONE)
+#define DEBUG_LEVEL (DEBUG_ALL)
 
 #define DEBUG_DUMP_LIMIT 1024
 

[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux