drivers/net/wireless/realtek/rtl8xxxu/core.c

Source file repositories/reference/linux-study-clean/drivers/net/wireless/realtek/rtl8xxxu/core.c

File Facts

System
Linux kernel
Corpus path
drivers/net/wireless/realtek/rtl8xxxu/core.c
Extension
.c
Size
237665 bytes
Lines
8288
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

struct rtl8xxxu_rx_update_rssi_data {
	struct rtl8xxxu_priv *priv;
	struct ieee80211_hdr *hdr;
	struct ieee80211_rx_status *rx_status;
	u8 *bssid;
};

static void rtl8xxxu_rx_update_rssi_iter(void *data, u8 *mac,
					 struct ieee80211_vif *vif)
{
	struct rtl8xxxu_rx_update_rssi_data *iter_data = data;
	struct ieee80211_sta *sta;
	struct ieee80211_hdr *hdr = iter_data->hdr;
	struct rtl8xxxu_priv *priv = iter_data->priv;
	struct rtl8xxxu_sta_info *sta_info;
	struct ieee80211_rx_status *rx_status = iter_data->rx_status;
	u8 *bssid = iter_data->bssid;

	if (!ether_addr_equal(vif->bss_conf.bssid, bssid))
		return;

	if (!(ether_addr_equal(vif->addr, hdr->addr1) ||
	      ieee80211_is_beacon(hdr->frame_control)))
		return;

	sta = ieee80211_find_sta_by_ifaddr(priv->hw, hdr->addr2,
					   vif->addr);
	if (!sta)
		return;

	sta_info = (struct rtl8xxxu_sta_info *)sta->drv_priv;
	ewma_rssi_add(&sta_info->avg_rssi, -rx_status->signal);
}

static inline u8 *get_hdr_bssid(struct ieee80211_hdr *hdr)
{
	__le16 fc = hdr->frame_control;
	u8 *bssid;

	if (ieee80211_has_tods(fc))
		bssid = hdr->addr1;
	else if (ieee80211_has_fromds(fc))
		bssid = hdr->addr2;
	else
		bssid = hdr->addr3;

	return bssid;
}

static void rtl8xxxu_rx_update_rssi(struct rtl8xxxu_priv *priv,
				    struct ieee80211_rx_status *rx_status,
				    struct ieee80211_hdr *hdr)
{
	struct rtl8xxxu_rx_update_rssi_data data = {};

	if (ieee80211_is_ctl(hdr->frame_control))
		return;

	data.priv = priv;
	data.hdr = hdr;
	data.rx_status = rx_status;
	data.bssid = get_hdr_bssid(hdr);

	rtl8xxxu_iterate_vifs_atomic(priv, rtl8xxxu_rx_update_rssi_iter, &data);
}

int rtl8xxxu_parse_rxdesc16(struct rtl8xxxu_priv *priv, struct sk_buff *skb)
{
	struct ieee80211_hw *hw = priv->hw;
	struct ieee80211_rx_status *rx_status;
	struct rtl8xxxu_rxdesc16 *rx_desc;
	struct rtl8723au_phy_stats *phy_stats;
	struct sk_buff *next_skb = NULL;
	__le32 *_rx_desc_le;
	u32 *_rx_desc;
	int drvinfo_sz, desc_shift;
	int i, pkt_cnt, pkt_len, urb_len, pkt_offset;

	urb_len = skb->len;
	pkt_cnt = 0;

	if (urb_len < sizeof(struct rtl8xxxu_rxdesc16)) {
		kfree_skb(skb);
		return RX_TYPE_ERROR;
	}

	do {
		rx_desc = (struct rtl8xxxu_rxdesc16 *)skb->data;
		_rx_desc_le = (__le32 *)skb->data;
		_rx_desc = (u32 *)skb->data;

Annotation

Implementation Notes