Commit 79600d4b authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'usb-3.19-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb

Pull USB fixes from Greg KH:
 "Here is a bunch of USB fixes for 3.19-rc5.

  Most of these are gadget driver fixes, along with the xhci driver fix
  that we both reported having problems with, as well as some new device
  ids and other tiny fixes.

  All have been in linux-next with no problems"

* tag 'usb-3.19-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (43 commits)
  usb: dwc3: gadget: Stop TRB preparation after limit is reached
  usb: dwc3: gadget: Fix TRB preparation during SG
  usb: phy: mv-usb: fix usb_phy build errors
  usb: serial: handle -ENODEV quietly in generic_submit_read_urb
  usb: serial: silence all non-critical read errors
  USB: console: fix potential use after free
  USB: console: fix uninitialised ldisc semaphore
  usb: gadget: udc: atmel: fix possible oops when unloading module
  usb: gadget: gadgetfs: fix an oops in ep_write()
  usb: phy: Fix deferred probing
  OHCI: add a quirk for ULi M5237 blocking on reset
  uas: Add US_FL_NO_ATA_1X for 2 more Seagate disk enclosures
  uas: Do not blacklist ASM1153 disk enclosures
  usb: gadget: udc: avoid dereference before NULL check in ep_queue
  usb: host: ehci-tegra: request deferred probe when failing to get phy
  uas: disable UAS on Apricorn SATA dongles
  uas: Add US_FL_NO_REPORT_OPCODES for JMicron JMS566 with usb-id 0bc2:a013
  uas: Add US_FL_NO_ATA_1X for Seagate devices with usb-id 0bc2:a013
  xhci: Add broken-streams quirk for Fresco Logic FL1000G xhci controllers
  USB: EHCI: adjust error return code
  ...
parents fa818dc4 f8359dae
...@@ -1050,7 +1050,8 @@ static int miphy28lp_init(struct phy *phy) ...@@ -1050,7 +1050,8 @@ static int miphy28lp_init(struct phy *phy)
ret = miphy28lp_init_usb3(miphy_phy); ret = miphy28lp_init_usb3(miphy_phy);
break; break;
default: default:
return -EINVAL; ret = -EINVAL;
break;
} }
mutex_unlock(&miphy_dev->miphy_mutex); mutex_unlock(&miphy_dev->miphy_mutex);
......
...@@ -29,10 +29,9 @@ ...@@ -29,10 +29,9 @@
/** /**
* omap_control_pcie_pcs - set the PCS delay count * omap_control_pcie_pcs - set the PCS delay count
* @dev: the control module device * @dev: the control module device
* @id: index of the pcie PHY (should be 1 or 2)
* @delay: 8 bit delay value * @delay: 8 bit delay value
*/ */
void omap_control_pcie_pcs(struct device *dev, u8 id, u8 delay) void omap_control_pcie_pcs(struct device *dev, u8 delay)
{ {
u32 val; u32 val;
struct omap_control_phy *control_phy; struct omap_control_phy *control_phy;
...@@ -55,8 +54,8 @@ void omap_control_pcie_pcs(struct device *dev, u8 id, u8 delay) ...@@ -55,8 +54,8 @@ void omap_control_pcie_pcs(struct device *dev, u8 id, u8 delay)
val = readl(control_phy->pcie_pcs); val = readl(control_phy->pcie_pcs);
val &= ~(OMAP_CTRL_PCIE_PCS_MASK << val &= ~(OMAP_CTRL_PCIE_PCS_MASK <<
(id * OMAP_CTRL_PCIE_PCS_DELAY_COUNT_SHIFT)); OMAP_CTRL_PCIE_PCS_DELAY_COUNT_SHIFT);
val |= delay << (id * OMAP_CTRL_PCIE_PCS_DELAY_COUNT_SHIFT); val |= (delay << OMAP_CTRL_PCIE_PCS_DELAY_COUNT_SHIFT);
writel(val, control_phy->pcie_pcs); writel(val, control_phy->pcie_pcs);
} }
EXPORT_SYMBOL_GPL(omap_control_pcie_pcs); EXPORT_SYMBOL_GPL(omap_control_pcie_pcs);
......
...@@ -244,7 +244,8 @@ static int sun4i_usb_phy_probe(struct platform_device *pdev) ...@@ -244,7 +244,8 @@ static int sun4i_usb_phy_probe(struct platform_device *pdev)
else else
data->num_phys = 3; data->num_phys = 3;
if (of_device_is_compatible(np, "allwinner,sun4i-a10-usb-phy")) if (of_device_is_compatible(np, "allwinner,sun4i-a10-usb-phy") ||
of_device_is_compatible(np, "allwinner,sun6i-a31-usb-phy"))
data->disc_thresh = 3; data->disc_thresh = 3;
else else
data->disc_thresh = 2; data->disc_thresh = 2;
......
...@@ -82,7 +82,6 @@ struct ti_pipe3 { ...@@ -82,7 +82,6 @@ struct ti_pipe3 {
struct clk *refclk; struct clk *refclk;
struct clk *div_clk; struct clk *div_clk;
struct pipe3_dpll_map *dpll_map; struct pipe3_dpll_map *dpll_map;
u8 id;
}; };
static struct pipe3_dpll_map dpll_map_usb[] = { static struct pipe3_dpll_map dpll_map_usb[] = {
...@@ -217,8 +216,13 @@ static int ti_pipe3_init(struct phy *x) ...@@ -217,8 +216,13 @@ static int ti_pipe3_init(struct phy *x)
u32 val; u32 val;
int ret = 0; int ret = 0;
/*
* Set pcie_pcs register to 0x96 for proper functioning of phy
* as recommended in AM572x TRM SPRUHZ6, section 18.5.2.2, table
* 18-1804.
*/
if (of_device_is_compatible(phy->dev->of_node, "ti,phy-pipe3-pcie")) { if (of_device_is_compatible(phy->dev->of_node, "ti,phy-pipe3-pcie")) {
omap_control_pcie_pcs(phy->control_dev, phy->id, 0xF1); omap_control_pcie_pcs(phy->control_dev, 0x96);
return 0; return 0;
} }
...@@ -347,8 +351,6 @@ static int ti_pipe3_probe(struct platform_device *pdev) ...@@ -347,8 +351,6 @@ static int ti_pipe3_probe(struct platform_device *pdev)
} }
if (of_device_is_compatible(node, "ti,phy-pipe3-pcie")) { if (of_device_is_compatible(node, "ti,phy-pipe3-pcie")) {
if (of_property_read_u8(node, "id", &phy->id) < 0)
phy->id = 1;
clk = devm_clk_get(phy->dev, "dpll_ref"); clk = devm_clk_get(phy->dev, "dpll_ref");
if (IS_ERR(clk)) { if (IS_ERR(clk)) {
......
...@@ -669,7 +669,6 @@ static int ci_hdrc_probe(struct platform_device *pdev) ...@@ -669,7 +669,6 @@ static int ci_hdrc_probe(struct platform_device *pdev)
if (!ci) if (!ci)
return -ENOMEM; return -ENOMEM;
platform_set_drvdata(pdev, ci);
ci->dev = dev; ci->dev = dev;
ci->platdata = dev_get_platdata(dev); ci->platdata = dev_get_platdata(dev);
ci->imx28_write_fix = !!(ci->platdata->flags & ci->imx28_write_fix = !!(ci->platdata->flags &
...@@ -783,6 +782,7 @@ static int ci_hdrc_probe(struct platform_device *pdev) ...@@ -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, ret = devm_request_irq(dev, ci->irq, ci_irq, IRQF_SHARED,
ci->platdata->name, ci); ci->platdata->name, ci);
if (ret) if (ret)
......
...@@ -91,6 +91,7 @@ static int host_start(struct ci_hdrc *ci) ...@@ -91,6 +91,7 @@ static int host_start(struct ci_hdrc *ci)
if (!hcd) if (!hcd)
return -ENOMEM; return -ENOMEM;
dev_set_drvdata(ci->dev, ci);
hcd->rsrc_start = ci->hw_bank.phys; hcd->rsrc_start = ci->hw_bank.phys;
hcd->rsrc_len = ci->hw_bank.size; hcd->rsrc_len = ci->hw_bank.size;
hcd->regs = ci->hw_bank.abs; hcd->regs = ci->hw_bank.abs;
......
...@@ -2567,7 +2567,7 @@ static int s3c_hsotg_ep_enable(struct usb_ep *ep, ...@@ -2567,7 +2567,7 @@ static int s3c_hsotg_ep_enable(struct usb_ep *ep,
* s3c_hsotg_ep_disable - disable given endpoint * s3c_hsotg_ep_disable - disable given endpoint
* @ep: The endpoint to disable. * @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 s3c_hsotg_ep *hs_ep = our_ep(ep);
struct dwc2_hsotg *hsotg = hs_ep->parent; struct dwc2_hsotg *hsotg = hs_ep->parent;
...@@ -2588,7 +2588,7 @@ static int s3c_hsotg_ep_disable(struct usb_ep *ep) ...@@ -2588,7 +2588,7 @@ static int s3c_hsotg_ep_disable(struct usb_ep *ep)
spin_lock_irqsave(&hsotg->lock, flags); spin_lock_irqsave(&hsotg->lock, flags);
/* terminate all requests with shutdown */ /* terminate all requests with shutdown */
kill_all_requests(hsotg, hs_ep, -ESHUTDOWN, false); kill_all_requests(hsotg, hs_ep, -ESHUTDOWN, force);
hsotg->fifo_map &= ~(1<<hs_ep->fifo_index); hsotg->fifo_map &= ~(1<<hs_ep->fifo_index);
hs_ep->fifo_index = 0; hs_ep->fifo_index = 0;
...@@ -2609,6 +2609,10 @@ static int s3c_hsotg_ep_disable(struct usb_ep *ep) ...@@ -2609,6 +2609,10 @@ static int s3c_hsotg_ep_disable(struct usb_ep *ep)
return 0; 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 * on_list - check request is on the given endpoint
* @ep: The endpoint to check. * @ep: The endpoint to check.
...@@ -2924,7 +2928,7 @@ static int s3c_hsotg_udc_stop(struct usb_gadget *gadget) ...@@ -2924,7 +2928,7 @@ static int s3c_hsotg_udc_stop(struct usb_gadget *gadget)
/* all endpoints should be shutdown */ /* all endpoints should be shutdown */
for (ep = 1; ep < hsotg->num_of_eps; ep++) for (ep = 1; ep < hsotg->num_of_eps; ep++)
s3c_hsotg_ep_disable(&hsotg->eps[ep].ep); s3c_hsotg_ep_disable_force(&hsotg->eps[ep].ep, true);
spin_lock_irqsave(&hsotg->lock, flags); spin_lock_irqsave(&hsotg->lock, flags);
......
...@@ -33,6 +33,8 @@ ...@@ -33,6 +33,8 @@
#define PCI_DEVICE_ID_INTEL_BYT 0x0f37 #define PCI_DEVICE_ID_INTEL_BYT 0x0f37
#define PCI_DEVICE_ID_INTEL_MRFLD 0x119e #define PCI_DEVICE_ID_INTEL_MRFLD 0x119e
#define PCI_DEVICE_ID_INTEL_BSW 0x22B7 #define PCI_DEVICE_ID_INTEL_BSW 0x22B7
#define PCI_DEVICE_ID_INTEL_SPTLP 0x9d30
#define PCI_DEVICE_ID_INTEL_SPTH 0xa130
struct dwc3_pci { struct dwc3_pci {
struct device *dev; struct device *dev;
...@@ -219,6 +221,8 @@ static const struct pci_device_id dwc3_pci_id_table[] = { ...@@ -219,6 +221,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_BSW), },
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BYT), }, { 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_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), }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_NL_USB), },
{ } /* Terminating Entry */ { } /* Terminating Entry */
}; };
......
...@@ -882,8 +882,7 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep, bool starting) ...@@ -882,8 +882,7 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep, bool starting)
if (i == (request->num_mapped_sgs - 1) || if (i == (request->num_mapped_sgs - 1) ||
sg_is_last(s)) { sg_is_last(s)) {
if (list_is_last(&req->list, if (list_empty(&dep->request_list))
&dep->request_list))
last_one = true; last_one = true;
chain = false; chain = false;
} }
...@@ -901,6 +900,9 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep, bool starting) ...@@ -901,6 +900,9 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep, bool starting)
if (last_one) if (last_one)
break; break;
} }
if (last_one)
break;
} else { } else {
dma = req->request.dma; dma = req->request.dma;
length = req->request.length; length = req->request.length;
......
...@@ -399,8 +399,9 @@ static int hidg_setup(struct usb_function *f, ...@@ -399,8 +399,9 @@ static int hidg_setup(struct usb_function *f,
value = __le16_to_cpu(ctrl->wValue); value = __le16_to_cpu(ctrl->wValue);
length = __le16_to_cpu(ctrl->wLength); length = __le16_to_cpu(ctrl->wLength);
VDBG(cdev, "hid_setup crtl_request : bRequestType:0x%x bRequest:0x%x " VDBG(cdev,
"Value:0x%x\n", ctrl->bRequestType, ctrl->bRequest, value); "%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) { switch ((ctrl->bRequestType << 8) | ctrl->bRequest) {
case ((USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8 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) ...@@ -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); req = midi_alloc_ep_req(ep, midi->buflen);
if (!req) { if (!req) {
ERROR(midi, "gmidi_transmit: alloc_ep_request failed\n"); ERROR(midi, "%s: alloc_ep_request failed\n", __func__);
return; return;
} }
req->length = 0; req->length = 0;
......
...@@ -897,7 +897,6 @@ static void f_audio_free_inst(struct usb_function_instance *f) ...@@ -897,7 +897,6 @@ static void f_audio_free_inst(struct usb_function_instance *f)
struct f_uac1_opts *opts; struct f_uac1_opts *opts;
opts = container_of(f, struct f_uac1_opts, func_inst); opts = container_of(f, struct f_uac1_opts, func_inst);
gaudio_cleanup(opts->card);
if (opts->fn_play_alloc) if (opts->fn_play_alloc)
kfree(opts->fn_play); kfree(opts->fn_play);
if (opts->fn_cap_alloc) if (opts->fn_cap_alloc)
...@@ -935,6 +934,7 @@ static void f_audio_free(struct usb_function *f) ...@@ -935,6 +934,7 @@ static void f_audio_free(struct usb_function *f)
struct f_audio *audio = func_to_audio(f); struct f_audio *audio = func_to_audio(f);
struct f_uac1_opts *opts; struct f_uac1_opts *opts;
gaudio_cleanup(&audio->card);
opts = container_of(f->fi, struct f_uac1_opts, func_inst); opts = container_of(f->fi, struct f_uac1_opts, func_inst);
kfree(audio); kfree(audio);
mutex_lock(&opts->lock); mutex_lock(&opts->lock);
......
...@@ -441,6 +441,7 @@ ep_write (struct file *fd, const char __user *buf, size_t len, loff_t *ptr) ...@@ -441,6 +441,7 @@ ep_write (struct file *fd, const char __user *buf, size_t len, loff_t *ptr)
kbuf = memdup_user(buf, len); kbuf = memdup_user(buf, len);
if (IS_ERR(kbuf)) { if (IS_ERR(kbuf)) {
value = PTR_ERR(kbuf); value = PTR_ERR(kbuf);
kbuf = NULL;
goto free1; goto free1;
} }
...@@ -449,6 +450,7 @@ ep_write (struct file *fd, const char __user *buf, size_t len, loff_t *ptr) ...@@ -449,6 +450,7 @@ ep_write (struct file *fd, const char __user *buf, size_t len, loff_t *ptr)
data->name, len, (int) value); data->name, len, (int) value);
free1: free1:
mutex_unlock(&data->lock); mutex_unlock(&data->lock);
kfree (kbuf);
return value; return value;
} }
......
...@@ -716,10 +716,10 @@ static int queue_dma(struct usba_udc *udc, struct usba_ep *ep, ...@@ -716,10 +716,10 @@ static int queue_dma(struct usba_udc *udc, struct usba_ep *ep,
req->using_dma = 1; req->using_dma = 1;
req->ctrl = USBA_BF(DMA_BUF_LEN, req->req.length) req->ctrl = USBA_BF(DMA_BUF_LEN, req->req.length)
| USBA_DMA_CH_EN | USBA_DMA_END_BUF_IE | 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) if (!ep->is_in)
req->ctrl |= USBA_DMA_END_BUF_EN; req->ctrl |= USBA_DMA_END_TR_EN | USBA_DMA_END_TR_IE;
/* /*
* Add this request to the queue and submit for DMA if * Add this request to the queue and submit for DMA if
...@@ -828,7 +828,7 @@ static int usba_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req) ...@@ -828,7 +828,7 @@ static int usba_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req)
{ {
struct usba_ep *ep = to_usba_ep(_ep); struct usba_ep *ep = to_usba_ep(_ep);
struct usba_udc *udc = ep->udc; struct usba_udc *udc = ep->udc;
struct usba_request *req = to_usba_req(_req); struct usba_request *req;
unsigned long flags; unsigned long flags;
u32 status; u32 status;
...@@ -837,6 +837,16 @@ static int usba_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req) ...@@ -837,6 +837,16 @@ static int usba_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req)
spin_lock_irqsave(&udc->lock, flags); 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 (req->using_dma) {
/* /*
* If this request is currently being transferred, * If this request is currently being transferred,
...@@ -1563,7 +1573,6 @@ static void usba_ep_irq(struct usba_udc *udc, struct usba_ep *ep) ...@@ -1563,7 +1573,6 @@ static void usba_ep_irq(struct usba_udc *udc, struct usba_ep *ep)
if ((epstatus & epctrl) & USBA_RX_BK_RDY) { if ((epstatus & epctrl) & USBA_RX_BK_RDY) {
DBG(DBG_BUS, "%s: RX data ready\n", ep->ep.name); DBG(DBG_BUS, "%s: RX data ready\n", ep->ep.name);
receive_data(ep); 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) ...@@ -718,10 +718,11 @@ static int ep_queue(struct bdc_ep *ep, struct bdc_req *req)
struct bdc *bdc; struct bdc *bdc;
int ret = 0; int ret = 0;
bdc = ep->bdc;
if (!req || !ep || !ep->usb_ep.desc) if (!req || !ep || !ep->usb_ep.desc)
return -EINVAL; return -EINVAL;
bdc = ep->bdc;
req->usb_req.actual = 0; req->usb_req.actual = 0;
req->usb_req.status = -EINPROGRESS; req->usb_req.status = -EINPROGRESS;
req->epnum = ep->ep_num; req->epnum = ep->ep_num;
......
...@@ -1581,6 +1581,10 @@ iso_stream_schedule ( ...@@ -1581,6 +1581,10 @@ iso_stream_schedule (
else else
next = (now + 2 + 7) & ~0x07; /* full frame cache */ 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 * Use ehci->last_iso_frame as the base. There can't be any
* TDs scheduled for earlier than that. * TDs scheduled for earlier than that.
...@@ -1600,11 +1604,11 @@ iso_stream_schedule ( ...@@ -1600,11 +1604,11 @@ iso_stream_schedule (
*/ */
now2 = (now - base) & (mod - 1); now2 = (now - base) & (mod - 1);
/* Is the schedule already full? */ /* Is the schedule about to wrap around? */
if (unlikely(!empty && start < period)) { 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); urb, stream->next_uframe, base, period, mod);
status = -ENOSPC; status = -EFBIG;
goto fail; goto fail;
} }
...@@ -1671,10 +1675,6 @@ iso_stream_schedule ( ...@@ -1671,10 +1675,6 @@ iso_stream_schedule (
urb->start_frame = start & (mod - 1); urb->start_frame = start & (mod - 1);
if (!stream->highspeed) if (!stream->highspeed)
urb->start_frame >>= 3; urb->start_frame >>= 3;
/* Make sure scan_isoc() sees these */
if (ehci->isoc_count == 0)
ehci->last_iso_frame = now >> 3;
return status; return status;
fail: fail:
......
...@@ -451,7 +451,7 @@ static int tegra_ehci_probe(struct platform_device *pdev) ...@@ -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); u_phy = devm_usb_get_phy_by_phandle(&pdev->dev, "nvidia,phy", 0);
if (IS_ERR(u_phy)) { if (IS_ERR(u_phy)) {
err = PTR_ERR(u_phy); err = -EPROBE_DEFER;
goto cleanup_clk_en; goto cleanup_clk_en;
} }
hcd->usb_phy = u_phy; hcd->usb_phy = u_phy;
......
...@@ -567,7 +567,8 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev) ...@@ -567,7 +567,8 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev)
{ {
void __iomem *base; void __iomem *base;
u32 control; u32 control;
u32 fminterval; u32 fminterval = 0;
bool no_fminterval = false;
int cnt; int cnt;
if (!mmio_resource_enabled(pdev, 0)) if (!mmio_resource_enabled(pdev, 0))
...@@ -577,6 +578,13 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev) ...@@ -577,6 +578,13 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev)
if (base == NULL) if (base == NULL)
return; 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); control = readl(base + OHCI_CONTROL);
/* On PA-RISC, PDC can leave IR set incorrectly; ignore it there. */ /* 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) ...@@ -615,7 +623,9 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev)
} }
/* software reset of the controller, preserving HcFmInterval */ /* software reset of the controller, preserving HcFmInterval */
if (!no_fminterval)
fminterval = readl(base + OHCI_FMINTERVAL); fminterval = readl(base + OHCI_FMINTERVAL);
writel(OHCI_HCR, base + OHCI_CMDSTATUS); writel(OHCI_HCR, base + OHCI_CMDSTATUS);
/* reset requires max 10 us delay */ /* reset requires max 10 us delay */
...@@ -624,6 +634,8 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev) ...@@ -624,6 +634,8 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev)
break; break;
udelay(1); udelay(1);
} }
if (!no_fminterval)
writel(fminterval, base + OHCI_FMINTERVAL); writel(fminterval, base + OHCI_FMINTERVAL);
/* Now the controller is safely in SUSPEND and nothing can wake it up */ /* Now the controller is safely in SUSPEND and nothing can wake it up */
......
...@@ -82,6 +82,8 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) ...@@ -82,6 +82,8 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
"must be suspended extra slowly", "must be suspended extra slowly",
pdev->revision); 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 /* Fresco Logic confirms: all revisions of this chip do not
* support MSI, even though some of them claim to in their PCI * support MSI, even though some of them claim to in their PCI
* capabilities. * capabilities.
......
...@@ -3803,6 +3803,15 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev, ...@@ -3803,6 +3803,15 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev,
return -EINVAL; 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); command = xhci_alloc_command(xhci, false, false, GFP_KERNEL);
if (!command) if (!command)
return -ENOMEM; return -ENOMEM;
......
...@@ -72,6 +72,8 @@ config USB_MUSB_DA8XX ...@@ -72,6 +72,8 @@ config USB_MUSB_DA8XX
config USB_MUSB_TUSB6010 config USB_MUSB_TUSB6010
tristate "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 config USB_MUSB_OMAP2PLUS
tristate "OMAP2430 and onwards" tristate "OMAP2430 and onwards"
...@@ -85,6 +87,7 @@ config USB_MUSB_AM35X ...@@ -85,6 +87,7 @@ config USB_MUSB_AM35X
config USB_MUSB_DSPS config USB_MUSB_DSPS
tristate "TI DSPS platforms" tristate "TI DSPS platforms"
select USB_MUSB_AM335X_CHILD select USB_MUSB_AM335X_CHILD
depends on ARCH_OMAP2PLUS || COMPILE_TEST
depends on OF_IRQ depends on OF_IRQ
config USB_MUSB_BLACKFIN config USB_MUSB_BLACKFIN
...@@ -93,6 +96,7 @@ config USB_MUSB_BLACKFIN ...@@ -93,6 +96,7 @@ config USB_MUSB_BLACKFIN
config USB_MUSB_UX500 config USB_MUSB_UX500
tristate "Ux500 platforms" tristate "Ux500 platforms"
depends on ARCH_U8500 || COMPILE_TEST
config USB_MUSB_JZ4740 config USB_MUSB_JZ4740
tristate "JZ4740" tristate "JZ4740"
......
...@@ -63,7 +63,7 @@ static void bfin_writew(void __iomem *addr, unsigned offset, u16 data) ...@@ -63,7 +63,7 @@ static void bfin_writew(void __iomem *addr, unsigned offset, u16 data)
bfin_write16(addr + offset, 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); bfin_write16(addr + offset, (u16)data);
} }
......
...@@ -628,9 +628,9 @@ static int cppi41_dma_controller_start(struct cppi41_dma_controller *controller) ...@@ -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); ret = of_property_read_string_index(np, "dma-names", i, &str);
if (ret) if (ret)
goto err; goto err;
if (!strncmp(str, "tx", 2)) if (strstarts(str, "tx"))
is_tx = 1; is_tx = 1;
else if (!strncmp(str, "rx", 2)) else if (strstarts(str, "rx"))
is_tx = 0; is_tx = 0;
else { else {
dev_err(dev, "Wrong dmatype %s\n", str); dev_err(dev, "Wrong dmatype %s\n", str);
......
...@@ -59,20 +59,12 @@ static const struct musb_register_map musb_regmap[] = { ...@@ -59,20 +59,12 @@ static const struct musb_register_map musb_regmap[] = {
{ "RxMaxPp", MUSB_RXMAXP, 16 }, { "RxMaxPp", MUSB_RXMAXP, 16 },
{ "RxCSR", MUSB_RXCSR, 16 }, { "RxCSR", MUSB_RXCSR, 16 },
{ "RxCount", MUSB_RXCOUNT, 16 }, { "RxCount", MUSB_RXCOUNT, 16 },
{ "ConfigData", MUSB_CONFIGDATA,8 },
{ "IntrRxE", MUSB_INTRRXE, 16 }, { "IntrRxE", MUSB_INTRRXE, 16 },
{ "IntrTxE", MUSB_INTRTXE, 16 }, { "IntrTxE", MUSB_INTRTXE, 16 },
{ "IntrUsbE", MUSB_INTRUSBE, 8 }, { "IntrUsbE", MUSB_INTRUSBE, 8 },
{ "DevCtl", MUSB_DEVCTL, 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 }, { "VControl", 0x68, 32 },
{ "HWVers", 0x69, 16 }, { "HWVers", 0x69, 16 },
{ "EPInfo", MUSB_EPINFO, 8 },
{ "RAMInfo", MUSB_RAMINFO, 8 },
{ "LinkInfo", MUSB_LINKINFO, 8 }, { "LinkInfo", MUSB_LINKINFO, 8 },
{ "VPLen", MUSB_VPLEN, 8 }, { "VPLen", MUSB_VPLEN, 8 },
{ "HS_EOF1", MUSB_HS_EOF1, 8 }, { "HS_EOF1", MUSB_HS_EOF1, 8 },
...@@ -103,6 +95,16 @@ static const struct musb_register_map musb_regmap[] = { ...@@ -103,6 +95,16 @@ static const struct musb_register_map musb_regmap[] = {
{ "DMA_CNTLch7", 0x274, 16 }, { "DMA_CNTLch7", 0x274, 16 },
{ "DMA_ADDRch7", 0x278, 32 }, { "DMA_ADDRch7", 0x278, 32 },
{ "DMA_COUNTch7", 0x27C, 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 */ { } /* Terminating Entry */
}; };
...@@ -197,30 +199,30 @@ static ssize_t musb_test_mode_write(struct file *file, ...@@ -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))) if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count)))
return -EFAULT; return -EFAULT;
if (!strncmp(buf, "force host", 9)) if (strstarts(buf, "force host"))
test = MUSB_TEST_FORCE_HOST; test = MUSB_TEST_FORCE_HOST;
if (!strncmp(buf, "fifo access", 11)) if (strstarts(buf, "fifo access"))
test = MUSB_TEST_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; test = MUSB_TEST_FORCE_FS;
if (!strncmp(buf, "force high-speed", 15)) if (strstarts(buf, "force high-speed"))
test = MUSB_TEST_FORCE_HS; test = MUSB_TEST_FORCE_HS;
if (!strncmp(buf, "test packet", 10)) { if (strstarts(buf, "test packet")) {
test = MUSB_TEST_PACKET; test = MUSB_TEST_PACKET;
musb_load_testpacket(musb); musb_load_testpacket(musb);
} }
if (!strncmp(buf, "test K", 6)) if (strstarts(buf, "test K"))
test = MUSB_TEST_K; test = MUSB_TEST_K;
if (!strncmp(buf, "test J", 6)) if (strstarts(buf, "test J"))
test = MUSB_TEST_J; test = MUSB_TEST_J;
if (!strncmp(buf, "test SE0 NAK", 12)) if (strstarts(buf, "test SE0 NAK"))
test = MUSB_TEST_SE0_NAK; test = MUSB_TEST_SE0_NAK;
musb_writeb(musb->mregs, MUSB_TESTMODE, test); musb_writeb(musb->mregs, MUSB_TESTMODE, test);
......
...@@ -2663,7 +2663,6 @@ void musb_host_cleanup(struct musb *musb) ...@@ -2663,7 +2663,6 @@ void musb_host_cleanup(struct musb *musb)
if (musb->port_mode == MUSB_PORT_MODE_GADGET) if (musb->port_mode == MUSB_PORT_MODE_GADGET)
return; return;
usb_remove_hcd(musb->hcd); usb_remove_hcd(musb->hcd);
musb->hcd = NULL;
} }
void musb_host_free(struct musb *musb) void musb_host_free(struct musb *musb)
......
...@@ -338,7 +338,6 @@ static void mv_otg_update_inputs(struct mv_otg *mvotg) ...@@ -338,7 +338,6 @@ static void mv_otg_update_inputs(struct mv_otg *mvotg)
static void mv_otg_update_state(struct mv_otg *mvotg) static void mv_otg_update_state(struct mv_otg *mvotg)
{ {
struct mv_otg_ctrl *otg_ctrl = &mvotg->otg_ctrl; struct mv_otg_ctrl *otg_ctrl = &mvotg->otg_ctrl;
struct usb_phy *phy = &mvotg->phy;
int old_state = mvotg->phy.otg->state; int old_state = mvotg->phy.otg->state;
switch (old_state) { switch (old_state) {
...@@ -858,10 +857,10 @@ static int mv_otg_suspend(struct platform_device *pdev, pm_message_t 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); 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, dev_info(&pdev->dev,
"OTG state is not B_IDLE, it is %d!\n", "OTG state is not B_IDLE, it is %d!\n",
mvotg->phy.state); mvotg->phy.otg->state);
return -EAGAIN; return -EAGAIN;
} }
......
...@@ -34,7 +34,7 @@ static struct usb_phy *__usb_find_phy(struct list_head *list, ...@@ -34,7 +34,7 @@ static struct usb_phy *__usb_find_phy(struct list_head *list,
return phy; return phy;
} }
return ERR_PTR(-ENODEV); return ERR_PTR(-EPROBE_DEFER);
} }
static struct usb_phy *__usb_find_phy_dev(struct device *dev, 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) ...@@ -59,6 +59,9 @@ static struct usb_phy *__of_usb_find_phy(struct device_node *node)
{ {
struct usb_phy *phy; struct usb_phy *phy;
if (!of_device_is_available(node))
return ERR_PTR(-ENODEV);
list_for_each_entry(phy, &phy_list, head) { list_for_each_entry(phy, &phy_list, head) {
if (node != phy->dev->of_node) if (node != phy->dev->of_node)
continue; continue;
...@@ -66,7 +69,7 @@ static struct usb_phy *__of_usb_find_phy(struct device_node *node) ...@@ -66,7 +69,7 @@ static struct usb_phy *__of_usb_find_phy(struct device_node *node)
return phy; return phy;
} }
return ERR_PTR(-ENODEV); return ERR_PTR(-EPROBE_DEFER);
} }
static void devm_usb_phy_release(struct device *dev, void *res) 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, ...@@ -190,10 +193,13 @@ struct usb_phy *devm_usb_get_phy_by_phandle(struct device *dev,
spin_lock_irqsave(&phy_lock, flags); spin_lock_irqsave(&phy_lock, flags);
phy = __of_usb_find_phy(node); phy = __of_usb_find_phy(node);
if (IS_ERR(phy) || !try_module_get(phy->dev->driver->owner)) { if (IS_ERR(phy)) {
if (!IS_ERR(phy)) devres_free(ptr);
phy = ERR_PTR(-EPROBE_DEFER); goto err1;
}
if (!try_module_get(phy->dev->driver->owner)) {
phy = ERR_PTR(-ENODEV);
devres_free(ptr); devres_free(ptr);
goto err1; goto err1;
} }
......
...@@ -46,6 +46,8 @@ static struct console usbcons; ...@@ -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 * The parsing of the command line works exactly like the
...@@ -137,13 +139,17 @@ static int usb_console_setup(struct console *co, char *options) ...@@ -137,13 +139,17 @@ static int usb_console_setup(struct console *co, char *options)
goto reset_open_count; goto reset_open_count;
} }
kref_init(&tty->kref); kref_init(&tty->kref);
tty_port_tty_set(&port->port, tty);
tty->driver = usb_serial_tty_driver; tty->driver = usb_serial_tty_driver;
tty->index = co->index; 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)) { if (tty_init_termios(tty)) {
retval = -ENOMEM; retval = -ENOMEM;
goto free_tty; goto put_tty;
} }
tty_port_tty_set(&port->port, tty);
} }
/* only call the device specific open if this /* only call the device specific open if this
...@@ -161,7 +167,7 @@ static int usb_console_setup(struct console *co, char *options) ...@@ -161,7 +167,7 @@ static int usb_console_setup(struct console *co, char *options)
serial->type->set_termios(tty, port, &dummy); serial->type->set_termios(tty, port, &dummy);
tty_port_tty_set(&port->port, NULL); tty_port_tty_set(&port->port, NULL);
kfree(tty); tty_kref_put(tty);
} }
set_bit(ASYNCB_INITIALIZED, &port->port.flags); set_bit(ASYNCB_INITIALIZED, &port->port.flags);
} }
...@@ -177,8 +183,8 @@ static int usb_console_setup(struct console *co, char *options) ...@@ -177,8 +183,8 @@ static int usb_console_setup(struct console *co, char *options)
fail: fail:
tty_port_tty_set(&port->port, NULL); tty_port_tty_set(&port->port, NULL);
free_tty: put_tty:
kfree(tty); tty_kref_put(tty);
reset_open_count: reset_open_count:
port->port.count = 0; port->port.count = 0;
usb_autopm_put_interface(serial->interface); usb_autopm_put_interface(serial->interface);
......
...@@ -120,10 +120,12 @@ static const struct usb_device_id id_table[] = { ...@@ -120,10 +120,12 @@ static const struct usb_device_id id_table[] = {
{ USB_DEVICE(0x10C4, 0x85F8) }, /* Virtenio Preon32 */ { USB_DEVICE(0x10C4, 0x85F8) }, /* Virtenio Preon32 */
{ USB_DEVICE(0x10C4, 0x8664) }, /* AC-Services CAN-IF */ { USB_DEVICE(0x10C4, 0x8664) }, /* AC-Services CAN-IF */
{ USB_DEVICE(0x10C4, 0x8665) }, /* AC-Services OBD-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, 0x88A4) }, /* MMB Networks ZigBee USB Device */
{ USB_DEVICE(0x10C4, 0x88A5) }, /* Planet Innovation Ingeni ZigBee USB Device */ { USB_DEVICE(0x10C4, 0x88A5) }, /* Planet Innovation Ingeni ZigBee USB Device */
{ USB_DEVICE(0x10C4, 0x8946) }, /* Ketra N1 Wireless Interface */ { 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, 0xEA60) }, /* Silicon Labs factory default */
{ USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */
{ USB_DEVICE(0x10C4, 0xEA70) }, /* 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, ...@@ -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); res = usb_submit_urb(port->read_urbs[index], mem_flags);
if (res) { if (res) {
if (res != -EPERM) { if (res != -EPERM && res != -ENODEV) {
dev_err(&port->dev, dev_err(&port->dev,
"%s - usb_submit_urb failed: %d\n", "%s - usb_submit_urb failed: %d\n",
__func__, res); __func__, res);
...@@ -373,7 +373,7 @@ void usb_serial_generic_read_bulk_callback(struct urb *urb) ...@@ -373,7 +373,7 @@ void usb_serial_generic_read_bulk_callback(struct urb *urb)
__func__, urb->status); __func__, urb->status);
return; return;
default: default:
dev_err(&port->dev, "%s - nonzero urb status: %d\n", dev_dbg(&port->dev, "%s - nonzero urb status: %d\n",
__func__, urb->status); __func__, urb->status);
goto resubmit; goto resubmit;
} }
......
...@@ -410,6 +410,8 @@ static void usa26_instat_callback(struct urb *urb) ...@@ -410,6 +410,8 @@ static void usa26_instat_callback(struct urb *urb)
} }
port = serial->port[msg->port]; port = serial->port[msg->port];
p_priv = usb_get_serial_port_data(port); p_priv = usb_get_serial_port_data(port);
if (!p_priv)
goto resubmit;
/* Update handshaking pin state information */ /* Update handshaking pin state information */
old_dcd_state = p_priv->dcd_state; old_dcd_state = p_priv->dcd_state;
...@@ -420,7 +422,7 @@ static void usa26_instat_callback(struct urb *urb) ...@@ -420,7 +422,7 @@ static void usa26_instat_callback(struct urb *urb)
if (old_dcd_state != p_priv->dcd_state) if (old_dcd_state != p_priv->dcd_state)
tty_port_tty_hangup(&port->port, true); tty_port_tty_hangup(&port->port, true);
resubmit:
/* Resubmit urb so we continue receiving */ /* Resubmit urb so we continue receiving */
err = usb_submit_urb(urb, GFP_ATOMIC); err = usb_submit_urb(urb, GFP_ATOMIC);
if (err != 0) if (err != 0)
...@@ -527,6 +529,8 @@ static void usa28_instat_callback(struct urb *urb) ...@@ -527,6 +529,8 @@ static void usa28_instat_callback(struct urb *urb)
} }
port = serial->port[msg->port]; port = serial->port[msg->port];
p_priv = usb_get_serial_port_data(port); p_priv = usb_get_serial_port_data(port);
if (!p_priv)
goto resubmit;
/* Update handshaking pin state information */ /* Update handshaking pin state information */
old_dcd_state = p_priv->dcd_state; old_dcd_state = p_priv->dcd_state;
...@@ -537,7 +541,7 @@ static void usa28_instat_callback(struct urb *urb) ...@@ -537,7 +541,7 @@ static void usa28_instat_callback(struct urb *urb)
if (old_dcd_state != p_priv->dcd_state && old_dcd_state) if (old_dcd_state != p_priv->dcd_state && old_dcd_state)
tty_port_tty_hangup(&port->port, true); tty_port_tty_hangup(&port->port, true);
resubmit:
/* Resubmit urb so we continue receiving */ /* Resubmit urb so we continue receiving */
err = usb_submit_urb(urb, GFP_ATOMIC); err = usb_submit_urb(urb, GFP_ATOMIC);
if (err != 0) if (err != 0)
...@@ -607,6 +611,8 @@ static void usa49_instat_callback(struct urb *urb) ...@@ -607,6 +611,8 @@ static void usa49_instat_callback(struct urb *urb)
} }
port = serial->port[msg->portNumber]; port = serial->port[msg->portNumber];
p_priv = usb_get_serial_port_data(port); p_priv = usb_get_serial_port_data(port);
if (!p_priv)
goto resubmit;
/* Update handshaking pin state information */ /* Update handshaking pin state information */
old_dcd_state = p_priv->dcd_state; old_dcd_state = p_priv->dcd_state;
...@@ -617,7 +623,7 @@ static void usa49_instat_callback(struct urb *urb) ...@@ -617,7 +623,7 @@ static void usa49_instat_callback(struct urb *urb)
if (old_dcd_state != p_priv->dcd_state && old_dcd_state) if (old_dcd_state != p_priv->dcd_state && old_dcd_state)
tty_port_tty_hangup(&port->port, true); tty_port_tty_hangup(&port->port, true);
resubmit:
/* Resubmit urb so we continue receiving */ /* Resubmit urb so we continue receiving */
err = usb_submit_urb(urb, GFP_ATOMIC); err = usb_submit_urb(urb, GFP_ATOMIC);
if (err != 0) if (err != 0)
...@@ -855,6 +861,8 @@ static void usa90_instat_callback(struct urb *urb) ...@@ -855,6 +861,8 @@ static void usa90_instat_callback(struct urb *urb)
port = serial->port[0]; port = serial->port[0];
p_priv = usb_get_serial_port_data(port); p_priv = usb_get_serial_port_data(port);
if (!p_priv)
goto resubmit;
/* Update handshaking pin state information */ /* Update handshaking pin state information */
old_dcd_state = p_priv->dcd_state; old_dcd_state = p_priv->dcd_state;
...@@ -865,7 +873,7 @@ static void usa90_instat_callback(struct urb *urb) ...@@ -865,7 +873,7 @@ static void usa90_instat_callback(struct urb *urb)
if (old_dcd_state != p_priv->dcd_state && old_dcd_state) if (old_dcd_state != p_priv->dcd_state && old_dcd_state)
tty_port_tty_hangup(&port->port, true); tty_port_tty_hangup(&port->port, true);
resubmit:
/* Resubmit urb so we continue receiving */ /* Resubmit urb so we continue receiving */
err = usb_submit_urb(urb, GFP_ATOMIC); err = usb_submit_urb(urb, GFP_ATOMIC);
if (err != 0) if (err != 0)
...@@ -926,6 +934,8 @@ static void usa67_instat_callback(struct urb *urb) ...@@ -926,6 +934,8 @@ static void usa67_instat_callback(struct urb *urb)
port = serial->port[msg->port]; port = serial->port[msg->port];
p_priv = usb_get_serial_port_data(port); p_priv = usb_get_serial_port_data(port);
if (!p_priv)
goto resubmit;
/* Update handshaking pin state information */ /* Update handshaking pin state information */
old_dcd_state = p_priv->dcd_state; old_dcd_state = p_priv->dcd_state;
...@@ -934,7 +944,7 @@ static void usa67_instat_callback(struct urb *urb) ...@@ -934,7 +944,7 @@ static void usa67_instat_callback(struct urb *urb)
if (old_dcd_state != p_priv->dcd_state && old_dcd_state) if (old_dcd_state != p_priv->dcd_state && old_dcd_state)
tty_port_tty_hangup(&port->port, true); tty_port_tty_hangup(&port->port, true);
resubmit:
/* Resubmit urb so we continue receiving */ /* Resubmit urb so we continue receiving */
err = usb_submit_urb(urb, GFP_ATOMIC); err = usb_submit_urb(urb, GFP_ATOMIC);
if (err != 0) if (err != 0)
......
...@@ -234,6 +234,8 @@ static void option_instat_callback(struct urb *urb); ...@@ -234,6 +234,8 @@ static void option_instat_callback(struct urb *urb);
#define QUALCOMM_VENDOR_ID 0x05C6 #define QUALCOMM_VENDOR_ID 0x05C6
#define SIERRA_VENDOR_ID 0x1199
#define CMOTECH_VENDOR_ID 0x16d8 #define CMOTECH_VENDOR_ID 0x16d8
#define CMOTECH_PRODUCT_6001 0x6001 #define CMOTECH_PRODUCT_6001 0x6001
#define CMOTECH_PRODUCT_CMU_300 0x6002 #define CMOTECH_PRODUCT_CMU_300 0x6002
...@@ -512,7 +514,7 @@ enum option_blacklist_reason { ...@@ -512,7 +514,7 @@ enum option_blacklist_reason {
OPTION_BLACKLIST_RESERVED_IF = 2 OPTION_BLACKLIST_RESERVED_IF = 2
}; };
#define MAX_BL_NUM 8 #define MAX_BL_NUM 11
struct option_blacklist_info { struct option_blacklist_info {
/* bitfield of interface numbers for OPTION_BLACKLIST_SENDSETUP */ /* bitfield of interface numbers for OPTION_BLACKLIST_SENDSETUP */
const unsigned long sendsetup; const unsigned long sendsetup;
...@@ -601,6 +603,11 @@ static const struct option_blacklist_info telit_le920_blacklist = { ...@@ -601,6 +603,11 @@ static const struct option_blacklist_info telit_le920_blacklist = {
.reserved = BIT(1) | BIT(5), .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[] = { static const struct usb_device_id option_ids[] = {
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) }, { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
...@@ -1098,6 +1105,8 @@ static const struct usb_device_id option_ids[] = { ...@@ -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, 0x6613)}, /* Onda H600/ZTE MF330 */
{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */ { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */
{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */ { 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_6001) },
{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) }, { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) },
{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6003), { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6003),
......
...@@ -142,7 +142,6 @@ static const struct usb_device_id id_table[] = { ...@@ -142,7 +142,6 @@ static const struct usb_device_id id_table[] = {
{DEVICE_SWI(0x0f3d, 0x68a2)}, /* Sierra Wireless MC7700 */ {DEVICE_SWI(0x0f3d, 0x68a2)}, /* Sierra Wireless MC7700 */
{DEVICE_SWI(0x114f, 0x68a2)}, /* Sierra Wireless MC7750 */ {DEVICE_SWI(0x114f, 0x68a2)}, /* Sierra Wireless MC7750 */
{DEVICE_SWI(0x1199, 0x68a2)}, /* Sierra Wireless MC7710 */ {DEVICE_SWI(0x1199, 0x68a2)}, /* Sierra Wireless MC7710 */
{DEVICE_SWI(0x1199, 0x68c0)}, /* Sierra Wireless MC73xx */
{DEVICE_SWI(0x1199, 0x901c)}, /* Sierra Wireless EM7700 */ {DEVICE_SWI(0x1199, 0x901c)}, /* Sierra Wireless EM7700 */
{DEVICE_SWI(0x1199, 0x901f)}, /* Sierra Wireless EM7355 */ {DEVICE_SWI(0x1199, 0x901f)}, /* Sierra Wireless EM7355 */
{DEVICE_SWI(0x1199, 0x9040)}, /* Sierra Wireless Modem */ {DEVICE_SWI(0x1199, 0x9040)}, /* Sierra Wireless Modem */
......
...@@ -69,16 +69,39 @@ static int uas_use_uas_driver(struct usb_interface *intf, ...@@ -69,16 +69,39 @@ static int uas_use_uas_driver(struct usb_interface *intf,
return 0; return 0;
/* /*
* ASM1051 and older ASM1053 devices have the same usb-id, and UAS is * ASMedia has a number of usb3 to sata bridge chips, at the time of
* broken on the ASM1051, use the number of streams to differentiate. * this writing the following versions exist:
* New ASM1053-s also support 32 streams, but have a different prod-id. * 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 && if (le16_to_cpu(udev->descriptor.idVendor) == 0x174c &&
le16_to_cpu(udev->descriptor.idProduct) == 0x55aa) { (le16_to_cpu(udev->descriptor.idProduct) == 0x5106 ||
if (udev->speed < USB_SPEED_SUPER) { 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 */ /* No streams info, assume ASM1051 */
flags |= US_FL_IGNORE_UAS; flags |= US_FL_IGNORE_UAS;
} else if (usb_ss_max_streams(&eps[1]->ss_ep_comp) == 32) { } else if (usb_ss_max_streams(&eps[1]->ss_ep_comp) == 32) {
/* Possibly an ASM1051, disable uas */
flags |= US_FL_IGNORE_UAS; flags |= US_FL_IGNORE_UAS;
} }
} }
......
...@@ -40,6 +40,16 @@ ...@@ -40,6 +40,16 @@
* and don't forget to CC: the USB development list <linux-usb@vger.kernel.org> * 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 */ /* https://bugzilla.kernel.org/show_bug.cgi?id=79511 */
UNUSUAL_DEV(0x0bc2, 0x2312, 0x0000, 0x9999, UNUSUAL_DEV(0x0bc2, 0x2312, 0x0000, 0x9999,
"Seagate", "Seagate",
...@@ -68,6 +78,20 @@ UNUSUAL_DEV(0x0bc2, 0xa003, 0x0000, 0x9999, ...@@ -68,6 +78,20 @@ UNUSUAL_DEV(0x0bc2, 0xa003, 0x0000, 0x9999,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_NO_ATA_1X), 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 */ /* https://bbs.archlinux.org/viewtopic.php?id=183190 */
UNUSUAL_DEV(0x0bc2, 0xab20, 0x0000, 0x9999, UNUSUAL_DEV(0x0bc2, 0xab20, 0x0000, 0x9999,
"Seagate", "Seagate",
...@@ -82,6 +106,13 @@ UNUSUAL_DEV(0x0bc2, 0xab21, 0x0000, 0x9999, ...@@ -82,6 +106,13 @@ UNUSUAL_DEV(0x0bc2, 0xab21, 0x0000, 0x9999,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_NO_ATA_1X), 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> */ /* Reported-by: Claudio Bizzarri <claudio.bizzarri@gmail.com> */
UNUSUAL_DEV(0x152d, 0x0567, 0x0000, 0x9999, UNUSUAL_DEV(0x152d, 0x0567, 0x0000, 0x9999,
"JMicron", "JMicron",
...@@ -89,14 +120,6 @@ UNUSUAL_DEV(0x152d, 0x0567, 0x0000, 0x9999, ...@@ -89,14 +120,6 @@ UNUSUAL_DEV(0x152d, 0x0567, 0x0000, 0x9999,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_NO_REPORT_OPCODES), 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> */ /* Reported-by: Hans de Goede <hdegoede@redhat.com> */
UNUSUAL_DEV(0x2109, 0x0711, 0x0000, 0x9999, UNUSUAL_DEV(0x2109, 0x0711, 0x0000, 0x9999,
"VIA", "VIA",
...@@ -104,6 +127,13 @@ UNUSUAL_DEV(0x2109, 0x0711, 0x0000, 0x9999, ...@@ -104,6 +127,13 @@ UNUSUAL_DEV(0x2109, 0x0711, 0x0000, 0x9999,
USB_SC_DEVICE, USB_PR_DEVICE, NULL, USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_NO_ATA_1X), 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> */ /* Reported-by: Hans de Goede <hdegoede@redhat.com> */
UNUSUAL_DEV(0x4971, 0x1012, 0x0000, 0x9999, UNUSUAL_DEV(0x4971, 0x1012, 0x0000, 0x9999,
"Hitachi", "Hitachi",
......
...@@ -66,7 +66,7 @@ enum omap_control_usb_mode { ...@@ -66,7 +66,7 @@ enum omap_control_usb_mode {
#define OMAP_CTRL_PIPE3_PHY_TX_RX_POWEROFF 0x0 #define OMAP_CTRL_PIPE3_PHY_TX_RX_POWEROFF 0x0
#define OMAP_CTRL_PCIE_PCS_MASK 0xff #define OMAP_CTRL_PCIE_PCS_MASK 0xff
#define OMAP_CTRL_PCIE_PCS_DELAY_COUNT_SHIFT 0x8 #define OMAP_CTRL_PCIE_PCS_DELAY_COUNT_SHIFT 16
#define OMAP_CTRL_USB2_PHY_PD BIT(28) #define OMAP_CTRL_USB2_PHY_PD BIT(28)
...@@ -79,7 +79,7 @@ enum omap_control_usb_mode { ...@@ -79,7 +79,7 @@ enum omap_control_usb_mode {
void omap_control_phy_power(struct device *dev, int on); void omap_control_phy_power(struct device *dev, int on);
void omap_control_usb_set_mode(struct device *dev, void omap_control_usb_set_mode(struct device *dev,
enum omap_control_usb_mode mode); enum omap_control_usb_mode mode);
void omap_control_pcie_pcs(struct device *dev, u8 id, u8 delay); void omap_control_pcie_pcs(struct device *dev, u8 delay);
#else #else
static inline void omap_control_phy_power(struct device *dev, int on) static inline void omap_control_phy_power(struct device *dev, int on)
...@@ -91,7 +91,7 @@ static inline void omap_control_usb_set_mode(struct device *dev, ...@@ -91,7 +91,7 @@ static inline void omap_control_usb_set_mode(struct device *dev,
{ {
} }
static inline void omap_control_pcie_pcs(struct device *dev, u8 id, u8 delay) static inline void omap_control_pcie_pcs(struct device *dev, u8 delay)
{ {
} }
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment