int qla2x00_fdmi_register(scsi_qla_host_t *vha) { int rval; struct qla_hw_data *ha = vha->hw; if (IS_QLA2100(ha) || IS_QLA2200(ha)) return QLA_FUNCTION_FAILED; rval = qla2x00_mgmt_svr_login(vha); if (rval) return rval; rval = qla2x00_fdmi_rhba(vha); if (rval) { if (rval != QLA_ALREADY_REGISTERED) return rval; rval = qla2x00_fdmi_dhba(vha); if (rval) return rval; rval = qla2x00_fdmi_rhba(vha); if (rval) return rval; } rval = qla2x00_fdmi_rpa(vha); return rval; }
/** * qla2x00_fdmi_register() - * @ha: HA context * * Returns 0 on success. */ int qla2x00_fdmi_register(scsi_qla_host_t *ha) { int rval; rval = qla2x00_mgmt_svr_login(ha); if (rval) return rval; rval = qla2x00_fdmi_rhba(ha); if (rval) { if (rval != QLA_ALREADY_REGISTERED) return rval; rval = qla2x00_fdmi_dhba(ha); if (rval) return rval; rval = qla2x00_fdmi_rhba(ha); if (rval) return rval; } rval = qla2x00_fdmi_rpa(ha); return rval; }
int qla2x00_gpsc(scsi_qla_host_t *vha, sw_info_t *list) { int rval; uint16_t i; struct qla_hw_data *ha = vha->hw; ms_iocb_entry_t *ms_pkt; struct ct_sns_req *ct_req; struct ct_sns_rsp *ct_rsp; if (!IS_IIDMA_CAPABLE(ha)) return QLA_FUNCTION_FAILED; if (!ha->flags.gpsc_supported) return QLA_FUNCTION_FAILED; rval = qla2x00_mgmt_svr_login(vha); if (rval) return rval; for (i = 0; i < ha->max_fibre_devices; i++) { ms_pkt = qla24xx_prep_ms_fm_iocb(vha, GPSC_REQ_SIZE, GPSC_RSP_SIZE); ct_req = qla24xx_prep_ct_fm_req(&ha->ct_sns->p.req, GPSC_CMD, GPSC_RSP_SIZE); ct_rsp = &ha->ct_sns->p.rsp; memcpy(ct_req->req.gpsc.port_name, list[i].fabric_port_name, WWN_SIZE); rval = qla2x00_issue_iocb(vha, ha->ms_iocb, ha->ms_iocb_dma, sizeof(ms_iocb_entry_t)); if (rval != QLA_SUCCESS) { ql_dbg(ql_dbg_disc, vha, 0x2059, "GPSC issue IOCB failed (%d).\n", rval); } else if ((rval = qla2x00_chk_ms_status(vha, ms_pkt, ct_rsp, "GPSC")) != QLA_SUCCESS) { if (rval == QLA_INVALID_COMMAND && (ct_rsp->header.reason_code == CT_REASON_INVALID_COMMAND_CODE || ct_rsp->header.reason_code == CT_REASON_COMMAND_UNSUPPORTED)) { ql_dbg(ql_dbg_disc, vha, 0x205a, "GPSC command unsupported, disabling " "query.\n"); ha->flags.gpsc_supported = 0; rval = QLA_FUNCTION_FAILED; break; } rval = QLA_FUNCTION_FAILED; } else { switch (be16_to_cpu(ct_rsp->rsp.gpsc.speed)) { case BIT_15: list[i].fp_speed = PORT_SPEED_1GB; break; case BIT_14: list[i].fp_speed = PORT_SPEED_2GB; break; case BIT_13: list[i].fp_speed = PORT_SPEED_4GB; break; case BIT_12: list[i].fp_speed = PORT_SPEED_10GB; break; case BIT_11: list[i].fp_speed = PORT_SPEED_8GB; break; } ql_dbg(ql_dbg_disc, vha, 0x205b, "GPSC ext entry - fpn " "%02x%02x%02x%02x%02x%02x%02x%02x speeds=%04x " "speed=%04x.\n", list[i].fabric_port_name[0], list[i].fabric_port_name[1], list[i].fabric_port_name[2], list[i].fabric_port_name[3], list[i].fabric_port_name[4], list[i].fabric_port_name[5], list[i].fabric_port_name[6], list[i].fabric_port_name[7], be16_to_cpu(ct_rsp->rsp.gpsc.speeds), be16_to_cpu(ct_rsp->rsp.gpsc.speed)); } if (list[i].d_id.b.rsvd_1 != 0) break; } return (rval); }