mirror of
https://github.com/torvalds/linux.git
synced 2026-05-23 14:42:08 +02:00
wifi: mt76: mt7921: add MT7902e DMA layout support
Add MT7902 PCIe specific DMA layout overrides for MCU TXQ index, RX ring size, and MCU_WA usage. Common layout remains the default for other chips. This is a prerequisite patch before enabling MT7902 PCIe support. Co-developed-by: Xiong Huang <xiong.huang@mediatek.com> Signed-off-by: Xiong Huang <xiong.huang@mediatek.com> Signed-off-by: Sean Wang <sean.wang@mediatek.com> Link: https://patch.msgid.link/20260219004007.19733-4-sean.wang@kernel.org Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
222606f43b
commit
d3bb1ca228
|
|
@ -17,6 +17,9 @@
|
|||
#define MT7921_RX_MCU_RING_SIZE 8
|
||||
#define MT7921_RX_MCU_WA_RING_SIZE 512
|
||||
|
||||
/* MT7902 Rx Ring0 is for both Rx Event and Tx Done Event */
|
||||
#define MT7902_RX_MCU_RING_SIZE 512
|
||||
|
||||
#define MT7921_EEPROM_SIZE 3584
|
||||
#define MT7921_TOKEN_SIZE 8192
|
||||
|
||||
|
|
@ -119,6 +122,17 @@ enum mt7921_rxq_id {
|
|||
MT7921_RXQ_MCU_WM = 0,
|
||||
};
|
||||
|
||||
/* MT7902 assigns its MCU-WM TXQ at index 15 */
|
||||
enum mt7902_txq_id {
|
||||
MT7902_TXQ_MCU_WM = 15,
|
||||
};
|
||||
|
||||
struct mt7921_dma_layout {
|
||||
u8 mcu_wm_txq;
|
||||
u16 mcu_rxdone_ring_size;
|
||||
bool has_mcu_wa;
|
||||
};
|
||||
|
||||
enum {
|
||||
MT7921_CLC_POWER,
|
||||
MT7921_CLC_CHAN,
|
||||
|
|
|
|||
|
|
@ -167,8 +167,29 @@ static u32 mt7921_rmw(struct mt76_dev *mdev, u32 offset, u32 mask, u32 val)
|
|||
|
||||
static int mt7921_dma_init(struct mt792x_dev *dev)
|
||||
{
|
||||
struct mt7921_dma_layout layout = {
|
||||
/* General case: MT7921 / MT7922 /MT7920 */
|
||||
.mcu_wm_txq = MT7921_TXQ_MCU_WM,
|
||||
.mcu_rxdone_ring_size = MT7921_RX_MCU_RING_SIZE,
|
||||
.has_mcu_wa = true,
|
||||
};
|
||||
bool is_mt7902;
|
||||
int ret;
|
||||
|
||||
is_mt7902 = mt7921_l1_rr(dev, MT_HW_CHIPID) == 0x7902;
|
||||
|
||||
/*
|
||||
* MT7902 special case:
|
||||
* - MCU-WM TXQ uses index 15
|
||||
* - RX Ring0 is larger and shared for event/TX-done
|
||||
* - MT7902 does not use the MCU_WA ring
|
||||
*/
|
||||
if (is_mt7902) {
|
||||
layout.mcu_wm_txq = MT7902_TXQ_MCU_WM;
|
||||
layout.mcu_rxdone_ring_size = MT7902_RX_MCU_RING_SIZE;
|
||||
layout.has_mcu_wa = false;
|
||||
}
|
||||
|
||||
mt76_dma_attach(&dev->mt76);
|
||||
|
||||
ret = mt792x_dma_disable(dev, true);
|
||||
|
|
@ -185,7 +206,7 @@ static int mt7921_dma_init(struct mt792x_dev *dev)
|
|||
mt76_wr(dev, MT_WFDMA0_TX_RING0_EXT_CTRL, 0x4);
|
||||
|
||||
/* command to WM */
|
||||
ret = mt76_init_mcu_queue(&dev->mt76, MT_MCUQ_WM, MT7921_TXQ_MCU_WM,
|
||||
ret = mt76_init_mcu_queue(&dev->mt76, MT_MCUQ_WM, layout.mcu_wm_txq,
|
||||
MT7921_TX_MCU_RING_SIZE, MT_TX_RING_BASE);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
|
@ -199,18 +220,20 @@ static int mt7921_dma_init(struct mt792x_dev *dev)
|
|||
/* event from WM before firmware download */
|
||||
ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MCU],
|
||||
MT7921_RXQ_MCU_WM,
|
||||
MT7921_RX_MCU_RING_SIZE,
|
||||
layout.mcu_rxdone_ring_size,
|
||||
MT_RX_BUF_SIZE, MT_RX_EVENT_RING_BASE);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Change mcu queue after firmware download */
|
||||
ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MCU_WA],
|
||||
MT7921_RXQ_MCU_WM,
|
||||
MT7921_RX_MCU_WA_RING_SIZE,
|
||||
MT_RX_BUF_SIZE, MT_WFDMA0(0x540));
|
||||
if (ret)
|
||||
return ret;
|
||||
if (layout.has_mcu_wa) {
|
||||
/* Change mcu queue after firmware download */
|
||||
ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MCU_WA],
|
||||
MT7921_RXQ_MCU_WM,
|
||||
MT7921_RX_MCU_WA_RING_SIZE,
|
||||
MT_RX_BUF_SIZE, MT_WFDMA0(0x540));
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* rx data */
|
||||
ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MAIN],
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user