Am 11.10.2017 um 20:17 schrieb M D: > Hi, > My system details are as follows > > Hardware: > CPU : ARM based platform, imx21 > USB : USB Host Controller 1.1 Full Speed > Mode > > Software: > Firmware : /lib/firmware/htc_9271.fw > (version 1.3 / version 1.4) > Device Driver : Backports (v3.12.8-1) > OS : Linux Kernel 3.0.101, ARM > Freescale IMX21ADS
Heh... I doubt this configuration can be more exotic :D
> Problem Statement:
>
> - The WiFi adapter is connected directly to the USB Port and is
> configured in Full Speed mode
> - After it is plugged in, it is enumerated on the Bus (that is,
> executing the instruction lsusb shows the vendor and product
> information)
> - After repeated reboots, after one random reboot the issue
> occurs. (usually 1 out of 5 times) the wlan0 node does not come up
> - When the issue occurs the following details below describe
> the issue at best
>
>
> 1) The adapter is visible on the USB bus (adapter gets enumerated)
> 2) The required modules are loaded
> 3) However the wireless networking node, wlan0 does not come up
> 4) One of the threads created during the init goes into a D state
>
> root 1024 0.0 0.0 0 0 ? D 11:06 0:00
> [firmware/htc_92]
>
> In the file drivers/net/wireless/ath/ath9k/hif_usb.c
> [
>
> hif_usb.c
> ...
>
> ret = request_firmware_nowait(THIS_MODULE, true, hif_dev->fw_name,
> &hif_dev->udev->dev, GFP_KERNEL,
> hif_dev, ath9k_hif_usb_firmware_cb);
>
>
> compat_firmware_class.c
> ...
> task = kthread_run(request_firmware_work_func, fw_work,
> "firmware/%s", name);
> ]
>
>
> 5) This is recoverable only after manually unplugging out the Adapter.
>
> ROOT CAUSE OF THE ISSUE:
> 6) The underlying cause is due to the wifi adapter being configured in
> FULL SPEED mode. Due to this the endpoints 3 and 4 get configured as
> BULK and not INT.
>
>
> After some investigation, I made the following changes which helps to
> recover the adapter when the issue occurs,
>
> ---
> ../original-backports/backports-3.12.8-1/drivers/net/wireless/ath/ath9k/hif_usb.c
> 2017-10-11 10:50:05.043241000 -0700
> +++ drivers/net/wireless/ath/ath9k/hif_usb.c 2017-10-11
> 10:50:03.154255000 -0700
> @@ -24,6 +24,8 @@
> MODULE_FIRMWARE(FIRMWARE_AR7010_1_1);
> MODULE_FIRMWARE(FIRMWARE_AR9271);
>
> +static void ath9k_hif_usb_reboot(struct usb_device *udev);
> +
>
> @@ -1189,7 +1193,12 @@
> {
> struct usb_device *udev = interface_to_usbdev(interface);
> struct hif_device_usb *hif_dev;
> - int ret = 0;
> +
> + struct usb_host_interface *alt ;
> + struct usb_endpoint_descriptor *endp;
> +
> + int ret;
> + int idx, EP = 0;
>
> if (id->driver_info == STORAGE_DEVICE)
> return send_eject_command(interface);
> @@ -1212,6 +1221,44 @@
>
> init_completion(&hif_dev->fw_done);
>
> + alt = &hif_dev->interface->altsetting[0];
> +
> +
> + for (idx = 0; idx < alt->desc.bNumEndpoints; idx++) {
> + endp = &alt->endpoint[idx].desc;
> + EP = idx + 1;
> + printk (KERN_ALERT "EndPoint %d is conf as %d\n", EP,
> (endp->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK));
> + /* First FIX EP3. EP3 should never show up as BULK.
> + If it does we have a serious problem.
> + */
> +
> + if (endp->bEndpointAddress==0x83){
> + if ((endp->bmAttributes &
> USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK) {
> + endp->bmAttributes |= USB_ENDPOINT_XFER_INT;
> + endp->bInterval = 1;
> + ath9k_hif_usb_reboot(hif_dev->udev);
> + mdelay(1000);
> + ret = usb_reset_device(hif_dev->udev);
> + mdelay(1000);
> + if (ret)
> + return ret;
> + }
> + }
> +
> + if (endp->bEndpointAddress==0x04){
> + if ((endp->bmAttributes &
> USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK) {
> + endp->bmAttributes |= USB_ENDPOINT_XFER_INT;
> + endp->bInterval = 1;
> + ath9k_hif_usb_reboot(hif_dev->udev);
> + mdelay(1000);
> + ret = usb_reset_device(hif_dev->udev);
> + mdelay(1000);
> + if (ret)
> + return ret;
> + }
> + }
> + }
> +
> /* Find out which firmware to load */
>
> if (IS_AR7010_DEVICE(id->driver_info))
>
>
>
> I see the following output in dmesg
>
> EndPoint 1 is conf as 2
> EndPoint 2 is conf as 2
> EndPoint 3 is conf as 2
> usb 1-2: reset full speed USB device number 2 using imx21-hcd
> usb 1-2: device firmware changed
> usb 1-2: USB disconnect, device number 2
> usbcore: registered new interface driver ath9k_htc
> usb 1-2: new full speed USB device number 3 using imx21-hcd
> EndPoint 1 is conf as 2
> EndPoint 2 is conf as 2
> EndPoint 3 is conf as 3
> EndPoint 4 is conf as 2
> usb 1-2: reset full speed USB device number 3 using imx21-hcd
> EndPoint 5 is conf as 2
> EndPoint 6 is conf as 2
> usb 1-2: ath9k_htc: Firmware htc_9271.fw requested
> usb 1-2: ath9k_htc: Transferred FW: htc_9271.fw, size: 51272
> ath9k_htc 1-2:1.0: ath9k_htc: HTC initialized with 33 credits
> ath9k_htc 1-2:1.0: ath9k_htc: FW Version: 1.3
> Completed ath9k_init_firmware_version
> ath: EEPROM regdomain: 0x809c
> ath: EEPROM indicates we should expect a country code
> ath: doing EEPROM country->regdmn map search
> ath: country maps to regdmn code: 0x52
> ath: Country alpha2 being used: CN
> ath: Regpair used: 0x52
> ath9k_hw_set_reset_reg: 1
> ieee80211 phy0: Atheros AR9271 Rev:1
> Registered led device: ath9k_htc-phy0
>
> These code changes help to reconfigure the WiFi adapter many times.
> However at some point of reboot (say 30th reboot), I see
>
> usb 1-2: device descriptor read/64, error -110
> hub 1-0:1.0: unable to enumerate USB device on port 2
>
> When this happens, the only way to recover is to manually unplug the
> adapter from the USB port.
>
> Could anyone offer any suggestions as to how to overcome this problem?
> The issue occurs with both v1.3 and v1.4 htc_9271.fw.
I fear, you should debuge it:
- attach uart on TL-721N to get some debug information from firmware
- use usb analizer to see what is going on with usb traffic.
--
Regards,
Oleksij
signature.asc
Description: OpenPGP digital signature
