drivers/net/wireless/ath/ath10k/htt_rx.c

Source file repositories/reference/linux-study-clean/drivers/net/wireless/ath/ath10k/htt_rx.c

File Facts

System
Linux kernel
Corpus path
drivers/net/wireless/ath/ath10k/htt_rx.c
Extension
.c
Size
127000 bytes
Lines
4473
Domain
Driver Families
Bucket
drivers/net
Inferred role
Driver Families: exported/initcall integration point
Status
integration implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

struct amsdu_subframe_hdr {
	u8 dst[ETH_ALEN];
	u8 src[ETH_ALEN];
	__be16 len;
} __packed;

#define GROUP_ID_IS_SU_MIMO(x) ((x) == 0 || (x) == 63)

static inline u8 ath10k_bw_to_mac80211_bw(u8 bw)
{
	u8 ret = 0;

	switch (bw) {
	case 0:
		ret = RATE_INFO_BW_20;
		break;
	case 1:
		ret = RATE_INFO_BW_40;
		break;
	case 2:
		ret = RATE_INFO_BW_80;
		break;
	case 3:
		ret = RATE_INFO_BW_160;
		break;
	}

	return ret;
}

static void ath10k_htt_rx_h_rates(struct ath10k *ar,
				  struct ieee80211_rx_status *status,
				  struct htt_rx_desc *rxd)
{
	struct ath10k_hw_params *hw = &ar->hw_params;
	struct rx_attention *rxd_attention;
	struct rx_mpdu_start *rxd_mpdu_start;
	struct rx_mpdu_end *rxd_mpdu_end;
	struct rx_msdu_start_common *rxd_msdu_start_common;
	struct rx_msdu_end_common *rxd_msdu_end_common;
	struct rx_ppdu_start *rxd_ppdu_start;
	struct ieee80211_supported_band *sband;
	u8 cck, rate, bw, sgi, mcs, nss;
	u8 *rxd_msdu_payload;
	u8 preamble = 0;
	u8 group_id;
	u32 info1, info2, info3;
	u32 stbc, nsts_su;

	rxd_attention = ath10k_htt_rx_desc_get_attention(hw, rxd);
	rxd_mpdu_start = ath10k_htt_rx_desc_get_mpdu_start(hw, rxd);
	rxd_mpdu_end = ath10k_htt_rx_desc_get_mpdu_end(hw, rxd);
	rxd_msdu_start_common = ath10k_htt_rx_desc_get_msdu_start(hw, rxd);
	rxd_msdu_end_common = ath10k_htt_rx_desc_get_msdu_end(hw, rxd);
	rxd_ppdu_start = ath10k_htt_rx_desc_get_ppdu_start(hw, rxd);
	rxd_msdu_payload = ath10k_htt_rx_desc_get_msdu_payload(hw, rxd);

	info1 = __le32_to_cpu(rxd_ppdu_start->info1);
	info2 = __le32_to_cpu(rxd_ppdu_start->info2);
	info3 = __le32_to_cpu(rxd_ppdu_start->info3);

	preamble = MS(info1, RX_PPDU_START_INFO1_PREAMBLE_TYPE);

	switch (preamble) {
	case HTT_RX_LEGACY:
		/* To get legacy rate index band is required. Since band can't
		 * be undefined check if freq is non-zero.
		 */
		if (!status->freq)
			return;

		cck = info1 & RX_PPDU_START_INFO1_L_SIG_RATE_SELECT;
		rate = MS(info1, RX_PPDU_START_INFO1_L_SIG_RATE);
		rate &= ~RX_PPDU_START_RATE_FLAG;

		sband = &ar->mac.sbands[status->band];
		status->rate_idx = ath10k_mac_hw_rate_to_idx(sband, rate, cck);
		break;
	case HTT_RX_HT:
	case HTT_RX_HT_WITH_TXBF:
		/* HT-SIG - Table 20-11 in info2 and info3 */
		mcs = info2 & 0x1F;
		nss = mcs >> 3;
		bw = (info2 >> 7) & 1;
		sgi = (info3 >> 7) & 1;

		status->rate_idx = mcs;
		status->encoding = RX_ENC_HT;
		if (sgi)
			status->enc_flags |= RX_ENC_FLAG_SHORT_GI;

Annotation

Implementation Notes