2010-04-22 03:43:58

by Sujith

[permalink] [raw]
Subject: [PATCH 7/9] ath9k_htc: Use USB reboot

So, apparently there is a USB reboot command
that the target accepts. Using this instead of
usb_reset_device() fixes the issue of "descriptor read error"
that pops up on repeated load/unload.

Signed-off-by: Sujith <[email protected]>
---
drivers/net/wireless/ath/ath9k/hif_usb.c | 13 ++++++++++++-
1 files changed, 12 insertions(+), 1 deletions(-)

diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c
index cee5feb..ce13e08 100644
--- a/drivers/net/wireless/ath/ath9k/hif_usb.c
+++ b/drivers/net/wireless/ath/ath9k/hif_usb.c
@@ -889,6 +889,17 @@ err_alloc:
return ret;
}

+static void ath9k_hif_usb_reboot(struct usb_device *udev)
+{
+ u32 cmd = 0xffffffff;
+ int ret;
+
+ ret = usb_bulk_msg(udev, usb_sndbulkpipe(udev, USB_REG_OUT_PIPE),
+ &cmd, sizeof(cmd), NULL, HZ);
+ if (ret)
+ dev_err(&udev->dev, "ath9k_htc: USB reboot failed\n");
+}
+
static void ath9k_hif_usb_disconnect(struct usb_interface *interface)
{
struct usb_device *udev = interface_to_usbdev(interface);
@@ -903,7 +914,7 @@ static void ath9k_hif_usb_disconnect(struct usb_interface *interface)
}

if (hif_dev->flags & HIF_USB_START)
- usb_reset_device(udev);
+ ath9k_hif_usb_reboot(udev);

kfree(hif_dev);
dev_info(&udev->dev, "ath9k_htc: USB layer deinitialized\n");
--
1.7.0.5



2010-04-23 04:54:21

by Sujith

[permalink] [raw]
Subject: Re: [PATCH 7/9] ath9k_htc: Use USB reboot

Ming Lei wrote:
> The buffer passed to usb hcd should not be allocated from stack since
> it will be DMAed to usb host controller. The 'cmd' should be allocated by
> kmalloc even though it is only 4byte.

Indeed, I'll send an updated patch.

Sujith

2010-04-22 14:21:09

by Ming Lei

[permalink] [raw]
Subject: Re: [PATCH 7/9] ath9k_htc: Use USB reboot

2010/4/22 Sujith <[email protected]>:
> So, apparently there is a USB reboot command
> that the target accepts. Using this instead of
> usb_reset_device() fixes the issue of "descriptor read error"
> that pops up on repeated load/unload.
>
> Signed-off-by: Sujith <[email protected]>
> ---
> ?drivers/net/wireless/ath/ath9k/hif_usb.c | ? 13 ++++++++++++-
> ?1 files changed, 12 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c
> index cee5feb..ce13e08 100644
> --- a/drivers/net/wireless/ath/ath9k/hif_usb.c
> +++ b/drivers/net/wireless/ath/ath9k/hif_usb.c
> @@ -889,6 +889,17 @@ err_alloc:
> ? ? ? ?return ret;
> ?}
>
> +static void ath9k_hif_usb_reboot(struct usb_device *udev)
> +{
> + ? ? ? u32 cmd = 0xffffffff;
> + ? ? ? int ret;
> +
> + ? ? ? ret = usb_bulk_msg(udev, usb_sndbulkpipe(udev, USB_REG_OUT_PIPE),
> + ? ? ? ? ? ? ? ? ? ? ? ? ?&cmd, sizeof(cmd), NULL, HZ);

The buffer passed to usb hcd should not be allocated from stack since
it will be DMAed to usb host controller. The 'cmd' should be allocated by
kmalloc even though it is only 4byte.


--
Lei Ming