1 /* SPDX-License-Identifier: ISC */
8 mt7603_init_tx_queue(struct mt7603_dev
*dev
, struct mt76_sw_queue
*q
,
11 struct mt76_queue
*hwq
;
14 hwq
= devm_kzalloc(dev
->mt76
.dev
, sizeof(*hwq
), GFP_KERNEL
);
18 err
= mt76_queue_alloc(dev
, hwq
, idx
, n_desc
, 0, MT_TX_RING_BASE
);
22 INIT_LIST_HEAD(&q
->swq
);
25 mt7603_irq_enable(dev
, MT_INT_TX_DONE(idx
));
31 mt7603_rx_loopback_skb(struct mt7603_dev
*dev
, struct sk_buff
*skb
)
33 __le32
*txd
= (__le32
*)skb
->data
;
34 struct ieee80211_hdr
*hdr
;
35 struct ieee80211_sta
*sta
;
36 struct mt7603_sta
*msta
;
37 struct mt76_wcid
*wcid
;
43 if (skb
->len
< MT_TXD_SIZE
+ sizeof(struct ieee80211_hdr
))
46 val
= le32_to_cpu(txd
[1]);
47 idx
= FIELD_GET(MT_TXD1_WLAN_IDX
, val
);
48 skb
->priority
= FIELD_GET(MT_TXD1_TID
, val
);
50 if (idx
>= MT7603_WTBL_STA
- 1)
53 wcid
= rcu_dereference(dev
->mt76
.wcid
[idx
]);
57 priv
= msta
= container_of(wcid
, struct mt7603_sta
, wcid
);
58 val
= le32_to_cpu(txd
[0]);
59 skb_set_queue_mapping(skb
, FIELD_GET(MT_TXD0_Q_IDX
, val
));
61 val
&= ~(MT_TXD0_P_IDX
| MT_TXD0_Q_IDX
);
62 val
|= FIELD_PREP(MT_TXD0_Q_IDX
, MT_TX_HW_QUEUE_MGMT
);
63 txd
[0] = cpu_to_le32(val
);
65 sta
= container_of(priv
, struct ieee80211_sta
, drv_priv
);
66 hdr
= (struct ieee80211_hdr
*) &skb
->data
[MT_TXD_SIZE
];
67 tid
= *ieee80211_get_qos_ctl(hdr
) & IEEE80211_QOS_CTL_TID_MASK
;
68 ieee80211_sta_set_buffered(sta
, tid
, true);
70 spin_lock_bh(&dev
->ps_lock
);
71 __skb_queue_tail(&msta
->psq
, skb
);
72 if (skb_queue_len(&msta
->psq
) >= 64) {
73 skb
= __skb_dequeue(&msta
->psq
);
76 spin_unlock_bh(&dev
->ps_lock
);
83 void mt7603_queue_rx_skb(struct mt76_dev
*mdev
, enum mt76_rxq_id q
,
86 struct mt7603_dev
*dev
= container_of(mdev
, struct mt7603_dev
, mt76
);
87 __le32
*rxd
= (__le32
*)skb
->data
;
88 __le32
*end
= (__le32
*)&skb
->data
[skb
->len
];
89 enum rx_pkt_type type
;
91 type
= FIELD_GET(MT_RXD0_PKT_TYPE
, le32_to_cpu(rxd
[0]));
93 if (q
== MT_RXQ_MCU
) {
94 if (type
== PKT_TYPE_RX_EVENT
)
95 mt76_mcu_rx_event(&dev
->mt76
, skb
);
97 mt7603_rx_loopback_skb(dev
, skb
);
103 for (rxd
++; rxd
+ 5 <= end
; rxd
+= 5)
104 mt7603_mac_add_txs(dev
, rxd
);
107 case PKT_TYPE_RX_EVENT
:
108 mt76_mcu_rx_event(&dev
->mt76
, skb
);
110 case PKT_TYPE_NORMAL
:
111 if (mt7603_mac_fill_rx(dev
, skb
) == 0) {
112 mt76_rx(&dev
->mt76
, q
, skb
);
123 mt7603_init_rx_queue(struct mt7603_dev
*dev
, struct mt76_queue
*q
,
124 int idx
, int n_desc
, int bufsize
)
128 err
= mt76_queue_alloc(dev
, q
, idx
, n_desc
, bufsize
,
133 mt7603_irq_enable(dev
, MT_INT_RX_DONE(idx
));
139 mt7603_tx_tasklet(unsigned long data
)
141 struct mt7603_dev
*dev
= (struct mt7603_dev
*)data
;
144 dev
->tx_dma_check
= 0;
145 for (i
= MT_TXQ_MCU
; i
>= 0; i
--)
146 mt76_queue_tx_cleanup(dev
, i
, false);
148 mt76_txq_schedule_all(&dev
->mt76
);
150 mt7603_irq_enable(dev
, MT_INT_TX_DONE_ALL
);
153 int mt7603_dma_init(struct mt7603_dev
*dev
)
155 static const u8 wmm_queue_map
[] = {
156 [IEEE80211_AC_BK
] = 0,
157 [IEEE80211_AC_BE
] = 1,
158 [IEEE80211_AC_VI
] = 2,
159 [IEEE80211_AC_VO
] = 3,
164 mt76_dma_attach(&dev
->mt76
);
166 init_waitqueue_head(&dev
->mt76
.mmio
.mcu
.wait
);
167 skb_queue_head_init(&dev
->mt76
.mmio
.mcu
.res_q
);
169 tasklet_init(&dev
->mt76
.tx_tasklet
, mt7603_tx_tasklet
, (unsigned long)dev
);
171 mt76_clear(dev
, MT_WPDMA_GLO_CFG
,
172 MT_WPDMA_GLO_CFG_TX_DMA_EN
|
173 MT_WPDMA_GLO_CFG_RX_DMA_EN
|
174 MT_WPDMA_GLO_CFG_DMA_BURST_SIZE
|
175 MT_WPDMA_GLO_CFG_TX_WRITEBACK_DONE
);
177 mt76_wr(dev
, MT_WPDMA_RST_IDX
, ~0);
178 mt7603_pse_client_reset(dev
);
180 for (i
= 0; i
< ARRAY_SIZE(wmm_queue_map
); i
++) {
181 ret
= mt7603_init_tx_queue(dev
, &dev
->mt76
.q_tx
[i
],
188 ret
= mt7603_init_tx_queue(dev
, &dev
->mt76
.q_tx
[MT_TXQ_PSD
],
189 MT_TX_HW_QUEUE_MGMT
, MT_TX_RING_SIZE
);
193 ret
= mt7603_init_tx_queue(dev
, &dev
->mt76
.q_tx
[MT_TXQ_MCU
],
194 MT_TX_HW_QUEUE_MCU
, MT_MCU_RING_SIZE
);
198 ret
= mt7603_init_tx_queue(dev
, &dev
->mt76
.q_tx
[MT_TXQ_BEACON
],
199 MT_TX_HW_QUEUE_BCN
, MT_MCU_RING_SIZE
);
203 ret
= mt7603_init_tx_queue(dev
, &dev
->mt76
.q_tx
[MT_TXQ_CAB
],
204 MT_TX_HW_QUEUE_BMC
, MT_MCU_RING_SIZE
);
208 ret
= mt7603_init_rx_queue(dev
, &dev
->mt76
.q_rx
[MT_RXQ_MCU
], 1,
209 MT_MCU_RING_SIZE
, MT_RX_BUF_SIZE
);
213 ret
= mt7603_init_rx_queue(dev
, &dev
->mt76
.q_rx
[MT_RXQ_MAIN
], 0,
214 MT7603_RX_RING_SIZE
, MT_RX_BUF_SIZE
);
218 mt76_wr(dev
, MT_DELAY_INT_CFG
, 0);
219 return mt76_init_queues(dev
);
222 void mt7603_dma_cleanup(struct mt7603_dev
*dev
)
224 mt76_clear(dev
, MT_WPDMA_GLO_CFG
,
225 MT_WPDMA_GLO_CFG_TX_DMA_EN
|
226 MT_WPDMA_GLO_CFG_RX_DMA_EN
|
227 MT_WPDMA_GLO_CFG_TX_WRITEBACK_DONE
);
229 tasklet_kill(&dev
->mt76
.tx_tasklet
);
230 mt76_dma_cleanup(&dev
->mt76
);