diff options
Diffstat (limited to 'sys/contrib/dev/mediatek/mt76/mt76_connac_mcu.c')
| -rw-r--r-- | sys/contrib/dev/mediatek/mt76/mt76_connac_mcu.c | 51 | 
1 files changed, 44 insertions, 7 deletions
diff --git a/sys/contrib/dev/mediatek/mt76/mt76_connac_mcu.c b/sys/contrib/dev/mediatek/mt76/mt76_connac_mcu.c index 85a8573f2822..ca0d022668e9 100644 --- a/sys/contrib/dev/mediatek/mt76/mt76_connac_mcu.c +++ b/sys/contrib/dev/mediatek/mt76/mt76_connac_mcu.c @@ -67,8 +67,7 @@ int mt76_connac_mcu_init_download(struct mt76_dev *dev, u32 addr, u32 len,  	if ((!is_connac_v1(dev) && addr == MCU_PATCH_ADDRESS) ||  	    (is_mt7921(dev) && addr == 0x900000) ||  	    (is_mt7925(dev) && (addr == 0x900000 || addr == 0xe0002800)) || -	    (is_mt7996(dev) && addr == 0x900000) || -	    (is_mt7992(dev) && addr == 0x900000)) +	    (is_mt799x(dev) && addr == 0x900000))  		cmd = MCU_CMD(PATCH_START_REQ);  	else  		cmd = MCU_CMD(TARGET_ADDRESS_LEN_REQ); @@ -288,7 +287,7 @@ __mt76_connac_mcu_alloc_sta_req(struct mt76_dev *dev, struct mt76_vif_link *mvif  	mt76_connac_mcu_get_wlan_idx(dev, wcid, &hdr.wlan_idx_lo,  				     &hdr.wlan_idx_hi); -	skb = mt76_mcu_msg_alloc(dev, NULL, len); +	skb = __mt76_mcu_msg_alloc(dev, NULL, len, len, GFP_ATOMIC);  	if (!skb)  		return ERR_PTR(-ENOMEM); @@ -1168,7 +1167,7 @@ int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy,  			.tag = cpu_to_le16(DEV_INFO_ACTIVE),  			.len = cpu_to_le16(sizeof(struct req_tlv)),  			.active = enable, -			.link_idx = mvif->idx, +			.link_idx = mvif->link_idx,  		},  	};  	struct { @@ -1191,7 +1190,7 @@ int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy,  			.bmc_tx_wlan_idx = cpu_to_le16(wcid->idx),  			.sta_idx = cpu_to_le16(wcid->idx),  			.conn_state = 1, -			.link_idx = mvif->idx, +			.link_idx = mvif->link_idx,  		},  	};  	int err, idx, cmd, len; @@ -1667,6 +1666,44 @@ int mt76_connac_mcu_uni_add_bss(struct mt76_phy *phy,  }  EXPORT_SYMBOL_GPL(mt76_connac_mcu_uni_add_bss); +void mt76_connac_mcu_build_rnr_scan_param(struct mt76_dev *mdev, +					  struct cfg80211_scan_request *sreq) +{ +	struct ieee80211_channel **scan_list = sreq->channels; +	int i, bssid_index = 0; + +	/* clear 6G active Scan BSSID table */ +	memset(&mdev->rnr, 0, sizeof(mdev->rnr)); + +	for (i = 0; i < sreq->n_6ghz_params; i++) { +		u8 ch_idx = sreq->scan_6ghz_params[i].channel_idx; +		int k = 0; + +		/* Remove the duplicated BSSID */ +		for (k = 0; k < bssid_index; k++) { +			if (!memcmp(&mdev->rnr.bssid[k], +				    sreq->scan_6ghz_params[i].bssid, +				    ETH_ALEN)) +				break; +		} + +		if (k == bssid_index && +		    bssid_index < MT76_RNR_SCAN_MAX_BSSIDS) { +			memcpy(&mdev->rnr.bssid[bssid_index++], +			       sreq->scan_6ghz_params[i].bssid, ETH_ALEN); +			mdev->rnr.channel[k] = scan_list[ch_idx]->hw_value; +		} +	} + +	mdev->rnr.bssid_num = bssid_index; + +	if (sreq->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { +		memcpy(mdev->rnr.random_mac, sreq->mac_addr, ETH_ALEN); +		mdev->rnr.sreq_flag = sreq->flags; +	} +} +EXPORT_SYMBOL_GPL(mt76_connac_mcu_build_rnr_scan_param); +  #define MT76_CONNAC_SCAN_CHANNEL_TIME		60  int mt76_connac_mcu_hw_scan(struct mt76_phy *phy, struct ieee80211_vif *vif,  			    struct ieee80211_scan_request *scan_req) @@ -1703,8 +1740,8 @@ int mt76_connac_mcu_hw_scan(struct mt76_phy *phy, struct ieee80211_vif *vif,  		if (!sreq->ssids[i].ssid_len)  			continue; -		req->ssids[i].ssid_len = cpu_to_le32(sreq->ssids[i].ssid_len); -		memcpy(req->ssids[i].ssid, sreq->ssids[i].ssid, +		req->ssids[n_ssids].ssid_len = cpu_to_le32(sreq->ssids[i].ssid_len); +		memcpy(req->ssids[n_ssids].ssid, sreq->ssids[i].ssid,  		       sreq->ssids[i].ssid_len);  		n_ssids++;  	}  | 
