Commit d1c0d965 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Merge tag 'fixes-for-v5.8-rc3' of...

Merge tag 'fixes-for-v5.8-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb into usb-linus

Felipe writes:

USB: fixes for v5.8-rc3

Adding support for recent Intel devices (Tiger Lake and Jasper Lake)
on dwc3. We have some endianess fixes in cdns3, a memleak fix in
gr_udc and lock API usage fix in the legacy f_uac1
Signed-off-by: default avatarFelipe Balbi <balbi@kernel.org>

* tag 'fixes-for-v5.8-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb:
  usb: gadget: function: fix missing spinlock in f_uac1_legacy
  usb: gadget: udc: atmel: fix uninitialized read in debug printk
  usb: gadget: udc: atmel: remove outdated comment in usba_ep_disable()
  usb: dwc2: Fix shutdown callback in platform
  usb: cdns3: trace: fix some endian issues
  usb: cdns3: ep0: fix some endian issues
  usb: gadget: udc: gr_udc: fix memleak on error handling path in gr_ep_init()
  usb: gadget: fix langid kernel-doc warning in usbstring.c
  usb: dwc3: pci: add support for the Intel Jasper Lake
  usb: dwc3: pci: add support for the Intel Tiger Lake PCH -H variant
parents 211f0834 8778eb09
...@@ -37,18 +37,18 @@ static void cdns3_ep0_run_transfer(struct cdns3_device *priv_dev, ...@@ -37,18 +37,18 @@ static void cdns3_ep0_run_transfer(struct cdns3_device *priv_dev,
struct cdns3_usb_regs __iomem *regs = priv_dev->regs; struct cdns3_usb_regs __iomem *regs = priv_dev->regs;
struct cdns3_endpoint *priv_ep = priv_dev->eps[0]; struct cdns3_endpoint *priv_ep = priv_dev->eps[0];
priv_ep->trb_pool[0].buffer = TRB_BUFFER(dma_addr); priv_ep->trb_pool[0].buffer = cpu_to_le32(TRB_BUFFER(dma_addr));
priv_ep->trb_pool[0].length = TRB_LEN(length); priv_ep->trb_pool[0].length = cpu_to_le32(TRB_LEN(length));
if (zlp) { if (zlp) {
priv_ep->trb_pool[0].control = TRB_CYCLE | TRB_TYPE(TRB_NORMAL); priv_ep->trb_pool[0].control = cpu_to_le32(TRB_CYCLE | TRB_TYPE(TRB_NORMAL));
priv_ep->trb_pool[1].buffer = TRB_BUFFER(dma_addr); priv_ep->trb_pool[1].buffer = cpu_to_le32(TRB_BUFFER(dma_addr));
priv_ep->trb_pool[1].length = TRB_LEN(0); priv_ep->trb_pool[1].length = cpu_to_le32(TRB_LEN(0));
priv_ep->trb_pool[1].control = TRB_CYCLE | TRB_IOC | priv_ep->trb_pool[1].control = cpu_to_le32(TRB_CYCLE | TRB_IOC |
TRB_TYPE(TRB_NORMAL); TRB_TYPE(TRB_NORMAL));
} else { } else {
priv_ep->trb_pool[0].control = TRB_CYCLE | TRB_IOC | priv_ep->trb_pool[0].control = cpu_to_le32(TRB_CYCLE | TRB_IOC |
TRB_TYPE(TRB_NORMAL); TRB_TYPE(TRB_NORMAL));
priv_ep->trb_pool[1].control = 0; priv_ep->trb_pool[1].control = 0;
} }
...@@ -264,11 +264,11 @@ static int cdns3_req_ep0_get_status(struct cdns3_device *priv_dev, ...@@ -264,11 +264,11 @@ static int cdns3_req_ep0_get_status(struct cdns3_device *priv_dev,
case USB_RECIP_INTERFACE: case USB_RECIP_INTERFACE:
return cdns3_ep0_delegate_req(priv_dev, ctrl); return cdns3_ep0_delegate_req(priv_dev, ctrl);
case USB_RECIP_ENDPOINT: case USB_RECIP_ENDPOINT:
index = cdns3_ep_addr_to_index(ctrl->wIndex); index = cdns3_ep_addr_to_index(le16_to_cpu(ctrl->wIndex));
priv_ep = priv_dev->eps[index]; priv_ep = priv_dev->eps[index];
/* check if endpoint is stalled or stall is pending */ /* check if endpoint is stalled or stall is pending */
cdns3_select_ep(priv_dev, ctrl->wIndex); cdns3_select_ep(priv_dev, le16_to_cpu(ctrl->wIndex));
if (EP_STS_STALL(readl(&priv_dev->regs->ep_sts)) || if (EP_STS_STALL(readl(&priv_dev->regs->ep_sts)) ||
(priv_ep->flags & EP_STALL_PENDING)) (priv_ep->flags & EP_STALL_PENDING))
usb_status = BIT(USB_ENDPOINT_HALT); usb_status = BIT(USB_ENDPOINT_HALT);
...@@ -381,10 +381,10 @@ static int cdns3_ep0_feature_handle_endpoint(struct cdns3_device *priv_dev, ...@@ -381,10 +381,10 @@ static int cdns3_ep0_feature_handle_endpoint(struct cdns3_device *priv_dev,
if (!(ctrl->wIndex & ~USB_DIR_IN)) if (!(ctrl->wIndex & ~USB_DIR_IN))
return 0; return 0;
index = cdns3_ep_addr_to_index(ctrl->wIndex); index = cdns3_ep_addr_to_index(le16_to_cpu(ctrl->wIndex));
priv_ep = priv_dev->eps[index]; priv_ep = priv_dev->eps[index];
cdns3_select_ep(priv_dev, ctrl->wIndex); cdns3_select_ep(priv_dev, le16_to_cpu(ctrl->wIndex));
if (set) if (set)
__cdns3_gadget_ep_set_halt(priv_ep); __cdns3_gadget_ep_set_halt(priv_ep);
...@@ -445,7 +445,7 @@ static int cdns3_req_ep0_set_sel(struct cdns3_device *priv_dev, ...@@ -445,7 +445,7 @@ static int cdns3_req_ep0_set_sel(struct cdns3_device *priv_dev,
if (priv_dev->gadget.state < USB_STATE_ADDRESS) if (priv_dev->gadget.state < USB_STATE_ADDRESS)
return -EINVAL; return -EINVAL;
if (ctrl_req->wLength != 6) { if (le16_to_cpu(ctrl_req->wLength) != 6) {
dev_err(priv_dev->dev, "Set SEL should be 6 bytes, got %d\n", dev_err(priv_dev->dev, "Set SEL should be 6 bytes, got %d\n",
ctrl_req->wLength); ctrl_req->wLength);
return -EINVAL; return -EINVAL;
...@@ -469,7 +469,7 @@ static int cdns3_req_ep0_set_isoch_delay(struct cdns3_device *priv_dev, ...@@ -469,7 +469,7 @@ static int cdns3_req_ep0_set_isoch_delay(struct cdns3_device *priv_dev,
if (ctrl_req->wIndex || ctrl_req->wLength) if (ctrl_req->wIndex || ctrl_req->wLength)
return -EINVAL; return -EINVAL;
priv_dev->isoch_delay = ctrl_req->wValue; priv_dev->isoch_delay = le16_to_cpu(ctrl_req->wValue);
return 0; return 0;
} }
......
...@@ -404,9 +404,9 @@ DECLARE_EVENT_CLASS(cdns3_log_trb, ...@@ -404,9 +404,9 @@ DECLARE_EVENT_CLASS(cdns3_log_trb,
TP_fast_assign( TP_fast_assign(
__assign_str(name, priv_ep->name); __assign_str(name, priv_ep->name);
__entry->trb = trb; __entry->trb = trb;
__entry->buffer = trb->buffer; __entry->buffer = le32_to_cpu(trb->buffer);
__entry->length = trb->length; __entry->length = le32_to_cpu(trb->length);
__entry->control = trb->control; __entry->control = le32_to_cpu(trb->control);
__entry->type = usb_endpoint_type(priv_ep->endpoint.desc); __entry->type = usb_endpoint_type(priv_ep->endpoint.desc);
__entry->last_stream_id = priv_ep->last_stream_id; __entry->last_stream_id = priv_ep->last_stream_id;
), ),
......
...@@ -342,7 +342,8 @@ static void dwc2_driver_shutdown(struct platform_device *dev) ...@@ -342,7 +342,8 @@ static void dwc2_driver_shutdown(struct platform_device *dev)
{ {
struct dwc2_hsotg *hsotg = platform_get_drvdata(dev); struct dwc2_hsotg *hsotg = platform_get_drvdata(dev);
disable_irq(hsotg->irq); dwc2_disable_global_interrupts(hsotg);
synchronize_irq(hsotg->irq);
} }
/** /**
......
...@@ -38,6 +38,8 @@ ...@@ -38,6 +38,8 @@
#define PCI_DEVICE_ID_INTEL_ICLLP 0x34ee #define PCI_DEVICE_ID_INTEL_ICLLP 0x34ee
#define PCI_DEVICE_ID_INTEL_EHLLP 0x4b7e #define PCI_DEVICE_ID_INTEL_EHLLP 0x4b7e
#define PCI_DEVICE_ID_INTEL_TGPLP 0xa0ee #define PCI_DEVICE_ID_INTEL_TGPLP 0xa0ee
#define PCI_DEVICE_ID_INTEL_TGPH 0x43ee
#define PCI_DEVICE_ID_INTEL_JSP 0x4dee
#define PCI_INTEL_BXT_DSM_GUID "732b85d5-b7a7-4a1b-9ba0-4bbd00ffd511" #define PCI_INTEL_BXT_DSM_GUID "732b85d5-b7a7-4a1b-9ba0-4bbd00ffd511"
#define PCI_INTEL_BXT_FUNC_PMU_PWR 4 #define PCI_INTEL_BXT_FUNC_PMU_PWR 4
...@@ -358,6 +360,12 @@ static const struct pci_device_id dwc3_pci_id_table[] = { ...@@ -358,6 +360,12 @@ static const struct pci_device_id dwc3_pci_id_table[] = {
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_TGPLP), { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_TGPLP),
(kernel_ulong_t) &dwc3_pci_intel_properties, }, (kernel_ulong_t) &dwc3_pci_intel_properties, },
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_TGPH),
(kernel_ulong_t) &dwc3_pci_intel_properties, },
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_JSP),
(kernel_ulong_t) &dwc3_pci_intel_properties, },
{ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_NL_USB), { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_NL_USB),
(kernel_ulong_t) &dwc3_pci_amd_properties, }, (kernel_ulong_t) &dwc3_pci_amd_properties, },
{ } /* Terminating Entry */ { } /* Terminating Entry */
......
...@@ -336,7 +336,9 @@ static int f_audio_out_ep_complete(struct usb_ep *ep, struct usb_request *req) ...@@ -336,7 +336,9 @@ static int f_audio_out_ep_complete(struct usb_ep *ep, struct usb_request *req)
/* Copy buffer is full, add it to the play_queue */ /* Copy buffer is full, add it to the play_queue */
if (audio_buf_size - copy_buf->actual < req->actual) { if (audio_buf_size - copy_buf->actual < req->actual) {
spin_lock_irq(&audio->lock);
list_add_tail(&copy_buf->list, &audio->play_queue); list_add_tail(&copy_buf->list, &audio->play_queue);
spin_unlock_irq(&audio->lock);
schedule_work(&audio->playback_work); schedule_work(&audio->playback_work);
copy_buf = f_audio_buffer_alloc(audio_buf_size); copy_buf = f_audio_buffer_alloc(audio_buf_size);
if (IS_ERR(copy_buf)) if (IS_ERR(copy_buf))
......
...@@ -676,13 +676,7 @@ static int usba_ep_disable(struct usb_ep *_ep) ...@@ -676,13 +676,7 @@ static int usba_ep_disable(struct usb_ep *_ep)
if (!ep->ep.desc) { if (!ep->ep.desc) {
spin_unlock_irqrestore(&udc->lock, flags); spin_unlock_irqrestore(&udc->lock, flags);
/* REVISIT because this driver disables endpoints in DBG(DBG_ERR, "ep_disable: %s not enabled\n", ep->ep.name);
* reset_all_endpoints() before calling disconnect(),
* most gadget drivers would trigger this non-error ...
*/
if (udc->gadget.speed != USB_SPEED_UNKNOWN)
DBG(DBG_ERR, "ep_disable: %s not enabled\n",
ep->ep.name);
return -EINVAL; return -EINVAL;
} }
ep->ep.desc = NULL; ep->ep.desc = NULL;
...@@ -871,7 +865,7 @@ static int usba_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req) ...@@ -871,7 +865,7 @@ static int usba_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req)
u32 status; u32 status;
DBG(DBG_GADGET | DBG_QUEUE, "ep_dequeue: %s, req %p\n", DBG(DBG_GADGET | DBG_QUEUE, "ep_dequeue: %s, req %p\n",
ep->ep.name, req); ep->ep.name, _req);
spin_lock_irqsave(&udc->lock, flags); spin_lock_irqsave(&udc->lock, flags);
......
...@@ -1980,9 +1980,12 @@ static int gr_ep_init(struct gr_udc *dev, int num, int is_in, u32 maxplimit) ...@@ -1980,9 +1980,12 @@ static int gr_ep_init(struct gr_udc *dev, int num, int is_in, u32 maxplimit)
if (num == 0) { if (num == 0) {
_req = gr_alloc_request(&ep->ep, GFP_ATOMIC); _req = gr_alloc_request(&ep->ep, GFP_ATOMIC);
if (!_req)
return -ENOMEM;
buf = devm_kzalloc(dev->dev, PAGE_SIZE, GFP_DMA | GFP_ATOMIC); buf = devm_kzalloc(dev->dev, PAGE_SIZE, GFP_DMA | GFP_ATOMIC);
if (!_req || !buf) { if (!buf) {
/* possible _req freed by gr_probe via gr_remove */ gr_free_request(&ep->ep, _req);
return -ENOMEM; return -ENOMEM;
} }
......
...@@ -68,7 +68,7 @@ EXPORT_SYMBOL_GPL(usb_gadget_get_string); ...@@ -68,7 +68,7 @@ EXPORT_SYMBOL_GPL(usb_gadget_get_string);
/** /**
* usb_validate_langid - validate usb language identifiers * usb_validate_langid - validate usb language identifiers
* @lang: usb language identifier * @langid: usb language identifier
* *
* Returns true for valid language identifier, otherwise false. * Returns true for valid language identifier, otherwise false.
*/ */
......
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