|
@@ -599,9 +599,10 @@ static void ipr_trc_hook(struct ipr_cmnd *ipr_cmd,
|
|
|
{
|
|
|
struct ipr_trace_entry *trace_entry;
|
|
|
struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
|
|
|
+ unsigned int trace_index;
|
|
|
|
|
|
- trace_entry = &ioa_cfg->trace[atomic_add_return
|
|
|
- (1, &ioa_cfg->trace_index)%IPR_NUM_TRACE_ENTRIES];
|
|
|
+ trace_index = atomic_add_return(1, &ioa_cfg->trace_index) & IPR_TRACE_INDEX_MASK;
|
|
|
+ trace_entry = &ioa_cfg->trace[trace_index];
|
|
|
trace_entry->time = jiffies;
|
|
|
trace_entry->op_code = ipr_cmd->ioarcb.cmd_pkt.cdb[0];
|
|
|
trace_entry->type = type;
|
|
@@ -1051,10 +1052,15 @@ static void ipr_send_blocking_cmd(struct ipr_cmnd *ipr_cmd,
|
|
|
|
|
|
static int ipr_get_hrrq_index(struct ipr_ioa_cfg *ioa_cfg)
|
|
|
{
|
|
|
+ unsigned int hrrq;
|
|
|
+
|
|
|
if (ioa_cfg->hrrq_num == 1)
|
|
|
- return 0;
|
|
|
- else
|
|
|
- return (atomic_add_return(1, &ioa_cfg->hrrq_index) % (ioa_cfg->hrrq_num - 1)) + 1;
|
|
|
+ hrrq = 0;
|
|
|
+ else {
|
|
|
+ hrrq = atomic_add_return(1, &ioa_cfg->hrrq_index);
|
|
|
+ hrrq = (hrrq % (ioa_cfg->hrrq_num - 1)) + 1;
|
|
|
+ }
|
|
|
+ return hrrq;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -6263,21 +6269,23 @@ static void ipr_scsi_done(struct ipr_cmnd *ipr_cmd)
|
|
|
struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
|
|
|
struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
|
|
|
u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
|
|
|
- unsigned long hrrq_flags;
|
|
|
+ unsigned long lock_flags;
|
|
|
|
|
|
scsi_set_resid(scsi_cmd, be32_to_cpu(ipr_cmd->s.ioasa.hdr.residual_data_len));
|
|
|
|
|
|
if (likely(IPR_IOASC_SENSE_KEY(ioasc) == 0)) {
|
|
|
scsi_dma_unmap(scsi_cmd);
|
|
|
|
|
|
- spin_lock_irqsave(ipr_cmd->hrrq->lock, hrrq_flags);
|
|
|
+ spin_lock_irqsave(ipr_cmd->hrrq->lock, lock_flags);
|
|
|
list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
|
|
|
scsi_cmd->scsi_done(scsi_cmd);
|
|
|
- spin_unlock_irqrestore(ipr_cmd->hrrq->lock, hrrq_flags);
|
|
|
+ spin_unlock_irqrestore(ipr_cmd->hrrq->lock, lock_flags);
|
|
|
} else {
|
|
|
- spin_lock_irqsave(ipr_cmd->hrrq->lock, hrrq_flags);
|
|
|
+ spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
|
|
|
+ spin_lock(&ipr_cmd->hrrq->_lock);
|
|
|
ipr_erp_start(ioa_cfg, ipr_cmd);
|
|
|
- spin_unlock_irqrestore(ipr_cmd->hrrq->lock, hrrq_flags);
|
|
|
+ spin_unlock(&ipr_cmd->hrrq->_lock);
|
|
|
+ spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
|
|
|
}
|
|
|
}
|
|
|
|