mirror of
https://github.com/outbackdingo/mt76.git
synced 2026-10-24 13:26:48 +00:00
move tx queues to struct mt76_dev
Signed-off-by: Felix Fietkau <[email protected]>
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
+1
-1
@@ -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;
|
||||
|
||||
+11
-11
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
+1
-1
@@ -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);
|
||||
|
||||
+12
-9
@@ -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);
|
||||
|
||||
|
||||
+6
-6
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user