#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
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,
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);
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;
/* 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],