diff options
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_iocb.c')
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_iocb.c | 67 | 
1 files changed, 37 insertions, 30 deletions
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c index d2630317cce..15e4080b347 100644 --- a/drivers/scsi/qla2xxx/qla_iocb.c +++ b/drivers/scsi/qla2xxx/qla_iocb.c @@ -135,7 +135,8 @@ qla2x00_prep_cont_type1_iocb(scsi_qla_host_t *vha, struct req_que *req)  	cont_pkt = (cont_a64_entry_t *)req->ring_ptr;  	/* Load packet defaults. */ -	*((uint32_t *)(&cont_pkt->entry_type)) = +	*((uint32_t *)(&cont_pkt->entry_type)) = IS_QLAFX00(vha->hw) ? +	    __constant_cpu_to_le32(CONTINUE_A64_TYPE_FX00) :  	    __constant_cpu_to_le32(CONTINUE_A64_TYPE);  	return (cont_pkt); @@ -486,6 +487,10 @@ qla2x00_start_iocbs(struct scsi_qla_host *vha, struct req_que *req)  		if (ha->mqenable || IS_QLA83XX(ha)) {  			WRT_REG_DWORD(req->req_q_in, req->ring_index);  			RD_REG_DWORD_RELAXED(&ha->iobase->isp24.hccr); +		} else if (IS_QLAFX00(ha)) { +			WRT_REG_DWORD(®->ispfx00.req_q_in, req->ring_index); +			RD_REG_DWORD_RELAXED(®->ispfx00.req_q_in); +			QLAFX00_SET_HST_INTR(ha, ha->rqstq_intr_code);  		} else if (IS_FWI2_CAPABLE(ha)) {  			WRT_REG_DWORD(®->isp24.req_q_in, req->ring_index);  			RD_REG_DWORD_RELAXED(®->isp24.req_q_in); @@ -514,11 +519,12 @@ __qla2x00_marker(struct scsi_qla_host *vha, struct req_que *req,  			uint16_t lun, uint8_t type)  {  	mrk_entry_t *mrk; -	struct mrk_entry_24xx *mrk24; +	struct mrk_entry_24xx *mrk24 = NULL; +	struct mrk_entry_fx00 *mrkfx = NULL; +  	struct qla_hw_data *ha = vha->hw;  	scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev); -	mrk24 = NULL;  	req = ha->req_q_map[0];  	mrk = (mrk_entry_t *)qla2x00_alloc_iocbs(vha, NULL);  	if (mrk == NULL) { @@ -531,7 +537,15 @@ __qla2x00_marker(struct scsi_qla_host *vha, struct req_que *req,  	mrk->entry_type = MARKER_TYPE;  	mrk->modifier = type;  	if (type != MK_SYNC_ALL) { -		if (IS_FWI2_CAPABLE(ha)) { +		if (IS_QLAFX00(ha)) { +			mrkfx = (struct mrk_entry_fx00 *) mrk; +			mrkfx->handle = MAKE_HANDLE(req->id, mrkfx->handle); +			mrkfx->handle_hi = 0; +			mrkfx->tgt_id = cpu_to_le16(loop_id); +			mrkfx->lun[1] = LSB(lun); +			mrkfx->lun[2] = MSB(lun); +			host_to_fcp_swap(mrkfx->lun, sizeof(mrkfx->lun)); +		} else if (IS_FWI2_CAPABLE(ha)) {  			mrk24 = (struct mrk_entry_24xx *) mrk;  			mrk24->nport_handle = cpu_to_le16(loop_id);  			mrk24->lun[1] = LSB(lun); @@ -589,28 +603,6 @@ int qla2x00_issue_marker(scsi_qla_host_t *vha, int ha_locked)  	return QLA_SUCCESS;  } -/** - * qla24xx_calc_iocbs() - Determine number of Command Type 3 and - * Continuation Type 1 IOCBs to allocate. - * - * @dsds: number of data segment decriptors needed - * - * Returns the number of IOCB entries needed to store @dsds. - */ -inline uint16_t -qla24xx_calc_iocbs(scsi_qla_host_t *vha, uint16_t dsds) -{ -	uint16_t iocbs; - -	iocbs = 1; -	if (dsds > 1) { -		iocbs += (dsds - 1) / 5; -		if ((dsds - 1) % 5) -			iocbs++; -	} -	return iocbs; -} -  static inline int  qla24xx_build_scsi_type_6_iocbs(srb_t *sp, struct cmd_type_6 *cmd_pkt,  	uint16_t tot_dsds) @@ -1583,7 +1575,6 @@ queuing_error:  	return QLA_FUNCTION_FAILED;  } -  /**   * qla24xx_dif_start_scsi() - Send a SCSI command to the ISP   * @sp: command to send to the ISP @@ -1852,6 +1843,8 @@ skip_cmd_array:  			cnt = RD_REG_DWORD(®->isp82.req_q_out);  		else if (IS_FWI2_CAPABLE(ha))  			cnt = RD_REG_DWORD(®->isp24.req_q_out); +		else if (IS_QLAFX00(ha)) +			cnt = RD_REG_DWORD(®->ispfx00.req_q_out);  		else  			cnt = qla2x00_debounce_register(  			    ISP_REQ_Q_OUT(ha, ®->isp)); @@ -1869,8 +1862,13 @@ skip_cmd_array:  	req->cnt -= req_cnt;  	pkt = req->ring_ptr;  	memset(pkt, 0, REQUEST_ENTRY_SIZE); -	pkt->entry_count = req_cnt; -	pkt->handle = handle; +	if (IS_QLAFX00(ha)) { +		WRT_REG_BYTE(&pkt->entry_count, req_cnt); +		WRT_REG_WORD(&pkt->handle, handle); +	} else { +		pkt->entry_count = req_cnt; +		pkt->handle = handle; +	}  queuing_error:  	return pkt; @@ -2625,7 +2623,16 @@ qla2x00_start_sp(srb_t *sp)  		    qla2x00_adisc_iocb(sp, pkt);  		break;  	case SRB_TM_CMD: -		qla24xx_tm_iocb(sp, pkt); +		IS_QLAFX00(ha) ? +		    qlafx00_tm_iocb(sp, pkt) : +		    qla24xx_tm_iocb(sp, pkt); +		break; +	case SRB_FXIOCB_DCMD: +	case SRB_FXIOCB_BCMD: +		qlafx00_fxdisc_iocb(sp, pkt); +		break; +	case SRB_ABT_CMD: +		qlafx00_abort_iocb(sp, pkt);  		break;  	default:  		break;  |