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-4.12-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
Pull USB fixes from Greg KH: "Here are a number of small USB fixes for 4.12-rc2 Most of them come from Johan, in his valiant quest to fix up all drivers that could be affected by "malicious" USB devices. There's also some fixes for more "obscure" drivers to handle some of the vmalloc stack fallout (which for USB drivers, was always the case, but very few people actually ran those systems...) Other than that, the normal set of xhci and gadget and musb driver fixes as well. All have been in linux-next with no reported issues" * tag 'usb-4.12-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (42 commits) usb: musb: tusb6010_omap: Do not reset the other direction's packet size usb: musb: Fix trying to suspend while active for OTG configurations usb: host: xhci-plat: propagate return value of platform_get_irq() xhci: Fix command ring stop regression in 4.11 xhci: remove GFP_DMA flag from allocation USB: xhci: fix lock-inversion problem usb: host: xhci-ring: don't need to clear interrupt pending for MSI enabled hcd usb: host: xhci-mem: allocate zeroed Scratchpad Buffer xhci: apply PME_STUCK_QUIRK and MISSING_CAS quirk for Denverton usb: xhci: trace URB before giving it back instead of after USB: serial: qcserial: add more Lenovo EM74xx device IDs USB: host: xhci: use max-port define USB: hub: fix SS max number of ports USB: hub: fix non-SS hub-descriptor handling USB: hub: fix SS hub-descriptor handling USB: usbip: fix nonconforming hub descriptor USB: gadget: dummy_hcd: fix hub-descriptor removable fields doc-rst: fixed kernel-doc directives in usb/typec.rst USB: core: of: document reference taken by companion helper USB: ehci-platform: fix companion-device leak ...
This commit is contained in:
@@ -114,8 +114,7 @@ the details during registration. The class offers the following API for
|
||||
registering/unregistering cables and their plugs:
|
||||
|
||||
.. kernel-doc:: drivers/usb/typec/typec.c
|
||||
:functions: typec_register_cable typec_unregister_cable typec_register_plug
|
||||
typec_unregister_plug
|
||||
:functions: typec_register_cable typec_unregister_cable typec_register_plug typec_unregister_plug
|
||||
|
||||
The class will provide a handle to struct typec_cable and struct typec_plug if
|
||||
the registration is successful, or NULL if it isn't.
|
||||
@@ -137,8 +136,7 @@ during connection of a partner or cable, the port driver must use the following
|
||||
APIs to report it to the class:
|
||||
|
||||
.. kernel-doc:: drivers/usb/typec/typec.c
|
||||
:functions: typec_set_data_role typec_set_pwr_role typec_set_vconn_role
|
||||
typec_set_pwr_opmode
|
||||
:functions: typec_set_data_role typec_set_pwr_role typec_set_vconn_role typec_set_pwr_opmode
|
||||
|
||||
Alternate Modes
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
@@ -475,11 +475,11 @@ static void snoop_urb(struct usb_device *udev,
|
||||
|
||||
if (userurb) { /* Async */
|
||||
if (when == SUBMIT)
|
||||
dev_info(&udev->dev, "userurb %p, ep%d %s-%s, "
|
||||
dev_info(&udev->dev, "userurb %pK, ep%d %s-%s, "
|
||||
"length %u\n",
|
||||
userurb, ep, t, d, length);
|
||||
else
|
||||
dev_info(&udev->dev, "userurb %p, ep%d %s-%s, "
|
||||
dev_info(&udev->dev, "userurb %pK, ep%d %s-%s, "
|
||||
"actual_length %u status %d\n",
|
||||
userurb, ep, t, d, length,
|
||||
timeout_or_status);
|
||||
@@ -1895,7 +1895,7 @@ static int proc_reapurb(struct usb_dev_state *ps, void __user *arg)
|
||||
if (as) {
|
||||
int retval;
|
||||
|
||||
snoop(&ps->dev->dev, "reap %p\n", as->userurb);
|
||||
snoop(&ps->dev->dev, "reap %pK\n", as->userurb);
|
||||
retval = processcompl(as, (void __user * __user *)arg);
|
||||
free_async(as);
|
||||
return retval;
|
||||
@@ -1912,7 +1912,7 @@ static int proc_reapurbnonblock(struct usb_dev_state *ps, void __user *arg)
|
||||
|
||||
as = async_getcompleted(ps);
|
||||
if (as) {
|
||||
snoop(&ps->dev->dev, "reap %p\n", as->userurb);
|
||||
snoop(&ps->dev->dev, "reap %pK\n", as->userurb);
|
||||
retval = processcompl(as, (void __user * __user *)arg);
|
||||
free_async(as);
|
||||
} else {
|
||||
@@ -2043,7 +2043,7 @@ static int proc_reapurb_compat(struct usb_dev_state *ps, void __user *arg)
|
||||
if (as) {
|
||||
int retval;
|
||||
|
||||
snoop(&ps->dev->dev, "reap %p\n", as->userurb);
|
||||
snoop(&ps->dev->dev, "reap %pK\n", as->userurb);
|
||||
retval = processcompl_compat(as, (void __user * __user *)arg);
|
||||
free_async(as);
|
||||
return retval;
|
||||
@@ -2060,7 +2060,7 @@ static int proc_reapurbnonblock_compat(struct usb_dev_state *ps, void __user *ar
|
||||
|
||||
as = async_getcompleted(ps);
|
||||
if (as) {
|
||||
snoop(&ps->dev->dev, "reap %p\n", as->userurb);
|
||||
snoop(&ps->dev->dev, "reap %pK\n", as->userurb);
|
||||
retval = processcompl_compat(as, (void __user * __user *)arg);
|
||||
free_async(as);
|
||||
} else {
|
||||
@@ -2489,7 +2489,7 @@ static long usbdev_do_ioctl(struct file *file, unsigned int cmd,
|
||||
#endif
|
||||
|
||||
case USBDEVFS_DISCARDURB:
|
||||
snoop(&dev->dev, "%s: DISCARDURB %p\n", __func__, p);
|
||||
snoop(&dev->dev, "%s: DISCARDURB %pK\n", __func__, p);
|
||||
ret = proc_unlinkurb(ps, p);
|
||||
break;
|
||||
|
||||
|
||||
@@ -1723,7 +1723,7 @@ int usb_hcd_unlink_urb (struct urb *urb, int status)
|
||||
if (retval == 0)
|
||||
retval = -EINPROGRESS;
|
||||
else if (retval != -EIDRM && retval != -EBUSY)
|
||||
dev_dbg(&udev->dev, "hcd_unlink_urb %p fail %d\n",
|
||||
dev_dbg(&udev->dev, "hcd_unlink_urb %pK fail %d\n",
|
||||
urb, retval);
|
||||
usb_put_dev(udev);
|
||||
}
|
||||
@@ -1890,7 +1890,7 @@ rescan:
|
||||
/* kick hcd */
|
||||
unlink1(hcd, urb, -ESHUTDOWN);
|
||||
dev_dbg (hcd->self.controller,
|
||||
"shutdown urb %p ep%d%s%s\n",
|
||||
"shutdown urb %pK ep%d%s%s\n",
|
||||
urb, usb_endpoint_num(&ep->desc),
|
||||
is_in ? "in" : "out",
|
||||
({ char *s;
|
||||
@@ -2520,6 +2520,7 @@ struct usb_hcd *__usb_create_hcd(const struct hc_driver *driver,
|
||||
hcd->bandwidth_mutex = kmalloc(sizeof(*hcd->bandwidth_mutex),
|
||||
GFP_KERNEL);
|
||||
if (!hcd->bandwidth_mutex) {
|
||||
kfree(hcd->address0_mutex);
|
||||
kfree(hcd);
|
||||
dev_dbg(dev, "hcd bandwidth mutex alloc failed\n");
|
||||
return NULL;
|
||||
|
||||
+21
-6
@@ -362,7 +362,8 @@ static void usb_set_lpm_parameters(struct usb_device *udev)
|
||||
}
|
||||
|
||||
/* USB 2.0 spec Section 11.24.4.5 */
|
||||
static int get_hub_descriptor(struct usb_device *hdev, void *data)
|
||||
static int get_hub_descriptor(struct usb_device *hdev,
|
||||
struct usb_hub_descriptor *desc)
|
||||
{
|
||||
int i, ret, size;
|
||||
unsigned dtype;
|
||||
@@ -378,10 +379,18 @@ static int get_hub_descriptor(struct usb_device *hdev, void *data)
|
||||
for (i = 0; i < 3; i++) {
|
||||
ret = usb_control_msg(hdev, usb_rcvctrlpipe(hdev, 0),
|
||||
USB_REQ_GET_DESCRIPTOR, USB_DIR_IN | USB_RT_HUB,
|
||||
dtype << 8, 0, data, size,
|
||||
dtype << 8, 0, desc, size,
|
||||
USB_CTRL_GET_TIMEOUT);
|
||||
if (ret >= (USB_DT_HUB_NONVAR_SIZE + 2))
|
||||
if (hub_is_superspeed(hdev)) {
|
||||
if (ret == size)
|
||||
return ret;
|
||||
} else if (ret >= USB_DT_HUB_NONVAR_SIZE + 2) {
|
||||
/* Make sure we have the DeviceRemovable field. */
|
||||
size = USB_DT_HUB_NONVAR_SIZE + desc->bNbrPorts / 8 + 1;
|
||||
if (ret < size)
|
||||
return -EMSGSIZE;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -1313,7 +1322,7 @@ static int hub_configure(struct usb_hub *hub,
|
||||
}
|
||||
mutex_init(&hub->status_mutex);
|
||||
|
||||
hub->descriptor = kmalloc(sizeof(*hub->descriptor), GFP_KERNEL);
|
||||
hub->descriptor = kzalloc(sizeof(*hub->descriptor), GFP_KERNEL);
|
||||
if (!hub->descriptor) {
|
||||
ret = -ENOMEM;
|
||||
goto fail;
|
||||
@@ -1321,13 +1330,19 @@ static int hub_configure(struct usb_hub *hub,
|
||||
|
||||
/* Request the entire hub descriptor.
|
||||
* hub->descriptor can handle USB_MAXCHILDREN ports,
|
||||
* but the hub can/will return fewer bytes here.
|
||||
* but a (non-SS) hub can/will return fewer bytes here.
|
||||
*/
|
||||
ret = get_hub_descriptor(hdev, hub->descriptor);
|
||||
if (ret < 0) {
|
||||
message = "can't read hub descriptor";
|
||||
goto fail;
|
||||
} else if (hub->descriptor->bNbrPorts > USB_MAXCHILDREN) {
|
||||
}
|
||||
|
||||
maxchild = USB_MAXCHILDREN;
|
||||
if (hub_is_superspeed(hdev))
|
||||
maxchild = min_t(unsigned, maxchild, USB_SS_MAXPORTS);
|
||||
|
||||
if (hub->descriptor->bNbrPorts > maxchild) {
|
||||
message = "hub has too many ports!";
|
||||
ret = -ENODEV;
|
||||
goto fail;
|
||||
|
||||
@@ -53,6 +53,9 @@ EXPORT_SYMBOL_GPL(usb_of_get_child_node);
|
||||
*
|
||||
* Find the companion device from platform bus.
|
||||
*
|
||||
* Takes a reference to the returned struct device which needs to be dropped
|
||||
* after use.
|
||||
*
|
||||
* Return: On success, a pointer to the companion device, %NULL on failure.
|
||||
*/
|
||||
struct device *usb_of_get_companion_dev(struct device *dev)
|
||||
|
||||
@@ -338,7 +338,7 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags)
|
||||
if (!urb || !urb->complete)
|
||||
return -EINVAL;
|
||||
if (urb->hcpriv) {
|
||||
WARN_ONCE(1, "URB %p submitted while active\n", urb);
|
||||
WARN_ONCE(1, "URB %pK submitted while active\n", urb);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
|
||||
@@ -107,6 +107,10 @@ static int kdwc3_probe(struct platform_device *pdev)
|
||||
return PTR_ERR(kdwc->usbss);
|
||||
|
||||
kdwc->clk = devm_clk_get(kdwc->dev, "usb");
|
||||
if (IS_ERR(kdwc->clk)) {
|
||||
dev_err(kdwc->dev, "unable to get usb clock\n");
|
||||
return PTR_ERR(kdwc->clk);
|
||||
}
|
||||
|
||||
error = clk_prepare_enable(kdwc->clk);
|
||||
if (error < 0) {
|
||||
|
||||
@@ -39,6 +39,8 @@
|
||||
#define PCI_DEVICE_ID_INTEL_APL 0x5aaa
|
||||
#define PCI_DEVICE_ID_INTEL_KBP 0xa2b0
|
||||
#define PCI_DEVICE_ID_INTEL_GLK 0x31aa
|
||||
#define PCI_DEVICE_ID_INTEL_CNPLP 0x9dee
|
||||
#define PCI_DEVICE_ID_INTEL_CNPH 0xa36e
|
||||
|
||||
#define PCI_INTEL_BXT_DSM_UUID "732b85d5-b7a7-4a1b-9ba0-4bbd00ffd511"
|
||||
#define PCI_INTEL_BXT_FUNC_PMU_PWR 4
|
||||
@@ -270,6 +272,8 @@ static const struct pci_device_id dwc3_pci_id_table[] = {
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_APL), },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_KBP), },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_GLK), },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_CNPLP), },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_CNPH), },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_NL_USB), },
|
||||
{ } /* Terminating Entry */
|
||||
};
|
||||
|
||||
@@ -1261,14 +1261,24 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
|
||||
__dwc3_gadget_start_isoc(dwc, dep, cur_uf);
|
||||
dep->flags &= ~DWC3_EP_PENDING_REQUEST;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
|
||||
if ((dep->flags & DWC3_EP_BUSY) &&
|
||||
!(dep->flags & DWC3_EP_MISSED_ISOC)) {
|
||||
WARN_ON_ONCE(!dep->resource_index);
|
||||
ret = __dwc3_gadget_kick_transfer(dep,
|
||||
dep->resource_index);
|
||||
}
|
||||
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!dwc3_calc_trbs_left(dep))
|
||||
return 0;
|
||||
|
||||
ret = __dwc3_gadget_kick_transfer(dep, 0);
|
||||
out:
|
||||
if (ret == -EBUSY)
|
||||
ret = 0;
|
||||
|
||||
@@ -3026,6 +3036,15 @@ static irqreturn_t dwc3_check_event_buf(struct dwc3_event_buffer *evt)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
/*
|
||||
* With PCIe legacy interrupt, test shows that top-half irq handler can
|
||||
* be called again after HW interrupt deassertion. Check if bottom-half
|
||||
* irq event handler completes before caching new event to prevent
|
||||
* losing events.
|
||||
*/
|
||||
if (evt->flags & DWC3_EVENT_PENDING)
|
||||
return IRQ_HANDLED;
|
||||
|
||||
count = dwc3_readl(dwc->regs, DWC3_GEVNTCOUNT(0));
|
||||
count &= DWC3_GEVNTCOUNT_MASK;
|
||||
if (!count)
|
||||
|
||||
@@ -1858,12 +1858,12 @@ static int ffs_func_eps_enable(struct ffs_function *func)
|
||||
ep->ep->driver_data = ep;
|
||||
ep->ep->desc = ds;
|
||||
|
||||
comp_desc = (struct usb_ss_ep_comp_descriptor *)(ds +
|
||||
USB_DT_ENDPOINT_SIZE);
|
||||
ep->ep->maxburst = comp_desc->bMaxBurst + 1;
|
||||
|
||||
if (needs_comp_desc)
|
||||
if (needs_comp_desc) {
|
||||
comp_desc = (struct usb_ss_ep_comp_descriptor *)(ds +
|
||||
USB_DT_ENDPOINT_SIZE);
|
||||
ep->ep->maxburst = comp_desc->bMaxBurst + 1;
|
||||
ep->ep->comp_desc = comp_desc;
|
||||
}
|
||||
|
||||
ret = usb_ep_enable(ep->ep);
|
||||
if (likely(!ret)) {
|
||||
|
||||
@@ -1256,7 +1256,7 @@ static void gserial_console_exit(void)
|
||||
struct gscons_info *info = &gscons_info;
|
||||
|
||||
unregister_console(&gserial_cons);
|
||||
if (info->console_thread != NULL)
|
||||
if (!IS_ERR_OR_NULL(info->console_thread))
|
||||
kthread_stop(info->console_thread);
|
||||
gs_buf_free(&info->con_buf);
|
||||
}
|
||||
|
||||
@@ -2008,7 +2008,7 @@ ss_hub_descriptor(struct usb_hub_descriptor *desc)
|
||||
HUB_CHAR_COMMON_OCPM);
|
||||
desc->bNbrPorts = 1;
|
||||
desc->u.ss.bHubHdrDecLat = 0x04; /* Worst case: 0.4 micro sec*/
|
||||
desc->u.ss.DeviceRemovable = 0xffff;
|
||||
desc->u.ss.DeviceRemovable = 0;
|
||||
}
|
||||
|
||||
static inline void hub_descriptor(struct usb_hub_descriptor *desc)
|
||||
@@ -2020,8 +2020,8 @@ static inline void hub_descriptor(struct usb_hub_descriptor *desc)
|
||||
HUB_CHAR_INDV_PORT_LPSM |
|
||||
HUB_CHAR_COMMON_OCPM);
|
||||
desc->bNbrPorts = 1;
|
||||
desc->u.hs.DeviceRemovable[0] = 0xff;
|
||||
desc->u.hs.DeviceRemovable[1] = 0xff;
|
||||
desc->u.hs.DeviceRemovable[0] = 0;
|
||||
desc->u.hs.DeviceRemovable[1] = 0xff; /* PortPwrCtrlMask */
|
||||
}
|
||||
|
||||
static int dummy_hub_control(
|
||||
|
||||
@@ -384,8 +384,10 @@ static int ehci_platform_resume(struct device *dev)
|
||||
}
|
||||
|
||||
companion_dev = usb_of_get_companion_dev(hcd->self.controller);
|
||||
if (companion_dev)
|
||||
if (companion_dev) {
|
||||
device_pm_wait_for_dev(hcd->self.controller, companion_dev);
|
||||
put_device(companion_dev);
|
||||
}
|
||||
|
||||
ehci_resume(hcd, priv->reset_on_resume);
|
||||
return 0;
|
||||
|
||||
@@ -1269,7 +1269,7 @@ static void set_td_timer(struct r8a66597 *r8a66597, struct r8a66597_td *td)
|
||||
time = 30;
|
||||
break;
|
||||
default:
|
||||
time = 300;
|
||||
time = 50;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1785,6 +1785,7 @@ static void r8a66597_td_timer(unsigned long _r8a66597)
|
||||
pipe = td->pipe;
|
||||
pipe_stop(r8a66597, pipe);
|
||||
|
||||
/* Select a different address or endpoint */
|
||||
new_td = td;
|
||||
do {
|
||||
list_move_tail(&new_td->queue,
|
||||
@@ -1794,7 +1795,8 @@ static void r8a66597_td_timer(unsigned long _r8a66597)
|
||||
new_td = td;
|
||||
break;
|
||||
}
|
||||
} while (td != new_td && td->address == new_td->address);
|
||||
} while (td != new_td && td->address == new_td->address &&
|
||||
td->pipe->info.epnum == new_td->pipe->info.epnum);
|
||||
|
||||
start_transfer(r8a66597, new_td);
|
||||
|
||||
|
||||
@@ -419,7 +419,7 @@ static int xhci_stop_device(struct xhci_hcd *xhci, int slot_id, int suspend)
|
||||
wait_for_completion(cmd->completion);
|
||||
|
||||
if (cmd->status == COMP_COMMAND_ABORTED ||
|
||||
cmd->status == COMP_STOPPED) {
|
||||
cmd->status == COMP_COMMAND_RING_STOPPED) {
|
||||
xhci_warn(xhci, "Timeout while waiting for stop endpoint command\n");
|
||||
ret = -ETIME;
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ static struct xhci_segment *xhci_segment_alloc(struct xhci_hcd *xhci,
|
||||
}
|
||||
|
||||
if (max_packet) {
|
||||
seg->bounce_buf = kzalloc(max_packet, flags | GFP_DMA);
|
||||
seg->bounce_buf = kzalloc(max_packet, flags);
|
||||
if (!seg->bounce_buf) {
|
||||
dma_pool_free(xhci->segment_pool, seg->trbs, dma);
|
||||
kfree(seg);
|
||||
@@ -1724,7 +1724,7 @@ static int scratchpad_alloc(struct xhci_hcd *xhci, gfp_t flags)
|
||||
xhci->dcbaa->dev_context_ptrs[0] = cpu_to_le64(xhci->scratchpad->sp_dma);
|
||||
for (i = 0; i < num_sp; i++) {
|
||||
dma_addr_t dma;
|
||||
void *buf = dma_alloc_coherent(dev, xhci->page_size, &dma,
|
||||
void *buf = dma_zalloc_coherent(dev, xhci->page_size, &dma,
|
||||
flags);
|
||||
if (!buf)
|
||||
goto fail_sp4;
|
||||
@@ -2307,10 +2307,11 @@ static int xhci_setup_port_arrays(struct xhci_hcd *xhci, gfp_t flags)
|
||||
/* Place limits on the number of roothub ports so that the hub
|
||||
* descriptors aren't longer than the USB core will allocate.
|
||||
*/
|
||||
if (xhci->num_usb3_ports > 15) {
|
||||
if (xhci->num_usb3_ports > USB_SS_MAXPORTS) {
|
||||
xhci_dbg_trace(xhci, trace_xhci_dbg_init,
|
||||
"Limiting USB 3.0 roothub ports to 15.");
|
||||
xhci->num_usb3_ports = 15;
|
||||
"Limiting USB 3.0 roothub ports to %u.",
|
||||
USB_SS_MAXPORTS);
|
||||
xhci->num_usb3_ports = USB_SS_MAXPORTS;
|
||||
}
|
||||
if (xhci->num_usb2_ports > USB_MAXCHILDREN) {
|
||||
xhci_dbg_trace(xhci, trace_xhci_dbg_init,
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
#define PCI_DEVICE_ID_INTEL_BROXTON_M_XHCI 0x0aa8
|
||||
#define PCI_DEVICE_ID_INTEL_BROXTON_B_XHCI 0x1aa8
|
||||
#define PCI_DEVICE_ID_INTEL_APL_XHCI 0x5aa8
|
||||
#define PCI_DEVICE_ID_INTEL_DNV_XHCI 0x19d0
|
||||
|
||||
static const char hcd_name[] = "xhci_hcd";
|
||||
|
||||
@@ -166,7 +167,8 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
|
||||
pdev->device == PCI_DEVICE_ID_INTEL_CHERRYVIEW_XHCI ||
|
||||
pdev->device == PCI_DEVICE_ID_INTEL_BROXTON_M_XHCI ||
|
||||
pdev->device == PCI_DEVICE_ID_INTEL_BROXTON_B_XHCI ||
|
||||
pdev->device == PCI_DEVICE_ID_INTEL_APL_XHCI)) {
|
||||
pdev->device == PCI_DEVICE_ID_INTEL_APL_XHCI ||
|
||||
pdev->device == PCI_DEVICE_ID_INTEL_DNV_XHCI)) {
|
||||
xhci->quirks |= XHCI_PME_STUCK_QUIRK;
|
||||
}
|
||||
if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
|
||||
@@ -175,7 +177,8 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
|
||||
}
|
||||
if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
|
||||
(pdev->device == PCI_DEVICE_ID_INTEL_CHERRYVIEW_XHCI ||
|
||||
pdev->device == PCI_DEVICE_ID_INTEL_APL_XHCI))
|
||||
pdev->device == PCI_DEVICE_ID_INTEL_APL_XHCI ||
|
||||
pdev->device == PCI_DEVICE_ID_INTEL_DNV_XHCI))
|
||||
xhci->quirks |= XHCI_MISSING_CAS;
|
||||
|
||||
if (pdev->vendor == PCI_VENDOR_ID_ETRON &&
|
||||
|
||||
@@ -177,7 +177,7 @@ static int xhci_plat_probe(struct platform_device *pdev)
|
||||
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq < 0)
|
||||
return -ENODEV;
|
||||
return irq;
|
||||
|
||||
/*
|
||||
* sysdev must point to a device that is known to the system firmware
|
||||
|
||||
@@ -323,7 +323,7 @@ static void xhci_handle_stopped_cmd_ring(struct xhci_hcd *xhci,
|
||||
if (i_cmd->status != COMP_COMMAND_ABORTED)
|
||||
continue;
|
||||
|
||||
i_cmd->status = COMP_STOPPED;
|
||||
i_cmd->status = COMP_COMMAND_RING_STOPPED;
|
||||
|
||||
xhci_dbg(xhci, "Turn aborted command %p to no-op\n",
|
||||
i_cmd->command_trb);
|
||||
@@ -641,8 +641,8 @@ static void xhci_giveback_urb_in_irq(struct xhci_hcd *xhci,
|
||||
xhci_urb_free_priv(urb_priv);
|
||||
usb_hcd_unlink_urb_from_ep(hcd, urb);
|
||||
spin_unlock(&xhci->lock);
|
||||
usb_hcd_giveback_urb(hcd, urb, status);
|
||||
trace_xhci_urb_giveback(urb);
|
||||
usb_hcd_giveback_urb(hcd, urb, status);
|
||||
spin_lock(&xhci->lock);
|
||||
}
|
||||
|
||||
@@ -1380,7 +1380,7 @@ static void handle_cmd_completion(struct xhci_hcd *xhci,
|
||||
cmd_comp_code = GET_COMP_CODE(le32_to_cpu(event->status));
|
||||
|
||||
/* If CMD ring stopped we own the trbs between enqueue and dequeue */
|
||||
if (cmd_comp_code == COMP_STOPPED) {
|
||||
if (cmd_comp_code == COMP_COMMAND_RING_STOPPED) {
|
||||
complete_all(&xhci->cmd_ring_stop_completion);
|
||||
return;
|
||||
}
|
||||
@@ -1436,8 +1436,8 @@ static void handle_cmd_completion(struct xhci_hcd *xhci,
|
||||
break;
|
||||
case TRB_CMD_NOOP:
|
||||
/* Is this an aborted command turned to NO-OP? */
|
||||
if (cmd->status == COMP_STOPPED)
|
||||
cmd_comp_code = COMP_STOPPED;
|
||||
if (cmd->status == COMP_COMMAND_RING_STOPPED)
|
||||
cmd_comp_code = COMP_COMMAND_RING_STOPPED;
|
||||
break;
|
||||
case TRB_RESET_EP:
|
||||
WARN_ON(slot_id != TRB_TO_SLOT_ID(
|
||||
@@ -2677,11 +2677,12 @@ irqreturn_t xhci_irq(struct usb_hcd *hcd)
|
||||
struct xhci_hcd *xhci = hcd_to_xhci(hcd);
|
||||
union xhci_trb *event_ring_deq;
|
||||
irqreturn_t ret = IRQ_NONE;
|
||||
unsigned long flags;
|
||||
dma_addr_t deq;
|
||||
u64 temp_64;
|
||||
u32 status;
|
||||
|
||||
spin_lock(&xhci->lock);
|
||||
spin_lock_irqsave(&xhci->lock, flags);
|
||||
/* Check if the xHC generated the interrupt, or the irq is shared */
|
||||
status = readl(&xhci->op_regs->status);
|
||||
if (status == ~(u32)0) {
|
||||
@@ -2707,12 +2708,9 @@ irqreturn_t xhci_irq(struct usb_hcd *hcd)
|
||||
*/
|
||||
status |= STS_EINT;
|
||||
writel(status, &xhci->op_regs->status);
|
||||
/* FIXME when MSI-X is supported and there are multiple vectors */
|
||||
/* Clear the MSI-X event interrupt status */
|
||||
|
||||
if (hcd->irq) {
|
||||
if (!hcd->msi_enabled) {
|
||||
u32 irq_pending;
|
||||
/* Acknowledge the PCI interrupt */
|
||||
irq_pending = readl(&xhci->ir_set->irq_pending);
|
||||
irq_pending |= IMAN_IP;
|
||||
writel(irq_pending, &xhci->ir_set->irq_pending);
|
||||
@@ -2757,7 +2755,7 @@ irqreturn_t xhci_irq(struct usb_hcd *hcd)
|
||||
ret = IRQ_HANDLED;
|
||||
|
||||
out:
|
||||
spin_unlock(&xhci->lock);
|
||||
spin_unlock_irqrestore(&xhci->lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -359,9 +359,10 @@ static int xhci_try_enable_msi(struct usb_hcd *hcd)
|
||||
/* fall back to msi*/
|
||||
ret = xhci_setup_msi(xhci);
|
||||
|
||||
if (!ret)
|
||||
/* hcd->irq is 0, we have MSI */
|
||||
if (!ret) {
|
||||
hcd->msi_enabled = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!pdev->irq) {
|
||||
xhci_err(xhci, "No msi-x/msi found and no IRQ in BIOS\n");
|
||||
@@ -1763,7 +1764,7 @@ static int xhci_configure_endpoint_result(struct xhci_hcd *xhci,
|
||||
|
||||
switch (*cmd_status) {
|
||||
case COMP_COMMAND_ABORTED:
|
||||
case COMP_STOPPED:
|
||||
case COMP_COMMAND_RING_STOPPED:
|
||||
xhci_warn(xhci, "Timeout while waiting for configure endpoint command\n");
|
||||
ret = -ETIME;
|
||||
break;
|
||||
@@ -1813,7 +1814,7 @@ static int xhci_evaluate_context_result(struct xhci_hcd *xhci,
|
||||
|
||||
switch (*cmd_status) {
|
||||
case COMP_COMMAND_ABORTED:
|
||||
case COMP_STOPPED:
|
||||
case COMP_COMMAND_RING_STOPPED:
|
||||
xhci_warn(xhci, "Timeout while waiting for evaluate context command\n");
|
||||
ret = -ETIME;
|
||||
break;
|
||||
@@ -3432,7 +3433,7 @@ static int xhci_discover_or_reset_device(struct usb_hcd *hcd,
|
||||
ret = reset_device_cmd->status;
|
||||
switch (ret) {
|
||||
case COMP_COMMAND_ABORTED:
|
||||
case COMP_STOPPED:
|
||||
case COMP_COMMAND_RING_STOPPED:
|
||||
xhci_warn(xhci, "Timeout waiting for reset device command\n");
|
||||
ret = -ETIME;
|
||||
goto command_cleanup;
|
||||
@@ -3817,7 +3818,7 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev,
|
||||
*/
|
||||
switch (command->status) {
|
||||
case COMP_COMMAND_ABORTED:
|
||||
case COMP_STOPPED:
|
||||
case COMP_COMMAND_RING_STOPPED:
|
||||
xhci_warn(xhci, "Timeout while waiting for setup device command\n");
|
||||
ret = -ETIME;
|
||||
break;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user