mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-22 17:33:01 +00:00
USB fixes for 3.19-rc5
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. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iEYEABECAAYFAlS5WTQACgkQMUfUDdst+ykYQgCffWxrhuQKYJLYVYmIoDS8lL/c 1v4AoIowfSV08l22puWQpAOih/tg0WGI =mfZA -----END PGP SIGNATURE----- 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 ...
This commit is contained in:
commit
79600d4bba
@ -1050,7 +1050,8 @@ static int miphy28lp_init(struct phy *phy)
|
||||
ret = miphy28lp_init_usb3(miphy_phy);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
mutex_unlock(&miphy_dev->miphy_mutex);
|
||||
|
@ -29,10 +29,9 @@
|
||||
/**
|
||||
* omap_control_pcie_pcs - set the PCS delay count
|
||||
* @dev: the control module device
|
||||
* @id: index of the pcie PHY (should be 1 or 2)
|
||||
* @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;
|
||||
struct omap_control_phy *control_phy;
|
||||
@ -55,8 +54,8 @@ void omap_control_pcie_pcs(struct device *dev, u8 id, u8 delay)
|
||||
|
||||
val = readl(control_phy->pcie_pcs);
|
||||
val &= ~(OMAP_CTRL_PCIE_PCS_MASK <<
|
||||
(id * OMAP_CTRL_PCIE_PCS_DELAY_COUNT_SHIFT));
|
||||
val |= delay << (id * OMAP_CTRL_PCIE_PCS_DELAY_COUNT_SHIFT);
|
||||
OMAP_CTRL_PCIE_PCS_DELAY_COUNT_SHIFT);
|
||||
val |= (delay << OMAP_CTRL_PCIE_PCS_DELAY_COUNT_SHIFT);
|
||||
writel(val, control_phy->pcie_pcs);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(omap_control_pcie_pcs);
|
||||
|
@ -244,7 +244,8 @@ static int sun4i_usb_phy_probe(struct platform_device *pdev)
|
||||
else
|
||||
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;
|
||||
else
|
||||
data->disc_thresh = 2;
|
||||
|
@ -82,7 +82,6 @@ struct ti_pipe3 {
|
||||
struct clk *refclk;
|
||||
struct clk *div_clk;
|
||||
struct pipe3_dpll_map *dpll_map;
|
||||
u8 id;
|
||||
};
|
||||
|
||||
static struct pipe3_dpll_map dpll_map_usb[] = {
|
||||
@ -217,8 +216,13 @@ static int ti_pipe3_init(struct phy *x)
|
||||
u32 val;
|
||||
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")) {
|
||||
omap_control_pcie_pcs(phy->control_dev, phy->id, 0xF1);
|
||||
omap_control_pcie_pcs(phy->control_dev, 0x96);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -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_property_read_u8(node, "id", &phy->id) < 0)
|
||||
phy->id = 1;
|
||||
|
||||
clk = devm_clk_get(phy->dev, "dpll_ref");
|
||||
if (IS_ERR(clk)) {
|
||||
|
@ -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;
|
||||
|
@ -2567,7 +2567,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;
|
||||
@ -2588,7 +2588,7 @@ static int s3c_hsotg_ep_disable(struct usb_ep *ep)
|
||||
|
||||
spin_lock_irqsave(&hsotg->lock, flags);
|
||||
/* 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);
|
||||
hs_ep->fifo_index = 0;
|
||||
@ -2609,6 +2609,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.
|
||||
@ -2924,7 +2928,7 @@ static int s3c_hsotg_udc_stop(struct usb_gadget *gadget)
|
||||
|
||||
/* all endpoints should be shutdown */
|
||||
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);
|
||||
|
||||
|
@ -33,6 +33,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
|
||||
|
||||
struct dwc3_pci {
|
||||
struct device *dev;
|
||||
@ -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_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 */
|
||||
};
|
||||
|
@ -882,8 +882,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;
|
||||
}
|
||||
@ -901,6 +900,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;
|
||||
|
@ -897,7 +897,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)
|
||||
@ -935,6 +934,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;
|
||||
}
|
||||
|
||||
|
@ -716,10 +716,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
|
||||
@ -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_udc *udc = ep->udc;
|
||||
struct usba_request *req = to_usba_req(_req);
|
||||
struct usba_request *req;
|
||||
unsigned long flags;
|
||||
u32 status;
|
||||
|
||||
@ -837,6 +837,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,
|
||||
@ -1563,7 +1573,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 || !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",
|
||||
|
@ -66,7 +66,7 @@ enum omap_control_usb_mode {
|
||||
#define OMAP_CTRL_PIPE3_PHY_TX_RX_POWEROFF 0x0
|
||||
|
||||
#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)
|
||||
|
||||
@ -79,7 +79,7 @@ enum omap_control_usb_mode {
|
||||
void omap_control_phy_power(struct device *dev, int on);
|
||||
void omap_control_usb_set_mode(struct device *dev,
|
||||
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
|
||||
|
||||
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,
|
||||
{
|
||||
}
|
||||
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user