diff --git a/mt76.h b/mt76.h index ca71d30c..f3ec5976 100644 --- a/mt76.h +++ b/mt76.h @@ -35,6 +35,18 @@ struct mt76_bus_ops { void (*copy)(struct mt76_dev *dev, u32 offset, const void *data, int len); }; +enum mt76_txq_id { + MT_TXQ_VO = IEEE80211_AC_VO, + MT_TXQ_VI = IEEE80211_AC_VI, + MT_TXQ_BE = IEEE80211_AC_BE, + MT_TXQ_BK = IEEE80211_AC_BK, + MT_TXQ_PSD, + MT_TXQ_MCU, + MT_TXQ_BEACON, + MT_TXQ_CAB, + __MT_TXQ_MAX +}; + struct mt76_queue_entry { struct sk_buff *skb; union { @@ -125,6 +137,7 @@ struct mt76_dev { void __iomem *regs; struct device *dev; + struct mt76_queue q_tx[__MT_TXQ_MAX]; const struct mt76_queue_ops *queue_ops; u32 rev; diff --git a/mt7603.h b/mt7603.h index 344e559d..547d43b5 100644 --- a/mt7603.h +++ b/mt7603.h @@ -36,18 +36,6 @@ enum mt7603_bw { MT_BW_80, }; -enum mt7603_txq_id { - MT_TXQ_VO = IEEE80211_AC_VO, - MT_TXQ_VI = IEEE80211_AC_VI, - MT_TXQ_BE = IEEE80211_AC_BE, - MT_TXQ_BK = IEEE80211_AC_BK, - MT_TXQ_PSD, - MT_TXQ_MCU, - MT_TXQ_BEACON, - MT_TXQ_CAB, - __MT_TXQ_MAX -}; - struct mt7603_mcu { struct mutex mutex; @@ -79,7 +67,6 @@ struct mt7603_dev { struct mt7603_mcu mcu; struct mt76_queue q_rx; - struct mt76_queue q_tx[__MT_TXQ_MAX]; struct net_device napi_dev; struct napi_struct napi; @@ -100,7 +87,7 @@ int mt7603_register_device(struct mt7603_dev *dev); int mt7603_dma_init(struct mt7603_dev *dev); void mt7603_dma_cleanup(struct mt7603_dev *dev); int mt7603_mcu_init(struct mt7603_dev *dev); -int mt7603_tx_queue_mcu(struct mt7603_dev *dev, enum mt7603_txq_id qid, +int mt7603_tx_queue_mcu(struct mt7603_dev *dev, enum mt76_txq_id qid, struct sk_buff *skb); void mt7603_set_irq_mask(struct mt7603_dev *dev, u32 clear, u32 set); diff --git a/mt7603_core.c b/mt7603_core.c index bec23644..54ec124f 100644 --- a/mt7603_core.c +++ b/mt7603_core.c @@ -59,7 +59,7 @@ irqreturn_t mt7603_irq_handler(int irq, void *dev_instance) /* send buffered multicast frames now */ if (intr & MT_INT_TBTT) - mt76_queue_kick(dev, &dev->q_tx[MT_TXQ_PSD]); + mt76_queue_kick(dev, &dev->mt76.q_tx[MT_TXQ_PSD]); #endif return IRQ_HANDLED; diff --git a/mt7603_dma.c b/mt7603_dma.c index c1da0ec3..5d4a45ab 100644 --- a/mt7603_dma.c +++ b/mt7603_dma.c @@ -57,10 +57,10 @@ mt7603_dma_rx_fill(struct mt7603_dev *dev, struct mt76_queue *q) } int -mt7603_tx_queue_mcu(struct mt7603_dev *dev, enum mt7603_txq_id qid, +mt7603_tx_queue_mcu(struct mt7603_dev *dev, enum mt76_txq_id qid, struct sk_buff *skb) { - struct mt76_queue *q = &dev->q_tx[qid]; + struct mt76_queue *q = &dev->mt76.q_tx[qid]; dma_addr_t addr; int idx; @@ -215,8 +215,8 @@ mt7603_tx_tasklet(unsigned long data) struct mt7603_dev *dev = (struct mt7603_dev *) data; int i; - for (i = ARRAY_SIZE(dev->q_tx) - 1; i >= 0; i--) - mt76_tx_cleanup(dev, &dev->q_tx[i], false); + for (i = ARRAY_SIZE(dev->mt76.q_tx) - 1; i >= 0; i--) + mt76_tx_cleanup(dev, &dev->mt76.q_tx[i], false); mt7603_irq_enable(dev, MT_INT_TX_DONE_ALL); } @@ -278,28 +278,28 @@ int mt7603_dma_init(struct mt7603_dev *dev) mt76_wr(dev, MT_WPDMA_RST_IDX, ~0); for (i = 0; i < ARRAY_SIZE(wmm_queue_map); i++) { - ret = mt7603_init_tx_queue(dev, &dev->q_tx[i], wmm_queue_map[i], + ret = mt7603_init_tx_queue(dev, &dev->mt76.q_tx[i], wmm_queue_map[i], MT_TX_RING_SIZE); if (ret) return ret; } - ret = mt7603_init_tx_queue(dev, &dev->q_tx[MT_TXQ_PSD], + ret = mt7603_init_tx_queue(dev, &dev->mt76.q_tx[MT_TXQ_PSD], MT_TX_HW_QUEUE_MGMT, MT_TX_RING_SIZE); if (ret) return ret; - ret = mt7603_init_tx_queue(dev, &dev->q_tx[MT_TXQ_MCU], + ret = mt7603_init_tx_queue(dev, &dev->mt76.q_tx[MT_TXQ_MCU], MT_TX_HW_QUEUE_MCU, MT_MCU_RING_SIZE); if (ret) return ret; - ret = mt7603_init_tx_queue(dev, &dev->q_tx[MT_TXQ_BEACON], + ret = mt7603_init_tx_queue(dev, &dev->mt76.q_tx[MT_TXQ_BEACON], MT_TX_HW_QUEUE_BCN, MT_MCU_RING_SIZE); if (ret) return ret; - ret = mt7603_init_tx_queue(dev, &dev->q_tx[MT_TXQ_CAB], + ret = mt7603_init_tx_queue(dev, &dev->mt76.q_tx[MT_TXQ_CAB], MT_TX_HW_QUEUE_BMC, MT_MCU_RING_SIZE); if (ret) return ret; @@ -333,8 +333,8 @@ void mt7603_dma_cleanup(struct mt7603_dev *dev) tasklet_kill(&dev->tx_tasklet); tasklet_kill(&dev->rx_tasklet); - for (i = 0; i < ARRAY_SIZE(dev->q_tx); i++) - mt76_tx_cleanup(dev, &dev->q_tx[i], true); + for (i = 0; i < ARRAY_SIZE(dev->mt76.q_tx); i++) + mt76_tx_cleanup(dev, &dev->mt76.q_tx[i], true); mt7603_rx_cleanup(dev, &dev->q_rx); mt7603_rx_cleanup(dev, &dev->mcu.q_rx); } diff --git a/mt76x2.h b/mt76x2.h index fdec5982..219e2808 100644 --- a/mt76x2.h +++ b/mt76x2.h @@ -39,16 +39,6 @@ #include "mt76x2_regs.h" #include "mt76x2_mac.h" -enum mt76x2_txq_id { - MT_TXQ_VO = IEEE80211_AC_VO, - MT_TXQ_VI = IEEE80211_AC_VI, - MT_TXQ_BE = IEEE80211_AC_BE, - MT_TXQ_BK = IEEE80211_AC_BK, - MT_TXQ_PSD, - MT_TXQ_MCU, - __MT_TXQ_MAX -}; - struct mt76x2_mcu { struct mutex mutex; @@ -117,7 +107,6 @@ struct mt76x2_dev { struct list_head txwi_cache; struct mt76x2_mcu mcu; struct mt76_queue q_rx; - struct mt76_queue q_tx[__MT_TXQ_MAX]; struct net_device napi_dev; struct napi_struct napi; @@ -240,7 +229,7 @@ void mt76x2_rx(struct mt76x2_dev *dev, struct sk_buff *skb); int mt76x2_tx_queue_skb(struct mt76x2_dev *dev, struct mt76_queue *q, struct sk_buff *skb, struct mt76_wcid *wcid, struct ieee80211_sta *sta); -int mt76x2_tx_queue_mcu(struct mt76x2_dev *dev, enum mt76x2_txq_id qid, +int mt76x2_tx_queue_mcu(struct mt76x2_dev *dev, enum mt76_txq_id qid, struct sk_buff *skb, int cmd, int seq); void mt76x2_tx(struct ieee80211_hw *hw, struct ieee80211_tx_control *control, struct sk_buff *skb); diff --git a/mt76x2_core.c b/mt76x2_core.c index c7d5f2dc..9274cac5 100644 --- a/mt76x2_core.c +++ b/mt76x2_core.c @@ -71,7 +71,7 @@ irqreturn_t mt76x2_irq_handler(int irq, void *dev_instance) /* send buffered multicast frames now */ if (intr & MT_INT_TBTT) - mt76_queue_kick(dev, &dev->q_tx[MT_TXQ_PSD]); + mt76_queue_kick(dev, &dev->mt76.q_tx[MT_TXQ_PSD]); if (intr & MT_INT_TX_STAT) { mt76x2_mac_poll_tx_status(dev, true); diff --git a/mt76x2_dma.c b/mt76x2_dma.c index 984f82e7..7c2b3d5a 100644 --- a/mt76x2_dma.c +++ b/mt76x2_dma.c @@ -129,10 +129,10 @@ mt76x2_dma_rx_fill(struct mt76x2_dev *dev, struct mt76_queue *q) } int -mt76x2_tx_queue_mcu(struct mt76x2_dev *dev, enum mt76x2_txq_id qid, +mt76x2_tx_queue_mcu(struct mt76x2_dev *dev, enum mt76_txq_id qid, struct sk_buff *skb, int cmd, int seq) { - struct mt76_queue *q = &dev->q_tx[qid]; + struct mt76_queue *q = &dev->mt76.q_tx[qid]; dma_addr_t addr; u32 tx_info; int idx; @@ -249,6 +249,9 @@ mt76x2_rx_cleanup(struct mt76x2_dev *dev, struct mt76_queue *q) static void mt76_tx_cleanup(struct mt76x2_dev *dev, struct mt76_queue *q, bool flush) { + if (!q->desc) + return; + spin_lock_bh(&q->lock); mt76_queue_cleanup(dev, q, flush, mt76x2_tx_cleanup_entry); if (!flush) @@ -365,8 +368,8 @@ mt76x2_tx_tasklet(unsigned long data) mt76x2_mac_process_tx_status_fifo(dev); - for (i = ARRAY_SIZE(dev->q_tx) - 1; i >= 0; i--) - mt76_tx_cleanup(dev, &dev->q_tx[i], false); + for (i = ARRAY_SIZE(dev->mt76.q_tx) - 1; i >= 0; i--) + mt76_tx_cleanup(dev, &dev->mt76.q_tx[i], false); mt76x2_mac_poll_tx_status(dev, false); mt76x2_irq_enable(dev, MT_INT_TX_DONE_ALL); @@ -423,18 +426,18 @@ int mt76x2_dma_init(struct mt76x2_dev *dev) mt76_wr(dev, MT_WPDMA_RST_IDX, ~0); for (i = 0; i < ARRAY_SIZE(wmm_queue_map); i++) { - ret = mt76x2_init_tx_queue(dev, &dev->q_tx[i], wmm_queue_map[i], + ret = mt76x2_init_tx_queue(dev, &dev->mt76.q_tx[i], wmm_queue_map[i], MT_TX_RING_SIZE, false); if (ret) return ret; } - ret = mt76x2_init_tx_queue(dev, &dev->q_tx[MT_TXQ_PSD], + ret = mt76x2_init_tx_queue(dev, &dev->mt76.q_tx[MT_TXQ_PSD], MT_TX_HW_QUEUE_MGMT, MT_TX_RING_SIZE, false); if (ret) return ret; - ret = mt76x2_init_tx_queue(dev, &dev->q_tx[MT_TXQ_MCU], + ret = mt76x2_init_tx_queue(dev, &dev->mt76.q_tx[MT_TXQ_MCU], MT_TX_HW_QUEUE_MCU, MT_MCU_RING_SIZE, true); if (ret) return ret; @@ -462,8 +465,8 @@ void mt76x2_dma_cleanup(struct mt76x2_dev *dev) tasklet_kill(&dev->tx_tasklet); tasklet_kill(&dev->rx_tasklet); - for (i = 0; i < ARRAY_SIZE(dev->q_tx); i++) - mt76_tx_cleanup(dev, &dev->q_tx[i], true); + for (i = 0; i < ARRAY_SIZE(dev->mt76.q_tx); i++) + mt76_tx_cleanup(dev, &dev->mt76.q_tx[i], true); mt76x2_rx_cleanup(dev, &dev->q_rx); mt76x2_rx_cleanup(dev, &dev->mcu.q_rx); diff --git a/mt76x2_tx.c b/mt76x2_tx.c index fd85bc49..d22f8687 100644 --- a/mt76x2_tx.c +++ b/mt76x2_tx.c @@ -45,7 +45,7 @@ void mt76x2_tx(struct ieee80211_hw *hw, struct ieee80211_tx_control *control, ieee80211_get_tx_rates(info->control.vif, control->sta, skb, info->control.rates, 1); - q = &dev->q_tx[qid]; + q = &dev->mt76.q_tx[qid]; spin_lock_bh(&q->lock); mt76x2_tx_queue_skb(dev, q, skb, wcid, control->sta); @@ -71,7 +71,7 @@ void mt76x2_tx_complete(struct mt76x2_dev *dev, struct sk_buff *skb) ieee80211_tx_status(mt76_hw(dev), skb); } - q = &dev->q_tx[qid]; + q = &dev->mt76.q_tx[qid]; if (q->queued < q->ndesc - 8) ieee80211_wake_queue(mt76_hw(dev), qid); } @@ -134,7 +134,7 @@ mt76x2_add_buffered_bc(void *priv, u8 *mac, struct ieee80211_vif *vif) void mt76x2_pre_tbtt_tasklet(unsigned long arg) { struct mt76x2_dev *dev = (struct mt76x2_dev *) arg; - struct mt76_queue *q = &dev->q_tx[MT_TXQ_PSD]; + struct mt76_queue *q = &dev->mt76.q_tx[MT_TXQ_PSD]; struct beacon_bc_data data = {}; struct sk_buff *skb; int i, nframes; @@ -223,7 +223,7 @@ mt76x2_queue_ps_skb(struct mt76x2_dev *dev, struct ieee80211_sta *sta, { struct mt76x2_sta *msta = (struct mt76x2_sta *) sta->drv_priv; struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); - struct mt76_queue *hwq = &dev->q_tx[MT_TXQ_PSD]; + struct mt76_queue *hwq = &dev->mt76.q_tx[MT_TXQ_PSD]; struct mt76_wcid *wcid = &msta->wcid; info->control.flags |= IEEE80211_TX_CTRL_PS_RESPONSE; @@ -242,7 +242,7 @@ mt76x2_release_buffered_frames(struct ieee80211_hw *hw, struct ieee80211_sta *st { struct mt76x2_dev *dev = hw->priv; struct sk_buff *last_skb = NULL; - struct mt76_queue *hwq = &dev->q_tx[MT_TXQ_PSD]; + struct mt76_queue *hwq = &dev->mt76.q_tx[MT_TXQ_PSD]; int i; for (i = 0; tids && nframes; i++, tids >>= 1) { @@ -425,7 +425,7 @@ void mt76x2_txq_init(struct mt76x2_dev *dev, struct ieee80211_txq *txq) INIT_LIST_HEAD(&mtxq->list); skb_queue_head_init(&mtxq->retry_q); - mtxq->hwq = &dev->q_tx[mt76x2_txq_get_qid(txq)]; + mtxq->hwq = &dev->mt76.q_tx[mt76x2_txq_get_qid(txq)]; if (txq->sta) { struct mt76x2_sta *sta = (struct mt76x2_sta *) txq->sta->drv_priv;