Commit d856626d authored by David S. Miller's avatar David S. Miller

Merge tag 'linux-can-fixes-for-4.5-20160221' of...

Merge tag 'linux-can-fixes-for-4.5-20160221' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can

Marc Kleine-Budde says:

====================
pull-request: can 2016-02-21

this is a pull reqeust of one patch for net/master.

The patch is by Gerhard Uttenthaler and fixes a potential tx overflow in the
ems_usb driver.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents dd78dac8 90cfde46
...@@ -117,6 +117,9 @@ MODULE_LICENSE("GPL v2"); ...@@ -117,6 +117,9 @@ MODULE_LICENSE("GPL v2");
*/ */
#define EMS_USB_ARM7_CLOCK 8000000 #define EMS_USB_ARM7_CLOCK 8000000
#define CPC_TX_QUEUE_TRIGGER_LOW 25
#define CPC_TX_QUEUE_TRIGGER_HIGH 35
/* /*
* CAN-Message representation in a CPC_MSG. Message object type is * CAN-Message representation in a CPC_MSG. Message object type is
* CPC_MSG_TYPE_CAN_FRAME or CPC_MSG_TYPE_RTR_FRAME or * CPC_MSG_TYPE_CAN_FRAME or CPC_MSG_TYPE_RTR_FRAME or
...@@ -278,6 +281,11 @@ static void ems_usb_read_interrupt_callback(struct urb *urb) ...@@ -278,6 +281,11 @@ static void ems_usb_read_interrupt_callback(struct urb *urb)
switch (urb->status) { switch (urb->status) {
case 0: case 0:
dev->free_slots = dev->intr_in_buffer[1]; dev->free_slots = dev->intr_in_buffer[1];
if(dev->free_slots > CPC_TX_QUEUE_TRIGGER_HIGH){
if (netif_queue_stopped(netdev)){
netif_wake_queue(netdev);
}
}
break; break;
case -ECONNRESET: /* unlink */ case -ECONNRESET: /* unlink */
...@@ -526,8 +534,6 @@ static void ems_usb_write_bulk_callback(struct urb *urb) ...@@ -526,8 +534,6 @@ static void ems_usb_write_bulk_callback(struct urb *urb)
/* Release context */ /* Release context */
context->echo_index = MAX_TX_URBS; context->echo_index = MAX_TX_URBS;
if (netif_queue_stopped(netdev))
netif_wake_queue(netdev);
} }
/* /*
...@@ -587,7 +593,7 @@ static int ems_usb_start(struct ems_usb *dev) ...@@ -587,7 +593,7 @@ static int ems_usb_start(struct ems_usb *dev)
int err, i; int err, i;
dev->intr_in_buffer[0] = 0; dev->intr_in_buffer[0] = 0;
dev->free_slots = 15; /* initial size */ dev->free_slots = 50; /* initial size */
for (i = 0; i < MAX_RX_URBS; i++) { for (i = 0; i < MAX_RX_URBS; i++) {
struct urb *urb = NULL; struct urb *urb = NULL;
...@@ -835,7 +841,7 @@ static netdev_tx_t ems_usb_start_xmit(struct sk_buff *skb, struct net_device *ne ...@@ -835,7 +841,7 @@ static netdev_tx_t ems_usb_start_xmit(struct sk_buff *skb, struct net_device *ne
/* Slow down tx path */ /* Slow down tx path */
if (atomic_read(&dev->active_tx_urbs) >= MAX_TX_URBS || if (atomic_read(&dev->active_tx_urbs) >= MAX_TX_URBS ||
dev->free_slots < 5) { dev->free_slots < CPC_TX_QUEUE_TRIGGER_LOW) {
netif_stop_queue(netdev); netif_stop_queue(netdev);
} }
} }
......
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