Commit 6f0eefab authored by Wolfgang Grandegger's avatar Wolfgang Grandegger Committed by Greg Kroah-Hartman

can: gs_usb: fix busy loop if no more TX context is available

commit 97819f94 upstream.

If sending messages with no cable connected, it quickly happens that
there is no more TX context available. Then "gs_can_start_xmit()"
returns with "NETDEV_TX_BUSY" and the upper layer does retry
immediately keeping the CPU busy. To fix that issue, I moved
"atomic_dec(&dev->active_tx_urbs)" from "gs_usb_xmit_callback()" to
the TX done handling in "gs_usb_receive_bulk_callback()". Renaming
"active_tx_urbs" to "active_tx_contexts" and moving it into
"gs_[alloc|free]_tx_context()" would also make sense.
Signed-off-by: default avatarWolfgang Grandegger <wg@grandegger.com>
Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent b26fafd3
...@@ -375,6 +375,8 @@ static void gs_usb_receive_bulk_callback(struct urb *urb) ...@@ -375,6 +375,8 @@ static void gs_usb_receive_bulk_callback(struct urb *urb)
gs_free_tx_context(txc); gs_free_tx_context(txc);
atomic_dec(&dev->active_tx_urbs);
netif_wake_queue(netdev); netif_wake_queue(netdev);
} }
...@@ -463,14 +465,6 @@ static void gs_usb_xmit_callback(struct urb *urb) ...@@ -463,14 +465,6 @@ static void gs_usb_xmit_callback(struct urb *urb)
urb->transfer_buffer_length, urb->transfer_buffer_length,
urb->transfer_buffer, urb->transfer_buffer,
urb->transfer_dma); urb->transfer_dma);
atomic_dec(&dev->active_tx_urbs);
if (!netif_device_present(netdev))
return;
if (netif_queue_stopped(netdev))
netif_wake_queue(netdev);
} }
static netdev_tx_t gs_can_start_xmit(struct sk_buff *skb, static netdev_tx_t gs_can_start_xmit(struct sk_buff *skb,
......
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