drivers/net/wireless/ath/ath12k/wifi7/dp_rx.c

Source file repositories/reference/linux-study-clean/drivers/net/wireless/ath/ath12k/wifi7/dp_rx.c

File Facts

System
Linux kernel
Corpus path
drivers/net/wireless/ath/ath12k/wifi7/dp_rx.c
Extension
.c
Size
66674 bytes
Lines
2318
Domain
Driver Families
Bucket
drivers/net
Inferred role
Driver Families: implementation source
Status
source 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

if (ret) {
			kfree(vaddr);
			return ret;
		}

		buf->vaddr = vaddr;
		buf->paddr_aligned = paddr_aligned;
		buf->size = hw_desc_sz;
	}

	rx_tid->qbuf = *buf;

	return 0;
}

int ath12k_wifi7_dp_rx_tid_delete_handler(struct ath12k_base *ab,
					  struct ath12k_dp_rx_tid_rxq *rx_tid)
{
	struct ath12k_hal_reo_cmd cmd = {};

	cmd.flag = HAL_REO_CMD_FLG_NEED_STATUS;
	cmd.addr_lo = lower_32_bits(rx_tid->qbuf.paddr_aligned);
	cmd.addr_hi = upper_32_bits(rx_tid->qbuf.paddr_aligned);
	cmd.upd0 |= HAL_REO_CMD_UPD0_VLD;
	/* Observed flush cache failure, to avoid that set vld bit during delete */
	cmd.upd1 |= HAL_REO_CMD_UPD1_VLD;

	return ath12k_wifi7_dp_reo_cmd_send(ab, rx_tid,
					    HAL_REO_CMD_UPDATE_RX_QUEUE, &cmd,
					    ath12k_dp_rx_tid_del_func);
}

static void ath12k_wifi7_dp_rx_h_csum_offload(struct sk_buff *msdu,
					      struct hal_rx_desc_data *rx_info)
{
	msdu->ip_summed = (rx_info->ip_csum_fail || rx_info->l4_csum_fail) ?
			   CHECKSUM_NONE : CHECKSUM_UNNECESSARY;
}

static int ath12k_wifi7_dp_rx_h_mpdu(struct ath12k_pdev_dp *dp_pdev,
				     struct sk_buff *msdu,
				     struct hal_rx_desc_data *rx_info)
{
	struct ath12k_skb_rxcb *rxcb;
	enum hal_encrypt_type enctype;
	bool is_decrypted = false;
	struct ieee80211_hdr *hdr;
	struct ath12k_dp_peer *peer;
	struct ieee80211_rx_status *rx_status = rx_info->rx_status;
	u32 err_bitmap = rx_info->err_bitmap;

	RCU_LOCKDEP_WARN(!rcu_read_lock_held(),
			 "dp_rx_h_mpdu called without rcu lock");

	/* PN for multicast packets will be checked in mac80211 */
	rxcb = ATH12K_SKB_RXCB(msdu);
	rxcb->is_mcbc = rx_info->is_mcbc;

	if (rxcb->is_mcbc)
		rxcb->peer_id = rx_info->peer_id;

	peer = ath12k_dp_peer_find_by_peerid(dp_pdev, rxcb->peer_id);
	if (peer) {
		/*
		 * Drop the 3-address multicast packet from 4-address
		 * peer To avoid receiving the duplicate multicast packet
		 * Specifically from AP interface in 3-address format
		 */
		if (rxcb->is_mcbc &&
		    rx_info->decap_type == DP_RX_DECAP_TYPE_ETHERNET2_DIX) {
			if (peer->use_4addr &&
			    !(rx_info->is_from_ds && rx_info->is_to_ds))
				return -EINVAL;
		}

		/* resetting mcbc bit because mcbc packets are unicast
		 * packets only for AP as STA sends unicast packets.
		 */
		rxcb->is_mcbc = rxcb->is_mcbc && !peer->ucast_ra_only;

		if (rxcb->is_mcbc)
			enctype = peer->sec_type_grp;
		else
			enctype = peer->sec_type;
	} else {
		enctype = HAL_ENCRYPT_TYPE_OPEN;
	}

	if (enctype != HAL_ENCRYPT_TYPE_OPEN && !err_bitmap)
		is_decrypted = rx_info->is_decrypted;

Annotation

Implementation Notes