Commit e637763b authored by Lorenzo Bianconi's avatar Lorenzo Bianconi Committed by Felix Fietkau

mt76: move mcu queues to mt76_dev q_mcu array

Move mcu queue to a dedicated array q_mcu in mt76_dev structure.
This is a preliminary patch to move data queues in mt76_phy and properly
support dbdc
Signed-off-by: default avatarLorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent d95093a1
...@@ -660,9 +660,13 @@ void mt76_dma_cleanup(struct mt76_dev *dev) ...@@ -660,9 +660,13 @@ void mt76_dma_cleanup(struct mt76_dev *dev)
mt76_worker_disable(&dev->tx_worker); mt76_worker_disable(&dev->tx_worker);
netif_napi_del(&dev->tx_napi); netif_napi_del(&dev->tx_napi);
for (i = 0; i < ARRAY_SIZE(dev->q_tx); i++) for (i = 0; i < ARRAY_SIZE(dev->q_tx); i++)
mt76_dma_tx_cleanup(dev, dev->q_tx[i], true); mt76_dma_tx_cleanup(dev, dev->q_tx[i], true);
for (i = 0; i < ARRAY_SIZE(dev->q_mcu); i++)
mt76_dma_tx_cleanup(dev, dev->q_mcu[i], true);
mt76_for_each_q_rx(dev, i) { mt76_for_each_q_rx(dev, i) {
netif_napi_del(&dev->napi[i]); netif_napi_del(&dev->napi[i]);
mt76_dma_rx_cleanup(dev, &dev->q_rx[i]); mt76_dma_rx_cleanup(dev, &dev->q_rx[i]);
......
...@@ -122,7 +122,8 @@ int mt76_mcu_send_firmware(struct mt76_dev *dev, int cmd, const void *data, ...@@ -122,7 +122,8 @@ int mt76_mcu_send_firmware(struct mt76_dev *dev, int cmd, const void *data,
len -= cur_len; len -= cur_len;
if (dev->queue_ops->tx_cleanup) if (dev->queue_ops->tx_cleanup)
dev->queue_ops->tx_cleanup(dev, dev->q_tx[MT_TXQ_FWDL], dev->queue_ops->tx_cleanup(dev,
dev->q_mcu[MT_MCUQ_FWDL],
false); false);
} }
......
...@@ -64,15 +64,15 @@ enum mt76_txq_id { ...@@ -64,15 +64,15 @@ enum mt76_txq_id {
MT_TXQ_BE = IEEE80211_AC_BE, MT_TXQ_BE = IEEE80211_AC_BE,
MT_TXQ_BK = IEEE80211_AC_BK, MT_TXQ_BK = IEEE80211_AC_BK,
MT_TXQ_PSD, MT_TXQ_PSD,
MT_TXQ_MCU,
MT_TXQ_MCU_WA,
MT_TXQ_BEACON, MT_TXQ_BEACON,
MT_TXQ_CAB, MT_TXQ_CAB,
MT_TXQ_FWDL,
__MT_TXQ_MAX __MT_TXQ_MAX
}; };
enum mt76_mcuq_id { enum mt76_mcuq_id {
MT_MCUQ_WM,
MT_MCUQ_WA,
MT_MCUQ_FWDL,
__MT_MCUQ_MAX __MT_MCUQ_MAX
}; };
...@@ -811,7 +811,7 @@ static inline int mt76_init_mcu_queue(struct mt76_dev *dev, int qid, int idx, ...@@ -811,7 +811,7 @@ static inline int mt76_init_mcu_queue(struct mt76_dev *dev, int qid, int idx,
if (IS_ERR(q)) if (IS_ERR(q))
return PTR_ERR(q); return PTR_ERR(q);
q->qid = qid; q->qid = __MT_TXQ_MAX + qid;
dev->q_mcu[qid] = q; dev->q_mcu[qid] = q;
return 0; return 0;
......
...@@ -4,21 +4,6 @@ ...@@ -4,21 +4,6 @@
#include "mac.h" #include "mac.h"
#include "../dma.h" #include "../dma.h"
static int
mt7603_init_tx_queue(struct mt7603_dev *dev, int qid, int idx, int n_desc)
{
int err;
err = mt76_init_tx_queue(&dev->mphy, qid, idx, n_desc,
MT_TX_RING_BASE);
if (err < 0)
return err;
mt7603_irq_enable(dev, MT_INT_TX_DONE(idx));
return 0;
}
static void static void
mt7603_rx_loopback_skb(struct mt7603_dev *dev, struct sk_buff *skb) mt7603_rx_loopback_skb(struct mt7603_dev *dev, struct sk_buff *skb)
{ {
...@@ -146,13 +131,15 @@ static int mt7603_poll_tx(struct napi_struct *napi, int budget) ...@@ -146,13 +131,15 @@ static int mt7603_poll_tx(struct napi_struct *napi, int budget)
dev = container_of(napi, struct mt7603_dev, mt76.tx_napi); dev = container_of(napi, struct mt7603_dev, mt76.tx_napi);
dev->tx_dma_check = 0; dev->tx_dma_check = 0;
for (i = MT_TXQ_MCU; i >= 0; i--) mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_WM], false);
for (i = MT_TXQ_PSD; i >= 0; i--)
mt76_queue_tx_cleanup(dev, dev->mt76.q_tx[i], false); mt76_queue_tx_cleanup(dev, dev->mt76.q_tx[i], false);
if (napi_complete_done(napi, 0)) if (napi_complete_done(napi, 0))
mt7603_irq_enable(dev, MT_INT_TX_DONE_ALL); mt7603_irq_enable(dev, MT_INT_TX_DONE_ALL);
for (i = MT_TXQ_MCU; i >= 0; i--) mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_WM], false);
for (i = MT_TXQ_PSD; i >= 0; i--)
mt76_queue_tx_cleanup(dev, dev->mt76.q_tx[i], false); mt76_queue_tx_cleanup(dev, dev->mt76.q_tx[i], false);
mt7603_mac_sta_poll(dev); mt7603_mac_sta_poll(dev);
...@@ -185,32 +172,42 @@ int mt7603_dma_init(struct mt7603_dev *dev) ...@@ -185,32 +172,42 @@ int mt7603_dma_init(struct mt7603_dev *dev)
mt7603_pse_client_reset(dev); mt7603_pse_client_reset(dev);
for (i = 0; i < ARRAY_SIZE(wmm_queue_map); i++) { for (i = 0; i < ARRAY_SIZE(wmm_queue_map); i++) {
ret = mt7603_init_tx_queue(dev, i, wmm_queue_map[i], ret = mt76_init_tx_queue(&dev->mphy, i, wmm_queue_map[i],
MT7603_TX_RING_SIZE); MT7603_TX_RING_SIZE, MT_TX_RING_BASE);
if (ret) if (ret)
return ret; return ret;
} }
ret = mt7603_init_tx_queue(dev, MT_TXQ_PSD, ret = mt76_init_tx_queue(&dev->mphy, MT_TXQ_PSD, MT_TX_HW_QUEUE_MGMT,
MT_TX_HW_QUEUE_MGMT, MT7603_PSD_RING_SIZE); MT7603_PSD_RING_SIZE, MT_TX_RING_BASE);
if (ret) if (ret)
return ret; return ret;
ret = mt7603_init_tx_queue(dev, MT_TXQ_MCU, ret = mt76_init_mcu_queue(&dev->mt76, MT_MCUQ_WM, MT_TX_HW_QUEUE_MCU,
MT_TX_HW_QUEUE_MCU, MT_MCU_RING_SIZE); MT_MCU_RING_SIZE, MT_TX_RING_BASE);
if (ret) if (ret)
return ret; return ret;
ret = mt7603_init_tx_queue(dev, MT_TXQ_BEACON, ret = mt76_init_tx_queue(&dev->mphy, MT_TXQ_BEACON, MT_TX_HW_QUEUE_BCN,
MT_TX_HW_QUEUE_BCN, MT_MCU_RING_SIZE); MT_MCU_RING_SIZE, MT_TX_RING_BASE);
if (ret) if (ret)
return ret; return ret;
ret = mt7603_init_tx_queue(dev, MT_TXQ_CAB, ret = mt76_init_tx_queue(&dev->mphy, MT_TXQ_CAB, MT_TX_HW_QUEUE_BMC,
MT_TX_HW_QUEUE_BMC, MT_MCU_RING_SIZE); MT_MCU_RING_SIZE, MT_TX_RING_BASE);
if (ret) if (ret)
return ret; return ret;
mt7603_irq_enable(dev,
MT_INT_TX_DONE(IEEE80211_AC_VO) |
MT_INT_TX_DONE(IEEE80211_AC_VI) |
MT_INT_TX_DONE(IEEE80211_AC_BE) |
MT_INT_TX_DONE(IEEE80211_AC_BK) |
MT_INT_TX_DONE(MT_TX_HW_QUEUE_MGMT) |
MT_INT_TX_DONE(MT_TX_HW_QUEUE_MCU) |
MT_INT_TX_DONE(MT_TX_HW_QUEUE_BCN) |
MT_INT_TX_DONE(MT_TX_HW_QUEUE_BMC));
ret = mt7603_init_rx_queue(dev, &dev->mt76.q_rx[MT_RXQ_MCU], 1, ret = mt7603_init_rx_queue(dev, &dev->mt76.q_rx[MT_RXQ_MCU], 1,
MT7603_MCU_RX_RING_SIZE, MT_RX_BUF_SIZE); MT7603_MCU_RX_RING_SIZE, MT_RX_BUF_SIZE);
if (ret) if (ret)
......
...@@ -1434,6 +1434,7 @@ static void mt7603_mac_watchdog_reset(struct mt7603_dev *dev) ...@@ -1434,6 +1434,7 @@ static void mt7603_mac_watchdog_reset(struct mt7603_dev *dev)
mt7603_pse_client_reset(dev); mt7603_pse_client_reset(dev);
mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_WM], true);
for (i = 0; i < __MT_TXQ_MAX; i++) for (i = 0; i < __MT_TXQ_MAX; i++)
mt76_queue_tx_cleanup(dev, dev->mt76.q_tx[i], true); mt76_queue_tx_cleanup(dev, dev->mt76.q_tx[i], true);
......
...@@ -73,7 +73,7 @@ mt7603_mcu_skb_send_msg(struct mt76_dev *mdev, struct sk_buff *skb, ...@@ -73,7 +73,7 @@ mt7603_mcu_skb_send_msg(struct mt76_dev *mdev, struct sk_buff *skb,
if (wait_seq) if (wait_seq)
*wait_seq = seq; *wait_seq = seq;
return mt76_tx_queue_skb_raw(dev, mdev->q_tx[MT_TXQ_MCU], skb, 0); return mt76_tx_queue_skb_raw(dev, mdev->q_mcu[MT_MCUQ_WM], skb, 0);
} }
static int static int
......
...@@ -332,21 +332,18 @@ static int ...@@ -332,21 +332,18 @@ static int
mt7615_queues_read(struct seq_file *s, void *data) mt7615_queues_read(struct seq_file *s, void *data)
{ {
struct mt7615_dev *dev = dev_get_drvdata(s->private); struct mt7615_dev *dev = dev_get_drvdata(s->private);
static const struct { struct {
struct mt76_queue *q;
char *queue; char *queue;
int id;
} queue_map[] = { } queue_map[] = {
{ "PDMA0", MT_TXQ_BE }, { dev->mt76.q_tx[MT_TXQ_BE], "PDMA0" },
{ "MCUQ", MT_TXQ_MCU }, { dev->mt76.q_mcu[MT_MCUQ_WM], "MCUQ" },
{ "MCUFWQ", MT_TXQ_FWDL }, { dev->mt76.q_mcu[MT_MCUQ_FWDL], "MCUFWQ" },
}; };
int i; int i;
for (i = 0; i < ARRAY_SIZE(queue_map); i++) { for (i = 0; i < ARRAY_SIZE(queue_map); i++) {
struct mt76_queue *q = dev->mt76.q_tx[queue_map[i].id]; struct mt76_queue *q = queue_map[i].q;
if (!q)
continue;
seq_printf(s, seq_printf(s,
"%s: queued=%d head=%d tail=%d\n", "%s: queued=%d head=%d tail=%d\n",
......
...@@ -37,9 +37,8 @@ mt7622_init_tx_queues_multi(struct mt7615_dev *dev) ...@@ -37,9 +37,8 @@ mt7622_init_tx_queues_multi(struct mt7615_dev *dev)
if (ret) if (ret)
return ret; return ret;
return mt76_init_tx_queue(&dev->mphy, MT_TXQ_MCU, MT7622_TXQ_MCU, return mt76_init_mcu_queue(&dev->mt76, MT_MCUQ_WM, MT7622_TXQ_MCU,
MT7615_TX_MCU_RING_SIZE, MT7615_TX_MCU_RING_SIZE, MT_TX_RING_BASE);
MT_TX_RING_BASE);
} }
static int static int
...@@ -47,9 +46,8 @@ mt7615_init_tx_queues(struct mt7615_dev *dev) ...@@ -47,9 +46,8 @@ mt7615_init_tx_queues(struct mt7615_dev *dev)
{ {
int ret, i; int ret, i;
ret = mt76_init_tx_queue(&dev->mphy, MT_TXQ_FWDL, MT7615_TXQ_FWDL, ret = mt76_init_mcu_queue(&dev->mt76, MT_MCUQ_FWDL, MT7615_TXQ_FWDL,
MT7615_TX_FWDL_RING_SIZE, MT7615_TX_FWDL_RING_SIZE, MT_TX_RING_BASE);
MT_TX_RING_BASE);
if (ret) if (ret)
return ret; return ret;
...@@ -61,12 +59,11 @@ mt7615_init_tx_queues(struct mt7615_dev *dev) ...@@ -61,12 +59,11 @@ mt7615_init_tx_queues(struct mt7615_dev *dev)
if (ret) if (ret)
return ret; return ret;
for (i = 1; i < MT_TXQ_MCU; i++) for (i = 1; i <= MT_TXQ_PSD ; i++)
dev->mt76.q_tx[i] = dev->mt76.q_tx[0]; dev->mt76.q_tx[i] = dev->mt76.q_tx[0];
return mt76_init_tx_queue(&dev->mphy, MT_TXQ_MCU, MT7615_TXQ_MCU, return mt76_init_mcu_queue(&dev->mt76, MT_MCUQ_WM, MT7615_TXQ_MCU,
MT7615_TX_MCU_RING_SIZE, MT7615_TX_MCU_RING_SIZE, MT_TX_RING_BASE);
MT_TX_RING_BASE);
} }
static int mt7615_poll_tx(struct napi_struct *napi, int budget) static int mt7615_poll_tx(struct napi_struct *napi, int budget)
...@@ -75,7 +72,7 @@ static int mt7615_poll_tx(struct napi_struct *napi, int budget) ...@@ -75,7 +72,7 @@ static int mt7615_poll_tx(struct napi_struct *napi, int budget)
dev = container_of(napi, struct mt7615_dev, mt76.tx_napi); dev = container_of(napi, struct mt7615_dev, mt76.tx_napi);
mt76_queue_tx_cleanup(dev, dev->mt76.q_tx[MT_TXQ_MCU], false); mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_WM], false);
if (napi_complete_done(napi, 0)) if (napi_complete_done(napi, 0))
mt7615_irq_enable(dev, mt7615_tx_mcu_int_mask(dev)); mt7615_irq_enable(dev, mt7615_tx_mcu_int_mask(dev));
......
...@@ -2044,6 +2044,7 @@ void mt7615_dma_reset(struct mt7615_dev *dev) ...@@ -2044,6 +2044,7 @@ void mt7615_dma_reset(struct mt7615_dev *dev)
MT_WPDMA_GLO_CFG_TX_WRITEBACK_DONE); MT_WPDMA_GLO_CFG_TX_WRITEBACK_DONE);
usleep_range(1000, 2000); usleep_range(1000, 2000);
mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_WM], true);
for (i = 0; i < __MT_TXQ_MAX; i++) for (i = 0; i < __MT_TXQ_MAX; i++)
mt76_queue_tx_cleanup(dev, dev->mt76.q_tx[i], true); mt76_queue_tx_cleanup(dev, dev->mt76.q_tx[i], true);
......
...@@ -235,11 +235,11 @@ mt7615_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb, ...@@ -235,11 +235,11 @@ mt7615_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,
mt7615_mcu_fill_msg(dev, skb, cmd, seq); mt7615_mcu_fill_msg(dev, skb, cmd, seq);
if (test_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state)) if (test_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state))
qid = MT_TXQ_MCU; qid = MT_MCUQ_WM;
else else
qid = MT_TXQ_FWDL; qid = MT_MCUQ_FWDL;
return mt76_tx_queue_skb_raw(dev, dev->mt76.q_tx[qid], skb, 0); return mt76_tx_queue_skb_raw(dev, dev->mt76.q_mcu[qid], skb, 0);
} }
u32 mt7615_rf_rr(struct mt7615_dev *dev, u32 wf, u32 reg) u32 mt7615_rf_rr(struct mt7615_dev *dev, u32 wf, u32 reg)
...@@ -2464,7 +2464,7 @@ int mt7615_mcu_init(struct mt7615_dev *dev) ...@@ -2464,7 +2464,7 @@ int mt7615_mcu_init(struct mt7615_dev *dev)
if (ret) if (ret)
return ret; return ret;
mt76_queue_tx_cleanup(dev, dev->mt76.q_tx[MT_TXQ_FWDL], false); mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_FWDL], false);
dev_dbg(dev->mt76.dev, "Firmware init done\n"); dev_dbg(dev->mt76.dev, "Firmware init done\n");
set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state); set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state);
mt7615_mcu_fw_log_2_host(dev, 0); mt7615_mcu_fw_log_2_host(dev, 0);
......
...@@ -516,7 +516,7 @@ static inline u8 mt7615_lmac_mapping(struct mt7615_dev *dev, u8 ac) ...@@ -516,7 +516,7 @@ static inline u8 mt7615_lmac_mapping(struct mt7615_dev *dev, u8 ac)
static inline u32 mt7615_tx_mcu_int_mask(struct mt7615_dev *dev) static inline u32 mt7615_tx_mcu_int_mask(struct mt7615_dev *dev)
{ {
return MT_INT_TX_DONE(dev->mt76.q_tx[MT_TXQ_MCU]->hw_idx); return MT_INT_TX_DONE(dev->mt76.q_mcu[MT_MCUQ_WM]->hw_idx);
} }
void mt7615_dma_reset(struct mt7615_dev *dev); void mt7615_dma_reset(struct mt7615_dev *dev);
......
...@@ -42,11 +42,11 @@ mt7663s_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb, ...@@ -42,11 +42,11 @@ mt7663s_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,
int ret; int ret;
mt7615_mcu_fill_msg(dev, skb, cmd, seq); mt7615_mcu_fill_msg(dev, skb, cmd, seq);
ret = mt76_tx_queue_skb_raw(dev, mdev->q_tx[MT_TXQ_MCU], skb, 0); ret = mt76_tx_queue_skb_raw(dev, mdev->q_mcu[MT_MCUQ_WM], skb, 0);
if (ret) if (ret)
return ret; return ret;
mt76_queue_kick(dev, mdev->q_tx[MT_TXQ_MCU]); mt76_queue_kick(dev, mdev->q_mcu[MT_MCUQ_WM]);
return ret; return ret;
} }
......
...@@ -217,7 +217,7 @@ static int __mt7663s_xmit_queue(struct mt76_dev *dev, u8 *data, int len) ...@@ -217,7 +217,7 @@ static int __mt7663s_xmit_queue(struct mt76_dev *dev, u8 *data, int len)
static int mt7663s_tx_run_queue(struct mt76_dev *dev, struct mt76_queue *q) static int mt7663s_tx_run_queue(struct mt76_dev *dev, struct mt76_queue *q)
{ {
int qid, err, nframes = 0, len = 0, pse_sz = 0, ple_sz = 0; int qid, err, nframes = 0, len = 0, pse_sz = 0, ple_sz = 0;
bool mcu = q == dev->q_tx[MT_TXQ_MCU]; bool mcu = q == dev->q_mcu[MT_MCUQ_WM];
struct mt76_sdio *sdio = &dev->sdio; struct mt76_sdio *sdio = &dev->sdio;
qid = mcu ? ARRAY_SIZE(sdio->xmit_buf) - 1 : q->qid; qid = mcu ? ARRAY_SIZE(sdio->xmit_buf) - 1 : q->qid;
...@@ -286,11 +286,14 @@ void mt7663s_txrx_worker(struct mt76_worker *w) ...@@ -286,11 +286,14 @@ void mt7663s_txrx_worker(struct mt76_worker *w)
nframes = 0; nframes = 0;
/* tx */ /* tx */
for (i = 0; i < MT_TXQ_MCU_WA; i++) { for (i = 0; i <= MT_TXQ_PSD; i++) {
ret = mt7663s_tx_run_queue(dev, dev->q_tx[i]); ret = mt7663s_tx_run_queue(dev, dev->q_tx[i]);
if (ret > 0) if (ret > 0)
nframes += ret; nframes += ret;
} }
ret = mt7663s_tx_run_queue(dev, dev->q_mcu[MT_MCUQ_WM]);
if (ret > 0)
nframes += ret;
/* rx */ /* rx */
ret = mt7663s_rx_handler(dev); ret = mt7663s_rx_handler(dev);
......
...@@ -61,7 +61,7 @@ int mt76x02_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data, ...@@ -61,7 +61,7 @@ int mt76x02_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data,
FIELD_PREP(MT_MCU_MSG_PORT, CPU_TX_PORT) | FIELD_PREP(MT_MCU_MSG_PORT, CPU_TX_PORT) |
FIELD_PREP(MT_MCU_MSG_LEN, skb->len); FIELD_PREP(MT_MCU_MSG_LEN, skb->len);
ret = mt76_tx_queue_skb_raw(dev, mdev->q_tx[MT_TXQ_MCU], skb, tx_info); ret = mt76_tx_queue_skb_raw(dev, mdev->q_mcu[MT_MCUQ_WM], skb, tx_info);
if (ret) if (ret)
goto out; goto out;
......
...@@ -104,21 +104,6 @@ void mt76x02e_init_beacon_config(struct mt76x02_dev *dev) ...@@ -104,21 +104,6 @@ void mt76x02e_init_beacon_config(struct mt76x02_dev *dev)
} }
EXPORT_SYMBOL_GPL(mt76x02e_init_beacon_config); EXPORT_SYMBOL_GPL(mt76x02e_init_beacon_config);
static int
mt76x02_init_tx_queue(struct mt76x02_dev *dev, int qid, int idx, int n_desc)
{
int err;
err = mt76_init_tx_queue(&dev->mphy, qid, idx, n_desc,
MT_TX_RING_BASE);
if (err < 0)
return err;
mt76x02_irq_enable(dev, MT_INT_TX_DONE(idx));
return 0;
}
static int static int
mt76x02_init_rx_queue(struct mt76x02_dev *dev, struct mt76_queue *q, mt76x02_init_rx_queue(struct mt76x02_dev *dev, struct mt76_queue *q,
int idx, int n_desc, int bufsize) int idx, int n_desc, int bufsize)
...@@ -164,13 +149,15 @@ static int mt76x02_poll_tx(struct napi_struct *napi, int budget) ...@@ -164,13 +149,15 @@ static int mt76x02_poll_tx(struct napi_struct *napi, int budget)
mt76x02_mac_poll_tx_status(dev, false); mt76x02_mac_poll_tx_status(dev, false);
for (i = MT_TXQ_MCU; i >= 0; i--) mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_WM], false);
for (i = MT_TXQ_PSD; i >= 0; i--)
mt76_queue_tx_cleanup(dev, dev->mt76.q_tx[i], false); mt76_queue_tx_cleanup(dev, dev->mt76.q_tx[i], false);
if (napi_complete_done(napi, 0)) if (napi_complete_done(napi, 0))
mt76x02_irq_enable(dev, MT_INT_TX_DONE_ALL); mt76x02_irq_enable(dev, MT_INT_TX_DONE_ALL);
for (i = MT_TXQ_MCU; i >= 0; i--) mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_WM], false);
for (i = MT_TXQ_PSD; i >= 0; i--)
mt76_queue_tx_cleanup(dev, dev->mt76.q_tx[i], false); mt76_queue_tx_cleanup(dev, dev->mt76.q_tx[i], false);
mt76_worker_schedule(&dev->mt76.tx_worker); mt76_worker_schedule(&dev->mt76.tx_worker);
...@@ -203,22 +190,31 @@ int mt76x02_dma_init(struct mt76x02_dev *dev) ...@@ -203,22 +190,31 @@ int mt76x02_dma_init(struct mt76x02_dev *dev)
mt76_wr(dev, MT_WPDMA_RST_IDX, ~0); mt76_wr(dev, MT_WPDMA_RST_IDX, ~0);
for (i = 0; i < IEEE80211_NUM_ACS; i++) { for (i = 0; i < IEEE80211_NUM_ACS; i++) {
ret = mt76x02_init_tx_queue(dev, i, mt76_ac_to_hwq(i), ret = mt76_init_tx_queue(&dev->mphy, i, mt76_ac_to_hwq(i),
MT76x02_TX_RING_SIZE); MT76x02_TX_RING_SIZE,
MT_TX_RING_BASE);
if (ret) if (ret)
return ret; return ret;
} }
ret = mt76x02_init_tx_queue(dev, MT_TXQ_PSD, ret = mt76_init_tx_queue(&dev->mphy, MT_TXQ_PSD, MT_TX_HW_QUEUE_MGMT,
MT_TX_HW_QUEUE_MGMT, MT76x02_PSD_RING_SIZE); MT76x02_PSD_RING_SIZE, MT_TX_RING_BASE);
if (ret) if (ret)
return ret; return ret;
ret = mt76x02_init_tx_queue(dev, MT_TXQ_MCU, ret = mt76_init_mcu_queue(&dev->mt76, MT_MCUQ_WM, MT_TX_HW_QUEUE_MCU,
MT_TX_HW_QUEUE_MCU, MT_MCU_RING_SIZE); MT_MCU_RING_SIZE, MT_TX_RING_BASE);
if (ret) if (ret)
return ret; return ret;
mt76x02_irq_enable(dev,
MT_INT_TX_DONE(IEEE80211_AC_VO) |
MT_INT_TX_DONE(IEEE80211_AC_VI) |
MT_INT_TX_DONE(IEEE80211_AC_BE) |
MT_INT_TX_DONE(IEEE80211_AC_BK) |
MT_INT_TX_DONE(MT_TX_HW_QUEUE_MGMT) |
MT_INT_TX_DONE(MT_TX_HW_QUEUE_MCU));
ret = mt76x02_init_rx_queue(dev, &dev->mt76.q_rx[MT_RXQ_MCU], 1, ret = mt76x02_init_rx_queue(dev, &dev->mt76.q_rx[MT_RXQ_MCU], 1,
MT_MCU_RING_SIZE, MT_RX_BUF_SIZE); MT_MCU_RING_SIZE, MT_RX_BUF_SIZE);
if (ret) if (ret)
...@@ -469,6 +465,7 @@ static void mt76x02_watchdog_reset(struct mt76x02_dev *dev) ...@@ -469,6 +465,7 @@ static void mt76x02_watchdog_reset(struct mt76x02_dev *dev)
if (restart) if (restart)
mt76_mcu_restart(dev); mt76_mcu_restart(dev);
mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_WM], true);
for (i = 0; i < __MT_TXQ_MAX; i++) for (i = 0; i < __MT_TXQ_MAX; i++)
mt76_queue_tx_cleanup(dev, dev->mt76.q_tx[i], true); mt76_queue_tx_cleanup(dev, dev->mt76.q_tx[i], true);
......
...@@ -280,22 +280,19 @@ static int ...@@ -280,22 +280,19 @@ static int
mt7915_queues_read(struct seq_file *s, void *data) mt7915_queues_read(struct seq_file *s, void *data)
{ {
struct mt7915_dev *dev = dev_get_drvdata(s->private); struct mt7915_dev *dev = dev_get_drvdata(s->private);
static const struct { struct {
struct mt76_queue *q;
char *queue; char *queue;
int id;
} queue_map[] = { } queue_map[] = {
{ "WFDMA0", MT_TXQ_BE }, { dev->mt76.q_tx[MT_TXQ_BE], "WFDMA0" },
{ "MCUWM", MT_TXQ_MCU }, { dev->mt76.q_mcu[MT_MCUQ_WM], "MCUWM" },
{ "MCUWA", MT_TXQ_MCU_WA }, { dev->mt76.q_mcu[MT_MCUQ_WA], "MCUWA" },
{ "MCUFWQ", MT_TXQ_FWDL }, { dev->mt76.q_mcu[MT_MCUQ_FWDL], "MCUFWQ" },
}; };
int i; int i;
for (i = 0; i < ARRAY_SIZE(queue_map); i++) { for (i = 0; i < ARRAY_SIZE(queue_map); i++) {
struct mt76_queue *q = dev->mt76.q_tx[queue_map[i].id]; struct mt76_queue *q = queue_map[i].q;
if (!q)
continue;
seq_printf(s, seq_printf(s,
"%s: queued=%d head=%d tail=%d\n", "%s: queued=%d head=%d tail=%d\n",
......
...@@ -14,7 +14,7 @@ mt7915_init_tx_queues(struct mt7915_dev *dev, int idx, int n_desc) ...@@ -14,7 +14,7 @@ mt7915_init_tx_queues(struct mt7915_dev *dev, int idx, int n_desc)
if (err < 0) if (err < 0)
return err; return err;
for (i = 0; i < MT_TXQ_MCU; i++) for (i = 0; i <= MT_TXQ_PSD; i++)
dev->mt76.q_tx[i] = dev->mt76.q_tx[0]; dev->mt76.q_tx[i] = dev->mt76.q_tx[0];
return 0; return 0;
...@@ -56,8 +56,8 @@ void mt7915_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q, ...@@ -56,8 +56,8 @@ void mt7915_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
static void static void
mt7915_tx_cleanup(struct mt7915_dev *dev) mt7915_tx_cleanup(struct mt7915_dev *dev)
{ {
mt76_queue_tx_cleanup(dev, dev->mt76.q_tx[MT_TXQ_MCU], false); mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_WM], false);
mt76_queue_tx_cleanup(dev, dev->mt76.q_tx[MT_TXQ_MCU_WA], false); mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_WA], false);
} }
static int mt7915_poll_tx(struct napi_struct *napi, int budget) static int mt7915_poll_tx(struct napi_struct *napi, int budget)
...@@ -243,20 +243,20 @@ int mt7915_dma_init(struct mt7915_dev *dev) ...@@ -243,20 +243,20 @@ int mt7915_dma_init(struct mt7915_dev *dev)
return ret; return ret;
/* command to WM */ /* command to WM */
ret = mt76_init_tx_queue(&dev->mphy, MT_TXQ_MCU, MT7915_TXQ_MCU_WM, ret = mt76_init_mcu_queue(&dev->mt76, MT_MCUQ_WM, MT7915_TXQ_MCU_WM,
MT7915_TX_MCU_RING_SIZE, MT_TX_RING_BASE); MT7915_TX_MCU_RING_SIZE, MT_TX_RING_BASE);
if (ret) if (ret)
return ret; return ret;
/* command to WA */ /* command to WA */
ret = mt76_init_tx_queue(&dev->mphy, MT_TXQ_MCU_WA, MT7915_TXQ_MCU_WA, ret = mt76_init_mcu_queue(&dev->mt76, MT_MCUQ_WA, MT7915_TXQ_MCU_WA,
MT7915_TX_MCU_RING_SIZE, MT_TX_RING_BASE); MT7915_TX_MCU_RING_SIZE, MT_TX_RING_BASE);
if (ret) if (ret)
return ret; return ret;
/* firmware download */ /* firmware download */
ret = mt76_init_tx_queue(&dev->mphy, MT_TXQ_FWDL, MT7915_TXQ_FWDL, ret = mt76_init_mcu_queue(&dev->mt76, MT_MCUQ_FWDL, MT7915_TXQ_FWDL,
MT7915_TX_FWDL_RING_SIZE, MT_TX_RING_BASE); MT7915_TX_FWDL_RING_SIZE, MT_TX_RING_BASE);
if (ret) if (ret)
return ret; return ret;
......
...@@ -1420,6 +1420,7 @@ mt7915_dma_reset(struct mt7915_dev *dev) ...@@ -1420,6 +1420,7 @@ mt7915_dma_reset(struct mt7915_dev *dev)
MT_WFDMA1_GLO_CFG_TX_DMA_EN | MT_WFDMA1_GLO_CFG_RX_DMA_EN); MT_WFDMA1_GLO_CFG_TX_DMA_EN | MT_WFDMA1_GLO_CFG_RX_DMA_EN);
usleep_range(1000, 2000); usleep_range(1000, 2000);
mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_WA], true);
for (i = 0; i < __MT_TXQ_MAX; i++) for (i = 0; i < __MT_TXQ_MAX; i++)
mt76_queue_tx_cleanup(dev, dev->mt76.q_tx[i], true); mt76_queue_tx_cleanup(dev, dev->mt76.q_tx[i], true);
......
...@@ -268,18 +268,18 @@ mt7915_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb, ...@@ -268,18 +268,18 @@ mt7915_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,
seq = ++dev->mt76.mcu.msg_seq & 0xf; seq = ++dev->mt76.mcu.msg_seq & 0xf;
if (cmd == -MCU_CMD_FW_SCATTER) { if (cmd == -MCU_CMD_FW_SCATTER) {
txq = MT_TXQ_FWDL; txq = MT_MCUQ_FWDL;
goto exit; goto exit;
} }
mcu_txd = (struct mt7915_mcu_txd *)skb_push(skb, sizeof(*mcu_txd)); mcu_txd = (struct mt7915_mcu_txd *)skb_push(skb, sizeof(*mcu_txd));
if (test_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state)) { if (test_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state)) {
txq = MT_TXQ_MCU_WA; txq = MT_MCUQ_WA;
qidx = MT_TX_MCU_PORT_RX_Q0; qidx = MT_TX_MCU_PORT_RX_Q0;
pkt_fmt = MT_TX_TYPE_CMD; pkt_fmt = MT_TX_TYPE_CMD;
} else { } else {
txq = MT_TXQ_MCU; txq = MT_MCUQ_WM;
qidx = MT_TX_MCU_PORT_RX_Q0; qidx = MT_TX_MCU_PORT_RX_Q0;
pkt_fmt = MT_TX_TYPE_CMD; pkt_fmt = MT_TX_TYPE_CMD;
} }
...@@ -326,7 +326,7 @@ mt7915_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb, ...@@ -326,7 +326,7 @@ mt7915_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,
if (wait_seq) if (wait_seq)
*wait_seq = seq; *wait_seq = seq;
return mt76_tx_queue_skb_raw(dev, mdev->q_tx[txq], skb, 0); return mt76_tx_queue_skb_raw(dev, mdev->q_mcu[txq], skb, 0);
} }
static void static void
...@@ -2799,7 +2799,7 @@ static int mt7915_load_firmware(struct mt7915_dev *dev) ...@@ -2799,7 +2799,7 @@ static int mt7915_load_firmware(struct mt7915_dev *dev)
return -EIO; return -EIO;
} }
mt76_queue_tx_cleanup(dev, dev->mt76.q_tx[MT_TXQ_FWDL], false); mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_FWDL], false);
dev_dbg(dev->mt76.dev, "Firmware init done\n"); dev_dbg(dev->mt76.dev, "Firmware init done\n");
......
...@@ -74,8 +74,8 @@ static int mt76s_alloc_tx(struct mt76_dev *dev) ...@@ -74,8 +74,8 @@ static int mt76s_alloc_tx(struct mt76_dev *dev)
if (IS_ERR(q)) if (IS_ERR(q))
return PTR_ERR(q); return PTR_ERR(q);
q->qid = MT_TXQ_MCU; q->qid = MT_MCUQ_WM;
dev->q_tx[MT_TXQ_MCU] = q; dev->q_mcu[MT_MCUQ_WM] = q;
return 0; return 0;
} }
...@@ -157,7 +157,7 @@ static void mt76s_net_worker(struct mt76_worker *w) ...@@ -157,7 +157,7 @@ static void mt76s_net_worker(struct mt76_worker *w)
static int mt76s_process_tx_queue(struct mt76_dev *dev, struct mt76_queue *q) static int mt76s_process_tx_queue(struct mt76_dev *dev, struct mt76_queue *q)
{ {
bool wake, mcu = q == dev->q_tx[MT_TXQ_MCU]; bool wake, mcu = q == dev->q_mcu[MT_MCUQ_WM];
struct mt76_queue_entry entry; struct mt76_queue_entry entry;
int nframes = 0; int nframes = 0;
...@@ -203,8 +203,9 @@ static void mt76s_status_worker(struct mt76_worker *w) ...@@ -203,8 +203,9 @@ static void mt76s_status_worker(struct mt76_worker *w)
int i, nframes; int i, nframes;
do { do {
nframes = 0; nframes = mt76s_process_tx_queue(dev, dev->q_mcu[MT_MCUQ_WM]);
for (i = 0; i < MT_TXQ_MCU_WA; i++)
for (i = 0; i <= MT_TXQ_PSD; i++)
nframes += mt76s_process_tx_queue(dev, dev->q_tx[i]); nframes += mt76s_process_tx_queue(dev, dev->q_tx[i]);
if (dev->drv->tx_status_data && if (dev->drv->tx_status_data &&
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment