Skip to content

Commit

Permalink
ath9k_htc: Reorder HTC initialization
Browse files Browse the repository at this point in the history
The HTC state has to be setup before initializing
the target because the ready message could possibly
come before the control endpoints in HTC have been
identified.

Signed-off-by: Sujith <Sujith.Manoharan@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Sujith.Manoharan@atheros.com authored and John W. Linville committed May 12, 2010
1 parent 1d8af8c commit 47fce02
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 34 deletions.
22 changes: 11 additions & 11 deletions drivers/net/wireless/ath/ath9k/hif_usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -859,21 +859,21 @@ static int ath9k_hif_usb_probe(struct usb_interface *interface,
#endif
usb_set_intfdata(interface, hif_dev);

hif_dev->htc_handle = ath9k_htc_hw_alloc(hif_dev, &hif_usb,
&hif_dev->udev->dev);
if (hif_dev->htc_handle == NULL) {
ret = -ENOMEM;
goto err_htc_hw_alloc;
}

ret = ath9k_hif_usb_dev_init(hif_dev, fw_name);
if (ret) {
ret = -EINVAL;
goto err_hif_init_usb;
}

hif_dev->htc_handle = ath9k_htc_hw_alloc(hif_dev);
if (hif_dev->htc_handle == NULL) {
ret = -ENOMEM;
goto err_htc_hw_alloc;
}

ret = ath9k_htc_hw_init(&hif_usb, hif_dev->htc_handle, hif_dev,
&hif_dev->udev->dev, hif_dev->device_id,
ATH9K_HIF_USB);
ret = ath9k_htc_hw_init(hif_dev->htc_handle,
&hif_dev->udev->dev, hif_dev->device_id);
if (ret) {
ret = -EINVAL;
goto err_htc_hw_init;
Expand All @@ -884,10 +884,10 @@ static int ath9k_hif_usb_probe(struct usb_interface *interface,
return 0;

err_htc_hw_init:
ath9k_htc_hw_free(hif_dev->htc_handle);
err_htc_hw_alloc:
ath9k_hif_usb_dev_deinit(hif_dev);
err_hif_init_usb:
ath9k_htc_hw_free(hif_dev->htc_handle);
err_htc_hw_alloc:
usb_set_intfdata(interface, NULL);
kfree(hif_dev);
usb_put_dev(udev);
Expand Down
38 changes: 19 additions & 19 deletions drivers/net/wireless/ath/ath9k/htc_hst.c
Original file line number Diff line number Diff line change
Expand Up @@ -425,29 +425,19 @@ void ath9k_htc_rx_msg(struct htc_target *htc_handle,
}
}

struct htc_target *ath9k_htc_hw_alloc(void *hif_handle)
struct htc_target *ath9k_htc_hw_alloc(void *hif_handle,
struct ath9k_htc_hif *hif,
struct device *dev)
{
struct htc_endpoint *endpoint;
struct htc_target *target;

target = kzalloc(sizeof(struct htc_target), GFP_KERNEL);
if (!target)
if (!target) {
printk(KERN_ERR "Unable to allocate memory for"
"target device\n");

return target;
}

void ath9k_htc_hw_free(struct htc_target *htc)
{
kfree(htc);
}

int ath9k_htc_hw_init(struct ath9k_htc_hif *hif, struct htc_target *target,
void *hif_handle, struct device *dev, u16 devid,
enum ath9k_hif_transports transport)
{
struct htc_endpoint *endpoint;
int err = 0;
return NULL;
}

init_completion(&target->target_wait);
init_completion(&target->cmd_wait);
Expand All @@ -461,8 +451,18 @@ int ath9k_htc_hw_init(struct ath9k_htc_hif *hif, struct htc_target *target,
endpoint->ul_pipeid = hif->control_ul_pipe;
endpoint->dl_pipeid = hif->control_dl_pipe;

err = ath9k_htc_probe_device(target, dev, devid);
if (err) {
return target;
}

void ath9k_htc_hw_free(struct htc_target *htc)
{
kfree(htc);
}

int ath9k_htc_hw_init(struct htc_target *target,
struct device *dev, u16 devid)
{
if (ath9k_htc_probe_device(target, dev, devid)) {
printk(KERN_ERR "Failed to initialize the device\n");
return -ENODEV;
}
Expand Down
9 changes: 5 additions & 4 deletions drivers/net/wireless/ath/ath9k/htc_hst.h
Original file line number Diff line number Diff line change
Expand Up @@ -236,11 +236,12 @@ void ath9k_htc_rx_msg(struct htc_target *htc_handle,
void ath9k_htc_txcompletion_cb(struct htc_target *htc_handle,
struct sk_buff *skb, bool txok);

struct htc_target *ath9k_htc_hw_alloc(void *hif_handle);
struct htc_target *ath9k_htc_hw_alloc(void *hif_handle,
struct ath9k_htc_hif *hif,
struct device *dev);
void ath9k_htc_hw_free(struct htc_target *htc);
int ath9k_htc_hw_init(struct ath9k_htc_hif *hif, struct htc_target *target,
void *hif_handle, struct device *dev, u16 devid,
enum ath9k_hif_transports transport);
int ath9k_htc_hw_init(struct htc_target *target,
struct device *dev, u16 devid);
void ath9k_htc_hw_deinit(struct htc_target *target, bool hot_unplug);

#endif /* HTC_HST_H */

0 comments on commit 47fce02

Please sign in to comment.