drivers/net/wireless/silabs/wfx/data_rx.c
Source file repositories/reference/linux-study-clean/drivers/net/wireless/silabs/wfx/data_rx.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/wireless/silabs/wfx/data_rx.c- Extension
.c- Size
- 2530 bytes
- Lines
- 94
- 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.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/etherdevice.hnet/mac80211.hdata_rx.hwfx.hbh.hsta.h
Detected Declarations
function Copyrightfunction wfx_rx_cb
Annotated Snippet
// SPDX-License-Identifier: GPL-2.0-only
/*
* Data receiving implementation.
*
* Copyright (c) 2017-2020, Silicon Laboratories, Inc.
* Copyright (c) 2010, ST-Ericsson
*/
#include <linux/etherdevice.h>
#include <net/mac80211.h>
#include "data_rx.h"
#include "wfx.h"
#include "bh.h"
#include "sta.h"
static void wfx_rx_handle_ba(struct wfx_vif *wvif, struct ieee80211_mgmt *mgmt)
{
struct ieee80211_vif *vif = wvif_to_vif(wvif);
int params, tid;
if (wfx_api_older_than(wvif->wdev, 3, 6))
return;
switch (mgmt->u.action.action_code) {
case WLAN_ACTION_ADDBA_REQ:
params = le16_to_cpu(mgmt->u.action.addba_req.capab);
tid = (params & IEEE80211_ADDBA_PARAM_TID_MASK) >> 2;
ieee80211_start_rx_ba_session_offl(vif, mgmt->sa, tid);
break;
case WLAN_ACTION_DELBA:
params = le16_to_cpu(mgmt->u.action.delba.params);
tid = (params & IEEE80211_DELBA_PARAM_TID_MASK) >> 12;
ieee80211_stop_rx_ba_session_offl(vif, mgmt->sa, tid);
break;
}
}
void wfx_rx_cb(struct wfx_vif *wvif, const struct wfx_hif_ind_rx *arg, struct sk_buff *skb)
{
struct ieee80211_rx_status *hdr = IEEE80211_SKB_RXCB(skb);
struct ieee80211_hdr *frame = (struct ieee80211_hdr *)skb->data;
struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)skb->data;
memset(hdr, 0, sizeof(*hdr));
if (arg->status == HIF_STATUS_RX_FAIL_MIC)
hdr->flag |= RX_FLAG_MMIC_ERROR | RX_FLAG_IV_STRIPPED;
else if (arg->status)
goto drop;
if (skb->len < sizeof(struct ieee80211_pspoll)) {
dev_warn(wvif->wdev->dev, "malformed SDU received\n");
goto drop;
}
hdr->band = NL80211_BAND_2GHZ;
hdr->freq = ieee80211_channel_to_frequency(arg->channel_number, hdr->band);
if (arg->rxed_rate >= 14) {
hdr->encoding = RX_ENC_HT;
hdr->rate_idx = arg->rxed_rate - 14;
} else if (arg->rxed_rate >= 4) {
hdr->rate_idx = arg->rxed_rate - 2;
} else {
hdr->rate_idx = arg->rxed_rate;
}
if (!arg->rcpi_rssi) {
hdr->flag |= RX_FLAG_NO_SIGNAL_VAL;
dev_info(wvif->wdev->dev, "received frame without RSSI data\n");
}
hdr->signal = arg->rcpi_rssi / 2 - 110;
hdr->antenna = 0;
if (arg->encryp)
hdr->flag |= RX_FLAG_DECRYPTED;
/* Block ack negotiation is offloaded by the firmware. However, re-ordering must be done by
* the mac80211.
*/
if (ieee80211_is_action(frame->frame_control) &&
mgmt->u.action.category == WLAN_CATEGORY_BACK &&
skb->len > IEEE80211_MIN_ACTION_SIZE(action_code)) {
wfx_rx_handle_ba(wvif, mgmt);
goto drop;
}
ieee80211_rx_irqsafe(wvif->wdev->hw, skb);
return;
Annotation
- Immediate include surface: `linux/etherdevice.h`, `net/mac80211.h`, `data_rx.h`, `wfx.h`, `bh.h`, `sta.h`.
- Detected declarations: `function Copyright`, `function wfx_rx_cb`.
- Atlas domain: Driver Families / drivers/net.
- Implementation status: source implementation candidate.
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.