Merge 3.6-rc6 into usb-next
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 17 Sep 2012 03:42:46 +0000 (20:42 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 17 Sep 2012 03:42:46 +0000 (20:42 -0700)
This resolves the merge problems with:
drivers/usb/dwc3/gadget.c
drivers/usb/musb/tusb6010.c
that had been seen in linux-next.

Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
17 files changed:
1  2 
Documentation/feature-removal-schedule.txt
arch/arm/mach-omap2/board-omap3evm.c
arch/arm/mach-omap2/omap_hwmod_44xx_data.c
arch/arm/mach-omap2/twl-common.c
drivers/usb/core/quirks.c
drivers/usb/dwc3/core.c
drivers/usb/dwc3/ep0.c
drivers/usb/dwc3/gadget.c
drivers/usb/gadget/at91_udc.c
drivers/usb/gadget/dummy_hcd.c
drivers/usb/host/xhci-hub.c
drivers/usb/host/xhci.c
drivers/usb/host/xhci.h
drivers/usb/musb/musb_host.c
drivers/usb/musb/musbhsdma.c
drivers/usb/serial/ftdi_sio.c
drivers/usb/serial/option.c

index b9aa38bca04cf2fa6fbb9273c8eb7992b08f269c,f4d8c7105fcdd2e07af12d61154d9fb07c772f15..32de36c3def1bd641e3181c551f00d118a9354a4
@@@ -495,6 -495,17 +495,6 @@@ Who:      Bjorn Helgaas <bhelgaas@google.com
  
  ----------------------------
  
 -What: Low Performance USB Block driver ("CONFIG_BLK_DEV_UB")
 -When: 3.6
 -Why:  This driver provides support for USB storage devices like "USB
 -      sticks". As of now, it is deactivated in Debian, Fedora and
 -        Ubuntu. All current users can switch over to usb-storage
 -        (CONFIG_USB_STORAGE) which only drawback is the additional SCSI
 -        stack.
 -Who:  Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
 -
 -----------------------------
 -
  What: get_robust_list syscall
  When: 2013
  Why:  There appear to be no production users of the get_robust_list syscall,
@@@ -568,7 -579,7 +568,7 @@@ Why:       KVM tracepoints provide mostly equ
  ----------------------------
  
  What: at91-mci driver ("CONFIG_MMC_AT91")
- When: 3.7
+ When: 3.8
  Why:  There are two mci drivers: at91-mci and atmel-mci. The PDC support
        was added to atmel-mci as a first step to support more chips.
        Then at91-mci was kept only for old IP versions (on at91rm9200 and
index 9894e3df49c20aa9091b582d9ca93b153b1e40fd,0d362e9f9cb9a9854c32b378c5dd058f2f785327..3d2a988e3d9a0c61cfe7a3a94835e90380047f0e
@@@ -32,7 -32,6 +32,7 @@@
  #include <linux/spi/ads7846.h>
  #include <linux/i2c/twl.h>
  #include <linux/usb/otg.h>
 +#include <linux/usb/nop-usb-xceiv.h>
  #include <linux/smsc911x.h>
  
  #include <linux/wl12xx.h>
@@@ -59,6 -58,7 +59,7 @@@
  #include "hsmmc.h"
  #include "common-board-devices.h"
  
+ #define OMAP3_EVM_TS_GPIO     175
  #define OMAP3_EVM_EHCI_VBUS   22
  #define OMAP3_EVM_EHCI_SELECT 61
  
index 3c19120e0cdf0fb28ab19da5066119e7614dc1c5,afb60917a948b64bb3b0ed9b90924facc27fc7f6..64b564f13d5bc15d7c7568d5cd7e7245f987b9ff
@@@ -4210,7 -4210,7 +4210,7 @@@ static struct omap_hwmod_ocp_if omap44x
  };
  
  /* dsp -> sl2if */
- static struct omap_hwmod_ocp_if omap44xx_dsp__sl2if = {
+ static struct omap_hwmod_ocp_if __maybe_unused omap44xx_dsp__sl2if = {
        .master         = &omap44xx_dsp_hwmod,
        .slave          = &omap44xx_sl2if_hwmod,
        .clk            = "dpll_iva_m5x2_ck",
@@@ -4828,7 -4828,7 +4828,7 @@@ static struct omap_hwmod_ocp_if omap44x
  };
  
  /* iva -> sl2if */
- static struct omap_hwmod_ocp_if omap44xx_iva__sl2if = {
+ static struct omap_hwmod_ocp_if __maybe_unused omap44xx_iva__sl2if = {
        .master         = &omap44xx_iva_hwmod,
        .slave          = &omap44xx_sl2if_hwmod,
        .clk            = "dpll_iva_m5x2_ck",
@@@ -5362,7 -5362,7 +5362,7 @@@ static struct omap_hwmod_ocp_if omap44x
  };
  
  /* l3_main_2 -> sl2if */
- static struct omap_hwmod_ocp_if omap44xx_l3_main_2__sl2if = {
+ static struct omap_hwmod_ocp_if __maybe_unused omap44xx_l3_main_2__sl2if = {
        .master         = &omap44xx_l3_main_2_hwmod,
        .slave          = &omap44xx_sl2if_hwmod,
        .clk            = "l3_div_ck",
@@@ -5890,12 -5890,6 +5890,12 @@@ static struct omap_hwmod_addr_space oma
                .pa_end         = 0x4a0ab003,
                .flags          = ADDR_TYPE_RT
        },
 +      {
 +              /* XXX: Remove this once control module driver is in place */
 +              .pa_start       = 0x4a00233c,
 +              .pa_end         = 0x4a00233f,
 +              .flags          = ADDR_TYPE_RT
 +      },
        { }
  };
  
@@@ -6038,7 -6032,7 +6038,7 @@@ static struct omap_hwmod_ocp_if *omap44
        &omap44xx_l4_abe__dmic,
        &omap44xx_l4_abe__dmic_dma,
        &omap44xx_dsp__iva,
-       &omap44xx_dsp__sl2if,
+       /* &omap44xx_dsp__sl2if, */
        &omap44xx_l4_cfg__dsp,
        &omap44xx_l3_main_2__dss,
        &omap44xx_l4_per__dss,
        &omap44xx_l4_per__i2c4,
        &omap44xx_l3_main_2__ipu,
        &omap44xx_l3_main_2__iss,
-       &omap44xx_iva__sl2if,
+       /* &omap44xx_iva__sl2if, */
        &omap44xx_l3_main_2__iva,
        &omap44xx_l4_wkup__kbd,
        &omap44xx_l4_cfg__mailbox,
        &omap44xx_l4_cfg__cm_core,
        &omap44xx_l4_wkup__prm,
        &omap44xx_l4_wkup__scrm,
-       &omap44xx_l3_main_2__sl2if,
+       /* &omap44xx_l3_main_2__sl2if, */
        &omap44xx_l4_abe__slimbus1,
        &omap44xx_l4_abe__slimbus1_dma,
        &omap44xx_l4_per__slimbus2,
index e2cdf67f4b8fff761c8f6fe02e92732bb6e8b0ef,db5ff664237517562766ffdbc34887c6416c272f..329b726012f3d01fc3483254785c209f284c8cf8
@@@ -67,6 -67,7 +67,7 @@@ void __init omap_pmic_init(int bus, u3
                           const char *pmic_type, int pmic_irq,
                           struct twl4030_platform_data *pmic_data)
  {
+       omap_mux_init_signal("sys_nirq", OMAP_PIN_INPUT_PULLUP | OMAP_PIN_OFF_WAKEUPENABLE);
        strncpy(pmic_i2c_board_info.type, pmic_type,
                sizeof(pmic_i2c_board_info.type));
        pmic_i2c_board_info.irq = pmic_irq;
@@@ -250,6 -251,11 +251,6 @@@ void __init omap3_pmic_get_config(struc
  
  #if defined(CONFIG_ARCH_OMAP4)
  static struct twl4030_usb_data omap4_usb_pdata = {
 -      .phy_init       = omap4430_phy_init,
 -      .phy_exit       = omap4430_phy_exit,
 -      .phy_power      = omap4430_phy_power,
 -      .phy_set_clock  = omap4430_phy_set_clk,
 -      .phy_suspend    = omap4430_phy_suspend,
  };
  
  static struct regulator_init_data omap4_vdac_idata = {
index 2dbb5154f356b01baf3a8f9da9f1aa855e2ad11f,e77a8e8eaa233b9b4febd38ef8c01ace8ac832a5..fdefd9c7f7af089e54428b57625d394c70566561
@@@ -71,6 -71,10 +71,10 @@@ static const struct usb_device_id usb_q
        { USB_DEVICE(0x04b4, 0x0526), .driver_info =
                        USB_QUIRK_CONFIG_INTF_STRINGS },
  
+       /* Microchip Joss Optical infrared touchboard device */
+       { USB_DEVICE(0x04d8, 0x000c), .driver_info =
+                       USB_QUIRK_CONFIG_INTF_STRINGS },
        /* Samsung Android phone modem - ID conflict with SPH-I500 */
        { USB_DEVICE(0x04e8, 0x6601), .driver_info =
                        USB_QUIRK_CONFIG_INTF_STRINGS },
@@@ -205,7 -209,7 +209,7 @@@ void usb_detect_quirks(struct usb_devic
         * for all devices.  It will affect things like hub resets
         * and EMF-related port disables.
         */
 -      if (!(udev->quirks & USB_QUIRK_RESET_MORPHS))
 +      if (!(udev->quirks & USB_QUIRK_RESET))
                udev->persist_enabled = 1;
  #endif        /* CONFIG_PM */
  }
diff --combined drivers/usb/dwc3/core.c
index bed2c1615463782065f2539d6c9c0cf0fa38e3a8,a68ff53124dc15e88ab3ceaa35e3fbf7e97cc978..b415c0c859d3d2b3e990fc571b57d4e6e88f81fd
@@@ -50,7 -50,6 +50,7 @@@
  #include <linux/dma-mapping.h>
  #include <linux/of.h>
  
 +#include <linux/usb/otg.h>
  #include <linux/usb/ch9.h>
  #include <linux/usb/gadget.h>
  
@@@ -100,7 -99,6 +100,7 @@@ void dwc3_put_device_id(int id
  
        ret = test_bit(id, dwc3_devs);
        WARN(!ret, "dwc3: ID %d not in use\n", id);
 +      smp_mb__before_clear_bit();
        clear_bit(id, dwc3_devs);
  }
  EXPORT_SYMBOL_GPL(dwc3_put_device_id);
@@@ -138,8 -136,6 +138,8 @@@ static void dwc3_core_soft_reset(struc
        reg |= DWC3_GUSB2PHYCFG_PHYSOFTRST;
        dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg);
  
 +      usb_phy_init(dwc->usb2_phy);
 +      usb_phy_init(dwc->usb3_phy);
        mdelay(100);
  
        /* Clear USB3 PHY reset */
@@@ -440,16 -436,21 +440,21 @@@ static int __devinit dwc3_probe(struct 
                dev_err(dev, "missing IRQ\n");
                return -ENODEV;
        }
-       dwc->xhci_resources[1] = *res;
+       dwc->xhci_resources[1].start = res->start;
+       dwc->xhci_resources[1].end = res->end;
+       dwc->xhci_resources[1].flags = res->flags;
+       dwc->xhci_resources[1].name = res->name;
  
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (!res) {
                dev_err(dev, "missing memory resource\n");
                return -ENODEV;
        }
-       dwc->xhci_resources[0] = *res;
+       dwc->xhci_resources[0].start = res->start;
        dwc->xhci_resources[0].end = dwc->xhci_resources[0].start +
                                        DWC3_XHCI_REGS_END;
+       dwc->xhci_resources[0].flags = res->flags;
+       dwc->xhci_resources[0].name = res->name;
  
         /*
          * Request memory region but exclude xHCI regs,
                return -ENOMEM;
        }
  
 -      regs = devm_ioremap(dev, res->start, resource_size(res));
 +      regs = devm_ioremap_nocache(dev, res->start, resource_size(res));
        if (!regs) {
                dev_err(dev, "ioremap failed\n");
                return -ENOMEM;
        }
  
 +      dwc->usb2_phy = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2);
 +      if (IS_ERR_OR_NULL(dwc->usb2_phy)) {
 +              dev_err(dev, "no usb2 phy configured\n");
 +              return -EPROBE_DEFER;
 +      }
 +
 +      dwc->usb3_phy = devm_usb_get_phy(dev, USB_PHY_TYPE_USB3);
 +      if (IS_ERR_OR_NULL(dwc->usb3_phy)) {
 +              dev_err(dev, "no usb3 phy configured\n");
 +              return -EPROBE_DEFER;
 +      }
 +
        spin_lock_init(&dwc->lock);
        platform_set_drvdata(pdev, dwc);
  
diff --combined drivers/usb/dwc3/ep0.c
index 1bba97ba218d7b3fd1e39be7c133a6760aa1d95e,e4d5ca86b9da5413d1c3c52079b4a2abcd9481ad..d7da073a23fee142edc051e562d5cba498c97e63
@@@ -125,6 -125,7 +125,6 @@@ static int __dwc3_gadget_ep0_queue(stru
                struct dwc3_request *req)
  {
        struct dwc3             *dwc = dep->dwc;
 -      int                     ret = 0;
  
        req->request.actual     = 0;
        req->request.status     = -EINPROGRESS;
  
                dep->flags &= ~(DWC3_EP_PENDING_REQUEST |
                                DWC3_EP0_DIR_IN);
 -      } else if (dwc->delayed_status) {
 +
 +              return 0;
 +      }
 +
 +      /*
 +       * In case gadget driver asked us to delay the STATUS phase,
 +       * handle it here.
 +       */
 +      if (dwc->delayed_status) {
 +              unsigned        direction;
 +
 +              direction = !dwc->ep0_expect_in;
                dwc->delayed_status = false;
  
                if (dwc->ep0state == EP0_STATUS_PHASE)
 -                      __dwc3_ep0_do_control_status(dwc, dwc->eps[1]);
 +                      __dwc3_ep0_do_control_status(dwc, dwc->eps[direction]);
                else
                        dev_dbg(dwc->dev, "too early for delayed status\n");
 +
 +              return 0;
        }
  
 -      return ret;
 +      /*
 +       * Unfortunately we have uncovered a limitation wrt the Data Phase.
 +       *
 +       * Section 9.4 says we can wait for the XferNotReady(DATA) event to
 +       * come before issueing Start Transfer command, but if we do, we will
 +       * miss situations where the host starts another SETUP phase instead of
 +       * the DATA phase.  Such cases happen at least on TD.7.6 of the Link
 +       * Layer Compliance Suite.
 +       *
 +       * The problem surfaces due to the fact that in case of back-to-back
 +       * SETUP packets there will be no XferNotReady(DATA) generated and we
 +       * will be stuck waiting for XferNotReady(DATA) forever.
 +       *
 +       * By looking at tables 9-13 and 9-14 of the Databook, we can see that
 +       * it tells us to start Data Phase right away. It also mentions that if
 +       * we receive a SETUP phase instead of the DATA phase, core will issue
 +       * XferComplete for the DATA phase, before actually initiating it in
 +       * the wire, with the TRB's status set to "SETUP_PENDING". Such status
 +       * can only be used to print some debugging logs, as the core expects
 +       * us to go through to the STATUS phase and start a CONTROL_STATUS TRB,
 +       * just so it completes right away, without transferring anything and,
 +       * only then, we can go back to the SETUP phase.
 +       *
 +       * Because of this scenario, SNPS decided to change the programming
 +       * model of control transfers and support on-demand transfers only for
 +       * the STATUS phase. To fix the issue we have now, we will always wait
 +       * for gadget driver to queue the DATA phase's struct usb_request, then
 +       * start it right away.
 +       *
 +       * If we're actually in a 2-stage transfer, we will wait for
 +       * XferNotReady(STATUS).
 +       */
 +      if (dwc->three_stage_setup) {
 +              unsigned        direction;
 +
 +              direction = dwc->ep0_expect_in;
 +              dwc->ep0state = EP0_DATA_PHASE;
 +
 +              __dwc3_ep0_do_control_data(dwc, dwc->eps[direction], req);
 +
 +              dep->flags &= ~DWC3_EP0_DIR_IN;
 +      }
 +
 +      return 0;
  }
  
  int dwc3_gadget_ep0_queue(struct usb_ep *ep, struct usb_request *request,
@@@ -262,14 -207,9 +262,14 @@@ out
  
  static void dwc3_ep0_stall_and_restart(struct dwc3 *dwc)
  {
 -      struct dwc3_ep          *dep = dwc->eps[0];
 +      struct dwc3_ep          *dep;
 +
 +      /* reinitialize physical ep1 */
 +      dep = dwc->eps[1];
 +      dep->flags = DWC3_EP_ENABLED;
  
        /* stall is always issued on EP0 */
 +      dep = dwc->eps[0];
        __dwc3_gadget_ep_set_halt(dep, 1);
        dep->flags = DWC3_EP_ENABLED;
        dwc->delayed_status = false;
@@@ -758,7 -698,6 +758,7 @@@ static void dwc3_ep0_complete_data(stru
        struct dwc3_trb         *trb;
        struct dwc3_ep          *ep0;
        u32                     transferred;
 +      u32                     status;
        u32                     length;
        u8                      epnum;
  
        ur = &r->request;
  
        trb = dwc->ep0_trb;
 +
 +      status = DWC3_TRB_SIZE_TRBSTS(trb->size);
 +      if (status == DWC3_TRBSTS_SETUP_PENDING) {
 +              dev_dbg(dwc->dev, "Setup Pending received\n");
 +
 +              if (r)
 +                      dwc3_gadget_giveback(ep0, r, -ECONNRESET);
 +
 +              return;
 +      }
 +
        length = trb->size & DWC3_TRB_SIZE_MASK;
  
        if (dwc->ep0_bounced) {
                transferred = min_t(u32, ur->length,
                                transfer_size - length);
                memcpy(ur->buf, dwc->ep0_bounce, transferred);
-               dwc->ep0_bounced = false;
        } else {
                transferred = ur->length - length;
        }
@@@ -818,11 -745,8 +817,11 @@@ static void dwc3_ep0_complete_status(st
  {
        struct dwc3_request     *r;
        struct dwc3_ep          *dep;
 +      struct dwc3_trb         *trb;
 +      u32                     status;
  
        dep = dwc->eps[0];
 +      trb = dwc->ep0_trb;
  
        if (!list_empty(&dep->request_list)) {
                r = next_request(&dep->request_list);
                }
        }
  
 +      status = DWC3_TRB_SIZE_TRBSTS(trb->size);
 +      if (status == DWC3_TRBSTS_SETUP_PENDING)
 +              dev_dbg(dwc->dev, "Setup Pending received\n");
 +
        dwc->ep0state = EP0_SETUP_PHASE;
        dwc3_ep0_out_start(dwc);
  }
@@@ -879,6 -799,12 +878,6 @@@ static void dwc3_ep0_xfer_complete(stru
        }
  }
  
 -static void dwc3_ep0_do_control_setup(struct dwc3 *dwc,
 -              const struct dwc3_event_depevt *event)
 -{
 -      dwc3_ep0_out_start(dwc);
 -}
 -
  static void __dwc3_ep0_do_control_data(struct dwc3 *dwc,
                struct dwc3_ep *dep, struct dwc3_request *req)
  {
        WARN_ON(ret < 0);
  }
  
 -static void dwc3_ep0_do_control_data(struct dwc3 *dwc,
 -              const struct dwc3_event_depevt *event)
 -{
 -      struct dwc3_ep          *dep;
 -      struct dwc3_request     *req;
 -
 -      dep = dwc->eps[0];
 -
 -      if (list_empty(&dep->request_list)) {
 -              dev_vdbg(dwc->dev, "pending request for EP0 Data phase\n");
 -              dep->flags |= DWC3_EP_PENDING_REQUEST;
 -
 -              if (event->endpoint_number)
 -                      dep->flags |= DWC3_EP0_DIR_IN;
 -              return;
 -      }
 -
 -      req = next_request(&dep->request_list);
 -      dep = dwc->eps[event->endpoint_number];
 -
 -      __dwc3_ep0_do_control_data(dwc, dep, req);
 -}
 -
  static int dwc3_ep0_start_control_status(struct dwc3_ep *dep)
  {
        struct dwc3             *dwc = dep->dwc;
@@@ -962,61 -911,100 +961,61 @@@ static void dwc3_ep0_do_control_status(
        __dwc3_ep0_do_control_status(dwc, dep);
  }
  
 -static void dwc3_ep0_xfernotready(struct dwc3 *dwc,
 -              const struct dwc3_event_depevt *event)
 +static void dwc3_ep0_end_control_data(struct dwc3 *dwc, struct dwc3_ep *dep)
  {
 -      dwc->setup_packet_pending = true;
 -
 -      /*
 -       * This part is very tricky: If we have just handled
 -       * XferNotReady(Setup) and we're now expecting a
 -       * XferComplete but, instead, we receive another
 -       * XferNotReady(Setup), we should STALL and restart
 -       * the state machine.
 -       *
 -       * In all other cases, we just continue waiting
 -       * for the XferComplete event.
 -       *
 -       * We are a little bit unsafe here because we're
 -       * not trying to ensure that last event was, indeed,
 -       * XferNotReady(Setup).
 -       *
 -       * Still, we don't expect any condition where that
 -       * should happen and, even if it does, it would be
 -       * another error condition.
 -       */
 -      if (dwc->ep0_next_event == DWC3_EP0_COMPLETE) {
 -              switch (event->status) {
 -              case DEPEVT_STATUS_CONTROL_SETUP:
 -                      dev_vdbg(dwc->dev, "Unexpected XferNotReady(Setup)\n");
 -                      dwc3_ep0_stall_and_restart(dwc);
 -                      break;
 -              case DEPEVT_STATUS_CONTROL_DATA:
 -                      /* FALLTHROUGH */
 -              case DEPEVT_STATUS_CONTROL_STATUS:
 -                      /* FALLTHROUGH */
 -              default:
 -                      dev_vdbg(dwc->dev, "waiting for XferComplete\n");
 -              }
 +      struct dwc3_gadget_ep_cmd_params params;
 +      u32                     cmd;
 +      int                     ret;
  
 +      if (!dep->resource_index)
                return;
 -      }
 -
 -      switch (event->status) {
 -      case DEPEVT_STATUS_CONTROL_SETUP:
 -              dev_vdbg(dwc->dev, "Control Setup\n");
  
 -              dwc->ep0state = EP0_SETUP_PHASE;
 +      cmd = DWC3_DEPCMD_ENDTRANSFER;
 +      cmd |= DWC3_DEPCMD_CMDIOC;
 +      cmd |= DWC3_DEPCMD_PARAM(dep->resource_index);
 +      memset(&params, 0, sizeof(params));
 +      ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, &params);
 +      WARN_ON_ONCE(ret);
 +      dep->resource_index = 0;
 +}
  
 -              dwc3_ep0_do_control_setup(dwc, event);
 -              break;
 +static void dwc3_ep0_xfernotready(struct dwc3 *dwc,
 +              const struct dwc3_event_depevt *event)
 +{
 +      dwc->setup_packet_pending = true;
  
 +      switch (event->status) {
        case DEPEVT_STATUS_CONTROL_DATA:
                dev_vdbg(dwc->dev, "Control Data\n");
  
 -              dwc->ep0state = EP0_DATA_PHASE;
 -
 -              if (dwc->ep0_next_event != DWC3_EP0_NRDY_DATA) {
 -                      dev_vdbg(dwc->dev, "Expected %d got %d\n",
 -                                      dwc->ep0_next_event,
 -                                      DWC3_EP0_NRDY_DATA);
 -
 -                      dwc3_ep0_stall_and_restart(dwc);
 -                      return;
 -              }
 -
                /*
 -               * One of the possible error cases is when Host _does_
 -               * request for Data Phase, but it does so on the wrong
 -               * direction.
 +               * We already have a DATA transfer in the controller's cache,
 +               * if we receive a XferNotReady(DATA) we will ignore it, unless
 +               * it's for the wrong direction.
                 *
 -               * Here, we already know ep0_next_event is DATA (see above),
 -               * so we only need to check for direction.
 +               * In that case, we must issue END_TRANSFER command to the Data
 +               * Phase we already have started and issue SetStall on the
 +               * control endpoint.
                 */
                if (dwc->ep0_expect_in != event->endpoint_number) {
 +                      struct dwc3_ep  *dep = dwc->eps[dwc->ep0_expect_in];
 +
                        dev_vdbg(dwc->dev, "Wrong direction for Data phase\n");
 +                      dwc3_ep0_end_control_data(dwc, dep);
                        dwc3_ep0_stall_and_restart(dwc);
                        return;
                }
  
 -              dwc3_ep0_do_control_data(dwc, event);
                break;
  
        case DEPEVT_STATUS_CONTROL_STATUS:
 +              if (dwc->ep0_next_event != DWC3_EP0_NRDY_STATUS)
 +                      return;
 +
                dev_vdbg(dwc->dev, "Control Status\n");
  
                dwc->ep0state = EP0_STATUS_PHASE;
  
 -              if (dwc->ep0_next_event != DWC3_EP0_NRDY_STATUS) {
 -                      dev_vdbg(dwc->dev, "Expected %d got %d\n",
 -                                      dwc->ep0_next_event,
 -                                      DWC3_EP0_NRDY_STATUS);
 -
 -                      dwc3_ep0_stall_and_restart(dwc);
 -                      return;
 -              }
 -
                if (dwc->delayed_status) {
                        WARN_ON_ONCE(event->endpoint_number != 1);
                        dev_vdbg(dwc->dev, "Mass Storage delayed status\n");
index ba444e7f9c4448d4f7a2ba7305bd88379f1a35a4,c2813c2b005a8e223f93ff50a3215e24172904c2..c9e729a4bf6562876ba58b1776ce235ecc5ca5ed
@@@ -263,8 -263,11 +263,11 @@@ void dwc3_gadget_giveback(struct dwc3_e
        if (req->request.status == -EINPROGRESS)
                req->request.status = status;
  
-       usb_gadget_unmap_request(&dwc->gadget, &req->request,
-                       req->direction);
+       if (dwc->ep0_bounced && dep->number == 0)
+               dwc->ep0_bounced = false;
+       else
+               usb_gadget_unmap_request(&dwc->gadget, &req->request,
+                               req->direction);
  
        dev_dbg(dwc->dev, "request %p from %s completed %d/%d ===> %d\n",
                        req, dep->name, req->request.actual,
@@@ -431,25 -434,15 +434,25 @@@ static int dwc3_gadget_start_config(str
  
  static int dwc3_gadget_set_ep_config(struct dwc3 *dwc, struct dwc3_ep *dep,
                const struct usb_endpoint_descriptor *desc,
 -              const struct usb_ss_ep_comp_descriptor *comp_desc)
 +              const struct usb_ss_ep_comp_descriptor *comp_desc,
 +              bool ignore)
  {
        struct dwc3_gadget_ep_cmd_params params;
  
        memset(&params, 0x00, sizeof(params));
  
        params.param0 = DWC3_DEPCFG_EP_TYPE(usb_endpoint_type(desc))
 -              | DWC3_DEPCFG_MAX_PACKET_SIZE(usb_endpoint_maxp(desc))
 -              | DWC3_DEPCFG_BURST_SIZE(dep->endpoint.maxburst - 1);
 +              | DWC3_DEPCFG_MAX_PACKET_SIZE(usb_endpoint_maxp(desc));
 +
 +      /* Burst size is only needed in SuperSpeed mode */
 +      if (dwc->gadget.speed == USB_SPEED_SUPER) {
 +              u32 burst = dep->endpoint.maxburst - 1;
 +
 +              params.param0 |= DWC3_DEPCFG_BURST_SIZE(burst);
 +      }
 +
 +      if (ignore)
 +              params.param0 |= DWC3_DEPCFG_IGN_SEQ_NUM;
  
        params.param1 = DWC3_DEPCFG_XFER_COMPLETE_EN
                | DWC3_DEPCFG_XFER_NOT_READY_EN;
@@@ -508,8 -501,7 +511,8 @@@ static int dwc3_gadget_set_xfer_resourc
   */
  static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep,
                const struct usb_endpoint_descriptor *desc,
 -              const struct usb_ss_ep_comp_descriptor *comp_desc)
 +              const struct usb_ss_ep_comp_descriptor *comp_desc,
 +              bool ignore)
  {
        struct dwc3             *dwc = dep->dwc;
        u32                     reg;
                        return ret;
        }
  
 -      ret = dwc3_gadget_set_ep_config(dwc, dep, desc, comp_desc);
 +      ret = dwc3_gadget_set_ep_config(dwc, dep, desc, comp_desc, ignore);
        if (ret)
                return ret;
  
@@@ -569,7 -561,27 +572,7 @@@ static void dwc3_remove_requests(struc
        if (!list_empty(&dep->req_queued)) {
                dwc3_stop_active_transfer(dwc, dep->number);
  
 -              /*
 -               * NOTICE: We are violating what the Databook says about the
 -               * EndTransfer command. Ideally we would _always_ wait for the
 -               * EndTransfer Command Completion IRQ, but that's causing too
 -               * much trouble synchronizing between us and gadget driver.
 -               *
 -               * We have discussed this with the IP Provider and it was
 -               * suggested to giveback all requests here, but give HW some
 -               * extra time to synchronize with the interconnect. We're using
 -               * an arbitraty 100us delay for that.
 -               *
 -               * Note also that a similar handling was tested by Synopsys
 -               * (thanks a lot Paul) and nothing bad has come out of it.
 -               * In short, what we're doing is:
 -               *
 -               * - Issue EndTransfer WITH CMDIOC bit set
 -               * - Wait 100us
 -               * - giveback all requests to gadget driver
 -               */
 -              udelay(100);
 -
 +              /* - giveback all requests to gadget driver */
                while (!list_empty(&dep->req_queued)) {
                        req = next_request(&dep->req_queued);
  
@@@ -648,12 -660,6 +651,12 @@@ static int dwc3_gadget_ep_enable(struc
        dep = to_dwc3_ep(ep);
        dwc = dep->dwc;
  
 +      if (dep->flags & DWC3_EP_ENABLED) {
 +              dev_WARN_ONCE(dwc->dev, true, "%s is already enabled\n",
 +                              dep->name);
 +              return 0;
 +      }
 +
        switch (usb_endpoint_type(desc)) {
        case USB_ENDPOINT_XFER_CONTROL:
                strlcat(dep->name, "-control", sizeof(dep->name));
                dev_err(dwc->dev, "invalid endpoint transfer type\n");
        }
  
 -      if (dep->flags & DWC3_EP_ENABLED) {
 -              dev_WARN_ONCE(dwc->dev, true, "%s is already enabled\n",
 -                              dep->name);
 -              return 0;
 -      }
 -
        dev_vdbg(dwc->dev, "Enabling %s\n", dep->name);
  
        spin_lock_irqsave(&dwc->lock, flags);
 -      ret = __dwc3_gadget_ep_enable(dep, desc, ep->comp_desc);
 +      ret = __dwc3_gadget_ep_enable(dep, desc, ep->comp_desc, false);
        spin_unlock_irqrestore(&dwc->lock, flags);
  
        return ret;
@@@ -1017,6 -1029,7 +1020,7 @@@ static void __dwc3_gadget_start_isoc(st
        if (list_empty(&dep->request_list)) {
                dev_vdbg(dwc->dev, "ISOC ep %s run out for requests.\n",
                        dep->name);
+               dep->flags |= DWC3_EP_PENDING_REQUEST;
                return;
        }
  
@@@ -1078,10 -1091,26 +1082,23 @@@ static int __dwc3_gadget_ep_queue(struc
         *
         */
        if (dep->flags & DWC3_EP_PENDING_REQUEST) {
+               int     ret;
+               /*
+                * If xfernotready is already elapsed and it is a case
+                * of isoc transfer, then issue END TRANSFER, so that
+                * you can receive xfernotready again and can have
+                * notion of current microframe.
+                */
+               if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
+                       dwc3_stop_active_transfer(dwc, dep->number);
+                       return 0;
+               }
                ret = __dwc3_gadget_kick_transfer(dep, 0, true);
 -              if (ret && ret != -EBUSY) {
 -                      struct dwc3     *dwc = dep->dwc;
 -
 +              if (ret && ret != -EBUSY)
                        dev_dbg(dwc->dev, "%s: failed to kick transfers\n",
                                        dep->name);
 -              }
        }
  
        /*
         *    core may not see the modified TRB(s).
         */
        if (usb_endpoint_xfer_isoc(dep->endpoint.desc) &&
 -                      (dep->flags & DWC3_EP_BUSY)) {
 +                      (dep->flags & DWC3_EP_BUSY) &&
 +                      !(dep->flags & DWC3_EP_MISSED_ISOC)) {
                WARN_ON_ONCE(!dep->resource_index);
                ret = __dwc3_gadget_kick_transfer(dep, dep->resource_index,
                                false);
 -              if (ret && ret != -EBUSY) {
 -                      struct dwc3     *dwc = dep->dwc;
 -
 +              if (ret && ret != -EBUSY)
                        dev_dbg(dwc->dev, "%s: failed to kick transfers\n",
                                        dep->name);
 -              }
        }
  
        /*
@@@ -1502,14 -1533,14 +1519,14 @@@ static int dwc3_gadget_start(struct usb
        dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(512);
  
        dep = dwc->eps[0];
 -      ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL);
 +      ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, false);
        if (ret) {
                dev_err(dwc->dev, "failed to enable %s\n", dep->name);
                goto err0;
        }
  
        dep = dwc->eps[1];
 -      ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL);
 +      ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, false);
        if (ret) {
                dev_err(dwc->dev, "failed to enable %s\n", dep->name);
                goto err1;
@@@ -1734,7 -1765,7 +1751,7 @@@ static void dwc3_endpoint_transfer_comp
                int             i;
  
                for (i = 0; i < DWC3_ENDPOINTS_NUM; i++) {
 -                      struct dwc3_ep  *dep = dwc->eps[i];
 +                      dep = dwc->eps[i];
  
                        if (!(dep->flags & DWC3_EP_ENABLED))
                                continue;
@@@ -1861,25 -1892,6 +1878,25 @@@ static void dwc3_stop_active_transfer(s
        if (!dep->resource_index)
                return;
  
 +      /*
 +       * NOTICE: We are violating what the Databook says about the
 +       * EndTransfer command. Ideally we would _always_ wait for the
 +       * EndTransfer Command Completion IRQ, but that's causing too
 +       * much trouble synchronizing between us and gadget driver.
 +       *
 +       * We have discussed this with the IP Provider and it was
 +       * suggested to giveback all requests here, but give HW some
 +       * extra time to synchronize with the interconnect. We're using
 +       * an arbitraty 100us delay for that.
 +       *
 +       * Note also that a similar handling was tested by Synopsys
 +       * (thanks a lot Paul) and nothing bad has come out of it.
 +       * In short, what we're doing is:
 +       *
 +       * - Issue EndTransfer WITH CMDIOC bit set
 +       * - Wait 100us
 +       */
 +
        cmd = DWC3_DEPCMD_ENDTRANSFER;
        cmd |= DWC3_DEPCMD_HIPRI_FORCERM | DWC3_DEPCMD_CMDIOC;
        cmd |= DWC3_DEPCMD_PARAM(dep->resource_index);
        ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, &params);
        WARN_ON_ONCE(ret);
        dep->resource_index = 0;
 +
 +      udelay(100);
  }
  
  static void dwc3_stop_active_transfers(struct dwc3 *dwc)
@@@ -2146,14 -2156,14 +2163,14 @@@ static void dwc3_gadget_conndone_interr
        }
  
        dep = dwc->eps[0];
 -      ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL);
 +      ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, true);
        if (ret) {
                dev_err(dwc->dev, "failed to enable %s\n", dep->name);
                return;
        }
  
        dep = dwc->eps[1];
 -      ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL);
 +      ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, true);
        if (ret) {
                dev_err(dwc->dev, "failed to enable %s\n", dep->name);
                return;
index af931282843d3e206695d51827f469ac81e31794,1e35963bd4edc29f735319a76e0a4eb7052b27f5..89d90b5fb78749c66110462e55e3146c363d2796
@@@ -469,14 -469,13 +469,13 @@@ static int at91_ep_enable(struct usb_e
                                const struct usb_endpoint_descriptor *desc)
  {
        struct at91_ep  *ep = container_of(_ep, struct at91_ep, ep);
 -      struct at91_udc *udc = ep->udc;
 +      struct at91_udc *udc;
        u16             maxpacket;
        u32             tmp;
        unsigned long   flags;
  
        if (!_ep || !ep
-                       || !desc || ep->ep.desc
-                       || _ep->name == ep0name
+                       || !desc || _ep->name == ep0name
                        || desc->bDescriptorType != USB_DT_ENDPOINT
                        || (maxpacket = usb_endpoint_maxp(desc)) == 0
                        || maxpacket > ep->maxpacket) {
                return -EINVAL;
        }
  
 +      udc = ep->udc;
        if (!udc->driver || udc->gadget.speed == USB_SPEED_UNKNOWN) {
                DBG("bogus device state\n");
                return -ESHUTDOWN;
@@@ -531,7 -529,6 +530,6 @@@ ok
        tmp |= AT91_UDP_EPEDS;
        __raw_writel(tmp, ep->creg);
  
-       ep->ep.desc = desc;
        ep->ep.maxpacket = maxpacket;
  
        /*
@@@ -1636,7 -1633,6 +1634,6 @@@ static int at91_start(struct usb_gadge
        udc->driver = driver;
        udc->gadget.dev.driver = &driver->driver;
        udc->gadget.dev.of_node = udc->pdev->dev.of_node;
-       dev_set_drvdata(&udc->gadget.dev, &driver->driver);
        udc->enabled = 1;
        udc->selfpowered = 1;
  
@@@ -1657,7 -1653,6 +1654,6 @@@ static int at91_stop(struct usb_gadget 
        spin_unlock_irqrestore(&udc->lock, flags);
  
        udc->gadget.dev.driver = NULL;
-       dev_set_drvdata(&udc->gadget.dev, NULL);
        udc->driver = NULL;
  
        DBG("unbound from %s\n", driver->driver.name);
@@@ -1704,7 -1699,7 +1700,7 @@@ static int __devinit at91udc_probe(stru
        int             retval;
        struct resource *res;
  
 -      if (!dev->platform_data) {
 +      if (!dev->platform_data && !pdev->dev.of_node) {
                /* small (so we copy it) but critical! */
                DBG("missing platform_data\n");
                return -ENODEV;
index 91916f693ff7462238f8ae0a51f79b00f3c7b9a1,afdbb1cbf5d94d972c52f57f4099a1bb0202bef5..0f7541be28f36aaa2ff402aaf2fce40040cc119a
@@@ -909,7 -909,6 +909,7 @@@ static int dummy_udc_start(struct usb_g
        dum->devstatus = 0;
  
        dum->driver = driver;
 +      dum->gadget.dev.driver = &driver->driver;
        dev_dbg(udc_dev(dum), "binding gadget driver '%s'\n",
                        driver->driver.name);
        return 0;
@@@ -924,7 -923,6 +924,7 @@@ static int dummy_udc_stop(struct usb_ga
        dev_dbg(udc_dev(dum), "unregister gadget driver '%s'\n",
                        driver->driver.name);
  
 +      dum->gadget.dev.driver = NULL;
        dum->driver = NULL;
  
        return 0;
@@@ -1918,6 -1916,27 +1918,27 @@@ done
        return retval;
  }
  
+ /* usb 3.0 root hub device descriptor */
+ struct {
+       struct usb_bos_descriptor bos;
+       struct usb_ss_cap_descriptor ss_cap;
+ } __packed usb3_bos_desc = {
+       .bos = {
+               .bLength                = USB_DT_BOS_SIZE,
+               .bDescriptorType        = USB_DT_BOS,
+               .wTotalLength           = cpu_to_le16(sizeof(usb3_bos_desc)),
+               .bNumDeviceCaps         = 1,
+       },
+       .ss_cap = {
+               .bLength                = USB_DT_USB_SS_CAP_SIZE,
+               .bDescriptorType        = USB_DT_DEVICE_CAPABILITY,
+               .bDevCapabilityType     = USB_SS_CAP_TYPE,
+               .wSpeedSupported        = cpu_to_le16(USB_5GBPS_OPERATION),
+               .bFunctionalitySupport  = ilog2(USB_5GBPS_OPERATION),
+       },
+ };
  static inline void
  ss_hub_descriptor(struct usb_hub_descriptor *desc)
  {
@@@ -2008,6 -2027,18 +2029,18 @@@ static int dummy_hub_control
                else
                        hub_descriptor((struct usb_hub_descriptor *) buf);
                break;
+       case DeviceRequest | USB_REQ_GET_DESCRIPTOR:
+               if (hcd->speed != HCD_USB3)
+                       goto error;
+               if ((wValue >> 8) != USB_DT_BOS)
+                       goto error;
+               memcpy(buf, &usb3_bos_desc, sizeof(usb3_bos_desc));
+               retval = sizeof(usb3_bos_desc);
+               break;
        case GetHubStatus:
                *(__le32 *) buf = cpu_to_le32(0);
                break;
@@@ -2505,10 -2536,8 +2538,8 @@@ static int dummy_hcd_probe(struct platf
        hs_hcd->has_tt = 1;
  
        retval = usb_add_hcd(hs_hcd, 0, 0);
-       if (retval != 0) {
-               usb_put_hcd(hs_hcd);
-               return retval;
-       }
+       if (retval)
+               goto put_usb2_hcd;
  
        if (mod_data.is_super_speed) {
                ss_hcd = usb_create_shared_hcd(&dummy_hcd, &pdev->dev,
  put_usb3_hcd:
        usb_put_hcd(ss_hcd);
  dealloc_usb2_hcd:
+       usb_remove_hcd(hs_hcd);
+ put_usb2_hcd:
        usb_put_hcd(hs_hcd);
        the_controller.hs_hcd = the_controller.ss_hcd = NULL;
        return retval;
index 5896f0588d4118393f60fcb3b609b4f2c9c634fe,d5eb357aa5c42cff5575bdf1297f3ebbafa49d85..aa90ad4d4fd53b2f70288641dcd13942355ca875
@@@ -29,7 -29,7 +29,7 @@@
  #define       PORT_RWC_BITS   (PORT_CSC | PORT_PEC | PORT_WRC | PORT_OCC | \
                         PORT_RC | PORT_PLC | PORT_PE)
  
 -/* usb 1.1 root hub device descriptor */
 +/* USB 3.0 BOS descriptor and a capability descriptor, combined */
  static u8 usb_bos_descriptor [] = {
        USB_DT_BOS_SIZE,                /*  __u8 bLength, 5 bytes */
        USB_DT_BOS,                     /*  __u8 bDescriptorType */
@@@ -422,7 -422,7 +422,7 @@@ void xhci_set_link_state(struct xhci_hc
        xhci_writel(xhci, temp, port_array[port_id]);
  }
  
 -void xhci_set_remote_wake_mask(struct xhci_hcd *xhci,
 +static void xhci_set_remote_wake_mask(struct xhci_hcd *xhci,
                __le32 __iomem **port_array, int port_id, u16 wake_mask)
  {
        u32 temp;
@@@ -493,11 -493,48 +493,48 @@@ static void xhci_hub_report_link_state(
                 * when this bit is set.
                 */
                pls |= USB_PORT_STAT_CONNECTION;
+       } else {
+               /*
+                * If CAS bit isn't set but the Port is already at
+                * Compliance Mode, fake a connection so the USB core
+                * notices the Compliance state and resets the port.
+                * This resolves an issue generated by the SN65LVPE502CP
+                * in which sometimes the port enters compliance mode
+                * caused by a delay on the host-device negotiation.
+                */
+               if (pls == USB_SS_PORT_LS_COMP_MOD)
+                       pls |= USB_PORT_STAT_CONNECTION;
        }
        /* update status field */
        *status |= pls;
  }
  
+ /*
+  * Function for Compliance Mode Quirk.
+  *
+  * This Function verifies if all xhc USB3 ports have entered U0, if so,
+  * the compliance mode timer is deleted. A port won't enter
+  * compliance mode if it has previously entered U0.
+  */
+ void xhci_del_comp_mod_timer(struct xhci_hcd *xhci, u32 status, u16 wIndex)
+ {
+       u32 all_ports_seen_u0 = ((1 << xhci->num_usb3_ports)-1);
+       bool port_in_u0 = ((status & PORT_PLS_MASK) == XDEV_U0);
+       if (!(xhci->quirks & XHCI_COMP_MODE_QUIRK))
+               return;
+       if ((xhci->port_status_u0 != all_ports_seen_u0) && port_in_u0) {
+               xhci->port_status_u0 |= 1 << wIndex;
+               if (xhci->port_status_u0 == all_ports_seen_u0) {
+                       del_timer_sync(&xhci->comp_mode_recovery_timer);
+                       xhci_dbg(xhci, "All USB3 ports have entered U0 already!\n");
+                       xhci_dbg(xhci, "Compliance Mode Recovery Timer Deleted.\n");
+               }
+       }
+ }
  int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
                u16 wIndex, char *buf, u16 wLength)
  {
                /* Update Port Link State for super speed ports*/
                if (hcd->speed == HCD_USB3) {
                        xhci_hub_report_link_state(&status, temp);
+                       /*
+                        * Verify if all USB3 Ports Have entered U0 already.
+                        * Delete Compliance Mode Timer if so.
+                        */
+                       xhci_del_comp_mod_timer(xhci, temp, wIndex);
                }
                if (bus_state->port_c_suspend & (1 << wIndex))
                        status |= 1 << USB_PORT_FEAT_C_SUSPEND;
  
                        temp = xhci_readl(xhci, port_array[wIndex]);
                        xhci_dbg(xhci, "set port power, actual port %d status  = 0x%x\n", wIndex, temp);
 +
 +                      temp = usb_acpi_power_manageable(hcd->self.root_hub,
 +                                      wIndex);
 +                      if (temp)
 +                              usb_acpi_set_power_state(hcd->self.root_hub,
 +                                              wIndex, true);
                        break;
                case USB_PORT_FEAT_RESET:
                        temp = (temp | PORT_RESET);
                        xhci_disable_port(hcd, xhci, wIndex,
                                        port_array[wIndex], temp);
                        break;
 +              case USB_PORT_FEAT_POWER:
 +                      xhci_writel(xhci, temp & ~PORT_POWER,
 +                              port_array[wIndex]);
 +
 +                      temp = usb_acpi_power_manageable(hcd->self.root_hub,
 +                                      wIndex);
 +                      if (temp)
 +                              usb_acpi_set_power_state(hcd->self.root_hub,
 +                                              wIndex, false);
 +                      break;
                default:
                        goto error;
                }
diff --combined drivers/usb/host/xhci.c
index 66bc5c3985fb8dbaca5294492724e77070ca62d4,6ece0ed288d4da9398bb96ecc8223f31b6ce8e0c..a4b0ce13fa0c8928806cc5d624ca9e32fa57bb70
@@@ -26,6 -26,7 +26,7 @@@
  #include <linux/module.h>
  #include <linux/moduleparam.h>
  #include <linux/slab.h>
+ #include <linux/dmi.h>
  
  #include "xhci.h"
  
@@@ -51,7 -52,7 +52,7 @@@ MODULE_PARM_DESC(link_quirk, "Don't cle
   * handshake done).  There are two failure modes:  "usec" have passed (major
   * hardware flakeout), or the register reads as all-ones (hardware removed).
   */
 -static int handshake(struct xhci_hcd *xhci, void __iomem *ptr,
 +int handshake(struct xhci_hcd *xhci, void __iomem *ptr,
                      u32 mask, u32 done, int usec)
  {
        u32     result;
@@@ -104,10 -105,9 +105,10 @@@ int xhci_halt(struct xhci_hcd *xhci
  
        ret = handshake(xhci, &xhci->op_regs->status,
                        STS_HALT, STS_HALT, XHCI_MAX_HALT_USEC);
 -      if (!ret)
 +      if (!ret) {
                xhci->xhc_state |= XHCI_STATE_HALTED;
 -      else
 +              xhci->cmd_ring_state = CMD_RING_STATE_STOPPED;
 +      } else
                xhci_warn(xhci, "Host not halted after %u microseconds.\n",
                                XHCI_MAX_HALT_USEC);
        return ret;
@@@ -399,6 -399,95 +400,95 @@@ static void xhci_msix_sync_irqs(struct 
  
  #endif
  
+ static void compliance_mode_recovery(unsigned long arg)
+ {
+       struct xhci_hcd *xhci;
+       struct usb_hcd *hcd;
+       u32 temp;
+       int i;
+       xhci = (struct xhci_hcd *)arg;
+       for (i = 0; i < xhci->num_usb3_ports; i++) {
+               temp = xhci_readl(xhci, xhci->usb3_ports[i]);
+               if ((temp & PORT_PLS_MASK) == USB_SS_PORT_LS_COMP_MOD) {
+                       /*
+                        * Compliance Mode Detected. Letting USB Core
+                        * handle the Warm Reset
+                        */
+                       xhci_dbg(xhci, "Compliance Mode Detected->Port %d!\n",
+                                       i + 1);
+                       xhci_dbg(xhci, "Attempting Recovery routine!\n");
+                       hcd = xhci->shared_hcd;
+                       if (hcd->state == HC_STATE_SUSPENDED)
+                               usb_hcd_resume_root_hub(hcd);
+                       usb_hcd_poll_rh_status(hcd);
+               }
+       }
+       if (xhci->port_status_u0 != ((1 << xhci->num_usb3_ports)-1))
+               mod_timer(&xhci->comp_mode_recovery_timer,
+                       jiffies + msecs_to_jiffies(COMP_MODE_RCVRY_MSECS));
+ }
+ /*
+  * Quirk to work around issue generated by the SN65LVPE502CP USB3.0 re-driver
+  * that causes ports behind that hardware to enter compliance mode sometimes.
+  * The quirk creates a timer that polls every 2 seconds the link state of
+  * each host controller's port and recovers it by issuing a Warm reset
+  * if Compliance mode is detected, otherwise the port will become "dead" (no
+  * device connections or disconnections will be detected anymore). Becasue no
+  * status event is generated when entering compliance mode (per xhci spec),
+  * this quirk is needed on systems that have the failing hardware installed.
+  */
+ static void compliance_mode_recovery_timer_init(struct xhci_hcd *xhci)
+ {
+       xhci->port_status_u0 = 0;
+       init_timer(&xhci->comp_mode_recovery_timer);
+       xhci->comp_mode_recovery_timer.data = (unsigned long) xhci;
+       xhci->comp_mode_recovery_timer.function = compliance_mode_recovery;
+       xhci->comp_mode_recovery_timer.expires = jiffies +
+                       msecs_to_jiffies(COMP_MODE_RCVRY_MSECS);
+       set_timer_slack(&xhci->comp_mode_recovery_timer,
+                       msecs_to_jiffies(COMP_MODE_RCVRY_MSECS));
+       add_timer(&xhci->comp_mode_recovery_timer);
+       xhci_dbg(xhci, "Compliance Mode Recovery Timer Initialized.\n");
+ }
+ /*
+  * This function identifies the systems that have installed the SN65LVPE502CP
+  * USB3.0 re-driver and that need the Compliance Mode Quirk.
+  * Systems:
+  * Vendor: Hewlett-Packard -> System Models: Z420, Z620 and Z820
+  */
+ static bool compliance_mode_recovery_timer_quirk_check(void)
+ {
+       const char *dmi_product_name, *dmi_sys_vendor;
+       dmi_product_name = dmi_get_system_info(DMI_PRODUCT_NAME);
+       dmi_sys_vendor = dmi_get_system_info(DMI_SYS_VENDOR);
+       if (!(strstr(dmi_sys_vendor, "Hewlett-Packard")))
+               return false;
+       if (strstr(dmi_product_name, "Z420") ||
+                       strstr(dmi_product_name, "Z620") ||
+                       strstr(dmi_product_name, "Z820"))
+               return true;
+       return false;
+ }
+ static int xhci_all_ports_seen_u0(struct xhci_hcd *xhci)
+ {
+       return (xhci->port_status_u0 == ((1 << xhci->num_usb3_ports)-1));
+ }
  /*
   * Initialize memory for HCD and xHC (one-time init).
   *
@@@ -422,6 -511,12 +512,12 @@@ int xhci_init(struct usb_hcd *hcd
        retval = xhci_mem_init(xhci, GFP_KERNEL);
        xhci_dbg(xhci, "Finished xhci_init\n");
  
+       /* Initializing Compliance Mode Recovery Data If Needed */
+       if (compliance_mode_recovery_timer_quirk_check()) {
+               xhci->quirks |= XHCI_COMP_MODE_QUIRK;
+               compliance_mode_recovery_timer_init(xhci);
+       }
        return retval;
  }
  
@@@ -486,7 -581,6 +582,7 @@@ static int xhci_run_finished(struct xhc
                return -ENODEV;
        }
        xhci->shared_hcd->state = HC_STATE_RUNNING;
 +      xhci->cmd_ring_state = CMD_RING_STATE_RUNNING;
  
        if (xhci->quirks & XHCI_NEC_HOST)
                xhci_ring_cmd_db(xhci);
@@@ -631,6 -725,11 +727,11 @@@ void xhci_stop(struct usb_hcd *hcd
        del_timer_sync(&xhci->event_ring_timer);
  #endif
  
+       /* Deleting Compliance Mode Recovery Timer */
+       if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) &&
+                       (!(xhci_all_ports_seen_u0(xhci))))
+               del_timer_sync(&xhci->comp_mode_recovery_timer);
        if (xhci->quirks & XHCI_AMD_PLL_FIX)
                usb_amd_dev_put();
  
@@@ -661,7 -760,7 +762,7 @@@ void xhci_shutdown(struct usb_hcd *hcd
  {
        struct xhci_hcd *xhci = hcd_to_xhci(hcd);
  
-       if (xhci->quirks && XHCI_SPURIOUS_REBOOT)
+       if (xhci->quirks & XHCI_SPURIOUS_REBOOT)
                usb_disable_xhci_ports(to_pci_dev(hcd->self.controller));
  
        spin_lock_irq(&xhci->lock);
@@@ -808,6 -907,16 +909,16 @@@ int xhci_suspend(struct xhci_hcd *xhci
        }
        spin_unlock_irq(&xhci->lock);
  
+       /*
+        * Deleting Compliance Mode Recovery Timer because the xHCI Host
+        * is about to be suspended.
+        */
+       if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) &&
+                       (!(xhci_all_ports_seen_u0(xhci)))) {
+               del_timer_sync(&xhci->comp_mode_recovery_timer);
+               xhci_dbg(xhci, "Compliance Mode Recovery Timer Deleted!\n");
+       }
        /* step 5: remove core well power */
        /* synchronize irq when using MSI-X */
        xhci_msix_sync_irqs(xhci);
@@@ -940,6 -1049,16 +1051,16 @@@ int xhci_resume(struct xhci_hcd *xhci, 
                usb_hcd_resume_root_hub(hcd);
                usb_hcd_resume_root_hub(xhci->shared_hcd);
        }
+       /*
+        * If system is subject to the Quirk, Compliance Mode Timer needs to
+        * be re-initialized Always after a system resume. Ports are subject
+        * to suffer the Compliance Mode issue again. It doesn't matter if
+        * ports have entered previously to U0 before system's suspension.
+        */
+       if (xhci->quirks & XHCI_COMP_MODE_QUIRK)
+               compliance_mode_recovery_timer_init(xhci);
        return retval;
  }
  #endif        /* CONFIG_PM */
@@@ -1829,7 -1948,7 +1950,7 @@@ static void xhci_finish_resource_reserv
                                xhci->num_active_eps);
  }
  
 -unsigned int xhci_get_block_size(struct usb_device *udev)
 +static unsigned int xhci_get_block_size(struct usb_device *udev)
  {
        switch (udev->speed) {
        case USB_SPEED_LOW:
        }
  }
  
 -unsigned int xhci_get_largest_overhead(struct xhci_interval_bw *interval_bw)
 +static unsigned int
 +xhci_get_largest_overhead(struct xhci_interval_bw *interval_bw)
  {
        if (interval_bw->overhead[LS_OVERHEAD_TYPE])
                return LS_OVERHEAD;
@@@ -2403,7 -2521,6 +2524,7 @@@ static int xhci_configure_endpoint(stru
        struct completion *cmd_completion;
        u32 *cmd_status;
        struct xhci_virt_device *virt_dev;
 +      union xhci_trb *cmd_trb;
  
        spin_lock_irqsave(&xhci->lock, flags);
        virt_dev = xhci->devs[udev->slot_id];
        }
        init_completion(cmd_completion);
  
 +      cmd_trb = xhci->cmd_ring->dequeue;
        if (!ctx_change)
                ret = xhci_queue_configure_endpoint(xhci, in_ctx->dma,
                                udev->slot_id, must_succeed);
        /* Wait for the configure endpoint command to complete */
        timeleft = wait_for_completion_interruptible_timeout(
                        cmd_completion,
 -                      USB_CTRL_SET_TIMEOUT);
 +                      XHCI_CMD_DEFAULT_TIMEOUT);
        if (timeleft <= 0) {
                xhci_warn(xhci, "%s while waiting for %s command\n",
                                timeleft == 0 ? "Timeout" : "Signal",
                                ctx_change == 0 ?
                                        "configure endpoint" :
                                        "evaluate context");
 -              /* FIXME cancel the configure endpoint command */
 +              /* cancel the configure endpoint command */
 +              ret = xhci_cancel_cmd(xhci, command, cmd_trb);
 +              if (ret < 0)
 +                      return ret;
                return -ETIME;
        }
  
@@@ -3430,10 -3543,8 +3551,10 @@@ int xhci_alloc_dev(struct usb_hcd *hcd
        unsigned long flags;
        int timeleft;
        int ret;
 +      union xhci_trb *cmd_trb;
  
        spin_lock_irqsave(&xhci->lock, flags);
 +      cmd_trb = xhci->cmd_ring->dequeue;
        ret = xhci_queue_slot_control(xhci, TRB_ENABLE_SLOT, 0);
        if (ret) {
                spin_unlock_irqrestore(&xhci->lock, flags);
  
        /* XXX: how much time for xHC slot assignment? */
        timeleft = wait_for_completion_interruptible_timeout(&xhci->addr_dev,
 -                      USB_CTRL_SET_TIMEOUT);
 +                      XHCI_CMD_DEFAULT_TIMEOUT);
        if (timeleft <= 0) {
                xhci_warn(xhci, "%s while waiting for a slot\n",
                                timeleft == 0 ? "Timeout" : "Signal");
 -              /* FIXME cancel the enable slot request */
 -              return 0;
 +              /* cancel the enable slot request */
 +              return xhci_cancel_cmd(xhci, NULL, cmd_trb);
        }
  
        if (!xhci->slot_id) {
@@@ -3511,7 -3622,6 +3632,7 @@@ int xhci_address_device(struct usb_hcd 
        struct xhci_slot_ctx *slot_ctx;
        struct xhci_input_control_ctx *ctrl_ctx;
        u64 temp_64;
 +      union xhci_trb *cmd_trb;
  
        if (!udev->slot_id) {
                xhci_dbg(xhci, "Bad Slot ID %d\n", udev->slot_id);
        xhci_dbg_ctx(xhci, virt_dev->in_ctx, 2);
  
        spin_lock_irqsave(&xhci->lock, flags);
 +      cmd_trb = xhci->cmd_ring->dequeue;
        ret = xhci_queue_address_device(xhci, virt_dev->in_ctx->dma,
                                        udev->slot_id);
        if (ret) {
  
        /* ctrl tx can take up to 5 sec; XXX: need more time for xHC? */
        timeleft = wait_for_completion_interruptible_timeout(&xhci->addr_dev,
 -                      USB_CTRL_SET_TIMEOUT);
 +                      XHCI_CMD_DEFAULT_TIMEOUT);
        /* FIXME: From section 4.3.4: "Software shall be responsible for timing
         * the SetAddress() "recovery interval" required by USB and aborting the
         * command on a timeout.
        if (timeleft <= 0) {
                xhci_warn(xhci, "%s while waiting for address device command\n",
                                timeleft == 0 ? "Timeout" : "Signal");
 -              /* FIXME cancel the address device command */
 +              /* cancel the address device command */
 +              ret = xhci_cancel_cmd(xhci, NULL, cmd_trb);
 +              if (ret < 0)
 +                      return ret;
                return -ETIME;
        }
  
diff --combined drivers/usb/host/xhci.h
index e81ccfa3552f03c742a4c11f38da8cefec0c736c,1a05908c66737ce94a77f880d1bc14cb7e40134a..e44e2d3c83b0f43ea4c42365be6ce88c8ef349e0
@@@ -1256,16 -1256,6 +1256,16 @@@ struct xhci_td 
        union xhci_trb          *last_trb;
  };
  
 +/* xHCI command default timeout value */
 +#define XHCI_CMD_DEFAULT_TIMEOUT      (5 * HZ)
 +
 +/* command descriptor */
 +struct xhci_cd {
 +      struct list_head        cancel_cmd_list;
 +      struct xhci_command     *command;
 +      union xhci_trb          *cmd_trb;
 +};
 +
  struct xhci_dequeue_state {
        struct xhci_segment *new_deq_seg;
        union xhci_trb *new_deq_ptr;
@@@ -1431,11 -1421,6 +1431,11 @@@ struct xhci_hcd 
        /* data structures */
        struct xhci_device_context_array *dcbaa;
        struct xhci_ring        *cmd_ring;
 +      unsigned int            cmd_ring_state;
 +#define CMD_RING_STATE_RUNNING         (1 << 0)
 +#define CMD_RING_STATE_ABORTED         (1 << 1)
 +#define CMD_RING_STATE_STOPPED         (1 << 2)
 +      struct list_head        cancel_cmd_list;
        unsigned int            cmd_ring_reserved_trbs;
        struct xhci_ring        *event_ring;
        struct xhci_erst        erst;
  #define XHCI_LPM_SUPPORT      (1 << 11)
  #define XHCI_INTEL_HOST               (1 << 12)
  #define XHCI_SPURIOUS_REBOOT  (1 << 13)
+ #define XHCI_COMP_MODE_QUIRK  (1 << 14)
        unsigned int            num_active_eps;
        unsigned int            limit_active_eps;
        /* There are two roothubs to keep track of bus suspend info for */
        unsigned                sw_lpm_support:1;
        /* support xHCI 1.0 spec USB2 hardware LPM */
        unsigned                hw_lpm_support:1;
+       /* Compliance Mode Recovery Data */
+       struct timer_list       comp_mode_recovery_timer;
+       u32                     port_status_u0;
+ /* Compliance Mode Timer Triggered every 2 seconds */
+ #define COMP_MODE_RCVRY_MSECS 2000
  };
  
  /* convert between an HCD pointer and the corresponding EHCI_HCD */
@@@ -1713,8 -1704,6 +1719,8 @@@ static inline void xhci_unregister_plat
  
  /* xHCI host controller glue */
  typedef void (*xhci_get_quirks_t)(struct device *, struct xhci_hcd *);
 +int handshake(struct xhci_hcd *xhci, void __iomem *ptr,
 +              u32 mask, u32 done, int usec);
  void xhci_quiesce(struct xhci_hcd *xhci);
  int xhci_halt(struct xhci_hcd *xhci);
  int xhci_reset(struct xhci_hcd *xhci);
@@@ -1805,8 -1794,6 +1811,8 @@@ void xhci_queue_config_ep_quirk(struct 
                unsigned int slot_id, unsigned int ep_index,
                struct xhci_dequeue_state *deq_state);
  void xhci_stop_endpoint_command_watchdog(unsigned long arg);
 +int xhci_cancel_cmd(struct xhci_hcd *xhci, struct xhci_command *command,
 +              union xhci_trb *cmd_trb);
  void xhci_ring_ep_doorbell(struct xhci_hcd *xhci, unsigned int slot_id,
                unsigned int ep_index, unsigned int stream_id);
  
index d385e8a8187dbfba0bf79257cce5c71641ab30a0,1ae378d5fc6f25b5861eb2e3ef79b32a76a4885f..3df6a76b851dbefc91c6d5488570f9d53813a59b
@@@ -693,8 -693,6 +693,8 @@@ static void musb_ep_program(struct mus
        void __iomem            *epio = hw_ep->regs;
        struct musb_qh          *qh = musb_ep_get_qh(hw_ep, !is_out);
        u16                     packet_sz = qh->maxpacket;
 +      u8                      use_dma = 1;
 +      u16                     csr;
  
        dev_dbg(musb->controller, "%s hw%d urb %p spd%d dev%d ep%d%s "
                                "h_addr%02x h_port%02x bytes %d\n",
  
        musb_ep_select(mbase, epnum);
  
 +      if (is_out && !len) {
 +              use_dma = 0;
 +              csr = musb_readw(epio, MUSB_TXCSR);
 +              csr &= ~MUSB_TXCSR_DMAENAB;
 +              musb_writew(epio, MUSB_TXCSR, csr);
 +              hw_ep->tx_channel = NULL;
 +      }
 +
        /* candidate for DMA? */
        dma_controller = musb->dma_controller;
 -      if (is_dma_capable() && epnum && dma_controller) {
 +      if (use_dma && is_dma_capable() && epnum && dma_controller) {
                dma_channel = is_out ? hw_ep->tx_channel : hw_ep->rx_channel;
                if (!dma_channel) {
                        dma_channel = dma_controller->channel_alloc(
                if (load_count) {
                        /* PIO to load FIFO */
                        qh->segsize = load_count;
 -                      musb_write_fifo(hw_ep, load_count, buf);
 +                      if (!buf) {
 +                              sg_miter_start(&qh->sg_miter, urb->sg, 1,
 +                                              SG_MITER_ATOMIC
 +                                              | SG_MITER_FROM_SG);
 +                              if (!sg_miter_next(&qh->sg_miter)) {
 +                                      dev_err(musb->controller,
 +                                                      "error: sg"
 +                                                      "list empty\n");
 +                                      sg_miter_stop(&qh->sg_miter);
 +                                      goto finish;
 +                              }
 +                              buf = qh->sg_miter.addr + urb->sg->offset +
 +                                      urb->actual_length;
 +                              load_count = min_t(u32, load_count,
 +                                              qh->sg_miter.length);
 +                              musb_write_fifo(hw_ep, load_count, buf);
 +                              qh->sg_miter.consumed = load_count;
 +                              sg_miter_stop(&qh->sg_miter);
 +                      } else
 +                              musb_write_fifo(hw_ep, load_count, buf);
                }
 -
 +finish:
                /* re-enable interrupt */
                musb_writew(mbase, MUSB_INTRTXE, int_txe);
  
        }
  }
  
 +/* Schedule next QH from musb->in_bulk/out_bulk and move the current qh to
 + * the end; avoids starvation for other endpoints.
 + */
 +static void musb_bulk_nak_timeout(struct musb *musb, struct musb_hw_ep *ep,
 +      int is_in)
 +{
 +      struct dma_channel      *dma;
 +      struct urb              *urb;
 +      void __iomem            *mbase = musb->mregs;
 +      void __iomem            *epio = ep->regs;
 +      struct musb_qh          *cur_qh, *next_qh;
 +      u16                     rx_csr, tx_csr;
 +
 +      musb_ep_select(mbase, ep->epnum);
 +      if (is_in) {
 +              dma = is_dma_capable() ? ep->rx_channel : NULL;
 +
 +              /* clear nak timeout bit */
 +              rx_csr = musb_readw(epio, MUSB_RXCSR);
 +              rx_csr |= MUSB_RXCSR_H_WZC_BITS;
 +              rx_csr &= ~MUSB_RXCSR_DATAERROR;
 +              musb_writew(epio, MUSB_RXCSR, rx_csr);
 +
 +              cur_qh = first_qh(&musb->in_bulk);
 +      } else {
 +              dma = is_dma_capable() ? ep->tx_channel : NULL;
 +
 +              /* clear nak timeout bit */
 +              tx_csr = musb_readw(epio, MUSB_TXCSR);
 +              tx_csr |= MUSB_TXCSR_H_WZC_BITS;
 +              tx_csr &= ~MUSB_TXCSR_H_NAKTIMEOUT;
 +              musb_writew(epio, MUSB_TXCSR, tx_csr);
 +
 +              cur_qh = first_qh(&musb->out_bulk);
 +      }
 +      if (cur_qh) {
 +              urb = next_urb(cur_qh);
 +              if (dma_channel_status(dma) == MUSB_DMA_STATUS_BUSY) {
 +                      dma->status = MUSB_DMA_STATUS_CORE_ABORT;
 +                      musb->dma_controller->channel_abort(dma);
 +                      urb->actual_length += dma->actual_len;
 +                      dma->actual_len = 0L;
 +              }
 +              musb_save_toggle(cur_qh, is_in, urb);
 +
 +              if (is_in) {
 +                      /* move cur_qh to end of queue */
 +                      list_move_tail(&cur_qh->ring, &musb->in_bulk);
 +
 +                      /* get the next qh from musb->in_bulk */
 +                      next_qh = first_qh(&musb->in_bulk);
 +
 +                      /* set rx_reinit and schedule the next qh */
 +                      ep->rx_reinit = 1;
 +              } else {
 +                      /* move cur_qh to end of queue */
 +                      list_move_tail(&cur_qh->ring, &musb->out_bulk);
 +
 +                      /* get the next qh from musb->out_bulk */
 +                      next_qh = first_qh(&musb->out_bulk);
 +
 +                      /* set tx_reinit and schedule the next qh */
 +                      ep->tx_reinit = 1;
 +              }
 +              musb_start_urb(musb, is_in, next_qh);
 +      }
 +}
  
  /*
   * Service the default endpoint (ep0) as host.
@@@ -1212,7 -1116,6 +1212,7 @@@ void musb_host_tx(struct musb *musb, u
        void __iomem            *mbase = musb->mregs;
        struct dma_channel      *dma;
        bool                    transfer_pending = false;
 +      static bool use_sg;
  
        musb_ep_select(mbase, epnum);
        tx_csr = musb_readw(epio, MUSB_TXCSR);
                status = -ETIMEDOUT;
  
        } else if (tx_csr & MUSB_TXCSR_H_NAKTIMEOUT) {
 -              dev_dbg(musb->controller, "TX end=%d device not responding\n", epnum);
 -
 -              /* NOTE:  this code path would be a good place to PAUSE a
 -               * transfer, if there's some other (nonperiodic) tx urb
 -               * that could use this fifo.  (dma complicates it...)
 -               * That's already done for bulk RX transfers.
 -               *
 -               * if (bulk && qh->ring.next != &musb->out_bulk), then
 -               * we have a candidate... NAKing is *NOT* an error
 -               */
 -              musb_ep_select(mbase, epnum);
 -              musb_writew(epio, MUSB_TXCSR,
 -                              MUSB_TXCSR_H_WZC_BITS
 -                              | MUSB_TXCSR_TXPKTRDY);
 -              return;
 +              if (USB_ENDPOINT_XFER_BULK == qh->type && qh->mux == 1
 +                              && !list_is_singular(&musb->out_bulk)) {
 +                      dev_dbg(musb->controller,
 +                              "NAK timeout on TX%d ep\n", epnum);
 +                      musb_bulk_nak_timeout(musb, hw_ep, 0);
 +              } else {
 +                      dev_dbg(musb->controller,
 +                              "TX end=%d device not responding\n", epnum);
 +                      /* NOTE:  this code path would be a good place to PAUSE a
 +                       * transfer, if there's some other (nonperiodic) tx urb
 +                       * that could use this fifo.  (dma complicates it...)
 +                       * That's already done for bulk RX transfers.
 +                       *
 +                       * if (bulk && qh->ring.next != &musb->out_bulk), then
 +                       * we have a candidate... NAKing is *NOT* an error
 +                       */
 +                      musb_ep_select(mbase, epnum);
 +                      musb_writew(epio, MUSB_TXCSR,
 +                                      MUSB_TXCSR_H_WZC_BITS
 +                                      | MUSB_TXCSR_TXPKTRDY);
 +              }
 +                      return;
        }
  
 +done:
        if (status) {
                if (dma_channel_status(dma) == MUSB_DMA_STATUS_BUSY) {
                        dma->status = MUSB_DMA_STATUS_CORE_ABORT;
                length = qh->maxpacket;
        /* Unmap the buffer so that CPU can use it */
        usb_hcd_unmap_urb_for_dma(musb_to_hcd(musb), urb);
 -      musb_write_fifo(hw_ep, length, urb->transfer_buffer + offset);
 +
 +      /*
 +       * We need to map sg if the transfer_buffer is
 +       * NULL.
 +       */
 +      if (!urb->transfer_buffer)
 +              use_sg = true;
 +
 +      if (use_sg) {
 +              /* sg_miter_start is already done in musb_ep_program */
 +              if (!sg_miter_next(&qh->sg_miter)) {
 +                      dev_err(musb->controller, "error: sg list empty\n");
 +                      sg_miter_stop(&qh->sg_miter);
 +                      status = -EINVAL;
 +                      goto done;
 +              }
 +              urb->transfer_buffer = qh->sg_miter.addr;
 +              length = min_t(u32, length, qh->sg_miter.length);
 +              musb_write_fifo(hw_ep, length, urb->transfer_buffer);
 +              qh->sg_miter.consumed = length;
 +              sg_miter_stop(&qh->sg_miter);
 +      } else {
 +              musb_write_fifo(hw_ep, length, urb->transfer_buffer + offset);
 +      }
 +
        qh->segsize = length;
  
 +      if (use_sg) {
 +              if (offset + length >= urb->transfer_buffer_length)
 +                      use_sg = false;
 +      }
 +
        musb_ep_select(mbase, epnum);
        musb_writew(epio, MUSB_TXCSR,
                        MUSB_TXCSR_H_WZC_BITS | MUSB_TXCSR_TXPKTRDY);
  
  #endif
  
 -/* Schedule next QH from musb->in_bulk and move the current qh to
 - * the end; avoids starvation for other endpoints.
 - */
 -static void musb_bulk_rx_nak_timeout(struct musb *musb, struct musb_hw_ep *ep)
 -{
 -      struct dma_channel      *dma;
 -      struct urb              *urb;
 -      void __iomem            *mbase = musb->mregs;
 -      void __iomem            *epio = ep->regs;
 -      struct musb_qh          *cur_qh, *next_qh;
 -      u16                     rx_csr;
 -
 -      musb_ep_select(mbase, ep->epnum);
 -      dma = is_dma_capable() ? ep->rx_channel : NULL;
 -
 -      /* clear nak timeout bit */
 -      rx_csr = musb_readw(epio, MUSB_RXCSR);
 -      rx_csr |= MUSB_RXCSR_H_WZC_BITS;
 -      rx_csr &= ~MUSB_RXCSR_DATAERROR;
 -      musb_writew(epio, MUSB_RXCSR, rx_csr);
 -
 -      cur_qh = first_qh(&musb->in_bulk);
 -      if (cur_qh) {
 -              urb = next_urb(cur_qh);
 -              if (dma_channel_status(dma) == MUSB_DMA_STATUS_BUSY) {
 -                      dma->status = MUSB_DMA_STATUS_CORE_ABORT;
 -                      musb->dma_controller->channel_abort(dma);
 -                      urb->actual_length += dma->actual_len;
 -                      dma->actual_len = 0L;
 -              }
 -              musb_save_toggle(cur_qh, 1, urb);
 -
 -              /* move cur_qh to end of queue */
 -              list_move_tail(&cur_qh->ring, &musb->in_bulk);
 -
 -              /* get the next qh from musb->in_bulk */
 -              next_qh = first_qh(&musb->in_bulk);
 -
 -              /* set rx_reinit and schedule the next qh */
 -              ep->rx_reinit = 1;
 -              musb_start_urb(musb, 1, next_qh);
 -      }
 -}
 -
  /*
   * Service an RX interrupt for the given IN endpoint; docs cover bulk, iso,
   * and high-bandwidth IN transfer cases.
@@@ -1532,8 -1442,6 +1532,8 @@@ void musb_host_rx(struct musb *musb, u
        bool                    done = false;
        u32                     status;
        struct dma_channel      *dma;
 +      static bool use_sg;
 +      unsigned int sg_flags = SG_MITER_ATOMIC | SG_MITER_TO_SG;
  
        musb_ep_select(mbase, epnum);
  
                        if (usb_pipebulk(urb->pipe)
                                        && qh->mux == 1
                                        && !list_is_singular(&musb->in_bulk)) {
 -                              musb_bulk_rx_nak_timeout(musb, hw_ep);
 +                              musb_bulk_nak_timeout(musb, hw_ep, 1);
                                return;
                        }
                        musb_ep_select(mbase, epnum);
  #endif        /* Mentor DMA */
  
                if (!dma) {
 +                      unsigned int received_len;
 +
                        /* Unmap the buffer so that CPU can use it */
                        usb_hcd_unmap_urb_for_dma(musb_to_hcd(musb), urb);
 -                      done = musb_host_packet_rx(musb, urb,
 -                                      epnum, iso_err);
 +
 +                      /*
 +                       * We need to map sg if the transfer_buffer is
 +                       * NULL.
 +                       */
 +                      if (!urb->transfer_buffer) {
 +                              use_sg = true;
 +                              sg_miter_start(&qh->sg_miter, urb->sg, 1,
 +                                              sg_flags);
 +                      }
 +
 +                      if (use_sg) {
 +                              if (!sg_miter_next(&qh->sg_miter)) {
 +                                      dev_err(musb->controller, "error: sg list empty\n");
 +                                      sg_miter_stop(&qh->sg_miter);
 +                                      status = -EINVAL;
 +                                      done = true;
 +                                      goto finish;
 +                              }
 +                              urb->transfer_buffer = qh->sg_miter.addr;
 +                              received_len = urb->actual_length;
 +                              qh->offset = 0x0;
 +                              done = musb_host_packet_rx(musb, urb, epnum,
 +                                              iso_err);
 +                              /* Calculate the number of bytes received */
 +                              received_len = urb->actual_length -
 +                                      received_len;
 +                              qh->sg_miter.consumed = received_len;
 +                              sg_miter_stop(&qh->sg_miter);
 +                      } else {
 +                              done = musb_host_packet_rx(musb, urb,
 +                                              epnum, iso_err);
 +                      }
                        dev_dbg(musb->controller, "read %spacket\n", done ? "last " : "");
                }
        }
@@@ -1893,9 -1768,6 +1893,9 @@@ finish
        urb->actual_length += xfer_len;
        qh->offset += xfer_len;
        if (done) {
 +              if (use_sg)
 +                      use_sg = false;
 +
                if (urb->status == -EINPROGRESS)
                        urb->status = status;
                musb_advance_schedule(musb, urb, hw_ep, USB_DIR_IN);
@@@ -1991,14 -1863,14 +1991,14 @@@ static int musb_schedule
                else
                        head = &musb->out_bulk;
  
 -              /* Enable bulk RX NAK timeout scheme when bulk requests are
 +              /* Enable bulk RX/TX NAK timeout scheme when bulk requests are
                 * multiplexed.  This scheme doen't work in high speed to full
                 * speed scenario as NAK interrupts are not coming from a
                 * full speed device connected to a high speed device.
                 * NAK timeout interval is 8 (128 uframe or 16ms) for HS and
                 * 4 (8 frame or 8ms) for FS device.
                 */
 -              if (is_in && qh->dev)
 +              if (qh->dev)
                        qh->intv_reg =
                                (USB_SPEED_HIGH == qh->dev->speed) ? 8 : 4;
                goto success;
@@@ -2177,7 -2049,7 +2177,7 @@@ static int musb_urb_enqueue
         * we only have work to do in the former case.
         */
        spin_lock_irqsave(&musb->lock, flags);
-       if (hep->hcpriv) {
+       if (hep->hcpriv || !next_urb(qh)) {
                /* some concurrent activity submitted another urb to hep...
                 * odd, rare, error prone, but legal.
                 */
index 444b9ee06490dcd3a3e42ddda190b504d98f352d,c1be687e00ec722524f8807ff8d628ec7a5d0798..0fc6ca6bc60ac6e64b5f37ee9b3a67c8d978f609
@@@ -380,7 -380,7 +380,7 @@@ void dma_controller_destroy(struct dma_
        kfree(controller);
  }
  
 -struct dma_controller *__init
 +struct dma_controller *__devinit
  dma_controller_create(struct musb *musb, void __iomem *base)
  {
        struct musb_dma_controller *controller;
        struct platform_device *pdev = to_platform_device(dev);
        int irq = platform_get_irq_byname(pdev, "dma");
  
-       if (irq == 0) {
+       if (irq <= 0) {
                dev_err(dev, "No DMA interrupt line!\n");
                return NULL;
        }
index 6d77d2cb938fd61a47c298eaa2bc286ae93ceaec,f906b3aec2179ceb708c9cce772cd85a4e1a1724..dcc05fdb01bcbecefb3c602edbcb0d72fcbf2291
@@@ -55,6 -55,7 +55,6 @@@
  #define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>, Bill Ryder <bryder@sgi.com>, Kuba Ober <kuba@mareimbrium.org>, Andreas Mohr, Johan Hovold <jhovold@gmail.com>"
  #define DRIVER_DESC "USB FTDI Serial Converters Driver"
  
 -static bool debug;
  static __u16 vendor = FTDI_VID;
  static __u16 product;
  
@@@ -703,6 -704,7 +703,7 @@@ static struct usb_device_id id_table_co
        { USB_DEVICE(FTDI_VID, FTDI_PCDJ_DAC2_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_RRCIRKITS_LOCOBUFFER_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_ASK_RDR400_PID) },
+       { USB_DEVICE(FTDI_VID, FTDI_NZR_SEM_USB_PID) },
        { USB_DEVICE(ICOM_VID, ICOM_ID_1_PID) },
        { USB_DEVICE(ICOM_VID, ICOM_OPC_U_UC_PID) },
        { USB_DEVICE(ICOM_VID, ICOM_ID_RP2C1_PID) },
                .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
        { USB_DEVICE(ADI_VID, ADI_GNICEPLUS_PID),
                .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
-       { USB_DEVICE(MICROCHIP_VID, MICROCHIP_USB_BOARD_PID) },
+       { USB_DEVICE_AND_INTERFACE_INFO(MICROCHIP_VID, MICROCHIP_USB_BOARD_PID,
+                                       USB_CLASS_VENDOR_SPEC,
+                                       USB_SUBCLASS_VENDOR_SPEC, 0x00) },
        { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) },
        { USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID),
                .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
        { USB_DEVICE(LARSENBRUSGAARD_VID, LB_ALTITRACK_PID) },
        { USB_DEVICE(GN_OTOMETRICS_VID, AURICAL_USB_PID) },
+       { USB_DEVICE(FTDI_VID, PI_C865_PID) },
+       { USB_DEVICE(FTDI_VID, PI_C857_PID) },
+       { USB_DEVICE(PI_VID, PI_C866_PID) },
+       { USB_DEVICE(PI_VID, PI_C663_PID) },
+       { USB_DEVICE(PI_VID, PI_C725_PID) },
+       { USB_DEVICE(PI_VID, PI_E517_PID) },
+       { USB_DEVICE(PI_VID, PI_C863_PID) },
        { USB_DEVICE(PI_VID, PI_E861_PID) },
+       { USB_DEVICE(PI_VID, PI_C867_PID) },
+       { USB_DEVICE(PI_VID, PI_E609_PID) },
+       { USB_DEVICE(PI_VID, PI_E709_PID) },
+       { USB_DEVICE(PI_VID, PI_100F_PID) },
+       { USB_DEVICE(PI_VID, PI_1011_PID) },
+       { USB_DEVICE(PI_VID, PI_1012_PID) },
+       { USB_DEVICE(PI_VID, PI_1013_PID) },
+       { USB_DEVICE(PI_VID, PI_1014_PID) },
+       { USB_DEVICE(PI_VID, PI_1015_PID) },
+       { USB_DEVICE(PI_VID, PI_1016_PID) },
        { USB_DEVICE(KONDO_VID, KONDO_USB_SERIAL_PID) },
        { USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) },
        { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID),
@@@ -1042,12 -1063,11 +1062,12 @@@ static int update_mctrl(struct usb_seri
                                                        unsigned int clear)
  {
        struct ftdi_private *priv = usb_get_serial_port_data(port);
 +      struct device *dev = &port->dev;
        unsigned urb_value;
        int rv;
  
        if (((set | clear) & (TIOCM_DTR | TIOCM_RTS)) == 0) {
 -              dbg("%s - DTR|RTS not being set|cleared", __func__);
 +              dev_dbg(dev, "%s - DTR|RTS not being set|cleared\n", __func__);
                return 0;       /* no change */
        }
  
                               urb_value, priv->interface,
                               NULL, 0, WDR_TIMEOUT);
        if (rv < 0) {
 -              dbg("%s Error from MODEM_CTRL urb: DTR %s, RTS %s",
 -                              __func__,
 -                              (set & TIOCM_DTR) ? "HIGH" :
 -                              (clear & TIOCM_DTR) ? "LOW" : "unchanged",
 -                              (set & TIOCM_RTS) ? "HIGH" :
 -                              (clear & TIOCM_RTS) ? "LOW" : "unchanged");
 +              dev_dbg(dev, "%s Error from MODEM_CTRL urb: DTR %s, RTS %s\n",
 +                      __func__,
 +                      (set & TIOCM_DTR) ? "HIGH" : (clear & TIOCM_DTR) ? "LOW" : "unchanged",
 +                      (set & TIOCM_RTS) ? "HIGH" : (clear & TIOCM_RTS) ? "LOW" : "unchanged");
        } else {
 -              dbg("%s - DTR %s, RTS %s", __func__,
 -                              (set & TIOCM_DTR) ? "HIGH" :
 -                              (clear & TIOCM_DTR) ? "LOW" : "unchanged",
 -                              (set & TIOCM_RTS) ? "HIGH" :
 -                              (clear & TIOCM_RTS) ? "LOW" : "unchanged");
 +              dev_dbg(dev, "%s - DTR %s, RTS %s\n", __func__,
 +                      (set & TIOCM_DTR) ? "HIGH" : (clear & TIOCM_DTR) ? "LOW" : "unchanged",
 +                      (set & TIOCM_RTS) ? "HIGH" : (clear & TIOCM_RTS) ? "LOW" : "unchanged");
                /* FIXME: locking on last_dtr_rts */
                priv->last_dtr_rts = (priv->last_dtr_rts & ~clear) | set;
        }
@@@ -1087,7 -1111,6 +1107,7 @@@ static __u32 get_ftdi_divisor(struct tt
                                                struct usb_serial_port *port)
  {
        struct ftdi_private *priv = usb_get_serial_port_data(port);
 +      struct device *dev = &port->dev;
        __u32 div_value = 0;
        int div_okay = 1;
        int baud;
              alt_speed hack */
  
        baud = tty_get_baud_rate(tty);
 -      dbg("%s - tty_get_baud_rate reports speed %d", __func__, baud);
 +      dev_dbg(dev, "%s - tty_get_baud_rate reports speed %d\n", __func__, baud);
  
        /* 2. Observe async-compatible custom_divisor hack, update baudrate
           if needed */
            ((priv->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) &&
             (priv->custom_divisor)) {
                baud = priv->baud_base / priv->custom_divisor;
 -              dbg("%s - custom divisor %d sets baud rate to %d",
 -                              __func__, priv->custom_divisor, baud);
 +              dev_dbg(dev, "%s - custom divisor %d sets baud rate to %d\n",
 +                      __func__, priv->custom_divisor, baud);
        }
  
        /* 3. Convert baudrate to device-specific divisor */
                case 115200: div_value = ftdi_sio_b115200; break;
                } /* baud */
                if (div_value == 0) {
 -                      dbg("%s - Baudrate (%d) requested is not supported",
 -                                                      __func__,  baud);
 +                      dev_dbg(dev, "%s - Baudrate (%d) requested is not supported\n",
 +                              __func__,  baud);
                        div_value = ftdi_sio_b9600;
                        baud = 9600;
                        div_okay = 0;
                if (baud <= 3000000) {
                        div_value = ftdi_232am_baud_to_divisor(baud);
                } else {
 -                      dbg("%s - Baud rate too high!", __func__);
 +                      dev_dbg(dev, "%s - Baud rate too high!\n", __func__);
                        baud = 9600;
                        div_value = ftdi_232am_baud_to_divisor(9600);
                        div_okay = 0;
                        }
                        div_value = ftdi_232bm_baud_to_divisor(baud);
                } else {
 -                      dbg("%s - Baud rate too high!", __func__);
 +                      dev_dbg(dev, "%s - Baud rate too high!\n", __func__);
                        div_value = ftdi_232bm_baud_to_divisor(9600);
                        div_okay = 0;
                        baud = 9600;
                } else if (baud < 1200) {
                        div_value = ftdi_232bm_baud_to_divisor(baud);
                } else {
 -                      dbg("%s - Baud rate too high!", __func__);
 +                      dev_dbg(dev, "%s - Baud rate too high!\n", __func__);
                        div_value = ftdi_232bm_baud_to_divisor(9600);
                        div_okay = 0;
                        baud = 9600;
        } /* priv->chip_type */
  
        if (div_okay) {
 -              dbg("%s - Baud rate set to %d (divisor 0x%lX) on chip %s",
 +              dev_dbg(dev, "%s - Baud rate set to %d (divisor 0x%lX) on chip %s\n",
                        __func__, baud, (unsigned long)div_value,
                        ftdi_chip_name[priv->chip_type]);
        }
@@@ -1258,7 -1281,7 +1278,7 @@@ static int write_latency_timer(struct u
        if (priv->flags & ASYNC_LOW_LATENCY)
                l = 1;
  
 -      dbg("%s: setting latency timer = %i", __func__, l);
 +      dev_dbg(&port->dev, "%s: setting latency timer = %i\n", __func__, l);
  
        rv = usb_control_msg(udev,
                             usb_sndctrlpipe(udev, 0),
@@@ -1413,8 -1436,8 +1433,8 @@@ static void ftdi_determine_type(struct 
  
        version = le16_to_cpu(udev->descriptor.bcdDevice);
        interfaces = udev->actconfig->desc.bNumInterfaces;
 -      dbg("%s: bcdDevice = 0x%x, bNumInterfaces = %u", __func__,
 -                      version, interfaces);
 +      dev_dbg(&port->dev, "%s: bcdDevice = 0x%x, bNumInterfaces = %u\n", __func__,
 +              version, interfaces);
        if (interfaces > 1) {
                int inter;
  
                /* BM-type devices have a bug where bcdDevice gets set
                 * to 0x200 when iSerialNumber is 0.  */
                if (version < 0x500) {
 -                      dbg("%s: something fishy - bcdDevice too low for multi-interface device",
 -                                      __func__);
 +                      dev_dbg(&port->dev,
 +                              "%s: something fishy - bcdDevice too low for multi-interface device\n",
 +                              __func__);
                }
        } else if (version < 0x200) {
                /* Old device.  Assume it's the original SIO. */
@@@ -1560,7 -1582,7 +1580,7 @@@ static ssize_t store_event_char(struct 
        int v = simple_strtoul(valbuf, NULL, 10);
        int rv;
  
 -      dbg("%s: setting event char = %i", __func__, v);
 +      dev_dbg(&port->dev, "%s: setting event char = %i\n", __func__, v);
  
        rv = usb_control_msg(udev,
                             usb_sndctrlpipe(udev, 0),
                             v, priv->interface,
                             NULL, 0, WDR_TIMEOUT);
        if (rv < 0) {
 -              dbg("Unable to write event character: %i", rv);
 +              dev_dbg(&port->dev, "Unable to write event character: %i\n", rv);
                return -EIO;
        }
  
@@@ -1588,7 -1610,7 +1608,7 @@@ static int create_sysfs_attrs(struct us
        /* XXX I've no idea if the original SIO supports the event_char
         * sysfs parameter, so I'm playing it safe.  */
        if (priv->chip_type != SIO) {
 -              dbg("sysfs attributes for %s", ftdi_chip_name[priv->chip_type]);
 +              dev_dbg(&port->dev, "sysfs attributes for %s\n", ftdi_chip_name[priv->chip_type]);
                retval = device_create_file(&port->dev, &dev_attr_event_char);
                if ((!retval) &&
                    (priv->chip_type == FT232BM ||
@@@ -1728,8 -1750,8 +1748,8 @@@ static int ftdi_NDI_device_setup(struc
        if (latency > 99)
                latency = 99;
  
 -      dbg("%s setting NDI device latency to %d", __func__, latency);
 -      dev_info(&udev->dev, "NDI device with a latency value of %d", latency);
 +      dev_dbg(&udev->dev, "%s setting NDI device latency to %d\n", __func__, latency);
 +      dev_info(&udev->dev, "NDI device with a latency value of %d\n", latency);
  
        /* FIXME: errors are not returned */
        usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
@@@ -1947,7 -1969,7 +1967,7 @@@ static int ftdi_process_packet(struct t
        char *ch;
  
        if (len < 2) {
 -              dbg("malformed packet");
 +              dev_dbg(&port->dev, "malformed packet\n");
                return 0;
        }
  
@@@ -2062,12 -2084,12 +2082,12 @@@ static void ftdi_break_ctl(struct tty_s
                        FTDI_SIO_SET_DATA_REQUEST_TYPE,
                        urb_value , priv->interface,
                        NULL, 0, WDR_TIMEOUT) < 0) {
 -              dev_err(&port->dev, "%s FAILED to enable/disable break state "
 -                      "(state was %d)\n", __func__, break_state);
 +              dev_err(&port->dev, "%s FAILED to enable/disable break state (state was %d)\n",
 +                      __func__, break_state);
        }
  
 -      dbg("%s break state is %d - urb is %d", __func__,
 -                                              break_state, urb_value);
 +      dev_dbg(&port->dev, "%s break state is %d - urb is %d\n", __func__,
 +              break_state, urb_value);
  
  }
  
@@@ -2079,7 -2101,6 +2099,7 @@@ static void ftdi_set_termios(struct tty
                struct usb_serial_port *port, struct ktermios *old_termios)
  {
        struct usb_device *dev = port->serial->dev;
 +      struct device *ddev = &port->dev;
        struct ftdi_private *priv = usb_get_serial_port_data(port);
        struct ktermios *termios = tty->termios;
        unsigned int cflag = termios->c_cflag;
        /* Force baud rate if this device requires it, unless it is set to
           B0. */
        if (priv->force_baud && ((termios->c_cflag & CBAUD) != B0)) {
 -              dbg("%s: forcing baud rate for this device", __func__);
 +              dev_dbg(ddev, "%s: forcing baud rate for this device\n", __func__);
                tty_encode_baud_rate(tty, priv->force_baud,
                                        priv->force_baud);
        }
  
        /* Force RTS-CTS if this device requires it. */
        if (priv->force_rtscts) {
 -              dbg("%s: forcing rtscts for this device", __func__);
 +              dev_dbg(ddev, "%s: forcing rtscts for this device\n", __func__);
                termios->c_cflag |= CRTSCTS;
        }
  
        cflag = termios->c_cflag;
  
 -      if (old_termios == 0)
 +      if (!old_termios)
                goto no_skip;
  
        if (old_termios->c_cflag == termios->c_cflag
@@@ -2142,16 -2163,10 +2162,16 @@@ no_skip
        }
        if (cflag & CSIZE) {
                switch (cflag & CSIZE) {
 -              case CS7: urb_value |= 7; dbg("Setting CS7"); break;
 -              case CS8: urb_value |= 8; dbg("Setting CS8"); break;
 +              case CS7:
 +                      urb_value |= 7;
 +                      dev_dbg(ddev, "Setting CS7\n");
 +                      break;
 +              case CS8:
 +                      urb_value |= 8;
 +                      dev_dbg(ddev, "Setting CS8\n");
 +                      break;
                default:
 -                      dev_err(&port->dev, "CSIZE was set but not CS7-CS8\n");
 +                      dev_err(ddev, "CSIZE was set but not CS7-CS8\n");
                }
        }
  
                            FTDI_SIO_SET_DATA_REQUEST_TYPE,
                            urb_value , priv->interface,
                            NULL, 0, WDR_SHORT_TIMEOUT) < 0) {
 -              dev_err(&port->dev, "%s FAILED to set "
 -                      "databits/stopbits/parity\n", __func__);
 +              dev_err(ddev, "%s FAILED to set databits/stopbits/parity\n",
 +                      __func__);
        }
  
        /* Now do the baudrate */
@@@ -2177,7 -2192,8 +2197,7 @@@ no_data_parity_stop_changes
                                    FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
                                    0, priv->interface,
                                    NULL, 0, WDR_TIMEOUT) < 0) {
 -                      dev_err(&port->dev,
 -                              "%s error from disable flowcontrol urb\n",
 +                      dev_err(ddev, "%s error from disable flowcontrol urb\n",
                                __func__);
                }
                /* Drop RTS and DTR */
                /* set the baudrate determined before */
                mutex_lock(&priv->cfg_lock);
                if (change_speed(tty, port))
 -                      dev_err(&port->dev, "%s urb failed to set baudrate\n",
 -                              __func__);
 +                      dev_err(ddev, "%s urb failed to set baudrate\n", __func__);
                mutex_unlock(&priv->cfg_lock);
                /* Ensure RTS and DTR are raised when baudrate changed from 0 */
                if (!old_termios || (old_termios->c_cflag & CBAUD) == B0)
        /* Note device also supports DTR/CD (ugh) and Xon/Xoff in hardware */
  no_c_cflag_changes:
        if (cflag & CRTSCTS) {
 -              dbg("%s Setting to CRTSCTS flow control", __func__);
 +              dev_dbg(ddev, "%s Setting to CRTSCTS flow control\n", __func__);
                if (usb_control_msg(dev,
                                    usb_sndctrlpipe(dev, 0),
                                    FTDI_SIO_SET_FLOW_CTRL_REQUEST,
                                    FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
                                    0 , (FTDI_SIO_RTS_CTS_HS | priv->interface),
                                    NULL, 0, WDR_TIMEOUT) < 0) {
 -                      dev_err(&port->dev,
 -                              "urb failed to set to rts/cts flow control\n");
 +                      dev_err(ddev, "urb failed to set to rts/cts flow control\n");
                }
 -
        } else {
                /*
                 * Xon/Xoff code
                 * code is executed.
                 */
                if (iflag & IXOFF) {
 -                      dbg("%s  request to enable xonxoff iflag=%04x",
 -                                                      __func__, iflag);
 +                      dev_dbg(ddev, "%s  request to enable xonxoff iflag=%04x\n",
 +                              __func__, iflag);
                        /* Try to enable the XON/XOFF on the ftdi_sio
                         * Set the vstart and vstop -- could have been done up
                         * above where a lot of other dereferencing is done but
                        /* else clause to only run if cflag ! CRTSCTS and iflag
                         * ! XOFF. CHECKME Assuming XON/XOFF handled by tty
                         * stack - not by device */
 -                      dbg("%s Turning off hardware flow control", __func__);
 +                      dev_dbg(ddev, "%s Turning off hardware flow control\n", __func__);
                        if (usb_control_msg(dev,
                                            usb_sndctrlpipe(dev, 0),
                                            FTDI_SIO_SET_FLOW_CTRL_REQUEST,
                                            FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE,
                                            0, priv->interface,
                                            NULL, 0, WDR_TIMEOUT) < 0) {
 -                              dev_err(&port->dev,
 -                                      "urb failed to clear flow control\n");
 +                              dev_err(ddev, "urb failed to clear flow control\n");
                        }
                }
 -
        }
  }
  
@@@ -2344,7 -2365,7 +2364,7 @@@ static int ftdi_ioctl(struct tty_struc
        struct async_icount cnow;
        struct async_icount cprev;
  
 -      dbg("%s cmd 0x%04x", __func__, cmd);
 +      dev_dbg(&port->dev, "%s cmd 0x%04x\n", __func__, cmd);
  
        /* Based on code from acm.c and others */
        switch (cmd) {
        /* This is not necessarily an error - turns out the higher layers
         * will do some ioctls themselves (see comment above)
         */
 -      dbg("%s arg not supported - it was 0x%04x - check /usr/include/asm/ioctls.h", __func__, cmd);
 +      dev_dbg(&port->dev, "%s arg not supported - it was 0x%04x - check /usr/include/asm/ioctls.h\n",
 +              __func__, cmd);
        return -ENOIOCTLCMD;
  }
  
@@@ -2430,6 -2450,8 +2450,6 @@@ MODULE_AUTHOR(DRIVER_AUTHOR)
  MODULE_DESCRIPTION(DRIVER_DESC);
  MODULE_LICENSE("GPL");
  
 -module_param(debug, bool, S_IRUGO | S_IWUSR);
 -MODULE_PARM_DESC(debug, "Debug enabled or not");
  module_param(vendor, ushort, 0);
  MODULE_PARM_DESC(vendor, "User specified vendor ID (default="
                __MODULE_STRING(FTDI_VID)")");
index 3229368eaab2bae3eb0636756d98b21edfe8e4eb,5ce88d1bc6f1e3ac15ac91290ad8cb2fd5935361..53bd5f491c5d4f37fe37de11d257b33550897a15
@@@ -886,8 -886,6 +886,6 @@@ static const struct usb_device_id optio
        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1010, 0xff, 0xff, 0xff),
          .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1012, 0xff, 0xff, 0xff) },
-       { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1018, 0xff, 0xff, 0xff),
-         .driver_info = (kernel_ulong_t)&net_intf3_blacklist },
        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1057, 0xff, 0xff, 0xff) },
        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1058, 0xff, 0xff, 0xff) },
        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1059, 0xff, 0xff, 0xff) },
         .driver_info = (kernel_ulong_t)&zte_ad3812_z_blacklist },
        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MC2716, 0xff, 0xff, 0xff),
         .driver_info = (kernel_ulong_t)&zte_mc2716_z_blacklist },
+       { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x01) },
+       { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x05) },
+       { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x86, 0x10) },
        { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) },
        { USB_DEVICE(DLINK_VENDOR_ID, DLINK_PRODUCT_DWM_652) },
        { USB_DEVICE(ALINK_VENDOR_ID, DLINK_PRODUCT_DWM_652_U5) }, /* Yes, ALINK_VENDOR_ID */
@@@ -1255,6 -1257,8 +1257,6 @@@ static struct usb_serial_driver * cons
        &option_1port_device, NULL
  };
  
 -static bool debug;
 -
  struct option_private {
        u8 bInterfaceNumber;
  };
@@@ -1365,19 -1369,18 +1367,19 @@@ static void option_instat_callback(stru
  {
        int err;
        int status = urb->status;
 -      struct usb_serial_port *port =  urb->context;
 +      struct usb_serial_port *port = urb->context;
 +      struct device *dev = &port->dev;
        struct usb_wwan_port_private *portdata =
                                        usb_get_serial_port_data(port);
  
 -      dbg("%s: urb %p port %p has data %p", __func__, urb, port, portdata);
 +      dev_dbg(dev, "%s: urb %p port %p has data %p\n", __func__, urb, port, portdata);
  
        if (status == 0) {
                struct usb_ctrlrequest *req_pkt =
                                (struct usb_ctrlrequest *)urb->transfer_buffer;
  
                if (!req_pkt) {
 -                      dbg("%s: NULL req_pkt", __func__);
 +                      dev_dbg(dev, "%s: NULL req_pkt\n", __func__);
                        return;
                }
                if ((req_pkt->bRequestType == 0xA1) &&
                                        urb->transfer_buffer +
                                        sizeof(struct usb_ctrlrequest));
  
 -                      dbg("%s: signal x%x", __func__, signals);
 +                      dev_dbg(dev, "%s: signal x%x\n", __func__, signals);
  
                        old_dcd_state = portdata->dcd_state;
                        portdata->cts_state = 1;
                                tty_kref_put(tty);
                        }
                } else {
 -                      dbg("%s: type %x req %x", __func__,
 +                      dev_dbg(dev, "%s: type %x req %x\n", __func__,
                                req_pkt->bRequestType, req_pkt->bRequest);
                }
        } else
 -              dev_err(&port->dev, "%s: error %d\n", __func__, status);
 +              dev_err(dev, "%s: error %d\n", __func__, status);
  
        /* Resubmit urb so we continue receiving IRQ data */
        if (status != -ESHUTDOWN && status != -ENOENT) {
                err = usb_submit_urb(urb, GFP_ATOMIC);
                if (err)
 -                      dbg("%s: resubmit intr urb failed. (%d)",
 +                      dev_dbg(dev, "%s: resubmit intr urb failed. (%d)\n",
                                __func__, err);
        }
  }
@@@ -1447,3 -1450,6 +1449,3 @@@ MODULE_AUTHOR(DRIVER_AUTHOR)
  MODULE_DESCRIPTION(DRIVER_DESC);
  MODULE_VERSION(DRIVER_VERSION);
  MODULE_LICENSE("GPL");
 -
 -module_param(debug, bool, S_IRUGO | S_IWUSR);
 -MODULE_PARM_DESC(debug, "Debug messages");
This page took 0.068246 seconds and 5 git commands to generate.