Revert "FROMGIT: scsi: ufs: Utilize Transfer Request List Completion Notification Register"
This reverts commit ae618c699c
.
It causes early device being stuck.
Bug: 192088222
Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
Change-Id: I5117e7f8aaa9433b74f1531619cdc1b687d02b41
This commit is contained in:
@@ -2078,6 +2078,7 @@ static inline
|
|||||||
void ufshcd_send_command(struct ufs_hba *hba, unsigned int task_tag)
|
void ufshcd_send_command(struct ufs_hba *hba, unsigned int task_tag)
|
||||||
{
|
{
|
||||||
struct ufshcd_lrb *lrbp = &hba->lrb[task_tag];
|
struct ufshcd_lrb *lrbp = &hba->lrb[task_tag];
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
lrbp->issue_time_stamp = ktime_get();
|
lrbp->issue_time_stamp = ktime_get();
|
||||||
lrbp->compl_time_stamp = ktime_set(0, 0);
|
lrbp->compl_time_stamp = ktime_set(0, 0);
|
||||||
@@ -2087,19 +2088,10 @@ void ufshcd_send_command(struct ufs_hba *hba, unsigned int task_tag)
|
|||||||
ufshcd_clk_scaling_start_busy(hba);
|
ufshcd_clk_scaling_start_busy(hba);
|
||||||
if (unlikely(ufshcd_should_inform_monitor(hba, lrbp)))
|
if (unlikely(ufshcd_should_inform_monitor(hba, lrbp)))
|
||||||
ufshcd_start_monitor(hba, lrbp);
|
ufshcd_start_monitor(hba, lrbp);
|
||||||
if (ufshcd_has_utrlcnr(hba)) {
|
|
||||||
set_bit(task_tag, &hba->outstanding_reqs);
|
|
||||||
ufshcd_writel(hba, 1 << task_tag,
|
|
||||||
REG_UTP_TRANSFER_REQ_DOOR_BELL);
|
|
||||||
} else {
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
spin_lock_irqsave(hba->host->host_lock, flags);
|
spin_lock_irqsave(hba->host->host_lock, flags);
|
||||||
set_bit(task_tag, &hba->outstanding_reqs);
|
set_bit(task_tag, &hba->outstanding_reqs);
|
||||||
ufshcd_writel(hba, 1 << task_tag,
|
ufshcd_writel(hba, 1 << task_tag, REG_UTP_TRANSFER_REQ_DOOR_BELL);
|
||||||
REG_UTP_TRANSFER_REQ_DOOR_BELL);
|
|
||||||
spin_unlock_irqrestore(hba->host->host_lock, flags);
|
spin_unlock_irqrestore(hba->host->host_lock, flags);
|
||||||
}
|
|
||||||
/* Make sure that doorbell is committed immediately */
|
/* Make sure that doorbell is committed immediately */
|
||||||
wmb();
|
wmb();
|
||||||
}
|
}
|
||||||
@@ -5206,17 +5198,17 @@ static void __ufshcd_transfer_req_compl(struct ufs_hba *hba,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ufshcd_trc_handler - handle transfer requests completion
|
* ufshcd_transfer_req_compl - handle SCSI and query command completion
|
||||||
* @hba: per adapter instance
|
* @hba: per adapter instance
|
||||||
* @use_utrlcnr: get completed requests from UTRLCNR
|
|
||||||
*
|
*
|
||||||
* Returns
|
* Returns
|
||||||
* IRQ_HANDLED - If interrupt is valid
|
* IRQ_HANDLED - If interrupt is valid
|
||||||
* IRQ_NONE - If invalid interrupt
|
* IRQ_NONE - If invalid interrupt
|
||||||
*/
|
*/
|
||||||
static irqreturn_t ufshcd_trc_handler(struct ufs_hba *hba, bool use_utrlcnr)
|
static irqreturn_t ufshcd_transfer_req_compl(struct ufs_hba *hba)
|
||||||
{
|
{
|
||||||
unsigned long completed_reqs = 0;
|
unsigned long completed_reqs, flags;
|
||||||
|
u32 tr_doorbell;
|
||||||
|
|
||||||
/* Resetting interrupt aggregation counters first and reading the
|
/* Resetting interrupt aggregation counters first and reading the
|
||||||
* DOOR_BELL afterward allows us to handle all the completed requests.
|
* DOOR_BELL afterward allows us to handle all the completed requests.
|
||||||
@@ -5229,24 +5221,10 @@ static irqreturn_t ufshcd_trc_handler(struct ufs_hba *hba, bool use_utrlcnr)
|
|||||||
!(hba->quirks & UFSHCI_QUIRK_SKIP_RESET_INTR_AGGR))
|
!(hba->quirks & UFSHCI_QUIRK_SKIP_RESET_INTR_AGGR))
|
||||||
ufshcd_reset_intr_aggr(hba);
|
ufshcd_reset_intr_aggr(hba);
|
||||||
|
|
||||||
if (use_utrlcnr) {
|
|
||||||
u32 utrlcnr;
|
|
||||||
|
|
||||||
utrlcnr = ufshcd_readl(hba, REG_UTP_TRANSFER_REQ_LIST_COMPL);
|
|
||||||
if (utrlcnr) {
|
|
||||||
ufshcd_writel(hba, utrlcnr,
|
|
||||||
REG_UTP_TRANSFER_REQ_LIST_COMPL);
|
|
||||||
completed_reqs = utrlcnr;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
unsigned long flags;
|
|
||||||
u32 tr_doorbell;
|
|
||||||
|
|
||||||
spin_lock_irqsave(hba->host->host_lock, flags);
|
spin_lock_irqsave(hba->host->host_lock, flags);
|
||||||
tr_doorbell = ufshcd_readl(hba, REG_UTP_TRANSFER_REQ_DOOR_BELL);
|
tr_doorbell = ufshcd_readl(hba, REG_UTP_TRANSFER_REQ_DOOR_BELL);
|
||||||
completed_reqs = tr_doorbell ^ hba->outstanding_reqs;
|
completed_reqs = tr_doorbell ^ hba->outstanding_reqs;
|
||||||
spin_unlock_irqrestore(hba->host->host_lock, flags);
|
spin_unlock_irqrestore(hba->host->host_lock, flags);
|
||||||
}
|
|
||||||
|
|
||||||
if (completed_reqs) {
|
if (completed_reqs) {
|
||||||
__ufshcd_transfer_req_compl(hba, completed_reqs);
|
__ufshcd_transfer_req_compl(hba, completed_reqs);
|
||||||
@@ -5755,7 +5733,7 @@ out:
|
|||||||
/* Complete requests that have door-bell cleared */
|
/* Complete requests that have door-bell cleared */
|
||||||
static void ufshcd_complete_requests(struct ufs_hba *hba)
|
static void ufshcd_complete_requests(struct ufs_hba *hba)
|
||||||
{
|
{
|
||||||
ufshcd_trc_handler(hba, false);
|
ufshcd_transfer_req_compl(hba);
|
||||||
ufshcd_tmc_handler(hba);
|
ufshcd_tmc_handler(hba);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6392,7 +6370,7 @@ static irqreturn_t ufshcd_sl_intr(struct ufs_hba *hba, u32 intr_status)
|
|||||||
retval |= ufshcd_tmc_handler(hba);
|
retval |= ufshcd_tmc_handler(hba);
|
||||||
|
|
||||||
if (intr_status & UTP_TRANSFER_REQ_COMPL)
|
if (intr_status & UTP_TRANSFER_REQ_COMPL)
|
||||||
retval |= ufshcd_trc_handler(hba, ufshcd_has_utrlcnr(hba));
|
retval |= ufshcd_transfer_req_compl(hba);
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
@@ -1166,11 +1166,6 @@ static inline u32 ufshcd_vops_get_ufs_hci_version(struct ufs_hba *hba)
|
|||||||
return ufshcd_readl(hba, REG_UFS_VERSION);
|
return ufshcd_readl(hba, REG_UFS_VERSION);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool ufshcd_has_utrlcnr(struct ufs_hba *hba)
|
|
||||||
{
|
|
||||||
return (hba->ufs_version >= ufshci_version(3, 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int ufshcd_vops_clk_scale_notify(struct ufs_hba *hba,
|
static inline int ufshcd_vops_clk_scale_notify(struct ufs_hba *hba,
|
||||||
bool up, enum ufs_notify_change_status status)
|
bool up, enum ufs_notify_change_status status)
|
||||||
{
|
{
|
||||||
|
@@ -39,7 +39,6 @@ enum {
|
|||||||
REG_UTP_TRANSFER_REQ_DOOR_BELL = 0x58,
|
REG_UTP_TRANSFER_REQ_DOOR_BELL = 0x58,
|
||||||
REG_UTP_TRANSFER_REQ_LIST_CLEAR = 0x5C,
|
REG_UTP_TRANSFER_REQ_LIST_CLEAR = 0x5C,
|
||||||
REG_UTP_TRANSFER_REQ_LIST_RUN_STOP = 0x60,
|
REG_UTP_TRANSFER_REQ_LIST_RUN_STOP = 0x60,
|
||||||
REG_UTP_TRANSFER_REQ_LIST_COMPL = 0x64,
|
|
||||||
REG_UTP_TASK_REQ_LIST_BASE_L = 0x70,
|
REG_UTP_TASK_REQ_LIST_BASE_L = 0x70,
|
||||||
REG_UTP_TASK_REQ_LIST_BASE_H = 0x74,
|
REG_UTP_TASK_REQ_LIST_BASE_H = 0x74,
|
||||||
REG_UTP_TASK_REQ_DOOR_BELL = 0x78,
|
REG_UTP_TASK_REQ_DOOR_BELL = 0x78,
|
||||||
|
Reference in New Issue
Block a user