Merge tag 'v4.8-rc1' into patchwork
authorMauro Carvalho Chehab <mchehab@s-opensource.com>
Mon, 8 Aug 2016 10:30:25 +0000 (07:30 -0300)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Mon, 8 Aug 2016 10:30:25 +0000 (07:30 -0300)
Linux 4.8-rc1

* tag 'v4.8-rc1': (6093 commits)
  Linux 4.8-rc1
  block: rename bio bi_rw to bi_opf
  target: iblock_execute_sync_cache() should use bio_set_op_attrs()
  mm: make __swap_writepage() use bio_set_op_attrs()
  block/mm: make bdev_ops->rw_page() take a bool for read/write
  fs: return EPERM on immutable inode
  ramoops: use persistent_ram_free() instead of kfree() for freeing prz
  ramoops: use DT reserved-memory bindings
  NTB: ntb_hw_intel: use local variable pdev
  NTB: ntb_hw_intel: show BAR size in debugfs info
  ntb_test: Add a selftest script for the NTB subsystem
  ntb_perf: clear link_is_up flag when the link goes down.
  ntb_pingpong: Add a debugfs file to get the ping count
  ntb_tool: Add link status and files to debugfs
  ntb_tool: Postpone memory window initialization for the user
  ntb_perf: Wait for link before running test
  ntb_perf: Return results by reading the run file
  ntb_perf: Improve thread handling to increase robustness
  ntb_perf: Schedule based on time not on performance
  ntb_transport: Check the number of spads the hardware supports
  ...

drivers/media/usb/cx231xx/cx231xx-core.c

index 630f4fc..3e304ba 100644 (file)
@@ -799,7 +799,7 @@ static void cx231xx_isoc_irq_callback(struct urb *urb)
        case -ESHUTDOWN:
                return;
        default:                /* error */
-               cx231xx_isocdbg("urb completition error %d.\n", urb->status);
+               cx231xx_isocdbg("urb completion error %d.\n", urb->status);
                break;
        }
 
@@ -842,8 +842,11 @@ static void cx231xx_bulk_irq_callback(struct urb *urb)
        case -ENOENT:
        case -ESHUTDOWN:
                return;
+       case -EPIPE:            /* stall */
+               cx231xx_isocdbg("urb completion error - device is stalled.\n");
+               return;
        default:                /* error */
-               cx231xx_isocdbg("urb completition error %d.\n", urb->status);
+               cx231xx_isocdbg("urb completion error %d.\n", urb->status);
                break;
        }
 
@@ -867,6 +870,7 @@ void cx231xx_uninit_isoc(struct cx231xx *dev)
        struct cx231xx_dmaqueue *dma_q = &dev->video_mode.vidq;
        struct urb *urb;
        int i;
+       bool broken_pipe = false;
 
        cx231xx_isocdbg("cx231xx: called cx231xx_uninit_isoc\n");
 
@@ -886,12 +890,19 @@ void cx231xx_uninit_isoc(struct cx231xx *dev)
                                                  transfer_buffer[i],
                                                  urb->transfer_dma);
                        }
+                       if (urb->status == -EPIPE) {
+                               broken_pipe = true;
+                       }
                        usb_free_urb(urb);
                        dev->video_mode.isoc_ctl.urb[i] = NULL;
                }
                dev->video_mode.isoc_ctl.transfer_buffer[i] = NULL;
        }
 
+       if (broken_pipe) {
+               cx231xx_isocdbg("Reset endpoint to recover broken pipe.");
+               usb_reset_endpoint(dev->udev, dev->video_mode.end_point_addr);
+       }
        kfree(dev->video_mode.isoc_ctl.urb);
        kfree(dev->video_mode.isoc_ctl.transfer_buffer);
        kfree(dma_q->p_left_data);
@@ -918,6 +929,7 @@ void cx231xx_uninit_bulk(struct cx231xx *dev)
        struct cx231xx_dmaqueue *dma_q = &dev->video_mode.vidq;
        struct urb *urb;
        int i;
+       bool broken_pipe = false;
 
        cx231xx_isocdbg("cx231xx: called cx231xx_uninit_bulk\n");
 
@@ -937,12 +949,19 @@ void cx231xx_uninit_bulk(struct cx231xx *dev)
                                                transfer_buffer[i],
                                                urb->transfer_dma);
                        }
+                       if (urb->status == -EPIPE) {
+                               broken_pipe = true;
+                       }
                        usb_free_urb(urb);
                        dev->video_mode.bulk_ctl.urb[i] = NULL;
                }
                dev->video_mode.bulk_ctl.transfer_buffer[i] = NULL;
        }
 
+       if (broken_pipe) {
+               cx231xx_isocdbg("Reset endpoint to recover broken pipe.");
+               usb_reset_endpoint(dev->udev, dev->video_mode.end_point_addr);
+       }
        kfree(dev->video_mode.bulk_ctl.urb);
        kfree(dev->video_mode.bulk_ctl.transfer_buffer);
        kfree(dma_q->p_left_data);