* [RFC] b43: LP-PHY: Initialize SW TX power control
From: Gábor Stefanik @ 2009-08-11 21:03 UTC (permalink / raw)
To: Michael Buesch, John Linville, Larry Finger
Cc: linux-wireless, Broadcom Wireless
I'm not sure at all if writing to offset 0 in the TX gain table
is the right thing to do... please clarify.
Not-yet-signed-off-by: Gábor Stefanik <netrolller.3d@gmail.com>
---
If this is indeed the right thing to do, please inform me,
and I will resubmit this as a formal patch.
phy_lp.c | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/drivers/net/wireless/b43/phy_lp.c b/drivers/net/wireless/b43/phy_lp.c
index 689c932..93451c9 100644
--- a/drivers/net/wireless/b43/phy_lp.c
+++ b/drivers/net/wireless/b43/phy_lp.c
@@ -847,15 +847,23 @@ static void lpphy_calibration(struct b43_wldev *dev)
/* Initialize TX power control */
static void lpphy_tx_pctl_init(struct b43_wldev *dev)
{
+ lpphy_tx_gain_table_entry txgain;
if (0/*FIXME HWPCTL capable */) {
//TODO
} else { /* This device is only software TX power control capable. */
+ txgain.bb_mult = 0x96;
if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) {
- //TODO
+ txgain.gm = 4;
+ txgain.pad = 12;
+ txgain.pga = 12;
+ txgain.dac = 0;
} else {
- //TODO
- }
- //TODO set BB multiplier to 0x0096
+ txgain.gm = 7;
+ txgain.pad = 15;
+ txgain.pga = 14;
+ txgain.dac = 0;
+ } // FIXME offset 0 is just a guess!
+ lpphy_write_gain_table(dev, 0, txgain);
}
}
^ permalink raw reply related
* Re: [PATCH 3/7] [compat-2.6] pcmcia_parse_tuple was redefined in pcmcia/cistpl.h
From: Hauke Mehrtens @ 2009-08-11 20:53 UTC (permalink / raw)
To: Luis R. Rodriguez; +Cc: linux-wireless
In-Reply-To: <43e72e890908101520x19fddcddx72215fb0851baf2f@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 2020 bytes --]
Hi Luis,
Thank you for applying the rest of the patches. Next time I will use
--cover-letter when generating the patches.
Luis R. Rodriguez wrote:
> On Sat, Aug 8, 2009 at 5:38 AM, Hauke Mehrtens<hauke@hauke-m.de> wrote:
>> fix build:
>> undef pcmcia_parse_tuple before redefine it again.
>>
>> Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
>> ---
>> compat/compat-2.6.28.h | 8 +++++++-
>> 1 files changed, 7 insertions(+), 1 deletions(-)
>>
>> diff --git a/compat/compat-2.6.28.h b/compat/compat-2.6.28.h
>> index fdc021a..e25259f 100644
>> --- a/compat/compat-2.6.28.h
>> +++ b/compat/compat-2.6.28.h
>> @@ -29,7 +29,13 @@
>> })
>> #endif /* From include/asm-generic/bug.h */
>>
>> -#define pcmcia_parse_tuple(tuple, parse) pcmcia_parse_tuple(NULL, tuple, parse)
>> +#include <pcmcia/cs_types.h>
>> +#include <pcmcia/cs.h>
>> +#include <pcmcia/cistpl.h>
>> +#ifdef pcmcia_parse_tuple
>> +#undef pcmcia_parse_tuple
>> +#define pcmcia_parse_tuple(tuple, parse) pccard_parse_tuple(tuple, parse)
>> +#endif
>
> Where did pccard_parse_tuple() come from?
In include/pcmcia/cistpl.h pcmcia_parse_tuple(p_dev, tuple, parse) is
defined as pccard_parse_tuple(tuple, parse)
> Did you see the commit 0df8084caf53774113c8f118e9dd43e660cf9e15 by any
> chance? That fixed compilation for me against older kernels.
I still get a compile error with recent compat-wireless including commit
0df8084caf53774113c8f118e9dd43e660cf9e15 with kernel <= 2.6.27 in Ubuntu:
In file included from
/compat-wireless-git/drivers/net/wireless/b43/pcmcia.c:30:
include/pcmcia/cistpl.h:610:1: warning: "pcmcia_parse_tuple" redefined
In file included from /compat-wireless-git/include/net/compat.h:19,
from <command-line>:0:
/compat-wireless-git/include/net/compat-2.6.28.h:32:1: warning: this is
the location of the previous definition
The above patch fixes it for me. The patch does not look relay nice, do
you have a better idea how to solve this problem?
Hauke
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 898 bytes --]
^ permalink raw reply
* Re: B43: MGMT (TX callback) fail
From: Manuel Schölling @ 2009-08-11 20:44 UTC (permalink / raw)
To: linux-wireless
In-Reply-To: <loom.20090811T175527-147@post.gmane.org>
Manuel Schölling <manuel.schoelling@...> writes:
>
> Sorry, I forgot to tell you that the client machine does not associate with the
> hostapd machine (but it does with other access points).
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to majordomo@...
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
>
Sorry about all the noise.
I got it working switching to channel 1 (based on this post:
http://lists.berlios.de/pipermail/bcm43xx-dev/2009-April/008896.html)
It's for b43 legancy but I'm using 'ordinary' b43...
Anyway, is it already fixed in SVN version?
^ permalink raw reply
* Re: [PATCH 1/2] mac802154: add a software MAC 802.15.4 implementation
From: Johannes Berg @ 2009-08-11 20:39 UTC (permalink / raw)
To: Dmitry Eremin-Solenikov; +Cc: netdev, linux-wireless, Sergey Lapin
In-Reply-To: <20090811202304.GA6303@doriath.ww600.siemens.net>
[-- Attachment #1: Type: text/plain, Size: 2215 bytes --]
On Wed, 2009-08-12 at 00:23 +0400, Dmitry Eremin-Solenikov wrote:
> > That return value is strange.
>
> The idea is that tx function can return info about errors during
> transmit (busy channel, no ACK, etc).
Well, TX functions don't usually wait for anything so busy channel or no
ack wouldn't be possible to return there but more like a TX status, and
I think people are more used to NETDEV_TX_OK etc. return values. But
it's your choice to make, obviously. If you want to return specific
information like that though I would recommend making an enum so you get
at least some type checking (and things like 'return -1' are more
obviously wrong).
> > We've had no end to trouble with the master netdev, I suggest you look
> > into the current mac80211 code and see if you can get rid of it.
>
> What troubles w/ master netdev did you have had? I do still see the
> master devices in mac80211. IIUC, it's planned to replace (from
> management point of view) the mdev with wiphy instance, isn't it?
Mostly the userspace API was a mess, and you can't actually _do_
anything with the master netdev. It also doesn't see all the frames,
only outgoing. It's very strange.
Yes, you still see it in the current tree, but it's gone in our -next
tree.
The biggest problem is that it really clutters up the userspace API
since you can't do any netdev things with it, it's just a placeholder.
In addition to that, you can't put anything into skb->cb, then push the
frame to the master netdev, and expect things in skb->cb to still be
there when the frame arrives at the master netdev. Not sure you do that
(I hope not because that would be very buggy), but eventually you'll
probably find that you do want that, etc.
IMHO it's just better practise to not use it in situations like this
where it can't be really used as a netdev.
> Hmm. I thought that one may be able to rmmod the module w/ ops while the
> device is still hanging in the system. On the other hand, ops are
> provided by the driver, so if one rmmods the driver and the device is
> still there, it's a bug...
Exactly. You _want_ to be able to rmmod the module and have it
unregister itself.
johannes
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 801 bytes --]
^ permalink raw reply
* Re: [PATCH 1/2] mac802154: add a software MAC 802.15.4 implementation
From: Dmitry Eremin-Solenikov @ 2009-08-11 20:29 UTC (permalink / raw)
To: Paul E. McKenney; +Cc: netdev, linux-zigbee-devel, linux-wireless, Sergey Lapin
In-Reply-To: <20090810172843.GD6791@linux.vnet.ibm.com>
On Mon, Aug 10, 2009 at 10:28:43AM -0700, Paul E. McKenney wrote:
> On Mon, Aug 10, 2009 at 06:16:39PM +0400, Dmitry Eremin-Solenikov wrote:
> > Some of available devices are just dump radios implementing IEEE 802.15.4
> > PHY layer. This commit adds a common library that acts like an intermediate
> > layer between our socket family and drivers for those dumb devices.
> >
> > Currently this is data-only part (no commands, no beacons). Control
> > interfaces will follow up shortly.
> >
> > Note this implementaion is neither certified, nor feature complete!
>
> One question below, otherwise looks plausible. (I am not entirely sure
> which lists are which...)
>
> Thanx, Paul
[skipped]
>
> > +
> > +/*
> > + * This is for hw unregistration only, as it doesn't do RCU locking
>
> So this list is different than the RCU-protected one, and readers
> always hold locks when traversing it?
>
> I am not familiar with this code, so might be missing something, but
> it looks to me like the same list that RCU readers traverse. If so,
> need list_del_rcu() and synchronize_rcu().
On the first glance, yes. On the second glance, list_del instead of
list_del_rcu should be safe as there should be now other list traversals
at the same time. I'll think about it however.
>
> > + */
> > +void ieee802154_drop_slaves(struct ieee802154_dev *hw)
> > +{
> > + struct ieee802154_priv *priv = ieee802154_to_priv(hw);
> > + struct ieee802154_sub_if_data *sdata, *next;
> > +
> > + ASSERT_RTNL();
> > +
> > + list_for_each_entry_safe(sdata, next, &priv->slaves, list) {
> > + mutex_lock(&sdata->hw->slaves_mtx);
> > + list_del(&sdata->list);
> > + mutex_unlock(&sdata->hw->slaves_mtx);
> > +
> > + dev_put(sdata->hw->netdev);
> > +
> > + unregister_netdevice(sdata->dev);
> > + }
> > +}
--
With best wishes
Dmitry
^ permalink raw reply
* [PATCH] b43: LP-PHY: Refactor TX gain table I/O
From: Gábor Stefanik @ 2009-08-11 20:24 UTC (permalink / raw)
To: John Linville, Michael Buesch
Cc: Larry Finger, Broadcom Wireless, linux-wireless
Make it possible to write individual gain table entries.
Allow gain table entries to be written outside gain table init.
Add version-agnostic helpers for writing gain tables.
Use the new TX gain table helpers during table init.
Signed-off-by: Gábor Stefanik <netrolller.3d@gmail.com>
---
drivers/net/wireless/b43/tables_lpphy.c | 85 +++++++++++++++++--------------
drivers/net/wireless/b43/tables_lpphy.h | 9 +++
2 files changed, 55 insertions(+), 39 deletions(-)
diff --git a/drivers/net/wireless/b43/tables_lpphy.c b/drivers/net/wireless/b43/tables_lpphy.c
index 3507515..5fdb175 100644
--- a/drivers/net/wireless/b43/tables_lpphy.c
+++ b/drivers/net/wireless/b43/tables_lpphy.c
@@ -1058,10 +1058,6 @@ static const u32 lpphy_papd_mult_table[] = {
0x00036963, 0x000339f2, 0x00030a89, 0x0002db28,
};
-struct lpphy_tx_gain_table_entry {
- u8 gm, pga, pad, dac, bb_mult;
-};
-
static struct lpphy_tx_gain_table_entry lpphy_rev0_nopa_tx_gain_table[] = {
{ .gm = 7, .pga = 15, .pad = 14, .dac = 0, .bb_mult = 152, },
{ .gm = 7, .pga = 15, .pad = 14, .dac = 0, .bb_mult = 147, },
@@ -2345,44 +2341,55 @@ void lpphy_rev2plus_table_init(struct b43_wldev *dev)
}
}
-
-static void lpphy_rev0_1_write_gain_table(struct b43_wldev *dev,
- struct lpphy_tx_gain_table_entry *table)
+static void lpphy_rev0_1_write_gain_table(struct b43_wldev *dev, int offset,
+ struct lpphy_tx_gain_table_entry data)
{
- int i;
u32 tmp;
B43_WARN_ON(dev->phy.rev >= 2);
- for (i = 0; i < 128; i++) {
- tmp = table[i].pad << 11;
- tmp |= table[i].pga << 7;
- tmp |= table[i].gm << 4;
- tmp |= table[i].dac;
- b43_lptab_write(dev, B43_LPTAB32(10, 0xC0 + i), tmp);
- tmp = table[i].bb_mult << 20;
- b43_lptab_write(dev, B43_LPTAB32(10, 0x140 + i), tmp);
- }
+ tmp = data.pad << 11;
+ tmp |= data.pga << 7;
+ tmp |= data.gm << 4;
+ tmp |= data.dac;
+ b43_lptab_write(dev, B43_LPTAB32(10, 0xC0 + offset), tmp);
+ tmp = data.bb_mult << 20;
+ b43_lptab_write(dev, B43_LPTAB32(10, 0x140 + offset), tmp);
}
-static void lpphy_rev2plus_write_gain_table(struct b43_wldev *dev,
- struct lpphy_tx_gain_table_entry *table)
+static void lpphy_rev2plus_write_gain_table(struct b43_wldev *dev, int offset,
+ struct lpphy_tx_gain_table_entry data)
{
- int i;
u32 tmp;
B43_WARN_ON(dev->phy.rev < 2);
- for (i = 0; i < 128; i++) {
- tmp = table[i].pad << 16;
- tmp |= table[i].pga << 8;
- tmp |= table[i].gm;
- tmp |= 0x7f000000;
- b43_lptab_write(dev, B43_LPTAB32(7, 0xC0 + i), tmp);
- tmp = table[i].bb_mult << 20;
- tmp |= table[i].dac << 28;
- b43_lptab_write(dev, B43_LPTAB32(7, 0x140 + i), tmp);
- }
+ tmp = data.pad << 16;
+ tmp |= data.pga << 8;
+ tmp |= data.gm;
+ tmp |= 0x7f000000;
+ b43_lptab_write(dev, B43_LPTAB32(7, 0xC0 + offset), tmp);
+ tmp = data.bb_mult << 20;
+ tmp |= data.dac << 28;
+ b43_lptab_write(dev, B43_LPTAB32(7, 0x140 + offset), tmp);
+}
+
+void lpphy_write_gain_table(struct b43_wldev *dev, int offset,
+ struct lpphy_tx_gain_table_entry data)
+{
+ if (dev->phy.rev >= 2)
+ lpphy_rev2plus_write_gain_table(dev, offset, data);
+ else
+ lpphy_rev0_1_write_gain_table(dev, offset, data);
+}
+
+void lpphy_write_gain_table_bulk(struct b43_wldev *dev, int offset, int count,
+ struct lpphy_tx_gain_table_entry *table)
+{
+ int i;
+
+ for (i = offset; i < count; i++)
+ lpphy_write_gain_table(dev, i, table[i]);
}
void lpphy_init_tx_gain_table(struct b43_wldev *dev)
@@ -2393,36 +2400,36 @@ void lpphy_init_tx_gain_table(struct b43_wldev *dev)
case 0:
if ((bus->sprom.boardflags_hi & B43_BFH_NOPA) ||
(bus->sprom.boardflags_lo & B43_BFL_HGPA))
- lpphy_rev0_1_write_gain_table(dev,
+ lpphy_write_gain_table_bulk(dev, 0, 128,
lpphy_rev0_nopa_tx_gain_table);
else if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ)
- lpphy_rev0_1_write_gain_table(dev,
+ lpphy_write_gain_table_bulk(dev, 0, 128,
lpphy_rev0_2ghz_tx_gain_table);
else
- lpphy_rev0_1_write_gain_table(dev,
+ lpphy_write_gain_table_bulk(dev, 0, 128,
lpphy_rev0_5ghz_tx_gain_table);
break;
case 1:
if ((bus->sprom.boardflags_hi & B43_BFH_NOPA) ||
(bus->sprom.boardflags_lo & B43_BFL_HGPA))
- lpphy_rev0_1_write_gain_table(dev,
+ lpphy_write_gain_table_bulk(dev, 0, 128,
lpphy_rev1_nopa_tx_gain_table);
else if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ)
- lpphy_rev0_1_write_gain_table(dev,
+ lpphy_write_gain_table_bulk(dev, 0, 128,
lpphy_rev1_2ghz_tx_gain_table);
else
- lpphy_rev0_1_write_gain_table(dev,
+ lpphy_write_gain_table_bulk(dev, 0, 128,
lpphy_rev1_5ghz_tx_gain_table);
break;
default:
if (bus->sprom.boardflags_hi & B43_BFH_NOPA)
- lpphy_rev2plus_write_gain_table(dev,
+ lpphy_write_gain_table_bulk(dev, 0, 128,
lpphy_rev2_nopa_tx_gain_table);
else if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ)
- lpphy_rev2plus_write_gain_table(dev,
+ lpphy_write_gain_table_bulk(dev, 0, 128,
lpphy_rev2_2ghz_tx_gain_table);
else
- lpphy_rev2plus_write_gain_table(dev,
+ lpphy_write_gain_table_bulk(dev, 0, 128,
lpphy_rev2_5ghz_tx_gain_table);
}
}
diff --git a/drivers/net/wireless/b43/tables_lpphy.h b/drivers/net/wireless/b43/tables_lpphy.h
index b5024b6..84f1d26 100644
--- a/drivers/net/wireless/b43/tables_lpphy.h
+++ b/drivers/net/wireless/b43/tables_lpphy.h
@@ -28,6 +28,15 @@ void b43_lptab_write_bulk(struct b43_wldev *dev, u32 offset,
void b2062_upload_init_table(struct b43_wldev *dev);
void b2063_upload_init_table(struct b43_wldev *dev);
+struct lpphy_tx_gain_table_entry {
+ u8 gm, pga, pad, dac, bb_mult;
+};
+
+void lpphy_write_gain_table(struct b43_wldev *dev, int offset,
+ struct lpphy_tx_gain_table_entry data);
+void lpphy_write_gain_table_bulk(struct b43_wldev *dev, int offset, int count,
+ struct lpphy_tx_gain_table_entry *table);
+
void lpphy_rev0_1_table_init(struct b43_wldev *dev);
void lpphy_rev2plus_table_init(struct b43_wldev *dev);
void lpphy_init_tx_gain_table(struct b43_wldev *dev);
--
1.6.2.4
^ permalink raw reply related
* Re: [PATCH 1/2] mac802154: add a software MAC 802.15.4 implementation
From: Dmitry Eremin-Solenikov @ 2009-08-11 20:23 UTC (permalink / raw)
To: Johannes Berg; +Cc: netdev, linux-wireless, Sergey Lapin
In-Reply-To: <1249914466.32614.13.camel@johannes.local>
On Mon, Aug 10, 2009 at 04:27:46PM +0200, Johannes Berg wrote:
> On Mon, 2009-08-10 at 18:16 +0400, Dmitry Eremin-Solenikov wrote:
> > + * @tx: Handler that 802.15.4 module calls for each transmitted frame.
> > + * skb cntains the buffer starting from the IEEE 802.15.4 header.
> > + * The low-level driver should send the frame based on available
> > + * configuration.
> > + * This function should return zero or negative errno.
>
> That return value is strange.
The idea is that tx function can return info about errors during
transmit (busy channel, no ACK, etc).
>
> > +++ b/net/Makefile
> > @@ -61,6 +61,7 @@ ifneq ($(CONFIG_DCB),)
> > obj-y += dcb/
> > endif
> > obj-y += ieee802154/
> > +obj-y += mac802154/
>
> I think you should use obj-$(CONFIG_MAC802154) as there's no need to
> recurse into the dir unless that's selected.
fixed.
>
> But does it make sense to actually have this little code as a separate
> dir/module?
The submitted patch is only a part of written MAC code. And we still
aren't feature complete. Is there any sence in keeping mac80211
separate? IMHO yes. Same goes for mac802154.
> > + struct net_device *netdev; /* mwpanX device */
> > + int open_count;
> > + /* As in mac80211 slaves list is modified:
> > + * 1) under the RTNL
> > + * 2) protected by slaves_mtx;
> > + * 3) in an RCU manner
> > + *
> > + * So atomic readers can use any of this protection methods
> > + */
> > + struct list_head slaves;
>
> heh.
? C&p from mac80211 mostly :)
>
> > +static int ieee802154_master_open(struct net_device *dev)
> > +{
>
> We've had no end to trouble with the master netdev, I suggest you look
> into the current mac80211 code and see if you can get rid of it.
What troubles w/ master netdev did you have had? I do still see the
master devices in mac80211. IIUC, it's planned to replace (from
management point of view) the mdev with wiphy instance, isn't it?
> > +struct ieee802154_dev *ieee802154_alloc_device(size_t priv_size,
> > + struct ieee802154_ops *ops)
> > +{
>
> > + if (!try_module_get(ops->owner)) {
>
> That isn't necessary since the module is just calling your function. In
> fact, doing this removes the ability to rmmod any module using this
> which is bogus.
Hmm. I thought that one may be able to rmmod the module w/ ops while the
device is still hanging in the system. On the other hand, ops are
provided by the driver, so if one rmmods the driver and the device is
still there, it's a bug...
Removing now.
--
With best wishes
Dmitry
^ permalink raw reply
* [PATCH v2] mac80211: fix panic when splicing unprepared TIDs
From: Luis R. Rodriguez @ 2009-08-11 20:10 UTC (permalink / raw)
To: linville
Cc: johannes, linux-wireless, jords, jackelectronics,
Luis R. Rodriguez, stable
We splice skbs from the pending queue for a TID
onto the local pending queue when tearing down a
block ack request. This is not necessary unless we
actually have received a request to start a block ack
request (rate control, for example). If we never received
that request we should not be splicing the tid pending
queue as it would be null, causing a panic.
Not sure yet how exactly we allowed through a call when the
tid state does not have at least HT_ADDBA_REQUESTED_MSK set,
that will require some further review as it is not quite
obvious.
For more information see the bug report:
http://bugzilla.kernel.org/show_bug.cgi?id=13922
This fixes this oops:
BUG: unable to handle kernel NULL pointer dereference at 00000030
IP: [<f8806c70>] ieee80211_agg_splice_packets+0x40/0xc0 [mac80211]
*pdpt = 0000000002d1e001 *pde = 0000000000000000
Thread overran stack, or stack corrupted
Oops: 0000 [#1] SMP
last sysfs file: /sys/module/aes_generic/initstate
Modules linked in: <bleh>
Pid: 0, comm: swapper Not tainted (2.6.31-rc5-wl #2) Dell DV051
EIP: 0060:[<f8806c70>] EFLAGS: 00010292 CPU: 0
EIP is at ieee80211_agg_splice_packets+0x40/0xc0 [mac80211]
EAX: 00000030 EBX: 0000004c ECX: 00000003 EDX: 00000000
ESI: c1c98000 EDI: f745a1c0 EBP: c076be58 ESP: c076be38
DS: 007b ES: 007b FS: 00d8 GS: 0000 SS: 0068
Process swapper (pid: 0, ti=c076a000 task=c0709160 task.ti=c076a000)
Stack: <bleh2>
Call Trace:
[<f8806edb>] ? ieee80211_stop_tx_ba_cb+0xab/0x150 [mac80211]
[<f8802f1e>] ? ieee80211_tasklet_handler+0xce/0x110 [mac80211]
[<c04862ff>] ? net_rx_action+0xef/0x1d0
[<c0149378>] ? tasklet_action+0x58/0xc0
[<c014a0f2>] ? __do_softirq+0xc2/0x190
[<c018eb48>] ? handle_IRQ_event+0x58/0x140
[<c01205fe>] ? ack_apic_level+0x7e/0x270
[<c014a1fd>] ? do_softirq+0x3d/0x40
[<c014a345>] ? irq_exit+0x65/0x90
[<c010a6af>] ? do_IRQ+0x4f/0xc0
[<c014a35d>] ? irq_exit+0x7d/0x90
[<c011d547>] ? smp_apic_timer_interrupt+0x57/0x90
[<c01094a9>] ? common_interrupt+0x29/0x30
[<c010fd9e>] ? mwait_idle+0xbe/0x100
[<c0107e42>] ? cpu_idle+0x52/0x90
[<c054b1a5>] ? rest_init+0x55/0x60
[<c077492d>] ? start_kernel+0x315/0x37d
[<c07743ce>] ? unknown_bootoption+0x0/0x1f9
[<c0774099>] ? i386_start_kernel+0x79/0x81
Code: <bleh3>
EIP: [<f8806c70>] ieee80211_agg_splice_packets+0x40/0xc0 [mac80211] SS:ESP 0068:c076be38
CR2: 0000000000000030
Cc: stable@kernel.org
Testedy-by: Jack Lau <jackelectronics@hotmail.com>
Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
---
v2 adds the URL to the bugzilla entry.
net/mac80211/agg-tx.c | 8 ++++++++
1 files changed, 8 insertions(+), 0 deletions(-)
diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c
index 1958c7c..bd765f3 100644
--- a/net/mac80211/agg-tx.c
+++ b/net/mac80211/agg-tx.c
@@ -381,6 +381,14 @@ static void ieee80211_agg_splice_packets(struct ieee80211_local *local,
&local->hw, queue,
IEEE80211_QUEUE_STOP_REASON_AGGREGATION);
+ if (!(sta->ampdu_mlme.tid_state_tx[tid] & HT_ADDBA_REQUESTED_MSK))
+ return;
+
+ if (WARN(!sta->ampdu_mlme.tid_tx[tid],
+ "TID %d gone but expected when splicing aggregates from"
+ "the pending queue\n", tid))
+ return;
+
if (!skb_queue_empty(&sta->ampdu_mlme.tid_tx[tid]->pending)) {
spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
/* copy over remaining packets */
--
1.6.3.3
^ permalink raw reply related
* [PATCH] mac80211: fix panic when splicing unprepared TIDs
From: Luis R. Rodriguez @ 2009-08-11 20:04 UTC (permalink / raw)
To: linville; +Cc: johannes, linux-wireless, Luis R. Rodriguez, stable
We splice skbs from the pending queue for a TID
onto the local pending queue when tearing down a
block ack request. This is not necessary unless we
actually have received a request to start a block ack
request (rate control, for example). If we never received
that request we should not be splicing the tid pending
queue as it would be null, causing a panic.
Not sure yet how exactly we allowed through a call when the
tid state does not have at least HT_ADDBA_REQUESTED_MSK set,
that will require some further review as it is not quite
obvious.
This fixes this oops:
BUG: unable to handle kernel NULL pointer dereference at 00000030
IP: [<f8806c70>] ieee80211_agg_splice_packets+0x40/0xc0 [mac80211]
*pdpt = 0000000002d1e001 *pde = 0000000000000000
Thread overran stack, or stack corrupted
Oops: 0000 [#1] SMP
last sysfs file: /sys/module/aes_generic/initstate
Modules linked in: <bleh>
Pid: 0, comm: swapper Not tainted (2.6.31-rc5-wl #2) Dell DV051
EIP: 0060:[<f8806c70>] EFLAGS: 00010292 CPU: 0
EIP is at ieee80211_agg_splice_packets+0x40/0xc0 [mac80211]
EAX: 00000030 EBX: 0000004c ECX: 00000003 EDX: 00000000
ESI: c1c98000 EDI: f745a1c0 EBP: c076be58 ESP: c076be38
DS: 007b ES: 007b FS: 00d8 GS: 0000 SS: 0068
Process swapper (pid: 0, ti=c076a000 task=c0709160 task.ti=c076a000)
Stack: <bleh2>
Call Trace:
[<f8806edb>] ? ieee80211_stop_tx_ba_cb+0xab/0x150 [mac80211]
[<f8802f1e>] ? ieee80211_tasklet_handler+0xce/0x110 [mac80211]
[<c04862ff>] ? net_rx_action+0xef/0x1d0
[<c0149378>] ? tasklet_action+0x58/0xc0
[<c014a0f2>] ? __do_softirq+0xc2/0x190
[<c018eb48>] ? handle_IRQ_event+0x58/0x140
[<c01205fe>] ? ack_apic_level+0x7e/0x270
[<c014a1fd>] ? do_softirq+0x3d/0x40
[<c014a345>] ? irq_exit+0x65/0x90
[<c010a6af>] ? do_IRQ+0x4f/0xc0
[<c014a35d>] ? irq_exit+0x7d/0x90
[<c011d547>] ? smp_apic_timer_interrupt+0x57/0x90
[<c01094a9>] ? common_interrupt+0x29/0x30
[<c010fd9e>] ? mwait_idle+0xbe/0x100
[<c0107e42>] ? cpu_idle+0x52/0x90
[<c054b1a5>] ? rest_init+0x55/0x60
[<c077492d>] ? start_kernel+0x315/0x37d
[<c07743ce>] ? unknown_bootoption+0x0/0x1f9
[<c0774099>] ? i386_start_kernel+0x79/0x81
Code: <bleh3>
EIP: [<f8806c70>] ieee80211_agg_splice_packets+0x40/0xc0 [mac80211] SS:ESP 0068:c076be38
CR2: 0000000000000030
Cc: stable@kernel.org
Testedy-by: Jack Lau <jackelectronics@hotmail.com>
Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
---
net/mac80211/agg-tx.c | 8 ++++++++
1 files changed, 8 insertions(+), 0 deletions(-)
diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c
index 1958c7c..bd765f3 100644
--- a/net/mac80211/agg-tx.c
+++ b/net/mac80211/agg-tx.c
@@ -381,6 +381,14 @@ static void ieee80211_agg_splice_packets(struct ieee80211_local *local,
&local->hw, queue,
IEEE80211_QUEUE_STOP_REASON_AGGREGATION);
+ if (!(sta->ampdu_mlme.tid_state_tx[tid] & HT_ADDBA_REQUESTED_MSK))
+ return;
+
+ if (WARN(!sta->ampdu_mlme.tid_tx[tid],
+ "TID %d gone but expected when splicing aggregates from"
+ "the pending queue\n", tid))
+ return;
+
if (!skb_queue_empty(&sta->ampdu_mlme.tid_tx[tid]->pending)) {
spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
/* copy over remaining packets */
--
1.6.3.3
^ permalink raw reply related
* [PATCH v2] usbnet: add rx queue pausing
From: Jussi Kivilinna @ 2009-08-11 19:57 UTC (permalink / raw)
To: linux-wireless; +Cc: linville, David Brownell, Jussi Kivilinna
Add rx queue pausing to usbnet. This is needed by rndis_wlan so that it can
control rx queue and prevent received packets from being send forward before
rndis_wlan receives and handles 'media connect'-indication. Without this
establishing WPA connections is hard and fail often.
[v2] - removed unneeded use of skb_clone
Cc: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Jussi Kivilinna <jussi.kivilinna@mbnet.fi>
---
drivers/net/usb/usbnet.c | 44 ++++++++++++++++++++++++++++++++++++-
drivers/net/wireless/rndis_wlan.c | 13 ++++++++++-
include/linux/usb/usbnet.h | 6 +++++
3 files changed, 61 insertions(+), 2 deletions(-)
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index af1fe46..7d471fc 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -233,6 +233,11 @@ void usbnet_skb_return (struct usbnet *dev, struct sk_buff *skb)
{
int status;
+ if (test_bit(EVENT_RX_PAUSED, &dev->flags)) {
+ skb_queue_tail(&dev->rxq_pause, skb);
+ return;
+ }
+
skb->protocol = eth_type_trans (skb, dev->net);
dev->net->stats.rx_packets++;
dev->net->stats.rx_bytes += skb->len;
@@ -526,6 +531,41 @@ static void intr_complete (struct urb *urb)
}
/*-------------------------------------------------------------------------*/
+void usbnet_pause_rx(struct usbnet *dev)
+{
+ set_bit(EVENT_RX_PAUSED, &dev->flags);
+
+ if (netif_msg_rx_status(dev))
+ devdbg(dev, "paused rx queue enabled");
+}
+EXPORT_SYMBOL_GPL(usbnet_pause_rx);
+
+void usbnet_resume_rx(struct usbnet *dev)
+{
+ struct sk_buff *skb;
+ int num = 0;
+
+ clear_bit(EVENT_RX_PAUSED, &dev->flags);
+
+ while ((skb = skb_dequeue(&dev->rxq_pause)) != NULL) {
+ usbnet_skb_return(dev, skb);
+ num++;
+ }
+
+ tasklet_schedule(&dev->bh);
+
+ if (netif_msg_rx_status(dev))
+ devdbg(dev, "paused rx queue disabled, %d skbs requeued", num);
+}
+EXPORT_SYMBOL_GPL(usbnet_resume_rx);
+
+void usbnet_purge_paused_rxq(struct usbnet *dev)
+{
+ skb_queue_purge(&dev->rxq_pause);
+}
+EXPORT_SYMBOL_GPL(usbnet_purge_paused_rxq);
+
+/*-------------------------------------------------------------------------*/
// unlink pending rx/tx; completion handlers do all other cleanup
@@ -623,6 +663,8 @@ int usbnet_stop (struct net_device *net)
usb_kill_urb(dev->interrupt);
+ usbnet_purge_paused_rxq(dev);
+
/* deferred work (task, timer, softirq) must also stop.
* can't flush_scheduled_work() until we drop rtnl (later),
* else workers could deadlock; so make workers a NOP.
@@ -1113,7 +1155,6 @@ static void usbnet_bh (unsigned long param)
}
-\f
/*-------------------------------------------------------------------------
*
* USB Device Driver support
@@ -1210,6 +1251,7 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
skb_queue_head_init (&dev->rxq);
skb_queue_head_init (&dev->txq);
skb_queue_head_init (&dev->done);
+ skb_queue_head_init(&dev->rxq_pause);
dev->bh.func = usbnet_bh;
dev->bh.data = (unsigned long) dev;
INIT_WORK (&dev->kevent, kevent);
diff --git a/drivers/net/wireless/rndis_wlan.c b/drivers/net/wireless/rndis_wlan.c
index 828dc18..d42692d 100644
--- a/drivers/net/wireless/rndis_wlan.c
+++ b/drivers/net/wireless/rndis_wlan.c
@@ -1764,8 +1764,15 @@ static int rndis_iw_set_essid(struct net_device *dev,
if (!wrqu->essid.flags || length == 0)
return disassociate(usbdev, 1);
- else
+ else {
+ /* Pause and purge rx queue, so we don't pass packets before
+ * 'media connect'-indication.
+ */
+ usbnet_pause_rx(usbdev);
+ usbnet_purge_paused_rxq(usbdev);
+
return set_essid(usbdev, &ssid);
+ }
}
@@ -2328,6 +2335,8 @@ get_bssid:
memcpy(evt.ap_addr.sa_data, bssid, ETH_ALEN);
wireless_send_event(usbdev->net, SIOCGIWAP, &evt, NULL);
}
+
+ usbnet_resume_rx(usbdev);
}
if (test_and_clear_bit(WORK_LINK_DOWN, &priv->work_pending)) {
@@ -2541,6 +2550,8 @@ static void rndis_wlan_indication(struct usbnet *usbdev, void *ind, int buflen)
switch (msg->status) {
case RNDIS_STATUS_MEDIA_CONNECT:
+ usbnet_pause_rx(usbdev);
+
devinfo(usbdev, "media connect");
/* queue work to avoid recursive calls into rndis_command */
diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h
index de8b4b1..0951425 100644
--- a/include/linux/usb/usbnet.h
+++ b/include/linux/usb/usbnet.h
@@ -53,6 +53,7 @@ struct usbnet {
struct sk_buff_head rxq;
struct sk_buff_head txq;
struct sk_buff_head done;
+ struct sk_buff_head rxq_pause;
struct urb *interrupt;
struct tasklet_struct bh;
@@ -63,6 +64,7 @@ struct usbnet {
# define EVENT_RX_MEMORY 2
# define EVENT_STS_SPLIT 3
# define EVENT_LINK_RESET 4
+# define EVENT_RX_PAUSED 5
};
static inline struct usb_driver *driver_of(struct usb_interface *intf)
@@ -190,6 +192,10 @@ extern void usbnet_defer_kevent (struct usbnet *, int);
extern void usbnet_skb_return (struct usbnet *, struct sk_buff *);
extern void usbnet_unlink_rx_urbs(struct usbnet *);
+extern void usbnet_pause_rx(struct usbnet *);
+extern void usbnet_resume_rx(struct usbnet *);
+extern void usbnet_purge_paused_rxq(struct usbnet *);
+
extern int usbnet_get_settings (struct net_device *net, struct ethtool_cmd *cmd);
extern int usbnet_set_settings (struct net_device *net, struct ethtool_cmd *cmd);
extern u32 usbnet_get_link (struct net_device *net);
^ permalink raw reply related
* [PATCH] b43: Implement RC calibration for rev.2+ LP PHYs
From: Gábor Stefanik @ 2009-08-11 19:53 UTC (permalink / raw)
To: John Linville, Michael Buesch, Larry Finger
Cc: Broadcom Wireless, linux-wireless
Signed-off-by: Gábor Stefanik <netrolller.3d@gmail.com>
---
Larry,
Rev0/1 RC calibration is missing because the spec needs clarification
(lots of cryptic variable names, a struct that is never defined, etc.),
hence the SPEC FIXME.
drivers/net/wireless/b43/phy_lp.c | 86 ++++++++++++++++++++++++++++++++++++-
1 files changed, 85 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/b43/phy_lp.c b/drivers/net/wireless/b43/phy_lp.c
index 1b4f63a..689c932 100644
--- a/drivers/net/wireless/b43/phy_lp.c
+++ b/drivers/net/wireless/b43/phy_lp.c
@@ -605,6 +605,90 @@ static void lpphy_radio_init(struct b43_wldev *dev)
}
}
+static void lpphy_set_rc_cap(struct b43_wldev *dev)
+{
+ u8 rc_cap = dev->phy.lp->rc_cap;
+
+ b43_radio_write(dev, B2062_N_RXBB_CALIB2, max_t(u8, rc_cap-4, 0x80));
+ b43_radio_write(dev, B2062_N_TX_CTL_A, ((rc_cap & 0x1F) >> 1) | 0x80);
+ b43_radio_write(dev, B2062_S_RXG_CNT16, ((rc_cap & 0x1F) >> 2) | 0x80);
+}
+
+static void lpphy_rev0_1_rc_calib(struct b43_wldev *dev)
+{
+ //TODO and SPEC FIXME
+}
+
+static void lpphy_rev2plus_rc_calib(struct b43_wldev *dev)
+{
+ struct ssb_bus *bus = dev->dev->bus;
+ u32 crystal_freq = bus->chipco.pmu.crystalfreq * 1000;
+ u8 tmp = b43_radio_read(dev, B2063_RX_BB_SP8) & 0xFF;
+ int i;
+
+ b43_radio_write(dev, B2063_RX_BB_SP8, 0x0);
+ b43_radio_write(dev, B2063_RC_CALIB_CTL1, 0x7E);
+ b43_radio_mask(dev, B2063_PLL_SP1, 0xF7);
+ b43_radio_write(dev, B2063_RC_CALIB_CTL1, 0x7C);
+ b43_radio_write(dev, B2063_RC_CALIB_CTL2, 0x15);
+ b43_radio_write(dev, B2063_RC_CALIB_CTL3, 0x70);
+ b43_radio_write(dev, B2063_RC_CALIB_CTL4, 0x52);
+ b43_radio_write(dev, B2063_RC_CALIB_CTL5, 0x1);
+ b43_radio_write(dev, B2063_RC_CALIB_CTL1, 0x7D);
+
+ for (i = 0; i < 10000; i++) {
+ if (b43_radio_read(dev, B2063_RC_CALIB_CTL6) & 0x2)
+ break;
+ msleep(1);
+ }
+
+ if (!(b43_radio_read(dev, B2063_RC_CALIB_CTL6) & 0x2))
+ b43_radio_write(dev, B2063_RX_BB_SP8, tmp);
+
+ tmp = b43_radio_read(dev, B2063_TX_BB_SP3) & 0xFF;
+
+ b43_radio_write(dev, B2063_TX_BB_SP3, 0x0);
+ b43_radio_write(dev, B2063_RC_CALIB_CTL1, 0x7E);
+ b43_radio_write(dev, B2063_RC_CALIB_CTL1, 0x7C);
+ b43_radio_write(dev, B2063_RC_CALIB_CTL2, 0x55);
+ b43_radio_write(dev, B2063_RC_CALIB_CTL3, 0x76);
+
+ if (crystal_freq == 24000000) {
+ b43_radio_write(dev, B2063_RC_CALIB_CTL4, 0xFC);
+ b43_radio_write(dev, B2063_RC_CALIB_CTL5, 0x0);
+ } else {
+ b43_radio_write(dev, B2063_RC_CALIB_CTL4, 0x13);
+ b43_radio_write(dev, B2063_RC_CALIB_CTL5, 0x1);
+ }
+
+ b43_radio_write(dev, B2063_PA_SP7, 0x7D);
+
+ for (i = 0; i < 10000; i++) {
+ if (b43_radio_read(dev, B2063_RC_CALIB_CTL6) & 0x2)
+ break;
+ msleep(1);
+ }
+
+ if (!(b43_radio_read(dev, B2063_RC_CALIB_CTL6) & 0x2))
+ b43_radio_write(dev, B2063_TX_BB_SP3, tmp);
+
+ b43_radio_write(dev, B2063_RC_CALIB_CTL1, 0x7E);
+}
+
+static void lpphy_calibrate_rc(struct b43_wldev *dev)
+{
+ struct b43_phy_lp *lpphy = dev->phy.lp;
+
+ if (dev->phy.rev >= 2) {
+ lpphy_rev2plus_rc_calib(dev);
+ } else if (!lpphy->rc_cap) {
+ if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ)
+ lpphy_rev0_1_rc_calib(dev);
+ } else {
+ lpphy_set_rc_cap(dev);
+ }
+}
+
/* Read the TX power control mode from hardware. */
static void lpphy_read_tx_pctl_mode_from_hardware(struct b43_wldev *dev)
{
@@ -780,7 +864,7 @@ static int b43_lpphy_op_init(struct b43_wldev *dev)
lpphy_read_band_sprom(dev); //FIXME should this be in prepare_structs?
lpphy_baseband_init(dev);
lpphy_radio_init(dev);
- //TODO calibrate RC
+ lpphy_calibrate_rc(dev);
//TODO set channel
lpphy_tx_pctl_init(dev);
lpphy_calibration(dev);
--
1.6.2.4
^ permalink raw reply related
* [PATCH] b43: LP-PHY: Implement reading band SPROM
From: Gábor Stefanik @ 2009-08-11 19:47 UTC (permalink / raw)
To: John Linville, Michael Buesch, Larry Finger
Cc: Broadcom Wireless, linux-wireless
Some of the new variables in b43_phy_lp appear to be dead code in
the vendor driver; they will be removed if they remain unused when
LP-PHY implementation is finished.
Signed-off-by: Gábor Stefanik <netrolller.3d@gmail.com>
---
Changes from RFC:
-Fixed << vs. >>= confusion.
-Read RX power offset which I missed in the RFC.
-Corrected the names of the tx_max_rate vars in b43_phy_lp.
phy_lp.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
phy_lp.h | 16 +++++++++++
2 files changed, 100 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/b43/phy_lp.c b/drivers/net/wireless/b43/phy_lp.c
index 43272a8..c40b8a0 100644
--- a/drivers/net/wireless/b43/phy_lp.c
+++ b/drivers/net/wireless/b43/phy_lp.c
@@ -59,6 +59,89 @@ static void b43_lpphy_op_free(struct b43_wldev *dev)
dev->phy.lp = NULL;
}
+static void lpphy_read_band_sprom(struct b43_wldev *dev)
+{
+ struct b43_phy_lp *lpphy = dev->phy.lp;
+ struct ssb_bus *bus = dev->dev->bus;
+ u16 cckpo, maxpwr;
+ u32 ofdmpo;
+ int i;
+
+ if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) {
+ lpphy->tx_isolation_med_band = bus->sprom.tri2g;
+ lpphy->bx_arch = bus->sprom.bxa2g;
+ lpphy->rx_pwr_offset = bus->sprom.rxpo2g;
+ lpphy->rssi_vf = bus->sprom.rssismf2g;
+ lpphy->rssi_vc = bus->sprom.rssismc2g;
+ lpphy->rssi_gs = bus->sprom.rssisav2g;
+ lpphy->txpa[0] = bus->sprom.pa0b0;
+ lpphy->txpa[1] = bus->sprom.pa0b1;
+ lpphy->txpa[2] = bus->sprom.pa0b2;
+ maxpwr = bus->sprom.maxpwr_bg;
+ lpphy->max_tx_pwr_med_band = maxpwr;
+ cckpo = bus->sprom.cck2gpo;
+ ofdmpo = bus->sprom.ofdm2gpo;
+ if (cckpo) {
+ for (i = 0; i < 4; i++) {
+ lpphy->tx_max_rate[i] =
+ maxpwr - (ofdmpo & 0xF) * 2;
+ ofdmpo >>= 4;
+ }
+ ofdmpo = bus->sprom.ofdm2gpo;
+ for (i = 4; i < 15; i++) {
+ lpphy->tx_max_rate[i] =
+ maxpwr - (ofdmpo & 0xF) * 2;
+ ofdmpo >>= 4;
+ }
+ } else {
+ ofdmpo &= 0xFF;
+ for (i = 0; i < 4; i++)
+ lpphy->tx_max_rate[i] = maxpwr;
+ for (i = 4; i < 15; i++)
+ lpphy->tx_max_rate[i] = maxpwr - ofdmpo;
+ }
+ } else { /* 5GHz */
+ lpphy->tx_isolation_low_band = bus->sprom.tri5gl;
+ lpphy->tx_isolation_med_band = bus->sprom.tri5g;
+ lpphy->tx_isolation_hi_band = bus->sprom.tri5gh;
+ lpphy->bx_arch = bus->sprom.bxa5g;
+ lpphy->rx_pwr_offset = bus->sprom.rxpo5g;
+ lpphy->rssi_vf = bus->sprom.rssismf5g;
+ lpphy->rssi_vc = bus->sprom.rssismc5g;
+ lpphy->rssi_gs = bus->sprom.rssisav5g;
+ lpphy->txpa[0] = bus->sprom.pa1b0;
+ lpphy->txpa[1] = bus->sprom.pa1b1;
+ lpphy->txpa[2] = bus->sprom.pa1b2;
+ lpphy->txpal[0] = bus->sprom.pa1lob0;
+ lpphy->txpal[1] = bus->sprom.pa1lob1;
+ lpphy->txpal[2] = bus->sprom.pa1lob2;
+ lpphy->txpah[0] = bus->sprom.pa1hib0;
+ lpphy->txpah[1] = bus->sprom.pa1hib1;
+ lpphy->txpah[2] = bus->sprom.pa1hib2;
+ maxpwr = bus->sprom.maxpwr_al;
+ ofdmpo = bus->sprom.ofdm5glpo;
+ lpphy->max_tx_pwr_low_band = maxpwr;
+ for (i = 4; i < 12; i++) {
+ lpphy->tx_max_ratel[i] = maxpwr - (ofdmpo & 0xF) * 2;
+ ofdmpo >>= 4;
+ }
+ maxpwr = bus->sprom.maxpwr_a;
+ ofdmpo = bus->sprom.ofdm5gpo;
+ lpphy->max_tx_pwr_med_band = maxpwr;
+ for (i = 4; i < 12; i++) {
+ lpphy->tx_max_rate[i] = maxpwr - (ofdmpo & 0xF) * 2;
+ ofdmpo >>= 4;
+ }
+ maxpwr = bus->sprom.maxpwr_ah;
+ ofdmpo = bus->sprom.ofdm5ghpo;
+ lpphy->max_tx_pwr_hi_band = maxpwr;
+ for (i = 4; i < 12; i++) {
+ lpphy->tx_max_rateh[i] = maxpwr - (ofdmpo & 0xF) * 2;
+ ofdmpo >>= 4;
+ }
+ }
+}
+
static void lpphy_adjust_gain_table(struct b43_wldev *dev)
{
struct b43_phy_lp *lpphy = dev->phy.lp;
@@ -694,7 +777,7 @@ static void lpphy_tx_pctl_init(struct b43_wldev *dev)
static int b43_lpphy_op_init(struct b43_wldev *dev)
{
- /* TODO: band SPROM */
+ lpphy_read_band_sprom(dev); //FIXME should this be in prepare_structs?
lpphy_baseband_init(dev);
lpphy_radio_init(dev);
//TODO calibrate RC
diff --git a/drivers/net/wireless/b43/phy_lp.h b/drivers/net/wireless/b43/phy_lp.h
index 13d89ea..0461d5b 100644
--- a/drivers/net/wireless/b43/phy_lp.h
+++ b/drivers/net/wireless/b43/phy_lp.h
@@ -831,6 +831,22 @@ struct b43_phy_lp {
/* Transmit isolation high band */
u8 tx_isolation_hi_band; /* FIXME initial value? */
+ /* Max transmit power medium band */
+ u16 max_tx_pwr_med_band;
+ /* Max transmit power low band */
+ u16 max_tx_pwr_low_band;
+ /* Max transmit power high band */
+ u16 max_tx_pwr_hi_band;
+
+ /* FIXME What are these used for? */
+ /* FIXME Is 15 the correct array size? */
+ u16 tx_max_rate[15];
+ u16 tx_max_ratel[15];
+ u16 tx_max_rateh[15];
+
+ /* Transmit power arrays */
+ s16 txpa[3], txpal[3], txpah[3];
+
/* Receive power offset */
u8 rx_pwr_offset; /* FIXME initial value? */
--
1.6.2.4
^ permalink raw reply related
* Re: [PATCH] wl1271: fix compiler warnings on 64 bit archs
From: Luciano Coelho @ 2009-08-11 19:43 UTC (permalink / raw)
To: ext John W. Linville
Cc: ext Stephen Rothwell, linux-wireless@vger.kernel.org,
linux-next@vger.kernel.org, linux-kernel@vger.kernel.org
In-Reply-To: <20090811191518.GI2634@tuxdriver.com>
ext John W. Linville wrote:
> On Tue, Aug 11, 2009 at 09:41:11PM +0300, Luciano Coelho wrote:
>
>> Thanks! I didn't know about the z length modifier for printf (everyday
>> learning something new!), I should have checked the manpage. I'll fix
>> this and send v2 of my patch.
>>
>
> I've got it fixed-up already...
>
Thanks, I noticed that it was already fixed in wireless-next after I had
already sent v2. Sorry for the trouble.
--
Cheers,
Luca.
^ permalink raw reply
* Re: [PATCH] wl1271: fix compiler warnings on 64 bit archs
From: John W. Linville @ 2009-08-11 19:15 UTC (permalink / raw)
To: Luciano Coelho
Cc: ext Stephen Rothwell, linux-wireless@vger.kernel.org,
linux-next@vger.kernel.org, linux-kernel@vger.kernel.org
In-Reply-To: <4A81BB47.2020607@nokia.com>
On Tue, Aug 11, 2009 at 09:41:11PM +0300, Luciano Coelho wrote:
> ext Stephen Rothwell wrote:
>> Hi Luciano,
>>
>> On Tue, 11 Aug 2009 11:58:27 +0300 Luciano Coelho <luciano.coelho@nokia.com> wrote:
>>
>>> +++ b/drivers/net/wireless/wl12xx/wl1271_boot.c
>>> @@ -100,8 +100,8 @@ static int wl1271_boot_upload_firmware_chunk(struct wl1271 *wl, void *buf,
>>> wl1271_debug(DEBUG_BOOT, "starting firmware upload");
>>> - wl1271_debug(DEBUG_BOOT, "fw_data_len %d chunk_size %d",
>>> fw_data_len,
>>> - CHUNK_SIZE);
>>> + wl1271_debug(DEBUG_BOOT, "fw_data_len %d chunk_size %d",
>>> + (u32) fw_data_len, CHUNK_SIZE);
>>>
>>
>> fw_data_len is a size_t and so should be printed with %zd.
>>
>>
>>> @@ -148,7 +148,7 @@ static int wl1271_boot_upload_firmware_chunk(struct wl1271 *wl, void *buf,
>>> addr = dest + chunk_num * CHUNK_SIZE;
>>> p = buf + chunk_num * CHUNK_SIZE;
>>> wl1271_debug(DEBUG_BOOT, "uploading fw last chunk (%d B) 0x%p to 0x%x",
>>> - fw_data_len % CHUNK_SIZE, p, addr);
>>> + (u32) fw_data_len % CHUNK_SIZE, p, addr);
>>>
>>
>> ditto.
>>
>
> Thanks! I didn't know about the z length modifier for printf (everyday
> learning something new!), I should have checked the manpage. I'll fix
> this and send v2 of my patch.
I've got it fixed-up already...
John
--
John W. Linville Someday the world will need a hero, and you
linville@tuxdriver.com might be all we have. Be ready.
^ permalink raw reply
* [PATCH v2] wl1271: fix compiler warnings on 64 bit archs
From: Luciano Coelho @ 2009-08-11 19:20 UTC (permalink / raw)
To: linux-wireless; +Cc: linville, linux-next, linux-kernel, sfr
There were a few warnings when compiling the wl1271 driver on 64 bit
architectures. This was due to size mismatch of integers.
This commit fixes the following warnings:
drivers/net/wireless/wl12xx/wl1271_main.c: In function 'wl1271_irq_work':
drivers/net/wireless/wl12xx/wl1271_main.c:184: warning: large integer implicitly truncated to unsigned type
drivers/net/wireless/wl12xx/wl1271_boot.c: In function 'wl1271_boot_upload_firmware_chunk':
drivers/net/wireless/wl12xx/wl1271_boot.c:103: warning: format '%d' expects type 'int', but argument 2 has type 'size_t'
drivers/net/wireless/wl12xx/wl1271_boot.c:150: warning: format '%d' expects type 'int', but argument 2 has type 'size_t'
drivers/net/wireless/wl12xx/wl1271_boot.c: In function 'wl1271_boot_enable_interrupts':
drivers/net/wireless/wl12xx/wl1271_boot.c:278: warning: large integer implicitly truncated to unsigned type
Reported-by: Stephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: Luciano Coelho <luciano.coelho@nokia.com>
---
drivers/net/wireless/wl12xx/wl1271_boot.c | 9 +++++----
drivers/net/wireless/wl12xx/wl1271_main.c | 3 ++-
2 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/drivers/net/wireless/wl12xx/wl1271_boot.c b/drivers/net/wireless/wl12xx/wl1271_boot.c
index 4c22f25..8228ef4 100644
--- a/drivers/net/wireless/wl12xx/wl1271_boot.c
+++ b/drivers/net/wireless/wl12xx/wl1271_boot.c
@@ -100,8 +100,8 @@ static int wl1271_boot_upload_firmware_chunk(struct wl1271 *wl, void *buf,
wl1271_debug(DEBUG_BOOT, "starting firmware upload");
- wl1271_debug(DEBUG_BOOT, "fw_data_len %d chunk_size %d", fw_data_len,
- CHUNK_SIZE);
+ wl1271_debug(DEBUG_BOOT, "fw_data_len %zd chunk_size %d",
+ fw_data_len, CHUNK_SIZE);
if ((fw_data_len % 4) != 0) {
@@ -147,7 +147,7 @@ static int wl1271_boot_upload_firmware_chunk(struct wl1271 *wl, void *buf,
/* 10.4 upload the last chunk */
addr = dest + chunk_num * CHUNK_SIZE;
p = buf + chunk_num * CHUNK_SIZE;
- wl1271_debug(DEBUG_BOOT, "uploading fw last chunk (%d B) 0x%p to 0x%x",
+ wl1271_debug(DEBUG_BOOT, "uploading fw last chunk (%zd B) 0x%p to 0x%x",
fw_data_len % CHUNK_SIZE, p, addr);
wl1271_spi_mem_write(wl, addr, p, fw_data_len % CHUNK_SIZE);
@@ -275,7 +275,8 @@ static int wl1271_boot_upload_nvs(struct wl1271 *wl)
static void wl1271_boot_enable_interrupts(struct wl1271 *wl)
{
enable_irq(wl->irq);
- wl1271_reg_write32(wl, ACX_REG_INTERRUPT_MASK, ~(WL1271_INTR_MASK));
+ wl1271_reg_write32(wl, ACX_REG_INTERRUPT_MASK,
+ WL1271_ACX_INTR_ALL & ~(WL1271_INTR_MASK));
wl1271_reg_write32(wl, HI_CFG, HI_CFG_DEF_VAL);
}
diff --git a/drivers/net/wireless/wl12xx/wl1271_main.c b/drivers/net/wireless/wl12xx/wl1271_main.c
index 3bb45ce..4102d59 100644
--- a/drivers/net/wireless/wl12xx/wl1271_main.c
+++ b/drivers/net/wireless/wl12xx/wl1271_main.c
@@ -181,7 +181,8 @@ static void wl1271_irq_work(struct work_struct *work)
} while (intr && --ctr);
out_sleep:
- wl1271_reg_write32(wl, ACX_REG_INTERRUPT_MASK, ~(WL1271_INTR_MASK));
+ wl1271_reg_write32(wl, ACX_REG_INTERRUPT_MASK,
+ WL1271_ACX_INTR_ALL & ~(WL1271_INTR_MASK));
wl1271_ps_elp_sleep(wl);
out:
--
1.6.0.4
^ permalink raw reply related
* Re: diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c
From: John W. Linville @ 2009-08-11 18:47 UTC (permalink / raw)
To: david woo
Cc: Johannes Berg, javier@cozybit.com, linux-wireless@vger.kernel.org,
andrey@cozybit.com, devel@lists.open80211s.org
In-Reply-To: <4A815A3B.3080404@realsil.com.cn>
David, thanks for the patch! Unfortunately, I'm not really sure
what you are fixing. Could you change your changelog to explain what
problem you are fixing? Just telling me that you changed something
doesn't tell me what was wrong with it in the first place.
Also, please make sure you follow the suggestions here:
http://linux.yyz.us/patch-format.html
I look forward to your next post...thanks!
John
On Tue, Aug 11, 2009 at 07:47:07PM +0800, david woo wrote:
> Johannes Berg 写道:
> > On Tue, 2009-08-11 at 18:22 +0800, David Woo wrote:
> >> static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata,
> >> struct ieee80211_mgmt *mgmt,
> >> - u8 *preq_elem, u32 metric)
> >> -{
> >> + u8 *preq_elem, u32 metric) {
> >
> > And other than adding this coding style mistake, what does this patch
> > do?
> >
> > johannes
>
> It's my first time to submit the patch file, I just mean to submit the attched
> patch file.
>
> [PATCH] mac80211: Fix preq frame process and peer link frame baselen.
>
> This patch is just to fix rreq reply condition, and peer link confirm frame baselen.
>
> Signed-off-by: David Woo <xinhua_wu@realsil.com.cn>
> ---
> diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c
> index e1a763e..c065854 100644
> --- a/net/mac80211/mesh_hwmp.c
> +++ b/net/mac80211/mesh_hwmp.c
> @@ -397,7 +397,8 @@ static u32 hwmp_route_info_get(struct ieee80211_sub_if_data *sdata,
>
> static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata,
> struct ieee80211_mgmt *mgmt,
> - u8 *preq_elem, u32 metric) {
> + u8 *preq_elem, u32 metric)
> +{
> struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
> struct mesh_path *mpath;
> u8 *dst_addr, *orig_addr;
> @@ -430,7 +431,7 @@ static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata,
> if ((!(mpath->flags & MESH_PATH_DSN_VALID)) ||
> DSN_LT(mpath->dsn, dst_dsn)) {
> mpath->dsn = dst_dsn;
> - mpath->flags &= MESH_PATH_DSN_VALID;
> + mpath->flags |= MESH_PATH_DSN_VALID;
> } else if ((!(dst_flags & MP_F_DO)) &&
> (mpath->flags & MESH_PATH_ACTIVE)) {
> reply = true;
> @@ -447,14 +448,15 @@ static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata,
>
> if (reply) {
> lifetime = PREQ_IE_LIFETIME(preq_elem);
> - ttl = ifmsh->mshcfg.dot11MeshTTL;
> - if (ttl != 0)
> + ttl = PREQ_IE_TTL(preq_elem);
> + if (ttl != 0) {
> + ttl = ifmsh->mshcfg.dot11MeshTTL;
> mesh_path_sel_frame_tx(MPATH_PREP, 0, dst_addr,
> cpu_to_le32(dst_dsn), 0, orig_addr,
> cpu_to_le32(orig_dsn), mgmt->sa, 0, ttl,
> cpu_to_le32(lifetime), cpu_to_le32(metric),
> 0, sdata);
> - else
> + } else
> ifmsh->mshstats.dropped_frames_ttl++;
> }
>
> diff --git a/net/mac80211/mesh_plink.c b/net/mac80211/mesh_plink.c
> index cb14253..ffcbad7 100644
> --- a/net/mac80211/mesh_plink.c
> +++ b/net/mac80211/mesh_plink.c
> @@ -409,7 +409,7 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
> baselen = (u8 *) mgmt->u.action.u.plink_action.variable - (u8 *) mgmt;
> if (mgmt->u.action.u.plink_action.action_code == PLINK_CONFIRM) {
> baseaddr += 4;
> - baselen -= 4;
> + baselen += 4;
> }
> ieee802_11_parse_elems(baseaddr, len - baselen, &elems);
> if (!elems.peer_link) {
>
>
> David
>
> diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c
> index e1a763e..c065854 100644
> --- a/net/mac80211/mesh_hwmp.c
> +++ b/net/mac80211/mesh_hwmp.c
> @@ -397,7 +397,8 @@ static u32 hwmp_route_info_get(struct ieee80211_sub_if_data *sdata,
>
> static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata,
> struct ieee80211_mgmt *mgmt,
> - u8 *preq_elem, u32 metric) {
> + u8 *preq_elem, u32 metric)
> +{
> struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
> struct mesh_path *mpath;
> u8 *dst_addr, *orig_addr;
> @@ -430,7 +431,7 @@ static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata,
> if ((!(mpath->flags & MESH_PATH_DSN_VALID)) ||
> DSN_LT(mpath->dsn, dst_dsn)) {
> mpath->dsn = dst_dsn;
> - mpath->flags &= MESH_PATH_DSN_VALID;
> + mpath->flags |= MESH_PATH_DSN_VALID;
> } else if ((!(dst_flags & MP_F_DO)) &&
> (mpath->flags & MESH_PATH_ACTIVE)) {
> reply = true;
> @@ -447,14 +448,15 @@ static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata,
>
> if (reply) {
> lifetime = PREQ_IE_LIFETIME(preq_elem);
> - ttl = ifmsh->mshcfg.dot11MeshTTL;
> - if (ttl != 0)
> + ttl = PREQ_IE_TTL(preq_elem);
> + if (ttl != 0) {
> + ttl = ifmsh->mshcfg.dot11MeshTTL;
> mesh_path_sel_frame_tx(MPATH_PREP, 0, dst_addr,
> cpu_to_le32(dst_dsn), 0, orig_addr,
> cpu_to_le32(orig_dsn), mgmt->sa, 0, ttl,
> cpu_to_le32(lifetime), cpu_to_le32(metric),
> 0, sdata);
> - else
> + } else
> ifmsh->mshstats.dropped_frames_ttl++;
> }
>
> diff --git a/net/mac80211/mesh_plink.c b/net/mac80211/mesh_plink.c
> index cb14253..ffcbad7 100644
> --- a/net/mac80211/mesh_plink.c
> +++ b/net/mac80211/mesh_plink.c
> @@ -409,7 +409,7 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
> baselen = (u8 *) mgmt->u.action.u.plink_action.variable - (u8 *) mgmt;
> if (mgmt->u.action.u.plink_action.action_code == PLINK_CONFIRM) {
> baseaddr += 4;
> - baselen -= 4;
> + baselen += 4;
> }
> ieee802_11_parse_elems(baseaddr, len - baselen, &elems);
> if (!elems.peer_link) {
--
John W. Linville Someday the world will need a hero, and you
linville@tuxdriver.com might be all we have. Be ready.
^ permalink raw reply
* Re: [PATCH] wl1271: fix compiler warnings on 64 bit archs
From: Randy Dunlap @ 2009-08-11 18:45 UTC (permalink / raw)
To: Luciano Coelho
Cc: ext Stephen Rothwell, linux-wireless@vger.kernel.org,
linville@tuxdriver.com, linux-next@vger.kernel.org,
linux-kernel@vger.kernel.org
In-Reply-To: <4A81BB47.2020607@nokia.com>
On Tue, 11 Aug 2009 21:41:11 +0300 Luciano Coelho wrote:
> ext Stephen Rothwell wrote:
> > Hi Luciano,
> >
> > On Tue, 11 Aug 2009 11:58:27 +0300 Luciano Coelho <luciano.coelho@nokia.com> wrote:
> >
> >> +++ b/drivers/net/wireless/wl12xx/wl1271_boot.c
> >> @@ -100,8 +100,8 @@ static int wl1271_boot_upload_firmware_chunk(struct wl1271 *wl, void *buf,
> >>
> >> wl1271_debug(DEBUG_BOOT, "starting firmware upload");
> >>
> >> - wl1271_debug(DEBUG_BOOT, "fw_data_len %d chunk_size %d", fw_data_len,
> >> - CHUNK_SIZE);
> >> + wl1271_debug(DEBUG_BOOT, "fw_data_len %d chunk_size %d",
> >> + (u32) fw_data_len, CHUNK_SIZE);
> >>
> >
> > fw_data_len is a size_t and so should be printed with %zd.
> >
> >
> >> @@ -148,7 +148,7 @@ static int wl1271_boot_upload_firmware_chunk(struct wl1271 *wl, void *buf,
> >> addr = dest + chunk_num * CHUNK_SIZE;
> >> p = buf + chunk_num * CHUNK_SIZE;
> >> wl1271_debug(DEBUG_BOOT, "uploading fw last chunk (%d B) 0x%p to 0x%x",
> >> - fw_data_len % CHUNK_SIZE, p, addr);
> >> + (u32) fw_data_len % CHUNK_SIZE, p, addr);
> >>
> >
> > ditto.
> >
>
> Thanks! I didn't know about the z length modifier for printf (everyday
> learning something new!), I should have checked the manpage. I'll fix
> this and send v2 of my patch.
man page is fine, but you can also check (in the kernel source tree)
Documentation/printk-formats.txt
---
~Randy
LPC 2009, Sept. 23-25, Portland, Oregon
http://linuxplumbersconf.org/2009/
^ permalink raw reply
* pull request: wireless-2.6 2009-08-11
From: John W. Linville @ 2009-08-11 18:36 UTC (permalink / raw)
To: davem; +Cc: linux-wireless, netdev, linux-kernel
Dave,
Here are a couple more minor fixes intended for 2.6.31. Hopefully we
are winding-down!
Please let me know if there are problems!
John
---
Individual patches are available here:
http://www.kernel.org/pub/linux/kernel/people/linville/wireless-2.6/
---
The following changes since commit 973507cb8610d4c84f090d5f1f0ca54fa0559d27:
roel kluin (1):
mlx4_en: Fix read buffer overflow in mlx4_en_complete_rx_desc()
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6.git master
Christian Lamparter (1):
ar9170usb: fix spurious firmware related message
Dan Carpenter (1):
ar9170: fix read & write outside array bounds
drivers/net/wireless/ath/ar9170/main.c | 5 +++--
drivers/net/wireless/ath/ar9170/usb.c | 6 +++++-
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/drivers/net/wireless/ath/ar9170/main.c b/drivers/net/wireless/ath/ar9170/main.c
index 9d38cf6..88c3d85 100644
--- a/drivers/net/wireless/ath/ar9170/main.c
+++ b/drivers/net/wireless/ath/ar9170/main.c
@@ -1967,13 +1967,14 @@ static int ar9170_conf_tx(struct ieee80211_hw *hw, u16 queue,
int ret;
mutex_lock(&ar->mutex);
- if ((param) && !(queue > __AR9170_NUM_TXQ)) {
+ if (queue < __AR9170_NUM_TXQ) {
memcpy(&ar->edcf[ar9170_qos_hwmap[queue]],
param, sizeof(*param));
ret = ar9170_set_qos(ar);
- } else
+ } else {
ret = -EINVAL;
+ }
mutex_unlock(&ar->mutex);
return ret;
diff --git a/drivers/net/wireless/ath/ar9170/usb.c b/drivers/net/wireless/ath/ar9170/usb.c
index 754b1f8..007eb85 100644
--- a/drivers/net/wireless/ath/ar9170/usb.c
+++ b/drivers/net/wireless/ath/ar9170/usb.c
@@ -598,11 +598,15 @@ static int ar9170_usb_request_firmware(struct ar9170_usb *aru)
err = request_firmware(&aru->init_values, "ar9170-1.fw",
&aru->udev->dev);
+ if (err) {
+ dev_err(&aru->udev->dev, "file with init values not found.\n");
+ return err;
+ }
err = request_firmware(&aru->firmware, "ar9170-2.fw", &aru->udev->dev);
if (err) {
release_firmware(aru->init_values);
- dev_err(&aru->udev->dev, "file with init values not found.\n");
+ dev_err(&aru->udev->dev, "firmware file not found.\n");
return err;
}
--
John W. Linville Someday the world will need a hero, and you
linville@tuxdriver.com might be all we have. Be ready.
^ permalink raw reply related
* Re: [PATCH] wl1271: fix compiler warnings on 64 bit archs
From: Luciano Coelho @ 2009-08-11 18:41 UTC (permalink / raw)
To: ext Stephen Rothwell
Cc: linux-wireless@vger.kernel.org, linville@tuxdriver.com,
linux-next@vger.kernel.org, linux-kernel@vger.kernel.org
In-Reply-To: <20090811200746.cde6aed9.sfr@canb.auug.org.au>
ext Stephen Rothwell wrote:
> Hi Luciano,
>
> On Tue, 11 Aug 2009 11:58:27 +0300 Luciano Coelho <luciano.coelho@nokia.com> wrote:
>
>> +++ b/drivers/net/wireless/wl12xx/wl1271_boot.c
>> @@ -100,8 +100,8 @@ static int wl1271_boot_upload_firmware_chunk(struct wl1271 *wl, void *buf,
>>
>> wl1271_debug(DEBUG_BOOT, "starting firmware upload");
>>
>> - wl1271_debug(DEBUG_BOOT, "fw_data_len %d chunk_size %d", fw_data_len,
>> - CHUNK_SIZE);
>> + wl1271_debug(DEBUG_BOOT, "fw_data_len %d chunk_size %d",
>> + (u32) fw_data_len, CHUNK_SIZE);
>>
>
> fw_data_len is a size_t and so should be printed with %zd.
>
>
>> @@ -148,7 +148,7 @@ static int wl1271_boot_upload_firmware_chunk(struct wl1271 *wl, void *buf,
>> addr = dest + chunk_num * CHUNK_SIZE;
>> p = buf + chunk_num * CHUNK_SIZE;
>> wl1271_debug(DEBUG_BOOT, "uploading fw last chunk (%d B) 0x%p to 0x%x",
>> - fw_data_len % CHUNK_SIZE, p, addr);
>> + (u32) fw_data_len % CHUNK_SIZE, p, addr);
>>
>
> ditto.
>
Thanks! I didn't know about the z length modifier for printf (everyday
learning something new!), I should have checked the manpage. I'll fix
this and send v2 of my patch.
--
Cheers,
Luca.
^ permalink raw reply
* [PATCH] ath9k: Prevent read buffer overflow
From: Roel Kluin @ 2009-08-11 18:40 UTC (permalink / raw)
To: Luis R. Rodriguez, linux-wireless, ath9k-devel, Andrew Morton
Prevent a read from valid_rate_index[] with a negative index
Signed-off-by: Roel Kluin <roel.kluin@gmail.com>
---
Maybe we should add this?
diff --git a/drivers/net/wireless/ath/ath9k/rc.c b/drivers/net/wireless/ath/ath9k/rc.c
index ba06e78..a67b7f6 100644
--- a/drivers/net/wireless/ath/ath9k/rc.c
+++ b/drivers/net/wireless/ath/ath9k/rc.c
@@ -1458,7 +1458,7 @@ static void ath_rc_init(struct ath_softc *sc,
ath_rc_priv->rate_max_phy = ath_rc_priv->valid_phy_rateidx[i][j-1];
}
ASSERT(ath_rc_priv->rate_table_size <= RATE_TABLE_SIZE);
- ASSERT(k <= RATE_TABLE_SIZE);
+ ASSERT(k <= RATE_TABLE_SIZE && k >= 4);
ath_rc_priv->max_valid_rate = k;
ath_rc_sort_validrates(rate_table, ath_rc_priv);
^ permalink raw reply related
* Re: [PATCH] ath9k: Fix read buffer overflow
From: John W. Linville @ 2009-08-11 18:25 UTC (permalink / raw)
To: Roel Kluin
Cc: Jouni Malinen, linux-wireless, ath9k-devel, Andrew Morton,
m.sujith, mcgrof
In-Reply-To: <4A811464.4030108@gmail.com>
Comments from the ath9k crowd?
On Tue, Aug 11, 2009 at 08:49:08AM +0200, Roel Kluin wrote:
> Prevent a read of powInfo[-1] in the first iteration.
>
> Signed-off-by: Roel Kluin <roel.kluin@gmail.com>
> ---
> diff --git a/drivers/net/wireless/ath/ath9k/eeprom.c b/drivers/net/wireless/ath/ath9k/eeprom.c
> index ce0e86c..e67db2c 100644
> --- a/drivers/net/wireless/ath/ath9k/eeprom.c
> +++ b/drivers/net/wireless/ath/ath9k/eeprom.c
> @@ -150,10 +150,10 @@ static void ath9k_hw_get_legacy_target_powers(struct ath_hw *ah,
> IS_CHAN_2GHZ(chan))) {
> matchIndex = i;
> break;
> - } else if ((freq < ath9k_hw_fbin2freq(powInfo[i].bChannel,
> - IS_CHAN_2GHZ(chan))) &&
> - (freq > ath9k_hw_fbin2freq(powInfo[i - 1].bChannel,
> - IS_CHAN_2GHZ(chan)))) {
> + } else if (freq < ath9k_hw_fbin2freq(powInfo[i].bChannel,
> + IS_CHAN_2GHZ(chan)) && i > 0 &&
> + freq > ath9k_hw_fbin2freq(powInfo[i - 1].bChannel,
> + IS_CHAN_2GHZ(chan))) {
> lowIndex = i - 1;
> break;
> }
> @@ -268,10 +268,10 @@ static void ath9k_hw_get_target_powers(struct ath_hw *ah,
> matchIndex = i;
> break;
> } else
> - if ((freq < ath9k_hw_fbin2freq(powInfo[i].bChannel,
> - IS_CHAN_2GHZ(chan))) &&
> - (freq > ath9k_hw_fbin2freq(powInfo[i - 1].bChannel,
> - IS_CHAN_2GHZ(chan)))) {
> + if (freq < ath9k_hw_fbin2freq(powInfo[i].bChannel,
> + IS_CHAN_2GHZ(chan)) && i > 0 &&
> + freq > ath9k_hw_fbin2freq(powInfo[i - 1].bChannel,
> + IS_CHAN_2GHZ(chan))) {
> lowIndex = i - 1;
> break;
> }
>
--
John W. Linville Someday the world will need a hero, and you
linville@tuxdriver.com might be all we have. Be ready.
^ permalink raw reply
* Re: Libertas: Association request to the driver failed
From: John W. Linville @ 2009-08-11 18:24 UTC (permalink / raw)
To: Roel Kluin; +Cc: Daniel Mack, libertas-dev, linux-wireless, linux-kernel, dcbw
In-Reply-To: <4A811776.8090003@gmail.com>
Comments from the libertas crowd? This seems a bit long for this
part of the cycle.
Should we just revert the original patch, then reapply it with this
one for 2.6.32?
John
On Tue, Aug 11, 2009 at 09:02:14AM +0200, Roel Kluin wrote:
> The size of the tmp buffer was too small, causing a regression
>
> rates->rates has an arraysize of 1, so a memcpy with
> MAX_RATES (14) was already causing reads out of bounds.
>
> In get_common_rates() the memset/memcpy can be moved upwards.
>
> Signed-off-by: Roel Kluin <roel.kluin@gmail.com>
> Tested-by: Daniel Mack <daniel@caiaq.de>
> ---
> > Delta patch, please...
>
> Here,
>
> diff --git a/drivers/net/wireless/libertas/assoc.c b/drivers/net/wireless/libertas/assoc.c
> index d699737..ba0164a 100644
> --- a/drivers/net/wireless/libertas/assoc.c
> +++ b/drivers/net/wireless/libertas/assoc.c
> @@ -44,8 +44,8 @@ static int get_common_rates(struct lbs_private *priv,
> u16 *rates_size)
> {
> u8 *card_rates = lbs_bg_rates;
> - int ret = 0, i, j;
> - u8 tmp[(ARRAY_SIZE(lbs_bg_rates) - 1) * (*rates_size - 1)];
> + int i, j;
> + u8 tmp[MAX_RATES * ARRAY_SIZE(lbs_bg_rates)];
> size_t tmp_size = 0;
>
> /* For each rate in card_rates that exists in rate1, copy to tmp */
> @@ -62,20 +62,23 @@ static int get_common_rates(struct lbs_private *priv,
> lbs_deb_hex(LBS_DEB_JOIN, "common rates", tmp, tmp_size);
> lbs_deb_join("TX data rate 0x%02x\n", priv->cur_rate);
>
> + memset(rates, 0, *rates_size);
> + *rates_size = min_t(u16, tmp_size, *rates_size);
> + memcpy(rates, tmp, *rates_size);
> +
> if (!priv->enablehwauto) {
> for (i = 0; i < tmp_size; i++) {
> if (tmp[i] == priv->cur_rate)
> - goto done;
> + break;
> + }
> + if (i == tmp_size) {
> + lbs_pr_alert("Previously set fixed data rate %#x isn't "
> + "compatible with the network.\n",
> + priv->cur_rate);
> + return -1;
> }
> - lbs_pr_alert("Previously set fixed data rate %#x isn't "
> - "compatible with the network.\n", priv->cur_rate);
> - ret = -1;
> }
> -done:
> - memset(rates, 0, *rates_size);
> - *rates_size = min_t(int, tmp_size, *rates_size);
> - memcpy(rates, tmp, *rates_size);
> - return ret;
> + return 0;
> }
>
>
> @@ -319,8 +322,8 @@ static int lbs_associate(struct lbs_private *priv,
>
> rates = (struct mrvl_ie_rates_param_set *) pos;
> rates->header.type = cpu_to_le16(TLV_TYPE_RATES);
> - memcpy(&rates->rates, &bss->rates, MAX_RATES);
> tmplen = min_t(u16, ARRAY_SIZE(rates->rates), MAX_RATES);
> + memcpy(&rates->rates, &bss->rates, tmplen);
> if (get_common_rates(priv, rates->rates, &tmplen)) {
> ret = -1;
> goto done;
>
--
John W. Linville Someday the world will need a hero, and you
linville@tuxdriver.com might be all we have. Be ready.
^ permalink raw reply
* Re: [PATCH 2.6.30] iwl3945: fix rfkill switch
From: reinette chatre @ 2009-08-11 18:08 UTC (permalink / raw)
To: Stanislaw Gruszka
Cc: linux-wireless@vger.kernel.org, Zhu, Yi, John W. Linville,
stable@kernel.org
In-Reply-To: <20090811140908.GA3235@dhcp-lab-161.englab.brq.redhat.com>
Hi Stanislaw,
Thank you for your patience ...
On Tue, 2009-08-11 at 07:09 -0700, Stanislaw Gruszka wrote:
> On Mon, Aug 10, 2009 at 09:44:52AM -0700, reinette chatre wrote:
> > Yes. I assume that what happens here is that rfkill notifies user that
> > state changes to RFKILL_STATE_UNBLOCKED. In your new patch the driver
> > will now clear STATUS_RF_KILL_SW, with STATUS_RF_KILL_HW still being
> > set. So, in this run, after iwl_rfkill_soft_rf_kill is called there will
> > be a state mismatch with rfkill thinking the system is unblocked while
> > the driver has it as hard blocked. This is not right.
>
> In such case we return -EBUSY from iwl_rfkill_soft_rf_kill() - rfkill
> state not change.
oh - right - sorry
> I made a comment it will be HARD_BLOCKED, this
> is not true anymore, it can be also in state SOFT_BLOCKED .
How so? Isn't the idea behind toggle_radio that the SOFT_BLOCKED state
changes? In this case when we get a new state of UNBLOCKED then I do not
understand how SOFT_BLOCKED can be true also.
> However
> comment was true with previous version of the patch for 2.6.29, where
> there was no HARD -> SOFT downgrade and that part was called only when
> rfkill state was HARD_BLOCKED.
>
> > Can this be fixed by adding a iwl_rfkill_set_hw_state in this run?
>
> We can not call iwl_rfkill_set_hw_state in iwl_rfkill_soft_rt_kill
> as rfkill->muttex is taken. We eventually can force state in the same ugly
> way as is done for case RFKILL_STATE_SOFT_BLOCKED and I think, this is good
> idea :) , below not tested delta patch:
>
This just seems to mess with the rfkill internals even more. Can this
not be avoided?
> diff --git a/drivers/net/wireless/iwlwifi/iwl-rfkill.c b/drivers/net/wireless/iwlwifi/iwl-rfkill.c
> index d6b6098..636c04a 100644
> --- a/drivers/net/wireless/iwlwifi/iwl-rfkill.c
> +++ b/drivers/net/wireless/iwlwifi/iwl-rfkill.c
> @@ -35,6 +35,19 @@
> #include "iwl-dev.h"
> #include "iwl-core.h"
>
> +static void iwl_force_rfkill_state(struct iwl_priv *priv,
> + enum rfkill_state state)
> +{
> + enum rfkill_state oldstate;
> +
> + oldstate = priv->rfkill->state;
> + priv->rfkill->state = state;
> +
> + /* rfkill_uevent() */
> + if (oldstate != state)
> + kobject_uevent(&priv->rfkill->dev.kobj, KOBJ_CHANGE);
> +}
> +
> /* software rf-kill from user */
> static int iwl_rfkill_soft_rf_kill(void *data, enum rfkill_state state)
> {
> @@ -54,8 +67,9 @@ static int iwl_rfkill_soft_rf_kill(void *data, enum rfkill_state state)
> case RFKILL_STATE_UNBLOCKED:
> if (iwl_is_rfkill_hw(priv)) {
> err = -EBUSY;
> - /* pass error to rfkill core to make it state HARD
> + /* pass error to rfkill core, make it state HARD
> * BLOCKED and disable software kill switch */
> + iwl_force_rfkill_state(priv, RFKILL_STATE_HARD_BLOCKED);
> }
> iwl_radio_kill_sw_enable_radio(priv);
> break;
> @@ -63,10 +77,10 @@ static int iwl_rfkill_soft_rf_kill(void *data, enum rfkill_state state)
> iwl_radio_kill_sw_disable_radio(priv);
> /* rfkill->mutex lock is taken */
> if (priv->rfkill->state == RFKILL_STATE_HARD_BLOCKED) {
> - /* force rfkill core state to be SOFT BLOCKED,
> + /* force rfkill core state to be in SOFT BLOCKED,
> * otherwise core will be unable to disable software
> * kill switch */
> - priv->rfkill->state = RFKILL_STATE_SOFT_BLOCKED;
> + iwl_force_rfkill_state(priv, RFKILL_STATE_SOFT_BLOCKED);
> }
> break;
> default:
> > >From what I can tell this patch introduced a disagreement of rfkill
> > state between driver and rfkill system.
>
> In driver we have no states, but separate bits for each killswitch. Situation
> gets better after rfkill rewrite where also rfkill core become to have separate
> bits, but with 2.6.30 we have no such luck.
>
> Currently we have "states" like below:
>
> STATUS_RF_KILL_HW=1 STATUS_RF_KILL_SW=1 <-> RFKILL_STATUS_HARD_BLOCKED
> STATUS_RF_KILL_HW=0 STATUS_RF_KILL_SW=1 <-> RFKILL_STATUS_SOFT_BLOCKED
> STATUS_RF_KILL_HW=1 STATUS_RF_KILL_SW=0 <-> RFKILL_STATUS_HARD_BLOCKED
> STATUS_RF_KILL_HW=0 STATUS_RF_KILL_SW=0 <-> RFKILL_STATUS_UNBLOCKED
>
> Patch is intended to work like that:
>
> STATUS_RF_KILL_HW=1 STATUS_RF_KILL_SW=1 <-> RFKILL_STATUS_SOFT_BLOCKED
> STATUS_RF_KILL_HW=0 STATUS_RF_KILL_SW=1 <-> RFKILL_STATUS_SOFT_BLOCKED
> STATUS_RF_KILL_HW=1 STATUS_RF_KILL_SW=0 <-> RFKILL_STATUS_HARD_BLOCKED
> STATUS_RF_KILL_HW=0 STATUS_RF_KILL_SW=0 <-> RFKILL_STATUS_UNBLOCKED
I can see that this is what the last hunk of the patch accomplishes -
but I do not see why it is needed.
>
> STATUS_RF_KILL_HW = 0, STATUS_RF_KILL_SW = 0, RFKILL_STATE_UNBLOCKED
>
> driver HW on
>
> STATUS_RF_KILL_HW = 1, STATUS_RF_KILL_SW = 0, RFKILL_STATE_HARD_BLOCKED
>
> rfkill SW on ( -> rfkill_epo() -> rfkill_toggle_radio() with force = 1)
>
> STATUS_RF_KILL_HW=1, STATUS_RF_KILL_SW=1, RFKILL_STATE_HARD_BLOCKED
>
> rfkill SW off (HARD_BLOCKED not clearing STATUS_RF_KILL_SW)
>
> STATUS_RF_KILL_HW=1, STATUS_RF_KILL_SW=1, RFKILL_STATE_HARD_BLOCKED
>
> driver HW off (called from iwl_bg_rf_kill())
>
> STATUS_RF_KILL_HW=0, STATUS_RF_KILL_SW=1, RFKILL_STATE_SOFT_BLOCKED
>
> rfkill core no longer wants to turn radio on
>From what I understand what you are describing above should be addressed
by this hunk of your patch:
case RFKILL_STATE_UNBLOCKED:
if (iwl_is_rfkill_hw(priv)) {
err = -EBUSY;
- goto out_unlock;
+ /* pass error to rfkill core to make it state HARD
+ * BLOCKED and disable software kill switch */
}
This should make these new transitions possible:
STATUS_RF_KILL_HW = 0, STATUS_RF_KILL_SW = 0, RFKILL_STATE_UNBLOCKED
driver HW on
STATUS_RF_KILL_HW = 1, STATUS_RF_KILL_SW = 0, RFKILL_STATE_HARD_BLOCKED
rfkill SW on ( -> rfkill_epo() -> rfkill_toggle_radio() with force = 1)
STATUS_RF_KILL_HW = 1, STATUS_RF_KILL_SW = 1, RFKILL_STATE_HARD_BLOCKED
rfkill SW off
STATUS_RF_KILL_HW = 1, STATUS_RF_KILL_SW = 0, RFKILL_STATE_HARD_BLOCKED
driver HW off (called from iwl_bg_rf_kill())
STATUS_RF_KILL_HW = 0, STATUS_RF_KILL_SW = 0, RFKILL_STATE_UNBLOCKED
Looking further I tried to see how other combinations would be treated. Here is how I see the potential scenarios:
Case1 (considered above):
driver HW on -> rfkill SW on -> rfkill SW off -> driver HW off
Case2:
driver HW on -> rfkill SW on -> driver HW off -> rfkill SW off
Case3:
rfkill SW on -> driver HW on -> rfkill SW off -> driver HW off
Case4:
rfkill SW on -> driver HW on -> driver HW off -> rfkill SW off
Looking at the rest of the cases I do not see the problem addressed by the other hunks.
I see:
Case 2:
STATUS_RF_KILL_HW = 0, STATUS_RF_KILL_SW = 0, RFKILL_STATE_UNBLOCKED
driver HW on
STATUS_RF_KILL_HW = 1, STATUS_RF_KILL_SW = 0, RFKILL_STATE_HARD_BLOCKED
rfkill SW on
STATUS_RF_KILL_HW = 1, STATUS_RF_KILL_SW = 1, RFKILL_STATE_HARD_BLOCKED
driver HW off
STATUS_RF_KILL_HW = 0, STATUS_RF_KILL_SW = 1, RFKILL_STATE_SOFT_BLOCKED
rfkill SW off
STATUS_RF_KILL_HW = 0, STATUS_RF_KILL_SW = 0, RFKILL_STATE_UNBLOCKED
Case3:
STATUS_RF_KILL_HW = 0, STATUS_RF_KILL_SW = 0, RFKILL_STATE_UNBLOCKED
rfkill SW on
STATUS_RF_KILL_HW = 0, STATUS_RF_KILL_SW = 1, RFKILL_STATE_SOFT_BLOCKED
driver HW on
STATUS_RF_KILL_HW = 1, STATUS_RF_KILL_SW = 1, RFKILL_STATE_HARD_BLOCKED
rfkill SW off
STATUS_RF_KILL_HW = 1, STATUS_RF_KILL_SW = 0, RFKILL_STATE_HARD_BLOCKED
driver HW off
STATUS_RF_KILL_HW = 0, STATUS_RF_KILL_SW = 0, RFKILL_STATE_UNBLOCKED
Case4:
STATUS_RF_KILL_HW = 0, STATUS_RF_KILL_SW = 0, RFKILL_STATE_UNBLOCKED
rfkill SW on
STATUS_RF_KILL_HW = 0, STATUS_RF_KILL_SW = 1, RFKILL_STATE_SOFT_BLOCKED
driver HW on
STATUS_RF_KILL_HW = 1, STATUS_RF_KILL_SW = 1, RFKILL_STATE_HARD_BLOCKED
driver HW off
STATUS_RF_KILL_HW = 0, STATUS_RF_KILL_SW = 1, RFKILL_STATE_SOFT_BLOCKED
rfkill SW off
STATUS_RF_KILL_HW = 0, STATUS_RF_KILL_SW = 0, RFKILL_STATE_UNBLOCKED
I understand that one hunk of your patch accomplishes the mapping of
"STATUS_RF_KILL_HW=1 STATUS_RF_KILL_SW=1 <->
RFKILL_STATUS_SOFT_BLOCKED" - but I do not understand why it is needed. Could you please explain?
I also do not understand the need to modify rfkill's internal state.
Reinette
^ permalink raw reply
* Re: B43: MGMT (TX callback) fail
From: Manuel Schölling @ 2009-08-11 17:56 UTC (permalink / raw)
To: linux-wireless
In-Reply-To: <loom.20090811T163732-716@post.gmane.org>
Sorry, I forgot to tell you that the client machine does not associate with the
hostapd machine (but it does with other access points).
^ permalink raw reply
* B43: MGMT (TX callback) fail
From: Manuel Schölling @ 2009-08-11 16:51 UTC (permalink / raw)
To: linux-wireless
Hi,
I'm using hostapd 0.6.9 with b43 (Kernel 2.6.29-gentoo-r5-twam, 410.2160 of
Broadcom's proprietary driver) with this minimal config:
interface=wlan1
driver=nl80211
ssid=test
(I have two b43 cards: wlan0 and wlan1).
The ssid is not broadcasted and when I want to connect with my laptop (atheros
card), I get this debugging output:
Configuration file: hostapd.conf
Opening raw packet socket for ifindex 143960616
BSS count 1, BSSID mask ff:ff:ff:ff:ff:ff (0 bits)
SIOCGIWRANGE: WE(compiled)=22 WE(source)=21 enc_capa=0xf
nl80211: Added 802.11b mode based on 802.11g information
Allowed channel: mode=1 chan=1 freq=2412 MHz max_tx_power=27 dBm
Allowed channel: mode=1 chan=2 freq=2417 MHz max_tx_power=27 dBm
Allowed channel: mode=1 chan=3 freq=2422 MHz max_tx_power=27 dBm
Allowed channel: mode=1 chan=4 freq=2427 MHz max_tx_power=27 dBm
Allowed channel: mode=1 chan=5 freq=2432 MHz max_tx_power=27 dBm
Allowed channel: mode=1 chan=6 freq=2437 MHz max_tx_power=27 dBm
Allowed channel: mode=1 chan=7 freq=2442 MHz max_tx_power=27 dBm
Allowed channel: mode=1 chan=8 freq=2447 MHz max_tx_power=27 dBm
Allowed channel: mode=1 chan=9 freq=2452 MHz max_tx_power=27 dBm
Allowed channel: mode=1 chan=10 freq=2457 MHz max_tx_power=27 dBm
Allowed channel: mode=1 chan=11 freq=2462 MHz max_tx_power=27 dBm
Allowed channel: mode=0 chan=1 freq=2412 MHz max_tx_power=27 dBm
Allowed channel: mode=0 chan=2 freq=2417 MHz max_tx_power=27 dBm
Allowed channel: mode=0 chan=3 freq=2422 MHz max_tx_power=27 dBm
Allowed channel: mode=0 chan=4 freq=2427 MHz max_tx_power=27 dBm
Allowed channel: mode=0 chan=5 freq=2432 MHz max_tx_power=27 dBm
Allowed channel: mode=0 chan=6 freq=2437 MHz max_tx_power=27 dBm
Allowed channel: mode=0 chan=7 freq=2442 MHz max_tx_power=27 dBm
Allowed channel: mode=0 chan=8 freq=2447 MHz max_tx_power=27 dBm
Allowed channel: mode=0 chan=9 freq=2452 MHz max_tx_power=27 dBm
Allowed channel: mode=0 chan=10 freq=2457 MHz max_tx_power=27 dBm
Allowed channel: mode=0 chan=11 freq=2462 MHz max_tx_power=27 dBm
RATE[0] rate=10 flags=0x2
RATE[1] rate=20 flags=0x6
RATE[2] rate=55 flags=0x4
RATE[3] rate=110 flags=0x4
Passive scanning not supported
Flushing old station entries
Deauthenticate all stations
Using interface wlan1 with hwaddr 00:14:a4:30:20:2d and ssid 'test'
wlan1: Setup of interface done.
MGMT (TX callback) ACK
STA 00:15:af:12:a7:cb sent probe request for broadcast SSID
MGMT (TX callback) fail
mgmt::proberesp cb
STA 00:c0:a8:cc:23:27 sent probe request for broadcast SSID
MGMT (TX callback) ACK
mgmt::proberesp cb
STA 00:c0:a8:cc:23:27 sent probe request for broadcast SSID
MGMT (TX callback) fail
mgmt::proberesp cb
STA 00:c0:a8:cc:23:27 sent probe request for broadcast SSID
MGMT (TX callback) fail
mgmt::proberesp cb
STA 00:c0:a8:cc:23:27 sent probe request for broadcast SSID
MGMT (TX callback) ACK
mgmt::proberesp cb
STA 00:c0:a8:cc:23:27 sent probe request for broadcast SSID
STA 00:c0:a8:cc:23:27 sent probe request for our SSID
MGMT (TX callback) fail
mgmt::proberesp cb
MGMT (TX callback) fail
mgmt::proberesp cb
STA 00:c0:a8:cc:23:27 sent probe request for our SSID
MGMT (TX callback) ACK
mgmt::proberesp cb
STA 00:c0:a8:cc:23:27 sent probe request for broadcast SSID
MGMT (TX callback) fail
mgmt::proberesp cb
STA 00:c0:a8:cc:23:27 sent probe request for broadcast SSID
MGMT (TX callback) fail
mgmt::proberesp cb
^CSignal 2 received - terminating
Flushing old station entries
Deauthenticate all stations
Seems like there were the same problems with rt2x00
(http://rt2x00.serialmonkey.com/phpBB/viewtopic.php?f=5&t=5005) but the patch
there only affects the rt2x00 driver.
Please ask if you need more information.
Cheers,
Manuel
^ permalink raw reply
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