ath9k_htc: Fix WMI and beacon header
Sujith Manoharan [Wed, 13 Apr 2011 05:52:59 +0000 (10:52 +0530)]
Match the beacon header with that of the firmware.
Also, the firmware reports the TSF for an SWBA, so
store it.

Signed-off-by: Sujith Manoharan <Sujith.Manoharan@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

drivers/net/wireless/ath/ath9k/htc.h
drivers/net/wireless/ath/ath9k/wmi.c
drivers/net/wireless/ath/ath9k/wmi.h

index 9544cd7..cf7909e 100644 (file)
@@ -96,8 +96,8 @@ struct tx_mgmt_hdr {
 } __packed;
 
 struct tx_beacon_header {
-       u8 len_changed;
        u8 vif_index;
+       u8 len_changed;
        u16 rev;
 } __packed;
 
index 267a98f..96171a2 100644 (file)
@@ -156,6 +156,7 @@ static void ath9k_wmi_ctrl_rx(void *priv, struct sk_buff *skb,
        struct wmi_cmd_hdr *hdr;
        u16 cmd_id;
        void *wmi_event;
+       struct wmi_event_swba *swba;
 #ifdef CONFIG_ATH9K_HTC_DEBUGFS
        __be32 txrate;
 #endif
@@ -170,7 +171,11 @@ static void ath9k_wmi_ctrl_rx(void *priv, struct sk_buff *skb,
                wmi_event = skb_pull(skb, sizeof(struct wmi_cmd_hdr));
                switch (cmd_id) {
                case WMI_SWBA_EVENTID:
-                       wmi->beacon_pending = *(u8 *)wmi_event;
+                       swba = (struct wmi_event_swba *) wmi_event;
+
+                       wmi->tsf = be64_to_cpu(swba->tsf);
+                       wmi->beacon_pending = swba->beacon_pending;
+
                        tasklet_schedule(&wmi->drv_priv->swba_tasklet);
                        break;
                case WMI_FATAL_EVENTID:
index 6a36572..2fa91a9 100644 (file)
@@ -36,6 +36,11 @@ struct wmi_fw_version {
        __be16 minor;
 
 } __packed;
+
+struct wmi_event_swba {
+       __be64 tsf;
+       u8 beacon_pending;
+};
 enum wmi_cmd_id {
        WMI_ECHO_CMDID = 0x0001,
        WMI_ACCESS_MEMORY_CMDID,
@@ -106,6 +111,7 @@ struct wmi {
        u32 cmd_rsp_len;
        bool stopped;
 
+       u64 tsf;
        u8 beacon_pending;
        spinlock_t wmi_lock;