Re: [PATCH v1 06/17] scsi :ufs: verify hba controller hce reg value

2015-10-26 Thread ygardi
> 2015-09-13 23:52 GMT+09:00 Yaniv Gardi :
>> Sometimes due to hw issues it takes some time to the
>> host controller register to update. In order to verify the register
>> has updated, a polling is done until its value is set.
>>
>> In addition the functions ufshcd_hba_stop() and
>> ufshcd_wait_for_register() was updated with an additional input
>> parameter, indicating the timeout between reads will
>> be done by sleeping or spinning the cpu.
>>
>> Signed-off-by: Raviv Shvili 
>> Signed-off-by: Yaniv Gardi 
>>
>> ---
>>  drivers/scsi/ufs/ufshcd.c | 54
>> ---
>>  drivers/scsi/ufs/ufshcd.h | 12 +++
>>  2 files changed, 35 insertions(+), 31 deletions(-)
>>
>> diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
>> index 6171da8..e5a876c 100644
>> --- a/drivers/scsi/ufs/ufshcd.c
>> +++ b/drivers/scsi/ufs/ufshcd.c
>> @@ -267,11 +267,12 @@ static inline void ufshcd_disable_irq(struct
>> ufs_hba *hba)
>>   * @val - wait condition
>>   * @interval_us - polling interval in microsecs
>>   * @timeout_ms - timeout in millisecs
>> - *
>> + * @can_sleep - perform sleep or just spin
>>   * Returns -ETIMEDOUT on error, zero on success
>>   */
>
> We usually put a blank line between @argument description and
> return value description.
>

will be fixed in v2.
thanks


--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v1 06/17] scsi :ufs: verify hba controller hce reg value

2015-10-21 Thread Akinobu Mita
2015-09-13 23:52 GMT+09:00 Yaniv Gardi :
> Sometimes due to hw issues it takes some time to the
> host controller register to update. In order to verify the register
> has updated, a polling is done until its value is set.
>
> In addition the functions ufshcd_hba_stop() and
> ufshcd_wait_for_register() was updated with an additional input
> parameter, indicating the timeout between reads will
> be done by sleeping or spinning the cpu.
>
> Signed-off-by: Raviv Shvili 
> Signed-off-by: Yaniv Gardi 
>
> ---
>  drivers/scsi/ufs/ufshcd.c | 54 
> ---
>  drivers/scsi/ufs/ufshcd.h | 12 +++
>  2 files changed, 35 insertions(+), 31 deletions(-)
>
> diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
> index 6171da8..e5a876c 100644
> --- a/drivers/scsi/ufs/ufshcd.c
> +++ b/drivers/scsi/ufs/ufshcd.c
> @@ -267,11 +267,12 @@ static inline void ufshcd_disable_irq(struct ufs_hba 
> *hba)
>   * @val - wait condition
>   * @interval_us - polling interval in microsecs
>   * @timeout_ms - timeout in millisecs
> - *
> + * @can_sleep - perform sleep or just spin
>   * Returns -ETIMEDOUT on error, zero on success
>   */

We usually put a blank line between @argument description and
return value description.
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v1 06/17] scsi :ufs: verify hba controller hce reg value

2015-09-13 Thread Yaniv Gardi
Sometimes due to hw issues it takes some time to the
host controller register to update. In order to verify the register
has updated, a polling is done until its value is set.

In addition the functions ufshcd_hba_stop() and
ufshcd_wait_for_register() was updated with an additional input
parameter, indicating the timeout between reads will
be done by sleeping or spinning the cpu.

Signed-off-by: Raviv Shvili 
Signed-off-by: Yaniv Gardi 

---
 drivers/scsi/ufs/ufshcd.c | 54 ---
 drivers/scsi/ufs/ufshcd.h | 12 +++
 2 files changed, 35 insertions(+), 31 deletions(-)

diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 6171da8..e5a876c 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -267,11 +267,12 @@ static inline void ufshcd_disable_irq(struct ufs_hba *hba)
  * @val - wait condition
  * @interval_us - polling interval in microsecs
  * @timeout_ms - timeout in millisecs
- *
+ * @can_sleep - perform sleep or just spin
  * Returns -ETIMEDOUT on error, zero on success
  */
-static int ufshcd_wait_for_register(struct ufs_hba *hba, u32 reg, u32 mask,
-   u32 val, unsigned long interval_us, unsigned long timeout_ms)
+int ufshcd_wait_for_register(struct ufs_hba *hba, u32 reg, u32 mask,
+   u32 val, unsigned long interval_us,
+   unsigned long timeout_ms, bool can_sleep)
 {
int err = 0;
unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms);
@@ -280,9 +281,10 @@ static int ufshcd_wait_for_register(struct ufs_hba *hba, 
u32 reg, u32 mask,
val = val & mask;
 
while ((ufshcd_readl(hba, reg) & mask) != val) {
-   /* wakeup within 50us of expiry */
-   usleep_range(interval_us, interval_us + 50);
-
+   if (can_sleep)
+   usleep_range(interval_us, interval_us + 50);
+   else
+   udelay(interval_us);
if (time_after(jiffies, timeout)) {
if ((ufshcd_readl(hba, reg) & mask) != val)
err = -ETIMEDOUT;
@@ -1491,7 +1493,7 @@ ufshcd_clear_cmd(struct ufs_hba *hba, int tag)
 */
err = ufshcd_wait_for_register(hba,
REG_UTP_TRANSFER_REQ_DOOR_BELL,
-   mask, ~mask, 1000, 1000);
+   mask, ~mask, 1000, 1000, true);
 
return err;
 }
@@ -2847,6 +2849,23 @@ out:
 }
 
 /**
+ * ufshcd_hba_stop - Send controller to reset state
+ * @hba: per adapter instance
+ * @can_sleep: perform sleep or just spin
+ */
+static inline void ufshcd_hba_stop(struct ufs_hba *hba, bool can_sleep)
+{
+   int err;
+
+   ufshcd_writel(hba, CONTROLLER_DISABLE,  REG_CONTROLLER_ENABLE);
+   err = ufshcd_wait_for_register(hba, REG_CONTROLLER_ENABLE,
+   CONTROLLER_ENABLE, CONTROLLER_DISABLE,
+   10, 1, can_sleep);
+   if (err)
+   dev_err(hba->dev, "%s: Controller disable failed\n", __func__);
+}
+
+/**
  * ufshcd_hba_enable - initialize the controller
  * @hba: per adapter instance
  *
@@ -2866,18 +2885,9 @@ static int ufshcd_hba_enable(struct ufs_hba *hba)
 * development and testing of this driver. msleep can be changed to
 * mdelay and retry count can be reduced based on the controller.
 */
-   if (!ufshcd_is_hba_active(hba)) {
-
+   if (!ufshcd_is_hba_active(hba))
/* change controller state to "reset state" */
-   ufshcd_hba_stop(hba);
-
-   /*
-* This delay is based on the testing done with UFS host
-* controller FPGA. The delay can be changed based on the
-* host controller used.
-*/
-   msleep(5);
-   }
+   ufshcd_hba_stop(hba, true);
 
/* UniPro link is disabled at this point */
ufshcd_set_link_off(hba);
@@ -3930,7 +3940,7 @@ static int ufshcd_clear_tm_cmd(struct ufs_hba *hba, int 
tag)
/* poll for max. 1 sec to clear door bell register by h/w */
err = ufshcd_wait_for_register(hba,
REG_UTP_TASK_REQ_DOOR_BELL,
-   mask, 0, 1000, 1000);
+   mask, 0, 1000, 1000, true);
 out:
return err;
 }
@@ -4214,7 +4224,7 @@ static int ufshcd_host_reset_and_restore(struct ufs_hba 
*hba)
 
/* Reset the host controller */
spin_lock_irqsave(hba->host->host_lock, flags);
-   ufshcd_hba_stop(hba);
+   ufshcd_hba_stop(hba, false);
spin_unlock_irqrestore(hba->host->host_lock, flags);
 
err = ufshcd_hba_enable(hba);
@@ -5168,7 +5178,7 @@ static int ufshcd_link_state_transition(struct ufs_hba 
*hba,
 * Change controller state to "reset state" which
 * should also