git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
can: ems_usb: Fix possible tx overflow
[pandora-kernel.git]
/
drivers
/
net
/
can
/
usb
/
ems_usb.c
diff --git
a/drivers/net/can/usb/ems_usb.c
b/drivers/net/can/usb/ems_usb.c
index
a72c7bf
..
3b8c4da
100644
(file)
--- a/
drivers/net/can/usb/ems_usb.c
+++ b/
drivers/net/can/usb/ems_usb.c
@@
-118,6
+118,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
* CPC_MSG_TYPE_CAN_FRAME or CPC_MSG_TYPE_RTR_FRAME or
/*
* CAN-Message representation in a CPC_MSG. Message object type is
* CPC_MSG_TYPE_CAN_FRAME or CPC_MSG_TYPE_RTR_FRAME or
@@
-280,6
+283,11
@@
static void ems_usb_read_interrupt_callback(struct urb *urb)
switch (urb->status) {
case 0:
dev->free_slots = dev->intr_in_buffer[1];
switch (urb->status) {
case 0:
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;
case -ECONNRESET: /* unlink */
break;
case -ECONNRESET: /* unlink */
@@
-535,8
+543,6
@@
static void ems_usb_write_bulk_callback(struct urb *urb)
/* Release context */
context->echo_index = MAX_TX_URBS;
/* Release context */
context->echo_index = MAX_TX_URBS;
- if (netif_queue_stopped(netdev))
- netif_wake_queue(netdev);
}
/*
}
/*
@@
-596,7
+602,7
@@
static int ems_usb_start(struct ems_usb *dev)
int err, i;
dev->intr_in_buffer[0] = 0;
int err, i;
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++) {
struct urb *urb = NULL;
for (i = 0; i < MAX_RX_URBS; i++) {
struct urb *urb = NULL;
@@
-858,7
+864,7
@@
static netdev_tx_t ems_usb_start_xmit(struct sk_buff *skb, struct net_device *ne
/* Slow down tx path */
if (atomic_read(&dev->active_tx_urbs) >= MAX_TX_URBS ||
/* Slow down tx path */
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);
}
}