ath9k_htc: Identify devices using driver_info
authorRajkumar Manoharan <rmanoharan@atheros.com>
Fri, 19 Nov 2010 11:23:22 +0000 (16:53 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 24 Nov 2010 21:19:41 +0000 (16:19 -0500)
Categorize AR7010 & AR9287 devices based on driver_info
of usb_device_id, instead of PIDs. This avoids per-device cases
and minimize code changes for new device addition.

Signed-off-by: Rajkumar Manoharan <rmanoharan@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/hif_usb.c
drivers/net/wireless/ath/ath9k/htc.h
drivers/net/wireless/ath/ath9k/htc_drv_init.c
drivers/net/wireless/ath/ath9k/htc_hst.c
drivers/net/wireless/ath/ath9k/htc_hst.h
drivers/net/wireless/ath/ath9k/reg.h

index 6a0dbd153349d1bbf556d54cf021db7bcefea5ef..ae842dbf9b5087a5ea456a2f241eb9ff806fe061 100644 (file)
@@ -786,7 +786,8 @@ static void ath9k_hif_usb_dealloc_urbs(struct hif_device_usb *hif_dev)
        ath9k_hif_usb_dealloc_rx_urbs(hif_dev);
 }
 
-static int ath9k_hif_usb_download_fw(struct hif_device_usb *hif_dev)
+static int ath9k_hif_usb_download_fw(struct hif_device_usb *hif_dev,
+                                    u32 drv_info)
 {
        int transfer, err;
        const void *data = hif_dev->firmware->data;
@@ -817,18 +818,10 @@ static int ath9k_hif_usb_download_fw(struct hif_device_usb *hif_dev)
        }
        kfree(buf);
 
-       switch (hif_dev->device_id) {
-       case 0x7010:
-       case 0x7015:
-       case 0x9018:
-       case 0xA704:
-       case 0x1200:
+       if (drv_info & AR7010_DEVICE)
                firm_offset = AR7010_FIRMWARE_TEXT;
-               break;
-       default:
+       else
                firm_offset = AR9271_FIRMWARE_TEXT;
-               break;
-       }
 
        /*
         * Issue FW download complete command to firmware.
@@ -846,7 +839,7 @@ static int ath9k_hif_usb_download_fw(struct hif_device_usb *hif_dev)
        return 0;
 }
 
-static int ath9k_hif_usb_dev_init(struct hif_device_usb *hif_dev)
+static int ath9k_hif_usb_dev_init(struct hif_device_usb *hif_dev, u32 drv_info)
 {
        int ret, idx;
        struct usb_host_interface *alt = &hif_dev->interface->altsetting[0];
@@ -862,7 +855,7 @@ static int ath9k_hif_usb_dev_init(struct hif_device_usb *hif_dev)
        }
 
        /* Download firmware */
-       ret = ath9k_hif_usb_download_fw(hif_dev);
+       ret = ath9k_hif_usb_download_fw(hif_dev, drv_info);
        if (ret) {
                dev_err(&hif_dev->udev->dev,
                        "ath9k_htc: Firmware - %s download failed\n",
@@ -941,23 +934,15 @@ static int ath9k_hif_usb_probe(struct usb_interface *interface,
 
        /* Find out which firmware to load */
 
-       switch(hif_dev->device_id) {
-       case 0x7010:
-       case 0x7015:
-       case 0x9018:
-       case 0xA704:
-       case 0x1200:
+       if (id->driver_info & AR7010_DEVICE)
                if (le16_to_cpu(udev->descriptor.bcdDevice) == 0x0202)
                        hif_dev->fw_name = FIRMWARE_AR7010_1_1;
                else
                        hif_dev->fw_name = FIRMWARE_AR7010;
-               break;
-       default:
+       else
                hif_dev->fw_name = FIRMWARE_AR9271;
-               break;
-       }
 
-       ret = ath9k_hif_usb_dev_init(hif_dev);
+       ret = ath9k_hif_usb_dev_init(hif_dev, id->driver_info);
        if (ret) {
                ret = -EINVAL;
                goto err_hif_init_usb;
@@ -965,7 +950,7 @@ static int ath9k_hif_usb_probe(struct usb_interface *interface,
 
        ret = ath9k_htc_hw_init(hif_dev->htc_handle,
                                &hif_dev->udev->dev, hif_dev->device_id,
-                               hif_dev->udev->product);
+                               hif_dev->udev->product, id->driver_info);
        if (ret) {
                ret = -EINVAL;
                goto err_htc_hw_init;
@@ -1043,6 +1028,7 @@ static int ath9k_hif_usb_resume(struct usb_interface *interface)
 {
        struct hif_device_usb *hif_dev =
                (struct hif_device_usb *) usb_get_intfdata(interface);
+       struct htc_target *htc_handle = hif_dev->htc_handle;
        int ret;
 
        ret = ath9k_hif_usb_alloc_urbs(hif_dev);
@@ -1050,7 +1036,8 @@ static int ath9k_hif_usb_resume(struct usb_interface *interface)
                return ret;
 
        if (hif_dev->firmware) {
-               ret = ath9k_hif_usb_download_fw(hif_dev);
+               ret = ath9k_hif_usb_download_fw(hif_dev,
+                               htc_handle->drv_priv->ah->common.driver_info);
                if (ret)
                        goto fail_resume;
        } else {
@@ -1060,7 +1047,7 @@ static int ath9k_hif_usb_resume(struct usb_interface *interface)
 
        mdelay(100);
 
-       ret = ath9k_htc_resume(hif_dev->htc_handle);
+       ret = ath9k_htc_resume(htc_handle);
 
        if (ret)
                goto fail_resume;
index db00289103fcb34ce79bfcee65afe257ab5e6e31..afe39a911906d4e5546a02fc90a36f77d5f26dce 100644 (file)
@@ -461,7 +461,7 @@ void ath9k_init_leds(struct ath9k_htc_priv *priv);
 void ath9k_deinit_leds(struct ath9k_htc_priv *priv);
 
 int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev,
-                          u16 devid, char *product);
+                          u16 devid, char *product, u32 drv_info);
 void ath9k_htc_disconnect_device(struct htc_target *htc_handle, bool hotunplug);
 #ifdef CONFIG_PM
 int ath9k_htc_resume(struct htc_target *htc_handle);
index cba904a3e320757978ab13253af264d57fed7d23..071d0c9747477913e4f8f5abb84fa772fb8ea299 100644 (file)
@@ -181,7 +181,8 @@ 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, u16 devid)
+static int ath9k_init_htc_services(struct ath9k_htc_priv *priv, u16 devid,
+                                  u32 drv_info)
 {
        int ret;
 
@@ -245,17 +246,10 @@ static int ath9k_init_htc_services(struct ath9k_htc_priv *priv, u16 devid)
         * the HIF layer, shouldn't matter much.
         */
 
-       switch(devid) {
-       case 0x7010:
-       case 0x7015:
-       case 0x9018:
-       case 0xA704:
-       case 0x1200:
+       if (drv_info & AR7010_DEVICE)
                priv->htc->credits = 45;
-               break;
-       default:
+       else
                priv->htc->credits = 33;
-       }
 
        ret = htc_init(priv->htc);
        if (ret)
@@ -627,7 +621,8 @@ static void ath9k_init_btcoex(struct ath9k_htc_priv *priv)
 }
 
 static int ath9k_init_priv(struct ath9k_htc_priv *priv,
-                          u16 devid, char *product)
+                          u16 devid, char *product,
+                          u32 drv_info)
 {
        struct ath_hw *ah = NULL;
        struct ath_common *common;
@@ -651,6 +646,7 @@ static int ath9k_init_priv(struct ath9k_htc_priv *priv,
        common->hw = priv->hw;
        common->priv = priv;
        common->debug_mask = ath9k_debug;
+       common->driver_info = drv_info;
 
        spin_lock_init(&priv->wmi->wmi_lock);
        spin_lock_init(&priv->beacon_lock);
@@ -763,7 +759,7 @@ static void ath9k_set_hw_capab(struct ath9k_htc_priv *priv,
 }
 
 static int ath9k_init_device(struct ath9k_htc_priv *priv,
-                            u16 devid, char *product)
+                            u16 devid, char *product, u32 drv_info)
 {
        struct ieee80211_hw *hw = priv->hw;
        struct ath_common *common;
@@ -772,7 +768,7 @@ static int ath9k_init_device(struct ath9k_htc_priv *priv,
        struct ath_regulatory *reg;
 
        /* Bring up device */
-       error = ath9k_init_priv(priv, devid, product);
+       error = ath9k_init_priv(priv, devid, product, drv_info);
        if (error != 0)
                goto err_init;
 
@@ -830,7 +826,7 @@ err_init:
 }
 
 int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev,
-                          u16 devid, char *product)
+                          u16 devid, char *product, u32 drv_info)
 {
        struct ieee80211_hw *hw;
        struct ath9k_htc_priv *priv;
@@ -857,14 +853,14 @@ int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev,
                goto err_free;
        }
 
-       ret = ath9k_init_htc_services(priv, devid);
+       ret = ath9k_init_htc_services(priv, devid, drv_info);
        if (ret)
                goto err_init;
 
        /* The device may have been unplugged earlier. */
        priv->op_flags &= ~OP_UNPLUGGED;
 
-       ret = ath9k_init_device(priv, devid, product);
+       ret = ath9k_init_device(priv, devid, product, drv_info);
        if (ret)
                goto err_init;
 
@@ -894,14 +890,15 @@ void ath9k_htc_disconnect_device(struct htc_target *htc_handle, bool hotunplug)
 #ifdef CONFIG_PM
 int ath9k_htc_resume(struct htc_target *htc_handle)
 {
+       struct ath9k_htc_priv *priv = htc_handle->drv_priv;
        int ret;
 
-       ret = ath9k_htc_wait_for_target(htc_handle->drv_priv);
+       ret = ath9k_htc_wait_for_target(priv);
        if (ret)
                return ret;
 
-       ret = ath9k_init_htc_services(htc_handle->drv_priv,
-                             htc_handle->drv_priv->ah->hw_version.devid);
+       ret = ath9k_init_htc_services(priv, priv->ah->hw_version.devid,
+                                     priv->ah->common.driver_info);
        return ret;
 }
 #endif
index 861ec92693096d07bfca64d4a16e0076fa390ce6..c41ab8c301617d11279c7f1bf4f6739aa5216e1d 100644 (file)
@@ -462,9 +462,10 @@ void ath9k_htc_hw_free(struct htc_target *htc)
 }
 
 int ath9k_htc_hw_init(struct htc_target *target,
-                     struct device *dev, u16 devid, char *product)
+                     struct device *dev, u16 devid,
+                     char *product, u32 drv_info)
 {
-       if (ath9k_htc_probe_device(target, dev, devid, product)) {
+       if (ath9k_htc_probe_device(target, dev, devid, product, drv_info)) {
                printk(KERN_ERR "Failed to initialize the device\n");
                return -ENODEV;
        }
index 07b6509d58964681a141c92266fa5fb9c8a6cfff..6fc1b21faa5db1f3c02fc5a71a6eeec99ce13d4e 100644 (file)
@@ -239,7 +239,8 @@ struct htc_target *ath9k_htc_hw_alloc(void *hif_handle,
                                      struct device *dev);
 void ath9k_htc_hw_free(struct htc_target *htc);
 int ath9k_htc_hw_init(struct htc_target *target,
-                     struct device *dev, u16 devid, char *product);
+                     struct device *dev, u16 devid, char *product,
+                     u32 drv_info);
 void ath9k_htc_hw_deinit(struct htc_target *target, bool hot_unplug);
 
 #endif /* HTC_HST_H */
index 9d68237e4d9c690398b9462f78672fac52f139c6..a597cc8d864472139403516e93f21ed18c7ee442 100644 (file)
      ((REG_READ(_ah, AR_AN_SYNTH9) & 0x7) == 0x1))
 
 #define AR_DEVID_7010(_ah) \
-       (((_ah)->hw_version.devid == 0x7010) || \
-        ((_ah)->hw_version.devid == 0x7015) || \
-        ((_ah)->hw_version.devid == 0x9018) || \
-        ((_ah)->hw_version.devid == 0xA704) || \
-        ((_ah)->hw_version.devid == 0x1200))
+       ((_ah)->common.driver_info & AR7010_DEVICE)
 
 #define AR_RADIO_SREV_MAJOR                   0xf0
 #define AR_RAD5133_SREV_MAJOR                 0xc0