in usb.c [33:68]
static void gnss_usb_rx_complete(struct urb *urb)
{
struct gnss_usb *gusb = urb->context;
struct gnss_device *gdev = gusb->gdev;
int status = urb->status;
int len;
int ret;
switch (status) {
case 0:
break;
case -ENOENT:
case -ECONNRESET:
case -ESHUTDOWN:
dev_dbg(&gdev->dev, "urb stopped: %d\n", status);
return;
case -EPIPE:
dev_err(&gdev->dev, "urb stopped: %d\n", status);
return;
default:
dev_dbg(&gdev->dev, "nonzero urb status: %d\n", status);
goto resubmit;
}
len = urb->actual_length;
if (len == 0)
goto resubmit;
ret = gnss_insert_raw(gdev, urb->transfer_buffer, len);
if (ret < len)
dev_dbg(&gdev->dev, "dropped %d bytes\n", len - ret);
resubmit:
ret = usb_submit_urb(urb, GFP_ATOMIC);
if (ret && ret != -EPERM && ret != -ENODEV)
dev_err(&gdev->dev, "failed to resubmit urb: %d\n", ret);
}