* Re: rc80211_minstrel.c:70 WARNING with 2.6.34-rc4
From: Felix Fietkau @ 2010-04-19 17:41 UTC (permalink / raw)
To: Richard Zidlicky; +Cc: Pavel Roskin, linux-wireless
In-Reply-To: <20100419174100.GA5312@linux-m68k.org>
On 2010-04-19 7:41 PM, Richard Zidlicky wrote:
>
> Hi,
>
>> > I am getting tons of these http://www.kerneloops.org/submitresult.php?number=3048061,
>> > appears every packet triggers that.
>>
>> The warning comes from the function rix_to_ndx() in rc80211_minstrel.c:
>>
>> /* convert mac80211 rate index to local array index */
>> static inline int
>> rix_to_ndx(struct minstrel_sta_info *mi, int rix)
>> {
>> int i = rix;
>> for (i = rix; i >= 0; i--)
>> if (mi->r[i].rix == rix)
>> break;
>> WARN_ON(i < 0);
>> return i;
>> }
>>
>> > Can provide lots of debugging info.
>>
>> My impression is that WARN_ON is not warranted in that function, but it
>> would be interesting to know how you got to that point.
>
> I am using the rt73usb, WEP, adhoc, fixed rate(11M) on both ends:
>
> wlan0 IEEE 802.11bg ESSID:"XXXXXXXX"
> Mode:Ad-Hoc Frequency:2.442 GHz Cell: F6:B2:CB:FC:62:6C
> Tx-Power=20 dBm
> Retry long limit:7 RTS thr:off Fragment thr:off
> Encryption key: XXXXXXXXXX
> Power Management:on
>
> It is 2.6.34-rc4, no compat-wireless.
>
> As of unusual circumstances - the rt73usb driver has some bug that causes
> very high retransmit rates. On the opposite end the ath5k driver complains "cant
> handle jumbo frames".
> I had it perfectly working some time ago but need to figure out which off the many
> patches did it and apply it to the new kernel.
> This might stress minstrel more than needed but otoh it was my impression that the
> warning was triggered by every single packet.
>
> Let me know if you want any more info.
This warning typically shows up, whenever the driver reports a rate to
minstrel in the tx status that is not part of the supported/negotiated
rate set - that's the reason the index lookup above fails.
- Felix
^ permalink raw reply
* [PATCH] mac80211: pass HT changes to driver when off channel
From: Reinette Chatre @ 2010-04-19 17:46 UTC (permalink / raw)
To: johannes; +Cc: linville, linux-wireless, Reinette Chatre
From: Reinette Chatre <reinette.chatre@intel.com>
Since "mac80211: make off-channel work generic" drivers have not been
notified of configuration changes after association or authentication. This
caused more dependence on current state to ensure driver will be notified
when configuration changes occur. One such problem arises if off-channel is
in progress when HT information changes. Since HT is only enabled on the
"oper_channel" the driver will never be notified of this change. Usually
the driver is notified soon after of a BSS information change
(BSS_CHANGED_HT) ... but since the driver did not get a notification that
this is a HT channel the new BSS information does not make sense.
Fix this by also changing the off-channel information when HT is enabled
and thus cause driver to be notified correctly.
This fixes a problem in 4965 when associated with 5GHz 40MHz channel.
Without this patch the system can associate but is unable to transfer any
data, not even ping.
See http://bugzilla.intellinuxwireless.org/show_bug.cgi?id=2158
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
---
net/mac80211/mlme.c | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 35d8502..3133681 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -175,6 +175,8 @@ static u32 ieee80211_enable_ht(struct ieee80211_sub_if_data *sdata,
ht_changed = conf_is_ht(&local->hw.conf) != enable_ht ||
channel_type != local->hw.conf.channel_type;
+ if (local->tmp_channel)
+ local->tmp_channel_type = channel_type;
local->oper_channel_type = channel_type;
if (ht_changed) {
--
1.6.3.3
^ permalink raw reply related
* Re: iwlagn unexpected AddBA Req
From: reinette chatre @ 2010-04-19 17:50 UTC (permalink / raw)
To: Luis R. Rodriguez; +Cc: linux-wireless
In-Reply-To: <m2p43e72e891004012145s2f344f7fo9b12044e9b895c06@mail.gmail.com>
On Thu, 2010-04-01 at 21:45 -0700, Luis R. Rodriguez wrote:
> [ 117.491303] unexpected AddBA Req from 00:22:6b:56:fd:e9 on tid 0
> [ 178.467383] unexpected AddBA Req from 00:22:6b:56:fd:e9 on tid 0
> [ 239.447236] unexpected AddBA Req from 00:22:6b:56:fd:e9 on tid 0
>
> I get a lof of these at spurious times against my WRT610N using
> today's wireless-testing on iwlagn.
If you still have this setup available, could you please try out the
recent patch "mac80211: pass HT changes to driver when off
channel" (http://thread.gmane.org/gmane.linux.kernel.wireless.general/49855 ) ?
Thank you
Reinette
^ permalink raw reply
* Re: rc80211_minstrel.c:70 WARNING with 2.6.34-rc4
From: Richard Zidlicky @ 2010-04-19 17:55 UTC (permalink / raw)
To: Felix Fietkau; +Cc: Pavel Roskin, linux-wireless
In-Reply-To: <4BCC95CC.7030109@openwrt.org>
On Mon, Apr 19, 2010 at 07:41:32PM +0200, Felix Fietkau wrote:
> This warning typically shows up, whenever the driver reports a rate to
> minstrel in the tx status that is not part of the supported/negotiated
> rate set - that's the reason the index lookup above fails.
can that happen when both ends are configured to a fixed rate of 11M?
Richard
^ permalink raw reply
* [PATCH v2 3/9] ath9k: update the MCS mask for MCS16 and above
From: Felix Fietkau @ 2010-04-19 17:57 UTC (permalink / raw)
To: linux-wireless; +Cc: linville, lrodriguez
In-Reply-To: <1271699857-12366-2-git-send-email-nbd@openwrt.org>
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
---
drivers/net/wireless/ath/ath9k/xmit.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index fcbb4a8..5d3d563 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -19,7 +19,7 @@
#define BITS_PER_BYTE 8
#define OFDM_PLCP_BITS 22
-#define HT_RC_2_MCS(_rc) ((_rc) & 0x0f)
+#define HT_RC_2_MCS(_rc) ((_rc) & 0x1f)
#define HT_RC_2_STREAMS(_rc) ((((_rc) & 0x78) >> 3) + 1)
#define L_STF 8
#define L_LTF 8
--
1.6.4.2
^ permalink raw reply related
* [PATCH v2 5/9] ath9k: reduce the bits_per_symbol table size, support more streams
From: Felix Fietkau @ 2010-04-19 17:57 UTC (permalink / raw)
To: linux-wireless; +Cc: linville, lrodriguez
In-Reply-To: <1271699857-12366-4-git-send-email-nbd@openwrt.org>
Instead of increasing bits_per_symbol for supporting more streams, keep
it single-stream only and multiply the values by the numer of streams.
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
---
drivers/net/wireless/ath/ath9k/xmit.c | 19 ++++++-------------
1 files changed, 6 insertions(+), 13 deletions(-)
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index 4078982..2237658 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -34,7 +34,7 @@
#define OFDM_SIFS_TIME 16
-static u32 bits_per_symbol[][2] = {
+static u16 bits_per_symbol[][2] = {
/* 20MHz 40MHz */
{ 26, 54 }, /* 0: BPSK */
{ 52, 108 }, /* 1: QPSK 1/2 */
@@ -44,14 +44,6 @@ static u32 bits_per_symbol[][2] = {
{ 208, 432 }, /* 5: 64-QAM 2/3 */
{ 234, 486 }, /* 6: 64-QAM 3/4 */
{ 260, 540 }, /* 7: 64-QAM 5/6 */
- { 52, 108 }, /* 8: BPSK */
- { 104, 216 }, /* 9: QPSK 1/2 */
- { 156, 324 }, /* 10: QPSK 3/4 */
- { 208, 432 }, /* 11: 16-QAM 1/2 */
- { 312, 648 }, /* 12: 16-QAM 3/4 */
- { 416, 864 }, /* 13: 64-QAM 2/3 */
- { 468, 972 }, /* 14: 64-QAM 3/4 */
- { 520, 1080 }, /* 15: 64-QAM 5/6 */
};
#define IS_HT_RATE(_rate) ((_rate) & 0x80)
@@ -601,7 +593,7 @@ static int ath_compute_num_delims(struct ath_softc *sc, struct ath_atx_tid *tid,
u32 nsymbits, nsymbols;
u16 minlen;
u8 flags, rix;
- int width, half_gi, ndelim, mindelim;
+ int width, streams, half_gi, ndelim, mindelim;
/* Select standard number of delimiters based on frame length alone */
ndelim = ATH_AGGR_GET_NDELIM(frmlen);
@@ -641,7 +633,8 @@ static int ath_compute_num_delims(struct ath_softc *sc, struct ath_atx_tid *tid,
if (nsymbols == 0)
nsymbols = 1;
- nsymbits = bits_per_symbol[rix][width];
+ streams = HT_RC_2_STREAMS(rix);
+ nsymbits = bits_per_symbol[rix % 8][width] * streams;
minlen = (nsymbols * nsymbits) / BITS_PER_BYTE;
if (frmlen < minlen) {
@@ -1533,8 +1526,9 @@ static u32 ath_pkt_duration(struct ath_softc *sc, u8 rix, struct ath_buf *bf,
pktlen = bf_isaggr(bf) ? bf->bf_al : bf->bf_frmlen;
/* find number of symbols: PLCP + data */
+ streams = HT_RC_2_STREAMS(rix);
nbits = (pktlen << 3) + OFDM_PLCP_BITS;
- nsymbits = bits_per_symbol[rix][width];
+ nsymbits = bits_per_symbol[rix % 8][width] * streams;
nsymbols = (nbits + nsymbits - 1) / nsymbits;
if (!half_gi)
@@ -1543,7 +1537,6 @@ static u32 ath_pkt_duration(struct ath_softc *sc, u8 rix, struct ath_buf *bf,
duration = SYMBOL_TIME_HALFGI(nsymbols);
/* addup duration for legacy/ht training and signal fields */
- streams = HT_RC_2_STREAMS(rix);
duration += L_STF + L_LTF + L_SIG + HT_SIG + HT_STF + HT_LTF(streams);
return duration;
--
1.6.4.2
^ permalink raw reply related
* [PATCH v2 8/9] ath9k: add support for Tx and Rx STBC
From: Felix Fietkau @ 2010-04-19 17:57 UTC (permalink / raw)
To: linux-wireless; +Cc: linville, lrodriguez
In-Reply-To: <1271699857-12366-7-git-send-email-nbd@openwrt.org>
Supported only for single stream rates by the hardware
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
---
drivers/net/wireless/ath/ath9k/init.c | 6 ++++++
drivers/net/wireless/ath/ath9k/mac.h | 8 +++++++-
drivers/net/wireless/ath/ath9k/xmit.c | 2 ++
3 files changed, 15 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c
index 2c0630e..8c79548 100644
--- a/drivers/net/wireless/ath/ath9k/init.c
+++ b/drivers/net/wireless/ath/ath9k/init.c
@@ -216,6 +216,12 @@ static void setup_ht_cap(struct ath_softc *sc,
else
max_streams = 2;
+ if (AR_SREV_9280_10_OR_LATER(ah)) {
+ if (max_streams >= 2)
+ ht_info->cap |= IEEE80211_HT_CAP_TX_STBC;
+ ht_info->cap |= (1 << IEEE80211_HT_CAP_RX_STBC_SHIFT);
+ }
+
/* set up supported mcs set */
memset(&ht_info->mcs, 0, sizeof(ht_info->mcs));
tx_streams = count_streams(common->tx_chainmask, max_streams);
diff --git a/drivers/net/wireless/ath/ath9k/mac.h b/drivers/net/wireless/ath/ath9k/mac.h
index 66d0d5e..00f3e0c 100644
--- a/drivers/net/wireless/ath/ath9k/mac.h
+++ b/drivers/net/wireless/ath/ath9k/mac.h
@@ -37,6 +37,8 @@
AR_2040_##_index : 0) \
|((_series)[_index].RateFlags & ATH9K_RATESERIES_HALFGI ? \
AR_GI##_index : 0) \
+ |((_series)[_index].RateFlags & ATH9K_RATESERIES_STBC ? \
+ AR_STBC##_index : 0) \
|SM((_series)[_index].ChSel, AR_ChainSel##_index))
#define CCK_SIFS_TIME 10
@@ -434,7 +436,10 @@ struct ar5416_desc {
#define AR_ChainSel3_S 17
#define AR_RTSCTSRate 0x0ff00000
#define AR_RTSCTSRate_S 20
-#define AR_TxCtlRsvd70 0xf0000000
+#define AR_STBC0 0x10000000
+#define AR_STBC1 0x20000000
+#define AR_STBC2 0x40000000
+#define AR_STBC3 0x80000000
#define AR_TxRSSIAnt00 0x000000ff
#define AR_TxRSSIAnt00_S 0
@@ -647,6 +652,7 @@ enum ath9k_rx_filter {
#define ATH9K_RATESERIES_RTS_CTS 0x0001
#define ATH9K_RATESERIES_2040 0x0002
#define ATH9K_RATESERIES_HALFGI 0x0004
+#define ATH9K_RATESERIES_STBC 0x0008
struct ath9k_11n_rate_series {
u32 Tries;
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index 2237658..b0d345a 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -1607,6 +1607,8 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf)
series[i].Rate = rix | 0x80;
series[i].PktDuration = ath_pkt_duration(sc, rix, bf,
is_40, is_sgi, is_sp);
+ if (rix < 8 && (tx_info->flags & IEEE80211_TX_CTL_STBC))
+ series[i].RateFlags |= ATH9K_RATESERIES_STBC;
continue;
}
--
1.6.4.2
^ permalink raw reply related
* [PATCH v2 7/9] mac80211: add flags for STBC (Space-Time Block Coding)
From: Felix Fietkau @ 2010-04-19 17:57 UTC (permalink / raw)
To: linux-wireless; +Cc: linville, lrodriguez
In-Reply-To: <1271699857-12366-6-git-send-email-nbd@openwrt.org>
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
---
include/linux/ieee80211.h | 1 +
include/net/mac80211.h | 4 ++++
2 files changed, 5 insertions(+), 0 deletions(-)
diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h
index 1252ba1..97b2eae 100644
--- a/include/linux/ieee80211.h
+++ b/include/linux/ieee80211.h
@@ -876,6 +876,7 @@ struct ieee80211_ht_cap {
#define IEEE80211_HT_CAP_SGI_40 0x0040
#define IEEE80211_HT_CAP_TX_STBC 0x0080
#define IEEE80211_HT_CAP_RX_STBC 0x0300
+#define IEEE80211_HT_CAP_RX_STBC_SHIFT 8
#define IEEE80211_HT_CAP_DELAY_BA 0x0400
#define IEEE80211_HT_CAP_MAX_AMSDU 0x0800
#define IEEE80211_HT_CAP_DSSSCCK40 0x1000
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index 75056dd..3d85b0a 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -275,6 +275,8 @@ struct ieee80211_bss_conf {
* MLME command (internal to mac80211 to figure out whether to send TX
* status to user space)
* @IEEE80211_TX_CTL_LDPC: tells the driver to use LDPC for this frame
+ * @IEEE80211_TX_CTL_STBC: Enables Space-Time Block Coding (STBC) for this
+ * frame and selects the maximum number of streams that it can use.
*/
enum mac80211_tx_control_flags {
IEEE80211_TX_CTL_REQ_TX_STATUS = BIT(0),
@@ -299,6 +301,8 @@ enum mac80211_tx_control_flags {
IEEE80211_TX_INTFL_HAS_RADIOTAP = BIT(20),
IEEE80211_TX_INTFL_NL80211_FRAME_TX = BIT(21),
IEEE80211_TX_CTL_LDPC = BIT(22),
+ IEEE80211_TX_CTL_STBC = BIT(23) | BIT(24),
+#define IEEE80211_TX_CTL_STBC_SHIFT 23
};
/**
--
1.6.4.2
^ permalink raw reply related
* [PATCH v2 4/9] ath9k: update the ath_max_4ms_framelen table
From: Felix Fietkau @ 2010-04-19 17:57 UTC (permalink / raw)
To: linux-wireless; +Cc: linville, lrodriguez
In-Reply-To: <1271699857-12366-3-git-send-email-nbd@openwrt.org>
Include MCS0-31 and also add SGI for HT20. This makes it
possible to support more different rate combinations with
newer hardware.
Based on a patch by Selvam. T.
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
---
drivers/net/wireless/ath/ath9k/xmit.c | 41 +++++++++++++++++++++-----------
1 files changed, 27 insertions(+), 14 deletions(-)
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index 5d3d563..4078982 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -71,24 +71,36 @@ static void ath_tx_rc_status(struct ath_buf *bf, struct ath_tx_status *ts,
int nbad, int txok, bool update_rc);
enum {
- MCS_DEFAULT,
+ MCS_HT20,
+ MCS_HT20_SGI,
MCS_HT40,
MCS_HT40_SGI,
};
-static int ath_max_4ms_framelen[3][16] = {
- [MCS_DEFAULT] = {
- 3216, 6434, 9650, 12868, 19304, 25740, 28956, 32180,
- 6430, 12860, 19300, 25736, 38600, 51472, 57890, 64320,
+static int ath_max_4ms_framelen[4][32] = {
+ [MCS_HT20] = {
+ 3212, 6432, 9648, 12864, 19300, 25736, 28952, 32172,
+ 6424, 12852, 19280, 25708, 38568, 51424, 57852, 64280,
+ 9628, 19260, 28896, 38528, 57792, 65532, 65532, 65532,
+ 12828, 25656, 38488, 51320, 65532, 65532, 65532, 65532,
+ },
+ [MCS_HT20_SGI] = {
+ 3572, 7144, 10720, 14296, 21444, 28596, 32172, 35744,
+ 7140, 14284, 21428, 28568, 42856, 57144, 64288, 65532,
+ 10700, 21408, 32112, 42816, 64228, 65532, 65532, 65532,
+ 14256, 28516, 42780, 57040, 65532, 65532, 65532, 65532,
},
[MCS_HT40] = {
- 6684, 13368, 20052, 26738, 40104, 53476, 60156, 66840,
- 13360, 26720, 40080, 53440, 80160, 106880, 120240, 133600,
+ 6680, 13360, 20044, 26724, 40092, 53456, 60140, 65532,
+ 13348, 26700, 40052, 53400, 65532, 65532, 65532, 65532,
+ 20004, 40008, 60016, 65532, 65532, 65532, 65532, 65532,
+ 26644, 53292, 65532, 65532, 65532, 65532, 65532, 65532,
},
[MCS_HT40_SGI] = {
- /* TODO: Only MCS 7 and 15 updated, recalculate the rest */
- 6684, 13368, 20052, 26738, 40104, 53476, 60156, 74200,
- 13360, 26720, 40080, 53440, 80160, 106880, 120240, 148400,
+ 7420, 14844, 22272, 29696, 44544, 59396, 65532, 65532,
+ 14832, 29668, 44504, 59340, 65532, 65532, 65532, 65532,
+ 22232, 44464, 65532, 65532, 65532, 65532, 65532, 65532,
+ 29616, 59232, 65532, 65532, 65532, 65532, 65532, 65532,
}
};
@@ -538,12 +550,13 @@ static u32 ath_lookup_rate(struct ath_softc *sc, struct ath_buf *bf,
break;
}
- if (rates[i].flags & IEEE80211_TX_RC_SHORT_GI)
- modeidx = MCS_HT40_SGI;
- else if (rates[i].flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
+ if (rates[i].flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
modeidx = MCS_HT40;
else
- modeidx = MCS_DEFAULT;
+ modeidx = MCS_HT20;
+
+ if (rates[i].flags & IEEE80211_TX_RC_SHORT_GI)
+ modeidx++;
frmlen = ath_max_4ms_framelen[modeidx][rates[i].idx];
max_4ms_framelen = min(max_4ms_framelen, frmlen);
--
1.6.4.2
^ permalink raw reply related
* [PATCH v2 2/9] ath9k: clean up tx buffer handling
From: Felix Fietkau @ 2010-04-19 17:57 UTC (permalink / raw)
To: linux-wireless; +Cc: linville, lrodriguez
In-Reply-To: <1271699857-12366-1-git-send-email-nbd@openwrt.org>
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
---
drivers/net/wireless/ath/ath9k/xmit.c | 67 ++++++++++++++++-----------------
1 files changed, 32 insertions(+), 35 deletions(-)
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index cac178a..fcbb4a8 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -261,19 +261,40 @@ static void ath_tx_set_retry(struct ath_softc *sc, struct ath_txq *txq,
hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_RETRY);
}
-static struct ath_buf* ath_clone_txbuf(struct ath_softc *sc, struct ath_buf *bf)
+static struct ath_buf *ath_tx_get_buffer(struct ath_softc *sc)
{
- struct ath_buf *tbf;
+ struct ath_buf *bf = NULL;
spin_lock_bh(&sc->tx.txbuflock);
- if (WARN_ON(list_empty(&sc->tx.txbuf))) {
+
+ if (unlikely(list_empty(&sc->tx.txbuf))) {
spin_unlock_bh(&sc->tx.txbuflock);
return NULL;
}
- tbf = list_first_entry(&sc->tx.txbuf, struct ath_buf, list);
- list_del(&tbf->list);
+
+ bf = list_first_entry(&sc->tx.txbuf, struct ath_buf, list);
+ list_del(&bf->list);
+
spin_unlock_bh(&sc->tx.txbuflock);
+ return bf;
+}
+
+static void ath_tx_return_buffer(struct ath_softc *sc, struct ath_buf *bf)
+{
+ spin_lock_bh(&sc->tx.txbuflock);
+ list_add_tail(&bf->list, &sc->tx.txbuf);
+ spin_unlock_bh(&sc->tx.txbuflock);
+}
+
+static struct ath_buf* ath_clone_txbuf(struct ath_softc *sc, struct ath_buf *bf)
+{
+ struct ath_buf *tbf;
+
+ tbf = ath_tx_get_buffer(sc);
+ if (WARN_ON(!tbf))
+ return NULL;
+
ATH_TXBUF_RESET(tbf);
tbf->aphy = bf->aphy;
@@ -1081,9 +1102,7 @@ void ath_draintxq(struct ath_softc *sc, struct ath_txq *txq, bool retry_tx)
list_del(&bf->list);
spin_unlock_bh(&txq->axq_lock);
- spin_lock_bh(&sc->tx.txbuflock);
- list_add_tail(&bf->list, &sc->tx.txbuf);
- spin_unlock_bh(&sc->tx.txbuflock);
+ ath_tx_return_buffer(sc, bf);
continue;
}
}
@@ -1325,25 +1344,6 @@ static void ath_tx_txqaddbuf(struct ath_softc *sc, struct ath_txq *txq,
txq->axq_depth++;
}
-static struct ath_buf *ath_tx_get_buffer(struct ath_softc *sc)
-{
- struct ath_buf *bf = NULL;
-
- spin_lock_bh(&sc->tx.txbuflock);
-
- if (unlikely(list_empty(&sc->tx.txbuf))) {
- spin_unlock_bh(&sc->tx.txbuflock);
- return NULL;
- }
-
- bf = list_first_entry(&sc->tx.txbuf, struct ath_buf, list);
- list_del(&bf->list);
-
- spin_unlock_bh(&sc->tx.txbuflock);
-
- return bf;
-}
-
static void ath_tx_send_ampdu(struct ath_softc *sc, struct ath_atx_tid *tid,
struct list_head *bf_head,
struct ath_tx_control *txctl)
@@ -1825,9 +1825,7 @@ int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb,
}
spin_unlock_bh(&txq->axq_lock);
- spin_lock_bh(&sc->tx.txbuflock);
- list_add_tail(&bf->list, &sc->tx.txbuf);
- spin_unlock_bh(&sc->tx.txbuflock);
+ ath_tx_return_buffer(sc, bf);
return r;
}
@@ -2141,13 +2139,12 @@ static void ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq)
txq->axq_depth--;
txok = !(ts.ts_status & ATH9K_TXERR_MASK);
txq->axq_tx_inprogress = false;
+ if (bf_held)
+ list_del(&bf_held->list);
spin_unlock_bh(&txq->axq_lock);
- if (bf_held) {
- spin_lock_bh(&sc->tx.txbuflock);
- list_move_tail(&bf_held->list, &sc->tx.txbuf);
- spin_unlock_bh(&sc->tx.txbuflock);
- }
+ if (bf_held)
+ ath_tx_return_buffer(sc, bf_held);
if (!bf_isampdu(bf)) {
/*
--
1.6.4.2
^ permalink raw reply related
* [PATCH v2 6/9] ath9k: initialize the number of tx/rx streams correctly
From: Felix Fietkau @ 2010-04-19 17:57 UTC (permalink / raw)
To: linux-wireless; +Cc: linville, lrodriguez
In-Reply-To: <1271699857-12366-5-git-send-email-nbd@openwrt.org>
AR9300 based hardware can 3x3 MCS rates, this should be set in the
HT capabilities.
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
---
drivers/net/wireless/ath/ath9k/init.c | 39 +++++++++++++++++++++++---------
1 files changed, 28 insertions(+), 11 deletions(-)
diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c
index ca6e781..2c0630e 100644
--- a/drivers/net/wireless/ath/ath9k/init.c
+++ b/drivers/net/wireless/ath/ath9k/init.c
@@ -175,6 +175,18 @@ static const struct ath_ops ath9k_common_ops = {
.write = ath9k_iowrite32,
};
+static int count_streams(unsigned int chainmask, int max)
+{
+ int streams = 0;
+
+ do {
+ if (++streams == max)
+ break;
+ } while ((chainmask = chainmask & (chainmask - 1)));
+
+ return streams;
+}
+
/**************************/
/* Initialization */
/**************************/
@@ -182,8 +194,10 @@ static const struct ath_ops ath9k_common_ops = {
static void setup_ht_cap(struct ath_softc *sc,
struct ieee80211_sta_ht_cap *ht_info)
{
- struct ath_common *common = ath9k_hw_common(sc->sc_ah);
+ struct ath_hw *ah = sc->sc_ah;
+ struct ath_common *common = ath9k_hw_common(ah);
u8 tx_streams, rx_streams;
+ int i, max_streams;
ht_info->ht_supported = true;
ht_info->cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
@@ -197,25 +211,28 @@ static void setup_ht_cap(struct ath_softc *sc,
ht_info->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
ht_info->ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
+ if (AR_SREV_9300_20_OR_LATER(ah))
+ max_streams = 3;
+ else
+ max_streams = 2;
+
/* set up supported mcs set */
memset(&ht_info->mcs, 0, sizeof(ht_info->mcs));
- tx_streams = !(common->tx_chainmask & (common->tx_chainmask - 1)) ?
- 1 : 2;
- rx_streams = !(common->rx_chainmask & (common->rx_chainmask - 1)) ?
- 1 : 2;
+ tx_streams = count_streams(common->tx_chainmask, max_streams);
+ rx_streams = count_streams(common->rx_chainmask, max_streams);
+
+ ath_print(common, ATH_DBG_CONFIG,
+ "TX streams %d, RX streams: %d\n",
+ tx_streams, rx_streams);
if (tx_streams != rx_streams) {
- ath_print(common, ATH_DBG_CONFIG,
- "TX streams %d, RX streams: %d\n",
- tx_streams, rx_streams);
ht_info->mcs.tx_params |= IEEE80211_HT_MCS_TX_RX_DIFF;
ht_info->mcs.tx_params |= ((tx_streams - 1) <<
IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT);
}
- ht_info->mcs.rx_mask[0] = 0xff;
- if (rx_streams >= 2)
- ht_info->mcs.rx_mask[1] = 0xff;
+ for (i = 0; i < rx_streams; i++)
+ ht_info->mcs.rx_mask[i] = 0xff;
ht_info->mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
}
--
1.6.4.2
^ permalink raw reply related
* [PATCH v2 1/9] ath9k: check for specific rx stuck conditions and recover from them
From: Felix Fietkau @ 2010-04-19 17:57 UTC (permalink / raw)
To: linux-wireless; +Cc: linville, lrodriguez
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
---
drivers/net/wireless/ath/ath9k/hw.c | 28 ++++++++++++++++++++++++++++
drivers/net/wireless/ath/ath9k/hw.h | 1 +
drivers/net/wireless/ath/ath9k/main.c | 3 ++-
3 files changed, 31 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
index 9aa40df..5a29048 100644
--- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c
@@ -1160,6 +1160,34 @@ static bool ath9k_hw_channel_change(struct ath_hw *ah,
return true;
}
+bool ath9k_hw_check_alive(struct ath_hw *ah)
+{
+ int count = 50;
+ u32 reg;
+
+ if (AR_SREV_9285_10_OR_LATER(ah))
+ return true;
+
+ do {
+ reg = REG_READ(ah, AR_OBS_BUS_1);
+
+ if ((reg & 0x7E7FFFEF) == 0x00702400)
+ continue;
+
+ switch (reg & 0x7E000B00) {
+ case 0x1E000000:
+ case 0x52000B00:
+ case 0x18000B00:
+ continue;
+ default:
+ return true;
+ }
+ } while (count-- > 0);
+
+ return false;
+}
+EXPORT_SYMBOL(ath9k_hw_check_alive);
+
int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
bool bChannelChange)
{
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h
index 8158e8e..a78e09b 100644
--- a/drivers/net/wireless/ath/ath9k/hw.h
+++ b/drivers/net/wireless/ath/ath9k/hw.h
@@ -869,6 +869,7 @@ void ath9k_hw_set11nmac2040(struct ath_hw *ah);
void ath9k_hw_beaconinit(struct ath_hw *ah, u32 next_beacon, u32 beacon_period);
void ath9k_hw_set_sta_beacon_timers(struct ath_hw *ah,
const struct ath9k_beacon_state *bs);
+bool ath9k_hw_check_alive(struct ath_hw *ah);
bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode);
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index 1f4ea74..0246e7a 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -405,7 +405,8 @@ void ath9k_tasklet(unsigned long data)
ath9k_ps_wakeup(sc);
- if (status & ATH9K_INT_FATAL) {
+ if ((status & ATH9K_INT_FATAL) ||
+ !ath9k_hw_check_alive(ah)) {
ath_reset(sc, false);
ath9k_ps_restore(sc);
return;
--
1.6.4.2
^ permalink raw reply related
* [PATCH v2 9/9] ath9k: set the STBC flag in rate control if the peer supports it
From: Felix Fietkau @ 2010-04-19 17:57 UTC (permalink / raw)
To: linux-wireless; +Cc: linville, lrodriguez
In-Reply-To: <1271699857-12366-8-git-send-email-nbd@openwrt.org>
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
---
drivers/net/wireless/ath/ath9k/rc.c | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/drivers/net/wireless/ath/ath9k/rc.c b/drivers/net/wireless/ath/ath9k/rc.c
index bf3ad7a..8519452 100644
--- a/drivers/net/wireless/ath/ath9k/rc.c
+++ b/drivers/net/wireless/ath/ath9k/rc.c
@@ -700,6 +700,10 @@ static void ath_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta,
(sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING))
tx_info->flags |= IEEE80211_TX_CTL_LDPC;
+ if (conf_is_ht(&sc->hw->conf) &&
+ (sta->ht_cap.cap & IEEE80211_HT_CAP_TX_STBC))
+ tx_info->flags |= (1 << IEEE80211_TX_CTL_STBC_SHIFT);
+
if (is_probe) {
/* set one try for probe rates. For the
* probes don't enable rts */
--
1.6.4.2
^ permalink raw reply related
* Re: rc80211_minstrel.c:70 WARNING with 2.6.34-rc4
From: Felix Fietkau @ 2010-04-19 18:00 UTC (permalink / raw)
To: Richard Zidlicky; +Cc: Pavel Roskin, linux-wireless
In-Reply-To: <20100419175508.GB5312@linux-m68k.org>
On 2010-04-19 7:55 PM, Richard Zidlicky wrote:
> On Mon, Apr 19, 2010 at 07:41:32PM +0200, Felix Fietkau wrote:
>
>
>> This warning typically shows up, whenever the driver reports a rate to
>> minstrel in the tx status that is not part of the supported/negotiated
>> rate set - that's the reason the index lookup above fails.
>
> can that happen when both ends are configured to a fixed rate of 11M?
No idea. I've never used fixed-rate. I guess it could, if it uses 11M
for communicating with a peer that it for some reason did not enable
this rate for.
- Felix
^ permalink raw reply
* Re: [PATCH 1/3] compat-wireless: backport convert multicast list to list_head.
From: Hauke Mehrtens @ 2010-04-19 18:32 UTC (permalink / raw)
To: Pavel Roskin; +Cc: lrodriguez, linux-wireless, mcgrof
In-Reply-To: <20100418101514.q7rwgz9zwgk8sg0k-cebfxv@webmail.spamcop.net>
[-- Attachment #1: Type: text/plain, Size: 2265 bytes --]
Hi Pavel,
thank you for your comments on this.
Pavel Roskin wrote:
> Hello, Hauke!
>
> Thank you for doing this effort! I would prefer that we avoid patching
> as much as possible. Patches tend to break as the code changes. I
> think there are several cases where patching can be eliminated.
>
>> ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
>> + struct netdev_hw_addr *ha;
>> ++#else
>> ++ struct dev_mc_list *ha;
>> ++#endif
>
> We could simply use this in some header:
>
> #define dev_mc_list netdev_hw_addr
This will be possible, but as I see, only in some easy parts where the
patch looks like the quote above.
I will change that and resend this patch.
>
>> + /* comoute mc addresses' hash value ,and put it into hash table */
>
> Someone had a bout of dyslexia, and it will be fixed, breaking the patch
> :-)
>
>> + netdev_for_each_mc_addr(ha, netdev) {
>> ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
>> + hash_value = atl1c_hash_mc_addr(hw, ha->addr);
>> ++#else
>> ++ hash_value = atl1c_hash_mc_addr(hw, ha->dmi_addr);
>> ++#endif
>
> #define addr dmi_addr
>
> OK, this is likely to break if done in a header, but maybe it could be
> done in the C code away from the rest of the code.
I think the if defs are better than a conditional define in every file
that needs it. It will result in strange compile errors if someone uses
addr for an other addresses.
>
>> ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
>> + __hw_addr_unsync(&local->mc_list, &dev->mc, dev->addr_len);
>> ++#else
>> ++ __dev_addr_unsync(&local->mc_list, &local->mc_count,
>> ++ &dev->mc_list, &dev->mc_count);
>> ++#endif
>
> Cannot we reimplement __hw_addr_unsync()?
This change depends on some changes structs in
net/mac80211/ieee80211_i.h I do not see a way to reimplement this.
>
>> ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
>> +
>> + __hw_addr_init(&local->mc_list);
>> +
>> ++#endif
>
> That could be an empty function.
Yes that could be done, but I think it is much more clear to use this
patch here, because we do not need __hw_addr_init, because
local->mc_list is of a completely different type.
Hauke
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 898 bytes --]
^ permalink raw reply
* Re: [PATCH v2 1/9] ath9k: check for specific rx stuck conditions and recover from them
From: Pavel Roskin @ 2010-04-19 19:04 UTC (permalink / raw)
To: Felix Fietkau; +Cc: linux-wireless, linville, lrodriguez
In-Reply-To: <1271699857-12366-1-git-send-email-nbd@openwrt.org>
On Mon, 2010-04-19 at 19:57 +0200, Felix Fietkau wrote:
> + if ((reg & 0x7E7FFFEF) == 0x00702400)
> + continue;
> +
> + switch (reg & 0x7E000B00) {
> + case 0x1E000000:
> + case 0x52000B00:
> + case 0x18000B00:
> + continue;
Where did you get all that magic? If it's from Atheros documentation,
maybe you could give those numbers descriptive names?
--
Regards,
Pavel Roskin
^ permalink raw reply
* Re: [PATCH v2 1/9] ath9k: check for specific rx stuck conditions and recover from them
From: Felix Fietkau @ 2010-04-19 19:07 UTC (permalink / raw)
To: Pavel Roskin; +Cc: linux-wireless, linville, lrodriguez
In-Reply-To: <1271703852.19879.1.camel@mj>
On 2010-04-19 9:04 PM, Pavel Roskin wrote:
> On Mon, 2010-04-19 at 19:57 +0200, Felix Fietkau wrote:
>> + if ((reg & 0x7E7FFFEF) == 0x00702400)
>> + continue;
>> +
>> + switch (reg & 0x7E000B00) {
>> + case 0x1E000000:
>> + case 0x52000B00:
>> + case 0x18000B00:
>> + continue;
>
> Where did you get all that magic? If it's from Atheros documentation,
> maybe you could give those numbers descriptive names?
I don't have any names for that. It's stuff from a debugging register -
adapted from Atheros code...
- Felix
^ permalink raw reply
* Google Summer of Code 2010 - Please resolve duplicates
From: Till Kamppeter @ 2010-04-19 19:39 UTC (permalink / raw)
To: Theodore Ts'o, Greg KH, Arnaldo Carvalho de Melo,
Luis R. Rodriguez, linux-kernel, linux-wireless, Witold Sowa,
Johannes Berg, Grant Likely
Hi,
two students who applied for your projects have applied also for another
organization's project and they got accepted by us and by the other
organization.
Until Wednesday Google wants these situation to be resolved until
Wednesday April 21, 17:00 UTC. Please contact the students and/or the
organization to agree on one of the project for each student.
In addition, the ranking of the students (to decide who actually gets
our slots) and the mentor assignments have to be finalized by the same
date and time.
Duplicates not be resolved until then will be resolved on an IRC meeting
on Wednesday April 21 at 19:00 UTC. The meeting takes place in the #gsoc
channel on Freenode.
Please mail me if a mentor needs to be (re)assigned.
Till
----------------------------------------------------------------------
Hi all,
I have opened the duplicate information for students to all of your
orgs. If you view your student proposals now the ones that are ranked
to be accepted that are duplicated with another org will be marked in
red. If you click on the proposal you will see the contact information
for the other organization(s)'s admins near the bottom of the
proposal.
You must also have a mentor assigned to all the students in your top N
slots by now. If you do not have a mentor assigned to them the
duplicate detection script will not pick them up and we may have
duplicates we don't know about. That is bad, please fix that if its
the case.
Please try to resolve as many of these duplicate situations via email
in the next two days as possible - contact your fellow organizations,
be clear with each other about who is taking the student, and then
rank the student up if you are accepting him/her or mark the student
ineligible with a public comment that you have marked it ineligible
because of a duplicate situation if you are not taking the student.
The deadline for changing rankings is 17:00UTC on Wednesday, April 21.
All duplicates that have not been resolved by 17:00 UTC will be taken
to the IRC meeting at 19:00 UTC.
Cheers,
Carol
^ permalink raw reply
* [PATCH v2] compat: backport convert multicast list to list_head.
From: Hauke Mehrtens @ 2010-04-19 20:06 UTC (permalink / raw)
To: lrodriguez; +Cc: linux-wireless, mcgrof, proski, Hauke Mehrtens
In-Reply-To: <4BCCA1D9.30208@hauke-m.de>
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
---
include/linux/compat-2.6.35.h | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/include/linux/compat-2.6.35.h b/include/linux/compat-2.6.35.h
index 964e8dc..4d3483a 100644
--- a/include/linux/compat-2.6.35.h
+++ b/include/linux/compat-2.6.35.h
@@ -4,6 +4,7 @@
#include <linux/version.h>
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35))
+#include <linux/etherdevice.h>
#define IW_HANDLER(id, func) \
[IW_IOCTL_IDX(id)] = func
@@ -11,6 +12,8 @@
#define SDIO_BUS_ECSI 0x20 /* Enable continuous SPI interrupt */
#define SDIO_BUS_SCSI 0x40 /* Support continuous SPI interrupt */
+#define netdev_hw_addr dev_mc_list
+
#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35)) */
#endif /* LINUX_26_35_COMPAT_H */
--
1.6.3.3
^ permalink raw reply related
* [PATCH v2 1/3] compat-wireless: backport convert multicast list to list_head.
From: Hauke Mehrtens @ 2010-04-19 20:06 UTC (permalink / raw)
To: lrodriguez; +Cc: linux-wireless, mcgrof, proski, Hauke Mehrtens
In-Reply-To: <4BCCA1D9.30208@hauke-m.de>
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
---
v2: add #define netdev_hw_addr dev_mc_list and remove ifdefs
patches/25-multicast-list_head.patch | 706 ++++++++++++++++++++++++++++++++++
1 files changed, 706 insertions(+), 0 deletions(-)
create mode 100644 patches/25-multicast-list_head.patch
diff --git a/patches/25-multicast-list_head.patch b/patches/25-multicast-list_head.patch
new file mode 100644
index 0000000..bd8f2bd
--- /dev/null
+++ b/patches/25-multicast-list_head.patch
@@ -0,0 +1,706 @@
+Backport commit 22bedad3ce112d5ca1eaf043d4990fa2ed698c87:
+ net: convert multicast list to list_head
+
+ Converts the list and the core manipulating with it to be the same as uc_list.
+
+ +uses two functions for adding/removing mc address (normal and "global"
+ variant) instead of a function parameter.
+ +removes dev_mcast.c completely.
+ +exposes netdev_hw_addr_list_* macros along with __hw_addr_* functions for
+ manipulation with lists on a sandbox (used in bonding and 80211 drivers)
+
+This also backport commit 2f787b0b76bf5de2eaa3ca3a29d89123ae03c856
+
+--- a/drivers/net/atl1c/atl1c_main.c
++++ b/drivers/net/atl1c/atl1c_main.c
+@@ -378,7 +378,11 @@ static void atl1c_set_multi(struct net_d
+
+ /* comoute mc addresses' hash value ,and put it into hash table */
+ netdev_for_each_mc_addr(ha, netdev) {
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ hash_value = atl1c_hash_mc_addr(hw, ha->addr);
++#else
++ hash_value = atl1c_hash_mc_addr(hw, ha->dmi_addr);
++#endif
+ atl1c_hash_set(hw, hash_value);
+ }
+ }
+--- a/drivers/net/atl1e/atl1e_main.c
++++ b/drivers/net/atl1e/atl1e_main.c
+@@ -308,7 +308,11 @@ static void atl1e_set_multi(struct net_d
+
+ /* comoute mc addresses' hash value ,and put it into hash table */
+ netdev_for_each_mc_addr(ha, netdev) {
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ hash_value = atl1e_hash_mc_addr(hw, ha->addr);
++#else
++ hash_value = atl1e_hash_mc_addr(hw, ha->dmi_addr);
++#endif
+ atl1e_hash_set(hw, hash_value);
+ }
+ }
+--- a/drivers/net/atlx/atl2.c
++++ b/drivers/net/atlx/atl2.c
+@@ -159,7 +159,11 @@ static void atl2_set_multi(struct net_de
+
+ /* comoute mc addresses' hash value ,and put it into hash table */
+ netdev_for_each_mc_addr(ha, netdev) {
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ hash_value = atl2_hash_mc_addr(hw, ha->addr);
++#else
++ hash_value = atl2_hash_mc_addr(hw, ha->dmi_addr);
++#endif
+ atl2_hash_set(hw, hash_value);
+ }
+ }
+--- a/drivers/net/atlx/atlx.c
++++ b/drivers/net/atlx/atlx.c
+@@ -145,7 +145,11 @@ static void atlx_set_multi(struct net_de
+
+ /* compute mc addresses' hash value ,and put it into hash table */
+ netdev_for_each_mc_addr(ha, netdev) {
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ hash_value = atlx_hash_mc_addr(hw, ha->addr);
++#else
++ hash_value = atlx_hash_mc_addr(hw, ha->dmi_addr);
++#endif
+ atlx_hash_set(hw, hash_value);
+ }
+ }
+--- a/drivers/net/b44.c
++++ b/drivers/net/b44.c
+@@ -1689,7 +1689,11 @@ static int __b44_load_mcast(struct b44 *
+ netdev_for_each_mc_addr(ha, dev) {
+ if (i == num_ents)
+ break;
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ __b44_cam_write(bp, ha->addr, i++ + 1);
++#else
++ __b44_cam_write(bp, ha->dmi_addr, i++ + 1);
++#endif
+ }
+ return i+1;
+ }
+--- a/drivers/net/wireless/adm8211.c
++++ b/drivers/net/wireless/adm8211.c
+@@ -1318,19 +1318,37 @@ static void adm8211_bss_info_changed(str
+ }
+
+ static u64 adm8211_prepare_multicast(struct ieee80211_hw *hw,
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ struct netdev_hw_addr_list *mc_list)
++#else
++ int mc_count, struct dev_addr_list *ha)
++#endif
+ {
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ unsigned int bit_nr;
+- u32 mc_filter[2];
+ struct netdev_hw_addr *ha;
++#else
++ unsigned int bit_nr, i;
++#endif
++ u32 mc_filter[2];
+
+ mc_filter[1] = mc_filter[0] = 0;
+
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ netdev_hw_addr_list_for_each(ha, mc_list) {
+ bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
++#else
++ for (i = 0; i < mc_count; i++) {
++ if (!ha)
++ break;
++ bit_nr = ether_crc(ETH_ALEN, ha->dmi_addr) >> 26;
++#endif
+
+ bit_nr &= 0x3F;
+ mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31);
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35))
++ ha = ha->next;
++#endif
+ }
+
+ return mc_filter[0] | ((u64)(mc_filter[1]) << 32);
+--- a/drivers/net/wireless/ath/ar9170/main.c
++++ b/drivers/net/wireless/ath/ar9170/main.c
+@@ -2047,17 +2047,35 @@ out:
+ return err;
+ }
+
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ static u64 ar9170_op_prepare_multicast(struct ieee80211_hw *hw,
+ struct netdev_hw_addr_list *mc_list)
++#else
++static u64 ar9170_op_prepare_multicast(struct ieee80211_hw *hw, int mc_count,
++ struct dev_addr_list *ha)
++#endif
+ {
+ u64 mchash;
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ struct netdev_hw_addr *ha;
++#else
++ int i;
++#endif
+
+ /* always get broadcast frames */
+ mchash = 1ULL << (0xff >> 2);
+
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ netdev_hw_addr_list_for_each(ha, mc_list)
+ mchash |= 1ULL << (ha->addr[5] >> 2);
++#else
++ for (i = 0; i < mc_count; i++) {
++ if (WARN_ON(!ha))
++ break;
++ mchash |= 1ULL << (ha->dmi_addr[5] >> 2);
++ ha = ha->next;
++ }
++#endif
+
+ return mchash;
+ }
+--- a/drivers/net/wireless/ath/ath5k/base.c
++++ b/drivers/net/wireless/ath/ath5k/base.c
+@@ -263,7 +263,11 @@ static void ath5k_remove_interface(struc
+ struct ieee80211_vif *vif);
+ static int ath5k_config(struct ieee80211_hw *hw, u32 changed);
+ static u64 ath5k_prepare_multicast(struct ieee80211_hw *hw,
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ struct netdev_hw_addr_list *mc_list);
++#else
++ int mc_count, struct dev_addr_list *mc_list);
++#endif
+ static void ath5k_configure_filter(struct ieee80211_hw *hw,
+ unsigned int changed_flags,
+ unsigned int *new_flags,
+@@ -3105,20 +3109,42 @@ unlock:
+ }
+
+ static u64 ath5k_prepare_multicast(struct ieee80211_hw *hw,
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ struct netdev_hw_addr_list *mc_list)
++#else
++ int mc_count, struct dev_addr_list *ha)
++#endif
+ {
+ u32 mfilt[2], val;
+ u8 pos;
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ struct netdev_hw_addr *ha;
++#else
++ int i;
++#endif
+
+ mfilt[0] = 0;
+ mfilt[1] = 1;
+
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ netdev_hw_addr_list_for_each(ha, mc_list) {
++#else
++ for (i = 0; i < mc_count; i++) {
++ if (!ha)
++ break;
++#endif
+ /* calculate XOR of eight 6-bit values */
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ val = get_unaligned_le32(ha->addr + 0);
++#else
++ val = get_unaligned_le32(ha->dmi_addr + 0);
++#endif
+ pos = (val >> 18) ^ (val >> 12) ^ (val >> 6) ^ val;
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ val = get_unaligned_le32(ha->addr + 3);
++#else
++ val = get_unaligned_le32(ha->dmi_addr + 3);
++#endif
+ pos ^= (val >> 18) ^ (val >> 12) ^ (val >> 6) ^ val;
+ pos &= 0x3f;
+ mfilt[pos / 32] |= (1 << (pos % 32));
+@@ -3127,6 +3153,9 @@ static u64 ath5k_prepare_multicast(struc
+ * neet to inform below to not reset the mcast */
+ /* ath5k_hw_set_mcast_filterindex(ah,
+ * ha->addr[5]); */
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35))
++ ha = ha->next;
++#endif
+ }
+
+ return ((u64)(mfilt[1]) << 32) | mfilt[0];
+--- a/drivers/net/wireless/libertas/main.c
++++ b/drivers/net/wireless/libertas/main.c
+@@ -328,18 +328,34 @@ static int lbs_add_mcast_addrs(struct cm
+ netif_addr_lock_bh(dev);
+ cnt = netdev_mc_count(dev);
+ netdev_for_each_mc_addr(ha, dev) {
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ if (mac_in_list(cmd->maclist, nr_addrs, ha->addr)) {
++#else
++ if (mac_in_list(cmd->maclist, nr_addrs, ha->dmi_addr)) {
++#endif
+ lbs_deb_net("mcast address %s:%pM skipped\n", dev->name,
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ ha->addr);
++#else
++ ha->dmi_addr);
++#endif
+ cnt--;
+ continue;
+ }
+
+ if (i == MRVDRV_MAX_MULTICAST_LIST_SIZE)
+ break;
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ memcpy(&cmd->maclist[6*i], ha->addr, ETH_ALEN);
++#else
++ memcpy(&cmd->maclist[6*i], ha->dmi_addr, ETH_ALEN);
++#endif
+ lbs_deb_net("mcast address %s:%pM added to filter\n", dev->name,
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ ha->addr);
++#else
++ ha->dmi_addr);
++#endif
+ i++;
+ cnt--;
+ }
+--- a/drivers/net/wireless/libertas_tf/main.c
++++ b/drivers/net/wireless/libertas_tf/main.c
+@@ -369,20 +369,36 @@ static int lbtf_op_config(struct ieee802
+ }
+
+ static u64 lbtf_op_prepare_multicast(struct ieee80211_hw *hw,
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ struct netdev_hw_addr_list *mc_list)
++#else
++ int mc_count, struct dev_addr_list *ha)
++#endif
+ {
+ struct lbtf_private *priv = hw->priv;
+ int i;
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ struct netdev_hw_addr *ha;
+ int mc_count = netdev_hw_addr_list_count(mc_list);
++#endif
+
+ if (!mc_count || mc_count > MRVDRV_MAX_MULTICAST_LIST_SIZE)
+ return mc_count;
+
+ priv->nr_of_multicastmacaddr = mc_count;
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ i = 0;
+ netdev_hw_addr_list_for_each(ha, mc_list)
+ memcpy(&priv->multicastlist[i++], ha->addr, ETH_ALEN);
++#else
++ for (i = 0; i < mc_count; i++) {
++ if (!ha)
++ break;
++ memcpy(&priv->multicastlist[i], ha->da_addr,
++ ETH_ALEN);
++ ha = ha->next;
++ }
++#endif
+
+ return mc_count;
+ }
+--- a/drivers/net/wireless/mwl8k.c
++++ b/drivers/net/wireless/mwl8k.c
+@@ -1939,15 +1939,21 @@ struct mwl8k_cmd_mac_multicast_adr {
+
+ static struct mwl8k_cmd_pkt *
+ __mwl8k_cmd_mac_multicast_adr(struct ieee80211_hw *hw, int allmulti,
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ struct netdev_hw_addr_list *mc_list)
++#else
++ int mc_count, struct dev_addr_list *ha)
++#endif
+ {
+ struct mwl8k_priv *priv = hw->priv;
+ struct mwl8k_cmd_mac_multicast_adr *cmd;
+ int size;
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ int mc_count = 0;
+
+ if (mc_list)
+ mc_count = netdev_hw_addr_list_count(mc_list);
++#endif
+
+ if (allmulti || mc_count > priv->num_mcaddrs) {
+ allmulti = 1;
+@@ -1968,13 +1974,27 @@ __mwl8k_cmd_mac_multicast_adr(struct iee
+ if (allmulti) {
+ cmd->action |= cpu_to_le16(MWL8K_ENABLE_RX_ALL_MULTICAST);
+ } else if (mc_count) {
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ struct netdev_hw_addr *ha;
+ int i = 0;
++#else
++ int i;
++#endif
+
+ cmd->action |= cpu_to_le16(MWL8K_ENABLE_RX_MULTICAST);
+ cmd->numaddr = cpu_to_le16(mc_count);
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ netdev_hw_addr_list_for_each(ha, mc_list) {
+ memcpy(cmd->addr[i], ha->addr, ETH_ALEN);
++#else
++ for (i = 0; i < mc_count && ha; i++) {
++ if (ha->da_addrlen != ETH_ALEN) {
++ kfree(cmd);
++ return NULL;
++ }
++ memcpy(cmd->addr[i], ha->da_addr, ETH_ALEN);
++ ha = ha->next;
++#endif
+ }
+ }
+
+@@ -3553,7 +3573,11 @@ mwl8k_bss_info_changed(struct ieee80211_
+ }
+
+ static u64 mwl8k_prepare_multicast(struct ieee80211_hw *hw,
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ struct netdev_hw_addr_list *mc_list)
++#else
++ int mc_count, struct dev_addr_list *ha)
++#endif
+ {
+ struct mwl8k_cmd_pkt *cmd;
+
+@@ -3564,7 +3588,11 @@ static u64 mwl8k_prepare_multicast(struc
+ * we'll end up throwing this packet away and creating a new
+ * one in mwl8k_configure_filter().
+ */
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ cmd = __mwl8k_cmd_mac_multicast_adr(hw, 0, mc_list);
++#else
++ cmd = __mwl8k_cmd_mac_multicast_adr(hw, 0, mc_count, ha);
++#endif
+
+ return (unsigned long)cmd;
+ }
+@@ -3687,7 +3715,11 @@ static void mwl8k_configure_filter(struc
+ */
+ if (*total_flags & FIF_ALLMULTI) {
+ kfree(cmd);
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ cmd = __mwl8k_cmd_mac_multicast_adr(hw, 1, NULL);
++#else
++ cmd = __mwl8k_cmd_mac_multicast_adr(hw, 1, 0, NULL);
++#endif
+ }
+
+ if (cmd != NULL) {
+--- a/drivers/net/wireless/orinoco/hw.c
++++ b/drivers/net/wireless/orinoco/hw.c
+@@ -1063,7 +1063,11 @@ int __orinoco_hw_set_multicast_list(stru
+ netdev_for_each_mc_addr(ha, dev) {
+ if (i == mc_count)
+ break;
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ memcpy(mclist.addr[i++], ha->addr, ETH_ALEN);
++#else
++ memcpy(mclist.addr[i++], ha->dmi_addr, ETH_ALEN);
++#endif
+ }
+
+ err = hermes_write_ltv(hw, USER_BAP,
+--- a/drivers/net/wireless/orinoco/hw.h
++++ b/drivers/net/wireless/orinoco/hw.h
+@@ -22,6 +22,9 @@
+
+ /* Forward declarations */
+ struct orinoco_private;
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35))
++struct dev_addr_list;
++#endif
+
+ int determine_fw_capabilities(struct orinoco_private *priv, char *fw_name,
+ size_t fw_name_len, u32 *hw_ver);
+--- a/drivers/net/wireless/rndis_wlan.c
++++ b/drivers/net/wireless/rndis_wlan.c
+@@ -1587,7 +1587,11 @@ static void set_multicast_list(struct us
+
+ netdev_for_each_mc_addr(ha, usbdev->net)
+ memcpy(mc_addrs + i++ * ETH_ALEN,
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ ha->addr, ETH_ALEN);
++#else
++ ha->dmi_addr, ETH_ALEN);
++#endif
+ }
+ netif_addr_unlock_bh(usbdev->net);
+
+--- a/drivers/net/wireless/rtl818x/rtl8180_dev.c
++++ b/drivers/net/wireless/rtl818x/rtl8180_dev.c
+@@ -724,10 +724,19 @@ static void rtl8180_bss_info_changed(str
+ priv->rf->conf_erp(dev, info);
+ }
+
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ static u64 rtl8180_prepare_multicast(struct ieee80211_hw *dev,
+ struct netdev_hw_addr_list *mc_list)
++#else
++static u64 rtl8180_prepare_multicast(struct ieee80211_hw *dev, int mc_count,
++ struct dev_addr_list *mc_list)
++#endif
+ {
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ return netdev_hw_addr_list_count(mc_list);
++#else
++ return mc_count;
++#endif
+ }
+
+ static void rtl8180_configure_filter(struct ieee80211_hw *dev,
+--- a/drivers/net/wireless/rtl818x/rtl8187_dev.c
++++ b/drivers/net/wireless/rtl818x/rtl8187_dev.c
+@@ -1194,9 +1194,17 @@ static void rtl8187_bss_info_changed(str
+ }
+
+ static u64 rtl8187_prepare_multicast(struct ieee80211_hw *dev,
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ struct netdev_hw_addr_list *mc_list)
++#else
++ int mc_count, struct dev_addr_list *mc_list)
++#endif
+ {
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ return netdev_hw_addr_list_count(mc_list);
++#else
++ return mc_count;
++#endif
+ }
+
+ static void rtl8187_configure_filter(struct ieee80211_hw *dev,
+--- a/drivers/net/wireless/wl12xx/wl1271_main.c
++++ b/drivers/net/wireless/wl12xx/wl1271_main.c
+@@ -1305,11 +1305,20 @@ struct wl1271_filter_params {
+ u8 mc_list[ACX_MC_ADDRESS_GROUP_MAX][ETH_ALEN];
+ };
+
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ static u64 wl1271_op_prepare_multicast(struct ieee80211_hw *hw,
+ struct netdev_hw_addr_list *mc_list)
++#else
++static u64 wl1271_op_prepare_multicast(struct ieee80211_hw *hw, int mc_count,
++ struct dev_addr_list *mc_list)
++#endif
+ {
+ struct wl1271_filter_params *fp;
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ struct netdev_hw_addr *ha;
++#else
++ int i;
++#endif
+ struct wl1271 *wl = hw->priv;
+
+ if (unlikely(wl->state == WL1271_STATE_OFF))
+@@ -1322,16 +1331,40 @@ static u64 wl1271_op_prepare_multicast(s
+ }
+
+ /* update multicast filtering parameters */
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ fp->mc_list_length = 0;
+ if (netdev_hw_addr_list_count(mc_list) > ACX_MC_ADDRESS_GROUP_MAX) {
++#else
++ fp->enabled = true;
++ if (mc_count > ACX_MC_ADDRESS_GROUP_MAX) {
++ mc_count = 0;
++#endif
+ fp->enabled = false;
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ } else {
+ fp->enabled = true;
+ netdev_hw_addr_list_for_each(ha, mc_list) {
++#else
++ }
++
++ fp->mc_list_length = 0;
++ for (i = 0; i < mc_count; i++) {
++ if (mc_list->da_addrlen == ETH_ALEN) {
++#endif
+ memcpy(fp->mc_list[fp->mc_list_length],
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ ha->addr, ETH_ALEN);
++#else
++ mc_list->da_addr, ETH_ALEN);
++#endif
+ fp->mc_list_length++;
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ }
++#else
++ } else
++ wl1271_warning("Unknown mc address length.");
++ mc_list = mc_list->next;
++#endif
+ }
+
+ return (u64)(unsigned long)fp;
+--- a/drivers/net/wireless/zd1211rw/zd_mac.c
++++ b/drivers/net/wireless/zd1211rw/zd_mac.c
+@@ -948,17 +948,34 @@ static void set_rx_filter_handler(struct
+ }
+
+ static u64 zd_op_prepare_multicast(struct ieee80211_hw *hw,
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ struct netdev_hw_addr_list *mc_list)
++#else
++ int mc_count, struct dev_addr_list *ha)
++#endif
+ {
+ struct zd_mac *mac = zd_hw_mac(hw);
+ struct zd_mc_hash hash;
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ struct netdev_hw_addr *ha;
++#else
++ int i;
++#endif
+
+ zd_mc_clear(&hash);
+
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ netdev_hw_addr_list_for_each(ha, mc_list) {
+ dev_dbg_f(zd_mac_dev(mac), "mc addr %pM\n", ha->addr);
+ zd_mc_add_addr(&hash, ha->addr);
++#else
++ for (i = 0; i < mc_count; i++) {
++ if (!ha)
++ break;
++ dev_dbg_f(zd_mac_dev(mac), "mc addr %pM\n", ha->dmi_addr);
++ zd_mc_add_addr(&hash, ha->dmi_addr);
++ ha = ha->next;
++#endif
+ }
+
+ return hash.low | ((u64)hash.high << 32);
+--- a/include/net/mac80211.h
++++ b/include/net/mac80211.h
+@@ -1631,7 +1631,11 @@ struct ieee80211_ops {
+ struct ieee80211_bss_conf *info,
+ u32 changed);
+ u64 (*prepare_multicast)(struct ieee80211_hw *hw,
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ struct netdev_hw_addr_list *mc_list);
++#else
++ int mc_count, struct dev_addr_list *mc_list);
++#endif
+ void (*configure_filter)(struct ieee80211_hw *hw,
+ unsigned int changed_flags,
+ unsigned int *total_flags,
+--- a/net/bluetooth/bnep/netdev.c
++++ b/net/bluetooth/bnep/netdev.c
+@@ -102,8 +102,13 @@ static void bnep_net_set_mc_list(struct
+ netdev_for_each_mc_addr(ha, dev) {
+ if (i == BNEP_MAX_MULTICAST_FILTERS)
+ break;
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ memcpy(__skb_put(skb, ETH_ALEN), ha->addr, ETH_ALEN);
+ memcpy(__skb_put(skb, ETH_ALEN), ha->addr, ETH_ALEN);
++#else
++ memcpy(__skb_put(skb, ETH_ALEN), ha->dmi_addr, ETH_ALEN);
++ memcpy(__skb_put(skb, ETH_ALEN), ha->dmi_addr, ETH_ALEN);
++#endif
+ }
+ r->len = htons(skb->len - len);
+ }
+--- a/net/mac80211/driver-ops.h
++++ b/net/mac80211/driver-ops.h
+@@ -84,14 +84,28 @@ static inline void drv_bss_info_changed(
+ }
+
+ static inline u64 drv_prepare_multicast(struct ieee80211_local *local,
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ struct netdev_hw_addr_list *mc_list)
++#else
++ int mc_count,
++ struct dev_addr_list *mc_list)
++#endif
+ {
+ u64 ret = 0;
+
+ if (local->ops->prepare_multicast)
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ ret = local->ops->prepare_multicast(&local->hw, mc_list);
++#else
++ ret = local->ops->prepare_multicast(&local->hw, mc_count,
++ mc_list);
++#endif
+
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ trace_drv_prepare_multicast(local, mc_list->count, ret);
++#else
++ trace_drv_prepare_multicast(local, mc_count, ret);
++#endif
+
+ return ret;
+ }
+--- a/net/mac80211/ieee80211_i.h
++++ b/net/mac80211/ieee80211_i.h
+@@ -665,7 +665,12 @@ struct ieee80211_local {
+ struct work_struct recalc_smps;
+
+ /* aggregated multicast list */
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ struct netdev_hw_addr_list mc_list;
++#else
++ struct dev_addr_list *mc_list;
++ int mc_count;
++#endif
+
+ bool tim_in_locked_section; /* see ieee80211_beacon_get() */
+
+--- a/net/mac80211/iface.c
++++ b/net/mac80211/iface.c
+@@ -413,7 +413,12 @@ static int ieee80211_stop(struct net_dev
+
+ netif_addr_lock_bh(dev);
+ spin_lock_bh(&local->filter_lock);
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ __hw_addr_unsync(&local->mc_list, &dev->mc, dev->addr_len);
++#else
++ __dev_addr_unsync(&local->mc_list, &local->mc_count,
++ &dev->mc_list, &dev->mc_count);
++#endif
+ spin_unlock_bh(&local->filter_lock);
+ netif_addr_unlock_bh(dev);
+
+@@ -596,7 +601,12 @@ static void ieee80211_set_multicast_list
+ sdata->flags ^= IEEE80211_SDATA_PROMISC;
+ }
+ spin_lock_bh(&local->filter_lock);
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ __hw_addr_sync(&local->mc_list, &dev->mc, dev->addr_len);
++#else
++ __dev_addr_sync(&local->mc_list, &local->mc_count,
++ &dev->mc_list, &dev->mc_count);
++#endif
+ spin_unlock_bh(&local->filter_lock);
+ ieee80211_queue_work(&local->hw, &local->reconfig_filter);
+ }
+--- a/net/mac80211/main.c
++++ b/net/mac80211/main.c
+@@ -71,7 +71,11 @@ void ieee80211_configure_filter(struct i
+ spin_lock_bh(&local->filter_lock);
+ changed_flags = local->filter_flags ^ new_flags;
+
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ mc = drv_prepare_multicast(local, &local->mc_list);
++#else
++ mc = drv_prepare_multicast(local, local->mc_count, local->mc_list);
++#endif
+ spin_unlock_bh(&local->filter_lock);
+
+ /* be a bit nasty */
+@@ -390,9 +394,11 @@ struct ieee80211_hw *ieee80211_alloc_hw(
+ local->uapsd_max_sp_len = IEEE80211_DEFAULT_MAX_SP_LEN;
+
+ INIT_LIST_HEAD(&local->interfaces);
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+
+ __hw_addr_init(&local->mc_list);
+
++#endif
+ mutex_init(&local->iflist_mtx);
+ mutex_init(&local->scan_mtx);
+
--
1.6.3.3
^ permalink raw reply related
* Re: Google Summer of Code 2010 - Please resolve duplicates
From: Greg KH @ 2010-04-19 22:46 UTC (permalink / raw)
To: Till Kamppeter
Cc: Theodore Ts'o, Arnaldo Carvalho de Melo, Luis R. Rodriguez,
linux-kernel, linux-wireless, Witold Sowa, Johannes Berg,
Grant Likely
In-Reply-To: <4BCCB176.3060206@gmail.com>
On Mon, Apr 19, 2010 at 12:39:34PM -0700, Till Kamppeter wrote:
> Hi,
>
> two students who applied for your projects have applied also for
> another organization's project and they got accepted by us and by
> the other organization.
>
> Until Wednesday Google wants these situation to be resolved until
> Wednesday April 21, 17:00 UTC. Please contact the students and/or
> the organization to agree on one of the project for each student.
>
> In addition, the ranking of the students (to decide who actually
> gets our slots) and the mentor assignments have to be finalized by
> the same date and time.
>
> Duplicates not be resolved until then will be resolved on an IRC
> meeting on Wednesday April 21 at 19:00 UTC. The meeting takes place
> in the #gsoc channel on Freenode.
>
> Please mail me if a mentor needs to be (re)assigned.
>
> Till
>
>
>
> ----------------------------------------------------------------------
>
> Hi all,
>
> I have opened the duplicate information for students to all of your
> orgs. If you view your student proposals now the ones that are ranked
> to be accepted that are duplicated with another org will be marked in
> red. If you click on the proposal you will see the contact information
> for the other organization(s)'s admins near the bottom of the
> proposal.
>
> You must also have a mentor assigned to all the students in your top N
> slots by now. If you do not have a mentor assigned to them the
> duplicate detection script will not pick them up and we may have
> duplicates we don't know about. That is bad, please fix that if its
> the case.
>
> Please try to resolve as many of these duplicate situations via email
> in the next two days as possible - contact your fellow organizations,
> be clear with each other about who is taking the student, and then
> rank the student up if you are accepting him/her or mark the student
> ineligible with a public comment that you have marked it ineligible
> because of a duplicate situation if you are not taking the student.
>
> The deadline for changing rankings is 17:00UTC on Wednesday, April 21.
> All duplicates that have not been resolved by 17:00 UTC will be taken
> to the IRC meeting at 19:00 UTC.
Have a pointer to the web site to do this?
thanks,
greg k-h
^ permalink raw reply
* Re: Google Summer of Code 2010 - Please resolve duplicates
From: Till Kamppeter @ 2010-04-19 22:57 UTC (permalink / raw)
To: Greg KH
Cc: Theodore Ts'o, Arnaldo Carvalho de Melo, Luis R. Rodriguez,
linux-kernel, linux-wireless, Witold Sowa, Johannes Berg,
Grant Likely
In-Reply-To: <20100419224634.GG1800@kroah.com>
On 04/19/2010 03:46 PM, Greg KH wrote:
> On Mon, Apr 19, 2010 at 12:39:34PM -0700, Till Kamppeter wrote:
>> Hi,
>>
>> two students who applied for your projects have applied also for
>> another organization's project and they got accepted by us and by
>> the other organization.
>>
>> Until Wednesday Google wants these situation to be resolved until
>> Wednesday April 21, 17:00 UTC. Please contact the students and/or
>> the organization to agree on one of the project for each student.
>>
>> In addition, the ranking of the students (to decide who actually
>> gets our slots) and the mentor assignments have to be finalized by
>> the same date and time.
>>
>> Duplicates not be resolved until then will be resolved on an IRC
>> meeting on Wednesday April 21 at 19:00 UTC. The meeting takes place
>> in the #gsoc channel on Freenode.
>>
>> Please mail me if a mentor needs to be (re)assigned.
>>
>> Till
>>
>>
>>
>> ----------------------------------------------------------------------
>>
>> Hi all,
>>
>> I have opened the duplicate information for students to all of your
>> orgs. If you view your student proposals now the ones that are ranked
>> to be accepted that are duplicated with another org will be marked in
>> red. If you click on the proposal you will see the contact information
>> for the other organization(s)'s admins near the bottom of the
>> proposal.
>>
>> You must also have a mentor assigned to all the students in your top N
>> slots by now. If you do not have a mentor assigned to them the
>> duplicate detection script will not pick them up and we may have
>> duplicates we don't know about. That is bad, please fix that if its
>> the case.
>>
>> Please try to resolve as many of these duplicate situations via email
>> in the next two days as possible - contact your fellow organizations,
>> be clear with each other about who is taking the student, and then
>> rank the student up if you are accepting him/her or mark the student
>> ineligible with a public comment that you have marked it ineligible
>> because of a duplicate situation if you are not taking the student.
>>
>> The deadline for changing rankings is 17:00UTC on Wednesday, April 21.
>> All duplicates that have not been resolved by 17:00 UTC will be taken
>> to the IRC meeting at 19:00 UTC.
>
> Have a pointer to the web site to do this?
>
> thanks,
>
> greg k-h
>
Sorry, here we go:
http://socghop.appspot.com/gsoc/org/list_proposals/google/gsoc2010/lf
Requires login as mentor.
Till
^ permalink raw reply
* Re: Google Summer of Code 2010 - Please resolve duplicates
From: Hin-Tak Leung @ 2010-04-19 22:58 UTC (permalink / raw)
To: Greg KH
Cc: Till Kamppeter, Theodore Ts'o, Arnaldo Carvalho de Melo,
Luis R. Rodriguez, linux-kernel, linux-wireless, Witold Sowa,
Johannes Berg, Grant Likely
In-Reply-To: <20100419224634.GG1800@kroah.com>
On Mon, Apr 19, 2010 at 11:46 PM, Greg KH <greg@kroah.com> wrote:
<snipped>
>> I have opened the duplicate information for students to all of your
>> orgs. If you view your student proposals now the ones that are ranked
>> to be accepted that are duplicated with another org will be marked in
>> red. If you click on the proposal you will see the contact information
>> for the other organization(s)'s admins near the bottom of the
>> proposal.
<snipped>
> Have a pointer to the web site to do this?
I think the idea from the original announcement is for each pair of
organizations with duplicate applications, to contact each other, for
one of the organization to drop the student's application so the other
one can proceed. e.g. if a student applies to both linux foundation
and gnome (for example), the linux foundation admin should contact the
gnome admin to decide which organization to take the student (and
which one to withdraw. As for the question itself, somewhere under:
- http://socghop.appspot.com/gsoc/program/home/google/gsoc2010
^ permalink raw reply
* Re: iwlagn unexpected AddBA Req
From: Luis R. Rodriguez @ 2010-04-19 23:20 UTC (permalink / raw)
To: reinette chatre; +Cc: linux-wireless, Felix Fietkau
In-Reply-To: <1271699405.14052.18189.camel@rchatre-DESK>
On Mon, Apr 19, 2010 at 10:50 AM, reinette chatre
<reinette.chatre@intel.com> wrote:
> On Thu, 2010-04-01 at 21:45 -0700, Luis R. Rodriguez wrote:
>> [ 117.491303] unexpected AddBA Req from 00:22:6b:56:fd:e9 on tid 0
>> [ 178.467383] unexpected AddBA Req from 00:22:6b:56:fd:e9 on tid 0
>> [ 239.447236] unexpected AddBA Req from 00:22:6b:56:fd:e9 on tid 0
>>
>> I get a lof of these at spurious times against my WRT610N using
>> today's wireless-testing on iwlagn.
>
> If you still have this setup available, could you please try out the
> recent patch "mac80211: pass HT changes to driver when off
> channel" (http://thread.gmane.org/gmane.linux.kernel.wireless.general/49855 ) ?
Thanks Reinette, I've given my hardware to nbd.
Luis
^ permalink raw reply
* Re: [PATCH v2] compat: backport convert multicast list to list_head.
From: Luis R. Rodriguez @ 2010-04-20 0:25 UTC (permalink / raw)
To: Hauke Mehrtens; +Cc: linux-wireless, mcgrof, proski
In-Reply-To: <1271707616-4150-1-git-send-email-hauke@hauke-m.de>
On Mon, Apr 19, 2010 at 1:06 PM, Hauke Mehrtens <hauke@hauke-m.de> wrote:
>
> Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
> ---
> include/linux/compat-2.6.35.h | 3 +++
> 1 files changed, 3 insertions(+), 0 deletions(-)
>
> diff --git a/include/linux/compat-2.6.35.h b/include/linux/compat-2.6.35.h
> index 964e8dc..4d3483a 100644
> --- a/include/linux/compat-2.6.35.h
> +++ b/include/linux/compat-2.6.35.h
> @@ -4,6 +4,7 @@
> #include <linux/version.h>
>
> #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35))
> +#include <linux/etherdevice.h>
>
> #define IW_HANDLER(id, func) \
> [IW_IOCTL_IDX(id)] = func
> @@ -11,6 +12,8 @@
> #define SDIO_BUS_ECSI 0x20 /* Enable continuous SPI interrupt */
> #define SDIO_BUS_SCSI 0x40 /* Support continuous SPI interrupt */
>
> +#define netdev_hw_addr dev_mc_list
> +
> #endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35)) */
>
> #endif /* LINUX_26_35_COMPAT_H */
Lets go with this approach for now, and if it bites us in the ass we
now not to do that again :)
BTW Thanks so much for all these patches, I'm merging them now, I
counted 6, 3 for compat, 3 for compat-wireless, if I missed anything
please let me know. Going to force out a new tarball now.
compat:
compat: backport convert multicast list to list_head.
compat: Add linux/version.h include before using it.
compat: Add definitions needed for libertas sdio driver.
compat-wireless:
compat-wireless: include net and trace includes form compat
compat-wireless: Remove use of sdio quirks attribute
compat-wireless: backport convert multicast list to list_head.
Luis
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox