Merge tag 'v3.19-rc5' into next
Linux 3.19-rc5 Conflicts: drivers/usb/dwc2/gadget.c drivers/usb/gadget/udc/bdc/bdc_ep.c
This commit is contained in:
@@ -669,7 +669,6 @@ static int ci_hdrc_probe(struct platform_device *pdev)
|
||||
if (!ci)
|
||||
return -ENOMEM;
|
||||
|
||||
platform_set_drvdata(pdev, ci);
|
||||
ci->dev = dev;
|
||||
ci->platdata = dev_get_platdata(dev);
|
||||
ci->imx28_write_fix = !!(ci->platdata->flags &
|
||||
@@ -783,6 +782,7 @@ static int ci_hdrc_probe(struct platform_device *pdev)
|
||||
}
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, ci);
|
||||
ret = devm_request_irq(dev, ci->irq, ci_irq, IRQF_SHARED,
|
||||
ci->platdata->name, ci);
|
||||
if (ret)
|
||||
|
||||
@@ -91,6 +91,7 @@ static int host_start(struct ci_hdrc *ci)
|
||||
if (!hcd)
|
||||
return -ENOMEM;
|
||||
|
||||
dev_set_drvdata(ci->dev, ci);
|
||||
hcd->rsrc_start = ci->hw_bank.phys;
|
||||
hcd->rsrc_len = ci->hw_bank.size;
|
||||
hcd->regs = ci->hw_bank.abs;
|
||||
|
||||
@@ -2602,7 +2602,7 @@ error:
|
||||
* s3c_hsotg_ep_disable - disable given endpoint
|
||||
* @ep: The endpoint to disable.
|
||||
*/
|
||||
static int s3c_hsotg_ep_disable(struct usb_ep *ep)
|
||||
static int s3c_hsotg_ep_disable_force(struct usb_ep *ep, bool force)
|
||||
{
|
||||
struct s3c_hsotg_ep *hs_ep = our_ep(ep);
|
||||
struct dwc2_hsotg *hsotg = hs_ep->parent;
|
||||
@@ -2645,6 +2645,10 @@ static int s3c_hsotg_ep_disable(struct usb_ep *ep)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int s3c_hsotg_ep_disable(struct usb_ep *ep)
|
||||
{
|
||||
return s3c_hsotg_ep_disable_force(ep, false);
|
||||
}
|
||||
/**
|
||||
* on_list - check request is on the given endpoint
|
||||
* @ep: The endpoint to check.
|
||||
|
||||
@@ -30,6 +30,8 @@
|
||||
#define PCI_DEVICE_ID_INTEL_BYT 0x0f37
|
||||
#define PCI_DEVICE_ID_INTEL_MRFLD 0x119e
|
||||
#define PCI_DEVICE_ID_INTEL_BSW 0x22B7
|
||||
#define PCI_DEVICE_ID_INTEL_SPTLP 0x9d30
|
||||
#define PCI_DEVICE_ID_INTEL_SPTH 0xa130
|
||||
|
||||
static int dwc3_pci_quirks(struct pci_dev *pdev)
|
||||
{
|
||||
@@ -139,6 +141,8 @@ static const struct pci_device_id dwc3_pci_id_table[] = {
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BSW), },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BYT), },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MRFLD), },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SPTLP), },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SPTH), },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_NL_USB), },
|
||||
{ } /* Terminating Entry */
|
||||
};
|
||||
|
||||
@@ -879,8 +879,7 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep, bool starting)
|
||||
|
||||
if (i == (request->num_mapped_sgs - 1) ||
|
||||
sg_is_last(s)) {
|
||||
if (list_is_last(&req->list,
|
||||
&dep->request_list))
|
||||
if (list_empty(&dep->request_list))
|
||||
last_one = true;
|
||||
chain = false;
|
||||
}
|
||||
@@ -898,6 +897,9 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep, bool starting)
|
||||
if (last_one)
|
||||
break;
|
||||
}
|
||||
|
||||
if (last_one)
|
||||
break;
|
||||
} else {
|
||||
dma = req->request.dma;
|
||||
length = req->request.length;
|
||||
|
||||
@@ -399,8 +399,9 @@ static int hidg_setup(struct usb_function *f,
|
||||
value = __le16_to_cpu(ctrl->wValue);
|
||||
length = __le16_to_cpu(ctrl->wLength);
|
||||
|
||||
VDBG(cdev, "hid_setup crtl_request : bRequestType:0x%x bRequest:0x%x "
|
||||
"Value:0x%x\n", ctrl->bRequestType, ctrl->bRequest, value);
|
||||
VDBG(cdev,
|
||||
"%s crtl_request : bRequestType:0x%x bRequest:0x%x Value:0x%x\n",
|
||||
__func__, ctrl->bRequestType, ctrl->bRequest, value);
|
||||
|
||||
switch ((ctrl->bRequestType << 8) | ctrl->bRequest) {
|
||||
case ((USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8
|
||||
|
||||
@@ -520,7 +520,7 @@ static void f_midi_transmit(struct f_midi *midi, struct usb_request *req)
|
||||
req = midi_alloc_ep_req(ep, midi->buflen);
|
||||
|
||||
if (!req) {
|
||||
ERROR(midi, "gmidi_transmit: alloc_ep_request failed\n");
|
||||
ERROR(midi, "%s: alloc_ep_request failed\n", __func__);
|
||||
return;
|
||||
}
|
||||
req->length = 0;
|
||||
|
||||
@@ -901,7 +901,6 @@ static void f_audio_free_inst(struct usb_function_instance *f)
|
||||
struct f_uac1_opts *opts;
|
||||
|
||||
opts = container_of(f, struct f_uac1_opts, func_inst);
|
||||
gaudio_cleanup(opts->card);
|
||||
if (opts->fn_play_alloc)
|
||||
kfree(opts->fn_play);
|
||||
if (opts->fn_cap_alloc)
|
||||
@@ -939,6 +938,7 @@ static void f_audio_free(struct usb_function *f)
|
||||
struct f_audio *audio = func_to_audio(f);
|
||||
struct f_uac1_opts *opts;
|
||||
|
||||
gaudio_cleanup(&audio->card);
|
||||
opts = container_of(f->fi, struct f_uac1_opts, func_inst);
|
||||
kfree(audio);
|
||||
mutex_lock(&opts->lock);
|
||||
|
||||
@@ -441,6 +441,7 @@ ep_write (struct file *fd, const char __user *buf, size_t len, loff_t *ptr)
|
||||
kbuf = memdup_user(buf, len);
|
||||
if (IS_ERR(kbuf)) {
|
||||
value = PTR_ERR(kbuf);
|
||||
kbuf = NULL;
|
||||
goto free1;
|
||||
}
|
||||
|
||||
@@ -449,6 +450,7 @@ ep_write (struct file *fd, const char __user *buf, size_t len, loff_t *ptr)
|
||||
data->name, len, (int) value);
|
||||
free1:
|
||||
mutex_unlock(&data->lock);
|
||||
kfree (kbuf);
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
@@ -720,10 +720,10 @@ static int queue_dma(struct usba_udc *udc, struct usba_ep *ep,
|
||||
req->using_dma = 1;
|
||||
req->ctrl = USBA_BF(DMA_BUF_LEN, req->req.length)
|
||||
| USBA_DMA_CH_EN | USBA_DMA_END_BUF_IE
|
||||
| USBA_DMA_END_TR_EN | USBA_DMA_END_TR_IE;
|
||||
| USBA_DMA_END_BUF_EN;
|
||||
|
||||
if (ep->is_in)
|
||||
req->ctrl |= USBA_DMA_END_BUF_EN;
|
||||
if (!ep->is_in)
|
||||
req->ctrl |= USBA_DMA_END_TR_EN | USBA_DMA_END_TR_IE;
|
||||
|
||||
/*
|
||||
* Add this request to the queue and submit for DMA if
|
||||
@@ -832,7 +832,7 @@ static int usba_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req)
|
||||
{
|
||||
struct usba_ep *ep = to_usba_ep(_ep);
|
||||
struct usba_udc *udc = ep->udc;
|
||||
struct usba_request *req = to_usba_req(_req);
|
||||
struct usba_request *req;
|
||||
unsigned long flags;
|
||||
u32 status;
|
||||
|
||||
@@ -841,6 +841,16 @@ static int usba_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req)
|
||||
|
||||
spin_lock_irqsave(&udc->lock, flags);
|
||||
|
||||
list_for_each_entry(req, &ep->queue, queue) {
|
||||
if (&req->req == _req)
|
||||
break;
|
||||
}
|
||||
|
||||
if (&req->req != _req) {
|
||||
spin_unlock_irqrestore(&udc->lock, flags);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (req->using_dma) {
|
||||
/*
|
||||
* If this request is currently being transferred,
|
||||
@@ -1567,7 +1577,6 @@ static void usba_ep_irq(struct usba_udc *udc, struct usba_ep *ep)
|
||||
if ((epstatus & epctrl) & USBA_RX_BK_RDY) {
|
||||
DBG(DBG_BUS, "%s: RX data ready\n", ep->ep.name);
|
||||
receive_data(ep);
|
||||
usba_ep_writel(ep, CLR_STA, USBA_RX_BK_RDY);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -718,10 +718,11 @@ static int ep_queue(struct bdc_ep *ep, struct bdc_req *req)
|
||||
struct bdc *bdc;
|
||||
int ret = 0;
|
||||
|
||||
bdc = ep->bdc;
|
||||
if (!req || !ep->usb_ep.desc)
|
||||
return -EINVAL;
|
||||
|
||||
bdc = ep->bdc;
|
||||
|
||||
req->usb_req.actual = 0;
|
||||
req->usb_req.status = -EINPROGRESS;
|
||||
req->epnum = ep->ep_num;
|
||||
|
||||
@@ -1581,6 +1581,10 @@ iso_stream_schedule (
|
||||
else
|
||||
next = (now + 2 + 7) & ~0x07; /* full frame cache */
|
||||
|
||||
/* If needed, initialize last_iso_frame so that this URB will be seen */
|
||||
if (ehci->isoc_count == 0)
|
||||
ehci->last_iso_frame = now >> 3;
|
||||
|
||||
/*
|
||||
* Use ehci->last_iso_frame as the base. There can't be any
|
||||
* TDs scheduled for earlier than that.
|
||||
@@ -1600,11 +1604,11 @@ iso_stream_schedule (
|
||||
*/
|
||||
now2 = (now - base) & (mod - 1);
|
||||
|
||||
/* Is the schedule already full? */
|
||||
/* Is the schedule about to wrap around? */
|
||||
if (unlikely(!empty && start < period)) {
|
||||
ehci_dbg(ehci, "iso sched full %p (%u-%u < %u mod %u)\n",
|
||||
ehci_dbg(ehci, "request %p would overflow (%u-%u < %u mod %u)\n",
|
||||
urb, stream->next_uframe, base, period, mod);
|
||||
status = -ENOSPC;
|
||||
status = -EFBIG;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
@@ -1671,10 +1675,6 @@ iso_stream_schedule (
|
||||
urb->start_frame = start & (mod - 1);
|
||||
if (!stream->highspeed)
|
||||
urb->start_frame >>= 3;
|
||||
|
||||
/* Make sure scan_isoc() sees these */
|
||||
if (ehci->isoc_count == 0)
|
||||
ehci->last_iso_frame = now >> 3;
|
||||
return status;
|
||||
|
||||
fail:
|
||||
|
||||
@@ -451,7 +451,7 @@ static int tegra_ehci_probe(struct platform_device *pdev)
|
||||
|
||||
u_phy = devm_usb_get_phy_by_phandle(&pdev->dev, "nvidia,phy", 0);
|
||||
if (IS_ERR(u_phy)) {
|
||||
err = PTR_ERR(u_phy);
|
||||
err = -EPROBE_DEFER;
|
||||
goto cleanup_clk_en;
|
||||
}
|
||||
hcd->usb_phy = u_phy;
|
||||
|
||||
@@ -567,7 +567,8 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev)
|
||||
{
|
||||
void __iomem *base;
|
||||
u32 control;
|
||||
u32 fminterval;
|
||||
u32 fminterval = 0;
|
||||
bool no_fminterval = false;
|
||||
int cnt;
|
||||
|
||||
if (!mmio_resource_enabled(pdev, 0))
|
||||
@@ -577,6 +578,13 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev)
|
||||
if (base == NULL)
|
||||
return;
|
||||
|
||||
/*
|
||||
* ULi M5237 OHCI controller locks the whole system when accessing
|
||||
* the OHCI_FMINTERVAL offset.
|
||||
*/
|
||||
if (pdev->vendor == PCI_VENDOR_ID_AL && pdev->device == 0x5237)
|
||||
no_fminterval = true;
|
||||
|
||||
control = readl(base + OHCI_CONTROL);
|
||||
|
||||
/* On PA-RISC, PDC can leave IR set incorrectly; ignore it there. */
|
||||
@@ -615,7 +623,9 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev)
|
||||
}
|
||||
|
||||
/* software reset of the controller, preserving HcFmInterval */
|
||||
fminterval = readl(base + OHCI_FMINTERVAL);
|
||||
if (!no_fminterval)
|
||||
fminterval = readl(base + OHCI_FMINTERVAL);
|
||||
|
||||
writel(OHCI_HCR, base + OHCI_CMDSTATUS);
|
||||
|
||||
/* reset requires max 10 us delay */
|
||||
@@ -624,7 +634,9 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev)
|
||||
break;
|
||||
udelay(1);
|
||||
}
|
||||
writel(fminterval, base + OHCI_FMINTERVAL);
|
||||
|
||||
if (!no_fminterval)
|
||||
writel(fminterval, base + OHCI_FMINTERVAL);
|
||||
|
||||
/* Now the controller is safely in SUSPEND and nothing can wake it up */
|
||||
iounmap(base);
|
||||
|
||||
@@ -82,6 +82,8 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
|
||||
"must be suspended extra slowly",
|
||||
pdev->revision);
|
||||
}
|
||||
if (pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK)
|
||||
xhci->quirks |= XHCI_BROKEN_STREAMS;
|
||||
/* Fresco Logic confirms: all revisions of this chip do not
|
||||
* support MSI, even though some of them claim to in their PCI
|
||||
* capabilities.
|
||||
|
||||
@@ -3803,6 +3803,15 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (setup == SETUP_CONTEXT_ONLY) {
|
||||
slot_ctx = xhci_get_slot_ctx(xhci, virt_dev->out_ctx);
|
||||
if (GET_SLOT_STATE(le32_to_cpu(slot_ctx->dev_state)) ==
|
||||
SLOT_STATE_DEFAULT) {
|
||||
xhci_dbg(xhci, "Slot already in default state\n");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
command = xhci_alloc_command(xhci, false, false, GFP_KERNEL);
|
||||
if (!command)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -72,6 +72,8 @@ config USB_MUSB_DA8XX
|
||||
|
||||
config USB_MUSB_TUSB6010
|
||||
tristate "TUSB6010"
|
||||
depends on ARCH_OMAP2PLUS || COMPILE_TEST
|
||||
depends on NOP_USB_XCEIV = USB_MUSB_HDRC # both built-in or both modules
|
||||
|
||||
config USB_MUSB_OMAP2PLUS
|
||||
tristate "OMAP2430 and onwards"
|
||||
@@ -85,6 +87,7 @@ config USB_MUSB_AM35X
|
||||
config USB_MUSB_DSPS
|
||||
tristate "TI DSPS platforms"
|
||||
select USB_MUSB_AM335X_CHILD
|
||||
depends on ARCH_OMAP2PLUS || COMPILE_TEST
|
||||
depends on OF_IRQ
|
||||
|
||||
config USB_MUSB_BLACKFIN
|
||||
@@ -93,6 +96,7 @@ config USB_MUSB_BLACKFIN
|
||||
|
||||
config USB_MUSB_UX500
|
||||
tristate "Ux500 platforms"
|
||||
depends on ARCH_U8500 || COMPILE_TEST
|
||||
|
||||
config USB_MUSB_JZ4740
|
||||
tristate "JZ4740"
|
||||
|
||||
@@ -63,7 +63,7 @@ static void bfin_writew(void __iomem *addr, unsigned offset, u16 data)
|
||||
bfin_write16(addr + offset, data);
|
||||
}
|
||||
|
||||
static void binf_writel(void __iomem *addr, unsigned offset, u32 data)
|
||||
static void bfin_writel(void __iomem *addr, unsigned offset, u32 data)
|
||||
{
|
||||
bfin_write16(addr + offset, (u16)data);
|
||||
}
|
||||
|
||||
@@ -628,9 +628,9 @@ static int cppi41_dma_controller_start(struct cppi41_dma_controller *controller)
|
||||
ret = of_property_read_string_index(np, "dma-names", i, &str);
|
||||
if (ret)
|
||||
goto err;
|
||||
if (!strncmp(str, "tx", 2))
|
||||
if (strstarts(str, "tx"))
|
||||
is_tx = 1;
|
||||
else if (!strncmp(str, "rx", 2))
|
||||
else if (strstarts(str, "rx"))
|
||||
is_tx = 0;
|
||||
else {
|
||||
dev_err(dev, "Wrong dmatype %s\n", str);
|
||||
|
||||
@@ -59,20 +59,12 @@ static const struct musb_register_map musb_regmap[] = {
|
||||
{ "RxMaxPp", MUSB_RXMAXP, 16 },
|
||||
{ "RxCSR", MUSB_RXCSR, 16 },
|
||||
{ "RxCount", MUSB_RXCOUNT, 16 },
|
||||
{ "ConfigData", MUSB_CONFIGDATA,8 },
|
||||
{ "IntrRxE", MUSB_INTRRXE, 16 },
|
||||
{ "IntrTxE", MUSB_INTRTXE, 16 },
|
||||
{ "IntrUsbE", MUSB_INTRUSBE, 8 },
|
||||
{ "DevCtl", MUSB_DEVCTL, 8 },
|
||||
{ "BabbleCtl", MUSB_BABBLE_CTL,8 },
|
||||
{ "TxFIFOsz", MUSB_TXFIFOSZ, 8 },
|
||||
{ "RxFIFOsz", MUSB_RXFIFOSZ, 8 },
|
||||
{ "TxFIFOadd", MUSB_TXFIFOADD, 16 },
|
||||
{ "RxFIFOadd", MUSB_RXFIFOADD, 16 },
|
||||
{ "VControl", 0x68, 32 },
|
||||
{ "HWVers", 0x69, 16 },
|
||||
{ "EPInfo", MUSB_EPINFO, 8 },
|
||||
{ "RAMInfo", MUSB_RAMINFO, 8 },
|
||||
{ "LinkInfo", MUSB_LINKINFO, 8 },
|
||||
{ "VPLen", MUSB_VPLEN, 8 },
|
||||
{ "HS_EOF1", MUSB_HS_EOF1, 8 },
|
||||
@@ -103,6 +95,16 @@ static const struct musb_register_map musb_regmap[] = {
|
||||
{ "DMA_CNTLch7", 0x274, 16 },
|
||||
{ "DMA_ADDRch7", 0x278, 32 },
|
||||
{ "DMA_COUNTch7", 0x27C, 32 },
|
||||
#ifndef CONFIG_BLACKFIN
|
||||
{ "ConfigData", MUSB_CONFIGDATA,8 },
|
||||
{ "BabbleCtl", MUSB_BABBLE_CTL,8 },
|
||||
{ "TxFIFOsz", MUSB_TXFIFOSZ, 8 },
|
||||
{ "RxFIFOsz", MUSB_RXFIFOSZ, 8 },
|
||||
{ "TxFIFOadd", MUSB_TXFIFOADD, 16 },
|
||||
{ "RxFIFOadd", MUSB_RXFIFOADD, 16 },
|
||||
{ "EPInfo", MUSB_EPINFO, 8 },
|
||||
{ "RAMInfo", MUSB_RAMINFO, 8 },
|
||||
#endif
|
||||
{ } /* Terminating Entry */
|
||||
};
|
||||
|
||||
@@ -197,30 +199,30 @@ static ssize_t musb_test_mode_write(struct file *file,
|
||||
if (copy_from_user(buf, ubuf, min_t(size_t, sizeof(buf) - 1, count)))
|
||||
return -EFAULT;
|
||||
|
||||
if (!strncmp(buf, "force host", 9))
|
||||
if (strstarts(buf, "force host"))
|
||||
test = MUSB_TEST_FORCE_HOST;
|
||||
|
||||
if (!strncmp(buf, "fifo access", 11))
|
||||
if (strstarts(buf, "fifo access"))
|
||||
test = MUSB_TEST_FIFO_ACCESS;
|
||||
|
||||
if (!strncmp(buf, "force full-speed", 15))
|
||||
if (strstarts(buf, "force full-speed"))
|
||||
test = MUSB_TEST_FORCE_FS;
|
||||
|
||||
if (!strncmp(buf, "force high-speed", 15))
|
||||
if (strstarts(buf, "force high-speed"))
|
||||
test = MUSB_TEST_FORCE_HS;
|
||||
|
||||
if (!strncmp(buf, "test packet", 10)) {
|
||||
if (strstarts(buf, "test packet")) {
|
||||
test = MUSB_TEST_PACKET;
|
||||
musb_load_testpacket(musb);
|
||||
}
|
||||
|
||||
if (!strncmp(buf, "test K", 6))
|
||||
if (strstarts(buf, "test K"))
|
||||
test = MUSB_TEST_K;
|
||||
|
||||
if (!strncmp(buf, "test J", 6))
|
||||
if (strstarts(buf, "test J"))
|
||||
test = MUSB_TEST_J;
|
||||
|
||||
if (!strncmp(buf, "test SE0 NAK", 12))
|
||||
if (strstarts(buf, "test SE0 NAK"))
|
||||
test = MUSB_TEST_SE0_NAK;
|
||||
|
||||
musb_writeb(musb->mregs, MUSB_TESTMODE, test);
|
||||
|
||||
@@ -2663,7 +2663,6 @@ void musb_host_cleanup(struct musb *musb)
|
||||
if (musb->port_mode == MUSB_PORT_MODE_GADGET)
|
||||
return;
|
||||
usb_remove_hcd(musb->hcd);
|
||||
musb->hcd = NULL;
|
||||
}
|
||||
|
||||
void musb_host_free(struct musb *musb)
|
||||
|
||||
@@ -338,7 +338,6 @@ static void mv_otg_update_inputs(struct mv_otg *mvotg)
|
||||
static void mv_otg_update_state(struct mv_otg *mvotg)
|
||||
{
|
||||
struct mv_otg_ctrl *otg_ctrl = &mvotg->otg_ctrl;
|
||||
struct usb_phy *phy = &mvotg->phy;
|
||||
int old_state = mvotg->phy.otg->state;
|
||||
|
||||
switch (old_state) {
|
||||
@@ -858,10 +857,10 @@ static int mv_otg_suspend(struct platform_device *pdev, pm_message_t state)
|
||||
{
|
||||
struct mv_otg *mvotg = platform_get_drvdata(pdev);
|
||||
|
||||
if (mvotg->phy.state != OTG_STATE_B_IDLE) {
|
||||
if (mvotg->phy.otg->state != OTG_STATE_B_IDLE) {
|
||||
dev_info(&pdev->dev,
|
||||
"OTG state is not B_IDLE, it is %d!\n",
|
||||
mvotg->phy.state);
|
||||
mvotg->phy.otg->state);
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ static struct usb_phy *__usb_find_phy(struct list_head *list,
|
||||
return phy;
|
||||
}
|
||||
|
||||
return ERR_PTR(-ENODEV);
|
||||
return ERR_PTR(-EPROBE_DEFER);
|
||||
}
|
||||
|
||||
static struct usb_phy *__usb_find_phy_dev(struct device *dev,
|
||||
@@ -59,6 +59,9 @@ static struct usb_phy *__of_usb_find_phy(struct device_node *node)
|
||||
{
|
||||
struct usb_phy *phy;
|
||||
|
||||
if (!of_device_is_available(node))
|
||||
return ERR_PTR(-ENODEV);
|
||||
|
||||
list_for_each_entry(phy, &phy_list, head) {
|
||||
if (node != phy->dev->of_node)
|
||||
continue;
|
||||
@@ -66,7 +69,7 @@ static struct usb_phy *__of_usb_find_phy(struct device_node *node)
|
||||
return phy;
|
||||
}
|
||||
|
||||
return ERR_PTR(-ENODEV);
|
||||
return ERR_PTR(-EPROBE_DEFER);
|
||||
}
|
||||
|
||||
static void devm_usb_phy_release(struct device *dev, void *res)
|
||||
@@ -190,10 +193,13 @@ struct usb_phy *devm_usb_get_phy_by_phandle(struct device *dev,
|
||||
spin_lock_irqsave(&phy_lock, flags);
|
||||
|
||||
phy = __of_usb_find_phy(node);
|
||||
if (IS_ERR(phy) || !try_module_get(phy->dev->driver->owner)) {
|
||||
if (!IS_ERR(phy))
|
||||
phy = ERR_PTR(-EPROBE_DEFER);
|
||||
if (IS_ERR(phy)) {
|
||||
devres_free(ptr);
|
||||
goto err1;
|
||||
}
|
||||
|
||||
if (!try_module_get(phy->dev->driver->owner)) {
|
||||
phy = ERR_PTR(-ENODEV);
|
||||
devres_free(ptr);
|
||||
goto err1;
|
||||
}
|
||||
|
||||
@@ -46,6 +46,8 @@ static struct console usbcons;
|
||||
* ------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static const struct tty_operations usb_console_fake_tty_ops = {
|
||||
};
|
||||
|
||||
/*
|
||||
* The parsing of the command line works exactly like the
|
||||
@@ -137,13 +139,17 @@ static int usb_console_setup(struct console *co, char *options)
|
||||
goto reset_open_count;
|
||||
}
|
||||
kref_init(&tty->kref);
|
||||
tty_port_tty_set(&port->port, tty);
|
||||
tty->driver = usb_serial_tty_driver;
|
||||
tty->index = co->index;
|
||||
init_ldsem(&tty->ldisc_sem);
|
||||
INIT_LIST_HEAD(&tty->tty_files);
|
||||
kref_get(&tty->driver->kref);
|
||||
tty->ops = &usb_console_fake_tty_ops;
|
||||
if (tty_init_termios(tty)) {
|
||||
retval = -ENOMEM;
|
||||
goto free_tty;
|
||||
goto put_tty;
|
||||
}
|
||||
tty_port_tty_set(&port->port, tty);
|
||||
}
|
||||
|
||||
/* only call the device specific open if this
|
||||
@@ -161,7 +167,7 @@ static int usb_console_setup(struct console *co, char *options)
|
||||
serial->type->set_termios(tty, port, &dummy);
|
||||
|
||||
tty_port_tty_set(&port->port, NULL);
|
||||
kfree(tty);
|
||||
tty_kref_put(tty);
|
||||
}
|
||||
set_bit(ASYNCB_INITIALIZED, &port->port.flags);
|
||||
}
|
||||
@@ -177,8 +183,8 @@ static int usb_console_setup(struct console *co, char *options)
|
||||
|
||||
fail:
|
||||
tty_port_tty_set(&port->port, NULL);
|
||||
free_tty:
|
||||
kfree(tty);
|
||||
put_tty:
|
||||
tty_kref_put(tty);
|
||||
reset_open_count:
|
||||
port->port.count = 0;
|
||||
usb_autopm_put_interface(serial->interface);
|
||||
|
||||
@@ -120,10 +120,12 @@ static const struct usb_device_id id_table[] = {
|
||||
{ USB_DEVICE(0x10C4, 0x85F8) }, /* Virtenio Preon32 */
|
||||
{ USB_DEVICE(0x10C4, 0x8664) }, /* AC-Services CAN-IF */
|
||||
{ USB_DEVICE(0x10C4, 0x8665) }, /* AC-Services OBD-IF */
|
||||
{ USB_DEVICE(0x10C4, 0x8875) }, /* CEL MeshConnect USB Stick */
|
||||
{ USB_DEVICE(0x10C4, 0x8856) }, /* CEL EM357 ZigBee USB Stick - LR */
|
||||
{ USB_DEVICE(0x10C4, 0x8857) }, /* CEL EM357 ZigBee USB Stick */
|
||||
{ USB_DEVICE(0x10C4, 0x88A4) }, /* MMB Networks ZigBee USB Device */
|
||||
{ USB_DEVICE(0x10C4, 0x88A5) }, /* Planet Innovation Ingeni ZigBee USB Device */
|
||||
{ USB_DEVICE(0x10C4, 0x8946) }, /* Ketra N1 Wireless Interface */
|
||||
{ USB_DEVICE(0x10C4, 0x8977) }, /* CEL MeshWorks DevKit Device */
|
||||
{ USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */
|
||||
{ USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */
|
||||
{ USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */
|
||||
|
||||
@@ -286,7 +286,7 @@ static int usb_serial_generic_submit_read_urb(struct usb_serial_port *port,
|
||||
|
||||
res = usb_submit_urb(port->read_urbs[index], mem_flags);
|
||||
if (res) {
|
||||
if (res != -EPERM) {
|
||||
if (res != -EPERM && res != -ENODEV) {
|
||||
dev_err(&port->dev,
|
||||
"%s - usb_submit_urb failed: %d\n",
|
||||
__func__, res);
|
||||
@@ -373,7 +373,7 @@ void usb_serial_generic_read_bulk_callback(struct urb *urb)
|
||||
__func__, urb->status);
|
||||
return;
|
||||
default:
|
||||
dev_err(&port->dev, "%s - nonzero urb status: %d\n",
|
||||
dev_dbg(&port->dev, "%s - nonzero urb status: %d\n",
|
||||
__func__, urb->status);
|
||||
goto resubmit;
|
||||
}
|
||||
|
||||
@@ -410,6 +410,8 @@ static void usa26_instat_callback(struct urb *urb)
|
||||
}
|
||||
port = serial->port[msg->port];
|
||||
p_priv = usb_get_serial_port_data(port);
|
||||
if (!p_priv)
|
||||
goto resubmit;
|
||||
|
||||
/* Update handshaking pin state information */
|
||||
old_dcd_state = p_priv->dcd_state;
|
||||
@@ -420,7 +422,7 @@ static void usa26_instat_callback(struct urb *urb)
|
||||
|
||||
if (old_dcd_state != p_priv->dcd_state)
|
||||
tty_port_tty_hangup(&port->port, true);
|
||||
|
||||
resubmit:
|
||||
/* Resubmit urb so we continue receiving */
|
||||
err = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
if (err != 0)
|
||||
@@ -527,6 +529,8 @@ static void usa28_instat_callback(struct urb *urb)
|
||||
}
|
||||
port = serial->port[msg->port];
|
||||
p_priv = usb_get_serial_port_data(port);
|
||||
if (!p_priv)
|
||||
goto resubmit;
|
||||
|
||||
/* Update handshaking pin state information */
|
||||
old_dcd_state = p_priv->dcd_state;
|
||||
@@ -537,7 +541,7 @@ static void usa28_instat_callback(struct urb *urb)
|
||||
|
||||
if (old_dcd_state != p_priv->dcd_state && old_dcd_state)
|
||||
tty_port_tty_hangup(&port->port, true);
|
||||
|
||||
resubmit:
|
||||
/* Resubmit urb so we continue receiving */
|
||||
err = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
if (err != 0)
|
||||
@@ -607,6 +611,8 @@ static void usa49_instat_callback(struct urb *urb)
|
||||
}
|
||||
port = serial->port[msg->portNumber];
|
||||
p_priv = usb_get_serial_port_data(port);
|
||||
if (!p_priv)
|
||||
goto resubmit;
|
||||
|
||||
/* Update handshaking pin state information */
|
||||
old_dcd_state = p_priv->dcd_state;
|
||||
@@ -617,7 +623,7 @@ static void usa49_instat_callback(struct urb *urb)
|
||||
|
||||
if (old_dcd_state != p_priv->dcd_state && old_dcd_state)
|
||||
tty_port_tty_hangup(&port->port, true);
|
||||
|
||||
resubmit:
|
||||
/* Resubmit urb so we continue receiving */
|
||||
err = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
if (err != 0)
|
||||
@@ -855,6 +861,8 @@ static void usa90_instat_callback(struct urb *urb)
|
||||
|
||||
port = serial->port[0];
|
||||
p_priv = usb_get_serial_port_data(port);
|
||||
if (!p_priv)
|
||||
goto resubmit;
|
||||
|
||||
/* Update handshaking pin state information */
|
||||
old_dcd_state = p_priv->dcd_state;
|
||||
@@ -865,7 +873,7 @@ static void usa90_instat_callback(struct urb *urb)
|
||||
|
||||
if (old_dcd_state != p_priv->dcd_state && old_dcd_state)
|
||||
tty_port_tty_hangup(&port->port, true);
|
||||
|
||||
resubmit:
|
||||
/* Resubmit urb so we continue receiving */
|
||||
err = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
if (err != 0)
|
||||
@@ -926,6 +934,8 @@ static void usa67_instat_callback(struct urb *urb)
|
||||
|
||||
port = serial->port[msg->port];
|
||||
p_priv = usb_get_serial_port_data(port);
|
||||
if (!p_priv)
|
||||
goto resubmit;
|
||||
|
||||
/* Update handshaking pin state information */
|
||||
old_dcd_state = p_priv->dcd_state;
|
||||
@@ -934,7 +944,7 @@ static void usa67_instat_callback(struct urb *urb)
|
||||
|
||||
if (old_dcd_state != p_priv->dcd_state && old_dcd_state)
|
||||
tty_port_tty_hangup(&port->port, true);
|
||||
|
||||
resubmit:
|
||||
/* Resubmit urb so we continue receiving */
|
||||
err = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
if (err != 0)
|
||||
|
||||
@@ -234,6 +234,8 @@ static void option_instat_callback(struct urb *urb);
|
||||
|
||||
#define QUALCOMM_VENDOR_ID 0x05C6
|
||||
|
||||
#define SIERRA_VENDOR_ID 0x1199
|
||||
|
||||
#define CMOTECH_VENDOR_ID 0x16d8
|
||||
#define CMOTECH_PRODUCT_6001 0x6001
|
||||
#define CMOTECH_PRODUCT_CMU_300 0x6002
|
||||
@@ -512,7 +514,7 @@ enum option_blacklist_reason {
|
||||
OPTION_BLACKLIST_RESERVED_IF = 2
|
||||
};
|
||||
|
||||
#define MAX_BL_NUM 8
|
||||
#define MAX_BL_NUM 11
|
||||
struct option_blacklist_info {
|
||||
/* bitfield of interface numbers for OPTION_BLACKLIST_SENDSETUP */
|
||||
const unsigned long sendsetup;
|
||||
@@ -601,6 +603,11 @@ static const struct option_blacklist_info telit_le920_blacklist = {
|
||||
.reserved = BIT(1) | BIT(5),
|
||||
};
|
||||
|
||||
static const struct option_blacklist_info sierra_mc73xx_blacklist = {
|
||||
.sendsetup = BIT(0) | BIT(2),
|
||||
.reserved = BIT(8) | BIT(10) | BIT(11),
|
||||
};
|
||||
|
||||
static const struct usb_device_id option_ids[] = {
|
||||
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
|
||||
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
|
||||
@@ -1098,6 +1105,8 @@ static const struct usb_device_id option_ids[] = {
|
||||
{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */
|
||||
{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */
|
||||
{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */
|
||||
{ USB_DEVICE_INTERFACE_CLASS(SIERRA_VENDOR_ID, 0x68c0, 0xff),
|
||||
.driver_info = (kernel_ulong_t)&sierra_mc73xx_blacklist }, /* MC73xx */
|
||||
{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) },
|
||||
{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) },
|
||||
{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6003),
|
||||
|
||||
@@ -142,7 +142,6 @@ static const struct usb_device_id id_table[] = {
|
||||
{DEVICE_SWI(0x0f3d, 0x68a2)}, /* Sierra Wireless MC7700 */
|
||||
{DEVICE_SWI(0x114f, 0x68a2)}, /* Sierra Wireless MC7750 */
|
||||
{DEVICE_SWI(0x1199, 0x68a2)}, /* Sierra Wireless MC7710 */
|
||||
{DEVICE_SWI(0x1199, 0x68c0)}, /* Sierra Wireless MC73xx */
|
||||
{DEVICE_SWI(0x1199, 0x901c)}, /* Sierra Wireless EM7700 */
|
||||
{DEVICE_SWI(0x1199, 0x901f)}, /* Sierra Wireless EM7355 */
|
||||
{DEVICE_SWI(0x1199, 0x9040)}, /* Sierra Wireless Modem */
|
||||
|
||||
@@ -69,16 +69,39 @@ static int uas_use_uas_driver(struct usb_interface *intf,
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* ASM1051 and older ASM1053 devices have the same usb-id, and UAS is
|
||||
* broken on the ASM1051, use the number of streams to differentiate.
|
||||
* New ASM1053-s also support 32 streams, but have a different prod-id.
|
||||
* ASMedia has a number of usb3 to sata bridge chips, at the time of
|
||||
* this writing the following versions exist:
|
||||
* ASM1051 - no uas support version
|
||||
* ASM1051 - with broken (*) uas support
|
||||
* ASM1053 - with working uas support
|
||||
* ASM1153 - with working uas support
|
||||
*
|
||||
* Devices with these chips re-use a number of device-ids over the
|
||||
* entire line, so the device-id is useless to determine if we're
|
||||
* dealing with an ASM1051 (which we want to avoid).
|
||||
*
|
||||
* The ASM1153 can be identified by config.MaxPower == 0,
|
||||
* where as the ASM105x models have config.MaxPower == 36.
|
||||
*
|
||||
* Differentiating between the ASM1053 and ASM1051 is trickier, when
|
||||
* connected over USB-3 we can look at the number of streams supported,
|
||||
* ASM1051 supports 32 streams, where as early ASM1053 versions support
|
||||
* 16 streams, newer ASM1053-s also support 32 streams, but have a
|
||||
* different prod-id.
|
||||
*
|
||||
* (*) ASM1051 chips do work with UAS with some disks (with the
|
||||
* US_FL_NO_REPORT_OPCODES quirk), but are broken with other disks
|
||||
*/
|
||||
if (le16_to_cpu(udev->descriptor.idVendor) == 0x174c &&
|
||||
le16_to_cpu(udev->descriptor.idProduct) == 0x55aa) {
|
||||
if (udev->speed < USB_SPEED_SUPER) {
|
||||
(le16_to_cpu(udev->descriptor.idProduct) == 0x5106 ||
|
||||
le16_to_cpu(udev->descriptor.idProduct) == 0x55aa)) {
|
||||
if (udev->actconfig->desc.bMaxPower == 0) {
|
||||
/* ASM1153, do nothing */
|
||||
} else if (udev->speed < USB_SPEED_SUPER) {
|
||||
/* No streams info, assume ASM1051 */
|
||||
flags |= US_FL_IGNORE_UAS;
|
||||
} else if (usb_ss_max_streams(&eps[1]->ss_ep_comp) == 32) {
|
||||
/* Possibly an ASM1051, disable uas */
|
||||
flags |= US_FL_IGNORE_UAS;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,6 +40,16 @@
|
||||
* and don't forget to CC: the USB development list <linux-usb@vger.kernel.org>
|
||||
*/
|
||||
|
||||
/*
|
||||
* Apricorn USB3 dongle sometimes returns "USBSUSBSUSBS" in response to SCSI
|
||||
* commands in UAS mode. Observed with the 1.28 firmware; are there others?
|
||||
*/
|
||||
UNUSUAL_DEV(0x0984, 0x0301, 0x0128, 0x0128,
|
||||
"Apricorn",
|
||||
"",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_IGNORE_UAS),
|
||||
|
||||
/* https://bugzilla.kernel.org/show_bug.cgi?id=79511 */
|
||||
UNUSUAL_DEV(0x0bc2, 0x2312, 0x0000, 0x9999,
|
||||
"Seagate",
|
||||
@@ -68,6 +78,20 @@ UNUSUAL_DEV(0x0bc2, 0xa003, 0x0000, 0x9999,
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_NO_ATA_1X),
|
||||
|
||||
/* Reported-by: Marcin Zajączkowski <mszpak@wp.pl> */
|
||||
UNUSUAL_DEV(0x0bc2, 0xa013, 0x0000, 0x9999,
|
||||
"Seagate",
|
||||
"Backup Plus",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_NO_ATA_1X),
|
||||
|
||||
/* Reported-by: Hans de Goede <hdegoede@redhat.com> */
|
||||
UNUSUAL_DEV(0x0bc2, 0xa0a4, 0x0000, 0x9999,
|
||||
"Seagate",
|
||||
"Backup Plus Desk",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_NO_ATA_1X),
|
||||
|
||||
/* https://bbs.archlinux.org/viewtopic.php?id=183190 */
|
||||
UNUSUAL_DEV(0x0bc2, 0xab20, 0x0000, 0x9999,
|
||||
"Seagate",
|
||||
@@ -82,6 +106,13 @@ UNUSUAL_DEV(0x0bc2, 0xab21, 0x0000, 0x9999,
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_NO_ATA_1X),
|
||||
|
||||
/* Reported-by: G. Richard Bellamy <rbellamy@pteradigm.com> */
|
||||
UNUSUAL_DEV(0x0bc2, 0xab2a, 0x0000, 0x9999,
|
||||
"Seagate",
|
||||
"BUP Fast HDD",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_NO_ATA_1X),
|
||||
|
||||
/* Reported-by: Claudio Bizzarri <claudio.bizzarri@gmail.com> */
|
||||
UNUSUAL_DEV(0x152d, 0x0567, 0x0000, 0x9999,
|
||||
"JMicron",
|
||||
@@ -89,14 +120,6 @@ UNUSUAL_DEV(0x152d, 0x0567, 0x0000, 0x9999,
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_NO_REPORT_OPCODES),
|
||||
|
||||
/* Most ASM1051 based devices have issues with uas, blacklist them all */
|
||||
/* Reported-by: Hans de Goede <hdegoede@redhat.com> */
|
||||
UNUSUAL_DEV(0x174c, 0x5106, 0x0000, 0x9999,
|
||||
"ASMedia",
|
||||
"ASM1051",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_IGNORE_UAS),
|
||||
|
||||
/* Reported-by: Hans de Goede <hdegoede@redhat.com> */
|
||||
UNUSUAL_DEV(0x2109, 0x0711, 0x0000, 0x9999,
|
||||
"VIA",
|
||||
@@ -104,6 +127,13 @@ UNUSUAL_DEV(0x2109, 0x0711, 0x0000, 0x9999,
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_NO_ATA_1X),
|
||||
|
||||
/* Reported-by: Takeo Nakayama <javhera@gmx.com> */
|
||||
UNUSUAL_DEV(0x357d, 0x7788, 0x0000, 0x9999,
|
||||
"JMicron",
|
||||
"JMS566",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_NO_REPORT_OPCODES),
|
||||
|
||||
/* Reported-by: Hans de Goede <hdegoede@redhat.com> */
|
||||
UNUSUAL_DEV(0x4971, 0x1012, 0x0000, 0x9999,
|
||||
"Hitachi",
|
||||
|
||||
Reference in New Issue
Block a user