ath9k_htc: Configure credit size for AR7010
authorSujith <Sujith.Manoharan@atheros.com>
Wed, 2 Jun 2010 10:23:54 +0000 (15:53 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 4 Jun 2010 20:00:39 +0000 (16:00 -0400)
For non-AR9271 chips, the credit size is different
and has to be configured appropriately.

Signed-off-by: Sujith <Sujith.Manoharan@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/htc_drv_init.c
drivers/net/wireless/ath/ath9k/htc_hst.c

index cda30410d5ee0ce806fef264961134bd14b5fdd7..7339439f0bef1fffc536c37428ad5af9cc30766b 100644 (file)
@@ -179,7 +179,7 @@ static inline int ath9k_htc_connect_svc(struct ath9k_htc_priv *priv,
        return htc_connect_service(priv->htc, &req, ep_id);
 }
 
-static int ath9k_init_htc_services(struct ath9k_htc_priv *priv)
+static int ath9k_init_htc_services(struct ath9k_htc_priv *priv, u16 devid)
 {
        int ret;
 
@@ -237,10 +237,33 @@ static int ath9k_init_htc_services(struct ath9k_htc_priv *priv)
        if (ret)
                goto err;
 
+       /*
+        * Setup required credits before initializing HTC.
+        * This is a bit hacky, but, since queuing is done in
+        * the HIF layer, shouldn't matter much.
+        */
+
+       switch(devid) {
+       case 0x9271:
+       case 0x1006:
+               priv->htc->credits = 33;
+               break;
+       case 0x7010:
+               priv->htc->credits = 45;
+               break;
+       default:
+               dev_err(priv->dev, "ath9k_htc: Unsupported device id: 0x%x\n",
+                       devid);
+               goto err;
+       }
+
        ret = htc_init(priv->htc);
        if (ret)
                goto err;
 
+       dev_info(priv->dev, "ath9k_htc: HTC initialized with %d credits\n",
+                priv->htc->credits);
+
        return 0;
 
 err:
@@ -842,7 +865,7 @@ int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev,
                goto err_free;
        }
 
-       ret = ath9k_init_htc_services(priv);
+       ret = ath9k_init_htc_services(priv, devid);
        if (ret)
                goto err_init;
 
@@ -885,7 +908,8 @@ int ath9k_htc_resume(struct htc_target *htc_handle)
        if (ret)
                return ret;
 
-       ret = ath9k_init_htc_services(htc_handle->drv_priv);
+       ret = ath9k_init_htc_services(htc_handle->drv_priv,
+                             htc_handle->drv_priv->ah->hw_version.devid);
        return ret;
 }
 #endif
index 2173196271600010ec4737f3f4b75db35581163c..705c0f342e1c0342ea4000c5ea747ececf31dfce 100644 (file)
@@ -89,7 +89,6 @@ static void htc_process_target_rdy(struct htc_target *target,
        struct htc_endpoint *endpoint;
        struct htc_ready_msg *htc_ready_msg = (struct htc_ready_msg *) buf;
 
-       target->credits = be16_to_cpu(htc_ready_msg->credits);
        target->credit_size = be16_to_cpu(htc_ready_msg->credit_size);
 
        endpoint = &target->endpoint[ENDPOINT0];
@@ -159,7 +158,7 @@ static int htc_config_pipe_credits(struct htc_target *target)
 
        cp_msg->message_id = cpu_to_be16(HTC_MSG_CONFIG_PIPE_ID);
        cp_msg->pipe_id = USB_WLAN_TX_PIPE;
-       cp_msg->credits = 33;
+       cp_msg->credits = target->credits;
 
        target->htc_flags |= HTC_OP_CONFIG_PIPE_CREDITS;