qla_mbx.c

来自「linux 内核源代码」· C语言 代码 · 共 2,658 行 · 第 1/5 页

C
2,658
字号
		 * to change too much of the existing code.		 */		if (mcp->mb[0] == 0x4001 || mcp->mb[0] == 0x4002 ||		    mcp->mb[0] == 0x4003 || mcp->mb[0] == 0x4005 ||		    mcp->mb[0] == 0x4006)			rval = QLA_SUCCESS;		/*EMPTY*/		DEBUG2_3_11(printk("qla2x00_login_fabric(%ld): failed=%x "		    "mb[0]=%x mb[1]=%x mb[2]=%x.\n", ha->host_no, rval,		    mcp->mb[0], mcp->mb[1], mcp->mb[2]));	} else {		/*EMPTY*/		DEBUG11(printk("qla2x00_login_fabric(%ld): done.\n",		    ha->host_no));	}	return rval;}/* * qla2x00_login_local_device *           Issue login loop port mailbox command. * * Input: *           ha = adapter block pointer. *           loop_id = device loop ID. *           opt = command options. * * Returns: *            Return status code. * * Context: *            Kernel context. * */intqla2x00_login_local_device(scsi_qla_host_t *ha, fc_port_t *fcport,    uint16_t *mb_ret, uint8_t opt){	int rval;	mbx_cmd_t mc;	mbx_cmd_t *mcp = &mc;	if (IS_FWI2_CAPABLE(ha))		return qla24xx_login_fabric(ha, fcport->loop_id,		    fcport->d_id.b.domain, fcport->d_id.b.area,		    fcport->d_id.b.al_pa, mb_ret, opt);	DEBUG3(printk("%s(%ld): entered.\n", __func__, ha->host_no));	mcp->mb[0] = MBC_LOGIN_LOOP_PORT;	if (HAS_EXTENDED_IDS(ha))		mcp->mb[1] = fcport->loop_id;	else		mcp->mb[1] = fcport->loop_id << 8;	mcp->mb[2] = opt;	mcp->out_mb = MBX_2|MBX_1|MBX_0; 	mcp->in_mb = MBX_7|MBX_6|MBX_1|MBX_0;	mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2);	mcp->flags = 0;	rval = qla2x00_mailbox_command(ha, mcp); 	/* Return mailbox statuses. */ 	if (mb_ret != NULL) { 		mb_ret[0] = mcp->mb[0]; 		mb_ret[1] = mcp->mb[1]; 		mb_ret[6] = mcp->mb[6]; 		mb_ret[7] = mcp->mb[7]; 	}	if (rval != QLA_SUCCESS) { 		/* AV tmp code: need to change main mailbox_command function to 		 * return ok even when the mailbox completion value is not 		 * SUCCESS. The caller needs to be responsible to interpret 		 * the return values of this mailbox command if we're not 		 * to change too much of the existing code. 		 */ 		if (mcp->mb[0] == 0x4005 || mcp->mb[0] == 0x4006) 			rval = QLA_SUCCESS;		DEBUG(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x "		    "mb[6]=%x mb[7]=%x.\n", __func__, ha->host_no, rval,		    mcp->mb[0], mcp->mb[1], mcp->mb[6], mcp->mb[7]));		DEBUG2_3(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x "		    "mb[6]=%x mb[7]=%x.\n", __func__, ha->host_no, rval,		    mcp->mb[0], mcp->mb[1], mcp->mb[6], mcp->mb[7]));	} else {		/*EMPTY*/		DEBUG3(printk("%s(%ld): done.\n", __func__, ha->host_no));	}	return (rval);}intqla24xx_fabric_logout(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t domain,    uint8_t area, uint8_t al_pa){	int		rval;	struct logio_entry_24xx *lg;	dma_addr_t	lg_dma;	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));	lg = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &lg_dma);	if (lg == NULL) {		DEBUG2_3(printk("%s(%ld): failed to allocate Logout IOCB.\n",		    __func__, ha->host_no));		return QLA_MEMORY_ALLOC_FAILED;	}	memset(lg, 0, sizeof(struct logio_entry_24xx));	lg->entry_type = LOGINOUT_PORT_IOCB_TYPE;	lg->entry_count = 1;	lg->nport_handle = cpu_to_le16(loop_id);	lg->control_flags =	    __constant_cpu_to_le16(LCF_COMMAND_LOGO|LCF_IMPL_LOGO);	lg->port_id[0] = al_pa;	lg->port_id[1] = area;	lg->port_id[2] = domain;	lg->vp_index = cpu_to_le16(ha->vp_idx);	rval = qla2x00_issue_iocb(ha, lg, lg_dma, 0);	if (rval != QLA_SUCCESS) {		DEBUG2_3_11(printk("%s(%ld): failed to issue Logout IOCB "		    "(%x).\n", __func__, ha->host_no, rval));	} else if (lg->entry_status != 0) {		DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB "		    "-- error status (%x).\n", __func__, ha->host_no,		    lg->entry_status));		rval = QLA_FUNCTION_FAILED;	} else if (lg->comp_status != __constant_cpu_to_le16(CS_COMPLETE)) {		DEBUG2_3_11(printk("%s(%ld): failed to complete IOCB "		    "-- completion status (%x)  ioparam=%x/%x.\n", __func__,		    ha->host_no, le16_to_cpu(lg->comp_status),		    le32_to_cpu(lg->io_parameter[0]),		    le32_to_cpu(lg->io_parameter[1])));	} else {		/*EMPTY*/		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));	}	dma_pool_free(ha->s_dma_pool, lg, lg_dma);	return rval;}/* * qla2x00_fabric_logout *	Issue logout fabric port mailbox command. * * Input: *	ha = adapter block pointer. *	loop_id = device loop ID. *	TARGET_QUEUE_LOCK must be released. *	ADAPTER_STATE_LOCK must be released. * * Returns: *	qla2x00 local function return status code. * * Context: *	Kernel context. */intqla2x00_fabric_logout(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t domain,    uint8_t area, uint8_t al_pa){	int rval;	mbx_cmd_t mc;	mbx_cmd_t *mcp = &mc;	DEBUG11(printk("qla2x00_fabric_logout(%ld): entered.\n",	    ha->host_no));	mcp->mb[0] = MBC_LOGOUT_FABRIC_PORT;	mcp->out_mb = MBX_1|MBX_0;	if (HAS_EXTENDED_IDS(ha)) {		mcp->mb[1] = loop_id;		mcp->mb[10] = 0;		mcp->out_mb |= MBX_10;	} else {		mcp->mb[1] = loop_id << 8;	}	mcp->in_mb = MBX_1|MBX_0;	mcp->tov = 30;	mcp->flags = 0;	rval = qla2x00_mailbox_command(ha, mcp);	if (rval != QLA_SUCCESS) {		/*EMPTY*/		DEBUG2_3_11(printk("qla2x00_fabric_logout(%ld): failed=%x "		    "mbx1=%x.\n", ha->host_no, rval, mcp->mb[1]));	} else {		/*EMPTY*/		DEBUG11(printk("qla2x00_fabric_logout(%ld): done.\n",		    ha->host_no));	}	return rval;}/* * qla2x00_full_login_lip *	Issue full login LIP mailbox command. * * Input: *	ha = adapter block pointer. *	TARGET_QUEUE_LOCK must be released. *	ADAPTER_STATE_LOCK must be released. * * Returns: *	qla2x00 local function return status code. * * Context: *	Kernel context. */intqla2x00_full_login_lip(scsi_qla_host_t *ha){	int rval;	mbx_cmd_t mc;	mbx_cmd_t *mcp = &mc;	DEBUG11(printk("qla2x00_full_login_lip(%ld): entered.\n",	    ha->host_no));	mcp->mb[0] = MBC_LIP_FULL_LOGIN;	mcp->mb[1] = IS_FWI2_CAPABLE(ha) ? BIT_3: 0;	mcp->mb[2] = 0;	mcp->mb[3] = 0;	mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;	mcp->in_mb = MBX_0;	mcp->tov = 30;	mcp->flags = 0;	rval = qla2x00_mailbox_command(ha, mcp);	if (rval != QLA_SUCCESS) {		/*EMPTY*/		DEBUG2_3_11(printk("qla2x00_full_login_lip(%ld): failed=%x.\n",		    ha->host_no, rval));	} else {		/*EMPTY*/		DEBUG11(printk("qla2x00_full_login_lip(%ld): done.\n",		    ha->host_no));	}	return rval;}/* * qla2x00_get_id_list * * Input: *	ha = adapter block pointer. * * Returns: *	qla2x00 local function return status code. * * Context: *	Kernel context. */intqla2x00_get_id_list(scsi_qla_host_t *ha, void *id_list, dma_addr_t id_list_dma,    uint16_t *entries){	int rval;	mbx_cmd_t mc;	mbx_cmd_t *mcp = &mc;	DEBUG11(printk("qla2x00_get_id_list(%ld): entered.\n",	    ha->host_no));	if (id_list == NULL)		return QLA_FUNCTION_FAILED;	mcp->mb[0] = MBC_GET_ID_LIST;	mcp->out_mb = MBX_0;	if (IS_FWI2_CAPABLE(ha)) {		mcp->mb[2] = MSW(id_list_dma);		mcp->mb[3] = LSW(id_list_dma);		mcp->mb[6] = MSW(MSD(id_list_dma));		mcp->mb[7] = LSW(MSD(id_list_dma));		mcp->mb[8] = 0;		mcp->mb[9] = ha->vp_idx;		mcp->out_mb |= MBX_9|MBX_8|MBX_7|MBX_6|MBX_3|MBX_2;	} else {		mcp->mb[1] = MSW(id_list_dma);		mcp->mb[2] = LSW(id_list_dma);		mcp->mb[3] = MSW(MSD(id_list_dma));		mcp->mb[6] = LSW(MSD(id_list_dma));		mcp->out_mb |= MBX_6|MBX_3|MBX_2|MBX_1;	}	mcp->in_mb = MBX_1|MBX_0;	mcp->tov = 30;	mcp->flags = 0;	rval = qla2x00_mailbox_command(ha, mcp);	if (rval != QLA_SUCCESS) {		/*EMPTY*/		DEBUG2_3_11(printk("qla2x00_get_id_list(%ld): failed=%x.\n",		    ha->host_no, rval));	} else {		*entries = mcp->mb[1];		DEBUG11(printk("qla2x00_get_id_list(%ld): done.\n",		    ha->host_no));	}	return rval;}/* * qla2x00_get_resource_cnts *	Get current firmware resource counts. * * Input: *	ha = adapter block pointer. * * Returns: *	qla2x00 local function return status code. * * Context: *	Kernel context. */intqla2x00_get_resource_cnts(scsi_qla_host_t *ha, uint16_t *cur_xchg_cnt,    uint16_t *orig_xchg_cnt, uint16_t *cur_iocb_cnt,    uint16_t *orig_iocb_cnt, uint16_t *max_npiv_vports){	int rval;	mbx_cmd_t mc;	mbx_cmd_t *mcp = &mc;	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));	mcp->mb[0] = MBC_GET_RESOURCE_COUNTS;	mcp->out_mb = MBX_0;	mcp->in_mb = MBX_11|MBX_10|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;	mcp->tov = 30;	mcp->flags = 0;	rval = qla2x00_mailbox_command(ha, mcp);	if (rval != QLA_SUCCESS) {		/*EMPTY*/		DEBUG2_3_11(printk("%s(%ld): failed = %x.\n", __func__,		    ha->host_no, mcp->mb[0]));	} else {		DEBUG11(printk("%s(%ld): done. mb1=%x mb2=%x mb3=%x mb6=%x "		    "mb7=%x mb10=%x mb11=%x.\n", __func__, ha->host_no,		    mcp->mb[1], mcp->mb[2], mcp->mb[3], mcp->mb[6], mcp->mb[7],		    mcp->mb[10], mcp->mb[11]));		if (cur_xchg_cnt)			*cur_xchg_cnt = mcp->mb[3];		if (orig_xchg_cnt)			*orig_xchg_cnt = mcp->mb[6];		if (cur_iocb_cnt)			*cur_iocb_cnt = mcp->mb[7];		if (orig_iocb_cnt)			*orig_iocb_cnt = mcp->mb[10];		if (max_npiv_vports)			*max_npiv_vports = mcp->mb[11];	}	return (rval);}#if defined(QL_DEBUG_LEVEL_3)/* * qla2x00_get_fcal_position_map *	Get FCAL (LILP) position map using mailbox command * * Input: *	ha = adapter state pointer. *	pos_map = buffer pointer (can be NULL). * * Returns: *	qla2x00 local function return status code. * * Context: *	Kernel context. */intqla2x00_get_fcal_position_map(scsi_qla_host_t *ha, char *pos_map){	int rval;	mbx_cmd_t mc;	mbx_cmd_t *mcp = &mc;	char *pmap;	dma_addr_t pmap_dma;	pmap = dma_pool_alloc(ha->s_dma_pool, GFP_ATOMIC, &pmap_dma);	if (pmap  == NULL) {		DEBUG2_3_11(printk("%s(%ld): **** Mem Alloc Failed ****",		    __func__, ha->host_no));		return QLA_MEMORY_ALLOC_FAILED;	}	memset(pmap, 0, FCAL_MAP_SIZE);	mcp->mb[0] = MBC_GET_FC_AL_POSITION_MAP;	mcp->mb[2] = MSW(pmap_dma);	mcp->mb[3] = LSW(pmap_dma);	mcp->mb[6] = MSW(MSD(pmap_dma));	mcp->mb[7] = LSW(MSD(pmap_dma));	mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0;	mcp->in_mb = MBX_1|MBX_0;	mcp->buf_size = FCAL_MAP_SIZE;	mcp->flags = MBX_DMA_IN;	mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2);	rval = qla2x00_mailbox_command(ha, mcp);	if (rval == QLA_SUCCESS) {		DEBUG11(printk("%s(%ld): (mb0=%x/mb1=%x) FC/AL Position Map "		    "size (%x)\n", __func__, ha->host_no, mcp->mb[0],		    mcp->mb[1], (unsigned)pmap[0]));		DEBUG11(qla2x00_dump_buffer(pmap, pmap[0] + 1));		if (pos_map)			memcpy(pos_map, pmap, FCAL_MAP_SIZE);	}	dma_pool_free(ha->s_dma_pool, pmap, pmap_dma);	if (rval != QLA_SUCCESS) {		DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__,		    ha->host_no, rval));	} else {		DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));	}	return rval;}#endif/* * qla2x00_get_link_status * * Input: *	ha = adapter block pointer. *	loop_id = device loop ID. *	ret_buf = pointer to link status return buffer. * * Returns: *	0 = success. *	BIT_0 = mem alloc error. *	BIT_1 = mailbox error. */intqla2x00_get_link_status(scsi_qla_host_t *ha, uint16_t loop_id,    link_stat_t *ret_buf, uint16_t *status){	int rval;	mbx_cmd_t mc;	mbx_cmd_t *mcp = &mc;	link_stat_t *stat_buf;	dma_addr_t stat_buf_dma;	DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));	stat_buf = dma_pool_alloc(ha->s_dma_pool, GFP_ATOMIC, &stat_buf_dma);	if (stat_buf == NULL) {		DEBUG2_3_11(printk("%s(%ld): Failed to allocate memory.\n",		    __func__, ha->host_no));		return BIT_0;	}	memset(stat_buf, 0, sizeof(link_stat_t));	mcp->mb[0] = MBC_GET_LINK_STATUS;	mcp->mb[2] = MSW(stat_buf_dma);	mcp->mb[3] = LSW(stat_buf_dma);	mcp->mb[6] = MSW(MSD(stat_buf_dma));	mcp->mb[7] = LSW(MSD(stat_buf_dma));	mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0;	mcp->in_mb = MBX_0;	if (IS_FWI2_CAPABLE(ha)) {		mcp->mb[1] = loop_id;		mcp->mb[4] = 0;		mcp->mb[10] = 0;		mcp->out_mb |= MBX_10|MBX_4|MBX_1;		mcp->in_mb |= MBX_1;	} else if (HAS_EXTENDED_IDS(ha)) {		mcp->mb[1] = loop_id;		mcp->mb[10] = 0;		mcp->out_mb |= MBX_10|MBX_1;	} else {		mcp->mb[1] = loop_id << 8;		mcp->out_mb |= MBX_1;	}	mcp->tov = 30;	mcp->flags = IOCTL_CMD;	rval = qla2x00_mailbox_command(ha, mcp);	if (rval == QLA_SUCCESS) {		if (mcp->mb[0] != MBS_COMMAND_COMPLETE) {			DEBUG2_3_11(printk("%s(%ld): cmd failed. mbx0=%x.\n",			    __func__, ha->host_no, mcp->mb[0]));			status[0] = mcp->mb[0];			rval = BIT_1;		} else {			/* copy over data -- firmware data is LE. */			ret_buf->link_fail_cnt =			    le32_to_cpu(stat_buf->link_fail_cnt);			ret_buf->loss_sync_cnt =			    le32_to_cpu(stat_buf->loss_sync_cnt);			ret_buf->loss_sig_cnt =			    le32_to_cpu(stat_buf->loss_sig_cnt);			ret_buf->prim_seq_err_cnt =			    le32_to_cpu(stat_buf->prim_seq_err_cnt);			ret_buf->inval_xmit_word_cnt =			    le32_to_cpu(stat_buf->inval_xmit_word_cnt);			ret_buf->inval_crc_cnt =			    le32_to_cpu(stat_buf->inval_crc_cnt);			DEBUG11(printk("%s(%ld): stat dump: fail_cnt=%d "			    "loss_sync=%d loss_sig=%d seq_err=%d "			    "inval_xmt_word=%d inval_crc=%d.\n", __func__,			    ha->host_no, stat_buf->link_fail_cnt,			    stat_buf->loss_sync_cnt, stat_buf->loss_sig_cnt,			    stat_buf->prim_seq_err_cnt,			    stat_buf->inval_xmit_word_cnt,			    stat_buf->inval_crc_cnt));		}	} else {		/* Failed. */		DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__,		    ha->host_no, rval));		rval = BIT_1;	}	dma_pool_free(ha->s_dma_pool, stat_buf, stat_buf_dma);	return rval;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?