aboutsummaryrefslogtreecommitdiff
path: root/mt76x02_usb_core.c
diff options
context:
space:
mode:
Diffstat (limited to 'mt76x02_usb_core.c')
-rw-r--r--mt76x02_usb_core.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/mt76x02_usb_core.c b/mt76x02_usb_core.c
index 2c6c03809b20..0e1ede9314d8 100644
--- a/mt76x02_usb_core.c
+++ b/mt76x02_usb_core.c
@@ -67,7 +67,7 @@ int mt76x02u_tx_prepare_skb(struct mt76_dev *mdev, void *data,
struct mt76_tx_info *tx_info)
{
struct mt76x02_dev *dev = container_of(mdev, struct mt76x02_dev, mt76);
- int pid, len = tx_info->skb->len, ep = q2ep(dev->mphy.q_tx[qid]->hw_idx);
+ int pid, len = tx_info->skb->len, ep = dev->mphy.q_tx[qid]->ep;
struct mt76x02_txwi *txwi;
bool ampdu = IEEE80211_SKB_CB(tx_info->skb)->flags & IEEE80211_TX_CTL_AMPDU;
enum mt76_qsel qsel;
@@ -182,15 +182,16 @@ static void mt76x02u_pre_tbtt_work(struct work_struct *work)
{
struct mt76x02_dev *dev =
container_of(work, struct mt76x02_dev, pre_tbtt_work);
- struct beacon_bc_data data = {};
+ struct beacon_bc_data data = {
+ .dev = dev,
+ };
struct sk_buff *skb;
int nbeacons;
- if (!dev->mt76.beacon_mask)
+ if (!dev->mt76.beacon_mask || dev->mphy.offchannel)
return;
- if (mt76_hw(dev)->conf.flags & IEEE80211_CONF_OFFCHANNEL)
- return;
+ __skb_queue_head_init(&data.q);
mt76x02_resync_beacon_timer(dev);
@@ -198,9 +199,12 @@ static void mt76x02u_pre_tbtt_work(struct work_struct *work)
mt76_set(dev, MT_BCN_BYPASS_MASK, 0xffff);
dev->beacon_data_count = 0;
- ieee80211_iterate_active_interfaces(mt76_hw(dev),
+ ieee80211_iterate_active_interfaces_atomic(mt76_hw(dev),
IEEE80211_IFACE_ITER_RESUME_ALL,
- mt76x02_update_beacon_iter, dev);
+ mt76x02_update_beacon_iter, &data);
+
+ while ((skb = __skb_dequeue(&data.q)) != NULL)
+ mt76x02_mac_set_beacon(dev, skb);
mt76_csa_check(&dev->mt76);