Commit 82e14f56 authored by Jouni Malinen's avatar Jouni Malinen Committed by Kalle Valo

ath6kl: Remove unnecessary bssinfo event header conversion

There is no point in unconditionally converting the bssinfo header
to the old version since only the new header is being used and the
driver can as well read the values from it when needed. Leaving out
the conversion saves some extra memory copying.

In addition, use the calculated "rssi" value snr - 95 dBm to get the
proper value in cfg80211 BSS table (i.e., something that more or less
matches with the value used in STA info).
Signed-off-by: default avatarJouni Malinen <jouni@qca.qualcomm.com>
Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
parent 457fb041
...@@ -381,25 +381,6 @@ int ath6kl_wmi_dot3_2_dix(struct sk_buff *skb) ...@@ -381,25 +381,6 @@ int ath6kl_wmi_dot3_2_dix(struct sk_buff *skb)
return 0; return 0;
} }
static void ath6kl_wmi_convert_bssinfo_hdr2_to_hdr(struct sk_buff *skb,
u8 *datap)
{
struct wmi_bss_info_hdr2 bih2;
struct wmi_bss_info_hdr *bih;
memcpy(&bih2, datap, sizeof(struct wmi_bss_info_hdr2));
skb_push(skb, 4);
bih = (struct wmi_bss_info_hdr *) skb->data;
bih->ch = bih2.ch;
bih->frame_type = bih2.frame_type;
bih->snr = bih2.snr;
bih->rssi = a_cpu_to_sle16(bih2.snr - 95);
bih->ie_mask = cpu_to_le32(le16_to_cpu(bih2.ie_mask));
memcpy(bih->bssid, bih2.bssid, ETH_ALEN);
}
static int ath6kl_wmi_tx_complete_event_rx(u8 *datap, int len) static int ath6kl_wmi_tx_complete_event_rx(u8 *datap, int len)
{ {
struct tx_complete_msg_v1 *msg_v1; struct tx_complete_msg_v1 *msg_v1;
...@@ -912,24 +893,24 @@ static int ath6kl_wmi_tkip_micerr_event_rx(struct wmi *wmi, u8 *datap, int len) ...@@ -912,24 +893,24 @@ static int ath6kl_wmi_tkip_micerr_event_rx(struct wmi *wmi, u8 *datap, int len)
static int ath6kl_wmi_bssinfo_event_rx(struct wmi *wmi, u8 *datap, int len) static int ath6kl_wmi_bssinfo_event_rx(struct wmi *wmi, u8 *datap, int len)
{ {
struct wmi_bss_info_hdr *bih; struct wmi_bss_info_hdr2 *bih;
u8 *buf; u8 *buf;
struct ieee80211_channel *channel; struct ieee80211_channel *channel;
struct ath6kl *ar = wmi->parent_dev; struct ath6kl *ar = wmi->parent_dev;
struct ieee80211_mgmt *mgmt; struct ieee80211_mgmt *mgmt;
struct cfg80211_bss *bss; struct cfg80211_bss *bss;
if (len <= sizeof(struct wmi_bss_info_hdr)) if (len <= sizeof(struct wmi_bss_info_hdr2))
return -EINVAL; return -EINVAL;
bih = (struct wmi_bss_info_hdr *) datap; bih = (struct wmi_bss_info_hdr2 *) datap;
buf = datap + sizeof(struct wmi_bss_info_hdr); buf = datap + sizeof(struct wmi_bss_info_hdr2);
len -= sizeof(struct wmi_bss_info_hdr); len -= sizeof(struct wmi_bss_info_hdr2);
ath6kl_dbg(ATH6KL_DBG_WMI, ath6kl_dbg(ATH6KL_DBG_WMI,
"bss info evt - ch %u, snr %d, rssi %d, bssid \"%pM\" " "bss info evt - ch %u, snr %d, rssi %d, bssid \"%pM\" "
"frame_type=%d\n", "frame_type=%d\n",
bih->ch, bih->snr, a_sle16_to_cpu(bih->rssi), bih->bssid, bih->ch, bih->snr, bih->snr - 95, bih->bssid,
bih->frame_type); bih->frame_type);
if (bih->frame_type != BEACON_FTYPE && if (bih->frame_type != BEACON_FTYPE &&
...@@ -973,7 +954,8 @@ static int ath6kl_wmi_bssinfo_event_rx(struct wmi *wmi, u8 *datap, int len) ...@@ -973,7 +954,8 @@ static int ath6kl_wmi_bssinfo_event_rx(struct wmi *wmi, u8 *datap, int len)
memcpy(&mgmt->u.beacon, buf, len); memcpy(&mgmt->u.beacon, buf, len);
bss = cfg80211_inform_bss_frame(ar->wdev->wiphy, channel, mgmt, bss = cfg80211_inform_bss_frame(ar->wdev->wiphy, channel, mgmt,
24 + len, bih->snr * 100, GFP_ATOMIC); 24 + len, (bih->snr - 95) * 100,
GFP_ATOMIC);
kfree(mgmt); kfree(mgmt);
if (bss == NULL) if (bss == NULL)
return -ENOMEM; return -ENOMEM;
...@@ -2859,8 +2841,7 @@ int ath6kl_wmi_control_rx(struct wmi *wmi, struct sk_buff *skb) ...@@ -2859,8 +2841,7 @@ int ath6kl_wmi_control_rx(struct wmi *wmi, struct sk_buff *skb)
break; break;
case WMI_BSSINFO_EVENTID: case WMI_BSSINFO_EVENTID:
ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_BSSINFO_EVENTID\n"); ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_BSSINFO_EVENTID\n");
ath6kl_wmi_convert_bssinfo_hdr2_to_hdr(skb, datap); ret = ath6kl_wmi_bssinfo_event_rx(wmi, datap, len);
ret = ath6kl_wmi_bssinfo_event_rx(wmi, skb->data, skb->len);
break; break;
case WMI_REGDOMAIN_EVENTID: case WMI_REGDOMAIN_EVENTID:
ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_REGDOMAIN_EVENTID\n"); ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_REGDOMAIN_EVENTID\n");
......
...@@ -1393,33 +1393,14 @@ struct roam_ctrl_cmd { ...@@ -1393,33 +1393,14 @@ struct roam_ctrl_cmd {
u8 roam_ctrl; u8 roam_ctrl;
} __packed; } __packed;
struct wmi_bss_info_hdr { /* BSS INFO HDR version 2.0 */
__le16 ch;
/* see, enum wmi_bi_ftype */
u8 frame_type;
u8 snr;
a_sle16 rssi;
u8 bssid[ETH_ALEN];
__le32 ie_mask;
} __packed;
/*
* BSS INFO HDR version 2.0
* With 6 bytes HTC header and 6 bytes of WMI header
* WMI_BSS_INFO_HDR cannot be accommodated in the removed 802.11 management
* header space.
* - Reduce the ie_mask to 2 bytes as only two bit flags are used
* - Remove rssi and compute it on the host. rssi = snr - 95
*/
struct wmi_bss_info_hdr2 { struct wmi_bss_info_hdr2 {
__le16 ch; __le16 ch; /* frequency in MHz */
/* see, enum wmi_bi_ftype */ /* see, enum wmi_bi_ftype */
u8 frame_type; u8 frame_type;
u8 snr; u8 snr; /* note: rssi = snr - 95 dBm */
u8 bssid[ETH_ALEN]; u8 bssid[ETH_ALEN];
__le16 ie_mask; __le16 ie_mask;
} __packed; } __packed;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment