Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1209167 > unrolled thread

[PATCH 4/5] usb: xhci: stop everything on the first call to xhci_stop

Started byRoger Quadros <rogerq@ti.com>
First post2015-08-18 12:40 +0200
Last post2015-08-20 08:50 +0200
Articles 3 — 2 participants

Back to article view | Back to linux.kernel

This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by below is the oldest one visible, not the original post.


Contents

  [PATCH 4/5] usb: xhci: stop everything on the first call to xhci_stop Roger Quadros <rogerq@ti.com> - 2015-08-18 12:40 +0200
    Re: [PATCH 4/5] usb: xhci: stop everything on the first call to xhci_stop Mathias Nyman <mathias.nyman@intel.com> - 2015-08-18 14:20 +0200
      Re: [PATCH 4/5] usb: xhci: stop everything on the first call to xhci_stop Roger Quadros <rogerq@ti.com> - 2015-08-20 08:50 +0200

#1209167 — [PATCH 4/5] usb: xhci: stop everything on the first call to xhci_stop

FromRoger Quadros <rogerq@ti.com>
Date2015-08-18 12:40 +0200
Subject[PATCH 4/5] usb: xhci: stop everything on the first call to xhci_stop
Message-ID<pYMtc-3yQ-7@gated-at.bofh.it>
xhci_stop will be called twice, once for the shared hcd
and again for the primary hcd.

We stop the XHCI controller in any case so clean up
everything on the first call else we can timeout
waiting for pending requests to complete.

Signed-off-by: Roger Quadros <rogerq@ti.com>
---
 drivers/usb/host/xhci.c | 20 +++++---------------
 1 file changed, 5 insertions(+), 15 deletions(-)

diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index d5f44b1..9a7f12c 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -655,15 +655,6 @@ int xhci_run(struct usb_hcd *hcd)
 }
 EXPORT_SYMBOL_GPL(xhci_run);
 
-static void xhci_only_stop_hcd(struct usb_hcd *hcd)
-{
-	struct xhci_hcd *xhci = hcd_to_xhci(hcd);
-
-	spin_lock_irq(&xhci->lock);
-	xhci_halt(xhci);
-	spin_unlock_irq(&xhci->lock);
-}
-
 /*
  * Stop xHCI driver.
  *
@@ -678,15 +669,14 @@ void xhci_stop(struct usb_hcd *hcd)
 	u32 temp;
 	struct xhci_hcd *xhci = hcd_to_xhci(hcd);
 
-	mutex_lock(&xhci->mutex);
-
-	if (!usb_hcd_is_primary_hcd(hcd)) {
-		xhci_only_stop_hcd(xhci->shared_hcd);
-		mutex_unlock(&xhci->mutex);
+	if (xhci->xhc_state & XHCI_STATE_HALTED)
 		return;
-	}
 
+	mutex_lock(&xhci->mutex);
 	spin_lock_irq(&xhci->lock);
+	xhci->xhc_state |= XHCI_STATE_HALTED;
+	xhci->cmd_ring_state = CMD_RING_STATE_STOPPED;
+
 	/* Make sure the xHC is halted for a USB3 roothub
 	 * (xhci_stop() could be called as part of failed init).
 	 */
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [next] | [standalone]


#1209229

FromMathias Nyman <mathias.nyman@intel.com>
Date2015-08-18 14:20 +0200
Message-ID<pYO1Y-5Tm-31@gated-at.bofh.it>
In reply to#1209167
On 18.08.2015 13:39, Roger Quadros wrote:
> xhci_stop will be called twice, once for the shared hcd
> and again for the primary hcd.
>
> We stop the XHCI controller in any case so clean up
> everything on the first call else we can timeout
> waiting for pending requests to complete.
>
> Signed-off-by: Roger Quadros <rogerq@ti.com>
> ---
>   drivers/usb/host/xhci.c | 20 +++++---------------
>   1 file changed, 5 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
> index d5f44b1..9a7f12c 100644
> --- a/drivers/usb/host/xhci.c
> +++ b/drivers/usb/host/xhci.c
> @@ -655,15 +655,6 @@ int xhci_run(struct usb_hcd *hcd)
>   }
>   EXPORT_SYMBOL_GPL(xhci_run);
>
> -static void xhci_only_stop_hcd(struct usb_hcd *hcd)
> -{
> -	struct xhci_hcd *xhci = hcd_to_xhci(hcd);
> -
> -	spin_lock_irq(&xhci->lock);
> -	xhci_halt(xhci);
> -	spin_unlock_irq(&xhci->lock);
> -}
> -
>   /*
>    * Stop xHCI driver.
>    *
> @@ -678,15 +669,14 @@ void xhci_stop(struct usb_hcd *hcd)
>   	u32 temp;
>   	struct xhci_hcd *xhci = hcd_to_xhci(hcd);
>
> -	mutex_lock(&xhci->mutex);
> -
> -	if (!usb_hcd_is_primary_hcd(hcd)) {
> -		xhci_only_stop_hcd(xhci->shared_hcd);
> -		mutex_unlock(&xhci->mutex);
> +	if (xhci->xhc_state & XHCI_STATE_HALTED)
>   		return;
> -	}
>
> +	mutex_lock(&xhci->mutex);
>   	spin_lock_irq(&xhci->lock);
> +	xhci->xhc_state |= XHCI_STATE_HALTED;
> +	xhci->cmd_ring_state = CMD_RING_STATE_STOPPED;
> +

The XHCI_STATE_HALTED and CMD_RING_STATE_STOPPED states will be set in xhci_halt() right
after this.
Well, or,  it actually sets them after waiting for the controller to really halt.

I guess setting them here helps the second call to hcd_stop() to return early, not taking the mutex and
trying to stop controller once again.

Applied
-Mathias
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1210195

FromRoger Quadros <rogerq@ti.com>
Date2015-08-20 08:50 +0200
Message-ID<pZrPI-5tD-15@gated-at.bofh.it>
In reply to#1209229

On 18/08/15 15:14, Mathias Nyman wrote:
> On 18.08.2015 13:39, Roger Quadros wrote:
>> xhci_stop will be called twice, once for the shared hcd
>> and again for the primary hcd.
>>
>> We stop the XHCI controller in any case so clean up
>> everything on the first call else we can timeout
>> waiting for pending requests to complete.
>>
>> Signed-off-by: Roger Quadros <rogerq@ti.com>
>> ---
>>   drivers/usb/host/xhci.c | 20 +++++---------------
>>   1 file changed, 5 insertions(+), 15 deletions(-)
>>
>> diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
>> index d5f44b1..9a7f12c 100644
>> --- a/drivers/usb/host/xhci.c
>> +++ b/drivers/usb/host/xhci.c
>> @@ -655,15 +655,6 @@ int xhci_run(struct usb_hcd *hcd)
>>   }
>>   EXPORT_SYMBOL_GPL(xhci_run);
>>
>> -static void xhci_only_stop_hcd(struct usb_hcd *hcd)
>> -{
>> -    struct xhci_hcd *xhci = hcd_to_xhci(hcd);
>> -
>> -    spin_lock_irq(&xhci->lock);
>> -    xhci_halt(xhci);
>> -    spin_unlock_irq(&xhci->lock);
>> -}
>> -
>>   /*
>>    * Stop xHCI driver.
>>    *
>> @@ -678,15 +669,14 @@ void xhci_stop(struct usb_hcd *hcd)
>>       u32 temp;
>>       struct xhci_hcd *xhci = hcd_to_xhci(hcd);
>>
>> -    mutex_lock(&xhci->mutex);
>> -
>> -    if (!usb_hcd_is_primary_hcd(hcd)) {
>> -        xhci_only_stop_hcd(xhci->shared_hcd);
>> -        mutex_unlock(&xhci->mutex);
>> +    if (xhci->xhc_state & XHCI_STATE_HALTED)
>>           return;
>> -    }
>>
>> +    mutex_lock(&xhci->mutex);
>>       spin_lock_irq(&xhci->lock);
>> +    xhci->xhc_state |= XHCI_STATE_HALTED;
>> +    xhci->cmd_ring_state = CMD_RING_STATE_STOPPED;
>> +
> 
> The XHCI_STATE_HALTED and CMD_RING_STATE_STOPPED states will be set in xhci_halt() right
> after this.
> Well, or,  it actually sets them after waiting for the controller to really halt.
> 
> I guess setting them here helps the second call to hcd_stop() to return early, not taking the mutex and
> trying to stop controller once again.

Yes, that was my intention :)

cheers,
-roger
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web