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

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

File Facts

System
Linux kernel
Corpus path
drivers/net/wireless/ath/ath12k/wifi7/dp_tx.c
Extension
.c
Size
30358 bytes
Lines
1008
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

is_multicast_ether_addr(hdr->addr3) && arsta) {
		ti.meta_data_flags = arsta->tcl_metadata;
		ti.flags0 |= u32_encode_bits(1, HAL_TCL_DATA_CMD_INFO2_TO_FW);
	}

	if (dp_vif->tx_encap_type == HAL_TCL_ENCAP_TYPE_RAW &&
	    test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ab->dev_flags)) {
		if (skb_cb->flags & ATH12K_SKB_CIPHER_SET) {
			ti.encrypt_type =
				ath12k_dp_tx_get_encrypt_type(skb_cb->cipher);

			if (ieee80211_has_protected(hdr->frame_control))
				skb_put(skb, IEEE80211_CCMP_MIC_LEN);
		} else {
			ti.encrypt_type = HAL_ENCRYPT_TYPE_OPEN;
		}

		msdu_ext_desc = true;
	}

	if (gsn_valid && !ti.lookup_override) {
		/* Reset and Initialize meta_data_flags with Global Sequence
		 * Number (GSN) info.
		 */
		ti.meta_data_flags =
			u32_encode_bits(HTT_TCL_META_DATA_TYPE_GLOBAL_SEQ_NUM,
					HTT_TCL_META_DATA_TYPE) |
			u32_encode_bits(mcbc_gsn, HTT_TCL_META_DATA_GLOBAL_SEQ_NUM);

		/*
		 * Since NAWDS enabled for this vdev firmware expects
		 * this flag to be set for sending 3-address multicast frame.
		 */
		ti.meta_data_flags |=
			u32_encode_bits(arvif->nawds_enabled,
					HTT_TCL_META_DATA_GLOBAL_SEQ_HOST_INSPECTED);
	}

	ti.encap_type = ath12k_dp_tx_get_encap_type(ab, skb);
	ti.addr_search_flags = dp_link_vif->hal_addr_search_flags;
	ti.search_type = dp_link_vif->search_type;
	ti.type = HAL_TCL_DESC_TYPE_BUFFER;
	ti.pkt_offset = 0;
	ti.lmac_id = dp_link_vif->lmac_id;

	ti.vdev_id = dp_link_vif->vdev_id;

	if (gsn_valid && !ti.lookup_override)
		ti.vdev_id += HTT_TX_MLO_MCAST_HOST_REINJECT_BASE_VDEV_ID;
	else if (arvif->nawds_enabled && is_mcast && !ti.lookup_override)
		ti.meta_data_flags |=
			u32_encode_bits(1, HTT_TCL_META_DATA_HOST_INSPECTED_MISSION);

	ti.dscp_tid_tbl_idx = 0;

	if (skb->ip_summed == CHECKSUM_PARTIAL &&
	    ti.encap_type != HAL_TCL_ENCAP_TYPE_RAW) {
		ti.flags0 |= u32_encode_bits(1, HAL_TCL_DATA_CMD_INFO2_IP4_CKSUM_EN) |
			     u32_encode_bits(1, HAL_TCL_DATA_CMD_INFO2_UDP4_CKSUM_EN) |
			     u32_encode_bits(1, HAL_TCL_DATA_CMD_INFO2_UDP6_CKSUM_EN) |
			     u32_encode_bits(1, HAL_TCL_DATA_CMD_INFO2_TCP4_CKSUM_EN) |
			     u32_encode_bits(1, HAL_TCL_DATA_CMD_INFO2_TCP6_CKSUM_EN);
	}

	ti.flags1 |= u32_encode_bits(1, HAL_TCL_DATA_CMD_INFO3_TID_OVERWRITE);

	ti.tid = ath12k_dp_tx_get_tid(skb);

	switch (ti.encap_type) {
	case HAL_TCL_ENCAP_TYPE_NATIVE_WIFI:
		is_null_frame = ieee80211_is_nullfunc(hdr->frame_control);
		if (ahvif->vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED) {
			if (skb->protocol == cpu_to_be16(ETH_P_PAE) || is_null_frame)
				is_diff_encap = true;

			/* Firmware expects msdu ext descriptor for nwifi/raw packets
			 * received in ETH mode. Without this, observed tx fail for
			 * Multicast packets in ETH mode.
			 */
			msdu_ext_desc = true;
		} else {
			ath12k_dp_tx_encap_nwifi(skb);
		}
		break;
	case HAL_TCL_ENCAP_TYPE_RAW:
		if (!test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags)) {
			ret = -EINVAL;
			goto fail_remove_tx_buf;
		}
		break;

Annotation

Implementation Notes