Skip to content

Commit

Permalink
zd1211rw: fix invalid signal values from device
Browse files Browse the repository at this point in the history
Driver uses IEEE80211_HW_SIGNAL_UNSPEC and so signal values reported to
mac80211 should be in range 0..100. Sometimes device return out of range
values. These out of range values can then trigger warning in
cfg80211_inform_bss_frame.

This patch adds checks to enforce range returned from driver to
mac80211 be in 0..100 range.

Signed-off-by: Jussi Kivilinna <jussi.kivilinna@mbnet.fi>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Jussi Kivilinna authored and John W. Linville committed Jun 22, 2011
1 parent 670dc28 commit 7a1d656
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 2 deletions.
6 changes: 6 additions & 0 deletions drivers/net/wireless/zd1211rw/zd_def.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,15 @@ typedef u16 __nocast zd_addr_t;
if (net_ratelimit()) \
dev_printk_f(KERN_DEBUG, dev, fmt, ## args); \
} while (0)
# define dev_dbg_f_cond(dev, cond, fmt, args...) ({ \
bool __cond = !!(cond); \
if (unlikely(__cond)) \
dev_printk_f(KERN_DEBUG, dev, fmt, ## args); \
})
#else
# define dev_dbg_f(dev, fmt, args...) do { (void)(dev); } while (0)
# define dev_dbg_f_limit(dev, fmt, args...) do { (void)(dev); } while (0)
# define dev_dbg_f_cond(dev, cond, fmt, args...) do { (void)(dev); } while (0)
#endif /* DEBUG */

#ifdef DEBUG
Expand Down
20 changes: 18 additions & 2 deletions drivers/net/wireless/zd1211rw/zd_mac.c
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,22 @@ static int zd_reg2alpha2(u8 regdomain, char *alpha2)
return 1;
}

static int zd_check_signal(struct ieee80211_hw *hw, int signal)
{
struct zd_mac *mac = zd_hw_mac(hw);

dev_dbg_f_cond(zd_mac_dev(mac), signal < 0 || signal > 100,
"%s: signal value from device not in range 0..100, "
"but %d.\n", __func__, signal);

if (signal < 0)
signal = 0;
else if (signal > 100)
signal = 100;

return signal;
}

int zd_mac_preinit_hw(struct ieee80211_hw *hw)
{
int r;
Expand Down Expand Up @@ -461,7 +477,7 @@ static void zd_mac_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb,
if (i<IEEE80211_TX_MAX_RATES)
info->status.rates[i].idx = -1; /* terminate */

info->status.ack_signal = ackssi;
info->status.ack_signal = zd_check_signal(hw, ackssi);
ieee80211_tx_status_irqsafe(hw, skb);
}

Expand Down Expand Up @@ -982,7 +998,7 @@ int zd_mac_rx(struct ieee80211_hw *hw, const u8 *buffer, unsigned int length)

stats.freq = zd_channels[_zd_chip_get_channel(&mac->chip) - 1].center_freq;
stats.band = IEEE80211_BAND_2GHZ;
stats.signal = status->signal_strength;
stats.signal = zd_check_signal(hw, status->signal_strength);

rate = zd_rx_rate(buffer, status);

Expand Down

0 comments on commit 7a1d656

Please sign in to comment.