You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
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:
@@ -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;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user