drivers/net/wireless/quantenna/qtnfmac/commands.c

Source file repositories/reference/linux-study-clean/drivers/net/wireless/quantenna/qtnfmac/commands.c

File Facts

System
Linux kernel
Corpus path
drivers/net/wireless/quantenna/qtnfmac/commands.c
Extension
.c
Size
73179 bytes
Lines
2766
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

switch (le16_to_cpu(tlv->type)) {
		case QTN_TLV_ID_BITMAP:
			map_len = tlv_len;
			map = tlv->val;
			break;
		case QTN_TLV_ID_STA_STATS:
			stats_len = tlv_len;
			stats = (const struct qlink_sta_stats *)tlv->val;
			break;
		default:
			break;
		}
	}

	if (!qlink_tlv_parsing_ok(tlv, data, resp_size)) {
		pr_err("Malformed TLV buffer\n");
		return;
	}

	if (!map || !stats)
		return;

	if (qtnf_sta_stat_avail(inactive_time, QLINK_STA_INFO_INACTIVE_TIME)) {
		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_INACTIVE_TIME);
		sinfo->inactive_time = le32_to_cpu(stats->inactive_time);
	}

	if (qtnf_sta_stat_avail(connected_time,
				QLINK_STA_INFO_CONNECTED_TIME)) {
		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CONNECTED_TIME);
		sinfo->connected_time = le32_to_cpu(stats->connected_time);
	}

	if (qtnf_sta_stat_avail(signal, QLINK_STA_INFO_SIGNAL)) {
		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
		sinfo->signal = stats->signal - QLINK_RSSI_OFFSET;
	}

	if (qtnf_sta_stat_avail(signal_avg, QLINK_STA_INFO_SIGNAL_AVG)) {
		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
		sinfo->signal_avg = stats->signal_avg - QLINK_RSSI_OFFSET;
	}

	if (qtnf_sta_stat_avail(rxrate, QLINK_STA_INFO_RX_BITRATE)) {
		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BITRATE);
		qtnf_sta_info_parse_rate(&sinfo->rxrate, &stats->rxrate);
	}

	if (qtnf_sta_stat_avail(txrate, QLINK_STA_INFO_TX_BITRATE)) {
		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
		qtnf_sta_info_parse_rate(&sinfo->txrate, &stats->txrate);
	}

	if (qtnf_sta_stat_avail(sta_flags, QLINK_STA_INFO_STA_FLAGS)) {
		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_STA_FLAGS);
		qtnf_sta_info_parse_flags(&sinfo->sta_flags, &stats->sta_flags);
	}

	if (qtnf_sta_stat_avail(rx_bytes, QLINK_STA_INFO_RX_BYTES)) {
		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BYTES);
		sinfo->rx_bytes = le64_to_cpu(stats->rx_bytes);
	}

	if (qtnf_sta_stat_avail(tx_bytes, QLINK_STA_INFO_TX_BYTES)) {
		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BYTES);
		sinfo->tx_bytes = le64_to_cpu(stats->tx_bytes);
	}

	if (qtnf_sta_stat_avail(rx_bytes, QLINK_STA_INFO_RX_BYTES64)) {
		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BYTES64);
		sinfo->rx_bytes = le64_to_cpu(stats->rx_bytes);
	}

	if (qtnf_sta_stat_avail(tx_bytes, QLINK_STA_INFO_TX_BYTES64)) {
		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BYTES64);
		sinfo->tx_bytes = le64_to_cpu(stats->tx_bytes);
	}

	if (qtnf_sta_stat_avail(rx_packets, QLINK_STA_INFO_RX_PACKETS)) {
		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_PACKETS);
		sinfo->rx_packets = le32_to_cpu(stats->rx_packets);
	}

	if (qtnf_sta_stat_avail(tx_packets, QLINK_STA_INFO_TX_PACKETS)) {
		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_PACKETS);
		sinfo->tx_packets = le32_to_cpu(stats->tx_packets);
	}

	if (qtnf_sta_stat_avail(rx_beacon, QLINK_STA_INFO_BEACON_RX)) {
		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_BEACON_RX);

Annotation

Implementation Notes