Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2461)

Unified Diff: drivers/net/usb/gobi/qmidevice.c

Issue 6731086: CHROMIUM: gobi: resubmit interrupt urb on failed reads (Closed) Base URL: ssh://gitrw.chromium.org:9222/kernel.git@master
Patch Set: Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: drivers/net/usb/gobi/qmidevice.c
diff --git a/drivers/net/usb/gobi/qmidevice.c b/drivers/net/usb/gobi/qmidevice.c
index 268120dd080d8411049b3d3d92a1bcedec5cb777..be61ddad9f65b555e4c28c746a284a1d2961af31 100644
--- a/drivers/net/usb/gobi/qmidevice.c
+++ b/drivers/net/usb/gobi/qmidevice.c
@@ -68,6 +68,8 @@ static bool client_notify(struct qcusbnet *dev, u16 cid, u16 tid);
static bool client_addurb(struct qcusbnet *dev, u16 cid, struct urb *urb);
static struct urb *client_delurb(struct qcusbnet *dev, u16 cid);
+static int resubmit_int_urb(struct urb *urb);
+
static int devqmi_open(struct inode *inode, struct file *file);
static int devqmi_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg);
static int devqmi_release(struct inode *inode, struct file *file);
@@ -132,6 +134,22 @@ bool qc_isdown(struct qcusbnet *dev, u8 reason)
return test_bit(reason, &dev->down);
}
+static int resubmit_int_urb(struct urb *urb)
+{
+ int status;
+ int interval;
+ if (!urb || !urb->dev)
+ return -EINVAL;
+ interval = urb->dev->speed == USB_SPEED_HIGH ? 7 : 3;
+ usb_fill_int_urb(urb, urb->dev, urb->pipe, urb->transfer_buffer,
+ urb->transfer_buffer_length, urb->complete,
+ urb->context, interval);
+ status = usb_submit_urb(urb, GFP_ATOMIC);
+ if (status)
+ DBG("status %d", status);
+ return status;
+}
+
static void read_callback(struct urb *urb)
{
struct list_head *node;
@@ -158,6 +176,7 @@ static void read_callback(struct urb *urb)
if (urb->status) {
DBG("Read status = %d\n", urb->status);
+ resubmit_int_urb(dev->qmi.inturb);
return;
}
@@ -173,11 +192,13 @@ static void read_callback(struct urb *urb)
result = qmux_parse(&cid, data, size);
if (result < 0) {
DBG("Read error parsing QMUX %d\n", result);
+ resubmit_int_urb(dev->qmi.inturb);
return;
}
if (size < result + 3) {
DBG("Data buffer too small to parse\n");
+ resubmit_int_urb(dev->qmi.inturb);
return;
}
@@ -197,6 +218,7 @@ static void read_callback(struct urb *urb)
"read will be discarded\n");
kfree(copy);
spin_unlock_irqrestore(&dev->qmi.clients_lock, flags);
+ resubmit_int_urb(dev->qmi.inturb);
return;
}
@@ -211,6 +233,7 @@ static void read_callback(struct urb *urb)
}
spin_unlock_irqrestore(&dev->qmi.clients_lock, flags);
+ resubmit_int_urb(dev->qmi.inturb);
}
static void int_callback(struct urb *urb)
@@ -264,14 +287,7 @@ static void int_callback(struct urb *urb)
}
}
- interval = (dev->usbnet->udev->speed == USB_SPEED_HIGH) ? 7 : 3;
-
- usb_fill_int_urb(urb, urb->dev, urb->pipe, urb->transfer_buffer,
- urb->transfer_buffer_length, urb->complete,
- urb->context, interval);
- status = usb_submit_urb(urb, GFP_ATOMIC);
- if (status)
- DBG("Error re-submitting Int URB %d\n", status);
+ resubmit_int_urb(dev->qmi.inturb);
return;
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698