Re: [PATCH 1/1] scsi: ufs: Add support for sending NOP OUT UPIU

From: Santosh Y
Date: Thu May 02 2013 - 03:27:40 EST


> +
> +/**
> + * ufshcd_validate_dev_connection() - Check device connection status
> + * @hba: per-adapter instance
> + *
> + * Send NOP OUT UPIU and wait for NOP IN response to check whether the
> + * device Transport Protocol (UTP) layer is ready after a reset.
> + * If the UTP layer at the device side is not initialized, it may
> + * not respond with NOP IN UPIU within timeout of %NOP_OUT_TIMEOUT
> + * and we retry sending NOP OUT for %NOP_OUT_RETRIES iterations.
> + */
> +static int ufshcd_validate_dev_connection(struct ufs_hba *hba)
> +{
> + int err;
> + struct ufshcd_lrb *lrbp;
> + unsigned long timeout;
> + unsigned long flags;
> + struct completion wait;
> + int retries = NOP_OUT_RETRIES;
> +
> +retry:
> + spin_lock_irqsave(hba->host->host_lock, flags);
> + lrbp = &hba->lrb[INTERNAL_CMD_TAG];
> + init_completion(&wait);
> +
> + err = ufshcd_compose_nop_out_upiu(hba, lrbp);
> + if (err)
> + goto may_retry;
> +
> + lrbp->completion = &wait;
> + ufshcd_send_command(hba, INTERNAL_CMD_TAG);
> + spin_unlock_irqrestore(hba->host->host_lock, flags);
> +
> + timeout = wait_for_completion_timeout(
> + &wait, msecs_to_jiffies(NOP_OUT_TIMEOUT));
> +
> + spin_lock_irqsave(hba->host->host_lock, flags);
> + if (timeout > 0) {
> + int ocs;
> +
> + ocs = ufshcd_get_tr_ocs(lrbp);
> + switch (ocs) {
> + case OCS_SUCCESS:
> + goto out;
> + default:
> + dev_dbg(hba->dev, "%s: OCS error %d\n", __func__, ocs);
> + err = -EIO;
> + goto may_retry;
> + }
> + } else {
> + u32 reg;
> +
> + err = -ETIMEDOUT;
> +
> + /* clear outstanding transaction before retry */
> + ufshcd_utrl_clear(hba, INTERNAL_CMD_TAG);
> + __clear_bit(INTERNAL_CMD_TAG, &hba->outstanding_reqs);
> +
> + /* poll for max. 1 sec to clear door bell register by h/w */
> + spin_unlock_irqrestore(hba->host->host_lock, flags);
> + if (readl_poll_timeout(
> + hba->mmio_base + REG_UTP_TRANSFER_REQ_DOOR_BELL,
> + reg, !(reg & INTERNAL_CMD_TAG), 1000, 1000))

Condition is always true here, change it to !(reg & (1 << INTERNAL_CMD_TAG)).

> + retries = 0;
> + spin_lock_irqsave(hba->host->host_lock, flags);
> + goto may_retry;
> + }
> +



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