aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00/rt2500usb.c
diff options
context:
space:
mode:
authorIvo van Doorn <ivdoorn@gmail.com>2008-03-09 17:42:59 -0400
committerJohn W. Linville <linville@tuxdriver.com>2008-03-13 16:02:35 -0400
commit8af244ccb14a4367568db11c5e78b45a4c2cf77e (patch)
tree350727822602b851dcc2d31ad7a64fe7c4528a88 /drivers/net/wireless/rt2x00/rt2500usb.c
parent3976ae6c2b09608cd6a13663737a6b219245b651 (diff)
rt2x00: Only disable beaconing just before beacon update
We should not write 0 to the beacon sync register during config_intf() since that will clear out the beacon interval and forces the beacon to be send out at the lowest interval. (reported by Mattias Nissler). The side effect of the same bug was that while working with multiple virtual AP interfaces a change for any of those interfaces would disable beaconing untill an beacon update was provided. This is resolved by only updating the TSF_SYNC value during config_intf(). In update_beacon() we disable beaconing temporarily to prevent fake beacons to be transmitted. Finally kick_tx_queue() will enable beaconing again. Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2500usb.c')
-rw-r--r--drivers/net/wireless/rt2x00/rt2500usb.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c
index 559131fc6d53..b6c6f7dd9eda 100644
--- a/drivers/net/wireless/rt2x00/rt2500usb.c
+++ b/drivers/net/wireless/rt2x00/rt2500usb.c
@@ -324,8 +324,6 @@ static void rt2500usb_config_intf(struct rt2x00_dev *rt2x00dev,
324 u16 reg; 324 u16 reg;
325 325
326 if (flags & CONFIG_UPDATE_TYPE) { 326 if (flags & CONFIG_UPDATE_TYPE) {
327 rt2500usb_register_write(rt2x00dev, TXRX_CSR19, 0);
328
329 /* 327 /*
330 * Enable beacon config 328 * Enable beacon config
331 */ 329 */
@@ -344,10 +342,6 @@ static void rt2500usb_config_intf(struct rt2x00_dev *rt2x00dev,
344 rt2500usb_register_write(rt2x00dev, TXRX_CSR18, reg); 342 rt2500usb_register_write(rt2x00dev, TXRX_CSR18, reg);
345 343
346 rt2500usb_register_read(rt2x00dev, TXRX_CSR19, &reg); 344 rt2500usb_register_read(rt2x00dev, TXRX_CSR19, &reg);
347 rt2x00_set_field16(&reg, TXRX_CSR19_TSF_COUNT, 1);
348 rt2x00_set_field16(&reg, TXRX_CSR19_TBCN,
349 (conf->sync == TSF_SYNC_BEACON));
350 rt2x00_set_field16(&reg, TXRX_CSR19_BEACON_GEN, 0);
351 rt2x00_set_field16(&reg, TXRX_CSR19_TSF_SYNC, conf->sync); 345 rt2x00_set_field16(&reg, TXRX_CSR19_TSF_SYNC, conf->sync);
352 rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg); 346 rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);
353 } 347 }
@@ -1092,6 +1086,8 @@ static void rt2500usb_kick_tx_queue(struct rt2x00_dev *rt2x00dev,
1092 1086
1093 rt2500usb_register_read(rt2x00dev, TXRX_CSR19, &reg); 1087 rt2500usb_register_read(rt2x00dev, TXRX_CSR19, &reg);
1094 if (!rt2x00_get_field16(reg, TXRX_CSR19_BEACON_GEN)) { 1088 if (!rt2x00_get_field16(reg, TXRX_CSR19_BEACON_GEN)) {
1089 rt2x00_set_field16(&reg, TXRX_CSR19_TSF_COUNT, 1);
1090 rt2x00_set_field16(&reg, TXRX_CSR19_TBCN, 1);
1095 rt2x00_set_field16(&reg, TXRX_CSR19_BEACON_GEN, 1); 1091 rt2x00_set_field16(&reg, TXRX_CSR19_BEACON_GEN, 1);
1096 /* 1092 /*
1097 * Beacon generation will fail initially. 1093 * Beacon generation will fail initially.
@@ -1740,6 +1736,7 @@ static int rt2500usb_beacon_update(struct ieee80211_hw *hw,
1740 struct skb_frame_desc *skbdesc; 1736 struct skb_frame_desc *skbdesc;
1741 int pipe = usb_sndbulkpipe(usb_dev, 1); 1737 int pipe = usb_sndbulkpipe(usb_dev, 1);
1742 int length; 1738 int length;
1739 u16 reg;
1743 1740
1744 if (unlikely(!intf->beacon)) 1741 if (unlikely(!intf->beacon))
1745 return -ENOBUFS; 1742 return -ENOBUFS;
@@ -1765,6 +1762,16 @@ static int rt2500usb_beacon_update(struct ieee80211_hw *hw,
1765 skbdesc->entry = intf->beacon; 1762 skbdesc->entry = intf->beacon;
1766 1763
1767 /* 1764 /*
1765 * Disable beaconing while we are reloading the beacon data,
1766 * otherwise we might be sending out invalid data.
1767 */
1768 rt2500usb_register_read(rt2x00dev, TXRX_CSR19, &reg);
1769 rt2x00_set_field16(&reg, TXRX_CSR19_TSF_COUNT, 0);
1770 rt2x00_set_field16(&reg, TXRX_CSR19_TBCN, 0);
1771 rt2x00_set_field16(&reg, TXRX_CSR19_BEACON_GEN, 0);
1772 rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);
1773
1774 /*
1768 * mac80211 doesn't provide the control->queue variable 1775 * mac80211 doesn't provide the control->queue variable
1769 * for beacons. Set our own queue identification so 1776 * for beacons. Set our own queue identification so
1770 * it can be used during descriptor initialization. 1777 * it can be used during descriptor initialization.