/** * 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 int qla2x00_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); }
static int qla2x00_sns_gid_pt(scsi_qla_host_t *vha, sw_info_t *list) { int rval; struct qla_hw_data *ha = vha->hw; uint16_t i; uint8_t *entry; struct sns_cmd_pkt *sns_cmd; uint16_t gid_pt_sns_data_size; gid_pt_sns_data_size = qla2x00_gid_pt_rsp_size(vha); sns_cmd = qla2x00_prep_sns_cmd(vha, GID_PT_CMD, GID_PT_SNS_SCMD_LEN, gid_pt_sns_data_size); sns_cmd->p.cmd.param[0] = NS_NX_PORT_TYPE; rval = qla2x00_send_sns(vha, ha->sns_cmd_dma, GID_PT_SNS_CMD_SIZE / 2, sizeof(struct sns_cmd_pkt)); if (rval != QLA_SUCCESS) { ql_dbg(ql_dbg_disc, vha, 0x206d, "GID_PT Send SNS failed (%d).\n", rval); } else if (sns_cmd->p.gid_data[8] != 0x80 || sns_cmd->p.gid_data[9] != 0x02) { ql_dbg(ql_dbg_disc, vha, 0x202f, "GID_PT failed, rejected request, gid_rsp:\n"); ql_dump_buffer(ql_dbg_disc + ql_dbg_buffer, vha, 0x2081, sns_cmd->p.gid_data, 16); rval = QLA_FUNCTION_FAILED; } else { for (i = 0; i < ha->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]; if (entry[0] & BIT_7) { list[i].d_id.b.rsvd_1 = entry[0]; break; } } if (i == ha->max_fibre_devices) rval = QLA_FUNCTION_FAILED; } 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 int qla2x00_sns_rnn_id(scsi_qla_host_t *vha) { int rval; struct qla_hw_data *ha = vha->hw; struct sns_cmd_pkt *sns_cmd; /* Issue RNN_ID. */ /* Prepare SNS command request. */ sns_cmd = qla2x00_prep_sns_cmd(vha, 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] = vha->d_id.b.al_pa; sns_cmd->p.cmd.param[1] = vha->d_id.b.area; sns_cmd->p.cmd.param[2] = vha->d_id.b.domain; sns_cmd->p.cmd.param[4] = vha->node_name[7]; sns_cmd->p.cmd.param[5] = vha->node_name[6]; sns_cmd->p.cmd.param[6] = vha->node_name[5]; sns_cmd->p.cmd.param[7] = vha->node_name[4]; sns_cmd->p.cmd.param[8] = vha->node_name[3]; sns_cmd->p.cmd.param[9] = vha->node_name[2]; sns_cmd->p.cmd.param[10] = vha->node_name[1]; sns_cmd->p.cmd.param[11] = vha->node_name[0]; /* Execute SNS command. */ rval = qla2x00_send_sns(vha, ha->sns_cmd_dma, RNN_ID_SNS_CMD_SIZE / 2, sizeof(struct sns_cmd_pkt)); if (rval != QLA_SUCCESS) { /*EMPTY*/ ql_dbg(ql_dbg_disc, vha, 0x204a, "RNN_ID Send SNS failed (%d).\n", rval); } else if (sns_cmd->p.rnn_data[8] != 0x80 || sns_cmd->p.rnn_data[9] != 0x02) { ql_dbg(ql_dbg_disc + ql_dbg_buffer, vha, 0x207b, "RNN_ID failed, rejected request, rnn_rsp:\n"); ql_dump_buffer(ql_dbg_disc + ql_dbg_buffer, vha, 0x207c, sns_cmd->p.rnn_data, 16); rval = QLA_FUNCTION_FAILED; } else { ql_dbg(ql_dbg_disc, vha, 0x204c, "RNN_ID exiting normally.\n"); } 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 int qla2x00_sns_gpn_id(scsi_qla_host_t *vha, sw_info_t *list) { int rval = QLA_SUCCESS; struct qla_hw_data *ha = vha->hw; uint16_t i; struct sns_cmd_pkt *sns_cmd; for (i = 0; i < ha->max_fibre_devices; i++) { /* Issue GPN_ID */ /* Prepare SNS command request. */ sns_cmd = qla2x00_prep_sns_cmd(vha, 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(vha, ha->sns_cmd_dma, GPN_ID_SNS_CMD_SIZE / 2, sizeof(struct sns_cmd_pkt)); if (rval != QLA_SUCCESS) { /*EMPTY*/ ql_dbg(ql_dbg_disc, vha, 0x2032, "GPN_ID Send SNS failed (%d).\n", rval); } else if (sns_cmd->p.gpn_data[8] != 0x80 || sns_cmd->p.gpn_data[9] != 0x02) { ql_dbg(ql_dbg_disc + ql_dbg_buffer, vha, 0x207e, "GPN_ID failed, rejected request, gpn_rsp:\n"); ql_dump_buffer(ql_dbg_disc, vha, 0x207f, 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_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 int qla2x00_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); }
/** * 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 int qla2x00_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_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 int qla2x00_sns_rft_id(scsi_qla_host_t *vha) { int rval; struct qla_hw_data *ha = vha->hw; struct sns_cmd_pkt *sns_cmd; /* Issue RFT_ID. */ /* Prepare SNS command request. */ sns_cmd = qla2x00_prep_sns_cmd(vha, 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] = vha->d_id.b.al_pa; sns_cmd->p.cmd.param[1] = vha->d_id.b.area; sns_cmd->p.cmd.param[2] = vha->d_id.b.domain; sns_cmd->p.cmd.param[5] = 0x01; /* FCP-3 */ /* Execute SNS command. */ rval = qla2x00_send_sns(vha, ha->sns_cmd_dma, RFT_ID_SNS_CMD_SIZE / 2, sizeof(struct sns_cmd_pkt)); if (rval != QLA_SUCCESS) { /*EMPTY*/ ql_dbg(ql_dbg_disc, vha, 0x2060, "RFT_ID Send SNS failed (%d).\n", rval); } else if (sns_cmd->p.rft_data[8] != 0x80 || sns_cmd->p.rft_data[9] != 0x02) { ql_dbg(ql_dbg_disc + ql_dbg_buffer, vha, 0x2083, "RFT_ID failed, rejected request rft_rsp:\n"); ql_dump_buffer(ql_dbg_disc + ql_dbg_buffer, vha, 0x2080, sns_cmd->p.rft_data, 16); rval = QLA_FUNCTION_FAILED; } else { ql_dbg(ql_dbg_disc, vha, 0x2073, "RFT_ID exiting normally.\n"); } 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 int qla2x00_sns_gid_pt(scsi_qla_host_t *vha, sw_info_t *list) { int rval; struct qla_hw_data *ha = vha->hw; uint16_t i; uint8_t *entry; struct sns_cmd_pkt *sns_cmd; uint16_t gid_pt_sns_data_size; gid_pt_sns_data_size = qla2x00_gid_pt_rsp_size(vha); /* Issue GID_PT. */ /* Prepare SNS command request. */ sns_cmd = qla2x00_prep_sns_cmd(vha, 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(vha, ha->sns_cmd_dma, GID_PT_SNS_CMD_SIZE / 2, sizeof(struct sns_cmd_pkt)); if (rval != QLA_SUCCESS) { /*EMPTY*/ ql_dbg(ql_dbg_disc, vha, 0x206d, "GID_PT Send SNS failed (%d).\n", rval); } else if (sns_cmd->p.gid_data[8] != 0x80 || sns_cmd->p.gid_data[9] != 0x02) { ql_dbg(ql_dbg_disc, vha, 0x202f, "GID_PT failed, rejected request, gid_rsp:\n"); ql_dump_buffer(ql_dbg_disc + ql_dbg_buffer, vha, 0x2081, sns_cmd->p.gid_data, 16); rval = QLA_FUNCTION_FAILED; } else { /* Set port IDs in switch info list. */ for (i = 0; i < ha->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 == ha->max_fibre_devices) rval = QLA_FUNCTION_FAILED; } return (rval); }
/** * qla2x00_sns_ga_nxt() - SNS scan for fabric devices via GA_NXT command. * @ha: HA context * @fcport: fcport entry to updated * * This command uses the old Exectute SNS Command mailbox routine. * * Returns 0 on success. */ static int qla2x00_sns_ga_nxt(scsi_qla_host_t *vha, fc_port_t *fcport) { int rval = QLA_SUCCESS; struct qla_hw_data *ha = vha->hw; struct sns_cmd_pkt *sns_cmd; /* Issue GA_NXT. */ /* Prepare SNS command request. */ sns_cmd = qla2x00_prep_sns_cmd(vha, GA_NXT_CMD, GA_NXT_SNS_SCMD_LEN, 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(vha, ha->sns_cmd_dma, GA_NXT_SNS_CMD_SIZE / 2, sizeof(struct sns_cmd_pkt)); if (rval != QLA_SUCCESS) { /*EMPTY*/ ql_dbg(ql_dbg_disc, vha, 0x205f, "GA_NXT Send SNS failed (%d).\n", rval); } else if (sns_cmd->p.gan_data[8] != 0x80 || sns_cmd->p.gan_data[9] != 0x02) { ql_dbg(ql_dbg_disc + ql_dbg_buffer, vha, 0x2084, "GA_NXT failed, rejected request ga_nxt_rsp:\n"); ql_dump_buffer(ql_dbg_disc + ql_dbg_buffer, vha, 0x2074, 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; ql_dbg(ql_dbg_disc, vha, 0x2061, "GA_NXT entry - nn %02x%02x%02x%02x%02x%02x%02x%02x " "pn %02x%02x%02x%02x%02x%02x%02x%02x " "port_id=%02x%02x%02x.\n", 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); }
static int qla2x00_sns_gnn_id(scsi_qla_host_t *vha, sw_info_t *list) { int rval = QLA_SUCCESS; struct qla_hw_data *ha = vha->hw; uint16_t i; struct sns_cmd_pkt *sns_cmd; for (i = 0; i < ha->max_fibre_devices; i++) { sns_cmd = qla2x00_prep_sns_cmd(vha, GNN_ID_CMD, GNN_ID_SNS_SCMD_LEN, GNN_ID_SNS_DATA_SIZE); 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; rval = qla2x00_send_sns(vha, ha->sns_cmd_dma, GNN_ID_SNS_CMD_SIZE / 2, sizeof(struct sns_cmd_pkt)); if (rval != QLA_SUCCESS) { ql_dbg(ql_dbg_disc, vha, 0x203f, "GNN_ID Send SNS failed (%d).\n", rval); } else if (sns_cmd->p.gnn_data[8] != 0x80 || sns_cmd->p.gnn_data[9] != 0x02) { ql_dbg(ql_dbg_disc + ql_dbg_buffer, vha, 0x2082, "GNN_ID failed, rejected request, gnn_rsp:\n"); ql_dump_buffer(ql_dbg_disc + ql_dbg_buffer, vha, 0x207a, sns_cmd->p.gnn_data, 16); rval = QLA_FUNCTION_FAILED; } else { memcpy(list[i].node_name, &sns_cmd->p.gnn_data[16], WWN_SIZE); ql_dbg(ql_dbg_disc, vha, 0x206e, "GID_PT entry - nn %02x%02x%02x%02x%02x%02x%02x%02x " "pn %02x%02x%02x%02x%02x%02x%02x%02x " "port_id=%02x%02x%02x.\n", 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); } if (list[i].d_id.b.rsvd_1 != 0) break; } return (rval); }