Commit c46ac50e authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull USB fixes from Greg KH:
 "Here are some small USB fixes for 6.8-rc6 to resolve some reported
  problems. These include:

   - regression fixes with typec tpcm code as reported by many

   - cdnsp and cdns3 driver fixes

   - usb role setting code bugfixes

   - build fix for uhci driver

   - ncm gadget driver bugfix

   - MAINTAINERS entry update

  All of these have been in linux-next all week with no reported issues
  and there is at least one fix in here that is in Thorsten's regression
  list that is being tracked"

* tag 'usb-6.8-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb:
  usb: typec: tpcm: Fix issues with power being removed during reset
  MAINTAINERS: Drop myself as maintainer of TYPEC port controller drivers
  usb: gadget: ncm: Avoid dropping datagrams of properly parsed NTBs
  Revert "usb: typec: tcpm: reset counter when enter into unattached state after try role"
  usb: gadget: omap_udc: fix USB gadget regression on Palm TE
  usb: dwc3: gadget: Don't disconnect if not started
  usb: cdns3: fix memory double free when handle zero packet
  usb: cdns3: fixed memory use after free at cdns3_gadget_ep_disable()
  usb: roles: don't get/set_role() when usb_role_switch is unregistered
  usb: roles: fix NULL pointer issue when put module's reference
  usb: cdnsp: fixed issue with incorrect detecting CDNSP family controllers
  usb: cdnsp: blocked some cdns3 specific code
  usb: uhci-grlib: Explicitly include linux/platform_device.h
parents 1e592e95 69f89168
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -22880,9 +22880,8 @@ S: Maintained
F:	drivers/usb/typec/mux/pi3usb30532.c
USB TYPEC PORT CONTROLLER DRIVERS
M:	Guenter Roeck <linux@roeck-us.net>
L:	linux-usb@vger.kernel.org
S:	Maintained
S:	Orphan
F:	drivers/usb/typec/tcpm/
USB UHCI DRIVER
+6 −2
Original line number Diff line number Diff line
@@ -828,7 +828,11 @@ void cdns3_gadget_giveback(struct cdns3_endpoint *priv_ep,
			return;
	}

	if (request->complete) {
	/*
	 * zlp request is appended by driver, needn't call usb_gadget_giveback_request() to notify
	 * gadget composite driver.
	 */
	if (request->complete && request->buf != priv_dev->zlp_buf) {
		spin_unlock(&priv_dev->lock);
		usb_gadget_giveback_request(&priv_ep->endpoint,
					    request);
@@ -2540,11 +2544,11 @@ static int cdns3_gadget_ep_disable(struct usb_ep *ep)

	while (!list_empty(&priv_ep->wa2_descmiss_req_list)) {
		priv_req = cdns3_next_priv_request(&priv_ep->wa2_descmiss_req_list);
		list_del_init(&priv_req->list);

		kfree(priv_req->request.buf);
		cdns3_gadget_ep_free_request(&priv_ep->endpoint,
					     &priv_req->request);
		list_del_init(&priv_req->list);
		--priv_ep->wa2_counter;
	}

+0 −1
Original line number Diff line number Diff line
@@ -395,7 +395,6 @@ static int cdns_role_set(struct usb_role_switch *sw, enum usb_role role)
	return ret;
}


/**
 * cdns_wakeup_irq - interrupt handler for wakeup events
 * @irq: irq number for cdns3/cdnsp core device
+9 −4
Original line number Diff line number Diff line
@@ -156,6 +156,7 @@ bool cdns_is_device(struct cdns *cdns)
 */
static void cdns_otg_disable_irq(struct cdns *cdns)
{
	if (cdns->version)
		writel(0, &cdns->otg_irq_regs->ien);
}

@@ -422,15 +423,20 @@ int cdns_drd_init(struct cdns *cdns)

		cdns->otg_regs = (void __iomem *)&cdns->otg_v1_regs->cmd;

		if (readl(&cdns->otg_cdnsp_regs->did) == OTG_CDNSP_DID) {
		state = readl(&cdns->otg_cdnsp_regs->did);

		if (OTG_CDNSP_CHECK_DID(state)) {
			cdns->otg_irq_regs = (struct cdns_otg_irq_regs __iomem *)
					      &cdns->otg_cdnsp_regs->ien;
			cdns->version  = CDNSP_CONTROLLER_V2;
		} else {
		} else if (OTG_CDNS3_CHECK_DID(state)) {
			cdns->otg_irq_regs = (struct cdns_otg_irq_regs __iomem *)
					      &cdns->otg_v1_regs->ien;
			writel(1, &cdns->otg_v1_regs->simulate);
			cdns->version  = CDNS3_CONTROLLER_V1;
		} else {
			dev_err(cdns->dev, "not supporte DID=0x%08x\n", state);
			return -EINVAL;
		}

		dev_dbg(cdns->dev, "DRD version v1 (ID: %08x, rev: %08x)\n",
@@ -483,7 +489,6 @@ int cdns_drd_exit(struct cdns *cdns)
	return 0;
}


/* Indicate the cdns3 core was power lost before */
bool cdns_power_is_lost(struct cdns *cdns)
{
+5 −1
Original line number Diff line number Diff line
@@ -79,7 +79,11 @@ struct cdnsp_otg_regs {
	__le32 susp_timing_ctrl;
};

#define OTG_CDNSP_DID	0x0004034E
/* CDNSP driver supports 0x000403xx Cadence USB controller family. */
#define OTG_CDNSP_CHECK_DID(did) (((did) & GENMASK(31, 8)) == 0x00040300)

/* CDNS3 driver supports 0x000402xx Cadence USB controller family. */
#define OTG_CDNS3_CHECK_DID(did) (((did) & GENMASK(31, 8)) == 0x00040200)

/*
 * Common registers interface for both CDNS3 and CDNSP version of DRD.
Loading