* Re: [ath5k-devel] Ath5k and proprietary extensions
From: Luis R. Rodriguez @ 2009-08-29 19:15 UTC (permalink / raw)
To: Nick Kossifidis
Cc: Benoit PAPILLAULT, ic.felix, ath5k-devel, linux-wireless,
John W. Linville
In-Reply-To: <40f31dec0908290847g698a65e2t589a466a13b1b7f5@mail.gmail.com>
On Sat, Aug 29, 2009 at 8:47 AM, Nick Kossifidis<mickflemm@gmail.com> wrote:
> 2009/8/29 Benoit PAPILLAULT <benoit.papillault@free.fr>:
>>
>> I have been working on XR (in madwifi) for some time with no result. I
>> would appreciate to be able to test it in ath5k.
>
> All XR related stuff is missing from both Legacy and Sam's HAL + it's
> nasty IMHO.
Agreed.
Luis
^ permalink raw reply
* [PATCH] rt2x00: Reorganize padding & L2 padding
From: Ivo van Doorn @ 2009-08-29 18:30 UTC (permalink / raw)
To: John Linville; +Cc: linux-wireless, users
The old function rt2x00queue_payload_align() handled
both adding and removing L2 padding and some basic
frame alignment. The entire function was being abused
because it had multiple functions and the header length
argument was somtimes used to align the header instead
of the payload.
Additionally there was a bug when inserting L2 padding
that only the payload was aligned but not the header. This
happens when the header wasn't aligned properly by mac80211,
but rt2x00lib only moves the payload.
A secondary problem was that when removing L2 padding during
TXdone or RX the skb wasn't resized to the proper size.
Split the function into seperate functions each handling
its task as it should.
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
---
drivers/net/wireless/rt2x00/rt2x00crypto.c | 6 +-
drivers/net/wireless/rt2x00/rt2x00dev.c | 10 ++--
drivers/net/wireless/rt2x00/rt2x00lib.h | 45 +++++++++----
drivers/net/wireless/rt2x00/rt2x00queue.c | 99 +++++++++++++++++++++-------
4 files changed, 116 insertions(+), 44 deletions(-)
diff --git a/drivers/net/wireless/rt2x00/rt2x00crypto.c b/drivers/net/wireless/rt2x00/rt2x00crypto.c
index 30fbd3b..de36837 100644
--- a/drivers/net/wireless/rt2x00/rt2x00crypto.c
+++ b/drivers/net/wireless/rt2x00/rt2x00crypto.c
@@ -154,7 +154,7 @@ void rt2x00crypto_tx_insert_iv(struct sk_buff *skb, unsigned int header_length)
skbdesc->flags &= ~SKBDESC_IV_STRIPPED;
}
-void rt2x00crypto_rx_insert_iv(struct sk_buff *skb, bool l2pad,
+void rt2x00crypto_rx_insert_iv(struct sk_buff *skb,
unsigned int header_length,
struct rxdone_entry_desc *rxdesc)
{
@@ -199,7 +199,7 @@ void rt2x00crypto_rx_insert_iv(struct sk_buff *skb, bool l2pad,
* move the header more then iv_len since we must
* make room for the payload move as well.
*/
- if (l2pad) {
+ if (rxdesc->dev_flags & RXDONE_L2PAD) {
skb_push(skb, iv_len - align);
skb_put(skb, icv_len);
@@ -230,7 +230,7 @@ void rt2x00crypto_rx_insert_iv(struct sk_buff *skb, bool l2pad,
* Move payload for alignment purposes. Note that
* this is only needed when no l2 padding is present.
*/
- if (!l2pad) {
+ if (!(rxdesc->dev_flags & RXDONE_L2PAD)) {
memmove(skb->data + transfer,
skb->data + transfer + align,
payload_len);
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c
index 3f8c70e..5db613f 100644
--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
@@ -216,7 +216,7 @@ void rt2x00lib_txdone(struct queue_entry *entry,
* Remove L2 padding which was added during
*/
if (test_bit(DRIVER_REQUIRE_L2PAD, &rt2x00dev->flags))
- rt2x00queue_payload_align(entry->skb, true, header_length);
+ rt2x00queue_remove_l2pad(entry->skb, header_length);
/*
* If the IV/EIV data was stripped from the frame before it was
@@ -360,7 +360,6 @@ void rt2x00lib_rxdone(struct rt2x00_dev *rt2x00dev,
struct sk_buff *skb;
struct ieee80211_rx_status *rx_status = &rt2x00dev->rx_status;
unsigned int header_length;
- bool l2pad;
int rate_idx;
/*
* Allocate a new sk_buffer. If no new buffer available, drop the
@@ -389,7 +388,6 @@ void rt2x00lib_rxdone(struct rt2x00_dev *rt2x00dev,
* aligned on a 4 byte boundary.
*/
header_length = ieee80211_get_hdrlen_from_skb(entry->skb);
- l2pad = !!(rxdesc.dev_flags & RXDONE_L2PAD);
/*
* Hardware might have stripped the IV/EIV/ICV data,
@@ -399,10 +397,12 @@ void rt2x00lib_rxdone(struct rt2x00_dev *rt2x00dev,
*/
if ((rxdesc.dev_flags & RXDONE_CRYPTO_IV) &&
(rxdesc.flags & RX_FLAG_IV_STRIPPED))
- rt2x00crypto_rx_insert_iv(entry->skb, l2pad, header_length,
+ rt2x00crypto_rx_insert_iv(entry->skb, header_length,
&rxdesc);
+ else if (rxdesc.dev_flags & RXDONE_L2PAD)
+ rt2x00queue_remove_l2pad(entry->skb, header_length);
else
- rt2x00queue_payload_align(entry->skb, l2pad, header_length);
+ rt2x00queue_align_payload(entry->skb, header_length);
/*
* Check if the frame was received using HT. In that case,
diff --git a/drivers/net/wireless/rt2x00/rt2x00lib.h b/drivers/net/wireless/rt2x00/rt2x00lib.h
index eeb2881..5462cb5 100644
--- a/drivers/net/wireless/rt2x00/rt2x00lib.h
+++ b/drivers/net/wireless/rt2x00/rt2x00lib.h
@@ -120,21 +120,42 @@ void rt2x00queue_unmap_skb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb);
void rt2x00queue_free_skb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb);
/**
- * rt2x00queue_payload_align - Align 802.11 payload to 4-byte boundary
+ * rt2x00queue_align_frame - Align 802.11 frame to 4-byte boundary
+ * @skb: The skb to align
+ *
+ * Align the start of the 802.11 frame to a 4-byte boundary, this could
+ * mean the payload is not aligned properly though.
+ */
+void rt2x00queue_align_frame(struct sk_buff *skb);
+
+/**
+ * rt2x00queue_align_payload - Align 802.11 payload to 4-byte boundary
+ * @skb: The skb to align
+ * @header_length: Length of 802.11 header
+ *
+ * Align the 802.11 payload to a 4-byte boundary, this could
+ * mean the header is not aligned properly though.
+ */
+void rt2x00queue_align_payload(struct sk_buff *skb, unsigned int header_length);
+
+/**
+ * rt2x00queue_insert_l2pad - Align 802.11 header & payload to 4-byte boundary
+ * @skb: The skb to align
+ * @header_length: Length of 802.11 header
+ *
+ * Apply L2 padding to align both header and payload to 4-byte boundary
+ */
+void rt2x00queue_insert_l2pad(struct sk_buff *skb, unsigned int header_length);
+
+/**
+ * rt2x00queue_insert_l2pad - Remove L2 padding from 802.11 frame
* @skb: The skb to align
- * @l2pad: Should L2 padding be used
* @header_length: Length of 802.11 header
*
- * This function prepares the @skb to be send to the device or mac80211.
- * If @l2pad is set to true padding will occur between the 802.11 header
- * and payload. Otherwise the padding will be done in front of the 802.11
- * header.
- * When @l2pad is set the function will check for the &SKBDESC_L2_PADDED
- * flag in &skb_frame_desc. If that flag is set, the padding is removed
- * and the flag cleared. Otherwise the padding is added and the flag is set.
+ * Remove L2 padding used to align both header and payload to 4-byte boundary,
+ * by removing the L2 padding the header will no longer be 4-byte aligned.
*/
-void rt2x00queue_payload_align(struct sk_buff *skb,
- bool l2pad, unsigned int header_length);
+void rt2x00queue_remove_l2pad(struct sk_buff *skb, unsigned int header_length);
/**
* rt2x00queue_write_tx_frame - Write TX frame to hardware
@@ -324,7 +345,7 @@ void rt2x00crypto_tx_copy_iv(struct sk_buff *skb,
void rt2x00crypto_tx_remove_iv(struct sk_buff *skb,
struct txentry_desc *txdesc);
void rt2x00crypto_tx_insert_iv(struct sk_buff *skb, unsigned int header_length);
-void rt2x00crypto_rx_insert_iv(struct sk_buff *skb, bool l2pad,
+void rt2x00crypto_rx_insert_iv(struct sk_buff *skb,
unsigned int header_length,
struct rxdone_entry_desc *rxdesc);
#else
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c
index 06af823..577029e 100644
--- a/drivers/net/wireless/rt2x00/rt2x00queue.c
+++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
@@ -148,35 +148,89 @@ void rt2x00queue_free_skb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb)
dev_kfree_skb_any(skb);
}
-void rt2x00queue_payload_align(struct sk_buff *skb,
- bool l2pad, unsigned int header_length)
+void rt2x00queue_align_frame(struct sk_buff *skb)
{
- struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb);
unsigned int frame_length = skb->len;
- unsigned int align = ALIGN_SIZE(skb, header_length);
+ unsigned int align = ALIGN_SIZE(skb, 0);
if (!align)
return;
- if (l2pad) {
- if (skbdesc->flags & SKBDESC_L2_PADDED) {
- /* Remove L2 padding */
- memmove(skb->data + align, skb->data, header_length);
- skb_pull(skb, align);
- skbdesc->flags &= ~SKBDESC_L2_PADDED;
- } else {
- /* Add L2 padding */
- skb_push(skb, align);
- memmove(skb->data, skb->data + align, header_length);
- skbdesc->flags |= SKBDESC_L2_PADDED;
- }
+ skb_push(skb, align);
+ memmove(skb->data, skb->data + align, frame_length);
+ skb_trim(skb, frame_length);
+}
+
+void rt2x00queue_align_payload(struct sk_buff *skb, unsigned int header_lengt)
+{
+ unsigned int frame_length = skb->len;
+ unsigned int align = ALIGN_SIZE(skb, header_lengt);
+
+ if (!align)
+ return;
+
+ skb_push(skb, align);
+ memmove(skb->data, skb->data + align, frame_length);
+ skb_trim(skb, frame_length);
+}
+
+void rt2x00queue_insert_l2pad(struct sk_buff *skb, unsigned int header_length)
+{
+ struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb);
+ unsigned int frame_length = skb->len;
+ unsigned int header_align = ALIGN_SIZE(skb, 0);
+ unsigned int payload_align = ALIGN_SIZE(skb, header_length);
+ unsigned int l2pad = 4 - (payload_align - header_align);
+
+ if (header_align == payload_align) {
+ /*
+ * Both header and payload must be moved the same
+ * amount of bytes to align them properly. This means
+ * we don't use the L2 padding but just move the entire
+ * frame.
+ */
+ rt2x00queue_align_frame(skb);
+ } else if (!payload_align) {
+ /*
+ * Simple L2 padding, only the header needs to be moved,
+ * the payload is already properly aligned.
+ */
+ skb_push(skb, header_align);
+ memmove(skb->data, skb->data + header_align, frame_length);
+ skbdesc->flags |= SKBDESC_L2_PADDED;
} else {
- /* Generic payload alignment to 4-byte boundary */
- skb_push(skb, align);
- memmove(skb->data, skb->data + align, frame_length);
+ /*
+ *
+ * Complicated L2 padding, both header and payload need
+ * to be moved. By default we only move to the start
+ * of the buffer, so our header alignment needs to be
+ * increased if there is not enough room for the header
+ * to be moved.
+ */
+ if (payload_align > header_align)
+ header_align += 4;
+
+ skb_push(skb, header_align);
+ memmove(skb->data, skb->data + header_align, header_length);
+ memmove(skb->data + header_length + l2pad,
+ skb->data + header_length + l2pad + header_align,
+ frame_length - header_length);
+ skbdesc->flags |= SKBDESC_L2_PADDED;
}
}
+void rt2x00queue_remove_l2pad(struct sk_buff *skb, unsigned int header_length)
+{
+ struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb);
+ unsigned int l2pad = 4 - (header_length & 3);
+
+ if (!l2pad || (skbdesc->flags & SKBDESC_L2_PADDED))
+ return;
+
+ memmove(skb->data + l2pad, skb->data, header_length);
+ skb_pull(skb, l2pad);
+}
+
static void rt2x00queue_create_tx_descriptor_seq(struct queue_entry *entry,
struct txentry_desc *txdesc)
{
@@ -456,18 +510,15 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb)
/*
* When DMA allocation is required we should guarentee to the
* driver that the DMA is aligned to a 4-byte boundary.
- * Aligning the header to this boundary can be done by calling
- * rt2x00queue_payload_align with the header length of 0.
* However some drivers require L2 padding to pad the payload
* rather then the header. This could be a requirement for
* PCI and USB devices, while header alignment only is valid
* for PCI devices.
*/
if (test_bit(DRIVER_REQUIRE_L2PAD, &queue->rt2x00dev->flags))
- rt2x00queue_payload_align(entry->skb, true,
- txdesc.header_length);
+ rt2x00queue_insert_l2pad(entry->skb, txdesc.header_length);
else if (test_bit(DRIVER_REQUIRE_DMA, &queue->rt2x00dev->flags))
- rt2x00queue_payload_align(entry->skb, false, 0);
+ rt2x00queue_align_frame(entry->skb);
/*
* It could be possible that the queue was corrupted and this
--
1.6.4.1
^ permalink raw reply related
* [PATCH] rt2x00: Fix TX status reporting
From: Ivo van Doorn @ 2009-08-29 17:10 UTC (permalink / raw)
To: John Linville; +Cc: users, linux-wireless
Not all values of the TX status enumeration were
covered during updating of the TX statistics. This
could lead to wrong bitrate tuning but also wrong
behavior in tools like hostapd.
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
---
drivers/net/wireless/rt2x00/rt2x00dev.c | 28 ++++++++++++++++------------
1 files changed, 16 insertions(+), 12 deletions(-)
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c
index 5db613f..71761b3 100644
--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
@@ -206,6 +206,7 @@ void rt2x00lib_txdone(struct queue_entry *entry,
unsigned int header_length = ieee80211_get_hdrlen_from_skb(entry->skb);
u8 rate_idx, rate_flags, retry_rates;
unsigned int i;
+ bool success;
/*
* Unmap the skb.
@@ -234,13 +235,18 @@ void rt2x00lib_txdone(struct queue_entry *entry,
rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_TXDONE, entry->skb);
/*
- * Update TX statistics.
+ * Determine if the frame has been successfully transmitted.
*/
- rt2x00dev->link.qual.tx_success +=
+ success =
test_bit(TXDONE_SUCCESS, &txdesc->flags) ||
- test_bit(TXDONE_UNKNOWN, &txdesc->flags);
- rt2x00dev->link.qual.tx_failed +=
- test_bit(TXDONE_FAILURE, &txdesc->flags);
+ test_bit(TXDONE_UNKNOWN, &txdesc->flags) ||
+ test_bit(TXDONE_FALLBACK, &txdesc->flags);
+
+ /*
+ * Update TX statistics.
+ */
+ rt2x00dev->link.qual.tx_success += success;
+ rt2x00dev->link.qual.tx_failed += !success;
rate_idx = skbdesc->tx_rate_idx;
rate_flags = skbdesc->tx_rate_flags;
@@ -263,22 +269,20 @@ void rt2x00lib_txdone(struct queue_entry *entry,
tx_info->status.rates[i].flags = rate_flags;
tx_info->status.rates[i].count = 1;
}
- if (i < (IEEE80211_TX_MAX_RATES -1))
+ if (i < (IEEE80211_TX_MAX_RATES - 1))
tx_info->status.rates[i].idx = -1; /* terminate */
if (!(tx_info->flags & IEEE80211_TX_CTL_NO_ACK)) {
- if (test_bit(TXDONE_SUCCESS, &txdesc->flags) ||
- test_bit(TXDONE_UNKNOWN, &txdesc->flags))
+ if (success)
tx_info->flags |= IEEE80211_TX_STAT_ACK;
- else if (test_bit(TXDONE_FAILURE, &txdesc->flags))
+ else
rt2x00dev->low_level_stats.dot11ACKFailureCount++;
}
if (rate_flags & IEEE80211_TX_RC_USE_RTS_CTS) {
- if (test_bit(TXDONE_SUCCESS, &txdesc->flags) ||
- test_bit(TXDONE_UNKNOWN, &txdesc->flags))
+ if (success)
rt2x00dev->low_level_stats.dot11RTSSuccessCount++;
- else if (test_bit(TXDONE_FAILURE, &txdesc->flags))
+ else
rt2x00dev->low_level_stats.dot11RTSFailureCount++;
}
--
1.6.4.1
^ permalink raw reply related
* Re: [ath5k-devel] Ath5k and proprietary extensions
From: Nick Kossifidis @ 2009-08-29 15:47 UTC (permalink / raw)
To: Benoit PAPILLAULT; +Cc: John W. Linville, ath5k-devel, linux-wireless, ic.felix
In-Reply-To: <4A98D65B.9060103@free.fr>
2009/8/29 Benoit PAPILLAULT <benoit.papillault@free.fr>:
>
> I have been working on XR (in madwifi) for some time with no result. I
> would appreciate to be able to test it in ath5k.
All XR related stuff is missing from both Legacy and Sam's HAL + it's
nasty IMHO. We need to define new rates, send beacons on both 0.25 and
1Mbits, use that polling mechanism, introduce a new IE etc. It 'll
need lots of changes and the code will get even more complex + if we
want to do it right at least the polling mechanism has to go to
mac80211 and i don't think anyone wants that, imagine if every vendor
started putting proprietary stuff like that on mac80211 (and there are
way more nasty vendor specific stuff). I don't want to see
ath5k/mac80211 become like MadWiFi. If we can find a way to support XR
on ath5k without touching mac80211 then we can talk about it but right
now we don't even know how to make it work.
--
GPG ID: 0xD21DB2DB
As you read this post global entropy rises. Have Fun ;-)
Nick
^ permalink raw reply
* Re: [ath5k-devel] Ath5k and proprietary extensions
From: RHS Linux User @ 2009-08-29 9:56 UTC (permalink / raw)
To: Benoit PAPILLAULT
Cc: Nick Kossifidis, ic.felix, ath5k-devel, linux-wireless,
John W. Linville
In-Reply-To: <4A98D65B.9060103@free.fr>
Hi All,
I am VERY interested in XR.
John
^ permalink raw reply
* Re: [RFT] ar9170: use eeprom's frequency calibration values
From: Joerg Albert @ 2009-08-29 11:33 UTC (permalink / raw)
To: Johannes Berg, Christian Lamparter; +Cc: linux-wireless, John Linville
In-Reply-To: <1250927567.23605.9.camel@johannes.local>
On 08/22/2009 09:52 AM, Johannes Berg wrote:
> On Fri, 2009-08-21 at 22:52 +0200, Christian Lamparter wrote:
>
>> Johannes, in phy.c (now at line) line 429
>>
>> int ar9170_init_phy(struct ar9170 *ar, enum ieee80211_band band)
>> {
>> [...]
>> /* XXX: use EEPROM data here! */
>>
>> err = ar9170_init_power_cal(ar);
>> if (err)
>> [...]
>> }
>>
>> do you still know what EEPROM data is missing here?
>
> Sorry, no, I don't remember, and can't seem to find it either in otus
> right now.
Maybe this refers to the values in eepromBoardData initialized from the eeprom in otus/hal/hpmain.c, lines 522 ff.
and written into the registers in line 828?
I guess they should come from the modal_header[] in struct ar9170_eeprom, but I cannot map the
offset in hpmain.c for hpPriv->eepromImage[] into the modal_header's members.
Regards,
Joerg
^ permalink raw reply
* Re: [PATCH 1/2] cfg80211: initialize rate control after station inserted
From: Johannes Berg @ 2009-08-29 9:34 UTC (permalink / raw)
To: reinette chatre; +Cc: linville@tuxdriver.com, linux-wireless@vger.kernel.org
In-Reply-To: <1251497929.3805.173.camel@rc-desk>
[-- Attachment #1: Type: text/plain, Size: 4409 bytes --]
Hi Reinette,
> > Interesting. I've been thinking about making it go the other way --
> > remove rate scaling hooks completely. wl1271 apparently has rate scaling
> > completely in the firmware, so the RS algorithm on the host is just
> > overhead. I've been thinking putting 4965+ RS into the _driver_ makes
> > more sense since it really does a lot in the firmware and not on the
> > host.
>
> Yes, it does do a lot in firmware. Unfortunately I am not too familiar
> with the details (yet).
As far as I know/can tell, you basically upload the LQ command to the
firmware for each station and it in a way controls the parameters. What
exactly it does I'm not sure, but I am pretty sure that we don't have up
to 16 retries programmed into the TX descriptor for each packet, but we
can do that many retries.
iwl_tx_cmd contains only a single rate_n_flags field, and then there's
TX_CMD_FLG_STA_RATE_MSK, there's a comment on that definition that
explains some more.
> > I've also been thinking if there's a way to make sta_notify() able to
> > sleep but so far I don't see one unfortunately.
>
> Having it sleep will help a lot. When a station is added we need to tell
> the device about it. Since the call cannot sleep we cannot really tell
> mac80211 if this failed because the failure will only be known at a
> later time. I have not yet figured out how to deal with this case.
Yeah, that would help. On the other hand, mac80211 isn't actually
prepared to deal with that. In fact, sta_notify has no return value. And
I'm not really sure how to deal with errors from it. Leaving AP aside
for a minute, I think we probably can't do anything. If we exceed the
capacity of the microcode's station memory, I think the best we can do
is just not use rate control for that station, and use the broadcast
station. It won't really happen anyway. And software crypto, of course.
So there's not much to be done.
Now looking at AP again, it _might_ make sense to tell hostapd "sorry we
can't really talk to that station well", but on the other hand I suspect
it's not a case we should really consider. I'd say we can export the
number of stations so that hostapd can actually try not to exceed the
limit in the first place.
As such, having the sta_notify callback sleep will not actually help
much.
I'd say we do the following: At startup, we program the broadcast STA
into the device so we always have that, and do that synchronously so if
that fails for some stupid reason. I think we already do that.
Then, we use a station private area that mac80211 can allocate for us to
store the STA_ID for each station. Set this to the broadcast STA ID,
which is always valid in some sense, at sta_notify(add) time. Then,
asynchronously, tell the device about the station. Once that command
finishes, look up the sta struct again and set the STA_ID to the new ID
that we used in the device. This way, a sta struct will always have a
valid sta ID in it.
Now, when we need to set a key for a station, we actually get the
station struct. Thus, we can keep two separate flag in the station
struct that tells us whether the STA_ADD was successful. If this flag is
unset, then we reject the add_key with -ENOSPC. Or when we detect that
the key command was too fast after the sta_notify we can wait for the
ADD_STA to finish in the key notification since that can sleep.
And then rate stuff we can just also do as part of the async sta add
command, so that the sta ID is only set after we have the sta programmed
into the device and also initialised rate control properly for it.
Ultimately the rate control algorithm could do nothing at all, and then
we can remove it completely.
> > As soon as sta_insert() got called, a packet transmitted to that station
> > can be processed, find the sta info, and it seems we could end up
> > calling rate_control_get_rate() before the init was done, through a race
> > condition.
>
> oh - I see - that's bad. Although, that may explain why iwlwifi is
> adding stations in get_rate() also.
No, the explanation for that is "history" :) The rate algorithm was
written before mac80211 actually _had_ the sta_notify command, and it
was (and still is, as you've pointed out in these patches) the first
place that is notified about the new station. But I think we don't
really need that.
johannes
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 801 bytes --]
^ permalink raw reply
* rndis endian warnings
From: Johannes Berg @ 2009-08-29 9:08 UTC (permalink / raw)
To: Jussi Kivilinna; +Cc: linux-wireless
[-- Attachment #1: Type: text/plain, Size: 185 bytes --]
Hi,
There are a whole bunch of endianness warnings from sparse in rndis --
please run
make M=drivers/net/wireless C=2 CF=-D__CHECK_ENDIAN__
and check the result.
johannes
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 801 bytes --]
^ permalink raw reply
* Re: [PATCH 1/2] cfg80211: initialize rate control after station inserted
From: Johannes Berg @ 2009-08-29 9:01 UTC (permalink / raw)
To: tim.gardner
Cc: reinette chatre, linville@tuxdriver.com,
linux-wireless@vger.kernel.org
In-Reply-To: <4A984EBA.9040608@canonical.com>
[-- Attachment #1: Type: text/plain, Size: 657 bytes --]
On Fri, 2009-08-28 at 15:40 -0600, Tim Gardner wrote:
> Wouldn't that make it difficult to experiment with external rate scaling
> algorithms? Not that minstrel or the other in-driver rate scaling
> algorithms always get it right, but they are certainly more transparent
> (and changeable) then firmware.
It does, in theory, but then again you don't really _have_ the choice.
iwlagn only lets you control the rate on the host to some extent,
there's not a lot we can do. IMHO using the rate control algorithms like
they are now is a kludge because we've always needed a rate control
algorithm, but it's still not really useful.
johannes
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 801 bytes --]
^ permalink raw reply
* Re: [ath5k-devel] Ath5k and proprietary extensions
From: Benoit PAPILLAULT @ 2009-08-29 7:18 UTC (permalink / raw)
To: Nick Kossifidis; +Cc: John W. Linville, ath5k-devel, linux-wireless, ic.felix
In-Reply-To: <40f31dec0908282151t245912f0ye79684d4a519f3c9@mail.gmail.com>
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Nick Kossifidis a écrit :
> Since we started the discussion about ath5k and proprietary
> features i started a new thread to continue.
>
> So this is what we have...
>
> a) X.R.: eXtended Range is a set of proprietary rates and some
> extra techniques (various hw tweaks etc) to enable long distance,
> low bandwidth links. This feature was never really supported on
> MadWiFi (some code for sta mode is there but i don't think anyone
> used it) and it's ugly (sends beacons on both 1Mbit and 250Kbit,
> has some sort of polling mechanism etc). We should remove XR stuff
> since we all agree that we won't support it + even if we want we
> don't have anything to work with anyway, 5/10MHz channels should be
> enough for long distance links. Just leave XR rate code definitions
> there for reference (in case we get any of these from the card
> -normally we shouldn't but it's good to know all hw rate code
> values).
I have been working on XR (in madwifi) for some time with no result. I
would appreciate to be able to test it in ath5k.
>
> b) OFDM-only g settings for AR5211: AR5211 chips have support for
> draft-g (eg. no dynamic CCK/OFDM modulation, only OFDM). I don't
> know if we want to support it or not, removing the settings will
> save us some space and since it's a draft g implementation i don't
> think there are many compatible APs out there. Is there any
> possibility to support draft-g on mac80211/cfg80211 ? If not we can
> just drop it else it's just some extra data, no big deal.
>
> c) Half/quarter rate channels (10/5MHz width) and turbo mode
> (double rate - 40MHz width): Hw can transmit with different channel
> width allowing us to operate on half, quarter or double rate (also
> called turbo mode). Half and quarter rates are straight forward
> (just re-program pll/clock and tweak various phy/rf settings) and
> most chips support it, turbo mode on the other hand has some extra
> parameters and is supported only on super ag enabled (non-lite)
> chips (5212,2414,5414,5424 etc). First we want to use it only on
> "middle" channels so that we don't get outside band boundaries when
> changing channel width, so we have to limit the available channels
> we can use (check out super ag white paper), second we have the
> opportunity to support both 20MHz and 40MHz at the same time by
> using "dynamic turbo" feature on hw so if we are an AP we can deal
> both with turbo-enabled clients and normal clients. I was thinking
> if we are going to have an API to set channel width to 10 and 5 MHz
> for half and quarter rate channels, we can use the same API to set
> channel width to 40MHz width for double rate channels on cards that
> support it and when we are on AP mode use the "dynamic turbo"
> stuff. We don't even have to call it turbo mode, it's just double
> rate + some tweaks.
>
> Most code is there for half/quarter and (static) turbo operation,
> we just have to deal with pll programming, clock settings etc.
> Question is how do we use it, NL80211_CMD_TESTMODE is an option i
> guess and in case no one else thinks that we could use a channel
> width API (or extend what we have) for setting 5/10/40MHz width
> through cfg80211, we can just stick to NL80211_CMD_TESTMODE.
5/10 MHz channels are defined in 802.11-2007, so it must be part of
mac80211 and supported by ath5k if the HW support it. For 40 MHz, as
far as the mac80211 API is concerned, we could treat it like HT40,
even it's clearly a proprietary extension.
>
> d) Fast frames: Hw can tx/rx jumbo frames of 3kbytes+ so fast frame
> aggregation is a way to make use of that hw feature by sending 2
> frames together (for more infos check out super ag white paper). On
> FreeBSD fast frames aggregation is implemented on the protocol
> stack (net80211) so that any hw that can tx/rx such jumbo frames
> can use fast frame aggregation
> (http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/net80211/ieee80211_superg.c?rev=1.7;content-type=text%2Fx-cvsweb-markup;sortby=rev)
> but it still maintains atheros's format to be compatible with
> commercial Atheros APs. We have talked about this and it seems no
> one is willing to support fast frames aggregation so on ath5k we
> only use single tx/rx descriptors and there is no related code for
> handling multiple descriptors.
>
> e) Compression: Hw can do on-chip compression/decompression using
> standard Lempel Ziv algorithm per tx queue, MadWiFi implements this
> and uses a vendor IE to let others know that it supports this
> feature (same IE is used for all capabilities, fast frames, XR
> etc). I guess this can also work for other cards by doing
> compression/decompression on software since it's a standard
> algorithm (and i think kernel already has code for it) but it's way
> outside cfg80211/mac80211's scope. I think we can just use
> NL80211_CMD_TESTMODE to enable/disable this on all data queues and
> skip the IE stuff (user will have to enable it on both sides to
> make it work). There is no related code on ath5k for
> compression/decompression at the moment.
>
>
>
My whole feeling is that an operating system, be it GNU/Linux,
Windows(tm), *bsd or whatever is here to bring all the HW features to
the user. So if users are interested by any of the above features, be
it proprietary or not, we need to find a way to allow their
implementation in ath5k. Some of those implementations would need
mac80211 changes, so we need to decide if we want a proper mac80211
support for all those features (proprietary or not) or if mac80211
only wants to support standard features (which seems fair) and find
another way to support proprietary features.
Regards,
Benoit
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
iEYEARECAAYFAkqY1lYACgkQOR6EySwP7oJTZACfUO8m4OXls+5yVLMbnn/oax0E
vTcAoO9NJ5Wdtr3gNEALF0sPk4RxNj7c
=5Srl
-----END PGP SIGNATURE-----
^ permalink raw reply
* Re: pull request: wireless-next-2.6 2009-08-28
From: David Miller @ 2009-08-29 6:06 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, netdev
In-Reply-To: <20090828191119.GD32694@tuxdriver.com>
From: "John W. Linville" <linville@tuxdriver.com>
Date: Fri, 28 Aug 2009 15:11:19 -0400
> Another huge batch of updates/changes/etc intended for 2.6.32... This
> includes the usual driver updates and miscellaneous fixes, etc.
> Highlights in this batch include more LP-PHY support for b43 and the
> completion of the cfg80211 API conversion for rndis_wlan.
Pulled, thanks!
^ permalink raw reply
* Re: pull request: wireless-2.6 2009-08-28
From: David Miller @ 2009-08-29 6:05 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, netdev, linux-kernel
In-Reply-To: <20090828191039.GC32694@tuxdriver.com>
From: "John W. Linville" <linville@tuxdriver.com>
Date: Fri, 28 Aug 2009 15:10:39 -0400
> Dave,
>
> One more late-breaker for 2.6.31...
>
> This patch is rather large for this stage of the cycle, but it
> corrects a regression disussed recently on LKML, documented in bug
> 14016 at bugzilla.kernel.org. This jist of it is that the ipw2200
> firmware loading routine was using an order 6 memory allocation that was
> failing with newer allocators under some circumstances.
Pulled, thanks.
^ permalink raw reply
* Re: [PATCH 1/2] cfg80211: initialize rate control after station inserted
From: Kalle Valo @ 2009-08-29 5:22 UTC (permalink / raw)
To: tim.gardner
Cc: Johannes Berg, reinette chatre, linville@tuxdriver.com,
linux-wireless@vger.kernel.org
In-Reply-To: <4A984EBA.9040608@canonical.com>
Tim Gardner <tim.gardner@canonical.com> writes:
>> Interesting. I've been thinking about making it go the other way --
>> remove rate scaling hooks completely. wl1271 apparently has rate scaling
>> completely in the firmware, so the RS algorithm on the host is just
>> overhead. I've been thinking putting 4965+ RS into the _driver_ makes
>> more sense since it really does a lot in the firmware and not on the
>> host.
>>
>> Do you think we should try to go that route? I'd think it would probably
>> be a hardware flag ("no RS algo please") and then we'd skip all the
>> hooks and put things into the driver. The advantage is that we don't
>> care about the mac80211 API any more, things get cleaner and we can just
>> do all RS init from sta_notify().
>>
>
> Wouldn't that make it difficult to experiment with external rate
> scaling algorithms? Not that minstrel or the other in-driver rate
> scaling algorithms always get it right, but they are certainly more
> transparent (and changeable) then firmware.
In wl1271 you are forced to use the rate scaling algorithm from the
firmware. IIRC tx descriptor doesn't even have a field for the bitrate.
--
Kalle Valo
^ permalink raw reply
* Ath5k and proprietary extensions
From: Nick Kossifidis @ 2009-08-29 4:51 UTC (permalink / raw)
To: John W. Linville
Cc: Luis R. Rodriguez, Bob Copeland, proski, ath5k-devel,
linux-wireless, ic.felix, Felix Fietkau
Since we started the discussion about ath5k and proprietary features i
started a new thread to continue.
So this is what we have...
a) X.R.: eXtended Range is a set of proprietary rates and some extra
techniques (various hw tweaks etc) to enable long distance, low
bandwidth links. This feature was never really supported on MadWiFi
(some code for sta mode is there but i don't think anyone used it) and
it's ugly (sends beacons on both 1Mbit and 250Kbit, has some sort of
polling mechanism etc). We should remove XR stuff since we all agree
that we won't support it + even if we want we don't have anything to
work with anyway, 5/10MHz channels should be enough for long distance
links. Just leave XR rate code definitions there for reference (in
case we get any of these from the card -normally we shouldn't but it's
good to know all hw rate code values).
b) OFDM-only g settings for AR5211: AR5211 chips have support for
draft-g (eg. no dynamic CCK/OFDM modulation, only OFDM). I don't know
if we want to support it or not, removing the settings will save us
some space and since it's a draft g implementation i don't think there
are many compatible APs out there. Is there any possibility to support
draft-g on mac80211/cfg80211 ? If not we can just drop it else it's
just some extra data, no big deal.
c) Half/quarter rate channels (10/5MHz width) and turbo mode (double
rate - 40MHz width): Hw can transmit with different channel width
allowing us to operate on half, quarter or double rate (also called
turbo mode). Half and quarter rates are straight forward (just
re-program pll/clock and tweak various phy/rf settings) and most chips
support it, turbo mode on the other hand has some extra parameters and
is supported only on super ag enabled (non-lite) chips
(5212,2414,5414,5424 etc). First we want to use it only on "middle"
channels so that we don't get outside band boundaries when changing
channel width, so we have to limit the available channels we can use
(check out super ag white paper), second we have the opportunity to
support both 20MHz and 40MHz at the same time by using "dynamic turbo"
feature on hw so if we are an AP we can deal both with turbo-enabled
clients and normal clients. I was thinking if we are going to have an
API to set channel width to 10 and 5 MHz for half and quarter rate
channels, we can use the same API to set channel width to 40MHz width
for double rate channels on cards that support it and when we are on
AP mode use the "dynamic turbo" stuff. We don't even have to call it
turbo mode, it's just double rate + some tweaks.
Most code is there for half/quarter and (static) turbo operation, we
just have to deal with pll programming, clock settings etc. Question
is how do we use it, NL80211_CMD_TESTMODE is an option i guess and in
case no one else thinks that we could use a channel width API (or
extend what we have) for setting 5/10/40MHz width through cfg80211, we
can just stick to NL80211_CMD_TESTMODE.
d) Fast frames: Hw can tx/rx jumbo frames of 3kbytes+ so fast frame
aggregation is a way to make use of that hw feature by sending 2
frames together (for more infos check out super ag white paper). On
FreeBSD fast frames aggregation is implemented on the protocol stack
(net80211) so that any hw that can tx/rx such jumbo frames can use
fast frame aggregation
(http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/net80211/ieee80211_superg.c?rev=1.7;content-type=text%2Fx-cvsweb-markup;sortby=rev)
but it still maintains atheros's format to be compatible with
commercial Atheros APs. We have talked about this and it seems no one
is willing to support fast frames aggregation so on ath5k we only use
single tx/rx descriptors and there is no related code for handling
multiple descriptors.
e) Compression: Hw can do on-chip compression/decompression using
standard Lempel Ziv algorithm per tx queue, MadWiFi implements this
and uses a vendor IE to let others know that it supports this feature
(same IE is used for all capabilities, fast frames, XR etc). I guess
this can also work for other cards by doing compression/decompression
on software since it's a standard algorithm (and i think kernel
already has code for it) but it's way outside cfg80211/mac80211's
scope. I think we can just use NL80211_CMD_TESTMODE to enable/disable
this on all data queues and skip the IE stuff (user will have to
enable it on both sides to make it work). There is no related code on
ath5k for compression/decompression at the moment.
--
GPG ID: 0xD21DB2DB
As you read this post global entropy rises. Have Fun ;-)
Nick
^ permalink raw reply
* Re: [ath5k-devel] [PATCH 1/2] ath5k: fix uninitialized value use in ath5k_eeprom_read_turbo_modes()
From: Felix Fietkau @ 2009-08-29 1:35 UTC (permalink / raw)
To: John W. Linville; +Cc: Luis R. Rodriguez, ath5k-devel, linux-wireless, ic.felix
In-Reply-To: <20090828154410.GB32694@tuxdriver.com>
John W. Linville wrote:
> I think I am on the side of removing the non-standard extensions.
> FWIW, I'll need a patch posted with a proper Subject and
> Signed-off-by...
>
> I think Nick has some valid points. His position sounds similar to
> that expressed to me by Felix and some others that it would be nice
> if we could more easily accomodate some of the features of madwifi
> that have made it attractive to researchers and experimenters.
> Perhaps NL80211_CMD_TESTMODE relates to this desire?
Yes, that would be a good solution. I know a lot of people who are going
continue to stick with madwifi if they won't be able to use turbo mode
with ath5k. Since quite a few of those people are using OpenWrt, it
would also mean that I would have to continue to maintain my madwifi
semi-fork in OpenWrt even longer, and I definitely want to avoid that.
- Felix
^ permalink raw reply
* Re: ath9k DMA problems
From: Howard Chu @ 2009-08-29 1:06 UTC (permalink / raw)
To: linux-wireless@vger.kernel.org
In-Reply-To: <4A958F45.40109@symas.com>
Am I the only one having these problems? ath9k hasn't worked well for me since
2.6.29.4; every snapshot since then has suffered from random drops. In
2.6.29.6 it at least would quickly reassociate. The current ones hang within
20-30 minutes of use and never come back. The compat-wireless snapshots have
all been equally unusable.
Howard Chu wrote:
> Still seeing occasional hangs using the ath9k in 2.6.31-rc6, and even worse
> using compat-wireless 2009-08-22. Today I got this which was even more
> interesting:
>
> [369014.776586] wlan0: associate with AP 00:12:17:26:56:10 (try 1)
> [369014.779197] wlan0: RX ReassocResp from 00:12:17:26:56:10 (capab=0x411
> status=0 aid=2)
> [369014.779197] wlan0: associated
> [369472.707961] ath9k: DMA failed to stop in 10 ms AR_CR=0xdeadbeef
> AR_DIAG_SW=0xdeadbeef
>
> This is on an HP dv5z laptop, it reports an AR9280 at boot.
--
-- Howard Chu
CTO, Symas Corp. http://www.symas.com
Director, Highland Sun http://highlandsun.com/hyc/
Chief Architect, OpenLDAP http://www.openldap.org/project/
^ permalink raw reply
* 2.6.31-rc8-wl-34750-gd2c67e1 suspected memory leaks
From: Davide Pesavento @ 2009-08-28 23:32 UTC (permalink / raw)
To: linux-wireless
Hi,
with latest wireless-testing I'm seeing the following kmemleak's warnings.
unreferenced object 0xffff88007cb8cbd0 (size 96):
comm "softirq", pid 0, jiffies 4294914587
backtrace:
[<ffffffff810e312c>] create_object+0x14c/0x2f0
[<ffffffff810e3425>] kmemleak_alloc+0x35/0x80
[<ffffffff810dd904>] kmem_cache_alloc+0xc4/0x150
[<ffffffffa01c77eb>] 0xffffffffa01c77eb
[<ffffffffa01c1616>] 0xffffffffa01c1616
[<ffffffffa0156f43>] __ieee80211_tx+0x123/0x1c0 [mac80211]
[<ffffffffa0157fef>] ieee80211_tx+0xef/0x2a0 [mac80211]
[<ffffffffa0158287>] ieee80211_xmit+0xe7/0x280 [mac80211]
[<ffffffffa015847f>] ieee80211_tx_skb+0x5f/0x90 [mac80211]
[<ffffffffa015b164>] ieee80211_send_auth+0x164/0x1f0 [mac80211]
[<ffffffffa014b1b6>] ieee80211_authenticate+0xf6/0x130 [mac80211]
[<ffffffffa014bf1a>] ieee80211_rx_mgmt_probe_resp+0x1da/0x200 [mac80211]
[<ffffffffa014cd95>] ieee80211_sta_work+0x9a5/0x1100 [mac80211]
[<ffffffff81067478>] worker_thread+0x1c8/0x350
[<ffffffff8106d066>] kthread+0xb6/0xc0
[<ffffffff8100d35a>] child_rip+0xa/0x20
unreferenced object 0xffff88007cb8cd20 (size 96):
comm "softirq", pid 0, jiffies 4294914588
backtrace:
[<ffffffff810e312c>] create_object+0x14c/0x2f0
[<ffffffff810e3425>] kmemleak_alloc+0x35/0x80
[<ffffffff810dd904>] kmem_cache_alloc+0xc4/0x150
[<ffffffffa01c77eb>] 0xffffffffa01c77eb
[<ffffffffa01c1616>] 0xffffffffa01c1616
[<ffffffffa0156f43>] __ieee80211_tx+0x123/0x1c0 [mac80211]
[<ffffffffa0157fef>] ieee80211_tx+0xef/0x2a0 [mac80211]
[<ffffffffa0158287>] ieee80211_xmit+0xe7/0x280 [mac80211]
[<ffffffffa015847f>] ieee80211_tx_skb+0x5f/0x90 [mac80211]
[<ffffffffa014cb13>] ieee80211_sta_work+0x723/0x1100 [mac80211]
[<ffffffff81067478>] worker_thread+0x1c8/0x350
[<ffffffff8106d066>] kthread+0xb6/0xc0
[<ffffffff8100d35a>] child_rip+0xa/0x20
[<ffffffffffffffff>] 0xffffffffffffffff
unreferenced object 0xffff8800625d6c78 (size 96):
comm "softirq", pid 0, jiffies 4295666572
backtrace:
[<ffffffff810e312c>] create_object+0x14c/0x2f0
[<ffffffff810e3425>] kmemleak_alloc+0x35/0x80
[<ffffffff810dd904>] kmem_cache_alloc+0xc4/0x150
[<ffffffffa01c77eb>] 0xffffffffa01c77eb
[<ffffffffa01c1616>] 0xffffffffa01c1616
[<ffffffffa0156f43>] __ieee80211_tx+0x123/0x1c0 [mac80211]
[<ffffffffa0157fef>] ieee80211_tx+0xef/0x2a0 [mac80211]
[<ffffffffa0158287>] ieee80211_xmit+0xe7/0x280 [mac80211]
[<ffffffffa015847f>] ieee80211_tx_skb+0x5f/0x90 [mac80211]
[<ffffffffa014918b>] ieee80211_send_deauth_disassoc+0x12b/0x190 [mac80211]
[<ffffffffa014d25f>] ieee80211_sta_work+0xe6f/0x1100 [mac80211]
[<ffffffff81067478>] worker_thread+0x1c8/0x350
[<ffffffff8106d066>] kthread+0xb6/0xc0
[<ffffffff8100d35a>] child_rip+0xa/0x20
[<ffffffffffffffff>] 0xffffffffffffffff
unreferenced object 0xffff88007e5de110 (size 64):
comm "events/1", pid 11, jiffies 4295690130
backtrace:
[<ffffffff810e312c>] create_object+0x14c/0x2f0
[<ffffffff810e3425>] kmemleak_alloc+0x35/0x80
[<ffffffff810de1b2>] __kmalloc+0x122/0x1b0
[<ffffffffa00a8739>] reg_copy_regd+0x39/0xc0 [cfg80211]
[<ffffffffa00a8c5c>] reg_todo+0x49c/0x5f0 [cfg80211]
[<ffffffff81067478>] worker_thread+0x1c8/0x350
[<ffffffff8106d066>] kthread+0xb6/0xc0
[<ffffffff8100d35a>] child_rip+0xa/0x20
[<ffffffffffffffff>] 0xffffffffffffffff
unreferenced object 0xffff8800625d6bd0 (size 96):
comm "softirq", pid 0, jiffies 4295700338
backtrace:
[<ffffffff810e312c>] create_object+0x14c/0x2f0
[<ffffffff810e3425>] kmemleak_alloc+0x35/0x80
[<ffffffff810dd904>] kmem_cache_alloc+0xc4/0x150
[<ffffffffa03227eb>] ath_tx_start+0xbb/0x8b0 [ath9k]
[<ffffffffa031c616>] ath9k_tx+0x156/0x2b0 [ath9k]
[<ffffffffa0156f43>] __ieee80211_tx+0x123/0x1c0 [mac80211]
[<ffffffffa0157fef>] ieee80211_tx+0xef/0x2a0 [mac80211]
[<ffffffffa0158287>] ieee80211_xmit+0xe7/0x280 [mac80211]
[<ffffffffa015847f>] ieee80211_tx_skb+0x5f/0x90 [mac80211]
[<ffffffffa015b164>] ieee80211_send_auth+0x164/0x1f0 [mac80211]
[<ffffffffa014b1b6>] ieee80211_authenticate+0xf6/0x130 [mac80211]
[<ffffffffa014bf1a>] ieee80211_rx_mgmt_probe_resp+0x1da/0x200 [mac80211]
[<ffffffffa014cd95>] ieee80211_sta_work+0x9a5/0x1100 [mac80211]
[<ffffffff81067478>] worker_thread+0x1c8/0x350
[<ffffffff8106d066>] kthread+0xb6/0xc0
[<ffffffff8100d35a>] child_rip+0xa/0x20
unreferenced object 0xffff8800625d6888 (size 96):
comm "softirq", pid 0, jiffies 4295700339
backtrace:
[<ffffffff810e312c>] create_object+0x14c/0x2f0
[<ffffffff810e3425>] kmemleak_alloc+0x35/0x80
[<ffffffff810dd904>] kmem_cache_alloc+0xc4/0x150
[<ffffffffa03227eb>] ath_tx_start+0xbb/0x8b0 [ath9k]
[<ffffffffa031c616>] ath9k_tx+0x156/0x2b0 [ath9k]
[<ffffffffa0156f43>] __ieee80211_tx+0x123/0x1c0 [mac80211]
[<ffffffffa0157fef>] ieee80211_tx+0xef/0x2a0 [mac80211]
[<ffffffffa0158287>] ieee80211_xmit+0xe7/0x280 [mac80211]
[<ffffffffa015847f>] ieee80211_tx_skb+0x5f/0x90 [mac80211]
[<ffffffffa014cb13>] ieee80211_sta_work+0x723/0x1100 [mac80211]
[<ffffffff81067478>] worker_thread+0x1c8/0x350
[<ffffffff8106d066>] kthread+0xb6/0xc0
[<ffffffff8100d35a>] child_rip+0xa/0x20
[<ffffffffffffffff>] 0xffffffffffffffff
Regards,
Davide
^ permalink raw reply
* Re: [PATCH 1/2] cfg80211: initialize rate control after station inserted
From: reinette chatre @ 2009-08-28 22:18 UTC (permalink / raw)
To: Johannes Berg; +Cc: linville@tuxdriver.com, linux-wireless@vger.kernel.org
In-Reply-To: <1251493298.3456.34.camel@johannes.local>
Hi Johannes,
On Fri, 2009-08-28 at 14:01 -0700, Johannes Berg wrote:
> > This work is motivated by an attempt to untangle the iwlwifi station
> > management to be able to use mac80211's sta notify callback. From 4965
> > and up the rate scaling in the device is done per station, so an entry
> > in the station table is required for the rate scaling initialization to
> > succeed.
>
> Interesting. I've been thinking about making it go the other way --
> remove rate scaling hooks completely. wl1271 apparently has rate scaling
> completely in the firmware, so the RS algorithm on the host is just
> overhead. I've been thinking putting 4965+ RS into the _driver_ makes
> more sense since it really does a lot in the firmware and not on the
> host.
Yes, it does do a lot in firmware. Unfortunately I am not too familiar
with the details (yet).
> Do you think we should try to go that route? I'd think it would probably
> be a hardware flag ("no RS algo please") and then we'd skip all the
> hooks and put things into the driver. The advantage is that we don't
> care about the mac80211 API any more, things get cleaner and we can just
> do all RS init from sta_notify().
It could do RS init from sta_notify and that would solve this problem. I
am not familiar with how the other hooks operate to know at this time
what it will take to do everything in the driver. Come to think of it,
as a test over here I can just make our RS init routine a no-op and then
do the init from sta notify.
>
> I've also been thinking if there's a way to make sta_notify() able to
> sleep but so far I don't see one unfortunately.
Having it sleep will help a lot. When a station is added we need to tell
the device about it. Since the call cannot sleep we cannot really tell
mac80211 if this failed because the failure will only be known at a
later time. I have not yet figured out how to deal with this case.
> > Right now iwlwifi is adding stations inside the rate scaling code in
> > order to work around this issue. I'd like to clean this up and only use
> > the sta notify callback.
>
> Makes sense, thanks, I appreciate that -- should be a good cleanup to
> the driver and reduce the number of places that try to add a station and
> make the driver more streamlined.
Exactly.
> > > -- all that seems to do is add race conditions,
> > > allowing other code to find not-yet-initialised stations.
> >
> > I did not realize that this can happen. Can you please elaborate?
>
> As soon as sta_insert() got called, a packet transmitted to that station
> can be processed, find the sta info, and it seems we could end up
> calling rate_control_get_rate() before the init was done, through a race
> condition.
oh - I see - that's bad. Although, that may explain why iwlwifi is
adding stations in get_rate() also.
Reinette
^ permalink raw reply
* Re: [PATCH 1/2] cfg80211: initialize rate control after station inserted
From: Tim Gardner @ 2009-08-28 21:40 UTC (permalink / raw)
To: Johannes Berg
Cc: reinette chatre, linville@tuxdriver.com,
linux-wireless@vger.kernel.org
In-Reply-To: <1251493298.3456.34.camel@johannes.local>
Johannes Berg wrote:
> Hi Reinette,
>
>> This work is motivated by an attempt to untangle the iwlwifi station
>> management to be able to use mac80211's sta notify callback. From 4965
>> and up the rate scaling in the device is done per station, so an entry
>> in the station table is required for the rate scaling initialization to
>> succeed.
>
> Interesting. I've been thinking about making it go the other way --
> remove rate scaling hooks completely. wl1271 apparently has rate scaling
> completely in the firmware, so the RS algorithm on the host is just
> overhead. I've been thinking putting 4965+ RS into the _driver_ makes
> more sense since it really does a lot in the firmware and not on the
> host.
>
> Do you think we should try to go that route? I'd think it would probably
> be a hardware flag ("no RS algo please") and then we'd skip all the
> hooks and put things into the driver. The advantage is that we don't
> care about the mac80211 API any more, things get cleaner and we can just
> do all RS init from sta_notify().
>
Wouldn't that make it difficult to experiment with external rate scaling
algorithms? Not that minstrel or the other in-driver rate scaling
algorithms always get it right, but they are certainly more transparent
(and changeable) then firmware.
rtg
--
Tim Gardner tim.gardner@canonical.com
^ permalink raw reply
* Re: [PATCH 1/2] cfg80211: initialize rate control after station inserted
From: Luis R. Rodriguez @ 2009-08-28 21:26 UTC (permalink / raw)
To: Johannes Berg
Cc: reinette chatre, linville@tuxdriver.com,
linux-wireless@vger.kernel.org
In-Reply-To: <1251493298.3456.34.camel@johannes.local>
On Fri, Aug 28, 2009 at 2:01 PM, Johannes Berg<johannes@sipsolutions.net> wrote:
> Interesting. I've been thinking about making it go the other way --
> remove rate scaling hooks completely. wl1271 apparently has rate scaling
> completely in the firmware,
Just FYI -- ar9271 seems to also do this in firmware, haven't gotten
to that part yet but so I'm told.
Luis
^ permalink raw reply
* Re: [PATCH 1/2] cfg80211: initialize rate control after station inserted
From: Johannes Berg @ 2009-08-28 21:01 UTC (permalink / raw)
To: reinette chatre; +Cc: linville@tuxdriver.com, linux-wireless@vger.kernel.org
In-Reply-To: <1251474321.3805.73.camel@rc-desk>
[-- Attachment #1: Type: text/plain, Size: 2981 bytes --]
Hi Reinette,
> This work is motivated by an attempt to untangle the iwlwifi station
> management to be able to use mac80211's sta notify callback. From 4965
> and up the rate scaling in the device is done per station, so an entry
> in the station table is required for the rate scaling initialization to
> succeed.
Interesting. I've been thinking about making it go the other way --
remove rate scaling hooks completely. wl1271 apparently has rate scaling
completely in the firmware, so the RS algorithm on the host is just
overhead. I've been thinking putting 4965+ RS into the _driver_ makes
more sense since it really does a lot in the firmware and not on the
host.
Do you think we should try to go that route? I'd think it would probably
be a hardware flag ("no RS algo please") and then we'd skip all the
hooks and put things into the driver. The advantage is that we don't
care about the mac80211 API any more, things get cleaner and we can just
do all RS init from sta_notify().
I've also been thinking if there's a way to make sta_notify() able to
sleep but so far I don't see one unfortunately.
Thoughts?
Anyhow, thanks for the explanation.
> > > @@ -742,13 +740,17 @@ static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev,
> > > if (err == -EEXIST && layer2_update) {
> > > /* Need to update layer 2 devices on reassociation */
> > > sta = sta_info_get(local, mac);
> > > - if (sta)
> > > + if (sta) {
> > > + rate_control_rate_init(sta);
> > > ieee80211_send_layer2_update(sta);
> > > + }
> > > }
> >
> > Why is this necessary? It should already have been called for this
> > station earlier?
>
> maybe - I just tried to have the code behave exactly as before, just
> with the rate scale initialization called later. Even before this patch,
> rate scaling initialization would be called if the station already
> exists.
>
> If it is not necessary I can remove it.
No, right, I understand now.
> Right now iwlwifi is adding stations inside the rate scaling code in
> order to work around this issue. I'd like to clean this up and only use
> the sta notify callback.
Makes sense, thanks, I appreciate that -- should be a good cleanup to
the driver and reduce the number of places that try to add a station and
make the driver more streamlined.
> > Same in ibss.c (not quoting it here) where you're only moving it to
> > after sta_info_insert()
>
> This was my goal actually.
Yeah, I finally understood :)
> > -- all that seems to do is add race conditions,
> > allowing other code to find not-yet-initialised stations.
>
> I did not realize that this can happen. Can you please elaborate?
As soon as sta_insert() got called, a packet transmitted to that station
can be processed, find the sta info, and it seems we could end up
calling rate_control_get_rate() before the init was done, through a race
condition.
johannes
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 801 bytes --]
^ permalink raw reply
* Re: b43: LP-PHY: Fix TX gain tables
From: Michael Buesch @ 2009-08-28 20:39 UTC (permalink / raw)
To: Gábor Stefanik
Cc: John Linville, Larry Finger, Mark Huijgen, Broadcom Wireless,
linux-wireless
In-Reply-To: <4A983FB2.2020509@gmail.com>
On Friday 28 August 2009 22:36:02 Gábor Stefanik wrote:
> The rev1 2GHz and rev2 5GHz gain tables were incorrectly documented
> on the specs originally. Update these gaintables to match the cor-
> rected specs.
>
> Signed-off-by: Gábor Stefanik <netroller.3d@gmail.com>
ack
--
Greetings, Michael.
^ permalink raw reply
* [PATCH] b43: LP-PHY: Fix TX gain tables
From: Gábor Stefanik @ 2009-08-28 20:37 UTC (permalink / raw)
To: John Linville, Michael Buesch, Larry Finger
Cc: Mark Huijgen, Broadcom Wireless, linux-wireless
In-Reply-To: <4A983FB2.2020509@gmail.com>
Just noticed that the [PATCH] tag is accidentally missing on this one
- I hope you can still apply it.
2009/8/28 Gábor Stefanik <netrolller.3d@gmail.com>:
> The rev1 2GHz and rev2 5GHz gain tables were incorrectly documented
> on the specs originally. Update these gaintables to match the cor-
> rected specs.
>
> Signed-off-by: Gábor Stefanik <netroller.3d@gmail.com>
> ---
> drivers/net/wireless/b43/tables_lpphy.c | 306
> +++++++++++++++---------------
> 1 files changed, 153 insertions(+), 153 deletions(-)
>
> diff --git a/drivers/net/wireless/b43/tables_lpphy.c
> b/drivers/net/wireless/b43/tables_lpphy.c
> index b24521c..0312b31 100644
> --- a/drivers/net/wireless/b43/tables_lpphy.c
> +++ b/drivers/net/wireless/b43/tables_lpphy.c
> @@ -1613,11 +1613,62 @@ static struct lpphy_tx_gain_table_entry
> lpphy_rev1_nopa_tx_gain_table[] = {
> };
>
> static struct lpphy_tx_gain_table_entry lpphy_rev1_2ghz_tx_gain_table[] = {
> - { .gm = 4, .pga = 15, .pad = 9, .dac = 0, .bb_mult = 85, },
> - { .gm = 4, .pga = 15, .pad = 9, .dac = 0, .bb_mult = 81, },
> - { .gm = 4, .pga = 15, .pad = 9, .dac = 0, .bb_mult = 78, },
> - { .gm = 4, .pga = 15, .pad = 9, .dac = 0, .bb_mult = 76, },
> - { .gm = 4, .pga = 15, .pad = 9, .dac = 0, .bb_mult = 74, },
> + { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 90, },
> + { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 88, },
> + { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 85, },
> + { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 83, },
> + { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 81, },
> + { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 78, },
> + { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 76, },
> + { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 74, },
> + { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 72, },
> + { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 70, },
> + { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 68, },
> + { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 66, },
> + { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 64, },
> + { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 62, },
> + { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 60, },
> + { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 59, },
> + { .gm = 4, .pga = 15, .pad = 14, .dac = 0, .bb_mult = 72, },
> + { .gm = 4, .pga = 15, .pad = 14, .dac = 0, .bb_mult = 70, },
> + { .gm = 4, .pga = 15, .pad = 14, .dac = 0, .bb_mult = 68, },
> + { .gm = 4, .pga = 15, .pad = 14, .dac = 0, .bb_mult = 66, },
> + { .gm = 4, .pga = 15, .pad = 14, .dac = 0, .bb_mult = 64, },
> + { .gm = 4, .pga = 15, .pad = 14, .dac = 0, .bb_mult = 62, },
> + { .gm = 4, .pga = 15, .pad = 14, .dac = 0, .bb_mult = 60, },
> + { .gm = 4, .pga = 15, .pad = 14, .dac = 0, .bb_mult = 59, },
> + { .gm = 4, .pga = 15, .pad = 13, .dac = 0, .bb_mult = 72, },
> + { .gm = 4, .pga = 15, .pad = 13, .dac = 0, .bb_mult = 70, },
> + { .gm = 4, .pga = 15, .pad = 13, .dac = 0, .bb_mult = 68, },
> + { .gm = 4, .pga = 15, .pad = 13, .dac = 0, .bb_mult = 66, },
> + { .gm = 4, .pga = 15, .pad = 13, .dac = 0, .bb_mult = 64, },
> + { .gm = 4, .pga = 15, .pad = 13, .dac = 0, .bb_mult = 62, },
> + { .gm = 4, .pga = 15, .pad = 13, .dac = 0, .bb_mult = 60, },
> + { .gm = 4, .pga = 15, .pad = 13, .dac = 0, .bb_mult = 59, },
> + { .gm = 4, .pga = 15, .pad = 12, .dac = 0, .bb_mult = 72, },
> + { .gm = 4, .pga = 15, .pad = 12, .dac = 0, .bb_mult = 70, },
> + { .gm = 4, .pga = 15, .pad = 12, .dac = 0, .bb_mult = 68, },
> + { .gm = 4, .pga = 15, .pad = 12, .dac = 0, .bb_mult = 66, },
> + { .gm = 4, .pga = 15, .pad = 12, .dac = 0, .bb_mult = 64, },
> + { .gm = 4, .pga = 15, .pad = 12, .dac = 0, .bb_mult = 62, },
> + { .gm = 4, .pga = 15, .pad = 12, .dac = 0, .bb_mult = 60, },
> + { .gm = 4, .pga = 15, .pad = 12, .dac = 0, .bb_mult = 59, },
> + { .gm = 4, .pga = 15, .pad = 11, .dac = 0, .bb_mult = 72, },
> + { .gm = 4, .pga = 15, .pad = 11, .dac = 0, .bb_mult = 70, },
> + { .gm = 4, .pga = 15, .pad = 11, .dac = 0, .bb_mult = 68, },
> + { .gm = 4, .pga = 15, .pad = 11, .dac = 0, .bb_mult = 66, },
> + { .gm = 4, .pga = 15, .pad = 11, .dac = 0, .bb_mult = 64, },
> + { .gm = 4, .pga = 15, .pad = 11, .dac = 0, .bb_mult = 62, },
> + { .gm = 4, .pga = 15, .pad = 11, .dac = 0, .bb_mult = 60, },
> + { .gm = 4, .pga = 15, .pad = 11, .dac = 0, .bb_mult = 59, },
> + { .gm = 4, .pga = 15, .pad = 10, .dac = 0, .bb_mult = 72, },
> + { .gm = 4, .pga = 15, .pad = 10, .dac = 0, .bb_mult = 70, },
> + { .gm = 4, .pga = 15, .pad = 10, .dac = 0, .bb_mult = 68, },
> + { .gm = 4, .pga = 15, .pad = 10, .dac = 0, .bb_mult = 66, },
> + { .gm = 4, .pga = 15, .pad = 10, .dac = 0, .bb_mult = 64, },
> + { .gm = 4, .pga = 15, .pad = 10, .dac = 0, .bb_mult = 62, },
> + { .gm = 4, .pga = 15, .pad = 10, .dac = 0, .bb_mult = 60, },
> + { .gm = 4, .pga = 15, .pad = 10, .dac = 0, .bb_mult = 59, },
> { .gm = 4, .pga = 15, .pad = 9, .dac = 0, .bb_mult = 72, },
> { .gm = 4, .pga = 15, .pad = 9, .dac = 0, .bb_mult = 70, },
> { .gm = 4, .pga = 15, .pad = 9, .dac = 0, .bb_mult = 68, },
> @@ -1690,57 +1741,6 @@ static struct lpphy_tx_gain_table_entry
> lpphy_rev1_2ghz_tx_gain_table[] = {
> { .gm = 4, .pga = 10, .pad = 6, .dac = 0, .bb_mult = 64, },
> { .gm = 4, .pga = 10, .pad = 6, .dac = 0, .bb_mult = 62, },
> { .gm = 4, .pga = 10, .pad = 6, .dac = 0, .bb_mult = 60, },
> - { .gm = 4, .pga = 10, .pad = 6, .dac = 0, .bb_mult = 59, },
> - { .gm = 4, .pga = 10, .pad = 5, .dac = 0, .bb_mult = 72, },
> - { .gm = 4, .pga = 10, .pad = 5, .dac = 0, .bb_mult = 70, },
> - { .gm = 4, .pga = 10, .pad = 5, .dac = 0, .bb_mult = 68, },
> - { .gm = 4, .pga = 10, .pad = 5, .dac = 0, .bb_mult = 66, },
> - { .gm = 4, .pga = 10, .pad = 5, .dac = 0, .bb_mult = 64, },
> - { .gm = 4, .pga = 10, .pad = 5, .dac = 0, .bb_mult = 62, },
> - { .gm = 4, .pga = 10, .pad = 5, .dac = 0, .bb_mult = 60, },
> - { .gm = 4, .pga = 10, .pad = 5, .dac = 0, .bb_mult = 59, },
> - { .gm = 4, .pga = 9, .pad = 5, .dac = 0, .bb_mult = 70, },
> - { .gm = 4, .pga = 9, .pad = 5, .dac = 0, .bb_mult = 68, },
> - { .gm = 4, .pga = 9, .pad = 5, .dac = 0, .bb_mult = 66, },
> - { .gm = 4, .pga = 9, .pad = 5, .dac = 0, .bb_mult = 64, },
> - { .gm = 4, .pga = 9, .pad = 5, .dac = 0, .bb_mult = 63, },
> - { .gm = 4, .pga = 9, .pad = 5, .dac = 0, .bb_mult = 61, },
> - { .gm = 4, .pga = 9, .pad = 5, .dac = 0, .bb_mult = 59, },
> - { .gm = 4, .pga = 9, .pad = 4, .dac = 0, .bb_mult = 71, },
> - { .gm = 4, .pga = 9, .pad = 4, .dac = 0, .bb_mult = 69, },
> - { .gm = 4, .pga = 9, .pad = 4, .dac = 0, .bb_mult = 67, },
> - { .gm = 4, .pga = 9, .pad = 4, .dac = 0, .bb_mult = 65, },
> - { .gm = 4, .pga = 9, .pad = 4, .dac = 0, .bb_mult = 63, },
> - { .gm = 4, .pga = 9, .pad = 4, .dac = 0, .bb_mult = 62, },
> - { .gm = 4, .pga = 9, .pad = 4, .dac = 0, .bb_mult = 60, },
> - { .gm = 4, .pga = 9, .pad = 4, .dac = 0, .bb_mult = 58, },
> - { .gm = 4, .pga = 8, .pad = 4, .dac = 0, .bb_mult = 70, },
> - { .gm = 4, .pga = 8, .pad = 4, .dac = 0, .bb_mult = 68, },
> - { .gm = 4, .pga = 8, .pad = 4, .dac = 0, .bb_mult = 66, },
> - { .gm = 4, .pga = 8, .pad = 4, .dac = 0, .bb_mult = 65, },
> - { .gm = 4, .pga = 8, .pad = 4, .dac = 0, .bb_mult = 63, },
> - { .gm = 4, .pga = 8, .pad = 4, .dac = 0, .bb_mult = 61, },
> - { .gm = 4, .pga = 8, .pad = 4, .dac = 0, .bb_mult = 59, },
> - { .gm = 4, .pga = 7, .pad = 4, .dac = 0, .bb_mult = 68, },
> - { .gm = 4, .pga = 7, .pad = 4, .dac = 0, .bb_mult = 66, },
> - { .gm = 4, .pga = 7, .pad = 4, .dac = 0, .bb_mult = 64, },
> - { .gm = 4, .pga = 7, .pad = 4, .dac = 0, .bb_mult = 62, },
> - { .gm = 4, .pga = 7, .pad = 4, .dac = 0, .bb_mult = 61, },
> - { .gm = 4, .pga = 7, .pad = 4, .dac = 0, .bb_mult = 59, },
> - { .gm = 4, .pga = 7, .pad = 3, .dac = 0, .bb_mult = 67, },
> - { .gm = 4, .pga = 7, .pad = 3, .dac = 0, .bb_mult = 65, },
> - { .gm = 4, .pga = 7, .pad = 3, .dac = 0, .bb_mult = 63, },
> - { .gm = 4, .pga = 7, .pad = 3, .dac = 0, .bb_mult = 62, },
> - { .gm = 4, .pga = 7, .pad = 3, .dac = 0, .bb_mult = 60, },
> - { .gm = 4, .pga = 6, .pad = 3, .dac = 0, .bb_mult = 65, },
> - { .gm = 4, .pga = 6, .pad = 3, .dac = 0, .bb_mult = 63, },
> - { .gm = 4, .pga = 6, .pad = 3, .dac = 0, .bb_mult = 61, },
> - { .gm = 4, .pga = 6, .pad = 3, .dac = 0, .bb_mult = 60, },
> - { .gm = 4, .pga = 6, .pad = 3, .dac = 0, .bb_mult = 58, },
> - { .gm = 4, .pga = 5, .pad = 3, .dac = 0, .bb_mult = 68, },
> - { .gm = 4, .pga = 5, .pad = 3, .dac = 0, .bb_mult = 66, },
> - { .gm = 4, .pga = 5, .pad = 3, .dac = 0, .bb_mult = 64, },
> - { .gm = 4, .pga = 5, .pad = 3, .dac = 0, .bb_mult = 62, },
> };
>
> static struct lpphy_tx_gain_table_entry lpphy_rev1_5ghz_tx_gain_table[] = {
> @@ -2168,103 +2168,103 @@ static struct lpphy_tx_gain_table_entry
> lpphy_rev2_5ghz_tx_gain_table[] = {
> { .gm = 255, .pga = 255, .pad = 255, .dac = 0, .bb_mult = 68, },
> { .gm = 255, .pga = 255, .pad = 255, .dac = 0, .bb_mult = 66, },
> { .gm = 255, .pga = 255, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 248, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 241, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 234, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 227, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 221, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 215, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 208, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 203, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 197, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 191, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 186, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 181, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 175, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 170, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 166, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 161, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 156, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 152, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 148, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 143, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 139, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 135, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 132, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 128, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 124, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 121, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 117, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 114, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 111, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 108, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 104, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 102, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 99, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 96, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 93, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 90, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 88, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 85, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 83, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 81, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 78, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 76, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 74, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 72, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 70, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 68, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 66, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 64, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 64, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 62, .pad = 255, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 62, .pad = 248, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 60, .pad = 248, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 60, .pad = 241, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 59, .pad = 241, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 59, .pad = 234, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 57, .pad = 234, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 57, .pad = 227, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 55, .pad = 227, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 55, .pad = 221, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 54, .pad = 221, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 54, .pad = 215, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 52, .pad = 215, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 52, .pad = 208, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 51, .pad = 208, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 51, .pad = 203, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 49, .pad = 203, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 49, .pad = 197, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 48, .pad = 197, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 48, .pad = 191, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 47, .pad = 191, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 47, .pad = 186, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 45, .pad = 186, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 45, .pad = 181, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 44, .pad = 181, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 44, .pad = 175, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 43, .pad = 175, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 43, .pad = 170, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 42, .pad = 170, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 42, .pad = 166, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 40, .pad = 166, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 40, .pad = 161, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 39, .pad = 161, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 39, .pad = 156, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 38, .pad = 156, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 38, .pad = 152, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 37, .pad = 152, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 37, .pad = 148, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 36, .pad = 148, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 36, .pad = 143, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 35, .pad = 143, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 35, .pad = 139, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 34, .pad = 139, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 34, .pad = 135, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 33, .pad = 135, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 33, .pad = 132, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 32, .pad = 132, .dac = 0, .bb_mult = 64, },
> - { .gm = 255, .pga = 32, .pad = 128, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 248, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 241, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 234, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 227, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 221, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 215, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 208, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 203, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 197, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 191, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 186, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 181, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 175, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 170, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 166, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 161, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 156, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 152, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 148, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 143, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 139, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 135, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 132, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 128, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 124, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 121, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 117, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 114, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 111, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 108, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 104, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 102, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 99, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 96, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 93, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 90, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 88, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 85, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 83, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 81, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 78, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 76, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 74, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 72, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 70, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 68, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 66, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 64, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 64, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 255, .pad = 62, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 248, .pad = 62, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 248, .pad = 60, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 241, .pad = 60, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 241, .pad = 59, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 234, .pad = 59, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 234, .pad = 57, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 227, .pad = 57, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 227, .pad = 55, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 221, .pad = 55, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 221, .pad = 54, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 215, .pad = 54, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 215, .pad = 52, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 208, .pad = 52, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 208, .pad = 51, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 203, .pad = 51, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 203, .pad = 49, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 197, .pad = 49, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 197, .pad = 48, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 191, .pad = 48, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 191, .pad = 47, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 186, .pad = 47, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 186, .pad = 45, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 181, .pad = 45, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 181, .pad = 44, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 175, .pad = 44, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 175, .pad = 43, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 170, .pad = 43, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 170, .pad = 42, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 166, .pad = 42, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 166, .pad = 40, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 161, .pad = 40, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 161, .pad = 39, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 156, .pad = 39, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 156, .pad = 38, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 152, .pad = 38, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 152, .pad = 37, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 148, .pad = 37, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 148, .pad = 36, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 143, .pad = 36, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 143, .pad = 35, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 139, .pad = 35, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 139, .pad = 34, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 135, .pad = 34, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 135, .pad = 33, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 132, .pad = 33, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 132, .pad = 32, .dac = 0, .bb_mult = 64, },
> + { .gm = 255, .pga = 128, .pad = 32, .dac = 0, .bb_mult = 64, },
> };
>
> void lpphy_rev0_1_table_init(struct b43_wldev *dev)
> --
> 1.6.2.4
>
>
>
>
--
Vista: [V]iruses, [I]ntruders, [S]pyware, [T]rojans and [A]dware. :-)
^ permalink raw reply
* b43: LP-PHY: Fix TX gain tables
From: Gábor Stefanik @ 2009-08-28 20:36 UTC (permalink / raw)
To: John Linville, Michael Buesch, Larry Finger
Cc: Mark Huijgen, Broadcom Wireless, linux-wireless
The rev1 2GHz and rev2 5GHz gain tables were incorrectly documented
on the specs originally. Update these gaintables to match the cor-
rected specs.
Signed-off-by: Gábor Stefanik <netroller.3d@gmail.com>
---
drivers/net/wireless/b43/tables_lpphy.c | 306 +++++++++++++++---------------
1 files changed, 153 insertions(+), 153 deletions(-)
diff --git a/drivers/net/wireless/b43/tables_lpphy.c b/drivers/net/wireless/b43/tables_lpphy.c
index b24521c..0312b31 100644
--- a/drivers/net/wireless/b43/tables_lpphy.c
+++ b/drivers/net/wireless/b43/tables_lpphy.c
@@ -1613,11 +1613,62 @@ static struct lpphy_tx_gain_table_entry lpphy_rev1_nopa_tx_gain_table[] = {
};
static struct lpphy_tx_gain_table_entry lpphy_rev1_2ghz_tx_gain_table[] = {
- { .gm = 4, .pga = 15, .pad = 9, .dac = 0, .bb_mult = 85, },
- { .gm = 4, .pga = 15, .pad = 9, .dac = 0, .bb_mult = 81, },
- { .gm = 4, .pga = 15, .pad = 9, .dac = 0, .bb_mult = 78, },
- { .gm = 4, .pga = 15, .pad = 9, .dac = 0, .bb_mult = 76, },
- { .gm = 4, .pga = 15, .pad = 9, .dac = 0, .bb_mult = 74, },
+ { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 90, },
+ { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 88, },
+ { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 85, },
+ { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 83, },
+ { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 81, },
+ { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 78, },
+ { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 76, },
+ { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 74, },
+ { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 72, },
+ { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 70, },
+ { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 68, },
+ { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 66, },
+ { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 64, },
+ { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 62, },
+ { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 60, },
+ { .gm = 4, .pga = 15, .pad = 15, .dac = 0, .bb_mult = 59, },
+ { .gm = 4, .pga = 15, .pad = 14, .dac = 0, .bb_mult = 72, },
+ { .gm = 4, .pga = 15, .pad = 14, .dac = 0, .bb_mult = 70, },
+ { .gm = 4, .pga = 15, .pad = 14, .dac = 0, .bb_mult = 68, },
+ { .gm = 4, .pga = 15, .pad = 14, .dac = 0, .bb_mult = 66, },
+ { .gm = 4, .pga = 15, .pad = 14, .dac = 0, .bb_mult = 64, },
+ { .gm = 4, .pga = 15, .pad = 14, .dac = 0, .bb_mult = 62, },
+ { .gm = 4, .pga = 15, .pad = 14, .dac = 0, .bb_mult = 60, },
+ { .gm = 4, .pga = 15, .pad = 14, .dac = 0, .bb_mult = 59, },
+ { .gm = 4, .pga = 15, .pad = 13, .dac = 0, .bb_mult = 72, },
+ { .gm = 4, .pga = 15, .pad = 13, .dac = 0, .bb_mult = 70, },
+ { .gm = 4, .pga = 15, .pad = 13, .dac = 0, .bb_mult = 68, },
+ { .gm = 4, .pga = 15, .pad = 13, .dac = 0, .bb_mult = 66, },
+ { .gm = 4, .pga = 15, .pad = 13, .dac = 0, .bb_mult = 64, },
+ { .gm = 4, .pga = 15, .pad = 13, .dac = 0, .bb_mult = 62, },
+ { .gm = 4, .pga = 15, .pad = 13, .dac = 0, .bb_mult = 60, },
+ { .gm = 4, .pga = 15, .pad = 13, .dac = 0, .bb_mult = 59, },
+ { .gm = 4, .pga = 15, .pad = 12, .dac = 0, .bb_mult = 72, },
+ { .gm = 4, .pga = 15, .pad = 12, .dac = 0, .bb_mult = 70, },
+ { .gm = 4, .pga = 15, .pad = 12, .dac = 0, .bb_mult = 68, },
+ { .gm = 4, .pga = 15, .pad = 12, .dac = 0, .bb_mult = 66, },
+ { .gm = 4, .pga = 15, .pad = 12, .dac = 0, .bb_mult = 64, },
+ { .gm = 4, .pga = 15, .pad = 12, .dac = 0, .bb_mult = 62, },
+ { .gm = 4, .pga = 15, .pad = 12, .dac = 0, .bb_mult = 60, },
+ { .gm = 4, .pga = 15, .pad = 12, .dac = 0, .bb_mult = 59, },
+ { .gm = 4, .pga = 15, .pad = 11, .dac = 0, .bb_mult = 72, },
+ { .gm = 4, .pga = 15, .pad = 11, .dac = 0, .bb_mult = 70, },
+ { .gm = 4, .pga = 15, .pad = 11, .dac = 0, .bb_mult = 68, },
+ { .gm = 4, .pga = 15, .pad = 11, .dac = 0, .bb_mult = 66, },
+ { .gm = 4, .pga = 15, .pad = 11, .dac = 0, .bb_mult = 64, },
+ { .gm = 4, .pga = 15, .pad = 11, .dac = 0, .bb_mult = 62, },
+ { .gm = 4, .pga = 15, .pad = 11, .dac = 0, .bb_mult = 60, },
+ { .gm = 4, .pga = 15, .pad = 11, .dac = 0, .bb_mult = 59, },
+ { .gm = 4, .pga = 15, .pad = 10, .dac = 0, .bb_mult = 72, },
+ { .gm = 4, .pga = 15, .pad = 10, .dac = 0, .bb_mult = 70, },
+ { .gm = 4, .pga = 15, .pad = 10, .dac = 0, .bb_mult = 68, },
+ { .gm = 4, .pga = 15, .pad = 10, .dac = 0, .bb_mult = 66, },
+ { .gm = 4, .pga = 15, .pad = 10, .dac = 0, .bb_mult = 64, },
+ { .gm = 4, .pga = 15, .pad = 10, .dac = 0, .bb_mult = 62, },
+ { .gm = 4, .pga = 15, .pad = 10, .dac = 0, .bb_mult = 60, },
+ { .gm = 4, .pga = 15, .pad = 10, .dac = 0, .bb_mult = 59, },
{ .gm = 4, .pga = 15, .pad = 9, .dac = 0, .bb_mult = 72, },
{ .gm = 4, .pga = 15, .pad = 9, .dac = 0, .bb_mult = 70, },
{ .gm = 4, .pga = 15, .pad = 9, .dac = 0, .bb_mult = 68, },
@@ -1690,57 +1741,6 @@ static struct lpphy_tx_gain_table_entry lpphy_rev1_2ghz_tx_gain_table[] = {
{ .gm = 4, .pga = 10, .pad = 6, .dac = 0, .bb_mult = 64, },
{ .gm = 4, .pga = 10, .pad = 6, .dac = 0, .bb_mult = 62, },
{ .gm = 4, .pga = 10, .pad = 6, .dac = 0, .bb_mult = 60, },
- { .gm = 4, .pga = 10, .pad = 6, .dac = 0, .bb_mult = 59, },
- { .gm = 4, .pga = 10, .pad = 5, .dac = 0, .bb_mult = 72, },
- { .gm = 4, .pga = 10, .pad = 5, .dac = 0, .bb_mult = 70, },
- { .gm = 4, .pga = 10, .pad = 5, .dac = 0, .bb_mult = 68, },
- { .gm = 4, .pga = 10, .pad = 5, .dac = 0, .bb_mult = 66, },
- { .gm = 4, .pga = 10, .pad = 5, .dac = 0, .bb_mult = 64, },
- { .gm = 4, .pga = 10, .pad = 5, .dac = 0, .bb_mult = 62, },
- { .gm = 4, .pga = 10, .pad = 5, .dac = 0, .bb_mult = 60, },
- { .gm = 4, .pga = 10, .pad = 5, .dac = 0, .bb_mult = 59, },
- { .gm = 4, .pga = 9, .pad = 5, .dac = 0, .bb_mult = 70, },
- { .gm = 4, .pga = 9, .pad = 5, .dac = 0, .bb_mult = 68, },
- { .gm = 4, .pga = 9, .pad = 5, .dac = 0, .bb_mult = 66, },
- { .gm = 4, .pga = 9, .pad = 5, .dac = 0, .bb_mult = 64, },
- { .gm = 4, .pga = 9, .pad = 5, .dac = 0, .bb_mult = 63, },
- { .gm = 4, .pga = 9, .pad = 5, .dac = 0, .bb_mult = 61, },
- { .gm = 4, .pga = 9, .pad = 5, .dac = 0, .bb_mult = 59, },
- { .gm = 4, .pga = 9, .pad = 4, .dac = 0, .bb_mult = 71, },
- { .gm = 4, .pga = 9, .pad = 4, .dac = 0, .bb_mult = 69, },
- { .gm = 4, .pga = 9, .pad = 4, .dac = 0, .bb_mult = 67, },
- { .gm = 4, .pga = 9, .pad = 4, .dac = 0, .bb_mult = 65, },
- { .gm = 4, .pga = 9, .pad = 4, .dac = 0, .bb_mult = 63, },
- { .gm = 4, .pga = 9, .pad = 4, .dac = 0, .bb_mult = 62, },
- { .gm = 4, .pga = 9, .pad = 4, .dac = 0, .bb_mult = 60, },
- { .gm = 4, .pga = 9, .pad = 4, .dac = 0, .bb_mult = 58, },
- { .gm = 4, .pga = 8, .pad = 4, .dac = 0, .bb_mult = 70, },
- { .gm = 4, .pga = 8, .pad = 4, .dac = 0, .bb_mult = 68, },
- { .gm = 4, .pga = 8, .pad = 4, .dac = 0, .bb_mult = 66, },
- { .gm = 4, .pga = 8, .pad = 4, .dac = 0, .bb_mult = 65, },
- { .gm = 4, .pga = 8, .pad = 4, .dac = 0, .bb_mult = 63, },
- { .gm = 4, .pga = 8, .pad = 4, .dac = 0, .bb_mult = 61, },
- { .gm = 4, .pga = 8, .pad = 4, .dac = 0, .bb_mult = 59, },
- { .gm = 4, .pga = 7, .pad = 4, .dac = 0, .bb_mult = 68, },
- { .gm = 4, .pga = 7, .pad = 4, .dac = 0, .bb_mult = 66, },
- { .gm = 4, .pga = 7, .pad = 4, .dac = 0, .bb_mult = 64, },
- { .gm = 4, .pga = 7, .pad = 4, .dac = 0, .bb_mult = 62, },
- { .gm = 4, .pga = 7, .pad = 4, .dac = 0, .bb_mult = 61, },
- { .gm = 4, .pga = 7, .pad = 4, .dac = 0, .bb_mult = 59, },
- { .gm = 4, .pga = 7, .pad = 3, .dac = 0, .bb_mult = 67, },
- { .gm = 4, .pga = 7, .pad = 3, .dac = 0, .bb_mult = 65, },
- { .gm = 4, .pga = 7, .pad = 3, .dac = 0, .bb_mult = 63, },
- { .gm = 4, .pga = 7, .pad = 3, .dac = 0, .bb_mult = 62, },
- { .gm = 4, .pga = 7, .pad = 3, .dac = 0, .bb_mult = 60, },
- { .gm = 4, .pga = 6, .pad = 3, .dac = 0, .bb_mult = 65, },
- { .gm = 4, .pga = 6, .pad = 3, .dac = 0, .bb_mult = 63, },
- { .gm = 4, .pga = 6, .pad = 3, .dac = 0, .bb_mult = 61, },
- { .gm = 4, .pga = 6, .pad = 3, .dac = 0, .bb_mult = 60, },
- { .gm = 4, .pga = 6, .pad = 3, .dac = 0, .bb_mult = 58, },
- { .gm = 4, .pga = 5, .pad = 3, .dac = 0, .bb_mult = 68, },
- { .gm = 4, .pga = 5, .pad = 3, .dac = 0, .bb_mult = 66, },
- { .gm = 4, .pga = 5, .pad = 3, .dac = 0, .bb_mult = 64, },
- { .gm = 4, .pga = 5, .pad = 3, .dac = 0, .bb_mult = 62, },
};
static struct lpphy_tx_gain_table_entry lpphy_rev1_5ghz_tx_gain_table[] = {
@@ -2168,103 +2168,103 @@ static struct lpphy_tx_gain_table_entry lpphy_rev2_5ghz_tx_gain_table[] = {
{ .gm = 255, .pga = 255, .pad = 255, .dac = 0, .bb_mult = 68, },
{ .gm = 255, .pga = 255, .pad = 255, .dac = 0, .bb_mult = 66, },
{ .gm = 255, .pga = 255, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 248, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 241, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 234, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 227, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 221, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 215, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 208, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 203, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 197, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 191, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 186, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 181, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 175, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 170, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 166, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 161, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 156, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 152, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 148, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 143, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 139, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 135, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 132, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 128, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 124, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 121, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 117, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 114, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 111, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 108, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 104, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 102, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 99, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 96, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 93, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 90, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 88, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 85, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 83, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 81, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 78, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 76, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 74, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 72, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 70, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 68, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 66, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 64, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 64, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 62, .pad = 255, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 62, .pad = 248, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 60, .pad = 248, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 60, .pad = 241, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 59, .pad = 241, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 59, .pad = 234, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 57, .pad = 234, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 57, .pad = 227, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 55, .pad = 227, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 55, .pad = 221, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 54, .pad = 221, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 54, .pad = 215, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 52, .pad = 215, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 52, .pad = 208, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 51, .pad = 208, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 51, .pad = 203, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 49, .pad = 203, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 49, .pad = 197, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 48, .pad = 197, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 48, .pad = 191, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 47, .pad = 191, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 47, .pad = 186, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 45, .pad = 186, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 45, .pad = 181, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 44, .pad = 181, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 44, .pad = 175, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 43, .pad = 175, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 43, .pad = 170, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 42, .pad = 170, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 42, .pad = 166, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 40, .pad = 166, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 40, .pad = 161, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 39, .pad = 161, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 39, .pad = 156, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 38, .pad = 156, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 38, .pad = 152, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 37, .pad = 152, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 37, .pad = 148, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 36, .pad = 148, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 36, .pad = 143, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 35, .pad = 143, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 35, .pad = 139, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 34, .pad = 139, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 34, .pad = 135, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 33, .pad = 135, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 33, .pad = 132, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 32, .pad = 132, .dac = 0, .bb_mult = 64, },
- { .gm = 255, .pga = 32, .pad = 128, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 248, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 241, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 234, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 227, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 221, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 215, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 208, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 203, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 197, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 191, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 186, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 181, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 175, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 170, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 166, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 161, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 156, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 152, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 148, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 143, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 139, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 135, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 132, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 128, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 124, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 121, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 117, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 114, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 111, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 108, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 104, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 102, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 99, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 96, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 93, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 90, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 88, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 85, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 83, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 81, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 78, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 76, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 74, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 72, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 70, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 68, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 66, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 64, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 64, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 255, .pad = 62, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 248, .pad = 62, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 248, .pad = 60, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 241, .pad = 60, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 241, .pad = 59, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 234, .pad = 59, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 234, .pad = 57, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 227, .pad = 57, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 227, .pad = 55, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 221, .pad = 55, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 221, .pad = 54, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 215, .pad = 54, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 215, .pad = 52, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 208, .pad = 52, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 208, .pad = 51, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 203, .pad = 51, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 203, .pad = 49, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 197, .pad = 49, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 197, .pad = 48, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 191, .pad = 48, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 191, .pad = 47, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 186, .pad = 47, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 186, .pad = 45, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 181, .pad = 45, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 181, .pad = 44, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 175, .pad = 44, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 175, .pad = 43, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 170, .pad = 43, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 170, .pad = 42, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 166, .pad = 42, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 166, .pad = 40, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 161, .pad = 40, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 161, .pad = 39, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 156, .pad = 39, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 156, .pad = 38, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 152, .pad = 38, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 152, .pad = 37, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 148, .pad = 37, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 148, .pad = 36, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 143, .pad = 36, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 143, .pad = 35, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 139, .pad = 35, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 139, .pad = 34, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 135, .pad = 34, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 135, .pad = 33, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 132, .pad = 33, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 132, .pad = 32, .dac = 0, .bb_mult = 64, },
+ { .gm = 255, .pga = 128, .pad = 32, .dac = 0, .bb_mult = 64, },
};
void lpphy_rev0_1_table_init(struct b43_wldev *dev)
--
1.6.2.4
^ permalink raw reply related
* [PATCH] b43: Fix typo in modparam_btcoex description
From: Gábor Stefanik @ 2009-08-28 20:34 UTC (permalink / raw)
To: John Linville, Michael Buesch
Cc: Larry Finger, Broadcom Wireless, linux-wireless, trivial
Signed-off-by: Gábor Stefanik <netrolller.3d@gmail.com>
---
drivers/net/wireless/b43/main.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
index 1263f4b..f2c5b2d 100644
--- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c
@@ -91,7 +91,7 @@ MODULE_PARM_DESC(qos, "Enable QOS support (default on)");
static int modparam_btcoex = 1;
module_param_named(btcoex, modparam_btcoex, int, 0444);
-MODULE_PARM_DESC(btcoex, "Enable Bluetooth coexistance (default on)");
+MODULE_PARM_DESC(btcoex, "Enable Bluetooth coexistence (default on)");
int b43_modparam_verbose = B43_VERBOSITY_DEFAULT;
module_param_named(verbose, b43_modparam_verbose, int, 0644);
--
1.6.2.4
^ 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