diff options
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_scsi.c')
| -rw-r--r-- | drivers/scsi/lpfc/lpfc_scsi.c | 39 | 
1 files changed, 23 insertions, 16 deletions
diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c index 64013f3097a..7f45ac9964a 100644 --- a/drivers/scsi/lpfc/lpfc_scsi.c +++ b/drivers/scsi/lpfc/lpfc_scsi.c @@ -3829,9 +3829,9 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn,  	cmd->scsi_done(cmd);  	if (phba->cfg_poll & ENABLE_FCP_RING_POLLING) { -		spin_lock_irq(&phba->hbalock); +		spin_lock_irqsave(&phba->hbalock, flags);  		lpfc_cmd->pCmd = NULL; -		spin_unlock_irq(&phba->hbalock); +		spin_unlock_irqrestore(&phba->hbalock, flags);  		/*  		 * If there is a thread waiting for command completion @@ -3871,9 +3871,9 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn,  		}  	} -	spin_lock_irq(&phba->hbalock); +	spin_lock_irqsave(&phba->hbalock, flags);  	lpfc_cmd->pCmd = NULL; -	spin_unlock_irq(&phba->hbalock); +	spin_unlock_irqrestore(&phba->hbalock, flags);  	/*  	 * If there is a thread waiting for command completion @@ -4163,7 +4163,7 @@ lpfc_info(struct Scsi_Host *host)  {  	struct lpfc_vport *vport = (struct lpfc_vport *) host->hostdata;  	struct lpfc_hba   *phba = vport->phba; -	int len; +	int len, link_speed = 0;  	static char  lpfcinfobuf[384];  	memset(lpfcinfobuf,0,384); @@ -4184,12 +4184,18 @@ lpfc_info(struct Scsi_Host *host)  				 phba->Port);  		}  		len = strlen(lpfcinfobuf); -		if (phba->sli4_hba.link_state.logical_speed) { -			snprintf(lpfcinfobuf + len, -				 384-len, -				 " Logical Link Speed: %d Mbps", -				 phba->sli4_hba.link_state.logical_speed * 10); +		if (phba->sli_rev <= LPFC_SLI_REV3) { +			link_speed = lpfc_sli_port_speed_get(phba); +		} else { +			if (phba->sli4_hba.link_state.logical_speed) +				link_speed = +				      phba->sli4_hba.link_state.logical_speed; +			else +				link_speed = phba->sli4_hba.link_state.speed;  		} +		if (link_speed != 0) +			snprintf(lpfcinfobuf + len, 384-len, +				 " Logical Link Speed: %d Mbps", link_speed);  	}  	return lpfcinfobuf;  } @@ -4398,16 +4404,17 @@ lpfc_abort_handler(struct scsi_cmnd *cmnd)  	struct lpfc_scsi_buf *lpfc_cmd;  	IOCB_t *cmd, *icmd;  	int ret = SUCCESS, status = 0; +	unsigned long flags;  	DECLARE_WAIT_QUEUE_HEAD_ONSTACK(waitq);  	status = fc_block_scsi_eh(cmnd);  	if (status != 0 && status != SUCCESS)  		return status; -	spin_lock_irq(&phba->hbalock); +	spin_lock_irqsave(&phba->hbalock, flags);  	/* driver queued commands are in process of being flushed */  	if (phba->hba_flag & HBA_FCP_IOQ_FLUSH) { -		spin_unlock_irq(&phba->hbalock); +		spin_unlock_irqrestore(&phba->hbalock, flags);  		lpfc_printf_vlog(vport, KERN_WARNING, LOG_FCP,  			"3168 SCSI Layer abort requested I/O has been "  			"flushed by LLD.\n"); @@ -4416,7 +4423,7 @@ lpfc_abort_handler(struct scsi_cmnd *cmnd)  	lpfc_cmd = (struct lpfc_scsi_buf *)cmnd->host_scribble;  	if (!lpfc_cmd || !lpfc_cmd->pCmd) { -		spin_unlock_irq(&phba->hbalock); +		spin_unlock_irqrestore(&phba->hbalock, flags);  		lpfc_printf_vlog(vport, KERN_WARNING, LOG_FCP,  			 "2873 SCSI Layer I/O Abort Request IO CMPL Status "  			 "x%x ID %d LUN %d\n", @@ -4427,7 +4434,7 @@ lpfc_abort_handler(struct scsi_cmnd *cmnd)  	iocb = &lpfc_cmd->cur_iocbq;  	/* the command is in process of being cancelled */  	if (!(iocb->iocb_flag & LPFC_IO_ON_TXCMPLQ)) { -		spin_unlock_irq(&phba->hbalock); +		spin_unlock_irqrestore(&phba->hbalock, flags);  		lpfc_printf_vlog(vport, KERN_WARNING, LOG_FCP,  			"3169 SCSI Layer abort requested I/O has been "  			"cancelled by LLD.\n"); @@ -4484,7 +4491,7 @@ lpfc_abort_handler(struct scsi_cmnd *cmnd)  	abtsiocb->iocb_cmpl = lpfc_sli_abort_fcp_cmpl;  	abtsiocb->vport = vport;  	/* no longer need the lock after this point */ -	spin_unlock_irq(&phba->hbalock); +	spin_unlock_irqrestore(&phba->hbalock, flags);  	if (lpfc_sli_issue_iocb(phba, LPFC_FCP_RING, abtsiocb, 0) ==  	    IOCB_ERROR) { @@ -4516,7 +4523,7 @@ lpfc_abort_handler(struct scsi_cmnd *cmnd)  	goto out;  out_unlock: -	spin_unlock_irq(&phba->hbalock); +	spin_unlock_irqrestore(&phba->hbalock, flags);  out:  	lpfc_printf_vlog(vport, KERN_WARNING, LOG_FCP,  			 "0749 SCSI Layer I/O Abort Request Status x%x ID %d "  |