* Re: [ath9k-devel] [RFC 5/6] ath9k: enable DFS pulse detection
From: Adrian Chadd @ 2011-10-07 11:43 UTC (permalink / raw)
To: Zefir Kurtisi
Cc: Luis R. Rodriguez, Christian Lamparter, kgiori, ath9k-devel,
linux-wireless
In-Reply-To: <4E8EBCEB.80705@neratec.com>
On 7 October 2011 16:48, Zefir Kurtisi <zefir.kurtisi@neratec.com> wrote:
> Quite some work ahead. Good luck on that!
Thanks!
> So you are confident to get existing code re-factored and split into multiple layers?
Thankfully, it's already done and in net80211. :)
Adrian
^ permalink raw reply
* [PATCH 2/2] wl12xx: spi: use dev_err instead of wl1271_error
From: Luciano Coelho @ 2011-10-07 11:34 UTC (permalink / raw)
To: linux-wireless; +Cc: coelho
In-Reply-To: <1317987297-18172-1-git-send-email-coelho@ti.com>
To prevent a useless dependency between the spi module and the wl12xx
module, we need to replace the wl1271_error macros with dev_err.
At the same time, remove the SPI data hexdump, since this produces way
too much data and is not particularly useful. There's no
print_hex_dump() equivalent for dynamic debug, so it's hard to control
when the dumps are printed out.
Signed-off-by: Luciano Coelho <coelho@ti.com>
---
drivers/net/wireless/wl12xx/spi.c | 31 ++++++++++++-------------------
1 files changed, 12 insertions(+), 19 deletions(-)
diff --git a/drivers/net/wireless/wl12xx/spi.c b/drivers/net/wireless/wl12xx/spi.c
index bcc7d7c..976d3d5 100644
--- a/drivers/net/wireless/wl12xx/spi.c
+++ b/drivers/net/wireless/wl12xx/spi.c
@@ -31,7 +31,6 @@
#include <linux/slab.h>
#include "wl12xx.h"
-#include "debug.h"
#include "wl12xx_80211.h"
#include "io.h"
@@ -85,7 +84,8 @@ static void wl12xx_spi_reset(struct device *child)
cmd = kzalloc(WSPI_INIT_CMD_LEN, GFP_KERNEL);
if (!cmd) {
- wl1271_error("could not allocate cmd for spi reset");
+ dev_err(child->parent,
+ "could not allocate cmd for spi reset\n");
return;
}
@@ -100,7 +100,6 @@ static void wl12xx_spi_reset(struct device *child)
spi_sync(to_spi_device(glue->dev), &m);
- wl1271_dump(DEBUG_SPI, "spi reset -> ", cmd, WSPI_INIT_CMD_LEN);
kfree(cmd);
}
@@ -113,7 +112,8 @@ static void wl12xx_spi_init(struct device *child)
cmd = kzalloc(WSPI_INIT_CMD_LEN, GFP_KERNEL);
if (!cmd) {
- wl1271_error("could not allocate cmd for spi init");
+ dev_err(child->parent,
+ "could not allocate cmd for spi init\n");
return;
}
@@ -155,7 +155,6 @@ static void wl12xx_spi_init(struct device *child)
spi_message_add_tail(&t, &m);
spi_sync(to_spi_device(glue->dev), &m);
- wl1271_dump(DEBUG_SPI, "spi init -> ", cmd, WSPI_INIT_CMD_LEN);
kfree(cmd);
}
@@ -192,7 +191,7 @@ static int wl12xx_spi_read_busy(struct device *child)
}
/* The SPI bus is unresponsive, the read failed. */
- wl1271_error("SPI read busy-word timeout!\n");
+ dev_err(child->parent, "SPI read busy-word timeout!\n");
return -ETIMEDOUT;
}
@@ -254,9 +253,6 @@ static void wl12xx_spi_raw_read(struct device *child, int addr, void *buf,
spi_sync(to_spi_device(glue->dev), &m);
- wl1271_dump(DEBUG_SPI, "spi_read cmd -> ", cmd, sizeof(*cmd));
- wl1271_dump(DEBUG_SPI, "spi_read buf <- ", buf, chunk_len);
-
if (!fixed)
addr += chunk_len;
buf += chunk_len;
@@ -302,9 +298,6 @@ static void wl12xx_spi_raw_write(struct device *child, int addr, void *buf,
t[i].len = chunk_len;
spi_message_add_tail(&t[i++], &m);
- wl1271_dump(DEBUG_SPI, "spi_write cmd -> ", cmd, sizeof(*cmd));
- wl1271_dump(DEBUG_SPI, "spi_write buf -> ", buf, chunk_len);
-
if (!fixed)
addr += chunk_len;
buf += chunk_len;
@@ -332,7 +325,7 @@ static int __devinit wl1271_probe(struct spi_device *spi)
pdata = spi->dev.platform_data;
if (!pdata) {
- wl1271_error("no platform data");
+ dev_err(&spi->dev, "no platform data\n");
return -ENODEV;
}
@@ -340,7 +333,7 @@ static int __devinit wl1271_probe(struct spi_device *spi)
glue = kzalloc(sizeof(*glue), GFP_KERNEL);
if (!glue) {
- wl1271_error("can't allocate glue");
+ dev_err(&spi->dev, "can't allocate glue\n");
goto out;
}
@@ -354,13 +347,13 @@ static int __devinit wl1271_probe(struct spi_device *spi)
ret = spi_setup(spi);
if (ret < 0) {
- wl1271_error("spi_setup failed");
+ dev_err(glue->dev, "spi_setup failed\n");
goto out_free_glue;
}
glue->core = platform_device_alloc("wl12xx-spi", -1);
if (!glue->core) {
- wl1271_error("can't allocate platform_device");
+ dev_err(glue->dev, "can't allocate platform_device\n");
ret = -ENOMEM;
goto out_free_glue;
}
@@ -375,19 +368,19 @@ static int __devinit wl1271_probe(struct spi_device *spi)
ret = platform_device_add_resources(glue->core, res, ARRAY_SIZE(res));
if (ret) {
- wl1271_error("can't add resources");
+ dev_err(glue->dev, "can't add resources\n");
goto out_dev_put;
}
ret = platform_device_add_data(glue->core, pdata, sizeof(*pdata));
if (ret) {
- wl1271_error("can't add platform data");
+ dev_err(glue->dev, "can't add platform data\n");
goto out_dev_put;
}
ret = platform_device_add(glue->core);
if (ret) {
- wl1271_error("can't register platform device");
+ dev_err(glue->dev, "can't register platform device\n");
goto out_dev_put;
}
--
1.7.1
^ permalink raw reply related
* [PATCH 1/2] wl12xx: sdio: use dev_dbg instead of wl1271_debug
From: Luciano Coelho @ 2011-10-07 11:34 UTC (permalink / raw)
To: linux-wireless; +Cc: coelho
To prevent a useless dependency between the sdio module and the wl12xx
module, we need to replace the wl1271_debug macros (and friends) for
dev_dbg and other equivalents.
At the same time, remove the SDIO data hexdump, since this produces
way too much data and is not particularly useful. There's not
print_hex_dump() equivalent for dynamic debug, so it's hard to control
when the dumps are printed out.
Signed-off-by: Luciano Coelho <coelho@ti.com>
---
drivers/net/wireless/wl12xx/sdio.c | 47 ++++++++++++++++-------------------
1 files changed, 22 insertions(+), 25 deletions(-)
diff --git a/drivers/net/wireless/wl12xx/sdio.c b/drivers/net/wireless/wl12xx/sdio.c
index 55c63ad..50fdd9b 100644
--- a/drivers/net/wireless/wl12xx/sdio.c
+++ b/drivers/net/wireless/wl12xx/sdio.c
@@ -34,7 +34,6 @@
#include <linux/pm_runtime.h>
#include "wl12xx.h"
-#include "debug.h"
#include "wl12xx_80211.h"
#include "io.h"
@@ -77,21 +76,20 @@ static void wl12xx_sdio_raw_read(struct device *child, int addr, void *buf,
if (unlikely(addr == HW_ACCESS_ELP_CTRL_REG_ADDR)) {
((u8 *)buf)[0] = sdio_f0_readb(func, addr, &ret);
- wl1271_debug(DEBUG_SDIO, "sdio read 52 addr 0x%x, byte 0x%02x",
- addr, ((u8 *)buf)[0]);
+ dev_dbg(child->parent, "sdio read 52 addr 0x%x, byte 0x%02x\n",
+ addr, ((u8 *)buf)[0]);
} else {
if (fixed)
ret = sdio_readsb(func, buf, addr, len);
else
ret = sdio_memcpy_fromio(func, buf, addr, len);
- wl1271_debug(DEBUG_SDIO, "sdio read 53 addr 0x%x, %zu bytes",
- addr, len);
- wl1271_dump_ascii(DEBUG_SDIO, "data: ", buf, len);
+ dev_dbg(child->parent, "sdio read 53 addr 0x%x, %zu bytes\n",
+ addr, len);
}
if (ret)
- wl1271_error("sdio read failed (%d)", ret);
+ dev_err(child->parent, "sdio read failed (%d)\n", ret);
}
static void wl12xx_sdio_raw_write(struct device *child, int addr, void *buf,
@@ -103,12 +101,11 @@ static void wl12xx_sdio_raw_write(struct device *child, int addr, void *buf,
if (unlikely(addr == HW_ACCESS_ELP_CTRL_REG_ADDR)) {
sdio_f0_writeb(func, ((u8 *)buf)[0], addr, &ret);
- wl1271_debug(DEBUG_SDIO, "sdio write 52 addr 0x%x, byte 0x%02x",
- addr, ((u8 *)buf)[0]);
+ dev_dbg(child->parent, "sdio write 52 addr 0x%x, byte 0x%02x\n",
+ addr, ((u8 *)buf)[0]);
} else {
- wl1271_debug(DEBUG_SDIO, "sdio write 53 addr 0x%x, %zu bytes",
- addr, len);
- wl1271_dump_ascii(DEBUG_SDIO, "data: ", buf, len);
+ dev_dbg(child->parent, "sdio write 53 addr 0x%x, %zu bytes\n",
+ addr, len);
if (fixed)
ret = sdio_writesb(func, addr, buf, len);
@@ -117,7 +114,7 @@ static void wl12xx_sdio_raw_write(struct device *child, int addr, void *buf,
}
if (ret)
- wl1271_error("sdio write failed (%d)", ret);
+ dev_err(child->parent, "sdio write failed (%d)\n", ret);
}
static int wl12xx_sdio_power_on(struct wl12xx_sdio_glue *glue)
@@ -196,7 +193,7 @@ static int __devinit wl1271_probe(struct sdio_func *func,
glue = kzalloc(sizeof(*glue), GFP_KERNEL);
if (!glue) {
- wl1271_error("can't allocate glue");
+ dev_err(&func->dev, "can't allocate glue\n");
goto out;
}
@@ -211,13 +208,13 @@ static int __devinit wl1271_probe(struct sdio_func *func,
wlan_data = wl12xx_get_platform_data();
if (IS_ERR(wlan_data)) {
ret = PTR_ERR(wlan_data);
- wl1271_error("missing wlan platform data: %d", ret);
+ dev_err(glue->dev, "missing wlan platform data: %d\n", ret);
goto out_free_glue;
}
/* if sdio can keep power while host is suspended, enable wow */
mmcflags = sdio_get_host_pm_caps(func);
- wl1271_debug(DEBUG_SDIO, "sdio PM caps = 0x%x", mmcflags);
+ dev_dbg(glue->dev, "sdio PM caps = 0x%x\n", mmcflags);
if (mmcflags & MMC_PM_KEEP_POWER)
wlan_data->pwr_in_suspend = true;
@@ -231,7 +228,7 @@ static int __devinit wl1271_probe(struct sdio_func *func,
glue->core = platform_device_alloc("wl12xx-sdio", -1);
if (!glue->core) {
- wl1271_error("can't allocate platform_device");
+ dev_err(glue->dev, "can't allocate platform_device");
ret = -ENOMEM;
goto out_free_glue;
}
@@ -246,20 +243,20 @@ static int __devinit wl1271_probe(struct sdio_func *func,
ret = platform_device_add_resources(glue->core, res, ARRAY_SIZE(res));
if (ret) {
- wl1271_error("can't add resources");
+ dev_err(glue->dev, "can't add resources\n");
goto out_dev_put;
}
ret = platform_device_add_data(glue->core, wlan_data,
sizeof(*wlan_data));
if (ret) {
- wl1271_error("can't add platform data");
+ dev_err(glue->dev, "can't add platform data\n");
goto out_dev_put;
}
ret = platform_device_add(glue->core);
if (ret) {
- wl1271_error("can't add platform device");
+ dev_err(glue->dev, "can't add platform device\n");
goto out_dev_put;
}
return 0;
@@ -296,15 +293,15 @@ static int wl1271_suspend(struct device *dev)
mmc_pm_flag_t sdio_flags;
int ret = 0;
- wl1271_debug(DEBUG_MAC80211, "wl1271 suspend. wow_enabled: %d",
- wl->wow_enabled);
+ dev_dbg(dev, "wl1271 suspend. wow_enabled: %d\n",
+ wl->wow_enabled);
/* check whether sdio should keep power */
if (wl->wow_enabled) {
sdio_flags = sdio_get_host_pm_caps(func);
if (!(sdio_flags & MMC_PM_KEEP_POWER)) {
- wl1271_error("can't keep power while host "
+ dev_err(dev, "can't keep power while host \n"
"is suspended");
ret = -EINVAL;
goto out;
@@ -313,7 +310,7 @@ static int wl1271_suspend(struct device *dev)
/* keep power while host suspended */
ret = sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
if (ret) {
- wl1271_error("error while trying to keep power");
+ dev_err(dev, "error while trying to keep power\n");
goto out;
}
@@ -329,7 +326,7 @@ static int wl1271_resume(struct device *dev)
struct sdio_func *func = dev_to_sdio_func(dev);
struct wl1271 *wl = sdio_get_drvdata(func);
- wl1271_debug(DEBUG_MAC80211, "wl1271 resume");
+ dev_dbg(dev, "wl1271 resume\n");
if (wl->wow_enabled) {
/* claim back host */
sdio_claim_host(func);
--
1.7.1
^ permalink raw reply related
* [PATCH] mac80211: Update injection documentation
From: Helmut Schaa @ 2011-10-07 9:53 UTC (permalink / raw)
To: linux-wireless; +Cc: linville, johannes, Helmut Schaa
Add documentation about NOACK tx flag usage.
Signed-off-by: Helmut Schaa <helmut.schaa@googlemail.com>
---
Documentation/networking/mac80211-injection.txt | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/Documentation/networking/mac80211-injection.txt b/Documentation/networking/mac80211-injection.txt
index b30e81a..3a93007 100644
--- a/Documentation/networking/mac80211-injection.txt
+++ b/Documentation/networking/mac80211-injection.txt
@@ -23,6 +23,10 @@ radiotap headers and used to control injection:
IEEE80211_RADIOTAP_F_FRAG: frame will be fragmented if longer than the
current fragmentation threshold.
+ * IEEE80211_RADIOTAP_TX_FLAGS
+
+ IEEE80211_RADIOTAP_F_TX_NOACK: frame should be sent without waiting for
+ an ACK even if it is a unicast frame
The injection code can also skip all other currently defined radiotap fields
facilitating replay of captured radiotap headers directly.
--
1.7.3.4
^ permalink raw reply related
* Re: [PATCH] mac80211: Allow NO_ACK flag overwrite for injected frames
From: Helmut Schaa @ 2011-10-07 9:43 UTC (permalink / raw)
To: Johannes Berg; +Cc: linux-wireless, linville
In-Reply-To: <1317977814.3988.10.camel@jlt3.sipsolutions.net>
On Fri, Oct 7, 2011 at 10:56 AM, Johannes Berg
<johannes@sipsolutions.net> wrote:
> On Thu, 2011-09-29 at 11:27 +0200, Helmut Schaa wrote:
>
>> + case IEEE80211_RADIOTAP_TX_FLAGS:
>> + txflags = le16_to_cpu(get_unaligned((__le16*)
>> + iterator.this_arg));
>> + if (txflags & IEEE80211_RADIOTAP_F_TX_NOACK)
>> + info->flags |= IEEE80211_TX_CTL_NO_ACK;
>> + break;
>> +
>> /*
>> * Please update the file
>> * Documentation/networking/mac80211-injection.txt
>
> ... :-)
Oops. I'll send a followup ...
^ permalink raw reply
* Re: [PATCH] mac80211: Allow NO_ACK flag overwrite for injected frames
From: Johannes Berg @ 2011-10-07 8:56 UTC (permalink / raw)
To: Helmut Schaa; +Cc: linux-wireless, linville
In-Reply-To: <1317288432-26380-1-git-send-email-helmut.schaa@googlemail.com>
On Thu, 2011-09-29 at 11:27 +0200, Helmut Schaa wrote:
> + case IEEE80211_RADIOTAP_TX_FLAGS:
> + txflags = le16_to_cpu(get_unaligned((__le16*)
> + iterator.this_arg));
> + if (txflags & IEEE80211_RADIOTAP_F_TX_NOACK)
> + info->flags |= IEEE80211_TX_CTL_NO_ACK;
> + break;
> +
> /*
> * Please update the file
> * Documentation/networking/mac80211-injection.txt
... :-)
johannes
^ permalink raw reply
* Re: [ath9k-devel] [RFC 5/6] ath9k: enable DFS pulse detection
From: Zefir Kurtisi @ 2011-10-07 8:48 UTC (permalink / raw)
To: Adrian Chadd
Cc: Luis R. Rodriguez, Christian Lamparter, kgiori, ath9k-devel,
linux-wireless
In-Reply-To: <CAJ-VmonYaTW3xX7CKzU4Okb1nW86mJMV0RRDnqkMSJ-mASJ+4Q@mail.gmail.com>
On 10/07/2011 05:06 AM, Adrian Chadd wrote:
> Just FYI, that's what I'm likely to do for FreeBSD 10 (as I just don't
> have time to try and make all the required regulatory changes before
> the upcoming 9.0 release.)
>
> Ie:
>
> * DFS station mode (net80211) is going to be compiled and enabled by default;
> * DFS master mode (net80211) is going to be compiled and enabled by default;
> * The drivers which support radar detection in firmware (currently
> only if_mwl) will set the DFS net80211 flag (ie, for master mode radar
> detection);
> * ath won't ship with the DFS enable flag (for master mode);
> * I'll modify the regulatory database code to include per-band DFS
> information (DFS domain, CAC/NOL timeout, interference timeout, etc)
> and some device information (eg whether it supports HT20/HT40/etc DFS
> detection);
> * I'll then flip on the DFS channel enforcement in the net80211 code
> so disables master mode on channels requiring DFS.
>
> The radar detection code and channel interference code will live in
> the ath driver but the DFS machinery (CAC, NOL, CSA, etc) is in
> net80211. That way other NICs (eg if_mwl Marvell NICs) with DFS radar
> detection support can leverage this.
>
Quite some work ahead. Good luck on that!
So you are confident to get existing code re-factored and split into multiple layers?
> I'll then likely ship two DFS modules - dfs_null (no DFS support, just
> a placeholder for the API) and whatever code is ported from the
> reference driver. Maybe I'll also include the code from Neratec if
> it's dual-licenced. But I won't include radar patterns by default -
> I'll include those on a documentation page which explains the how and
> why of regulatory domain stuff.
>
Initially we planned to have common pattern detectors in mac80211 to handle pulses reported by all drivers, but so far only TI is working on DFS -- with pattern matching done in firmware. So, no need yet for common detectors, we might end up going the other way around, i.e. taking your port and integrate in into ath9k -- if licensing allowed us to do.
> Once FreeBSD ships DFS radar detection code, I'll make sure it isn't
> compiled by default and even if enabled, it won't advertise DFS
> channel support unless a valid radar pattern and radar parameter
> configuration is loaded in. That way users won't inadvertently enable
> it without being compliant.
>
> Finally, I'm hoping to get all of this documented as much as possible
> so the community can pick this stuff up and run with it. I was hoping
> someone would throw me a 5ghz SDR (software defined radio) so I could
> prototype up some open source radar pulse generation code, just to
> lower the entry barrier to all of this.
>
Yeah, an AR9003 card used as cheap radar generator is on top of my wish list for DFS testing without our always otherwise occupied vector signal generator. But fur obvious reasons we wont get the required documentation for such unofficial hacks.
> HTH,
>
>
> Adrian
Thanks
Zefir
^ permalink raw reply
* [PATCH] wl12xx: move debugging definitions to a separate file
From: Luciano Coelho @ 2011-10-07 8:13 UTC (permalink / raw)
To: linux-wireless; +Cc: coelho
Separate the debugging macros and other definitions to a new debug.h
file. This is be needed because the sdio and spi modules don't need
to depend on the wl12xx module anymore, but still need to include
wl12xx.h. Currently they do depend on it, because of the debugging
global that wl12xx exports. A future patch will remove this
dependency.
Signed-off-by: Luciano Coelho <coelho@ti.com>
---
drivers/net/wireless/wl12xx/acx.c | 1 +
drivers/net/wireless/wl12xx/boot.c | 1 +
drivers/net/wireless/wl12xx/cmd.c | 1 +
drivers/net/wireless/wl12xx/debug.h | 98 ++++++++++++++++++++++++++++++++
drivers/net/wireless/wl12xx/debugfs.c | 1 +
drivers/net/wireless/wl12xx/event.c | 1 +
drivers/net/wireless/wl12xx/init.c | 1 +
drivers/net/wireless/wl12xx/io.c | 1 +
drivers/net/wireless/wl12xx/main.c | 1 +
drivers/net/wireless/wl12xx/ps.c | 1 +
drivers/net/wireless/wl12xx/rx.c | 1 +
drivers/net/wireless/wl12xx/scan.c | 1 +
drivers/net/wireless/wl12xx/sdio.c | 1 +
drivers/net/wireless/wl12xx/spi.c | 1 +
drivers/net/wireless/wl12xx/testmode.c | 1 +
drivers/net/wireless/wl12xx/tx.c | 1 +
drivers/net/wireless/wl12xx/wl12xx.h | 67 ----------------------
17 files changed, 113 insertions(+), 67 deletions(-)
create mode 100644 drivers/net/wireless/wl12xx/debug.h
diff --git a/drivers/net/wireless/wl12xx/acx.c b/drivers/net/wireless/wl12xx/acx.c
index 5b70cc1..6229c2b 100644
--- a/drivers/net/wireless/wl12xx/acx.c
+++ b/drivers/net/wireless/wl12xx/acx.c
@@ -29,6 +29,7 @@
#include <linux/slab.h>
#include "wl12xx.h"
+#include "debug.h"
#include "wl12xx_80211.h"
#include "reg.h"
#include "ps.h"
diff --git a/drivers/net/wireless/wl12xx/boot.c b/drivers/net/wireless/wl12xx/boot.c
index d4e628d..4ce634b 100644
--- a/drivers/net/wireless/wl12xx/boot.c
+++ b/drivers/net/wireless/wl12xx/boot.c
@@ -24,6 +24,7 @@
#include <linux/slab.h>
#include <linux/wl12xx.h>
+#include "debug.h"
#include "acx.h"
#include "reg.h"
#include "boot.h"
diff --git a/drivers/net/wireless/wl12xx/cmd.c b/drivers/net/wireless/wl12xx/cmd.c
index 102a8a5..674516d 100644
--- a/drivers/net/wireless/wl12xx/cmd.c
+++ b/drivers/net/wireless/wl12xx/cmd.c
@@ -29,6 +29,7 @@
#include <linux/slab.h>
#include "wl12xx.h"
+#include "debug.h"
#include "reg.h"
#include "io.h"
#include "acx.h"
diff --git a/drivers/net/wireless/wl12xx/debug.h b/drivers/net/wireless/wl12xx/debug.h
new file mode 100644
index 0000000..f0afe4a
--- /dev/null
+++ b/drivers/net/wireless/wl12xx/debug.h
@@ -0,0 +1,98 @@
+/*
+ * This file is part of wl12xx
+ *
+ * Copyright (C) 2011 Texas Instruments. All rights reserved.
+ * Copyright (C) 2008-2009 Nokia Corporation
+ *
+ * Contact: Luciano Coelho <coelho@ti.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ *
+ */
+
+#ifndef __DEBUG_H__
+#define __DEBUG_H__
+
+#include <linux/bitops.h>
+#include <linux/printk.h>
+
+enum {
+ DEBUG_NONE = 0,
+ DEBUG_IRQ = BIT(0),
+ DEBUG_SPI = BIT(1),
+ DEBUG_BOOT = BIT(2),
+ DEBUG_MAILBOX = BIT(3),
+ DEBUG_TESTMODE = BIT(4),
+ DEBUG_EVENT = BIT(5),
+ DEBUG_TX = BIT(6),
+ DEBUG_RX = BIT(7),
+ DEBUG_SCAN = BIT(8),
+ DEBUG_CRYPT = BIT(9),
+ DEBUG_PSM = BIT(10),
+ DEBUG_MAC80211 = BIT(11),
+ DEBUG_CMD = BIT(12),
+ DEBUG_ACX = BIT(13),
+ DEBUG_SDIO = BIT(14),
+ DEBUG_FILTERS = BIT(15),
+ DEBUG_ADHOC = BIT(16),
+ DEBUG_AP = BIT(17),
+ DEBUG_MASTER = (DEBUG_ADHOC | DEBUG_AP),
+ DEBUG_ALL = ~0,
+};
+
+extern u32 wl12xx_debug_level;
+
+#define DEBUG_DUMP_LIMIT 1024
+
+#define wl1271_error(fmt, arg...) \
+ pr_err(DRIVER_PREFIX "ERROR " fmt "\n", ##arg)
+
+#define wl1271_warning(fmt, arg...) \
+ pr_warning(DRIVER_PREFIX "WARNING " fmt "\n", ##arg)
+
+#define wl1271_notice(fmt, arg...) \
+ pr_info(DRIVER_PREFIX fmt "\n", ##arg)
+
+#define wl1271_info(fmt, arg...) \
+ pr_info(DRIVER_PREFIX fmt "\n", ##arg)
+
+#define wl1271_debug(level, fmt, arg...) \
+ do { \
+ if (level & wl12xx_debug_level) \
+ pr_debug(DRIVER_PREFIX fmt "\n", ##arg); \
+ } while (0)
+
+/* TODO: use pr_debug_hex_dump when it becomes available */
+#define wl1271_dump(level, prefix, buf, len) \
+ do { \
+ if (level & wl12xx_debug_level) \
+ print_hex_dump(KERN_DEBUG, DRIVER_PREFIX prefix, \
+ DUMP_PREFIX_OFFSET, 16, 1, \
+ buf, \
+ min_t(size_t, len, DEBUG_DUMP_LIMIT), \
+ 0); \
+ } while (0)
+
+#define wl1271_dump_ascii(level, prefix, buf, len) \
+ do { \
+ if (level & wl12xx_debug_level) \
+ print_hex_dump(KERN_DEBUG, DRIVER_PREFIX prefix, \
+ DUMP_PREFIX_OFFSET, 16, 1, \
+ buf, \
+ min_t(size_t, len, DEBUG_DUMP_LIMIT), \
+ true); \
+ } while (0)
+
+#endif /* __DEBUG_H__ */
diff --git a/drivers/net/wireless/wl12xx/debugfs.c b/drivers/net/wireless/wl12xx/debugfs.c
index f0398d0..50216cd 100644
--- a/drivers/net/wireless/wl12xx/debugfs.c
+++ b/drivers/net/wireless/wl12xx/debugfs.c
@@ -27,6 +27,7 @@
#include <linux/slab.h>
#include "wl12xx.h"
+#include "debug.h"
#include "acx.h"
#include "ps.h"
#include "io.h"
diff --git a/drivers/net/wireless/wl12xx/event.c b/drivers/net/wireless/wl12xx/event.c
index 486c8ee..6947fd0 100644
--- a/drivers/net/wireless/wl12xx/event.c
+++ b/drivers/net/wireless/wl12xx/event.c
@@ -22,6 +22,7 @@
*/
#include "wl12xx.h"
+#include "debug.h"
#include "reg.h"
#include "io.h"
#include "event.h"
diff --git a/drivers/net/wireless/wl12xx/init.c b/drivers/net/wireless/wl12xx/init.c
index 80e89e3..977de9d 100644
--- a/drivers/net/wireless/wl12xx/init.c
+++ b/drivers/net/wireless/wl12xx/init.c
@@ -25,6 +25,7 @@
#include <linux/module.h>
#include <linux/slab.h>
+#include "debug.h"
#include "init.h"
#include "wl12xx_80211.h"
#include "acx.h"
diff --git a/drivers/net/wireless/wl12xx/io.c b/drivers/net/wireless/wl12xx/io.c
index 1a7df8a..079ad38 100644
--- a/drivers/net/wireless/wl12xx/io.c
+++ b/drivers/net/wireless/wl12xx/io.c
@@ -27,6 +27,7 @@
#include <linux/interrupt.h>
#include "wl12xx.h"
+#include "debug.h"
#include "wl12xx_80211.h"
#include "io.h"
#include "tx.h"
diff --git a/drivers/net/wireless/wl12xx/main.c b/drivers/net/wireless/wl12xx/main.c
index 63ff36c..320d1f4 100644
--- a/drivers/net/wireless/wl12xx/main.c
+++ b/drivers/net/wireless/wl12xx/main.c
@@ -35,6 +35,7 @@
#include <linux/interrupt.h>
#include "wl12xx.h"
+#include "debug.h"
#include "wl12xx_80211.h"
#include "reg.h"
#include "io.h"
diff --git a/drivers/net/wireless/wl12xx/ps.c b/drivers/net/wireless/wl12xx/ps.c
index ac3f207..f75941d 100644
--- a/drivers/net/wireless/wl12xx/ps.c
+++ b/drivers/net/wireless/wl12xx/ps.c
@@ -25,6 +25,7 @@
#include "ps.h"
#include "io.h"
#include "tx.h"
+#include "debug.h"
#define WL1271_WAKEUP_TIMEOUT 500
diff --git a/drivers/net/wireless/wl12xx/rx.c b/drivers/net/wireless/wl12xx/rx.c
index 9cfa0b2..b3bc0d5 100644
--- a/drivers/net/wireless/wl12xx/rx.c
+++ b/drivers/net/wireless/wl12xx/rx.c
@@ -25,6 +25,7 @@
#include <linux/sched.h>
#include "wl12xx.h"
+#include "debug.h"
#include "acx.h"
#include "reg.h"
#include "rx.h"
diff --git a/drivers/net/wireless/wl12xx/scan.c b/drivers/net/wireless/wl12xx/scan.c
index 9372136..9006388 100644
--- a/drivers/net/wireless/wl12xx/scan.c
+++ b/drivers/net/wireless/wl12xx/scan.c
@@ -24,6 +24,7 @@
#include <linux/ieee80211.h>
#include "wl12xx.h"
+#include "debug.h"
#include "cmd.h"
#include "scan.h"
#include "acx.h"
diff --git a/drivers/net/wireless/wl12xx/sdio.c b/drivers/net/wireless/wl12xx/sdio.c
index 0374bcd..419f014 100644
--- a/drivers/net/wireless/wl12xx/sdio.c
+++ b/drivers/net/wireless/wl12xx/sdio.c
@@ -34,6 +34,7 @@
#include <linux/pm_runtime.h>
#include "wl12xx.h"
+#include "debug.h"
#include "wl12xx_80211.h"
#include "io.h"
diff --git a/drivers/net/wireless/wl12xx/spi.c b/drivers/net/wireless/wl12xx/spi.c
index 22c1337..bcc7d7c 100644
--- a/drivers/net/wireless/wl12xx/spi.c
+++ b/drivers/net/wireless/wl12xx/spi.c
@@ -31,6 +31,7 @@
#include <linux/slab.h>
#include "wl12xx.h"
+#include "debug.h"
#include "wl12xx_80211.h"
#include "io.h"
diff --git a/drivers/net/wireless/wl12xx/testmode.c b/drivers/net/wireless/wl12xx/testmode.c
index 4ae8eff..61fff45 100644
--- a/drivers/net/wireless/wl12xx/testmode.c
+++ b/drivers/net/wireless/wl12xx/testmode.c
@@ -26,6 +26,7 @@
#include <net/genetlink.h>
#include "wl12xx.h"
+#include "debug.h"
#include "acx.h"
#include "reg.h"
diff --git a/drivers/net/wireless/wl12xx/tx.c b/drivers/net/wireless/wl12xx/tx.c
index 1b3d8e3..31dda0e 100644
--- a/drivers/net/wireless/wl12xx/tx.c
+++ b/drivers/net/wireless/wl12xx/tx.c
@@ -26,6 +26,7 @@
#include <linux/etherdevice.h>
#include "wl12xx.h"
+#include "debug.h"
#include "io.h"
#include "reg.h"
#include "ps.h"
diff --git a/drivers/net/wireless/wl12xx/wl12xx.h b/drivers/net/wireless/wl12xx/wl12xx.h
index bd58f50..7449752 100644
--- a/drivers/net/wireless/wl12xx/wl12xx.h
+++ b/drivers/net/wireless/wl12xx/wl12xx.h
@@ -45,73 +45,6 @@
#define WL12XX_BA_SUPPORT_FW_COST_VER2_START 50
#define WL12XX_BA_SUPPORT_FW_COST_VER2_END 60
-enum {
- DEBUG_NONE = 0,
- DEBUG_IRQ = BIT(0),
- DEBUG_SPI = BIT(1),
- DEBUG_BOOT = BIT(2),
- DEBUG_MAILBOX = BIT(3),
- DEBUG_TESTMODE = BIT(4),
- DEBUG_EVENT = BIT(5),
- DEBUG_TX = BIT(6),
- DEBUG_RX = BIT(7),
- DEBUG_SCAN = BIT(8),
- DEBUG_CRYPT = BIT(9),
- DEBUG_PSM = BIT(10),
- DEBUG_MAC80211 = BIT(11),
- DEBUG_CMD = BIT(12),
- DEBUG_ACX = BIT(13),
- DEBUG_SDIO = BIT(14),
- DEBUG_FILTERS = BIT(15),
- DEBUG_ADHOC = BIT(16),
- DEBUG_AP = BIT(17),
- DEBUG_MASTER = (DEBUG_ADHOC | DEBUG_AP),
- DEBUG_ALL = ~0,
-};
-
-extern u32 wl12xx_debug_level;
-
-#define DEBUG_DUMP_LIMIT 1024
-
-#define wl1271_error(fmt, arg...) \
- pr_err(DRIVER_PREFIX "ERROR " fmt "\n", ##arg)
-
-#define wl1271_warning(fmt, arg...) \
- pr_warning(DRIVER_PREFIX "WARNING " fmt "\n", ##arg)
-
-#define wl1271_notice(fmt, arg...) \
- pr_info(DRIVER_PREFIX fmt "\n", ##arg)
-
-#define wl1271_info(fmt, arg...) \
- pr_info(DRIVER_PREFIX fmt "\n", ##arg)
-
-#define wl1271_debug(level, fmt, arg...) \
- do { \
- if (level & wl12xx_debug_level) \
- pr_debug(DRIVER_PREFIX fmt "\n", ##arg); \
- } while (0)
-
-/* TODO: use pr_debug_hex_dump when it will be available */
-#define wl1271_dump(level, prefix, buf, len) \
- do { \
- if (level & wl12xx_debug_level) \
- print_hex_dump(KERN_DEBUG, DRIVER_PREFIX prefix, \
- DUMP_PREFIX_OFFSET, 16, 1, \
- buf, \
- min_t(size_t, len, DEBUG_DUMP_LIMIT), \
- 0); \
- } while (0)
-
-#define wl1271_dump_ascii(level, prefix, buf, len) \
- do { \
- if (level & wl12xx_debug_level) \
- print_hex_dump(KERN_DEBUG, DRIVER_PREFIX prefix, \
- DUMP_PREFIX_OFFSET, 16, 1, \
- buf, \
- min_t(size_t, len, DEBUG_DUMP_LIMIT), \
- true); \
- } while (0)
-
#define WL127X_FW_NAME "ti-connectivity/wl127x-fw-3.bin"
#define WL128X_FW_NAME "ti-connectivity/wl128x-fw-3.bin"
--
1.7.1
^ permalink raw reply related
* Re: [ath9k-devel] [RFC 5/6] ath9k: enable DFS pulse detection
From: Luis R. Rodriguez @ 2011-10-07 7:54 UTC (permalink / raw)
To: Adrian Chadd
Cc: Zefir Kurtisi, Christian Lamparter, kgiori, ath9k-devel,
linux-wireless
In-Reply-To: <CAJ-VmonYaTW3xX7CKzU4Okb1nW86mJMV0RRDnqkMSJ-mASJ+4Q@mail.gmail.com>
On Thu, Oct 6, 2011 at 8:06 PM, Adrian Chadd <adrian@freebsd.org> wrote:
> Just FYI, that's what I'm likely to do for FreeBSD 10 (as I just don't
> have time to try and make all the required regulatory changes before
> the upcoming 9.0 release.)
>
> Ie:
>
> * DFS station mode (net80211) is going to be compiled and enabled by default;
> * DFS master mode (net80211) is going to be compiled and enabled by default;
> * The drivers which support radar detection in firmware (currently
> only if_mwl) will set the DFS net80211 flag (ie, for master mode radar
> detection);
> * ath won't ship with the DFS enable flag (for master mode);
> * I'll modify the regulatory database code to include per-band DFS
> information (DFS domain, CAC/NOL timeout, interference timeout, etc)
> and some device information (eg whether it supports HT20/HT40/etc DFS
> detection);
> * I'll then flip on the DFS channel enforcement in the net80211 code
> so disables master mode on channels requiring DFS.
>
> The radar detection code and channel interference code will live in
> the ath driver but the DFS machinery (CAC, NOL, CSA, etc) is in
> net80211. That way other NICs (eg if_mwl Marvell NICs) with DFS radar
> detection support can leverage this.
>
> I'll then likely ship two DFS modules - dfs_null (no DFS support, just
> a placeholder for the API) and whatever code is ported from the
> reference driver. Maybe I'll also include the code from Neratec if
> it's dual-licenced. But I won't include radar patterns by default -
> I'll include those on a documentation page which explains the how and
> why of regulatory domain stuff.
>
> Once FreeBSD ships DFS radar detection code, I'll make sure it isn't
> compiled by default and even if enabled, it won't advertise DFS
> channel support unless a valid radar pattern and radar parameter
> configuration is loaded in. That way users won't inadvertently enable
> it without being compliant.
Neat, best of luck! FWIW, I've been moving along on the regulatory
simulator, feel free do send me patches in ways you want that to move
if that seems reasonable to you as place to share code between OSes,
that was at least my own goal, to help share as much test framework
and code to let us then cherry pick for our own OSes in whatever way
we want.
> Finally, I'm hoping to get all of this documented as much as possible
> so the community can pick this stuff up and run with it. I was hoping
> someone would throw me a 5ghz SDR (software defined radio) so I could
> prototype up some open source radar pulse generation code, just to
> lower the entry barrier to all of this.
You can use the Winlab Orbit GNU Radio SDRs, I think you can make a
reservation for them.
Luis
^ permalink raw reply
* Re: PATCH] mac80211: set no_cck also for hw_scan
From: Johannes Berg @ 2011-10-07 7:52 UTC (permalink / raw)
To: Janusz Dziedzic; +Cc: linux-wireless, Rajkumar Manoharan
In-Reply-To: <CAFED-jn_FCppQ_=ue-3xCS=v_fyj5+bKkV-do3beGGH9TxpTOA@mail.gmail.com>
On Fri, 2011-10-07 at 09:35 +0200, Janusz Dziedzic wrote:
> I have a small question also. How should/could I get latest
> compat-wireless with git history?
> git clone for compat-wireless.git from kernel.org seems not work yet??
>
> In case I have tar ball - eg. compat-wireless-3.0-2.tar.bz2 - how
> could I find latest commit for this release?
Err, do you want compat-wireless's git history, or the git history for
the kernel it's based on? For the former, Luis moved to github (search
the mailing list archive) for now. For the latter, that's just
linux-next and the tarball contains the commit ID it was built from.
johannes
^ permalink raw reply
* Re: [PATCH] mac80211: Fix regression that allowed mpaths between non-peers.
From: Johannes Berg @ 2011-10-07 7:50 UTC (permalink / raw)
To: Javier Cardona
Cc: John W. Linville, Thomas Pedersen, devel, linux-wireless, jlopex
In-Reply-To: <1317938062-1226-1-git-send-email-javier@cozybit.com>
On Thu, 2011-10-06 at 14:54 -0700, Javier Cardona wrote:
> Mesh paths should only exist over established peer links.
>
> Signed-off-by: Javier Cardona <javier@cozybit.com>
> ---
> net/mac80211/mesh_hwmp.c | 9 +++++++++
> 1 files changed, 9 insertions(+), 0 deletions(-)
>
> diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c
> index 6df7913..174040a 100644
> --- a/net/mac80211/mesh_hwmp.c
> +++ b/net/mac80211/mesh_hwmp.c
> @@ -789,11 +789,20 @@ void mesh_rx_path_sel_frame(struct ieee80211_sub_if_data *sdata,
> struct ieee802_11_elems elems;
> size_t baselen;
> u32 last_hop_metric;
> + struct sta_info *sta;
>
> /* need action_code */
> if (len < IEEE80211_MIN_ACTION_SIZE + 1)
> return;
>
> + rcu_read_lock();
> + sta = sta_info_get(sdata, mgmt->sa);
> + if (!sta || sta->plink_state != NL80211_PLINK_ESTAB) {
> + rcu_read_unlock();
> + return;
> + }
> + rcu_read_unlock();
> +
No real objections to this patch as I'm sure this is how it works, but I
do wonder ... if a mesh path (mesh_path_add right?) can only exist with
a nexthop peer, how is all this correct when their lifetime isn't tied
together? Yes, mesh_path is flushed when sta_info dies, but there can be
mesh_path w/o a next_hop. How can that be correct?
Or put another way: what guarantees that the sta you find above will be
assigned next_hop for the path? Couldn't it have been deleted by that
time since you don't hang on to the pointer here?
Or am I completely misunderstanding this?
johannes
^ permalink raw reply
* Re: PATCH] mac80211: set no_cck also for hw_scan
From: Janusz Dziedzic @ 2011-10-07 7:35 UTC (permalink / raw)
To: Johannes Berg; +Cc: linux-wireless, Rajkumar Manoharan
In-Reply-To: <1317971874.3988.0.camel@jlt3.sipsolutions.net>
2011/10/7 Johannes Berg <johannes@sipsolutions.net>:
> On Fri, 2011-10-07 at 08:56 +0200, Janusz Dziedzic wrote:
>> In case we are using hw_scan we should also
>> send no_cck information to lower layer.
>
>
> Missing Signed-off-by, but I already submitted a very similar patch a
> few days ago.
>
Thanks.
I have a small question also. How should/could I get latest
compat-wireless with git history?
git clone for compat-wireless.git from kernel.org seems not work yet??
In case I have tar ball - eg. compat-wireless-3.0-2.tar.bz2 - how
could I find latest commit for this release?
--
Janusz Dziedzic
^ permalink raw reply
* Re: PATCH] mac80211: set no_cck also for hw_scan
From: Johannes Berg @ 2011-10-07 7:17 UTC (permalink / raw)
To: Janusz Dziedzic; +Cc: linux-wireless, Rajkumar Manoharan
In-Reply-To: <CAFED-j=0-J_H0g3tZoDAX2q8VVFzYfs2n3im07vWkKC_wdh_bA@mail.gmail.com>
On Fri, 2011-10-07 at 08:56 +0200, Janusz Dziedzic wrote:
> In case we are using hw_scan we should also
> send no_cck information to lower layer.
Missing Signed-off-by, but I already submitted a very similar patch a
few days ago.
johannes
^ permalink raw reply
* PATCH] mac80211: set no_cck also for hw_scan
From: Janusz Dziedzic @ 2011-10-07 6:56 UTC (permalink / raw)
To: linux-wireless; +Cc: Rajkumar Manoharan
[-- Attachment #1: Type: text/plain, Size: 623 bytes --]
In case we are using hw_scan we should also
send no_cck information to lower layer.
---
net/mac80211/scan.c | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c
index 6f09eca..509d89e 100644
--- a/net/mac80211/scan.c
+++ b/net/mac80211/scan.c
@@ -249,6 +249,7 @@ static bool ieee80211_prep_hw_scan(struct
ieee80211_local *local)
} while (!n_chans);
local->hw_scan_req->n_channels = n_chans;
+ local->hw_scan_req->no_cck = req->no_cck;
ielen = ieee80211_build_preq_ies(local, (u8 *)local->hw_scan_req->ie,
req->ie, req->ie_len, band,
--
1.7.0.4
[-- Attachment #2: 0001-mac80211-set-no_cck-also-for-hw_scan.patch --]
[-- Type: application/octet-stream, Size: 840 bytes --]
From a74c41d3ba5c5a0555dfd07391c32d91071c2a17 Mon Sep 17 00:00:00 2001
From: Janusz Dziedzic <janusz.dziedzic@tieto.com>
Date: Fri, 7 Oct 2011 08:48:47 +0200
Subject: [PATCH] mac80211: set no_cck also for hw_scan
In case we are using hw_scan we should also
send no_cck information to lower layer.
---
net/mac80211/scan.c | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c
index 6f09eca..509d89e 100644
--- a/net/mac80211/scan.c
+++ b/net/mac80211/scan.c
@@ -249,6 +249,7 @@ static bool ieee80211_prep_hw_scan(struct ieee80211_local *local)
} while (!n_chans);
local->hw_scan_req->n_channels = n_chans;
+ local->hw_scan_req->no_cck = req->no_cck;
ielen = ieee80211_build_preq_ies(local, (u8 *)local->hw_scan_req->ie,
req->ie, req->ie_len, band,
--
1.7.0.4
^ permalink raw reply related
* Re: [PATCH] wl12xx: remove sdio_test module
From: Luciano Coelho @ 2011-10-07 6:21 UTC (permalink / raw)
To: linux-wireless
In-Reply-To: <1317933089-16128-1-git-send-email-coelho@ti.com>
On Thu, 2011-10-06 at 23:31 +0300, Luciano Coelho wrote:
> This module has been causing more trouble than being useful. It only
> tests the SDIO speed by connecting to the wl12xx chip and does some
> throughput calculations. It is an ugly quick hack and, if we really
> want to have it as part of wl12xx we need to clean it up and implement
> it properly.
>
> Signed-off-by: Luciano Coelho <coelho@ti.com>
> ---
Okay, my mood today, influenced by Kalle's opinion, was to remove this
module from the kernel. So I applied this patch and added a URL that
points to the wikipage were information (and a tarball) can be found in
case someone wants to use it.
Applied.
--
Cheers,
Luca.
^ permalink raw reply
* pull request: wl12xx 2011-10-07
From: Luciano Coelho @ 2011-10-07 5:59 UTC (permalink / raw)
To: linville; +Cc: linux-wireless
Hi John,
One more pull-request intended for 3.2. I hope it makes it in time for
the merge window. Just a few small things. First, we use HW-offloaded
channel switch, which solves some FW problems in specific cases. Then
one missing value in the sched_scan configuration. One of Eliad's patch
removes an AP-mode quirk, which is not used anymore with the latest FW
we published and one fix to make sure that P2P packets are sent with
OFDM rates.
Please pull or let me know if there's any problem. This tree is based on
wireless-next/master.
Thanks!
The following changes since commit d6222fb0d669307a49e2a96aad86c156a9bb9551:
Merge branch 'master' of git://github.com/padovan/bluetooth-next (2011-10-04 14:06:47 -0400)
are available in the git repository at:
git://github.com/lucacoelho/wl12xx.git for-linville
Eliad Peller (2):
wl12xx: configure rate policy for p2p operations
wl12xx: disable AP-mode-specific quirks
Luciano Coelho (1):
wl12xx: set max_sched_scan_ie_len correctly
Shahar Levi (1):
wl12xx: Add support for HW channel switch
drivers/net/wireless/wl12xx/acx.c | 16 ++++++++
drivers/net/wireless/wl12xx/acx.h | 1 +
drivers/net/wireless/wl12xx/boot.c | 6 +--
drivers/net/wireless/wl12xx/cmd.c | 63 +++++++++++++++++++++++++++++++---
drivers/net/wireless/wl12xx/cmd.h | 20 +++++++++++
drivers/net/wireless/wl12xx/conf.h | 6 +++-
drivers/net/wireless/wl12xx/event.c | 15 ++++++++
drivers/net/wireless/wl12xx/main.c | 48 +++++++++++++++++++++----
drivers/net/wireless/wl12xx/wl12xx.h | 7 +---
9 files changed, 158 insertions(+), 24 deletions(-)
--
Cheers,
Luca.
^ permalink raw reply
* Re: [PATCH] wl12xx: remove sdio_test module
From: Luciano Coelho @ 2011-10-07 5:11 UTC (permalink / raw)
To: Kalle Valo; +Cc: linux-wireless
In-Reply-To: <87k48hh0li.fsf@purkki.adurom.net>
Hi Kalle,
On Fri, 2011-10-07 at 07:44 +0300, Kalle Valo wrote:
> Luciano Coelho <coelho@ti.com> writes:
>
> > This module has been causing more trouble than being useful. It only
> > tests the SDIO speed by connecting to the wl12xx chip and does some
> > throughput calculations. It is an ugly quick hack and, if we really
> > want to have it as part of wl12xx we need to clean it up and implement
> > it properly.
>
> IMHO just get rid of the thing. I'm sure you can count the users with
> one hand so the maintenance effort is not worth it. Just put it to
> wiki or somewhere else and anyone who needs it can apply (and fix) the
> patch themselves.
Yeah, I'm very inclined to that. I can actually count the number of
users in its whole lifetime in half a hand and the number of times each
one used it in the other half.
Good idea about the wiki. If I remove it (which I probably will), I
will put a tarball with the code in out wiki for anyone to grab.
Thanks!
--
Cheers,
Luca.
^ permalink raw reply
* Re: [PATCH] wl12xx: remove sdio_test module
From: Kalle Valo @ 2011-10-07 4:44 UTC (permalink / raw)
To: Luciano Coelho; +Cc: linux-wireless
In-Reply-To: <1317933089-16128-1-git-send-email-coelho@ti.com>
Luciano Coelho <coelho@ti.com> writes:
> This module has been causing more trouble than being useful. It only
> tests the SDIO speed by connecting to the wl12xx chip and does some
> throughput calculations. It is an ugly quick hack and, if we really
> want to have it as part of wl12xx we need to clean it up and implement
> it properly.
IMHO just get rid of the thing. I'm sure you can count the users with
one hand so the maintenance effort is not worth it. Just put it to
wiki or somewhere else and anyone who needs it can apply (and fix) the
patch themselves.
--
Kalle Valo
^ permalink raw reply
* RE: [PATCH] mwifiex: add support for Marvell pcie8766 chipset
From: Bing Zhao @ 2011-10-07 3:30 UTC (permalink / raw)
To: John W. Linville
Cc: linux-wireless@vger.kernel.org, Amitkumar Karwar, Kiran Divekar,
Yogesh Powar, Frank Huang
In-Reply-To: <1317701303-21871-2-git-send-email-bzhao@marvell.com>
Hi John,
> -----Original Message-----
> From: Bing Zhao [mailto:bzhao@marvell.com]
> Sent: Monday, October 03, 2011 9:08 PM
> To: linux-wireless@vger.kernel.org
> Cc: John W. Linville; Amitkumar Karwar; Kiran Divekar; Yogesh Powar; Frank Huang; Bing Zhao
> Subject: [PATCH] mwifiex: add support for Marvell pcie8766 chipset
>
> From: Amitkumar Karwar <akarwar@marvell.com>
>
> This patch supports 88W8766P chipset with a PCIe interface.
>
> The corresponding firmware image file is located at:
> "mrvl/pcie8766_uapsta.bin"
>
> Signed-off-by: Amitkumar Karwar <akarwar@marvell.com>
> Signed-off-by: Ramesh Radhakrishnan <rramesh@marvell.com>
> Signed-off-by: Yogesh Ashok Powar <yogeshp@marvell.com>
> Signed-off-by: Kiran Divekar <dkiran@marvell.com>
> Signed-off-by: Bing Zhao <bzhao@marvell.com>
> Signed-off-by: Frank Huang <frankh@marvell.com>
Could you please apply this patch? It doesn't depend on the other patches we are working on.
Thanks,
Bing
^ permalink raw reply
* Re: [ath9k-devel] [RFC 5/6] ath9k: enable DFS pulse detection
From: Adrian Chadd @ 2011-10-07 3:06 UTC (permalink / raw)
To: Zefir Kurtisi
Cc: Luis R. Rodriguez, Christian Lamparter, kgiori, ath9k-devel,
linux-wireless
In-Reply-To: <4E8E18DB.5070002@neratec.com>
Just FYI, that's what I'm likely to do for FreeBSD 10 (as I just don't
have time to try and make all the required regulatory changes before
the upcoming 9.0 release.)
Ie:
* DFS station mode (net80211) is going to be compiled and enabled by default;
* DFS master mode (net80211) is going to be compiled and enabled by default;
* The drivers which support radar detection in firmware (currently
only if_mwl) will set the DFS net80211 flag (ie, for master mode radar
detection);
* ath won't ship with the DFS enable flag (for master mode);
* I'll modify the regulatory database code to include per-band DFS
information (DFS domain, CAC/NOL timeout, interference timeout, etc)
and some device information (eg whether it supports HT20/HT40/etc DFS
detection);
* I'll then flip on the DFS channel enforcement in the net80211 code
so disables master mode on channels requiring DFS.
The radar detection code and channel interference code will live in
the ath driver but the DFS machinery (CAC, NOL, CSA, etc) is in
net80211. That way other NICs (eg if_mwl Marvell NICs) with DFS radar
detection support can leverage this.
I'll then likely ship two DFS modules - dfs_null (no DFS support, just
a placeholder for the API) and whatever code is ported from the
reference driver. Maybe I'll also include the code from Neratec if
it's dual-licenced. But I won't include radar patterns by default -
I'll include those on a documentation page which explains the how and
why of regulatory domain stuff.
Once FreeBSD ships DFS radar detection code, I'll make sure it isn't
compiled by default and even if enabled, it won't advertise DFS
channel support unless a valid radar pattern and radar parameter
configuration is loaded in. That way users won't inadvertently enable
it without being compliant.
Finally, I'm hoping to get all of this documented as much as possible
so the community can pick this stuff up and run with it. I was hoping
someone would throw me a 5ghz SDR (software defined radio) so I could
prototype up some open source radar pulse generation code, just to
lower the entry barrier to all of this.
HTH,
Adrian
^ permalink raw reply
* [PATCH 1/1] ath6kl: Add WSC IE on the associate message
From: Kevin Fang @ 2011-10-07 0:51 UTC (permalink / raw)
To: kvalo; +Cc: linux-wireless, Kevin Fang
In-Reply-To: <Y>
For some WPS test items, such as item "5.1.14"
STAUT must include the WSC IE in the 802.11 Association Request frame.
Therefore, add the corresponding IE in association message.
Signed-off-by: Kevin Fang <kevin.fang@qca.qualcomm.com>
---
drivers/net/wireless/ath/ath6kl/cfg80211.c | 53 ++++++++++++++++++++++++++++
1 files changed, 53 insertions(+), 0 deletions(-)
diff --git a/drivers/net/wireless/ath/ath6kl/cfg80211.c b/drivers/net/wireless/ath/ath6kl/cfg80211.c
index 2dae5d8..3dad73c 100644
--- a/drivers/net/wireless/ath/ath6kl/cfg80211.c
+++ b/drivers/net/wireless/ath/ath6kl/cfg80211.c
@@ -237,6 +237,53 @@ static bool ath6kl_cfg80211_ready(struct ath6kl *ar)
return true;
}
+static bool ath6kl_is_wpa_ie(const u8 *pos)
+{
+ return pos[0] == WLAN_EID_WPA && pos[1] >= 4 &&
+ pos[2] == 0x00 && pos[3] == 0x50 &&
+ pos[4] == 0xf2 && pos[5] == 0x01;
+}
+
+static bool ath6kl_is_rsn_ie(const u8 *pos)
+{
+ return pos[0] == WLAN_EID_RSN;
+}
+
+static int ath6kl_set_assoc_req_ies(struct ath6kl *ar, const u8 *ies,
+ size_t ies_len)
+{
+ const u8 *pos;
+ u8 *buf = NULL;
+ size_t len = 0;
+ int ret;
+
+ /*
+ * Filter out RSN/WPA IE(s)
+ */
+
+ if (ies && ies_len) {
+ buf = kmalloc(ies_len, GFP_KERNEL);
+ if (buf == NULL)
+ return -ENOMEM;
+ pos = ies;
+
+ while (pos + 1 < ies + ies_len) {
+ if (pos + 2 + pos[1] > ies + ies_len)
+ break;
+ if (!(ath6kl_is_wpa_ie(pos) || ath6kl_is_rsn_ie(pos))) {
+ memcpy(buf + len, pos, 2 + pos[1]);
+ len += 2 + pos[1];
+ }
+ pos += 2 + pos[1];
+ }
+ }
+
+ ret = ath6kl_wmi_set_appie_cmd(ar->wmi, WMI_FRAME_ASSOC_REQ,
+ buf, len);
+ kfree(buf);
+ return ret;
+}
+
static int ath6kl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
struct cfg80211_connect_params *sme)
{
@@ -285,6 +332,12 @@ static int ath6kl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
}
}
+ if (sme->ie && (sme->ie_len > 0)) {
+ status = ath6kl_set_assoc_req_ies(ar, sme->ie, sme->ie_len);
+ if (status)
+ return status;
+ }
+
if (test_bit(CONNECTED, &ar->flag) &&
ar->ssid_len == sme->ssid_len &&
!memcmp(ar->ssid, sme->ssid, ar->ssid_len)) {
--
1.7.0.4
^ permalink raw reply related
* [PATCH 3/4] ath9k: improve PS filter clearing and retry counting for A-MPDU
From: Felix Fietkau @ 2011-10-07 0:28 UTC (permalink / raw)
To: linux-wireless; +Cc: linville, mcgrof
In-Reply-To: <1317947295-52172-2-git-send-email-nbd@openwrt.org>
Do not increment the retry counter if packets to a sleeping station
were not sent because of tx failure, instead of only checking the filter
flag.
Clear the PS filter only after an A-MPDU was reported as filtered,
otherwise the hardware might do some unnecessary extra retransmissions.
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
---
drivers/net/wireless/ath/ath9k/xmit.c | 13 ++++++-------
1 files changed, 6 insertions(+), 7 deletions(-)
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index 37d70b2..c34bd92 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -373,7 +373,6 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
struct ath_frame_info *fi;
int nframes;
u8 tidno;
- bool clear_filter;
skb = bf->bf_mpdu;
hdr = (struct ieee80211_hdr *)skb->data;
@@ -463,11 +462,9 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
*/
txfail = 1;
} else if (fi->retries < ATH_MAX_SW_RETRIES) {
- if (!(ts->ts_status & ATH9K_TXERR_FILT) ||
- !an->sleeping)
+ if (txok || !an->sleeping)
ath_tx_set_retry(sc, txq, bf->bf_mpdu);
- clear_filter = true;
txpending = 1;
} else {
txfail = 1;
@@ -545,11 +542,13 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
ieee80211_sta_set_buffered(sta, tid->tidno, true);
spin_lock_bh(&txq->axq_lock);
- if (clear_filter)
- tid->ac->clear_ps_filter = true;
skb_queue_splice(&bf_pending, &tid->buf_q);
- if (!an->sleeping)
+ if (!an->sleeping) {
ath_tx_queue_tid(txq, tid);
+
+ if (ts->ts_status & ATH9K_TXERR_FILT)
+ tid->ac->clear_ps_filter = true;
+ }
spin_unlock_bh(&txq->axq_lock);
}
--
1.7.3.2
^ permalink raw reply related
* [PATCH 1/4] ath9k: indicate which queues are blocked when stopping tx fails
From: Felix Fietkau @ 2011-10-07 0:28 UTC (permalink / raw)
To: linux-wireless; +Cc: linville, mcgrof
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
---
drivers/net/wireless/ath/ath9k/xmit.c | 8 +++++---
1 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index c2bfc57..8980e7b 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -1473,7 +1473,8 @@ bool ath_drain_all_txq(struct ath_softc *sc, bool retry_tx)
struct ath_hw *ah = sc->sc_ah;
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
struct ath_txq *txq;
- int i, npend = 0;
+ int i;
+ u32 npend = 0;
if (sc->sc_flags & SC_OP_INVALID)
return true;
@@ -1485,11 +1486,12 @@ bool ath_drain_all_txq(struct ath_softc *sc, bool retry_tx)
if (!ATH_TXQ_SETUP(sc, i))
continue;
- npend += ath9k_hw_numtxpending(ah, sc->tx.txq[i].axq_qnum);
+ if (ath9k_hw_numtxpending(ah, sc->tx.txq[i].axq_qnum))
+ npend |= BIT(i);
}
if (npend)
- ath_err(common, "Failed to stop TX DMA!\n");
+ ath_err(common, "Failed to stop TX DMA, queues=0x%03x!\n", npend);
for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
if (!ATH_TXQ_SETUP(sc, i))
--
1.7.3.2
^ permalink raw reply related
* [PATCH 4/4] ath9k: fix retry counting / BAR handling during queue flush
From: Felix Fietkau @ 2011-10-07 0:28 UTC (permalink / raw)
To: linux-wireless; +Cc: linville, mcgrof
In-Reply-To: <1317947295-52172-3-git-send-email-nbd@openwrt.org>
When tx is suspended temporarily and the queue is flushed, do not increase
the retry count or attempt to send out BAR frames. Instead simply retry
the affected subframes normally after the reset.
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
---
drivers/net/wireless/ath/ath9k/mac.h | 3 ++-
drivers/net/wireless/ath/ath9k/xmit.c | 7 ++++++-
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/ath/ath9k/mac.h b/drivers/net/wireless/ath/ath9k/mac.h
index 91c9654..5eb4ee4 100644
--- a/drivers/net/wireless/ath/ath9k/mac.h
+++ b/drivers/net/wireless/ath/ath9k/mac.h
@@ -75,9 +75,10 @@
#define ATH9K_TXERR_XTXOP 0x08
#define ATH9K_TXERR_TIMER_EXPIRED 0x10
#define ATH9K_TX_ACKED 0x20
+#define ATH9K_TX_FLUSH 0x40
#define ATH9K_TXERR_MASK \
(ATH9K_TXERR_XRETRY | ATH9K_TXERR_FILT | ATH9K_TXERR_FIFO | \
- ATH9K_TXERR_XTXOP | ATH9K_TXERR_TIMER_EXPIRED)
+ ATH9K_TXERR_XTXOP | ATH9K_TXERR_TIMER_EXPIRED | ATH9K_TX_FLUSH)
#define ATH9K_TX_BA 0x01
#define ATH9K_TX_PWRMGMT 0x02
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index c34bd92..44cfdfb 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -373,6 +373,7 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
struct ath_frame_info *fi;
int nframes;
u8 tidno;
+ bool flush = !!(ts->ts_status & ATH9K_TX_FLUSH);
skb = bf->bf_mpdu;
hdr = (struct ieee80211_hdr *)skb->data;
@@ -461,6 +462,8 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
* the un-acked sub-frames
*/
txfail = 1;
+ } else if (flush) {
+ txpending = 1;
} else if (fi->retries < ATH_MAX_SW_RETRIES) {
if (txok || !an->sleeping)
ath_tx_set_retry(sc, txq, bf->bf_mpdu);
@@ -518,7 +521,8 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
ath_tx_complete_buf(sc, bf, txq,
&bf_head,
- ts, 0, 1);
+ ts, 0,
+ !flush);
break;
}
@@ -1408,6 +1412,7 @@ static void ath_drain_txq_list(struct ath_softc *sc, struct ath_txq *txq,
struct ath_tx_status ts;
memset(&ts, 0, sizeof(ts));
+ ts.ts_status = ATH9K_TX_FLUSH;
INIT_LIST_HEAD(&bf_head);
while (!list_empty(list)) {
--
1.7.3.2
^ permalink raw reply related
* [PATCH 2/4] ath9k: keep track of what's triggering hardware resets
From: Felix Fietkau @ 2011-10-07 0:28 UTC (permalink / raw)
To: linux-wireless; +Cc: linville, mcgrof
In-Reply-To: <1317947295-52172-1-git-send-email-nbd@openwrt.org>
Export how many times each of the reset triggers has fired through debugfs.
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
---
drivers/net/wireless/ath/ath9k/debug.c | 19 ++++++++++++++++---
drivers/net/wireless/ath/ath9k/debug.h | 13 +++++++++++++
drivers/net/wireless/ath/ath9k/main.c | 15 ++++++++++++++-
drivers/net/wireless/ath/ath9k/xmit.c | 5 ++++-
4 files changed, 47 insertions(+), 5 deletions(-)
diff --git a/drivers/net/wireless/ath/ath9k/debug.c b/drivers/net/wireless/ath/ath9k/debug.c
index a5329c9..327aa28 100644
--- a/drivers/net/wireless/ath/ath9k/debug.c
+++ b/drivers/net/wireless/ath/ath9k/debug.c
@@ -523,9 +523,22 @@ static ssize_t read_file_wiphy(struct file *file, char __user *user_buf,
if (tmp & ATH9K_RX_FILTER_PHYRADAR)
len += snprintf(buf + len, sizeof(buf) - len, " PHYRADAR");
if (tmp & ATH9K_RX_FILTER_MCAST_BCAST_ALL)
- len += snprintf(buf + len, sizeof(buf) - len, " MCAST_BCAST_ALL\n");
- else
- len += snprintf(buf + len, sizeof(buf) - len, "\n");
+ len += snprintf(buf + len, sizeof(buf) - len, " MCAST_BCAST_ALL");
+
+ len += snprintf(buf + len, sizeof(buf) - len,
+ "\n\nReset causes:\n"
+ " baseband hang: %d\n"
+ " baseband watchdog: %d\n"
+ " fatal hardware error interrupt: %d\n"
+ " tx hardware error: %d\n"
+ " tx path hang: %d\n"
+ " pll rx hang: %d\n",
+ sc->debug.stats.reset[RESET_TYPE_BB_HANG],
+ sc->debug.stats.reset[RESET_TYPE_BB_WATCHDOG],
+ sc->debug.stats.reset[RESET_TYPE_FATAL_INT],
+ sc->debug.stats.reset[RESET_TYPE_TX_ERROR],
+ sc->debug.stats.reset[RESET_TYPE_TX_HANG],
+ sc->debug.stats.reset[RESET_TYPE_PLL_HANG]);
if (len > sizeof(buf))
len = sizeof(buf);
diff --git a/drivers/net/wireless/ath/ath9k/debug.h b/drivers/net/wireless/ath/ath9k/debug.h
index b93e88b..356352a 100644
--- a/drivers/net/wireless/ath/ath9k/debug.h
+++ b/drivers/net/wireless/ath/ath9k/debug.h
@@ -25,8 +25,10 @@ struct ath_buf;
#ifdef CONFIG_ATH9K_DEBUGFS
#define TX_STAT_INC(q, c) sc->debug.stats.txstats[q].c++
+#define RESET_STAT_INC(sc, type) sc->debug.stats.reset[type]++
#else
#define TX_STAT_INC(q, c) do { } while (0)
+#define RESET_STAT_INC(sc, type) do { } while (0)
#endif
#ifdef CONFIG_ATH9K_DEBUGFS
@@ -171,10 +173,21 @@ struct ath_rx_stats {
u8 rs_antenna;
};
+enum ath_reset_type {
+ RESET_TYPE_BB_HANG,
+ RESET_TYPE_BB_WATCHDOG,
+ RESET_TYPE_FATAL_INT,
+ RESET_TYPE_TX_ERROR,
+ RESET_TYPE_TX_HANG,
+ RESET_TYPE_PLL_HANG,
+ __RESET_TYPE_MAX
+};
+
struct ath_stats {
struct ath_interrupt_stats istats;
struct ath_tx_stats txstats[ATH9K_NUM_TX_QUEUES];
struct ath_rx_stats rxstats;
+ u32 reset[__RESET_TYPE_MAX];
};
#define ATH_DBG_MAX_SAMPLES 10
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index 9883186..366912f 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -679,6 +679,16 @@ void ath9k_tasklet(unsigned long data)
if ((status & ATH9K_INT_FATAL) ||
(status & ATH9K_INT_BB_WATCHDOG)) {
+#ifdef CONFIG_ATH9K_DEBUGFS
+ enum ath_reset_type type;
+
+ if (status & ATH9K_INT_FATAL)
+ type = RESET_TYPE_FATAL_INT;
+ else
+ type = RESET_TYPE_BB_WATCHDOG;
+
+ RESET_STAT_INC(sc, type);
+#endif
ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
goto out;
}
@@ -995,8 +1005,10 @@ void ath_hw_check(struct work_struct *work)
ath_dbg(common, ATH_DBG_RESET, "Possible baseband hang, "
"busy=%d (try %d)\n", busy, sc->hw_busy_count + 1);
if (busy >= 99) {
- if (++sc->hw_busy_count >= 3)
+ if (++sc->hw_busy_count >= 3) {
+ RESET_STAT_INC(sc, RESET_TYPE_BB_HANG);
ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
+ }
} else if (busy >= 0)
sc->hw_busy_count = 0;
@@ -1016,6 +1028,7 @@ static void ath_hw_pll_rx_hang_check(struct ath_softc *sc, u32 pll_sqsum)
/* Rx is hung for more than 500ms. Reset it */
ath_dbg(common, ATH_DBG_RESET,
"Possible RX hang, resetting");
+ RESET_STAT_INC(sc, RESET_TYPE_PLL_HANG);
ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
count = 0;
}
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index 8980e7b..37d70b2 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -564,8 +564,10 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
rcu_read_unlock();
- if (needreset)
+ if (needreset) {
+ RESET_STAT_INC(sc, RESET_TYPE_TX_ERROR);
ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
+ }
}
static bool ath_lookup_legacy(struct ath_buf *bf)
@@ -2213,6 +2215,7 @@ static void ath_tx_complete_poll_work(struct work_struct *work)
if (needreset) {
ath_dbg(ath9k_hw_common(sc->sc_ah), ATH_DBG_RESET,
"tx hung, resetting the chip\n");
+ RESET_STAT_INC(sc, RESET_TYPE_TX_HANG);
ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
}
--
1.7.3.2
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox