File Index
Files and directories
Sign in
FILE

trx.c

File preview with syntax highlighting.

linux-6.19.14/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.c C
  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
 16static 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
 28static 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
 44void 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
231void 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
289bool 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
306void 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}
~/ Read-only file preview.