drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/core.c

Source file repositories/reference/linux-study-clean/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/core.c

File Facts

System
Linux kernel
Corpus path
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/core.c
Extension
.c
Size
10981 bytes
Lines
373
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

if (err) {
			bphy_err(drvr, "unable to get current hw channel\n");
			goto free;
		}
	}
	mf_params->channel = hw_ch;

	memcpy(&mf_params->da[0], &mgmt->da[0], ETH_ALEN);
	memcpy(&mf_params->bssid[0], &mgmt->bssid[0], ETH_ALEN);
	mf_params->packet_id = cpu_to_le32(*cookie);
	memcpy(mf_params->data, &buf[DOT11_MGMT_HDR_LEN],
	       le16_to_cpu(mf_params->len));

	brcmf_dbg(TRACE, "Auth frame, cookie=%d, fc=%04x, len=%d, channel=%d\n",
		  le32_to_cpu(mf_params->packet_id),
		  le16_to_cpu(mf_params->frame_control),
		  le16_to_cpu(mf_params->len),
		  le16_to_cpu(mf_params->channel));

	vif->mgmt_tx_id = le32_to_cpu(mf_params->packet_id);
	set_bit(BRCMF_MGMT_TX_SEND_FRAME, &vif->mgmt_tx_status);

	err = brcmf_fil_bsscfg_data_set(vif->ifp, "mgmt_frame",
					mf_params, mf_params_len);
	if (err) {
		bphy_err(drvr, "Failed to send Auth frame: err=%d\n",
			 err);
		goto tx_status;
	}

	ready = wait_for_completion_timeout(&vif->mgmt_tx,
					    MGMT_AUTH_FRAME_WAIT_TIME);
	if (test_bit(BRCMF_MGMT_TX_ACK, &vif->mgmt_tx_status)) {
		brcmf_dbg(TRACE, "TX Auth frame operation is success\n");
		ack = true;
	} else {
		bphy_err(drvr, "TX Auth frame operation is %s: status=%ld)\n",
			 ready ? "failed" : "timedout", vif->mgmt_tx_status);
	}

tx_status:
	cfg80211_mgmt_tx_status(wdev, *cookie, buf, len, ack,
				GFP_KERNEL);
free:
	kfree(mf_params);
	return err;
}

static int
brcmf_cyw_external_auth(struct wiphy *wiphy, struct net_device *dev,
			struct cfg80211_external_auth_params *params)
{
	struct brcmf_if *ifp;
	struct brcmf_pub *drvr;
	struct brcmf_auth_req_status_le auth_status;
	int ret = 0;

	brcmf_dbg(TRACE, "Enter\n");

	ifp = netdev_priv(dev);
	drvr = ifp->drvr;
	if (params->status == WLAN_STATUS_SUCCESS) {
		auth_status.flags = cpu_to_le16(BRCMF_EXTAUTH_SUCCESS);
	} else {
		bphy_err(drvr, "External authentication failed: status=%d\n",
			 params->status);
		auth_status.flags = cpu_to_le16(BRCMF_EXTAUTH_FAIL);
	}

	memcpy(auth_status.peer_mac, params->bssid, ETH_ALEN);
	params->ssid.ssid_len = min_t(u8, params->ssid.ssid_len,
				      IEEE80211_MAX_SSID_LEN);
	auth_status.ssid_len = cpu_to_le32(params->ssid.ssid_len);
	memcpy(auth_status.ssid, params->ssid.ssid, params->ssid.ssid_len);

	ret = brcmf_fil_iovar_data_set(ifp, "auth_status", &auth_status,
				       sizeof(auth_status));
	if (ret < 0)
		bphy_err(drvr, "auth_status iovar failed: ret=%d\n", ret);

	return ret;
}

static void brcmf_cyw_get_cfg80211_ops(struct brcmf_pub *drvr)
{
	drvr->ops->mgmt_tx = brcmf_cyw_mgmt_tx;
	drvr->ops->external_auth = brcmf_cyw_external_auth;
}

static s32

Annotation

Implementation Notes