1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2009-2012 Realtek Corporation.*/
3
4 #include "../wifi.h"
5 #include "../pci.h"
6 #include "../base.h"
7 #include "../stats.h"
8 #include "../rtl8192d/reg.h"
9 #include "../rtl8192d/def.h"
10 #include "../rtl8192d/phy_common.h"
11 #include "../rtl8192d/trx_common.h"
12 #include "phy.h"
13 #include "trx.h"
14 #include "led.h"
15
_rtl92de_map_hwqueue_to_fwqueue(struct sk_buff * skb,u8 hw_queue)16 static u8 _rtl92de_map_hwqueue_to_fwqueue(struct sk_buff *skb, u8 hw_queue)
17 {
18 __le16 fc = rtl_get_fc(skb);
19
20 if (unlikely(ieee80211_is_beacon(fc)))
21 return QSLT_BEACON;
22 if (ieee80211_is_mgmt(fc))
23 return QSLT_MGNT;
24
25 return skb->priority;
26 }
27
_rtl92de_insert_emcontent(struct rtl_tcb_desc * ptcb_desc,u8 * virtualaddress8)28 static void _rtl92de_insert_emcontent(struct rtl_tcb_desc *ptcb_desc,
29 u8 *virtualaddress8)
30 {
31 __le32 *virtualaddress = (__le32 *)virtualaddress8;
32
33 memset(virtualaddress, 0, 8);
34
35 set_earlymode_pktnum(virtualaddress, ptcb_desc->empkt_num);
36 set_earlymode_len0(virtualaddress, ptcb_desc->empkt_len[0]);
37 set_earlymode_len1(virtualaddress, ptcb_desc->empkt_len[1]);
38 set_earlymode_len2_1(virtualaddress, ptcb_desc->empkt_len[2] & 0xF);
39 set_earlymode_len2_2(virtualaddress, ptcb_desc->empkt_len[2] >> 4);
40 set_earlymode_len3(virtualaddress, ptcb_desc->empkt_len[3]);
41 set_earlymode_len4(virtualaddress, ptcb_desc->empkt_len[4]);
42 }
43
rtl92de_tx_fill_desc(struct ieee80211_hw * hw,struct ieee80211_hdr * hdr,u8 * pdesc8,u8 * pbd_desc_tx,struct ieee80211_tx_info * info,struct ieee80211_sta * sta,struct sk_buff * skb,u8 hw_queue,struct rtl_tcb_desc * ptcb_desc)44 void rtl92de_tx_fill_desc(struct ieee80211_hw *hw,
45 struct ieee80211_hdr *hdr, u8 *pdesc8,
46 u8 *pbd_desc_tx, struct ieee80211_tx_info *info,
47 struct ieee80211_sta *sta,
48 struct sk_buff *skb,
49 u8 hw_queue, struct rtl_tcb_desc *ptcb_desc)
50 {
51 struct rtl_priv *rtlpriv = rtl_priv(hw);
52 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
53 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
54 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
55 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
56 __le32 *pdesc = (__le32 *)pdesc8;
57 u16 seq_number;
58 __le16 fc = hdr->frame_control;
59 unsigned int buf_len = 0;
60 unsigned int skb_len = skb->len;
61 u8 fw_qsel = _rtl92de_map_hwqueue_to_fwqueue(skb, hw_queue);
62 bool firstseg = ((hdr->seq_ctrl &
63 cpu_to_le16(IEEE80211_SCTL_FRAG)) == 0);
64 bool lastseg = ((hdr->frame_control &
65 cpu_to_le16(IEEE80211_FCTL_MOREFRAGS)) == 0);
66 dma_addr_t mapping;
67 u8 bw_40 = 0;
68
69 if (mac->opmode == NL80211_IFTYPE_STATION) {
70 bw_40 = mac->bw_40;
71 } else if (mac->opmode == NL80211_IFTYPE_AP ||
72 mac->opmode == NL80211_IFTYPE_ADHOC) {
73 if (sta)
74 bw_40 = sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40;
75 }
76 seq_number = (le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_SEQ) >> 4;
77 rtl_get_tcb_desc(hw, info, sta, skb, ptcb_desc);
78 /* reserve 8 byte for AMPDU early mode */
79 if (rtlhal->earlymode_enable) {
80 skb_push(skb, EM_HDR_LEN);
81 memset(skb->data, 0, EM_HDR_LEN);
82 }
83 buf_len = skb->len;
84 mapping = dma_map_single(&rtlpci->pdev->dev, skb->data, skb->len,
85 DMA_TO_DEVICE);
86 if (dma_mapping_error(&rtlpci->pdev->dev, mapping)) {
87 rtl_dbg(rtlpriv, COMP_SEND, DBG_TRACE,
88 "DMA mapping error\n");
89 return;
90 }
91 clear_pci_tx_desc_content(pdesc, sizeof(struct tx_desc_92d));
92 if (ieee80211_is_nullfunc(fc) || ieee80211_is_ctl(fc)) {
93 firstseg = true;
94 lastseg = true;
95 }
96 if (firstseg) {
97 if (rtlhal->earlymode_enable) {
98 set_tx_desc_pkt_offset(pdesc, 1);
99 set_tx_desc_offset(pdesc, USB_HWDESC_HEADER_LEN +
100 EM_HDR_LEN);
101 if (ptcb_desc->empkt_num) {
102 rtl_dbg(rtlpriv, COMP_SEND, DBG_LOUD,
103 "Insert 8 byte.pTcb->EMPktNum:%d\n",
104 ptcb_desc->empkt_num);
105 _rtl92de_insert_emcontent(ptcb_desc,
106 (u8 *)(skb->data));
107 }
108 } else {
109 set_tx_desc_offset(pdesc, USB_HWDESC_HEADER_LEN);
110 }
111 /* 5G have no CCK rate */
112 if (rtlhal->current_bandtype == BAND_ON_5G)
113 if (ptcb_desc->hw_rate < DESC_RATE6M)
114 ptcb_desc->hw_rate = DESC_RATE6M;
115 set_tx_desc_tx_rate(pdesc, ptcb_desc->hw_rate);
116 if (ptcb_desc->use_shortgi || ptcb_desc->use_shortpreamble)
117 set_tx_desc_data_shortgi(pdesc, 1);
118
119 if (rtlhal->macphymode == DUALMAC_DUALPHY &&
120 ptcb_desc->hw_rate == DESC_RATEMCS7)
121 set_tx_desc_data_shortgi(pdesc, 1);
122
123 if (info->flags & IEEE80211_TX_CTL_AMPDU) {
124 set_tx_desc_agg_enable(pdesc, 1);
125 set_tx_desc_max_agg_num(pdesc, 0x14);
126 }
127 set_tx_desc_seq(pdesc, seq_number);
128 set_tx_desc_rts_enable(pdesc,
129 ((ptcb_desc->rts_enable &&
130 !ptcb_desc->cts_enable) ? 1 : 0));
131 set_tx_desc_hw_rts_enable(pdesc, ((ptcb_desc->rts_enable
132 || ptcb_desc->cts_enable) ? 1 : 0));
133 set_tx_desc_cts2self(pdesc, ((ptcb_desc->cts_enable) ? 1 : 0));
134 set_tx_desc_rts_stbc(pdesc, ((ptcb_desc->rts_stbc) ? 1 : 0));
135 /* 5G have no CCK rate */
136 if (rtlhal->current_bandtype == BAND_ON_5G)
137 if (ptcb_desc->rts_rate < DESC_RATE6M)
138 ptcb_desc->rts_rate = DESC_RATE6M;
139 set_tx_desc_rts_rate(pdesc, ptcb_desc->rts_rate);
140 set_tx_desc_rts_bw(pdesc, 0);
141 set_tx_desc_rts_sc(pdesc, ptcb_desc->rts_sc);
142 set_tx_desc_rts_short(pdesc, ((ptcb_desc->rts_rate <=
143 DESC_RATE54M) ?
144 (ptcb_desc->rts_use_shortpreamble ? 1 : 0) :
145 (ptcb_desc->rts_use_shortgi ? 1 : 0)));
146 if (bw_40) {
147 if (ptcb_desc->packet_bw) {
148 set_tx_desc_data_bw(pdesc, 1);
149 set_tx_desc_tx_sub_carrier(pdesc, 3);
150 } else {
151 set_tx_desc_data_bw(pdesc, 0);
152 set_tx_desc_tx_sub_carrier(pdesc,
153 mac->cur_40_prime_sc);
154 }
155 } else {
156 set_tx_desc_data_bw(pdesc, 0);
157 set_tx_desc_tx_sub_carrier(pdesc, 0);
158 }
159 set_tx_desc_linip(pdesc, 0);
160 set_tx_desc_pkt_size(pdesc, (u16)skb_len);
161 if (sta) {
162 u8 ampdu_density = sta->deflink.ht_cap.ampdu_density;
163 set_tx_desc_ampdu_density(pdesc, ampdu_density);
164 }
165 if (info->control.hw_key) {
166 struct ieee80211_key_conf *keyconf;
167
168 keyconf = info->control.hw_key;
169 switch (keyconf->cipher) {
170 case WLAN_CIPHER_SUITE_WEP40:
171 case WLAN_CIPHER_SUITE_WEP104:
172 case WLAN_CIPHER_SUITE_TKIP:
173 set_tx_desc_sec_type(pdesc, 0x1);
174 break;
175 case WLAN_CIPHER_SUITE_CCMP:
176 set_tx_desc_sec_type(pdesc, 0x3);
177 break;
178 default:
179 set_tx_desc_sec_type(pdesc, 0x0);
180 break;
181
182 }
183 }
184 set_tx_desc_pkt_id(pdesc, 0);
185 set_tx_desc_queue_sel(pdesc, fw_qsel);
186 set_tx_desc_data_rate_fb_limit(pdesc, 0x1F);
187 set_tx_desc_rts_rate_fb_limit(pdesc, 0xF);
188 set_tx_desc_disable_fb(pdesc, ptcb_desc->disable_ratefallback ?
189 1 : 0);
190 set_tx_desc_use_rate(pdesc, ptcb_desc->use_driver_rate ? 1 : 0);
191
192 /* Set TxRate and RTSRate in TxDesc */
193 /* This prevent Tx initial rate of new-coming packets */
194 /* from being overwritten by retried packet rate.*/
195 if (!ptcb_desc->use_driver_rate) {
196 set_tx_desc_rts_rate(pdesc, 0x08);
197 /* set_tx_desc_tx_rate(pdesc, 0x0b); */
198 }
199 if (ieee80211_is_data_qos(fc)) {
200 if (mac->rdg_en) {
201 rtl_dbg(rtlpriv, COMP_SEND, DBG_TRACE,
202 "Enable RDG function\n");
203 set_tx_desc_rdg_enable(pdesc, 1);
204 set_tx_desc_htc(pdesc, 1);
205 }
206 }
207 }
208
209 set_tx_desc_first_seg(pdesc, (firstseg ? 1 : 0));
210 set_tx_desc_last_seg(pdesc, (lastseg ? 1 : 0));
211 set_tx_desc_tx_buffer_size(pdesc, (u16)buf_len);
212 set_tx_desc_tx_buffer_address(pdesc, mapping);
213 if (rtlpriv->dm.useramask) {
214 set_tx_desc_rate_id(pdesc, ptcb_desc->ratr_index);
215 set_tx_desc_macid(pdesc, ptcb_desc->mac_id);
216 } else {
217 set_tx_desc_rate_id(pdesc, 0xC + ptcb_desc->ratr_index);
218 set_tx_desc_macid(pdesc, ptcb_desc->ratr_index);
219 }
220 if (ieee80211_is_data_qos(fc))
221 set_tx_desc_qos(pdesc, 1);
222
223 if ((!ieee80211_is_data_qos(fc)) && ppsc->fwctrl_lps) {
224 set_tx_desc_hwseq_en(pdesc, 1);
225 set_tx_desc_pkt_id(pdesc, 8);
226 }
227 set_tx_desc_more_frag(pdesc, (lastseg ? 0 : 1));
228 rtl_dbg(rtlpriv, COMP_SEND, DBG_TRACE, "\n");
229 }
230
rtl92de_tx_fill_cmddesc(struct ieee80211_hw * hw,u8 * pdesc8,struct sk_buff * skb)231 void rtl92de_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc8,
232 struct sk_buff *skb)
233 {
234 struct rtl_priv *rtlpriv = rtl_priv(hw);
235 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
236 struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv);
237 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
238 u8 fw_queue = QSLT_BEACON;
239
240 struct ieee80211_hdr *hdr = rtl_get_hdr(skb);
241 __le16 fc = hdr->frame_control;
242 __le32 *pdesc = (__le32 *)pdesc8;
243
244 dma_addr_t mapping = dma_map_single(&rtlpci->pdev->dev, skb->data,
245 skb->len, DMA_TO_DEVICE);
246
247 if (dma_mapping_error(&rtlpci->pdev->dev, mapping)) {
248 rtl_dbg(rtlpriv, COMP_SEND, DBG_TRACE,
249 "DMA mapping error\n");
250 return;
251 }
252 clear_pci_tx_desc_content(pdesc, TX_DESC_SIZE);
253 set_tx_desc_offset(pdesc, USB_HWDESC_HEADER_LEN);
254 /* 5G have no CCK rate
255 * Caution: The macros below are multi-line expansions.
256 * The braces are needed no matter what checkpatch says
257 */
258 if (rtlhal->current_bandtype == BAND_ON_5G) {
259 set_tx_desc_tx_rate(pdesc, DESC_RATE6M);
260 } else {
261 set_tx_desc_tx_rate(pdesc, DESC_RATE1M);
262 }
263 set_tx_desc_seq(pdesc, 0);
264 set_tx_desc_linip(pdesc, 0);
265 set_tx_desc_queue_sel(pdesc, fw_queue);
266 set_tx_desc_first_seg(pdesc, 1);
267 set_tx_desc_last_seg(pdesc, 1);
268 set_tx_desc_tx_buffer_size(pdesc, (u16)skb->len);
269 set_tx_desc_tx_buffer_address(pdesc, mapping);
270 set_tx_desc_rate_id(pdesc, 7);
271 set_tx_desc_macid(pdesc, 0);
272 set_tx_desc_pkt_size(pdesc, (u16)(skb->len));
273 set_tx_desc_first_seg(pdesc, 1);
274 set_tx_desc_last_seg(pdesc, 1);
275 set_tx_desc_offset(pdesc, 0x20);
276 set_tx_desc_use_rate(pdesc, 1);
277
278 if (!ieee80211_is_data_qos(fc) && ppsc->fwctrl_lps) {
279 set_tx_desc_hwseq_en(pdesc, 1);
280 set_tx_desc_pkt_id(pdesc, 8);
281 }
282
283 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
284 "H2C Tx Cmd Content", pdesc, TX_DESC_SIZE);
285 wmb();
286 set_tx_desc_own(pdesc, 1);
287 }
288
rtl92de_is_tx_desc_closed(struct ieee80211_hw * hw,u8 hw_queue,u16 index)289 bool rtl92de_is_tx_desc_closed(struct ieee80211_hw *hw,
290 u8 hw_queue, u16 index)
291 {
292 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
293 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[hw_queue];
294 u8 *entry = (u8 *)(&ring->desc[ring->idx]);
295 u8 own = (u8)rtl92d_get_desc(hw, entry, true, HW_DESC_OWN);
296
297 /* a beacon packet will only use the first
298 * descriptor by defaut, and the own bit may not
299 * be cleared by the hardware
300 */
301 if (own)
302 return false;
303 return true;
304 }
305
rtl92de_tx_polling(struct ieee80211_hw * hw,u8 hw_queue)306 void rtl92de_tx_polling(struct ieee80211_hw *hw, u8 hw_queue)
307 {
308 struct rtl_priv *rtlpriv = rtl_priv(hw);
309 if (hw_queue == BEACON_QUEUE)
310 rtl_write_word(rtlpriv, REG_PCIE_CTRL_REG, BIT(4));
311 else
312 rtl_write_word(rtlpriv, REG_PCIE_CTRL_REG,
313 BIT(0) << (hw_queue));
314 }
315