diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath10k/wmi.c')
| -rw-r--r-- | drivers/net/wireless/ath/ath10k/wmi.c | 20 | 
1 files changed, 17 insertions, 3 deletions
| diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c index 9f564e2b7a14..61885d4d662c 100644 --- a/drivers/net/wireless/ath/ath10k/wmi.c +++ b/drivers/net/wireless/ath/ath10k/wmi.c @@ -2463,10 +2463,10 @@ int ath10k_wmi_event_mgmt_rx(struct ath10k *ar, struct sk_buff *skb)  	u32 rx_status;  	u32 channel;  	u32 phy_mode; -	u32 snr; +	u32 snr, rssi;  	u32 rate;  	u16 fc; -	int ret; +	int ret, i;  	ret = ath10k_wmi_pull_mgmt_rx(ar, skb, &arg);  	if (ret) { @@ -2525,6 +2525,20 @@ int ath10k_wmi_event_mgmt_rx(struct ath10k *ar, struct sk_buff *skb)  	status->freq = ieee80211_channel_to_frequency(channel, status->band);  	status->signal = snr + ATH10K_DEFAULT_NOISE_FLOOR; + +	BUILD_BUG_ON(ARRAY_SIZE(status->chain_signal) != ARRAY_SIZE(arg.rssi)); + +	for (i = 0; i < ARRAY_SIZE(status->chain_signal); i++) { +		status->chains &= ~BIT(i); +		rssi = __le32_to_cpu(arg.rssi[i]); +		ath10k_dbg(ar, ATH10K_DBG_MGMT, "mgmt rssi[%d]:%d\n", i, arg.rssi[i]); + +		if (rssi != ATH10K_INVALID_RSSI && rssi != 0) { +			status->chain_signal[i] = ATH10K_DEFAULT_NOISE_FLOOR + rssi; +			status->chains |= BIT(i); +		} +	} +  	status->rate_idx = ath10k_mac_bitrate_to_idx(sband, rate / 100);  	hdr = (struct ieee80211_hdr *)skb->data; @@ -9476,7 +9490,7 @@ static int ath10k_wmi_mgmt_tx_clean_up_pending(int msdu_id, void *ptr,  	msdu = pkt_addr->vaddr;  	dma_unmap_single(ar->dev, pkt_addr->paddr, -			 msdu->len, DMA_FROM_DEVICE); +			 msdu->len, DMA_TO_DEVICE);  	ieee80211_free_txskb(ar->hw, msdu);  	return 0; | 
