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)
{
struct tx_complete_msg_v1 *msg_v1;
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;
struct ieee80211_channel *channel;
struct ath6kl *ar = wmi->parent_dev;
struct ieee80211_mgmt *mgmt;
struct cfg80211_bss *bss;
- if (len <= sizeof(struct wmi_bss_info_hdr))
+ if (len <= sizeof(struct wmi_bss_info_hdr2))
return -EINVAL;
- bih = (struct wmi_bss_info_hdr *) datap;
- buf = datap + sizeof(struct wmi_bss_info_hdr);
- len -= sizeof(struct wmi_bss_info_hdr);
+ bih = (struct wmi_bss_info_hdr2 *) datap;
+ buf = datap + sizeof(struct wmi_bss_info_hdr2);
+ len -= sizeof(struct wmi_bss_info_hdr2);
ath6kl_dbg(ATH6KL_DBG_WMI,
"bss info evt - ch %u, snr %d, rssi %d, bssid \"%pM\" "
"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);
if (bih->frame_type != BEACON_FTYPE &&
memcpy(&mgmt->u.beacon, buf, len);
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);
if (bss == NULL)
return -ENOMEM;
break;
case WMI_BSSINFO_EVENTID:
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, skb->data, skb->len);
+ ret = ath6kl_wmi_bssinfo_event_rx(wmi, datap, len);
break;
case WMI_REGDOMAIN_EVENTID:
ath6kl_dbg(ATH6KL_DBG_WMI, "WMI_REGDOMAIN_EVENTID\n");
u8 roam_ctrl;
} __packed;
-struct wmi_bss_info_hdr {
- __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
- */
+/* BSS INFO HDR version 2.0 */
struct wmi_bss_info_hdr2 {
- __le16 ch;
+ __le16 ch; /* frequency in MHz */
/* see, enum wmi_bi_ftype */
u8 frame_type;
- u8 snr;
+ u8 snr; /* note: rssi = snr - 95 dBm */
u8 bssid[ETH_ALEN];
__le16 ie_mask;
} __packed;