]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/net/wireless/ath/ath9k/wmi.c
Merge branch 'master' into tk71
[mv-sheeva.git] / drivers / net / wireless / ath / ath9k / wmi.c
index 6260faa658a262ebd16017425deb2cdd28aa48ae..dc862f5e1162b7b24f67efaf3e233a1cf8e69c4d 100644 (file)
@@ -85,6 +85,8 @@ static const char *wmi_cmd_to_name(enum wmi_cmd_id wmi_cmd)
                return "WMI_TGT_DETACH_CMDID";
        case WMI_TGT_TXQ_ENABLE_CMDID:
                return "WMI_TGT_TXQ_ENABLE_CMDID";
+       case WMI_AGGR_LIMIT_CMD:
+               return "WMI_AGGR_LIMIT_CMD";
        }
 
        return "Bogus";
@@ -118,59 +120,25 @@ void ath9k_deinit_wmi(struct ath9k_htc_priv *priv)
        kfree(priv->wmi);
 }
 
-void ath9k_wmi_tasklet(unsigned long data)
+void ath9k_swba_tasklet(unsigned long data)
 {
        struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *)data;
        struct ath_common *common = ath9k_hw_common(priv->ah);
-       struct wmi_cmd_hdr *hdr;
-       struct wmi_swba *swba_hdr;
-       enum wmi_event_id event;
-       struct sk_buff *skb;
-       void *wmi_event;
-       unsigned long flags;
-#ifdef CONFIG_ATH9K_HTC_DEBUGFS
-       __be32 txrate;
-#endif
 
-       spin_lock_irqsave(&priv->wmi->wmi_lock, flags);
-       skb = priv->wmi->wmi_skb;
-       spin_unlock_irqrestore(&priv->wmi->wmi_lock, flags);
+       ath_dbg(common, ATH_DBG_WMI, "SWBA Event received\n");
 
-       hdr = (struct wmi_cmd_hdr *) skb->data;
-       event = be16_to_cpu(hdr->command_id);
-       wmi_event = skb_pull(skb, sizeof(struct wmi_cmd_hdr));
-
-       ath_print(common, ATH_DBG_WMI,
-                 "WMI Event: 0x%x\n", event);
-
-       switch (event) {
-       case WMI_TGT_RDY_EVENTID:
-               break;
-       case WMI_SWBA_EVENTID:
-               swba_hdr = (struct wmi_swba *) wmi_event;
-               ath9k_htc_swba(priv, swba_hdr->beacon_pending);
-               break;
-       case WMI_FATAL_EVENTID:
-               break;
-       case WMI_TXTO_EVENTID:
-               break;
-       case WMI_BMISS_EVENTID:
-               break;
-       case WMI_WLAN_TXCOMP_EVENTID:
-               break;
-       case WMI_DELBA_EVENTID:
-               break;
-       case WMI_TXRATE_EVENTID:
-#ifdef CONFIG_ATH9K_HTC_DEBUGFS
-               txrate = ((struct wmi_event_txrate *)wmi_event)->txrate;
-               priv->debug.txrate = be32_to_cpu(txrate);
-#endif
-               break;
-       default:
-               break;
-       }
+       ath9k_htc_swba(priv, priv->wmi->beacon_pending);
 
-       kfree_skb(skb);
+}
+
+void ath9k_fatal_work(struct work_struct *work)
+{
+       struct ath9k_htc_priv *priv = container_of(work, struct ath9k_htc_priv,
+                                                  fatal_work);
+       struct ath_common *common = ath9k_hw_common(priv->ah);
+
+       ath_dbg(common, ATH_DBG_FATAL, "FATAL Event received, resetting device\n");
+       ath9k_htc_reset(priv);
 }
 
 static void ath9k_wmi_rsp_callback(struct wmi *wmi, struct sk_buff *skb)
@@ -189,6 +157,10 @@ static void ath9k_wmi_ctrl_rx(void *priv, struct sk_buff *skb,
        struct wmi *wmi = (struct wmi *) priv;
        struct wmi_cmd_hdr *hdr;
        u16 cmd_id;
+       void *wmi_event;
+#ifdef CONFIG_ATH9K_HTC_DEBUGFS
+       __be32 txrate;
+#endif
 
        if (unlikely(wmi->stopped))
                goto free_skb;
@@ -197,10 +169,26 @@ static void ath9k_wmi_ctrl_rx(void *priv, struct sk_buff *skb,
        cmd_id = be16_to_cpu(hdr->command_id);
 
        if (cmd_id & 0x1000) {
-               spin_lock(&wmi->wmi_lock);
-               wmi->wmi_skb = skb;
-               spin_unlock(&wmi->wmi_lock);
-               tasklet_schedule(&wmi->drv_priv->wmi_tasklet);
+               wmi_event = skb_pull(skb, sizeof(struct wmi_cmd_hdr));
+               switch (cmd_id) {
+               case WMI_SWBA_EVENTID:
+                       wmi->beacon_pending = *(u8 *)wmi_event;
+                       tasklet_schedule(&wmi->drv_priv->swba_tasklet);
+                       break;
+               case WMI_FATAL_EVENTID:
+                       ieee80211_queue_work(wmi->drv_priv->hw,
+                                            &wmi->drv_priv->fatal_work);
+                       break;
+               case WMI_TXRATE_EVENTID:
+#ifdef CONFIG_ATH9K_HTC_DEBUGFS
+                       txrate = ((struct wmi_event_txrate *)wmi_event)->txrate;
+                       wmi->drv_priv->debug.txrate = be32_to_cpu(txrate);
+#endif
+                       break;
+               default:
+                       break;
+               }
+               kfree_skb(skb);
                return;
        }
 
@@ -276,7 +264,7 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,
        int time_left, ret = 0;
        unsigned long flags;
 
-       if (wmi->drv_priv->op_flags & OP_UNPLUGGED)
+       if (ah->ah_flags & AH_UNPLUGGED)
                return 0;
 
        skb = alloc_skb(headroom + cmd_len, GFP_ATOMIC);
@@ -312,9 +300,9 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,
 
        time_left = wait_for_completion_timeout(&wmi->cmd_wait, timeout);
        if (!time_left) {
-               ath_print(common, ATH_DBG_WMI,
-                         "Timeout waiting for WMI command: %s\n",
-                         wmi_cmd_to_name(cmd_id));
+               ath_dbg(common, ATH_DBG_WMI,
+                       "Timeout waiting for WMI command: %s\n",
+                       wmi_cmd_to_name(cmd_id));
                mutex_unlock(&wmi->op_mutex);
                return -ETIMEDOUT;
        }
@@ -324,8 +312,8 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,
        return 0;
 
 out:
-       ath_print(common, ATH_DBG_WMI,
-                 "WMI failure for: %s\n", wmi_cmd_to_name(cmd_id));
+       ath_dbg(common, ATH_DBG_WMI,
+               "WMI failure for: %s\n", wmi_cmd_to_name(cmd_id));
        mutex_unlock(&wmi->op_mutex);
        kfree_skb(skb);