p54: fix WARN_ON at line 2247 of net/mac80211/rx.c
authorChristian Lamparter <chunkeey@web.de>
Fri, 26 Dec 2008 18:09:45 +0000 (19:09 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 12 Jan 2009 19:24:56 +0000 (14:24 -0500)
This patch hopefully fixes a mac80211<->p54 interaction problem, which was
described by Larry Finger (ref: http://marc.info/?l=linux-wireless&m=123009889327707 )

I guess the warning was triggered by pending frames in the receive queue,
while we're doing a band change 5GHz.

Signed-off-by: Christian Lamparter <chunkeey@web.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/p54/p54common.c

index 37294a6..cba89ed 100644 (file)
@@ -586,6 +586,7 @@ static int p54_rx_data(struct ieee80211_hw *dev, struct sk_buff *skb)
        u16 freq = le16_to_cpu(hdr->freq);
        size_t header_len = sizeof(*hdr);
        u32 tsf32;
+       u8 rate = hdr->rate & 0xf;
 
        /*
         * If the device is in a unspecified state we have to
@@ -614,8 +615,11 @@ static int p54_rx_data(struct ieee80211_hw *dev, struct sk_buff *skb)
        rx_status.qual = (100 * hdr->rssi) / 127;
        if (hdr->rate & 0x10)
                rx_status.flag |= RX_FLAG_SHORTPRE;
-       rx_status.rate_idx = (dev->conf.channel->band == IEEE80211_BAND_2GHZ ?
-                       hdr->rate : (hdr->rate - 4)) & 0xf;
+       if (dev->conf.channel->band == IEEE80211_BAND_5GHZ)
+               rx_status.rate_idx = (rate < 4) ? 0 : rate - 4;
+       else
+               rx_status.rate_idx = rate;
+
        rx_status.freq = freq;
        rx_status.band =  dev->conf.channel->band;
        rx_status.antenna = hdr->antenna;