|
@@ -174,7 +174,13 @@ static void rt2x00lib_beaconupdate_iter(void *data, u8 *mac,
|
|
|
vif->type != NL80211_IFTYPE_WDS)
|
|
|
return;
|
|
|
|
|
|
- rt2x00queue_update_beacon(rt2x00dev, vif);
|
|
|
+ /*
|
|
|
+ * Update the beacon without locking. This is safe on PCI devices
|
|
|
+ * as they only update the beacon periodically here. This should
|
|
|
+ * never be called for USB devices.
|
|
|
+ */
|
|
|
+ WARN_ON(rt2x00_is_usb(rt2x00dev));
|
|
|
+ rt2x00queue_update_beacon_locked(rt2x00dev, vif);
|
|
|
}
|
|
|
|
|
|
void rt2x00lib_beacondone(struct rt2x00_dev *rt2x00dev)
|
|
@@ -183,9 +189,9 @@ void rt2x00lib_beacondone(struct rt2x00_dev *rt2x00dev)
|
|
|
return;
|
|
|
|
|
|
/* send buffered bc/mc frames out for every bssid */
|
|
|
- ieee80211_iterate_active_interfaces(rt2x00dev->hw,
|
|
|
- rt2x00lib_bc_buffer_iter,
|
|
|
- rt2x00dev);
|
|
|
+ ieee80211_iterate_active_interfaces_atomic(rt2x00dev->hw,
|
|
|
+ rt2x00lib_bc_buffer_iter,
|
|
|
+ rt2x00dev);
|
|
|
/*
|
|
|
* Devices with pre tbtt interrupt don't need to update the beacon
|
|
|
* here as they will fetch the next beacon directly prior to
|
|
@@ -195,9 +201,9 @@ void rt2x00lib_beacondone(struct rt2x00_dev *rt2x00dev)
|
|
|
return;
|
|
|
|
|
|
/* fetch next beacon */
|
|
|
- ieee80211_iterate_active_interfaces(rt2x00dev->hw,
|
|
|
- rt2x00lib_beaconupdate_iter,
|
|
|
- rt2x00dev);
|
|
|
+ ieee80211_iterate_active_interfaces_atomic(rt2x00dev->hw,
|
|
|
+ rt2x00lib_beaconupdate_iter,
|
|
|
+ rt2x00dev);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(rt2x00lib_beacondone);
|
|
|
|
|
@@ -207,9 +213,9 @@ void rt2x00lib_pretbtt(struct rt2x00_dev *rt2x00dev)
|
|
|
return;
|
|
|
|
|
|
/* fetch next beacon */
|
|
|
- ieee80211_iterate_active_interfaces(rt2x00dev->hw,
|
|
|
- rt2x00lib_beaconupdate_iter,
|
|
|
- rt2x00dev);
|
|
|
+ ieee80211_iterate_active_interfaces_atomic(rt2x00dev->hw,
|
|
|
+ rt2x00lib_beaconupdate_iter,
|
|
|
+ rt2x00dev);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(rt2x00lib_pretbtt);
|
|
|
|