drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
Source file repositories/reference/linux-study-clean/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c- Extension
.c- Size
- 83539 bytes
- Lines
- 2624
- 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.
- 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.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/etherdevice.hlinux/skbuff.hiwl-trans.hmvm.hfw-api.htime-sync.h
Detected Declarations
struct iwl_mvm_rx_phy_datastruct iwl_rx_sta_csafunction Copyrightfunction iwl_mvm_create_skbfunction iwl_mvm_radiotap_put_tlvfunction iwl_mvm_add_rtap_sniffer_configfunction iwl_mvm_pass_packet_to_mac80211function iwl_mvm_used_average_energyfunction iwl_mvm_get_signal_strengthfunction iwl_mvm_rx_mgmt_protfunction iwl_mvm_rx_cryptofunction iwl_mvm_rx_csumfunction iwl_mvm_is_dupfunction iwl_mvm_release_framesfunction iwl_mvm_del_bafunction iwl_mvm_release_frames_from_notiffunction iwl_mvm_rx_queue_notiffunction iwl_mvm_reorderfunction iwl_mvm_agg_rx_receivedfunction iwl_mvm_flip_addressfunction iwl_mvm_decode_he_mu_extfunction iwl_mvm_decode_he_phy_ru_allocfunction iwl_mvm_decode_he_phy_datafunction LE32_DEC_ENCfunction iwl_mvm_decode_eht_ext_tbfunction iwl_mvm_decode_eht_rufunction iwl_mvm_decode_eht_phy_datafunction iwl_mvm_rx_ehtfunction iwl_mvm_rx_hefunction iwl_mvm_decode_lsigfunction iwl_mvm_rx_get_sta_block_txfunction phy_datafunction iwl_mvm_rx_mpdu_mqfunction errorsfunction stationsfunction iwl_mvm_rx_monitor_no_datafunction iwl_mvm_rx_frame_releasefunction iwl_mvm_rx_bar_frame_releasefunction iwl_mvm_rx_beacon_filter_notif
Annotated Snippet
struct iwl_mvm_rx_phy_data {
enum iwl_rx_phy_info_type info_type;
__le32 d0, d1, d2, d3, eht_d4, d5;
__le16 d4;
bool with_data;
bool first_subframe;
__le32 rx_vec[4];
u32 rate_n_flags;
u32 gp2_on_air_rise;
u16 phy_info;
u8 energy_a, energy_b;
u8 channel;
};
static void iwl_mvm_decode_he_mu_ext(struct iwl_mvm *mvm,
struct iwl_mvm_rx_phy_data *phy_data,
struct ieee80211_radiotap_he_mu *he_mu)
{
u32 phy_data2 = le32_to_cpu(phy_data->d2);
u32 phy_data3 = le32_to_cpu(phy_data->d3);
u16 phy_data4 = le16_to_cpu(phy_data->d4);
u32 rate_n_flags = phy_data->rate_n_flags;
if (FIELD_GET(IWL_RX_PHY_DATA4_HE_MU_EXT_CH1_CRC_OK, phy_data4)) {
he_mu->flags1 |=
cpu_to_le16(IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH1_RU_KNOWN |
IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH1_CTR_26T_RU_KNOWN);
he_mu->flags1 |=
le16_encode_bits(FIELD_GET(IWL_RX_PHY_DATA4_HE_MU_EXT_CH1_CTR_RU,
phy_data4),
IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH1_CTR_26T_RU);
he_mu->ru_ch1[0] = FIELD_GET(IWL_RX_PHY_DATA2_HE_MU_EXT_CH1_RU0,
phy_data2);
he_mu->ru_ch1[1] = FIELD_GET(IWL_RX_PHY_DATA3_HE_MU_EXT_CH1_RU1,
phy_data3);
he_mu->ru_ch1[2] = FIELD_GET(IWL_RX_PHY_DATA2_HE_MU_EXT_CH1_RU2,
phy_data2);
he_mu->ru_ch1[3] = FIELD_GET(IWL_RX_PHY_DATA3_HE_MU_EXT_CH1_RU3,
phy_data3);
}
if (FIELD_GET(IWL_RX_PHY_DATA4_HE_MU_EXT_CH2_CRC_OK, phy_data4) &&
(rate_n_flags & RATE_MCS_CHAN_WIDTH_MSK_V1) != RATE_MCS_CHAN_WIDTH_20) {
he_mu->flags1 |=
cpu_to_le16(IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH2_RU_KNOWN |
IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH2_CTR_26T_RU_KNOWN);
he_mu->flags2 |=
le16_encode_bits(FIELD_GET(IWL_RX_PHY_DATA4_HE_MU_EXT_CH2_CTR_RU,
phy_data4),
IEEE80211_RADIOTAP_HE_MU_FLAGS2_CH2_CTR_26T_RU);
he_mu->ru_ch2[0] = FIELD_GET(IWL_RX_PHY_DATA2_HE_MU_EXT_CH2_RU0,
phy_data2);
he_mu->ru_ch2[1] = FIELD_GET(IWL_RX_PHY_DATA3_HE_MU_EXT_CH2_RU1,
phy_data3);
he_mu->ru_ch2[2] = FIELD_GET(IWL_RX_PHY_DATA2_HE_MU_EXT_CH2_RU2,
phy_data2);
he_mu->ru_ch2[3] = FIELD_GET(IWL_RX_PHY_DATA3_HE_MU_EXT_CH2_RU3,
phy_data3);
}
}
static void
iwl_mvm_decode_he_phy_ru_alloc(struct iwl_mvm_rx_phy_data *phy_data,
struct ieee80211_radiotap_he *he,
struct ieee80211_radiotap_he_mu *he_mu,
struct ieee80211_rx_status *rx_status)
{
/*
* Unfortunately, we have to leave the mac80211 data
* incorrect for the case that we receive an HE-MU
* transmission and *don't* have the HE phy data (due
* to the bits being used for TSF). This shouldn't
* happen though as management frames where we need
* the TSF/timers are not be transmitted in HE-MU.
*/
u8 ru = le32_get_bits(phy_data->d1, IWL_RX_PHY_DATA1_HE_RU_ALLOC_MASK);
u32 rate_n_flags = phy_data->rate_n_flags;
u32 he_type = rate_n_flags & RATE_MCS_HE_TYPE_MSK;
u8 offs = 0;
rx_status->bw = RATE_INFO_BW_HE_RU;
he->data1 |= cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_BW_RU_ALLOC_KNOWN);
switch (ru) {
Annotation
- Immediate include surface: `linux/etherdevice.h`, `linux/skbuff.h`, `iwl-trans.h`, `mvm.h`, `fw-api.h`, `time-sync.h`.
- Detected declarations: `struct iwl_mvm_rx_phy_data`, `struct iwl_rx_sta_csa`, `function Copyright`, `function iwl_mvm_create_skb`, `function iwl_mvm_radiotap_put_tlv`, `function iwl_mvm_add_rtap_sniffer_config`, `function iwl_mvm_pass_packet_to_mac80211`, `function iwl_mvm_used_average_energy`, `function iwl_mvm_get_signal_strength`, `function iwl_mvm_rx_mgmt_prot`.
- Atlas domain: Driver Families / drivers/net.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.