📄 qla_gs.c
字号:
GA_NXT_SNS_DATA_SIZE); /* Prepare SNS command arguments -- port_id. */ sns_cmd->p.cmd.param[0] = fcport->d_id.b.al_pa; sns_cmd->p.cmd.param[1] = fcport->d_id.b.area; sns_cmd->p.cmd.param[2] = fcport->d_id.b.domain; /* Execute SNS command. */ rval = qla2x00_send_sns(ha, ha->sns_cmd_dma, GA_NXT_SNS_CMD_SIZE / 2, sizeof(struct sns_cmd_pkt)); if (rval != QLA_SUCCESS) { /*EMPTY*/ DEBUG2_3(printk("scsi(%ld): GA_NXT Send SNS failed (%d).\n", ha->host_no, rval)); } else if (sns_cmd->p.gan_data[8] != 0x80 || sns_cmd->p.gan_data[9] != 0x02) { DEBUG2_3(printk("scsi(%ld): GA_NXT failed, rejected request, " "ga_nxt_rsp:\n", ha->host_no)); DEBUG2_3(qla2x00_dump_buffer(sns_cmd->p.gan_data, 16)); rval = QLA_FUNCTION_FAILED; } else { /* Populate fc_port_t entry. */ fcport->d_id.b.domain = sns_cmd->p.gan_data[17]; fcport->d_id.b.area = sns_cmd->p.gan_data[18]; fcport->d_id.b.al_pa = sns_cmd->p.gan_data[19]; memcpy(fcport->node_name, &sns_cmd->p.gan_data[284], WWN_SIZE); memcpy(fcport->port_name, &sns_cmd->p.gan_data[20], WWN_SIZE); if (sns_cmd->p.gan_data[16] != NS_N_PORT_TYPE && sns_cmd->p.gan_data[16] != NS_NL_PORT_TYPE) fcport->d_id.b.domain = 0xf0; DEBUG2_3(printk("scsi(%ld): GA_NXT entry - " "nn %02x%02x%02x%02x%02x%02x%02x%02x " "pn %02x%02x%02x%02x%02x%02x%02x%02x " "portid=%02x%02x%02x.\n", ha->host_no, fcport->node_name[0], fcport->node_name[1], fcport->node_name[2], fcport->node_name[3], fcport->node_name[4], fcport->node_name[5], fcport->node_name[6], fcport->node_name[7], fcport->port_name[0], fcport->port_name[1], fcport->port_name[2], fcport->port_name[3], fcport->port_name[4], fcport->port_name[5], fcport->port_name[6], fcport->port_name[7], fcport->d_id.b.domain, fcport->d_id.b.area, fcport->d_id.b.al_pa)); } return (rval);}/** * qla2x00_sns_gid_pt() - SNS scan for fabric devices via GID_PT command. * @ha: HA context * @list: switch info entries to populate * * This command uses the old Exectute SNS Command mailbox routine. * * NOTE: Non-Nx_Ports are not requested. * * Returns 0 on success. */static intqla2x00_sns_gid_pt(scsi_qla_host_t *ha, sw_info_t *list){ int rval; uint16_t i; uint8_t *entry; struct sns_cmd_pkt *sns_cmd; /* Issue GID_PT. */ /* Prepare SNS command request. */ sns_cmd = qla2x00_prep_sns_cmd(ha, GID_PT_CMD, GID_PT_SNS_SCMD_LEN, GID_PT_SNS_DATA_SIZE); /* Prepare SNS command arguments -- port_type. */ sns_cmd->p.cmd.param[0] = NS_NX_PORT_TYPE; /* Execute SNS command. */ rval = qla2x00_send_sns(ha, ha->sns_cmd_dma, GID_PT_SNS_CMD_SIZE / 2, sizeof(struct sns_cmd_pkt)); if (rval != QLA_SUCCESS) { /*EMPTY*/ DEBUG2_3(printk("scsi(%ld): GID_PT Send SNS failed (%d).\n", ha->host_no, rval)); } else if (sns_cmd->p.gid_data[8] != 0x80 || sns_cmd->p.gid_data[9] != 0x02) { DEBUG2_3(printk("scsi(%ld): GID_PT failed, rejected request, " "gid_rsp:\n", ha->host_no)); DEBUG2_3(qla2x00_dump_buffer(sns_cmd->p.gid_data, 16)); rval = QLA_FUNCTION_FAILED; } else { /* Set port IDs in switch info list. */ for (i = 0; i < MAX_FIBRE_DEVICES; i++) { entry = &sns_cmd->p.gid_data[(i * 4) + 16]; list[i].d_id.b.domain = entry[1]; list[i].d_id.b.area = entry[2]; list[i].d_id.b.al_pa = entry[3]; /* Last one exit. */ if (entry[0] & BIT_7) { list[i].d_id.b.rsvd_1 = entry[0]; break; } } /* * If we've used all available slots, then the switch is * reporting back more devices that we can handle with this * single call. Return a failed status, and let GA_NXT handle * the overload. */ if (i == MAX_FIBRE_DEVICES) rval = QLA_FUNCTION_FAILED; } return (rval);}/** * qla2x00_sns_gpn_id() - SNS Get Port Name (GPN_ID) query. * @ha: HA context * @list: switch info entries to populate * * This command uses the old Exectute SNS Command mailbox routine. * * Returns 0 on success. */static intqla2x00_sns_gpn_id(scsi_qla_host_t *ha, sw_info_t *list){ int rval; uint16_t i; struct sns_cmd_pkt *sns_cmd; for (i = 0; i < MAX_FIBRE_DEVICES; i++) { /* Issue GPN_ID */ /* Prepare SNS command request. */ sns_cmd = qla2x00_prep_sns_cmd(ha, GPN_ID_CMD, GPN_ID_SNS_SCMD_LEN, GPN_ID_SNS_DATA_SIZE); /* Prepare SNS command arguments -- port_id. */ sns_cmd->p.cmd.param[0] = list[i].d_id.b.al_pa; sns_cmd->p.cmd.param[1] = list[i].d_id.b.area; sns_cmd->p.cmd.param[2] = list[i].d_id.b.domain; /* Execute SNS command. */ rval = qla2x00_send_sns(ha, ha->sns_cmd_dma, GPN_ID_SNS_CMD_SIZE / 2, sizeof(struct sns_cmd_pkt)); if (rval != QLA_SUCCESS) { /*EMPTY*/ DEBUG2_3(printk("scsi(%ld): GPN_ID Send SNS failed " "(%d).\n", ha->host_no, rval)); } else if (sns_cmd->p.gpn_data[8] != 0x80 || sns_cmd->p.gpn_data[9] != 0x02) { DEBUG2_3(printk("scsi(%ld): GPN_ID failed, rejected " "request, gpn_rsp:\n", ha->host_no)); DEBUG2_3(qla2x00_dump_buffer(sns_cmd->p.gpn_data, 16)); rval = QLA_FUNCTION_FAILED; } else { /* Save portname */ memcpy(list[i].port_name, &sns_cmd->p.gpn_data[16], WWN_SIZE); } /* Last device exit. */ if (list[i].d_id.b.rsvd_1 != 0) break; } return (rval);}/** * qla2x00_sns_gnn_id() - SNS Get Node Name (GNN_ID) query. * @ha: HA context * @list: switch info entries to populate * * This command uses the old Exectute SNS Command mailbox routine. * * Returns 0 on success. */static intqla2x00_sns_gnn_id(scsi_qla_host_t *ha, sw_info_t *list){ int rval; uint16_t i; struct sns_cmd_pkt *sns_cmd; for (i = 0; i < MAX_FIBRE_DEVICES; i++) { /* Issue GNN_ID */ /* Prepare SNS command request. */ sns_cmd = qla2x00_prep_sns_cmd(ha, GNN_ID_CMD, GNN_ID_SNS_SCMD_LEN, GNN_ID_SNS_DATA_SIZE); /* Prepare SNS command arguments -- port_id. */ sns_cmd->p.cmd.param[0] = list[i].d_id.b.al_pa; sns_cmd->p.cmd.param[1] = list[i].d_id.b.area; sns_cmd->p.cmd.param[2] = list[i].d_id.b.domain; /* Execute SNS command. */ rval = qla2x00_send_sns(ha, ha->sns_cmd_dma, GNN_ID_SNS_CMD_SIZE / 2, sizeof(struct sns_cmd_pkt)); if (rval != QLA_SUCCESS) { /*EMPTY*/ DEBUG2_3(printk("scsi(%ld): GNN_ID Send SNS failed " "(%d).\n", ha->host_no, rval)); } else if (sns_cmd->p.gnn_data[8] != 0x80 || sns_cmd->p.gnn_data[9] != 0x02) { DEBUG2_3(printk("scsi(%ld): GNN_ID failed, rejected " "request, gnn_rsp:\n", ha->host_no)); DEBUG2_3(qla2x00_dump_buffer(sns_cmd->p.gnn_data, 16)); rval = QLA_FUNCTION_FAILED; } else { /* Save nodename */ memcpy(list[i].node_name, &sns_cmd->p.gnn_data[16], WWN_SIZE); DEBUG2_3(printk("scsi(%ld): GID_PT entry - " "nn %02x%02x%02x%02x%02x%02x%02x%02x " "pn %02x%02x%02x%02x%02x%02x%02x%02x " "portid=%02x%02x%02x.\n", ha->host_no, list[i].node_name[0], list[i].node_name[1], list[i].node_name[2], list[i].node_name[3], list[i].node_name[4], list[i].node_name[5], list[i].node_name[6], list[i].node_name[7], list[i].port_name[0], list[i].port_name[1], list[i].port_name[2], list[i].port_name[3], list[i].port_name[4], list[i].port_name[5], list[i].port_name[6], list[i].port_name[7], list[i].d_id.b.domain, list[i].d_id.b.area, list[i].d_id.b.al_pa)); } /* Last device exit. */ if (list[i].d_id.b.rsvd_1 != 0) break; } return (rval);}/** * qla2x00_snd_rft_id() - SNS Register FC-4 TYPEs (RFT_ID) supported by the HBA. * @ha: HA context * * This command uses the old Exectute SNS Command mailbox routine. * * Returns 0 on success. */static intqla2x00_sns_rft_id(scsi_qla_host_t *ha){ int rval; struct sns_cmd_pkt *sns_cmd; /* Issue RFT_ID. */ /* Prepare SNS command request. */ sns_cmd = qla2x00_prep_sns_cmd(ha, RFT_ID_CMD, RFT_ID_SNS_SCMD_LEN, RFT_ID_SNS_DATA_SIZE); /* Prepare SNS command arguments -- port_id, FC-4 types */ sns_cmd->p.cmd.param[0] = ha->d_id.b.al_pa; sns_cmd->p.cmd.param[1] = ha->d_id.b.area; sns_cmd->p.cmd.param[2] = ha->d_id.b.domain; sns_cmd->p.cmd.param[5] = 0x01; /* FCP-3 */ /* Execute SNS command. */ rval = qla2x00_send_sns(ha, ha->sns_cmd_dma, RFT_ID_SNS_CMD_SIZE / 2, sizeof(struct sns_cmd_pkt)); if (rval != QLA_SUCCESS) { /*EMPTY*/ DEBUG2_3(printk("scsi(%ld): RFT_ID Send SNS failed (%d).\n", ha->host_no, rval)); } else if (sns_cmd->p.rft_data[8] != 0x80 || sns_cmd->p.rft_data[9] != 0x02) { DEBUG2_3(printk("scsi(%ld): RFT_ID failed, rejected request, " "rft_rsp:\n", ha->host_no)); DEBUG2_3(qla2x00_dump_buffer(sns_cmd->p.rft_data, 16)); rval = QLA_FUNCTION_FAILED; } else { DEBUG2(printk("scsi(%ld): RFT_ID exiting normally.\n", ha->host_no)); } return (rval);}/** * qla2x00_sns_rnn_id() - SNS Register Node Name (RNN_ID) of the HBA. * HBA. * @ha: HA context * * This command uses the old Exectute SNS Command mailbox routine. * * Returns 0 on success. */static intqla2x00_sns_rnn_id(scsi_qla_host_t *ha){ int rval; struct sns_cmd_pkt *sns_cmd; /* Issue RNN_ID. */ /* Prepare SNS command request. */ sns_cmd = qla2x00_prep_sns_cmd(ha, RNN_ID_CMD, RNN_ID_SNS_SCMD_LEN, RNN_ID_SNS_DATA_SIZE); /* Prepare SNS command arguments -- port_id, nodename. */ sns_cmd->p.cmd.param[0] = ha->d_id.b.al_pa; sns_cmd->p.cmd.param[1] = ha->d_id.b.area; sns_cmd->p.cmd.param[2] = ha->d_id.b.domain; sns_cmd->p.cmd.param[4] = ha->init_cb->node_name[7]; sns_cmd->p.cmd.param[5] = ha->init_cb->node_name[6]; sns_cmd->p.cmd.param[6] = ha->init_cb->node_name[5]; sns_cmd->p.cmd.param[7] = ha->init_cb->node_name[4]; sns_cmd->p.cmd.param[8] = ha->init_cb->node_name[3]; sns_cmd->p.cmd.param[9] = ha->init_cb->node_name[2]; sns_cmd->p.cmd.param[10] = ha->init_cb->node_name[1]; sns_cmd->p.cmd.param[11] = ha->init_cb->node_name[0]; /* Execute SNS command. */ rval = qla2x00_send_sns(ha, ha->sns_cmd_dma, RNN_ID_SNS_CMD_SIZE / 2, sizeof(struct sns_cmd_pkt)); if (rval != QLA_SUCCESS) { /*EMPTY*/ DEBUG2_3(printk("scsi(%ld): RNN_ID Send SNS failed (%d).\n", ha->host_no, rval)); } else if (sns_cmd->p.rnn_data[8] != 0x80 || sns_cmd->p.rnn_data[9] != 0x02) { DEBUG2_3(printk("scsi(%ld): RNN_ID failed, rejected request, " "rnn_rsp:\n", ha->host_no)); DEBUG2_3(qla2x00_dump_buffer(sns_cmd->p.rnn_data, 16)); rval = QLA_FUNCTION_FAILED; } else { DEBUG2(printk("scsi(%ld): RNN_ID exiting normally.\n", ha->host_no)); } return (rval);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -