Commit 6a2de93b authored by Teemu Paasikivi's avatar Teemu Paasikivi Committed by John W. Linville

wl1271: Fix warning about unsupported RX rate

While scanning, it is possible that beacon and probe response frames are
received on other band than configured to the driver. In rx status
handling this has caused "Unsupported RX rate from HW" warnings. This
patch changes the wl1271_rate_to_index function to take the band of the
received frame as a parameter instead of using value configuret to
wl->band.
Signed-off-by: default avatarTeemu Paasikivi <ext-teemu.3.paasikivi@nokia.com>
Reviewed-by: default avatarJuuso Oikarinen <juuso.oikarinen@nokia.com>
Signed-off-by: default avatarLuciano Coelho <luciano.coelho@nokia.com>
parent 18357850
...@@ -2367,18 +2367,18 @@ static const struct ieee80211_ops wl1271_ops = { ...@@ -2367,18 +2367,18 @@ static const struct ieee80211_ops wl1271_ops = {
}; };
u8 wl1271_rate_to_idx(struct wl1271 *wl, int rate) u8 wl1271_rate_to_idx(int rate, enum ieee80211_band band)
{ {
u8 idx; u8 idx;
BUG_ON(wl->band >= sizeof(wl1271_band_rate_to_idx)/sizeof(u8 *)); BUG_ON(band >= sizeof(wl1271_band_rate_to_idx)/sizeof(u8 *));
if (unlikely(rate >= CONF_HW_RXTX_RATE_MAX)) { if (unlikely(rate >= CONF_HW_RXTX_RATE_MAX)) {
wl1271_error("Illegal RX rate from HW: %d", rate); wl1271_error("Illegal RX rate from HW: %d", rate);
return 0; return 0;
} }
idx = wl1271_band_rate_to_idx[wl->band][rate]; idx = wl1271_band_rate_to_idx[band][rate];
if (unlikely(idx == CONF_HW_RXTX_RATE_UNSUPPORTED)) { if (unlikely(idx == CONF_HW_RXTX_RATE_UNSUPPORTED)) {
wl1271_error("Unsupported RX rate from HW: %d", rate); wl1271_error("Unsupported RX rate from HW: %d", rate);
return 0; return 0;
......
...@@ -48,10 +48,18 @@ static void wl1271_rx_status(struct wl1271 *wl, ...@@ -48,10 +48,18 @@ static void wl1271_rx_status(struct wl1271 *wl,
struct ieee80211_rx_status *status, struct ieee80211_rx_status *status,
u8 beacon) u8 beacon)
{ {
enum ieee80211_band desc_band;
memset(status, 0, sizeof(struct ieee80211_rx_status)); memset(status, 0, sizeof(struct ieee80211_rx_status));
status->band = wl->band; status->band = wl->band;
status->rate_idx = wl1271_rate_to_idx(wl, desc->rate);
if ((desc->flags & WL1271_RX_DESC_BAND_MASK) == WL1271_RX_DESC_BAND_BG)
desc_band = IEEE80211_BAND_2GHZ;
else
desc_band = IEEE80211_BAND_5GHZ;
status->rate_idx = wl1271_rate_to_idx(desc->rate, desc_band);
#ifdef CONFIG_WL1271_HT #ifdef CONFIG_WL1271_HT
/* 11n support */ /* 11n support */
......
...@@ -116,6 +116,6 @@ struct wl1271_rx_descriptor { ...@@ -116,6 +116,6 @@ struct wl1271_rx_descriptor {
} __packed; } __packed;
void wl1271_rx(struct wl1271 *wl, struct wl1271_fw_status *status); void wl1271_rx(struct wl1271 *wl, struct wl1271_fw_status *status);
u8 wl1271_rate_to_idx(struct wl1271 *wl, int rate); u8 wl1271_rate_to_idx(int rate, enum ieee80211_band band);
#endif #endif
...@@ -350,7 +350,7 @@ static void wl1271_tx_complete_packet(struct wl1271 *wl, ...@@ -350,7 +350,7 @@ static void wl1271_tx_complete_packet(struct wl1271 *wl,
if (result->status == TX_SUCCESS) { if (result->status == TX_SUCCESS) {
if (!(info->flags & IEEE80211_TX_CTL_NO_ACK)) if (!(info->flags & IEEE80211_TX_CTL_NO_ACK))
info->flags |= IEEE80211_TX_STAT_ACK; info->flags |= IEEE80211_TX_STAT_ACK;
rate = wl1271_rate_to_idx(wl, result->rate_class_index); rate = wl1271_rate_to_idx(result->rate_class_index, wl->band);
retries = result->ack_failures; retries = result->ack_failures;
} else if (result->status == TX_RETRY_EXCEEDED) { } else if (result->status == TX_RETRY_EXCEEDED) {
wl->stats.excessive_retries++; wl->stats.excessive_retries++;
......
...@@ -144,7 +144,7 @@ void wl1271_tx_work_locked(struct wl1271 *wl); ...@@ -144,7 +144,7 @@ void wl1271_tx_work_locked(struct wl1271 *wl);
void wl1271_tx_complete(struct wl1271 *wl); void wl1271_tx_complete(struct wl1271 *wl);
void wl1271_tx_reset(struct wl1271 *wl); void wl1271_tx_reset(struct wl1271 *wl);
void wl1271_tx_flush(struct wl1271 *wl); void wl1271_tx_flush(struct wl1271 *wl);
u8 wl1271_rate_to_idx(struct wl1271 *wl, int rate); u8 wl1271_rate_to_idx(int rate, enum ieee80211_band band);
u32 wl1271_tx_enabled_rates_get(struct wl1271 *wl, u32 rate_set); u32 wl1271_tx_enabled_rates_get(struct wl1271 *wl, u32 rate_set);
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment