Commit fa6e15e0 authored by Rajkumar Manoharan's avatar Rajkumar Manoharan Committed by John W. Linville

ath9k_htc: Identify devices using driver_info

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: default avatarRajkumar Manoharan <rmanoharan@atheros.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent f7ec8fb4
...@@ -786,7 +786,8 @@ static void ath9k_hif_usb_dealloc_urbs(struct hif_device_usb *hif_dev) ...@@ -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); 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; int transfer, err;
const void *data = hif_dev->firmware->data; const void *data = hif_dev->firmware->data;
...@@ -817,18 +818,10 @@ static int ath9k_hif_usb_download_fw(struct hif_device_usb *hif_dev) ...@@ -817,18 +818,10 @@ static int ath9k_hif_usb_download_fw(struct hif_device_usb *hif_dev)
} }
kfree(buf); kfree(buf);
switch (hif_dev->device_id) { if (drv_info & AR7010_DEVICE)
case 0x7010:
case 0x7015:
case 0x9018:
case 0xA704:
case 0x1200:
firm_offset = AR7010_FIRMWARE_TEXT; firm_offset = AR7010_FIRMWARE_TEXT;
break; else
default:
firm_offset = AR9271_FIRMWARE_TEXT; firm_offset = AR9271_FIRMWARE_TEXT;
break;
}
/* /*
* Issue FW download complete command to firmware. * Issue FW download complete command to firmware.
...@@ -846,7 +839,7 @@ static int ath9k_hif_usb_download_fw(struct hif_device_usb *hif_dev) ...@@ -846,7 +839,7 @@ static int ath9k_hif_usb_download_fw(struct hif_device_usb *hif_dev)
return 0; 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; int ret, idx;
struct usb_host_interface *alt = &hif_dev->interface->altsetting[0]; 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) ...@@ -862,7 +855,7 @@ static int ath9k_hif_usb_dev_init(struct hif_device_usb *hif_dev)
} }
/* Download firmware */ /* Download firmware */
ret = ath9k_hif_usb_download_fw(hif_dev); ret = ath9k_hif_usb_download_fw(hif_dev, drv_info);
if (ret) { if (ret) {
dev_err(&hif_dev->udev->dev, dev_err(&hif_dev->udev->dev,
"ath9k_htc: Firmware - %s download failed\n", "ath9k_htc: Firmware - %s download failed\n",
...@@ -941,23 +934,15 @@ static int ath9k_hif_usb_probe(struct usb_interface *interface, ...@@ -941,23 +934,15 @@ static int ath9k_hif_usb_probe(struct usb_interface *interface,
/* Find out which firmware to load */ /* Find out which firmware to load */
switch(hif_dev->device_id) { if (id->driver_info & AR7010_DEVICE)
case 0x7010:
case 0x7015:
case 0x9018:
case 0xA704:
case 0x1200:
if (le16_to_cpu(udev->descriptor.bcdDevice) == 0x0202) if (le16_to_cpu(udev->descriptor.bcdDevice) == 0x0202)
hif_dev->fw_name = FIRMWARE_AR7010_1_1; hif_dev->fw_name = FIRMWARE_AR7010_1_1;
else else
hif_dev->fw_name = FIRMWARE_AR7010; hif_dev->fw_name = FIRMWARE_AR7010;
break; else
default:
hif_dev->fw_name = FIRMWARE_AR9271; 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) { if (ret) {
ret = -EINVAL; ret = -EINVAL;
goto err_hif_init_usb; goto err_hif_init_usb;
...@@ -965,7 +950,7 @@ static int ath9k_hif_usb_probe(struct usb_interface *interface, ...@@ -965,7 +950,7 @@ static int ath9k_hif_usb_probe(struct usb_interface *interface,
ret = ath9k_htc_hw_init(hif_dev->htc_handle, ret = ath9k_htc_hw_init(hif_dev->htc_handle,
&hif_dev->udev->dev, hif_dev->device_id, &hif_dev->udev->dev, hif_dev->device_id,
hif_dev->udev->product); hif_dev->udev->product, id->driver_info);
if (ret) { if (ret) {
ret = -EINVAL; ret = -EINVAL;
goto err_htc_hw_init; goto err_htc_hw_init;
...@@ -1043,6 +1028,7 @@ static int ath9k_hif_usb_resume(struct usb_interface *interface) ...@@ -1043,6 +1028,7 @@ static int ath9k_hif_usb_resume(struct usb_interface *interface)
{ {
struct hif_device_usb *hif_dev = struct hif_device_usb *hif_dev =
(struct hif_device_usb *) usb_get_intfdata(interface); (struct hif_device_usb *) usb_get_intfdata(interface);
struct htc_target *htc_handle = hif_dev->htc_handle;
int ret; int ret;
ret = ath9k_hif_usb_alloc_urbs(hif_dev); ret = ath9k_hif_usb_alloc_urbs(hif_dev);
...@@ -1050,7 +1036,8 @@ static int ath9k_hif_usb_resume(struct usb_interface *interface) ...@@ -1050,7 +1036,8 @@ static int ath9k_hif_usb_resume(struct usb_interface *interface)
return ret; return ret;
if (hif_dev->firmware) { 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) if (ret)
goto fail_resume; goto fail_resume;
} else { } else {
...@@ -1060,7 +1047,7 @@ static int ath9k_hif_usb_resume(struct usb_interface *interface) ...@@ -1060,7 +1047,7 @@ static int ath9k_hif_usb_resume(struct usb_interface *interface)
mdelay(100); mdelay(100);
ret = ath9k_htc_resume(hif_dev->htc_handle); ret = ath9k_htc_resume(htc_handle);
if (ret) if (ret)
goto fail_resume; goto fail_resume;
......
...@@ -461,7 +461,7 @@ void ath9k_init_leds(struct ath9k_htc_priv *priv); ...@@ -461,7 +461,7 @@ void ath9k_init_leds(struct ath9k_htc_priv *priv);
void ath9k_deinit_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, 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); void ath9k_htc_disconnect_device(struct htc_target *htc_handle, bool hotunplug);
#ifdef CONFIG_PM #ifdef CONFIG_PM
int ath9k_htc_resume(struct htc_target *htc_handle); int ath9k_htc_resume(struct htc_target *htc_handle);
......
...@@ -181,7 +181,8 @@ static inline int ath9k_htc_connect_svc(struct ath9k_htc_priv *priv, ...@@ -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); 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; int ret;
...@@ -245,17 +246,10 @@ static int ath9k_init_htc_services(struct ath9k_htc_priv *priv, u16 devid) ...@@ -245,17 +246,10 @@ static int ath9k_init_htc_services(struct ath9k_htc_priv *priv, u16 devid)
* the HIF layer, shouldn't matter much. * the HIF layer, shouldn't matter much.
*/ */
switch(devid) { if (drv_info & AR7010_DEVICE)
case 0x7010:
case 0x7015:
case 0x9018:
case 0xA704:
case 0x1200:
priv->htc->credits = 45; priv->htc->credits = 45;
break; else
default:
priv->htc->credits = 33; priv->htc->credits = 33;
}
ret = htc_init(priv->htc); ret = htc_init(priv->htc);
if (ret) if (ret)
...@@ -627,7 +621,8 @@ static void ath9k_init_btcoex(struct ath9k_htc_priv *priv) ...@@ -627,7 +621,8 @@ static void ath9k_init_btcoex(struct ath9k_htc_priv *priv)
} }
static int ath9k_init_priv(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_hw *ah = NULL;
struct ath_common *common; struct ath_common *common;
...@@ -651,6 +646,7 @@ static int ath9k_init_priv(struct ath9k_htc_priv *priv, ...@@ -651,6 +646,7 @@ static int ath9k_init_priv(struct ath9k_htc_priv *priv,
common->hw = priv->hw; common->hw = priv->hw;
common->priv = priv; common->priv = priv;
common->debug_mask = ath9k_debug; common->debug_mask = ath9k_debug;
common->driver_info = drv_info;
spin_lock_init(&priv->wmi->wmi_lock); spin_lock_init(&priv->wmi->wmi_lock);
spin_lock_init(&priv->beacon_lock); spin_lock_init(&priv->beacon_lock);
...@@ -763,7 +759,7 @@ static void ath9k_set_hw_capab(struct ath9k_htc_priv *priv, ...@@ -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, 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 ieee80211_hw *hw = priv->hw;
struct ath_common *common; struct ath_common *common;
...@@ -772,7 +768,7 @@ static int ath9k_init_device(struct ath9k_htc_priv *priv, ...@@ -772,7 +768,7 @@ static int ath9k_init_device(struct ath9k_htc_priv *priv,
struct ath_regulatory *reg; struct ath_regulatory *reg;
/* Bring up device */ /* Bring up device */
error = ath9k_init_priv(priv, devid, product); error = ath9k_init_priv(priv, devid, product, drv_info);
if (error != 0) if (error != 0)
goto err_init; goto err_init;
...@@ -830,7 +826,7 @@ static int ath9k_init_device(struct ath9k_htc_priv *priv, ...@@ -830,7 +826,7 @@ static int ath9k_init_device(struct ath9k_htc_priv *priv,
} }
int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev, 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 ieee80211_hw *hw;
struct ath9k_htc_priv *priv; struct ath9k_htc_priv *priv;
...@@ -857,14 +853,14 @@ int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev, ...@@ -857,14 +853,14 @@ int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev,
goto err_free; goto err_free;
} }
ret = ath9k_init_htc_services(priv, devid); ret = ath9k_init_htc_services(priv, devid, drv_info);
if (ret) if (ret)
goto err_init; goto err_init;
/* The device may have been unplugged earlier. */ /* The device may have been unplugged earlier. */
priv->op_flags &= ~OP_UNPLUGGED; priv->op_flags &= ~OP_UNPLUGGED;
ret = ath9k_init_device(priv, devid, product); ret = ath9k_init_device(priv, devid, product, drv_info);
if (ret) if (ret)
goto err_init; goto err_init;
...@@ -894,14 +890,15 @@ void ath9k_htc_disconnect_device(struct htc_target *htc_handle, bool hotunplug) ...@@ -894,14 +890,15 @@ void ath9k_htc_disconnect_device(struct htc_target *htc_handle, bool hotunplug)
#ifdef CONFIG_PM #ifdef CONFIG_PM
int ath9k_htc_resume(struct htc_target *htc_handle) int ath9k_htc_resume(struct htc_target *htc_handle)
{ {
struct ath9k_htc_priv *priv = htc_handle->drv_priv;
int ret; int ret;
ret = ath9k_htc_wait_for_target(htc_handle->drv_priv); ret = ath9k_htc_wait_for_target(priv);
if (ret) if (ret)
return ret; return ret;
ret = ath9k_init_htc_services(htc_handle->drv_priv, ret = ath9k_init_htc_services(priv, priv->ah->hw_version.devid,
htc_handle->drv_priv->ah->hw_version.devid); priv->ah->common.driver_info);
return ret; return ret;
} }
#endif #endif
......
...@@ -462,9 +462,10 @@ void ath9k_htc_hw_free(struct htc_target *htc) ...@@ -462,9 +462,10 @@ void ath9k_htc_hw_free(struct htc_target *htc)
} }
int ath9k_htc_hw_init(struct htc_target *target, 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"); printk(KERN_ERR "Failed to initialize the device\n");
return -ENODEV; return -ENODEV;
} }
......
...@@ -239,7 +239,8 @@ struct htc_target *ath9k_htc_hw_alloc(void *hif_handle, ...@@ -239,7 +239,8 @@ struct htc_target *ath9k_htc_hw_alloc(void *hif_handle,
struct device *dev); struct device *dev);
void ath9k_htc_hw_free(struct htc_target *htc); void ath9k_htc_hw_free(struct htc_target *htc);
int ath9k_htc_hw_init(struct htc_target *target, 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); void ath9k_htc_hw_deinit(struct htc_target *target, bool hot_unplug);
#endif /* HTC_HST_H */ #endif /* HTC_HST_H */
...@@ -864,11 +864,7 @@ ...@@ -864,11 +864,7 @@
((REG_READ(_ah, AR_AN_SYNTH9) & 0x7) == 0x1)) ((REG_READ(_ah, AR_AN_SYNTH9) & 0x7) == 0x1))
#define AR_DEVID_7010(_ah) \ #define AR_DEVID_7010(_ah) \
(((_ah)->hw_version.devid == 0x7010) || \ ((_ah)->common.driver_info & AR7010_DEVICE)
((_ah)->hw_version.devid == 0x7015) || \
((_ah)->hw_version.devid == 0x9018) || \
((_ah)->hw_version.devid == 0xA704) || \
((_ah)->hw_version.devid == 0x1200))
#define AR_RADIO_SREV_MAJOR 0xf0 #define AR_RADIO_SREV_MAJOR 0xf0
#define AR_RAD5133_SREV_MAJOR 0xc0 #define AR_RAD5133_SREV_MAJOR 0xc0
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment