All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/12] wlcore/wl18xx: patches for 3.6
@ 2012-06-21 14:12 Luciano Coelho
  2012-06-21 14:13 ` [PATCH 01/12] wlcore: suppress error message on Rx BA session removal Luciano Coelho
                   ` (12 more replies)
  0 siblings, 13 replies; 16+ messages in thread
From: Luciano Coelho @ 2012-06-21 14:12 UTC (permalink / raw)
  To: linux-wireless; +Cc: coelho, arik

Hi,

Here are some patches for 3.6.  Just a few bugfixes and improvements
here and there, nothing really major.

I'll push this into my tree soon, unless I get some comments pretty
soon. :)

Cheers,
Luca.

Arik Nemtsov (8):
  wlcore: suppress error message on Rx BA session removal
  wlcore: allow setting sleep_auth before interface init
  wlcore: reconfigure sleep_auth when removing interfaces
  wl18xx: increase Rx descriptors for PG2
  wl18xx: set Tx align quirk for PG2
  wl18xx: explicitly remove the 5Ghz MIMO HT cap
  wl18xx: sane defaults for HT capabilities
  wl18xx: split siso40 HT cap between 2Ghz and 5Ghz

Igal Chernobelsky (1):
  wlcore: read FW logs from FW memory on watchdog recovery

Luciano Coelho (2):
  wlcore: add a debugfs entry to allow changing the sleep mode by hand
  wl18xx: use %zu for size_t arguments in printk calls

Yoni Divinsky (1):
  wlcore: do not report noise level in get survey op

 drivers/net/wireless/ti/wl12xx/main.c    |    7 +-
 drivers/net/wireless/ti/wl18xx/main.c    |  106 +++++++++++++++++-------------
 drivers/net/wireless/ti/wlcore/acx.c     |    8 ++-
 drivers/net/wireless/ti/wlcore/acx.h     |    5 ++
 drivers/net/wireless/ti/wlcore/conf.h    |    8 ++-
 drivers/net/wireless/ti/wlcore/debugfs.c |   63 ++++++++++++++++++
 drivers/net/wireless/ti/wlcore/init.c    |   43 ++++++------
 drivers/net/wireless/ti/wlcore/main.c    |   68 +++++++++++++------
 drivers/net/wireless/ti/wlcore/ps.c      |    2 +-
 drivers/net/wireless/ti/wlcore/wlcore.h  |   10 +++
 10 files changed, 227 insertions(+), 93 deletions(-)

-- 
1.7.10


^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH 01/12] wlcore: suppress error message on Rx BA session removal
  2012-06-21 14:12 [PATCH 00/12] wlcore/wl18xx: patches for 3.6 Luciano Coelho
@ 2012-06-21 14:13 ` Luciano Coelho
  2012-06-21 14:13 ` [PATCH 02/12] wlcore: add a debugfs entry to allow changing the sleep mode by hand Luciano Coelho
                   ` (11 subsequent siblings)
  12 siblings, 0 replies; 16+ messages in thread
From: Luciano Coelho @ 2012-06-21 14:13 UTC (permalink / raw)
  To: linux-wireless; +Cc: coelho, arik

From: Arik Nemtsov <arik@wizery.com>

The ampdu_action() function is called on the reconfig() path to remove
existing Rx BA sessions. Since these don't exist for the low level
driver, we output an error message. Turn the message into a debug
message for now, until the mac80211 reconfig flow is changed.

Signed-off-by: Arik Nemtsov <arik@wizery.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
---
 drivers/net/wireless/ti/wlcore/main.c |    9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/ti/wlcore/main.c b/drivers/net/wireless/ti/wlcore/main.c
index 8eefcd7..22b342f 100644
--- a/drivers/net/wireless/ti/wlcore/main.c
+++ b/drivers/net/wireless/ti/wlcore/main.c
@@ -4366,9 +4366,14 @@ static int wl1271_op_ampdu_action(struct ieee80211_hw *hw,
 
 	case IEEE80211_AMPDU_RX_STOP:
 		if (!(*ba_bitmap & BIT(tid))) {
-			ret = -EINVAL;
-			wl1271_error("no active RX BA session on tid: %d",
+			/*
+			 * this happens on reconfig - so only output a debug
+			 * message for now, and don't fail the function.
+			 */
+			wl1271_debug(DEBUG_MAC80211,
+				     "no active RX BA session on tid: %d",
 				     tid);
+			ret = 0;
 			break;
 		}
 
-- 
1.7.10


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 02/12] wlcore: add a debugfs entry to allow changing the sleep mode by hand
  2012-06-21 14:12 [PATCH 00/12] wlcore/wl18xx: patches for 3.6 Luciano Coelho
  2012-06-21 14:13 ` [PATCH 01/12] wlcore: suppress error message on Rx BA session removal Luciano Coelho
@ 2012-06-21 14:13 ` Luciano Coelho
  2012-06-21 14:13 ` [PATCH 03/12] wlcore: allow setting sleep_auth before interface init Luciano Coelho
                   ` (10 subsequent siblings)
  12 siblings, 0 replies; 16+ messages in thread
From: Luciano Coelho @ 2012-06-21 14:13 UTC (permalink / raw)
  To: linux-wireless; +Cc: coelho, arik

For FW debugging purposes, we may need to change the sleep mode
(aka. sleep_auth) by hand, and set it to the mode we want.  To allow
this, a debugfs entry is added.

Now we store the sleep_auth value that has been set and use that
instead of the quirk to decide whether we should enter ELP or not.

Signed-off-by: Luciano Coelho <coelho@ti.com>
Signed-off-by: Arik Nemtsov <arik@wizery.com>
---
 drivers/net/wireless/ti/wlcore/acx.c     |    3 ++
 drivers/net/wireless/ti/wlcore/acx.h     |    2 ++
 drivers/net/wireless/ti/wlcore/debugfs.c |   58 ++++++++++++++++++++++++++++++
 drivers/net/wireless/ti/wlcore/main.c    |    3 ++
 drivers/net/wireless/ti/wlcore/ps.c      |    2 +-
 drivers/net/wireless/ti/wlcore/wlcore.h  |    3 ++
 6 files changed, 70 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ti/wlcore/acx.c b/drivers/net/wireless/ti/wlcore/acx.c
index b9ec42c..b56217f 100644
--- a/drivers/net/wireless/ti/wlcore/acx.c
+++ b/drivers/net/wireless/ti/wlcore/acx.c
@@ -81,7 +81,10 @@ int wl1271_acx_sleep_auth(struct wl1271 *wl, u8 sleep_auth)
 	auth->sleep_auth = sleep_auth;
 
 	ret = wl1271_cmd_configure(wl, ACX_SLEEP_AUTH, auth, sizeof(*auth));
+	if (ret < 0)
+		goto out;
 
+	wl->sleep_auth = sleep_auth;
 out:
 	kfree(auth);
 	return ret;
diff --git a/drivers/net/wireless/ti/wlcore/acx.h b/drivers/net/wireless/ti/wlcore/acx.h
index c018125..168e046 100644
--- a/drivers/net/wireless/ti/wlcore/acx.h
+++ b/drivers/net/wireless/ti/wlcore/acx.h
@@ -118,6 +118,8 @@ enum wl1271_psm_mode {
 
 	/* Extreme low power */
 	WL1271_PSM_ELP = 2,
+
+	WL1271_PSM_MAX = WL1271_PSM_ELP,
 };
 
 struct acx_sleep_auth {
diff --git a/drivers/net/wireless/ti/wlcore/debugfs.c b/drivers/net/wireless/ti/wlcore/debugfs.c
index 689a847..91e43de 100644
--- a/drivers/net/wireless/ti/wlcore/debugfs.c
+++ b/drivers/net/wireless/ti/wlcore/debugfs.c
@@ -963,6 +963,63 @@ static const struct file_operations fw_stats_raw_ops = {
 	.llseek = default_llseek,
 };
 
+static ssize_t sleep_auth_read(struct file *file, char __user *user_buf,
+			       size_t count, loff_t *ppos)
+{
+	struct wl1271 *wl = file->private_data;
+
+	return wl1271_format_buffer(user_buf, count,
+				    ppos, "%d\n",
+				    wl->sleep_auth);
+}
+
+static ssize_t sleep_auth_write(struct file *file,
+				const char __user *user_buf,
+				size_t count, loff_t *ppos)
+{
+	struct wl1271 *wl = file->private_data;
+	unsigned long value;
+	int ret;
+
+	ret = kstrtoul_from_user(user_buf, count, 0, &value);
+	if (ret < 0) {
+		wl1271_warning("illegal value in sleep_auth");
+		return -EINVAL;
+	}
+
+	if (value < 0 || value > WL1271_PSM_MAX) {
+		wl1271_warning("sleep_auth must be between 0 and %d",
+			       WL1271_PSM_MAX);
+		return -ERANGE;
+	}
+
+	mutex_lock(&wl->mutex);
+
+	if (wl->state == WL1271_STATE_OFF)
+		goto out;
+
+	ret = wl1271_ps_elp_wakeup(wl);
+	if (ret < 0)
+		goto out;
+
+	ret = wl1271_acx_sleep_auth(wl, value);
+	if (ret < 0)
+		goto out_sleep;
+
+out_sleep:
+	wl1271_ps_elp_sleep(wl);
+out:
+	mutex_unlock(&wl->mutex);
+	return count;
+}
+
+static const struct file_operations sleep_auth_ops = {
+	.read = sleep_auth_read,
+	.write = sleep_auth_write,
+	.open = simple_open,
+	.llseek = default_llseek,
+};
+
 static int wl1271_debugfs_add_files(struct wl1271 *wl,
 				    struct dentry *rootdir)
 {
@@ -988,6 +1045,7 @@ static int wl1271_debugfs_add_files(struct wl1271 *wl,
 	DEBUGFS_ADD(irq_blk_threshold, rootdir);
 	DEBUGFS_ADD(irq_timeout, rootdir);
 	DEBUGFS_ADD(fw_stats_raw, rootdir);
+	DEBUGFS_ADD(sleep_auth, rootdir);
 
 	streaming = debugfs_create_dir("rx_streaming", rootdir);
 	if (!streaming || IS_ERR(streaming))
diff --git a/drivers/net/wireless/ti/wlcore/main.c b/drivers/net/wireless/ti/wlcore/main.c
index 22b342f..7677cd5 100644
--- a/drivers/net/wireless/ti/wlcore/main.c
+++ b/drivers/net/wireless/ti/wlcore/main.c
@@ -1082,6 +1082,7 @@ int wl1271_plt_stop(struct wl1271 *wl)
 	mutex_lock(&wl->mutex);
 	wl1271_power_off(wl);
 	wl->flags = 0;
+	wl->sleep_auth = WL1271_PSM_CAM;
 	wl->state = WL1271_STATE_OFF;
 	wl->plt = false;
 	wl->rx_counter = 0;
@@ -1740,6 +1741,7 @@ static void wl1271_op_stop(struct ieee80211_hw *hw)
 	wl->ap_fw_ps_map = 0;
 	wl->ap_ps_map = 0;
 	wl->sched_scanning = false;
+	wl->sleep_auth = WL1271_PSM_CAM;
 	memset(wl->roles_map, 0, sizeof(wl->roles_map));
 	memset(wl->links_map, 0, sizeof(wl->links_map));
 	memset(wl->roc_map, 0, sizeof(wl->roc_map));
@@ -5174,6 +5176,7 @@ struct ieee80211_hw *wlcore_alloc_hw(size_t priv_size)
 	wl->channel_type = NL80211_CHAN_NO_HT;
 	wl->flags = 0;
 	wl->sg_enabled = true;
+	wl->sleep_auth = WL1271_PSM_CAM;
 	wl->hw_pg_ver = -1;
 	wl->ap_ps_map = 0;
 	wl->ap_fw_ps_map = 0;
diff --git a/drivers/net/wireless/ti/wlcore/ps.c b/drivers/net/wireless/ti/wlcore/ps.c
index 47e81b3..95d8797 100644
--- a/drivers/net/wireless/ti/wlcore/ps.c
+++ b/drivers/net/wireless/ti/wlcore/ps.c
@@ -76,7 +76,7 @@ void wl1271_ps_elp_sleep(struct wl1271 *wl)
 	struct wl12xx_vif *wlvif;
 	u32 timeout;
 
-	if (wl->quirks & WLCORE_QUIRK_NO_ELP)
+	if (wl->sleep_auth != WL1271_PSM_ELP)
 		return;
 
 	/* we shouldn't get consecutive sleep requests */
diff --git a/drivers/net/wireless/ti/wlcore/wlcore.h b/drivers/net/wireless/ti/wlcore/wlcore.h
index 761a72f..eae8edc 100644
--- a/drivers/net/wireless/ti/wlcore/wlcore.h
+++ b/drivers/net/wireless/ti/wlcore/wlcore.h
@@ -387,6 +387,9 @@ struct wl1271 {
 
 	/* mutex for protecting the tx_flush function */
 	struct mutex flush_mutex;
+
+	/* sleep auth value currently configured to FW */
+	int sleep_auth;
 };
 
 int __devinit wlcore_probe(struct wl1271 *wl, struct platform_device *pdev);
-- 
1.7.10


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 03/12] wlcore: allow setting sleep_auth before interface init
  2012-06-21 14:12 [PATCH 00/12] wlcore/wl18xx: patches for 3.6 Luciano Coelho
  2012-06-21 14:13 ` [PATCH 01/12] wlcore: suppress error message on Rx BA session removal Luciano Coelho
  2012-06-21 14:13 ` [PATCH 02/12] wlcore: add a debugfs entry to allow changing the sleep mode by hand Luciano Coelho
@ 2012-06-21 14:13 ` Luciano Coelho
  2012-06-21 14:13 ` [PATCH 04/12] wlcore: reconfigure sleep_auth when removing interfaces Luciano Coelho
                   ` (9 subsequent siblings)
  12 siblings, 0 replies; 16+ messages in thread
From: Luciano Coelho @ 2012-06-21 14:13 UTC (permalink / raw)
  To: linux-wireless; +Cc: coelho, arik

From: Arik Nemtsov <arik@wizery.com>

Hold a value for sta_sleep_auth that is amenable to change by debugfs.
When detecting a legal value in this variable on interface init, use it
as an override value for sleep_auth.

This makes debugging more intuitive using the debugfs value.

Increment the conf version since we added an element to the conf
structure.

Note: An AP going up will always set sleep_auth to PSM_CAM.

Signed-off-by: Arik Nemtsov <arik@wizery.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
---
 drivers/net/wireless/ti/wl12xx/main.c    |    1 +
 drivers/net/wireless/ti/wl18xx/main.c    |    1 +
 drivers/net/wireless/ti/wlcore/acx.c     |    2 +-
 drivers/net/wireless/ti/wlcore/acx.h     |    3 +++
 drivers/net/wireless/ti/wlcore/conf.h    |    8 +++++++-
 drivers/net/wireless/ti/wlcore/debugfs.c |    7 ++++++-
 drivers/net/wireless/ti/wlcore/init.c    |    8 +++++++-
 drivers/net/wireless/ti/wlcore/main.c    |    2 +-
 8 files changed, 27 insertions(+), 5 deletions(-)

diff --git a/drivers/net/wireless/ti/wl12xx/main.c b/drivers/net/wireless/ti/wl12xx/main.c
index 85d1600..7974ed5 100644
--- a/drivers/net/wireless/ti/wl12xx/main.c
+++ b/drivers/net/wireless/ti/wl12xx/main.c
@@ -246,6 +246,7 @@ static struct wlcore_conf wl12xx_conf = {
 		.forced_ps                   = false,
 		.keep_alive_interval         = 55000,
 		.max_listen_interval         = 20,
+		.sta_sleep_auth              = WL1271_PSM_ILLEGAL,
 	},
 	.itrim = {
 		.enable = false,
diff --git a/drivers/net/wireless/ti/wl18xx/main.c b/drivers/net/wireless/ti/wl18xx/main.c
index b2ccff7..d3f171d 100644
--- a/drivers/net/wireless/ti/wl18xx/main.c
+++ b/drivers/net/wireless/ti/wl18xx/main.c
@@ -372,6 +372,7 @@ static struct wlcore_conf wl18xx_conf = {
 		.forced_ps                   = false,
 		.keep_alive_interval         = 55000,
 		.max_listen_interval         = 20,
+		.sta_sleep_auth              = WL1271_PSM_ILLEGAL,
 	},
 	.itrim = {
 		.enable = false,
diff --git a/drivers/net/wireless/ti/wlcore/acx.c b/drivers/net/wireless/ti/wlcore/acx.c
index b56217f..3384bc1 100644
--- a/drivers/net/wireless/ti/wlcore/acx.c
+++ b/drivers/net/wireless/ti/wlcore/acx.c
@@ -70,7 +70,7 @@ int wl1271_acx_sleep_auth(struct wl1271 *wl, u8 sleep_auth)
 	struct acx_sleep_auth *auth;
 	int ret;
 
-	wl1271_debug(DEBUG_ACX, "acx sleep auth");
+	wl1271_debug(DEBUG_ACX, "acx sleep auth %d", sleep_auth);
 
 	auth = kzalloc(sizeof(*auth), GFP_KERNEL);
 	if (!auth) {
diff --git a/drivers/net/wireless/ti/wlcore/acx.h b/drivers/net/wireless/ti/wlcore/acx.h
index 168e046..d03215d 100644
--- a/drivers/net/wireless/ti/wlcore/acx.h
+++ b/drivers/net/wireless/ti/wlcore/acx.h
@@ -120,6 +120,9 @@ enum wl1271_psm_mode {
 	WL1271_PSM_ELP = 2,
 
 	WL1271_PSM_MAX = WL1271_PSM_ELP,
+
+	/* illegal out of band value of PSM mode */
+	WL1271_PSM_ILLEGAL = 0xff
 };
 
 struct acx_sleep_auth {
diff --git a/drivers/net/wireless/ti/wlcore/conf.h b/drivers/net/wireless/ti/wlcore/conf.h
index 03c6358..d77224f 100644
--- a/drivers/net/wireless/ti/wlcore/conf.h
+++ b/drivers/net/wireless/ti/wlcore/conf.h
@@ -951,6 +951,12 @@ struct conf_conn_settings {
 	 * Range: u16
 	 */
 	u8 max_listen_interval;
+
+	/*
+	 * Default sleep authorization for a new STA interface. This determines
+	 * whether we can go to ELP.
+	 */
+	u8 sta_sleep_auth;
 } __packed;
 
 enum {
@@ -1276,7 +1282,7 @@ struct conf_hangover_settings {
  * version, the two LSB are the lower driver's private conf
  * version.
  */
-#define WLCORE_CONF_VERSION	(0x0001 << 16)
+#define WLCORE_CONF_VERSION	(0x0002 << 16)
 #define WLCORE_CONF_MASK	0xffff0000
 #define WLCORE_CONF_SIZE	(sizeof(struct wlcore_conf_header) +	\
 				 sizeof(struct wlcore_conf))
diff --git a/drivers/net/wireless/ti/wlcore/debugfs.c b/drivers/net/wireless/ti/wlcore/debugfs.c
index 91e43de..1768f37 100644
--- a/drivers/net/wireless/ti/wlcore/debugfs.c
+++ b/drivers/net/wireless/ti/wlcore/debugfs.c
@@ -995,8 +995,13 @@ static ssize_t sleep_auth_write(struct file *file,
 
 	mutex_lock(&wl->mutex);
 
-	if (wl->state == WL1271_STATE_OFF)
+	wl->conf.conn.sta_sleep_auth = value;
+
+	if (wl->state == WL1271_STATE_OFF) {
+		/* this will show up on "read" in case we are off */
+		wl->sleep_auth = value;
 		goto out;
+	}
 
 	ret = wl1271_ps_elp_wakeup(wl);
 	if (ret < 0)
diff --git a/drivers/net/wireless/ti/wlcore/init.c b/drivers/net/wireless/ti/wlcore/init.c
index 645abd4..3fb9352 100644
--- a/drivers/net/wireless/ti/wlcore/init.c
+++ b/drivers/net/wireless/ti/wlcore/init.c
@@ -565,7 +565,13 @@ int wl1271_init_vif_specific(struct wl1271 *wl, struct ieee80211_vif *vif)
 			if (ret < 0)
 				return ret;
 		} else if (!wl->sta_count) {
-			if (wl->quirks & WLCORE_QUIRK_NO_ELP) {
+			u8 sta_auth = wl->conf.conn.sta_sleep_auth;
+			if (sta_auth != WL1271_PSM_ILLEGAL) {
+				/* Configure for power according to debugfs */
+				ret = wl1271_acx_sleep_auth(wl, sta_auth);
+				if (ret < 0)
+					return ret;
+			} else if (wl->quirks & WLCORE_QUIRK_NO_ELP) {
 				/* Configure for power always on */
 				ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
 				if (ret < 0)
diff --git a/drivers/net/wireless/ti/wlcore/main.c b/drivers/net/wireless/ti/wlcore/main.c
index 7677cd5..69643d1 100644
--- a/drivers/net/wireless/ti/wlcore/main.c
+++ b/drivers/net/wireless/ti/wlcore/main.c
@@ -5176,7 +5176,7 @@ struct ieee80211_hw *wlcore_alloc_hw(size_t priv_size)
 	wl->channel_type = NL80211_CHAN_NO_HT;
 	wl->flags = 0;
 	wl->sg_enabled = true;
-	wl->sleep_auth = WL1271_PSM_CAM;
+	wl->sleep_auth = WL1271_PSM_ILLEGAL;
 	wl->hw_pg_ver = -1;
 	wl->ap_ps_map = 0;
 	wl->ap_fw_ps_map = 0;
-- 
1.7.10


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 04/12] wlcore: reconfigure sleep_auth when removing interfaces
  2012-06-21 14:12 [PATCH 00/12] wlcore/wl18xx: patches for 3.6 Luciano Coelho
                   ` (2 preceding siblings ...)
  2012-06-21 14:13 ` [PATCH 03/12] wlcore: allow setting sleep_auth before interface init Luciano Coelho
@ 2012-06-21 14:13 ` Luciano Coelho
  2012-06-21 14:13 ` [PATCH 05/12] wl18xx: increase Rx descriptors for PG2 Luciano Coelho
                   ` (8 subsequent siblings)
  12 siblings, 0 replies; 16+ messages in thread
From: Luciano Coelho @ 2012-06-21 14:13 UTC (permalink / raw)
  To: linux-wireless; +Cc: coelho, arik

From: Arik Nemtsov <arik@wizery.com>

The sleep_auth value of the last interface to be set up prevailed when
an interface was removed. Take care of this by correctly configuring the
value according to the remaining STA/AP interfaces.

Take this opportunity to refactor the sleep_auth setting code for better
readability.

[Small style fix. -- Luca]

Signed-off-by: Arik Nemtsov <arik@wizery.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
---
 drivers/net/wireless/ti/wlcore/acx.c  |    5 +++-
 drivers/net/wireless/ti/wlcore/init.c |   49 ++++++++++++++-------------------
 drivers/net/wireless/ti/wlcore/main.c |   21 ++++++++++++--
 3 files changed, 43 insertions(+), 32 deletions(-)

diff --git a/drivers/net/wireless/ti/wlcore/acx.c b/drivers/net/wireless/ti/wlcore/acx.c
index 3384bc1..ce108a7 100644
--- a/drivers/net/wireless/ti/wlcore/acx.c
+++ b/drivers/net/wireless/ti/wlcore/acx.c
@@ -81,8 +81,11 @@ int wl1271_acx_sleep_auth(struct wl1271 *wl, u8 sleep_auth)
 	auth->sleep_auth = sleep_auth;
 
 	ret = wl1271_cmd_configure(wl, ACX_SLEEP_AUTH, auth, sizeof(*auth));
-	if (ret < 0)
+	if (ret < 0) {
+		wl1271_error("could not configure sleep_auth to %d: %d",
+			     sleep_auth, ret);
 		goto out;
+	}
 
 	wl->sleep_auth = sleep_auth;
 out:
diff --git a/drivers/net/wireless/ti/wlcore/init.c b/drivers/net/wireless/ti/wlcore/init.c
index 3fb9352..8a8a897 100644
--- a/drivers/net/wireless/ti/wlcore/init.c
+++ b/drivers/net/wireless/ti/wlcore/init.c
@@ -554,35 +554,28 @@ int wl1271_init_vif_specific(struct wl1271 *wl, struct ieee80211_vif *vif)
 	bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
 	int ret, i;
 
-	/*
-	 * consider all existing roles before configuring psm.
-	 * TODO: reconfigure on interface removal.
-	 */
-	if (!wl->ap_count) {
-		if (is_ap) {
-			/* Configure for power always on */
+	/* consider all existing roles before configuring psm. */
+
+	if (wl->ap_count == 0 && is_ap) { /* first AP */
+		/* Configure for power always on */
+		ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
+		if (ret < 0)
+			return ret;
+	/* first STA, no APs */
+	} else if (wl->sta_count == 0 && wl->ap_count == 0 && !is_ap) {
+		u8 sta_auth = wl->conf.conn.sta_sleep_auth;
+		/* Configure for power according to debugfs */
+		if (sta_auth != WL1271_PSM_ILLEGAL)
+			ret = wl1271_acx_sleep_auth(wl, sta_auth);
+		/* Configure for power always on */
+		else if (wl->quirks & WLCORE_QUIRK_NO_ELP)
 			ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
-			if (ret < 0)
-				return ret;
-		} else if (!wl->sta_count) {
-			u8 sta_auth = wl->conf.conn.sta_sleep_auth;
-			if (sta_auth != WL1271_PSM_ILLEGAL) {
-				/* Configure for power according to debugfs */
-				ret = wl1271_acx_sleep_auth(wl, sta_auth);
-				if (ret < 0)
-					return ret;
-			} else if (wl->quirks & WLCORE_QUIRK_NO_ELP) {
-				/* Configure for power always on */
-				ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
-				if (ret < 0)
-					return ret;
-			} else {
-				/* Configure for ELP power saving */
-				ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_ELP);
-				if (ret < 0)
-					return ret;
-			}
-		}
+		/* Configure for ELP power saving */
+		else
+			ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_ELP);
+
+		if (ret < 0)
+			return ret;
 	}
 
 	/* Mode specific init */
diff --git a/drivers/net/wireless/ti/wlcore/main.c b/drivers/net/wireless/ti/wlcore/main.c
index 69643d1..3279a94 100644
--- a/drivers/net/wireless/ti/wlcore/main.c
+++ b/drivers/net/wireless/ti/wlcore/main.c
@@ -1082,7 +1082,7 @@ int wl1271_plt_stop(struct wl1271 *wl)
 	mutex_lock(&wl->mutex);
 	wl1271_power_off(wl);
 	wl->flags = 0;
-	wl->sleep_auth = WL1271_PSM_CAM;
+	wl->sleep_auth = WL1271_PSM_ILLEGAL;
 	wl->state = WL1271_STATE_OFF;
 	wl->plt = false;
 	wl->rx_counter = 0;
@@ -1741,7 +1741,7 @@ static void wl1271_op_stop(struct ieee80211_hw *hw)
 	wl->ap_fw_ps_map = 0;
 	wl->ap_ps_map = 0;
 	wl->sched_scanning = false;
-	wl->sleep_auth = WL1271_PSM_CAM;
+	wl->sleep_auth = WL1271_PSM_ILLEGAL;
 	memset(wl->roles_map, 0, sizeof(wl->roles_map));
 	memset(wl->links_map, 0, sizeof(wl->links_map));
 	memset(wl->roc_map, 0, sizeof(wl->roc_map));
@@ -2148,6 +2148,7 @@ static void __wl1271_op_remove_interface(struct wl1271 *wl,
 {
 	struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
 	int i, ret;
+	bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
 
 	wl1271_debug(DEBUG_MAC80211, "mac80211 remove interface");
 
@@ -2228,11 +2229,25 @@ deinit:
 	wlvif->role_id = WL12XX_INVALID_ROLE_ID;
 	wlvif->dev_role_id = WL12XX_INVALID_ROLE_ID;
 
-	if (wlvif->bss_type == BSS_TYPE_AP_BSS)
+	if (is_ap)
 		wl->ap_count--;
 	else
 		wl->sta_count--;
 
+	/* Last AP, have more stations. Configure according to STA. */
+	if (wl->ap_count == 0 && is_ap && wl->sta_count) {
+		u8 sta_auth = wl->conf.conn.sta_sleep_auth;
+		/* Configure for power according to debugfs */
+		if (sta_auth != WL1271_PSM_ILLEGAL)
+			wl1271_acx_sleep_auth(wl, sta_auth);
+		/* Configure for power always on */
+		else if (wl->quirks & WLCORE_QUIRK_NO_ELP)
+			wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
+		/* Configure for ELP power saving */
+		else
+			wl1271_acx_sleep_auth(wl, WL1271_PSM_ELP);
+	}
+
 	mutex_unlock(&wl->mutex);
 
 	del_timer_sync(&wlvif->rx_streaming_timer);
-- 
1.7.10


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 05/12] wl18xx: increase Rx descriptors for PG2
  2012-06-21 14:12 [PATCH 00/12] wlcore/wl18xx: patches for 3.6 Luciano Coelho
                   ` (3 preceding siblings ...)
  2012-06-21 14:13 ` [PATCH 04/12] wlcore: reconfigure sleep_auth when removing interfaces Luciano Coelho
@ 2012-06-21 14:13 ` Luciano Coelho
  2012-06-21 14:13 ` [PATCH 06/12] wl18xx: set Tx align quirk " Luciano Coelho
                   ` (7 subsequent siblings)
  12 siblings, 0 replies; 16+ messages in thread
From: Luciano Coelho @ 2012-06-21 14:13 UTC (permalink / raw)
  To: linux-wireless; +Cc: coelho, arik

From: Arik Nemtsov <arik@wizery.com>

New PG2 firmwares have additional Rx descriptors.

Add a module parameter to manually set the number of Rx descriptors for
older versions (PG1). We cannot discriminate based on chip-id, since
this value must be set on probe.

Signed-off-by: Arik Nemtsov <arik@wizery.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
---
 drivers/net/wireless/ti/wl18xx/main.c |   11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ti/wl18xx/main.c b/drivers/net/wireless/ti/wl18xx/main.c
index d3f171d..18cf19c 100644
--- a/drivers/net/wireless/ti/wl18xx/main.c
+++ b/drivers/net/wireless/ti/wl18xx/main.c
@@ -47,6 +47,7 @@ static char *ht_mode_param = "wide";
 static char *board_type_param = "hdk";
 static bool checksum_param = false;
 static bool enable_11a_param = true;
+static int num_rx_desc_param = -1;
 
 /* phy paramters */
 static int dc2dc_param = -1;
@@ -1286,7 +1287,7 @@ static int __devinit wl18xx_probe(struct platform_device *pdev)
 	wl->ptable = wl18xx_ptable;
 	wl->rtable = wl18xx_rtable;
 	wl->num_tx_desc = 32;
-	wl->num_rx_desc = 16;
+	wl->num_rx_desc = 32;
 	wl->band_rate_to_idx = wl18xx_band_rate_to_idx;
 	wl->hw_tx_rate_tbl_size = WL18XX_CONF_HW_RXTX_RATE_MAX;
 	wl->hw_min_ht_rate = WL18XX_CONF_HW_RXTX_RATE_MCS0;
@@ -1294,6 +1295,9 @@ static int __devinit wl18xx_probe(struct platform_device *pdev)
 	wl->stats.fw_stats_len = sizeof(struct wl18xx_acx_statistics);
 	wl->static_data_priv_len = sizeof(struct wl18xx_static_data_priv);
 
+	if (num_rx_desc_param != -1)
+		wl->num_rx_desc = num_rx_desc_param;
+
 	if (!strcmp(ht_mode_param, "wide")) {
 		memcpy(&wl->ht_cap[IEEE80211_BAND_2GHZ],
 		       &wl18xx_siso40_ht_cap,
@@ -1458,6 +1462,11 @@ module_param_named(pwr_limit_reference_11_abg,
 MODULE_PARM_DESC(pwr_limit_reference_11_abg, "Power limit reference: u8 "
 		 "(default is 0xc8)");
 
+module_param_named(num_rx_desc,
+		   num_rx_desc_param, int, S_IRUSR);
+MODULE_PARM_DESC(num_rx_desc_param,
+		 "Number of Rx descriptors: u8 (default is 32)");
+
 MODULE_LICENSE("GPL v2");
 MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
 MODULE_FIRMWARE(WL18XX_FW_NAME);
-- 
1.7.10


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 06/12] wl18xx: set Tx align quirk for PG2
  2012-06-21 14:12 [PATCH 00/12] wlcore/wl18xx: patches for 3.6 Luciano Coelho
                   ` (4 preceding siblings ...)
  2012-06-21 14:13 ` [PATCH 05/12] wl18xx: increase Rx descriptors for PG2 Luciano Coelho
@ 2012-06-21 14:13 ` Luciano Coelho
  2012-06-21 14:13 ` [PATCH 07/12] wlcore: do not report noise level in get survey op Luciano Coelho
                   ` (6 subsequent siblings)
  12 siblings, 0 replies; 16+ messages in thread
From: Luciano Coelho @ 2012-06-21 14:13 UTC (permalink / raw)
  To: linux-wireless; +Cc: coelho, arik

From: Arik Nemtsov <arik@wizery.com>

Before patch b5d6d9b (wlcore/wl12xx/wl18xx: don't use TX align quirk
for wl127x), this was automatically set for all platforms. As this
should now be set explicitly, set it for PG2 as well.

Signed-off-by: Arik Nemtsov <arik@wizery.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
---
 drivers/net/wireless/ti/wl18xx/main.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ti/wl18xx/main.c b/drivers/net/wireless/ti/wl18xx/main.c
index 18cf19c..066e8e5 100644
--- a/drivers/net/wireless/ti/wl18xx/main.c
+++ b/drivers/net/wireless/ti/wl18xx/main.c
@@ -608,8 +608,8 @@ static int wl18xx_identify_chip(struct wl1271 *wl)
 		wl->plt_fw_name = WL18XX_FW_NAME;
 		wl->quirks |= WLCORE_QUIRK_NO_ELP |
 			      WLCORE_QUIRK_RX_BLOCKSIZE_ALIGN |
+			      WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN |
 			      WLCORE_QUIRK_TX_PAD_LAST_FRAME;
-
 		break;
 	case CHIP_ID_185x_PG10:
 		wl1271_debug(DEBUG_BOOT, "chip id 0x%x (185x PG10)",
-- 
1.7.10


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 07/12] wlcore: do not report noise level in get survey op
  2012-06-21 14:12 [PATCH 00/12] wlcore/wl18xx: patches for 3.6 Luciano Coelho
                   ` (5 preceding siblings ...)
  2012-06-21 14:13 ` [PATCH 06/12] wl18xx: set Tx align quirk " Luciano Coelho
@ 2012-06-21 14:13 ` Luciano Coelho
  2012-06-21 14:24   ` Luciano Coelho
  2012-06-21 14:13 ` [PATCH 08/12] wlcore: read FW logs from FW memory on watchdog recovery Luciano Coelho
                   ` (5 subsequent siblings)
  12 siblings, 1 reply; 16+ messages in thread
From: Luciano Coelho @ 2012-06-21 14:13 UTC (permalink / raw)
  To: linux-wireless; +Cc: coelho, arik

From: Yoni Divinsky <yoni.divinsky@ti.com>

The get survey op expects the low level driver to report
the noise level for a a given channel.

The noise calculated in wlcore is (rssi-snr/2), but since
the snr reported by the FW is a derivative from the rssi
this calculation is useless, and should not be reported
to the user space.

Reporting incorrect noise, results in the wpa_supplicant
miscalculating the roaming candidate priority, thus causing
a situation where an AP with a lower rssi level would be
chosen over a better AP.

Signed-off-by: Yoni Divinsky <yoni.divinsky@ti.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
---
 drivers/net/wireless/ti/wlcore/main.c |    5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/drivers/net/wireless/ti/wlcore/main.c b/drivers/net/wireless/ti/wlcore/main.c
index 3279a94..a7c5e32 100644
--- a/drivers/net/wireless/ti/wlcore/main.c
+++ b/drivers/net/wireless/ti/wlcore/main.c
@@ -4108,16 +4108,13 @@ out:
 static int wl1271_op_get_survey(struct ieee80211_hw *hw, int idx,
 				struct survey_info *survey)
 {
-	struct wl1271 *wl = hw->priv;
 	struct ieee80211_conf *conf = &hw->conf;
 
 	if (idx != 0)
 		return -ENOENT;
 
 	survey->channel = conf->channel;
-	survey->filled = SURVEY_INFO_NOISE_DBM;
-	survey->noise = wl->noise;
-
+	survey->filled = 0;
 	return 0;
 }
 
-- 
1.7.10


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 08/12] wlcore: read FW logs from FW memory on watchdog recovery
  2012-06-21 14:12 [PATCH 00/12] wlcore/wl18xx: patches for 3.6 Luciano Coelho
                   ` (6 preceding siblings ...)
  2012-06-21 14:13 ` [PATCH 07/12] wlcore: do not report noise level in get survey op Luciano Coelho
@ 2012-06-21 14:13 ` Luciano Coelho
  2012-06-21 14:24   ` Luciano Coelho
  2012-06-21 14:13 ` [PATCH 09/12] wl18xx: explicitly remove the 5Ghz MIMO HT cap Luciano Coelho
                   ` (4 subsequent siblings)
  12 siblings, 1 reply; 16+ messages in thread
From: Luciano Coelho @ 2012-06-21 14:13 UTC (permalink / raw)
  To: linux-wireless; +Cc: coelho, arik

From: Igal Chernobelsky <igalc@ti.com>

FW uses a few memory blocks as a buffer to accumulate FW logs before
transmitting them to the host over SDIO. When FW WatchDog recovery
occurs, the last FW traces are still pending in the buffer. Driver is
to read these FW traces whether log mode is continuous or on demand.

FW memory blocks allocated for the log buffer are handled as a link list:
the first 4 bytes in each memory block contain FW address to the next block.
The end of list condition depends on FW log mode:
- on demand: the list is cyclic, the next address is equal to the first address
- continuous: the address is  equal to 0x2000000

Log data resides inside FW memory block with offset depending on
logger mode:
- on demand:  4 bytes (address of the next memory block)
- continuous: 4 bytes and Rx Descriptor structure size

Described FW logger API is backward compatible with previous FW versions.

Signed-off-by: Igal Chernobelsky <igalc@ti.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
---
 drivers/net/wireless/ti/wlcore/main.c |   34 +++++++++++++++++++++------------
 1 file changed, 22 insertions(+), 12 deletions(-)

diff --git a/drivers/net/wireless/ti/wlcore/main.c b/drivers/net/wireless/ti/wlcore/main.c
index a7c5e32..78edc58 100644
--- a/drivers/net/wireless/ti/wlcore/main.c
+++ b/drivers/net/wireless/ti/wlcore/main.c
@@ -770,14 +770,16 @@ size_t wl12xx_copy_fwlog(struct wl1271 *wl, u8 *memblock, size_t maxlen)
 	return len;
 }
 
+#define WLCORE_FW_LOG_END 0x2000000
+
 static void wl12xx_read_fwlog_panic(struct wl1271 *wl)
 {
 	u32 addr;
-	u32 first_addr;
+	u32 offset;
+	u32 end_of_log;
 	u8 *block;
 
 	if ((wl->quirks & WLCORE_QUIRK_FWLOG_NOT_IMPLEMENTED) ||
-	    (wl->conf.fwlog.mode != WL12XX_FWLOG_ON_DEMAND) ||
 	    (wl->conf.fwlog.mem_blocks == 0))
 		return;
 
@@ -791,19 +793,26 @@ static void wl12xx_read_fwlog_panic(struct wl1271 *wl)
 	 * Make sure the chip is awake and the logger isn't active.
 	 * Do not send a stop fwlog command if the fw is hanged.
 	 */
-	if (!wl1271_ps_elp_wakeup(wl) && !wl->watchdog_recovery)
-		wl12xx_cmd_stop_fwlog(wl);
-	else
+	if (wl1271_ps_elp_wakeup(wl))
 		goto out;
+	if (!wl->watchdog_recovery)
+		wl12xx_cmd_stop_fwlog(wl);
 
 	/* Read the first memory block address */
 	wl12xx_fw_status(wl, wl->fw_status_1, wl->fw_status_2);
-	first_addr = le32_to_cpu(wl->fw_status_2->log_start_addr);
-	if (!first_addr)
+	addr = le32_to_cpu(wl->fw_status_2->log_start_addr);
+	if (!addr)
 		goto out;
 
+	if (wl->conf.fwlog.mode == WL12XX_FWLOG_CONTINUOUS) {
+		offset = sizeof(addr) + sizeof(struct wl1271_rx_descriptor);
+		end_of_log = WLCORE_FW_LOG_END;
+	} else {
+		offset = sizeof(addr);
+		end_of_log = addr;
+	}
+
 	/* Traverse the memory blocks linked list */
-	addr = first_addr;
 	do {
 		memset(block, 0, WL12XX_HW_BLOCK_SIZE);
 		wl1271_read_hwaddr(wl, addr, block, WL12XX_HW_BLOCK_SIZE,
@@ -812,13 +821,14 @@ static void wl12xx_read_fwlog_panic(struct wl1271 *wl)
 		/*
 		 * Memory blocks are linked to one another. The first 4 bytes
 		 * of each memory block hold the hardware address of the next
-		 * one. The last memory block points to the first one.
+		 * one. The last memory block points to the first one in
+		 * on demand mode and is equal to 0x2000000 in continuous mode.
 		 */
 		addr = le32_to_cpup((__le32 *)block);
-		if (!wl12xx_copy_fwlog(wl, block + sizeof(addr),
-				       WL12XX_HW_BLOCK_SIZE - sizeof(addr)))
+		if (!wl12xx_copy_fwlog(wl, block + offset,
+				       WL12XX_HW_BLOCK_SIZE - offset))
 			break;
-	} while (addr && (addr != first_addr));
+	} while (addr && (addr != end_of_log));
 
 	wake_up_interruptible(&wl->fwlog_waitq);
 
-- 
1.7.10


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 09/12] wl18xx: explicitly remove the 5Ghz MIMO HT cap
  2012-06-21 14:12 [PATCH 00/12] wlcore/wl18xx: patches for 3.6 Luciano Coelho
                   ` (7 preceding siblings ...)
  2012-06-21 14:13 ` [PATCH 08/12] wlcore: read FW logs from FW memory on watchdog recovery Luciano Coelho
@ 2012-06-21 14:13 ` Luciano Coelho
  2012-06-21 14:13 ` [PATCH 10/12] wl18xx: sane defaults for HT capabilities Luciano Coelho
                   ` (3 subsequent siblings)
  12 siblings, 0 replies; 16+ messages in thread
From: Luciano Coelho @ 2012-06-21 14:13 UTC (permalink / raw)
  To: linux-wireless; +Cc: coelho, arik

From: Arik Nemtsov <arik@wizery.com>

The 18xx chip does not support MIMO in 5Ghz. Use the siso20 HT cap as
fallback in 5Ghz when "mimo" is requested.

Signed-off-by: Arik Nemtsov <arik@wizery.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
---
 drivers/net/wireless/ti/wl18xx/main.c |   17 +++--------------
 1 file changed, 3 insertions(+), 14 deletions(-)

diff --git a/drivers/net/wireless/ti/wl18xx/main.c b/drivers/net/wireless/ti/wl18xx/main.c
index 066e8e5..365063b 100644
--- a/drivers/net/wireless/ti/wl18xx/main.c
+++ b/drivers/net/wireless/ti/wl18xx/main.c
@@ -1255,18 +1255,6 @@ static struct ieee80211_sta_ht_cap wl18xx_mimo_ht_cap_2ghz = {
 		},
 };
 
-static struct ieee80211_sta_ht_cap wl18xx_mimo_ht_cap_5ghz = {
-	.cap = IEEE80211_HT_CAP_SGI_20,
-	.ht_supported = true,
-	.ampdu_factor = IEEE80211_HT_MAX_AMPDU_16K,
-	.ampdu_density = IEEE80211_HT_MPDU_DENSITY_16,
-	.mcs = {
-		.rx_mask = { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
-		.rx_highest = cpu_to_le16(72),
-		.tx_params = IEEE80211_HT_MCS_TX_DEFINED,
-		},
-};
-
 static int __devinit wl18xx_probe(struct platform_device *pdev)
 {
 	struct wl1271 *wl;
@@ -1309,9 +1297,10 @@ static int __devinit wl18xx_probe(struct platform_device *pdev)
 		memcpy(&wl->ht_cap[IEEE80211_BAND_2GHZ],
 		       &wl18xx_mimo_ht_cap_2ghz,
 		       sizeof(wl18xx_mimo_ht_cap_2ghz));
+		/* we don't support MIMO in 5Ghz */
 		memcpy(&wl->ht_cap[IEEE80211_BAND_5GHZ],
-		       &wl18xx_mimo_ht_cap_5ghz,
-		       sizeof(wl18xx_mimo_ht_cap_5ghz));
+		       &wl18xx_siso20_ht_cap,
+		       sizeof(wl18xx_siso20_ht_cap));
 	} else if (!strcmp(ht_mode_param, "siso20")) {
 		memcpy(&wl->ht_cap[IEEE80211_BAND_2GHZ],
 		       &wl18xx_siso20_ht_cap,
-- 
1.7.10


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 10/12] wl18xx: sane defaults for HT capabilities
  2012-06-21 14:12 [PATCH 00/12] wlcore/wl18xx: patches for 3.6 Luciano Coelho
                   ` (8 preceding siblings ...)
  2012-06-21 14:13 ` [PATCH 09/12] wl18xx: explicitly remove the 5Ghz MIMO HT cap Luciano Coelho
@ 2012-06-21 14:13 ` Luciano Coelho
  2012-06-21 14:13 ` [PATCH 11/12] wl18xx: split siso40 HT cap between 2Ghz and 5Ghz Luciano Coelho
                   ` (2 subsequent siblings)
  12 siblings, 0 replies; 16+ messages in thread
From: Luciano Coelho @ 2012-06-21 14:13 UTC (permalink / raw)
  To: linux-wireless; +Cc: coelho, arik

From: Arik Nemtsov <arik@wizery.com>

Introduce a default set of HT capabilities that are set according to the
number of antennas on the board. Move the HT setting code down to allow
the number of antennas to be set (and optionally overridden) before it.

Remove the "mimo" HT option, since the default mode now enables MIMO is
possible.

Use this opportunity to add a helper function for setting HT
capabilities and reduce the volume of the code a bit.

Signed-off-by: Arik Nemtsov <arik@wizery.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
---
 drivers/net/wireless/ti/wl12xx/main.c   |    6 +--
 drivers/net/wireless/ti/wl18xx/main.c   |   63 ++++++++++++++++---------------
 drivers/net/wireless/ti/wlcore/wlcore.h |    7 ++++
 3 files changed, 42 insertions(+), 34 deletions(-)

diff --git a/drivers/net/wireless/ti/wl12xx/main.c b/drivers/net/wireless/ti/wl12xx/main.c
index 7974ed5..0d2fdca 100644
--- a/drivers/net/wireless/ti/wl12xx/main.c
+++ b/drivers/net/wireless/ti/wl12xx/main.c
@@ -1449,10 +1449,8 @@ static int __devinit wl12xx_probe(struct platform_device *pdev)
 	wl->hw_min_ht_rate = WL12XX_CONF_HW_RXTX_RATE_MCS0;
 	wl->fw_status_priv_len = 0;
 	wl->stats.fw_stats_len = sizeof(struct wl12xx_acx_statistics);
-	memcpy(&wl->ht_cap[IEEE80211_BAND_2GHZ], &wl12xx_ht_cap,
-	       sizeof(wl12xx_ht_cap));
-	memcpy(&wl->ht_cap[IEEE80211_BAND_5GHZ], &wl12xx_ht_cap,
-	       sizeof(wl12xx_ht_cap));
+	wlcore_set_ht_cap(wl, IEEE80211_BAND_2GHZ, &wl12xx_ht_cap);
+	wlcore_set_ht_cap(wl, IEEE80211_BAND_5GHZ, &wl12xx_ht_cap);
 	wl12xx_conf_init(wl);
 
 	if (!fref_param) {
diff --git a/drivers/net/wireless/ti/wl18xx/main.c b/drivers/net/wireless/ti/wl18xx/main.c
index 365063b..485aeae 100644
--- a/drivers/net/wireless/ti/wl18xx/main.c
+++ b/drivers/net/wireless/ti/wl18xx/main.c
@@ -43,7 +43,7 @@
 
 #define WL18XX_RX_CHECKSUM_MASK      0x40
 
-static char *ht_mode_param = "wide";
+static char *ht_mode_param = "default";
 static char *board_type_param = "hdk";
 static bool checksum_param = false;
 static bool enable_11a_param = true;
@@ -1286,34 +1286,6 @@ static int __devinit wl18xx_probe(struct platform_device *pdev)
 	if (num_rx_desc_param != -1)
 		wl->num_rx_desc = num_rx_desc_param;
 
-	if (!strcmp(ht_mode_param, "wide")) {
-		memcpy(&wl->ht_cap[IEEE80211_BAND_2GHZ],
-		       &wl18xx_siso40_ht_cap,
-		       sizeof(wl18xx_siso40_ht_cap));
-		memcpy(&wl->ht_cap[IEEE80211_BAND_5GHZ],
-		       &wl18xx_siso40_ht_cap,
-		       sizeof(wl18xx_siso40_ht_cap));
-	} else if (!strcmp(ht_mode_param, "mimo")) {
-		memcpy(&wl->ht_cap[IEEE80211_BAND_2GHZ],
-		       &wl18xx_mimo_ht_cap_2ghz,
-		       sizeof(wl18xx_mimo_ht_cap_2ghz));
-		/* we don't support MIMO in 5Ghz */
-		memcpy(&wl->ht_cap[IEEE80211_BAND_5GHZ],
-		       &wl18xx_siso20_ht_cap,
-		       sizeof(wl18xx_siso20_ht_cap));
-	} else if (!strcmp(ht_mode_param, "siso20")) {
-		memcpy(&wl->ht_cap[IEEE80211_BAND_2GHZ],
-		       &wl18xx_siso20_ht_cap,
-		       sizeof(wl18xx_siso20_ht_cap));
-		memcpy(&wl->ht_cap[IEEE80211_BAND_5GHZ],
-		       &wl18xx_siso20_ht_cap,
-		       sizeof(wl18xx_siso20_ht_cap));
-	} else {
-		wl1271_error("invalid ht_mode '%s'", ht_mode_param);
-		ret = -EINVAL;
-		goto out_free;
-	}
-
 	ret = wl18xx_conf_init(wl, &pdev->dev);
 	if (ret < 0)
 		goto out_free;
@@ -1359,6 +1331,37 @@ static int __devinit wl18xx_probe(struct platform_device *pdev)
 	if (dc2dc_param != -1)
 		priv->conf.phy.external_pa_dc2dc = dc2dc_param;
 
+	if (!strcmp(ht_mode_param, "default")) {
+		/*
+		 * Only support mimo with multiple antennas. Fall back to
+		 * siso20.
+		 */
+		if (priv->conf.phy.number_of_assembled_ant2_4 >= 2)
+			wlcore_set_ht_cap(wl, IEEE80211_BAND_2GHZ,
+					  &wl18xx_mimo_ht_cap_2ghz);
+		else
+			wlcore_set_ht_cap(wl, IEEE80211_BAND_2GHZ,
+					  &wl18xx_siso20_ht_cap);
+
+		/* 5Ghz is always wide */
+		wlcore_set_ht_cap(wl, IEEE80211_BAND_5GHZ,
+				  &wl18xx_siso40_ht_cap);
+	} else if (!strcmp(ht_mode_param, "wide")) {
+		wlcore_set_ht_cap(wl, IEEE80211_BAND_2GHZ,
+				  &wl18xx_siso40_ht_cap);
+		wlcore_set_ht_cap(wl, IEEE80211_BAND_5GHZ,
+				  &wl18xx_siso40_ht_cap);
+	} else if (!strcmp(ht_mode_param, "siso20")) {
+		wlcore_set_ht_cap(wl, IEEE80211_BAND_2GHZ,
+				  &wl18xx_siso20_ht_cap);
+		wlcore_set_ht_cap(wl, IEEE80211_BAND_5GHZ,
+				  &wl18xx_siso20_ht_cap);
+	} else {
+		wl1271_error("invalid ht_mode '%s'", ht_mode_param);
+		ret = -EINVAL;
+		goto out_free;
+	}
+
 	if (!checksum_param) {
 		wl18xx_ops.set_rx_csum = NULL;
 		wl18xx_ops.init_vif = NULL;
@@ -1403,7 +1406,7 @@ static void __exit wl18xx_exit(void)
 module_exit(wl18xx_exit);
 
 module_param_named(ht_mode, ht_mode_param, charp, S_IRUSR);
-MODULE_PARM_DESC(ht_mode, "Force HT mode: wide (default), mimo or siso20");
+MODULE_PARM_DESC(ht_mode, "Force HT mode: wide or siso20");
 
 module_param_named(board_type, board_type_param, charp, S_IRUSR);
 MODULE_PARM_DESC(board_type, "Board type: fpga, hdk (default), evb, com8 or "
diff --git a/drivers/net/wireless/ti/wlcore/wlcore.h b/drivers/net/wireless/ti/wlcore/wlcore.h
index eae8edc..205d8ad 100644
--- a/drivers/net/wireless/ti/wlcore/wlcore.h
+++ b/drivers/net/wireless/ti/wlcore/wlcore.h
@@ -401,6 +401,13 @@ int wlcore_set_key(struct wl1271 *wl, enum set_key_cmd cmd,
 		   struct ieee80211_sta *sta,
 		   struct ieee80211_key_conf *key_conf);
 
+static inline void
+wlcore_set_ht_cap(struct wl1271 *wl, enum ieee80211_band band,
+		  struct ieee80211_sta_ht_cap *ht_cap)
+{
+	memcpy(&wl->ht_cap[band], ht_cap, sizeof(*ht_cap));
+}
+
 /* Firmware image load chunk size */
 #define CHUNK_SIZE	16384
 
-- 
1.7.10


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 11/12] wl18xx: split siso40 HT cap between 2Ghz and 5Ghz
  2012-06-21 14:12 [PATCH 00/12] wlcore/wl18xx: patches for 3.6 Luciano Coelho
                   ` (9 preceding siblings ...)
  2012-06-21 14:13 ` [PATCH 10/12] wl18xx: sane defaults for HT capabilities Luciano Coelho
@ 2012-06-21 14:13 ` Luciano Coelho
  2012-06-21 14:13 ` [PATCH 12/12] wl18xx: use %zu for size_t arguments in printk calls Luciano Coelho
  2012-06-21 18:58 ` [PATCH 00/12] wlcore/wl18xx: patches for 3.6 Luciano Coelho
  12 siblings, 0 replies; 16+ messages in thread
From: Luciano Coelho @ 2012-06-21 14:13 UTC (permalink / raw)
  To: linux-wireless; +Cc: coelho, arik

From: Arik Nemtsov <arik@wizery.com>

Remove the cap IEEE80211_HT_CAP_DSSSCCK40 from the 5Ghz variant of
the siso40 HT capabilities. It is meaningless in 5Ghz.

Signed-off-by: Arik Nemtsov <arik@wizery.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
---
 drivers/net/wireless/ti/wl18xx/main.c |   24 +++++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)

diff --git a/drivers/net/wireless/ti/wl18xx/main.c b/drivers/net/wireless/ti/wl18xx/main.c
index 485aeae..2c0f51b 100644
--- a/drivers/net/wireless/ti/wl18xx/main.c
+++ b/drivers/net/wireless/ti/wl18xx/main.c
@@ -1215,8 +1215,8 @@ static struct wlcore_ops wl18xx_ops = {
 	.pre_pkt_send	= wl18xx_pre_pkt_send,
 };
 
-/* HT cap appropriate for wide channels */
-static struct ieee80211_sta_ht_cap wl18xx_siso40_ht_cap = {
+/* HT cap appropriate for wide channels in 2Ghz */
+static struct ieee80211_sta_ht_cap wl18xx_siso40_ht_cap_2ghz = {
 	.cap = IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40 |
 	       IEEE80211_HT_CAP_SUP_WIDTH_20_40 | IEEE80211_HT_CAP_DSSSCCK40,
 	.ht_supported = true,
@@ -1229,6 +1229,20 @@ static struct ieee80211_sta_ht_cap wl18xx_siso40_ht_cap = {
 		},
 };
 
+/* HT cap appropriate for wide channels in 5Ghz */
+static struct ieee80211_sta_ht_cap wl18xx_siso40_ht_cap_5ghz = {
+	.cap = IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40 |
+	       IEEE80211_HT_CAP_SUP_WIDTH_20_40,
+	.ht_supported = true,
+	.ampdu_factor = IEEE80211_HT_MAX_AMPDU_16K,
+	.ampdu_density = IEEE80211_HT_MPDU_DENSITY_16,
+	.mcs = {
+		.rx_mask = { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
+		.rx_highest = cpu_to_le16(150),
+		.tx_params = IEEE80211_HT_MCS_TX_DEFINED,
+		},
+};
+
 /* HT cap appropriate for SISO 20 */
 static struct ieee80211_sta_ht_cap wl18xx_siso20_ht_cap = {
 	.cap = IEEE80211_HT_CAP_SGI_20,
@@ -1345,12 +1359,12 @@ static int __devinit wl18xx_probe(struct platform_device *pdev)
 
 		/* 5Ghz is always wide */
 		wlcore_set_ht_cap(wl, IEEE80211_BAND_5GHZ,
-				  &wl18xx_siso40_ht_cap);
+				  &wl18xx_siso40_ht_cap_5ghz);
 	} else if (!strcmp(ht_mode_param, "wide")) {
 		wlcore_set_ht_cap(wl, IEEE80211_BAND_2GHZ,
-				  &wl18xx_siso40_ht_cap);
+				  &wl18xx_siso40_ht_cap_2ghz);
 		wlcore_set_ht_cap(wl, IEEE80211_BAND_5GHZ,
-				  &wl18xx_siso40_ht_cap);
+				  &wl18xx_siso40_ht_cap_5ghz);
 	} else if (!strcmp(ht_mode_param, "siso20")) {
 		wlcore_set_ht_cap(wl, IEEE80211_BAND_2GHZ,
 				  &wl18xx_siso20_ht_cap);
-- 
1.7.10


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH 12/12] wl18xx: use %zu for size_t arguments in printk calls
  2012-06-21 14:12 [PATCH 00/12] wlcore/wl18xx: patches for 3.6 Luciano Coelho
                   ` (10 preceding siblings ...)
  2012-06-21 14:13 ` [PATCH 11/12] wl18xx: split siso40 HT cap between 2Ghz and 5Ghz Luciano Coelho
@ 2012-06-21 14:13 ` Luciano Coelho
  2012-06-21 18:58 ` [PATCH 00/12] wlcore/wl18xx: patches for 3.6 Luciano Coelho
  12 siblings, 0 replies; 16+ messages in thread
From: Luciano Coelho @ 2012-06-21 14:13 UTC (permalink / raw)
  To: linux-wireless; +Cc: coelho, arik

After 934b9d1e (wl18xx: avoid some -Wformat warnings) there was still
a warning with (at least) ARM gcc version 4.4.1:

drivers/net/wireless/ti/wl18xx/main.c: In function 'wl18xx_conf_init':
drivers/net/wireless/ti/wl18xx/main.c:1026: warning: format '%ld' expects type 'long int', but argument 2 has type 'unsigned int'

Fix this by using %zu for the both formats, since the fw->size and the
macro (derived from sizeof()) are size_t.

Signed-off-by: Luciano Coelho <coelho@ti.com>
---
 drivers/net/wireless/ti/wl18xx/main.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/ti/wl18xx/main.c b/drivers/net/wireless/ti/wl18xx/main.c
index 2c0f51b..271ff81 100644
--- a/drivers/net/wireless/ti/wl18xx/main.c
+++ b/drivers/net/wireless/ti/wl18xx/main.c
@@ -1023,8 +1023,8 @@ static int wl18xx_conf_init(struct wl1271 *wl, struct device *dev)
 	}
 
 	if (fw->size != WL18XX_CONF_SIZE) {
-		wl1271_error("configuration binary file size is wrong, "
-			     "expected %d got %d", WL18XX_CONF_SIZE, fw->size);
+		wl1271_error("configuration binary file size is wrong, expected %zu got %zu",
+			     WL18XX_CONF_SIZE, fw->size);
 		ret = -EINVAL;
 		goto out;
 	}
-- 
1.7.10


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [PATCH 07/12] wlcore: do not report noise level in get survey op
  2012-06-21 14:13 ` [PATCH 07/12] wlcore: do not report noise level in get survey op Luciano Coelho
@ 2012-06-21 14:24   ` Luciano Coelho
  0 siblings, 0 replies; 16+ messages in thread
From: Luciano Coelho @ 2012-06-21 14:24 UTC (permalink / raw)
  To: yoni.divinsky; +Cc: arik, linux-wireless

Sorry, forgot to include Yoni as CC on this one.

On Thu, 2012-06-21 at 17:13 +0300, Luciano Coelho wrote:
> From: Yoni Divinsky <yoni.divinsky@ti.com>
> 
> The get survey op expects the low level driver to report
> the noise level for a a given channel.
> 
> The noise calculated in wlcore is (rssi-snr/2), but since
> the snr reported by the FW is a derivative from the rssi
> this calculation is useless, and should not be reported
> to the user space.
> 
> Reporting incorrect noise, results in the wpa_supplicant
> miscalculating the roaming candidate priority, thus causing
> a situation where an AP with a lower rssi level would be
> chosen over a better AP.
> 
> Signed-off-by: Yoni Divinsky <yoni.divinsky@ti.com>
> Signed-off-by: Luciano Coelho <coelho@ti.com>
> ---
>  drivers/net/wireless/ti/wlcore/main.c |    5 +----
>  1 file changed, 1 insertion(+), 4 deletions(-)
> 
> diff --git a/drivers/net/wireless/ti/wlcore/main.c b/drivers/net/wireless/ti/wlcore/main.c
> index 3279a94..a7c5e32 100644
> --- a/drivers/net/wireless/ti/wlcore/main.c
> +++ b/drivers/net/wireless/ti/wlcore/main.c
> @@ -4108,16 +4108,13 @@ out:
>  static int wl1271_op_get_survey(struct ieee80211_hw *hw, int idx,
>  				struct survey_info *survey)
>  {
> -	struct wl1271 *wl = hw->priv;
>  	struct ieee80211_conf *conf = &hw->conf;
>  
>  	if (idx != 0)
>  		return -ENOENT;
>  
>  	survey->channel = conf->channel;
> -	survey->filled = SURVEY_INFO_NOISE_DBM;
> -	survey->noise = wl->noise;
> -
> +	survey->filled = 0;
>  	return 0;
>  }
>  



^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 08/12] wlcore: read FW logs from FW memory on watchdog recovery
  2012-06-21 14:13 ` [PATCH 08/12] wlcore: read FW logs from FW memory on watchdog recovery Luciano Coelho
@ 2012-06-21 14:24   ` Luciano Coelho
  0 siblings, 0 replies; 16+ messages in thread
From: Luciano Coelho @ 2012-06-21 14:24 UTC (permalink / raw)
  To: igalc; +Cc: arik, linux-wireless

And Igal on this one...

On Thu, 2012-06-21 at 17:13 +0300, Luciano Coelho wrote:
> From: Igal Chernobelsky <igalc@ti.com>
> 
> FW uses a few memory blocks as a buffer to accumulate FW logs before
> transmitting them to the host over SDIO. When FW WatchDog recovery
> occurs, the last FW traces are still pending in the buffer. Driver is
> to read these FW traces whether log mode is continuous or on demand.
> 
> FW memory blocks allocated for the log buffer are handled as a link list:
> the first 4 bytes in each memory block contain FW address to the next block.
> The end of list condition depends on FW log mode:
> - on demand: the list is cyclic, the next address is equal to the first address
> - continuous: the address is  equal to 0x2000000
> 
> Log data resides inside FW memory block with offset depending on
> logger mode:
> - on demand:  4 bytes (address of the next memory block)
> - continuous: 4 bytes and Rx Descriptor structure size
> 
> Described FW logger API is backward compatible with previous FW versions.
> 
> Signed-off-by: Igal Chernobelsky <igalc@ti.com>
> Signed-off-by: Luciano Coelho <coelho@ti.com>
> ---
>  drivers/net/wireless/ti/wlcore/main.c |   34 +++++++++++++++++++++------------
>  1 file changed, 22 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/net/wireless/ti/wlcore/main.c b/drivers/net/wireless/ti/wlcore/main.c
> index a7c5e32..78edc58 100644
> --- a/drivers/net/wireless/ti/wlcore/main.c
> +++ b/drivers/net/wireless/ti/wlcore/main.c
> @@ -770,14 +770,16 @@ size_t wl12xx_copy_fwlog(struct wl1271 *wl, u8 *memblock, size_t maxlen)
>  	return len;
>  }
>  
> +#define WLCORE_FW_LOG_END 0x2000000
> +
>  static void wl12xx_read_fwlog_panic(struct wl1271 *wl)
>  {
>  	u32 addr;
> -	u32 first_addr;
> +	u32 offset;
> +	u32 end_of_log;
>  	u8 *block;
>  
>  	if ((wl->quirks & WLCORE_QUIRK_FWLOG_NOT_IMPLEMENTED) ||
> -	    (wl->conf.fwlog.mode != WL12XX_FWLOG_ON_DEMAND) ||
>  	    (wl->conf.fwlog.mem_blocks == 0))
>  		return;
>  
> @@ -791,19 +793,26 @@ static void wl12xx_read_fwlog_panic(struct wl1271 *wl)
>  	 * Make sure the chip is awake and the logger isn't active.
>  	 * Do not send a stop fwlog command if the fw is hanged.
>  	 */
> -	if (!wl1271_ps_elp_wakeup(wl) && !wl->watchdog_recovery)
> -		wl12xx_cmd_stop_fwlog(wl);
> -	else
> +	if (wl1271_ps_elp_wakeup(wl))
>  		goto out;
> +	if (!wl->watchdog_recovery)
> +		wl12xx_cmd_stop_fwlog(wl);
>  
>  	/* Read the first memory block address */
>  	wl12xx_fw_status(wl, wl->fw_status_1, wl->fw_status_2);
> -	first_addr = le32_to_cpu(wl->fw_status_2->log_start_addr);
> -	if (!first_addr)
> +	addr = le32_to_cpu(wl->fw_status_2->log_start_addr);
> +	if (!addr)
>  		goto out;
>  
> +	if (wl->conf.fwlog.mode == WL12XX_FWLOG_CONTINUOUS) {
> +		offset = sizeof(addr) + sizeof(struct wl1271_rx_descriptor);
> +		end_of_log = WLCORE_FW_LOG_END;
> +	} else {
> +		offset = sizeof(addr);
> +		end_of_log = addr;
> +	}
> +
>  	/* Traverse the memory blocks linked list */
> -	addr = first_addr;
>  	do {
>  		memset(block, 0, WL12XX_HW_BLOCK_SIZE);
>  		wl1271_read_hwaddr(wl, addr, block, WL12XX_HW_BLOCK_SIZE,
> @@ -812,13 +821,14 @@ static void wl12xx_read_fwlog_panic(struct wl1271 *wl)
>  		/*
>  		 * Memory blocks are linked to one another. The first 4 bytes
>  		 * of each memory block hold the hardware address of the next
> -		 * one. The last memory block points to the first one.
> +		 * one. The last memory block points to the first one in
> +		 * on demand mode and is equal to 0x2000000 in continuous mode.
>  		 */
>  		addr = le32_to_cpup((__le32 *)block);
> -		if (!wl12xx_copy_fwlog(wl, block + sizeof(addr),
> -				       WL12XX_HW_BLOCK_SIZE - sizeof(addr)))
> +		if (!wl12xx_copy_fwlog(wl, block + offset,
> +				       WL12XX_HW_BLOCK_SIZE - offset))
>  			break;
> -	} while (addr && (addr != first_addr));
> +	} while (addr && (addr != end_of_log));
>  
>  	wake_up_interruptible(&wl->fwlog_waitq);
>  



^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 00/12] wlcore/wl18xx: patches for 3.6
  2012-06-21 14:12 [PATCH 00/12] wlcore/wl18xx: patches for 3.6 Luciano Coelho
                   ` (11 preceding siblings ...)
  2012-06-21 14:13 ` [PATCH 12/12] wl18xx: use %zu for size_t arguments in printk calls Luciano Coelho
@ 2012-06-21 18:58 ` Luciano Coelho
  12 siblings, 0 replies; 16+ messages in thread
From: Luciano Coelho @ 2012-06-21 18:58 UTC (permalink / raw)
  To: linux-wireless; +Cc: arik

On Thu, 2012-06-21 at 17:12 +0300, Luciano Coelho wrote:
> Hi,
> 
> Here are some patches for 3.6.  Just a few bugfixes and improvements
> here and there, nothing really major.
> 
> I'll push this into my tree soon, unless I get some comments pretty
> soon. :)

Pushed.

--
Luca.


^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2012-06-21 18:58 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-06-21 14:12 [PATCH 00/12] wlcore/wl18xx: patches for 3.6 Luciano Coelho
2012-06-21 14:13 ` [PATCH 01/12] wlcore: suppress error message on Rx BA session removal Luciano Coelho
2012-06-21 14:13 ` [PATCH 02/12] wlcore: add a debugfs entry to allow changing the sleep mode by hand Luciano Coelho
2012-06-21 14:13 ` [PATCH 03/12] wlcore: allow setting sleep_auth before interface init Luciano Coelho
2012-06-21 14:13 ` [PATCH 04/12] wlcore: reconfigure sleep_auth when removing interfaces Luciano Coelho
2012-06-21 14:13 ` [PATCH 05/12] wl18xx: increase Rx descriptors for PG2 Luciano Coelho
2012-06-21 14:13 ` [PATCH 06/12] wl18xx: set Tx align quirk " Luciano Coelho
2012-06-21 14:13 ` [PATCH 07/12] wlcore: do not report noise level in get survey op Luciano Coelho
2012-06-21 14:24   ` Luciano Coelho
2012-06-21 14:13 ` [PATCH 08/12] wlcore: read FW logs from FW memory on watchdog recovery Luciano Coelho
2012-06-21 14:24   ` Luciano Coelho
2012-06-21 14:13 ` [PATCH 09/12] wl18xx: explicitly remove the 5Ghz MIMO HT cap Luciano Coelho
2012-06-21 14:13 ` [PATCH 10/12] wl18xx: sane defaults for HT capabilities Luciano Coelho
2012-06-21 14:13 ` [PATCH 11/12] wl18xx: split siso40 HT cap between 2Ghz and 5Ghz Luciano Coelho
2012-06-21 14:13 ` [PATCH 12/12] wl18xx: use %zu for size_t arguments in printk calls Luciano Coelho
2012-06-21 18:58 ` [PATCH 00/12] wlcore/wl18xx: patches for 3.6 Luciano Coelho

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.