Re: [PATCH v2 2/2] usb: xhci: add Broadcom specific fake doorbell

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

On 12/07/2015 11:39 PM, Felipe Balbi wrote:
> 
> Hi,
> 
> Hauke Mehrtens <hauke@xxxxxxxxxx> writes:
>> From: Rafał Miłecki <zajec5@xxxxxxxxx>
>> 
>> This fixes problem with controller seeing devices only in some
>> small percentage of cold boots. This quirk is also added to the
>> platform data so we can activate it when we register our platform
>> driver.
> 
> it would've been nicer if you could add an erratum ID number for
> future reference together with a more verbose discussion of the
> problem. You're not describing what the problem is and that's
> important.

I do not have access to the documentation for this SOC, I hope the
people from Broadcom with access to such documentation can help out here
.

>> Signed-off-by: Rafał Miłecki <zajec5@xxxxxxxxx> Signed-off-by:
>> Hauke Mehrtens <hauke@xxxxxxxxxx> --- 
>> drivers/usb/host/xhci-plat.c     |  3 +++ drivers/usb/host/xhci.c
>> | 57 +++++++++++++++++++++++++++++++++++++--- 
>> drivers/usb/host/xhci.h          |  1 + 
>> include/linux/usb/xhci_pdriver.h |  1 + 4 files changed, 59
>> insertions(+), 3 deletions(-)
>> 
>> diff --git a/drivers/usb/host/xhci-plat.c
>> b/drivers/usb/host/xhci-plat.c index 4fb295b..7cd274b 100644 ---
>> a/drivers/usb/host/xhci-plat.c +++
>> b/drivers/usb/host/xhci-plat.c @@ -53,6 +53,9 @@ static void
>> xhci_plat_quirks(struct device *dev, struct xhci_hcd *xhci) if
>> ((node && of_property_read_bool(node, "usb3-lpm-capable")) || 
>> (pdata && pdata->usb3_lpm_capable)) xhci->quirks |=
>> XHCI_LPM_SUPPORT; + +	if (pdata && pdata->usb3_fake_doorbell) +
>> xhci->quirks |= XHCI_FAKE_DOORBELL;
> 
> whenever you add something via pdata, you _must_ make a similar DT
> change.

Ok, will do so.

>> diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c 
>> index 643d312..d49be9b 100644 --- a/drivers/usb/host/xhci.c +++
>> b/drivers/usb/host/xhci.c @@ -122,6 +122,39 @@ int
>> xhci_halt(struct xhci_hcd *xhci) return ret; }
>> 
>> +static int xhci_fake_doorbell(struct xhci_hcd *xhci, int
>> slot_id) +{ +	u32 temp; + +	/* alloc a virt device for slot */ +
>> if (!xhci_alloc_virt_device(xhci, slot_id, NULL, GFP_NOIO)) { +
>> xhci_warn(xhci, "Could not allocate xHCI USB device data
>> structures\n"); +		return -ENOMEM; +	} + +	/* ring fake doorbell
>> for slot_id ep 0 */ +	xhci_ring_ep_doorbell(xhci, slot_id, 0,
>> 0); +	usleep_range(1000, 1500); + +	/* read the status register
>> to check if HSE is set or not? */ +	temp =
>> readl(&xhci->op_regs->status); + +	/* clear HSE if set */ +	if
>> (temp & STS_FATAL) { +		xhci_dbg(xhci, "HSE problem detected,
>> status: 0x%x\n", temp); +		temp &= ~(0x1fff); +		temp |=
>> STS_FATAL; +		writel(temp, &xhci->op_regs->status); +
>> usleep_range(1000, 1500); +		readl(&xhci->op_regs->status); +	} 
>> + +	/* Free virt device */ +	xhci_free_virt_device(xhci,
>> slot_id); + +	return 0; +} + /* * Set the run bit and wait for
>> the host to be running. */ @@ -568,10 +601,25 @@ int
>> xhci_init(struct usb_hcd *hcd)
>> 
>> static int xhci_run_finished(struct xhci_hcd *xhci) { -	if
>> (xhci_start(xhci)) { -		xhci_halt(xhci); -		return -ENODEV; +	int
>> err; + +	err = xhci_start(xhci); +	if (err) { +		err = -ENODEV; +
>> goto out_err; +	}
> 
> add a blank line here

Ok, will do so.

>> +	if (xhci->quirks & XHCI_FAKE_DOORBELL) { +		err =
>> xhci_fake_doorbell(xhci, 1); +		if (err) +			goto out_err; + +
>> err = xhci_start(xhci); +		if (err) { +			err = -ENODEV; +			goto
>> out_err; +		} } + xhci->shared_hcd->state = HC_STATE_RUNNING; 
>> xhci->cmd_ring_state = CMD_RING_STATE_RUNNING;
>> 
>> @@ -581,6 +629,9 @@ static int xhci_run_finished(struct xhci_hcd
>> *xhci) xhci_dbg_trace(xhci, trace_xhci_dbg_init, "Finished
>> xhci_run for USB3 roothub"); return 0;
> 
> and another one here.

Ok, will do so.

>> +out_err: +	xhci_halt(xhci); +	return err; }
>> 
>> /* diff --git a/drivers/usb/host/xhci.h
>> b/drivers/usb/host/xhci.h index 9be7348..8c1faf4 100644 ---
>> a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h @@
>> -1631,6 +1631,7 @@ struct xhci_hcd { #define XHCI_BROKEN_STREAMS
>> (1 << 19) #define XHCI_PME_STUCK_QUIRK	(1 << 20) #define
>> XHCI_MTK_HOST		(1 << 21) +#define XHCI_FAKE_DOORBELL	(1 << 22) 
>> unsigned int		num_active_eps; unsigned int		limit_active_eps; /*
>> There are two roothubs to keep track of bus suspend info for */ 
>> diff --git a/include/linux/usb/xhci_pdriver.h
>> b/include/linux/usb/xhci_pdriver.h index 376654b..2b4ea5b 100644 
>> --- a/include/linux/usb/xhci_pdriver.h +++
>> b/include/linux/usb/xhci_pdriver.h @@ -22,6 +22,7 @@ */ struct
>> usb_xhci_pdata { unsigned	usb3_lpm_capable:1; +	unsigned
>> usb3_fake_doorbell:1;
> 
> missing kernel doc for this new quirk.
> 

Ok, will do so.

Hauke

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2

iQIcBAEBCAAGBQJWZg0rAAoJEIZ0px9YPRMyRykP/RLCkzx91ebb3gqRMW3Tz+By
HYZ17wZZY8BOz54lQY+VrZy6jjscpLU4XUrQmu4lJE6sGxJg6022g8r5hWjFubzz
RtyDxPUio5TRajtIPAaHv88ZAl5GSjQ+NukrTtBCZ3Z84N/ZPmB6PUVdhAmKNQwN
3d/cv9SBRjvpmuFGHIT9x9oOzkDFpj+0KVAZa4Xcuku+WIqBF63LcwtGgElWQ7Hc
hEZZqeYNrpM1v8TBmtwNhV3oPB+YQuxcARjYumY/pi6qMoOSnVf9Y1i34Vw4vc2Y
o8FEQjjVP3eFiEGDpiVc8yV4/4j+wzj8z6dKd/pzHn7D+sSICFu7HsumJp/6WoNy
PHj1dBXYAu1mrMnE9RajN8d5SqzXD6cq4lKExuKB/EoaRF86qItL0IvIHlK/ZUQn
R1Wa7lEPzgSxKAhZP+cLKa6Bfj8OS0y8crjbyYJuK9j1xPd3YynFH+tSOJ8G1Vaf
plWI/tCjNT47L4Z1/CNBMPiIwJX6yMzu9O/Xv0iFmcSzIa5dhg5xeseBqmFzL63p
BZPfvCNq6VDd5TX41nDGICE9CWKGb9Wn8aQ9dgKbKKvcAkwQBNGQRQTMDmlQ3icg
G7w4+uZ2ZEOTUZkNyFHgFBqh6PCFojXssuC2aIDE89bMSrYQAZE82VGVbHAUI5oE
TgZd8HFc8hxCcdaopiDw
=SPyi
-----END PGP SIGNATURE-----
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux