drivers/net/wireless/marvell/mwifiex/wmm.c
Source file repositories/reference/linux-study-clean/drivers/net/wireless/marvell/mwifiex/wmm.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/wireless/marvell/mwifiex/wmm.c- Extension
.c- Size
- 41323 bytes
- Lines
- 1533
- 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.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
decl.hioctl.hutil.hfw.hmain.hwmm.h11n.h
Detected Declarations
function mwifiex_wmm_ac_debug_printfunction mwifiex_wmm_allocate_ralist_nodefunction mwifiex_get_random_ba_thresholdfunction mwifiex_ralist_addfunction mwifiex_wmm_default_queue_prioritiesfunction mwifiex_wmm_queue_priorities_tidfunction mwifiex_wmm_setup_queue_prioritiesfunction mwifiex_wmm_eval_downgrade_acfunction mwifiex_wmm_setup_ac_downgradefunction mwifiex_wmm_convert_tos_to_acfunction disabledfunction mwifiex_wmm_initfunction mwifiex_bypass_txlist_emptyfunction mwifiex_wmm_lists_emptyfunction mwifiex_wmm_del_pkts_in_ralist_nodefunction skb_queue_walk_safefunction mwifiex_wmm_del_pkts_in_ralistfunction mwifiex_wmm_cleanup_queuesfunction mwifiex_wmm_delete_all_ralistfunction list_for_each_entry_safefunction mwifiex_free_ack_framefunction mwifiex_clean_txrxfunction skb_queue_walk_safefunction skb_queue_walk_safefunction mwifiex_wmm_get_ralist_nodefunction list_for_each_entryfunction mwifiex_update_ralist_tx_pausefunction mwifiex_update_ralist_tx_pause_in_tdls_csfunction list_for_each_entryfunction mwifiex_wmm_get_queue_raptrfunction mwifiex_wmm_del_peer_ra_listfunction mwifiex_is_ralist_validfunction list_for_each_entryfunction mwifiex_wmm_add_buf_bypass_txqueuefunction mwifiex_wmm_add_buf_txqueuefunction mwifiex_ret_wmm_get_statusfunction mwifiex_wmm_process_association_reqfunction mwifiex_wmm_compute_drv_pkt_delayfunction mwifiex_wmm_get_highest_priolist_ptrfunction list_for_each_entryfunction list_for_each_entryfunction mwifiex_rotate_priolistsfunction mwifiex_is_11n_aggragation_possiblefunction skb_queue_walk_safefunction mwifiex_send_single_packetfunction mwifiex_is_ptr_processedfunction mwifiex_send_processed_packetfunction mwifiex_dequeue_tx_packet
Annotated Snippet
if (!mwifiex_queuing_ra_based(priv)) {
if (mwifiex_is_tdls_link_setup
(mwifiex_get_tdls_link_status(priv, ra))) {
ra_list->tdls_link = true;
ra_list->is_11n_enabled =
mwifiex_tdls_peer_11n_enabled(priv, ra);
} else {
ra_list->is_11n_enabled = IS_11N_ENABLED(priv);
}
} else {
spin_lock_bh(&priv->sta_list_spinlock);
node = mwifiex_get_sta_entry(priv, ra);
if (node)
ra_list->tx_paused = node->tx_pause;
ra_list->is_11n_enabled =
mwifiex_is_sta_11n_enabled(priv, node);
if (ra_list->is_11n_enabled)
ra_list->max_amsdu = node->max_amsdu;
spin_unlock_bh(&priv->sta_list_spinlock);
}
mwifiex_dbg(adapter, DATA, "data: ralist %p: is_11n_enabled=%d\n",
ra_list, ra_list->is_11n_enabled);
if (ra_list->is_11n_enabled) {
ra_list->ba_pkt_count = 0;
ra_list->ba_packet_thr =
mwifiex_get_random_ba_threshold();
}
list_add_tail(&ra_list->list,
&priv->wmm.tid_tbl_ptr[i].ra_list);
}
}
/*
* This function sets the WMM queue priorities to their default values.
*/
static void mwifiex_wmm_default_queue_priorities(struct mwifiex_private *priv)
{
/* Default queue priorities: VO->VI->BE->BK */
priv->wmm.queue_priority[0] = WMM_AC_VO;
priv->wmm.queue_priority[1] = WMM_AC_VI;
priv->wmm.queue_priority[2] = WMM_AC_BE;
priv->wmm.queue_priority[3] = WMM_AC_BK;
}
/*
* This function map ACs to TIDs.
*/
static void
mwifiex_wmm_queue_priorities_tid(struct mwifiex_private *priv)
{
struct mwifiex_wmm_desc *wmm = &priv->wmm;
u8 *queue_priority = wmm->queue_priority;
int i;
for (i = 0; i < 4; ++i) {
tos_to_tid[7 - (i * 2)] = ac_to_tid[queue_priority[i]][1];
tos_to_tid[6 - (i * 2)] = ac_to_tid[queue_priority[i]][0];
}
for (i = 0; i < MAX_NUM_TID; ++i)
priv->tos_to_tid_inv[tos_to_tid[i]] = (u8)i;
atomic_set(&wmm->highest_queued_prio, HIGH_PRIO_TID);
}
/*
* This function initializes WMM priority queues.
*/
void
mwifiex_wmm_setup_queue_priorities(struct mwifiex_private *priv,
struct ieee_types_wmm_parameter *wmm_ie)
{
u16 cw_min, avg_back_off, tmp[4];
u32 i, j, num_ac;
u8 ac_idx;
if (!wmm_ie || !priv->wmm_enabled) {
/* WMM is not enabled, just set the defaults and return */
mwifiex_wmm_default_queue_priorities(priv);
return;
}
mwifiex_dbg(priv->adapter, INFO,
"info: WMM Parameter IE: version=%d,\t"
"qos_info Parameter Set Count=%d, Reserved=%#x\n",
wmm_ie->version, wmm_ie->qos_info_bitmap &
IEEE80211_WMM_IE_AP_QOSINFO_PARAM_SET_CNT_MASK,
wmm_ie->reserved);
Annotation
- Immediate include surface: `decl.h`, `ioctl.h`, `util.h`, `fw.h`, `main.h`, `wmm.h`, `11n.h`.
- Detected declarations: `function mwifiex_wmm_ac_debug_print`, `function mwifiex_wmm_allocate_ralist_node`, `function mwifiex_get_random_ba_threshold`, `function mwifiex_ralist_add`, `function mwifiex_wmm_default_queue_priorities`, `function mwifiex_wmm_queue_priorities_tid`, `function mwifiex_wmm_setup_queue_priorities`, `function mwifiex_wmm_eval_downgrade_ac`, `function mwifiex_wmm_setup_ac_downgrade`, `function mwifiex_wmm_convert_tos_to_ac`.
- 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.