103 lines
3.6 KiB
Diff
103 lines
3.6 KiB
Diff
|
FROM: Solidhal <hal@halemmerich.com>
|
||
|
|
||
|
This patch reverses commit 2b721118b7821107757eb1d37af4b60e877b27e7, as can bee seen here:
|
||
|
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=2b721118b7821107757eb1d37af4b60e877b27e7
|
||
|
|
||
|
This commit caused issues on veyron speedy with ath9k and dwc2 drivers. Any ath9k device (ar9271)
|
||
|
would intermittently work, most of the time ending in errors as can bee seen here:
|
||
|
https://github.com/SolidHal/PrawnOS/issues/38
|
||
|
This commit fixes that issue.
|
||
|
This is only a temporary work around while a permenant fix is found, as this commit seems to only cause issues
|
||
|
with dwc2
|
||
|
|
||
|
|
||
|
diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c
|
||
|
index 3f563e02d..903851481 100644
|
||
|
--- a/drivers/net/wireless/ath/ath9k/hif_usb.c
|
||
|
+++ b/drivers/net/wireless/ath/ath9k/hif_usb.c
|
||
|
@@ -118,10 +118,10 @@ static int hif_usb_send_regout(struct hif_device_usb *hif_dev,
|
||
|
cmd->skb = skb;
|
||
|
cmd->hif_dev = hif_dev;
|
||
|
|
||
|
- usb_fill_int_urb(urb, hif_dev->udev,
|
||
|
- usb_sndintpipe(hif_dev->udev, USB_REG_OUT_PIPE),
|
||
|
+ usb_fill_bulk_urb(urb, hif_dev->udev,
|
||
|
+ usb_sndbulkpipe(hif_dev->udev, USB_REG_OUT_PIPE),
|
||
|
skb->data, skb->len,
|
||
|
- hif_usb_regout_cb, cmd, 1);
|
||
|
+ hif_usb_regout_cb, cmd);
|
||
|
|
||
|
usb_anchor_urb(urb, &hif_dev->regout_submitted);
|
||
|
ret = usb_submit_urb(urb, GFP_KERNEL);
|
||
|
@@ -735,11 +735,11 @@ static void ath9k_hif_usb_reg_in_cb(struct urb *urb)
|
||
|
|
||
|
rx_buf->skb = nskb;
|
||
|
|
||
|
- usb_fill_int_urb(urb, hif_dev->udev,
|
||
|
- usb_rcvintpipe(hif_dev->udev,
|
||
|
+ usb_fill_bulk_urb(urb, hif_dev->udev,
|
||
|
+ usb_rcvbulkpipe(hif_dev->udev,
|
||
|
USB_REG_IN_PIPE),
|
||
|
nskb->data, MAX_REG_IN_BUF_SIZE,
|
||
|
- ath9k_hif_usb_reg_in_cb, rx_buf, 1);
|
||
|
+ ath9k_hif_usb_reg_in_cb, rx_buf);
|
||
|
}
|
||
|
|
||
|
resubmit:
|
||
|
@@ -944,11 +944,11 @@ static int ath9k_hif_usb_alloc_reg_in_urbs(struct hif_device_usb *hif_dev)
|
||
|
rx_buf->hif_dev = hif_dev;
|
||
|
rx_buf->skb = skb;
|
||
|
|
||
|
- usb_fill_int_urb(urb, hif_dev->udev,
|
||
|
- usb_rcvintpipe(hif_dev->udev,
|
||
|
+ usb_fill_bulk_urb(urb, hif_dev->udev,
|
||
|
+ usb_rcvbulkpipe(hif_dev->udev,
|
||
|
USB_REG_IN_PIPE),
|
||
|
skb->data, MAX_REG_IN_BUF_SIZE,
|
||
|
- ath9k_hif_usb_reg_in_cb, rx_buf, 1);
|
||
|
+ ath9k_hif_usb_reg_in_cb, skb);
|
||
|
|
||
|
/* Anchor URB */
|
||
|
usb_anchor_urb(urb, &hif_dev->reg_in_submitted);
|
||
|
@@ -1069,7 +1069,9 @@ static int ath9k_hif_usb_download_fw(struct hif_device_usb *hif_dev)
|
||
|
|
||
|
static int ath9k_hif_usb_dev_init(struct hif_device_usb *hif_dev)
|
||
|
{
|
||
|
- int ret;
|
||
|
+ struct usb_host_interface *alt = &hif_dev->interface->altsetting[0];
|
||
|
+ struct usb_endpoint_descriptor *endp;
|
||
|
+ int ret, idx;
|
||
|
|
||
|
ret = ath9k_hif_usb_download_fw(hif_dev);
|
||
|
if (ret) {
|
||
|
@@ -1079,6 +1081,20 @@ static int ath9k_hif_usb_dev_init(struct hif_device_usb *hif_dev)
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
+ /* On downloading the firmware to the target, the USB descriptor of EP4
|
||
|
+ * is 'patched' to change the type of the endpoint to Bulk. This will
|
||
|
+ * bring down CPU usage during the scan period.
|
||
|
+ */
|
||
|
+ for (idx = 0; idx < alt->desc.bNumEndpoints; idx++) {
|
||
|
+ endp = &alt->endpoint[idx].desc;
|
||
|
+ if ((endp->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
|
||
|
+ == USB_ENDPOINT_XFER_INT) {
|
||
|
+ endp->bmAttributes &= ~USB_ENDPOINT_XFERTYPE_MASK;
|
||
|
+ endp->bmAttributes |= USB_ENDPOINT_XFER_BULK;
|
||
|
+ endp->bInterval = 0;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
/* Alloc URBs */
|
||
|
ret = ath9k_hif_usb_alloc_urbs(hif_dev);
|
||
|
if (ret) {
|
||
|
@@ -1353,7 +1369,7 @@ static void ath9k_hif_usb_reboot(struct usb_device *udev)
|
||
|
if (!buf)
|
||
|
return;
|
||
|
|
||
|
- ret = usb_interrupt_msg(udev, usb_sndintpipe(udev, USB_REG_OUT_PIPE),
|
||
|
+ ret = usb_bulk_msg(udev, usb_sndbulkpipe(udev, USB_REG_OUT_PIPE),
|
||
|
buf, 4, NULL, USB_MSG_TIMEOUT);
|
||
|
if (ret)
|
||
|
dev_err(&udev->dev, "ath9k_htc: USB reboot failed\n");
|