Here are some small USB driver fixes for 5.11-rc5.  They resolve:
 	- xhci issues for some reported problems
 	- ehci driver issue for one specific device
 	- USB gadget fixes for some reported problems
 	- cdns3 driver fixes for issues reported
 	- MAINTAINERS file update
 	- thunderbolt minor fix
 
 All of these have been in linux-next with no reported issues.
 
 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
 -----BEGIN PGP SIGNATURE-----
 
 iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCYA1uOw8cZ3JlZ0Brcm9h
 aC5jb20ACgkQMUfUDdst+ymsywCcCyyPu1chkE2nSBFmcB5zXn2obSoAoL8zTIVM
 zVlQEjG/9IzSGdQY/Dt5
 =VVM1
 -----END PGP SIGNATURE-----

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

Pull USB fixes from Greg KH:
 "Here are some small USB driver fixes for 5.11-rc5.  They resolve:

   - xhci issues for some reported problems

   - ehci driver issue for one specific device

   - USB gadget fixes for some reported problems

   - cdns3 driver fixes for issues reported

   - MAINTAINERS file update

   - thunderbolt minor fix

  All of these have been in linux-next with no reported issues"

* tag 'usb-5.11-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb:
  usb: bdc: Make bdc pci driver depend on BROKEN
  xhci: tegra: Delay for disabling LFPS detector
  xhci: make sure TRB is fully written before giving it to the controller
  usb: udc: core: Use lock when write to soft_connect
  USB: gadget: dummy-hcd: Fix errors in port-reset handling
  usb: gadget: aspeed: fix stop dma register setting.
  USB: ehci: fix an interrupt calltrace error
  ehci: fix EHCI host controller initialization sequence
  MAINTAINERS: update Peter Chen's email address
  thunderbolt: Drop duplicated 0x prefix from format string
  MAINTAINERS: Update address for Cadence USB3 driver
  usb: cdns3: imx: improve driver .remove API
  usb: cdns3: imx: fix can't create core device the second time issue
  usb: cdns3: imx: fix writing read-only memory issue
This commit is contained in:
Linus Torvalds 2021-01-24 10:54:54 -08:00
Родитель e68061375f ef02684c4e
Коммит 8f3bfd2181
11 изменённых файлов: 61 добавлений и 23 удалений

Просмотреть файл

@ -3879,7 +3879,7 @@ F: Documentation/devicetree/bindings/mtd/cadence-nand-controller.txt
F: drivers/mtd/nand/raw/cadence-nand-controller.c F: drivers/mtd/nand/raw/cadence-nand-controller.c
CADENCE USB3 DRD IP DRIVER CADENCE USB3 DRD IP DRIVER
M: Peter Chen <peter.chen@nxp.com> M: Peter Chen <peter.chen@kernel.org>
M: Pawel Laszczak <pawell@cadence.com> M: Pawel Laszczak <pawell@cadence.com>
R: Roger Quadros <rogerq@kernel.org> R: Roger Quadros <rogerq@kernel.org>
R: Aswath Govindraju <a-govindraju@ti.com> R: Aswath Govindraju <a-govindraju@ti.com>
@ -4161,7 +4161,7 @@ S: Maintained
F: Documentation/translations/zh_CN/ F: Documentation/translations/zh_CN/
CHIPIDEA USB HIGH SPEED DUAL ROLE CONTROLLER CHIPIDEA USB HIGH SPEED DUAL ROLE CONTROLLER
M: Peter Chen <Peter.Chen@nxp.com> M: Peter Chen <peter.chen@kernel.org>
L: linux-usb@vger.kernel.org L: linux-usb@vger.kernel.org
S: Maintained S: Maintained
T: git git://git.kernel.org/pub/scm/linux/kernel/git/peter.chen/usb.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/peter.chen/usb.git
@ -18420,7 +18420,7 @@ F: Documentation/usb/ohci.rst
F: drivers/usb/host/ohci* F: drivers/usb/host/ohci*
USB OTG FSM (Finite State Machine) USB OTG FSM (Finite State Machine)
M: Peter Chen <Peter.Chen@nxp.com> M: Peter Chen <peter.chen@kernel.org>
L: linux-usb@vger.kernel.org L: linux-usb@vger.kernel.org
S: Maintained S: Maintained
T: git git://git.kernel.org/pub/scm/linux/kernel/git/peter.chen/usb.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/peter.chen/usb.git

Просмотреть файл

@ -2316,7 +2316,7 @@ static int icm_usb4_switch_nvm_authenticate_status(struct tb_switch *sw,
if (auth && auth->reply.route_hi == sw->config.route_hi && if (auth && auth->reply.route_hi == sw->config.route_hi &&
auth->reply.route_lo == sw->config.route_lo) { auth->reply.route_lo == sw->config.route_lo) {
tb_dbg(tb, "NVM_AUTH found for %llx flags 0x%#x status %#x\n", tb_dbg(tb, "NVM_AUTH found for %llx flags %#x status %#x\n",
tb_route(sw), auth->reply.hdr.flags, auth->reply.status); tb_route(sw), auth->reply.hdr.flags, auth->reply.status);
if (auth->reply.hdr.flags & ICM_FLAGS_ERROR) if (auth->reply.hdr.flags & ICM_FLAGS_ERROR)
ret = -EIO; ret = -EIO;

Просмотреть файл

@ -185,7 +185,11 @@ static int cdns_imx_probe(struct platform_device *pdev)
} }
data->num_clks = ARRAY_SIZE(imx_cdns3_core_clks); data->num_clks = ARRAY_SIZE(imx_cdns3_core_clks);
data->clks = (struct clk_bulk_data *)imx_cdns3_core_clks; data->clks = devm_kmemdup(dev, imx_cdns3_core_clks,
sizeof(imx_cdns3_core_clks), GFP_KERNEL);
if (!data->clks)
return -ENOMEM;
ret = devm_clk_bulk_get(dev, data->num_clks, data->clks); ret = devm_clk_bulk_get(dev, data->num_clks, data->clks);
if (ret) if (ret)
return ret; return ret;
@ -214,20 +218,16 @@ err:
return ret; return ret;
} }
static int cdns_imx_remove_core(struct device *dev, void *data)
{
struct platform_device *pdev = to_platform_device(dev);
platform_device_unregister(pdev);
return 0;
}
static int cdns_imx_remove(struct platform_device *pdev) static int cdns_imx_remove(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct cdns_imx *data = dev_get_drvdata(dev);
device_for_each_child(dev, NULL, cdns_imx_remove_core); pm_runtime_get_sync(dev);
of_platform_depopulate(dev);
clk_bulk_disable_unprepare(data->num_clks, data->clks);
pm_runtime_disable(dev);
pm_runtime_put_noidle(dev);
platform_set_drvdata(pdev, NULL); platform_set_drvdata(pdev, NULL);
return 0; return 0;

Просмотреть файл

@ -420,7 +420,10 @@ static void ast_vhub_stop_active_req(struct ast_vhub_ep *ep,
u32 state, reg, loops; u32 state, reg, loops;
/* Stop DMA activity */ /* Stop DMA activity */
writel(0, ep->epn.regs + AST_VHUB_EP_DMA_CTLSTAT); if (ep->epn.desc_mode)
writel(VHUB_EP_DMA_CTRL_RESET, ep->epn.regs + AST_VHUB_EP_DMA_CTLSTAT);
else
writel(0, ep->epn.regs + AST_VHUB_EP_DMA_CTLSTAT);
/* Wait for it to complete */ /* Wait for it to complete */
for (loops = 0; loops < 1000; loops++) { for (loops = 0; loops < 1000; loops++) {

Просмотреть файл

@ -17,7 +17,7 @@ if USB_BDC_UDC
comment "Platform Support" comment "Platform Support"
config USB_BDC_PCI config USB_BDC_PCI
tristate "BDC support for PCIe based platforms" tristate "BDC support for PCIe based platforms"
depends on USB_PCI depends on USB_PCI && BROKEN
default USB_BDC_UDC default USB_BDC_UDC
help help
Enable support for platforms which have BDC connected through PCIe, such as Lego3 FPGA platform. Enable support for platforms which have BDC connected through PCIe, such as Lego3 FPGA platform.

Просмотреть файл

@ -1529,10 +1529,13 @@ static ssize_t soft_connect_store(struct device *dev,
struct device_attribute *attr, const char *buf, size_t n) struct device_attribute *attr, const char *buf, size_t n)
{ {
struct usb_udc *udc = container_of(dev, struct usb_udc, dev); struct usb_udc *udc = container_of(dev, struct usb_udc, dev);
ssize_t ret;
mutex_lock(&udc_lock);
if (!udc->driver) { if (!udc->driver) {
dev_err(dev, "soft-connect without a gadget driver\n"); dev_err(dev, "soft-connect without a gadget driver\n");
return -EOPNOTSUPP; ret = -EOPNOTSUPP;
goto out;
} }
if (sysfs_streq(buf, "connect")) { if (sysfs_streq(buf, "connect")) {
@ -1543,10 +1546,14 @@ static ssize_t soft_connect_store(struct device *dev,
usb_gadget_udc_stop(udc); usb_gadget_udc_stop(udc);
} else { } else {
dev_err(dev, "unsupported command '%s'\n", buf); dev_err(dev, "unsupported command '%s'\n", buf);
return -EINVAL; ret = -EINVAL;
goto out;
} }
return n; ret = n;
out:
mutex_unlock(&udc_lock);
return ret;
} }
static DEVICE_ATTR_WO(soft_connect); static DEVICE_ATTR_WO(soft_connect);

Просмотреть файл

@ -2270,17 +2270,20 @@ static int dummy_hub_control(
} }
fallthrough; fallthrough;
case USB_PORT_FEAT_RESET: case USB_PORT_FEAT_RESET:
if (!(dum_hcd->port_status & USB_PORT_STAT_CONNECTION))
break;
/* if it's already enabled, disable */ /* if it's already enabled, disable */
if (hcd->speed == HCD_USB3) { if (hcd->speed == HCD_USB3) {
dum_hcd->port_status = 0;
dum_hcd->port_status = dum_hcd->port_status =
(USB_SS_PORT_STAT_POWER | (USB_SS_PORT_STAT_POWER |
USB_PORT_STAT_CONNECTION | USB_PORT_STAT_CONNECTION |
USB_PORT_STAT_RESET); USB_PORT_STAT_RESET);
} else } else {
dum_hcd->port_status &= ~(USB_PORT_STAT_ENABLE dum_hcd->port_status &= ~(USB_PORT_STAT_ENABLE
| USB_PORT_STAT_LOW_SPEED | USB_PORT_STAT_LOW_SPEED
| USB_PORT_STAT_HIGH_SPEED); | USB_PORT_STAT_HIGH_SPEED);
dum_hcd->port_status |= USB_PORT_STAT_RESET;
}
/* /*
* We want to reset device status. All but the * We want to reset device status. All but the
* Self powered feature * Self powered feature
@ -2292,7 +2295,8 @@ static int dummy_hub_control(
* interval? Is it still 50msec as for HS? * interval? Is it still 50msec as for HS?
*/ */
dum_hcd->re_timeout = jiffies + msecs_to_jiffies(50); dum_hcd->re_timeout = jiffies + msecs_to_jiffies(50);
fallthrough; set_link_state(dum_hcd);
break;
case USB_PORT_FEAT_C_CONNECTION: case USB_PORT_FEAT_C_CONNECTION:
case USB_PORT_FEAT_C_RESET: case USB_PORT_FEAT_C_RESET:
case USB_PORT_FEAT_C_ENABLE: case USB_PORT_FEAT_C_ENABLE:

Просмотреть файл

@ -574,6 +574,7 @@ static int ehci_run (struct usb_hcd *hcd)
struct ehci_hcd *ehci = hcd_to_ehci (hcd); struct ehci_hcd *ehci = hcd_to_ehci (hcd);
u32 temp; u32 temp;
u32 hcc_params; u32 hcc_params;
int rc;
hcd->uses_new_polling = 1; hcd->uses_new_polling = 1;
@ -629,9 +630,20 @@ static int ehci_run (struct usb_hcd *hcd)
down_write(&ehci_cf_port_reset_rwsem); down_write(&ehci_cf_port_reset_rwsem);
ehci->rh_state = EHCI_RH_RUNNING; ehci->rh_state = EHCI_RH_RUNNING;
ehci_writel(ehci, FLAG_CF, &ehci->regs->configured_flag); ehci_writel(ehci, FLAG_CF, &ehci->regs->configured_flag);
/* Wait until HC become operational */
ehci_readl(ehci, &ehci->regs->command); /* unblock posted writes */ ehci_readl(ehci, &ehci->regs->command); /* unblock posted writes */
msleep(5); msleep(5);
rc = ehci_handshake(ehci, &ehci->regs->status, STS_HALT, 0, 100 * 1000);
up_write(&ehci_cf_port_reset_rwsem); up_write(&ehci_cf_port_reset_rwsem);
if (rc) {
ehci_err(ehci, "USB %x.%x, controller refused to start: %d\n",
((ehci->sbrn & 0xf0)>>4), (ehci->sbrn & 0x0f), rc);
return rc;
}
ehci->last_periodic_enable = ktime_get_real(); ehci->last_periodic_enable = ktime_get_real();
temp = HC_VERSION(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); temp = HC_VERSION(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase));

Просмотреть файл

@ -345,6 +345,9 @@ static int ehci_bus_suspend (struct usb_hcd *hcd)
unlink_empty_async_suspended(ehci); unlink_empty_async_suspended(ehci);
/* Some Synopsys controllers mistakenly leave IAA turned on */
ehci_writel(ehci, STS_IAA, &ehci->regs->status);
/* Any IAA cycle that started before the suspend is now invalid */ /* Any IAA cycle that started before the suspend is now invalid */
end_iaa_cycle(ehci); end_iaa_cycle(ehci);
ehci_handle_start_intr_unlinks(ehci); ehci_handle_start_intr_unlinks(ehci);

Просмотреть файл

@ -2931,6 +2931,8 @@ static void queue_trb(struct xhci_hcd *xhci, struct xhci_ring *ring,
trb->field[0] = cpu_to_le32(field1); trb->field[0] = cpu_to_le32(field1);
trb->field[1] = cpu_to_le32(field2); trb->field[1] = cpu_to_le32(field2);
trb->field[2] = cpu_to_le32(field3); trb->field[2] = cpu_to_le32(field3);
/* make sure TRB is fully written before giving it to the controller */
wmb();
trb->field[3] = cpu_to_le32(field4); trb->field[3] = cpu_to_le32(field4);
trace_xhci_queue_trb(ring, trb); trace_xhci_queue_trb(ring, trb);

Просмотреть файл

@ -623,6 +623,13 @@ static void tegra_xusb_mbox_handle(struct tegra_xusb *tegra,
enable); enable);
if (err < 0) if (err < 0)
break; break;
/*
* wait 500us for LFPS detector to be disabled before
* sending ACK
*/
if (!enable)
usleep_range(500, 1000);
} }
if (err < 0) { if (err < 0) {