qla_attr.c
来自「linux 内核源代码」· C语言 代码 · 共 1,253 行 · 第 1/3 页
C
1,253 行
{ scsi_qla_host_t *ha = shost_priv(shost); uint32_t speed = 0; switch (ha->link_data_rate) { case PORT_SPEED_1GB: speed = 1; break; case PORT_SPEED_2GB: speed = 2; break; case PORT_SPEED_4GB: speed = 4; break; } fc_host_speed(shost) = speed;}static voidqla2x00_get_host_port_type(struct Scsi_Host *shost){ scsi_qla_host_t *ha = shost_priv(shost); uint32_t port_type = FC_PORTTYPE_UNKNOWN; switch (ha->current_topology) { case ISP_CFG_NL: port_type = FC_PORTTYPE_LPORT; break; case ISP_CFG_FL: port_type = FC_PORTTYPE_NLPORT; break; case ISP_CFG_N: port_type = FC_PORTTYPE_PTP; break; case ISP_CFG_F: port_type = FC_PORTTYPE_NPORT; break; } fc_host_port_type(shost) = port_type;}static voidqla2x00_get_starget_node_name(struct scsi_target *starget){ struct Scsi_Host *host = dev_to_shost(starget->dev.parent); scsi_qla_host_t *ha = shost_priv(host); fc_port_t *fcport; u64 node_name = 0; list_for_each_entry(fcport, &ha->fcports, list) { if (starget->id == fcport->os_target_id) { node_name = wwn_to_u64(fcport->node_name); break; } } fc_starget_node_name(starget) = node_name;}static voidqla2x00_get_starget_port_name(struct scsi_target *starget){ struct Scsi_Host *host = dev_to_shost(starget->dev.parent); scsi_qla_host_t *ha = shost_priv(host); fc_port_t *fcport; u64 port_name = 0; list_for_each_entry(fcport, &ha->fcports, list) { if (starget->id == fcport->os_target_id) { port_name = wwn_to_u64(fcport->port_name); break; } } fc_starget_port_name(starget) = port_name;}static voidqla2x00_get_starget_port_id(struct scsi_target *starget){ struct Scsi_Host *host = dev_to_shost(starget->dev.parent); scsi_qla_host_t *ha = shost_priv(host); fc_port_t *fcport; uint32_t port_id = ~0U; list_for_each_entry(fcport, &ha->fcports, list) { if (starget->id == fcport->os_target_id) { port_id = fcport->d_id.b.domain << 16 | fcport->d_id.b.area << 8 | fcport->d_id.b.al_pa; break; } } fc_starget_port_id(starget) = port_id;}static voidqla2x00_get_rport_loss_tmo(struct fc_rport *rport){ struct Scsi_Host *host = rport_to_shost(rport); scsi_qla_host_t *ha = shost_priv(host); rport->dev_loss_tmo = ha->port_down_retry_count + 5;}static voidqla2x00_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout){ struct Scsi_Host *host = rport_to_shost(rport); scsi_qla_host_t *ha = shost_priv(host); if (timeout) ha->port_down_retry_count = timeout; else ha->port_down_retry_count = 1; rport->dev_loss_tmo = ha->port_down_retry_count + 5;}static intqla2x00_issue_lip(struct Scsi_Host *shost){ scsi_qla_host_t *ha = shost_priv(shost); set_bit(LOOP_RESET_NEEDED, &ha->dpc_flags); return 0;}static struct fc_host_statistics *qla2x00_get_fc_host_stats(struct Scsi_Host *shost){ scsi_qla_host_t *ha = shost_priv(shost); int rval; uint16_t mb_stat[1]; link_stat_t stat_buf; struct fc_host_statistics *pfc_host_stat; rval = QLA_FUNCTION_FAILED; pfc_host_stat = &ha->fc_host_stat; memset(pfc_host_stat, -1, sizeof(struct fc_host_statistics)); if (IS_FWI2_CAPABLE(ha)) { rval = qla24xx_get_isp_stats(ha, (uint32_t *)&stat_buf, sizeof(stat_buf) / 4, mb_stat); } else if (atomic_read(&ha->loop_state) == LOOP_READY && !test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags) && !test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags) && !ha->dpc_active) { /* Must be in a 'READY' state for statistics retrieval. */ rval = qla2x00_get_link_status(ha, ha->loop_id, &stat_buf, mb_stat); } if (rval != QLA_SUCCESS) goto done; pfc_host_stat->link_failure_count = stat_buf.link_fail_cnt; pfc_host_stat->loss_of_sync_count = stat_buf.loss_sync_cnt; pfc_host_stat->loss_of_signal_count = stat_buf.loss_sig_cnt; pfc_host_stat->prim_seq_protocol_err_count = stat_buf.prim_seq_err_cnt; pfc_host_stat->invalid_tx_word_count = stat_buf.inval_xmit_word_cnt; pfc_host_stat->invalid_crc_count = stat_buf.inval_crc_cnt;done: return pfc_host_stat;}static voidqla2x00_get_host_symbolic_name(struct Scsi_Host *shost){ scsi_qla_host_t *ha = shost_priv(shost); qla2x00_get_sym_node_name(ha, fc_host_symbolic_name(shost));}static voidqla2x00_set_host_system_hostname(struct Scsi_Host *shost){ scsi_qla_host_t *ha = shost_priv(shost); set_bit(REGISTER_FDMI_NEEDED, &ha->dpc_flags);}static voidqla2x00_get_host_fabric_name(struct Scsi_Host *shost){ scsi_qla_host_t *ha = shost_priv(shost); u64 node_name; if (ha->device_flags & SWITCH_FOUND) node_name = wwn_to_u64(ha->fabric_node_name); else node_name = wwn_to_u64(ha->node_name); fc_host_fabric_name(shost) = node_name;}static voidqla2x00_get_host_port_state(struct Scsi_Host *shost){ scsi_qla_host_t *ha = shost_priv(shost); if (!ha->flags.online) fc_host_port_state(shost) = FC_PORTSTATE_OFFLINE; else if (atomic_read(&ha->loop_state) == LOOP_TIMEOUT) fc_host_port_state(shost) = FC_PORTSTATE_UNKNOWN; else fc_host_port_state(shost) = FC_PORTSTATE_ONLINE;}static intqla24xx_vport_create(struct fc_vport *fc_vport, bool disable){ int ret = 0; scsi_qla_host_t *ha = shost_priv(fc_vport->shost); scsi_qla_host_t *vha; ret = qla24xx_vport_create_req_sanity_check(fc_vport); if (ret) { DEBUG15(printk("qla24xx_vport_create_req_sanity_check failed, " "status %x\n", ret)); return (ret); } vha = qla24xx_create_vhost(fc_vport); if (vha == NULL) { DEBUG15(printk ("qla24xx_create_vhost failed, vha = %p\n", vha)); return FC_VPORT_FAILED; } if (disable) { atomic_set(&vha->vp_state, VP_OFFLINE); fc_vport_set_state(fc_vport, FC_VPORT_DISABLED); } else atomic_set(&vha->vp_state, VP_FAILED); /* ready to create vport */ qla_printk(KERN_INFO, vha, "VP entry id %d assigned.\n", vha->vp_idx); /* initialized vport states */ atomic_set(&vha->loop_state, LOOP_DOWN); vha->vp_err_state= VP_ERR_PORTDWN; vha->vp_prev_err_state= VP_ERR_UNKWN; /* Check if physical ha port is Up */ if (atomic_read(&ha->loop_state) == LOOP_DOWN || atomic_read(&ha->loop_state) == LOOP_DEAD) { /* Don't retry or attempt login of this virtual port */ DEBUG15(printk ("scsi(%ld): pport loop_state is not UP.\n", vha->host_no)); atomic_set(&vha->loop_state, LOOP_DEAD); if (!disable) fc_vport_set_state(fc_vport, FC_VPORT_LINKDOWN); } if (scsi_add_host(vha->host, &fc_vport->dev)) { DEBUG15(printk("scsi(%ld): scsi_add_host failure for VP[%d].\n", vha->host_no, vha->vp_idx)); goto vport_create_failed_2; } /* initialize attributes */ fc_host_node_name(vha->host) = wwn_to_u64(vha->node_name); fc_host_port_name(vha->host) = wwn_to_u64(vha->port_name); fc_host_supported_classes(vha->host) = fc_host_supported_classes(ha->host); fc_host_supported_speeds(vha->host) = fc_host_supported_speeds(ha->host); qla24xx_vport_disable(fc_vport, disable); return 0;vport_create_failed_2: qla24xx_disable_vp(vha); qla24xx_deallocate_vp_id(vha); kfree(vha->port_name); kfree(vha->node_name); scsi_host_put(vha->host); return FC_VPORT_FAILED;}intqla24xx_vport_delete(struct fc_vport *fc_vport){ scsi_qla_host_t *ha = shost_priv(fc_vport->shost); scsi_qla_host_t *vha = fc_vport->dd_data; qla24xx_disable_vp(vha); qla24xx_deallocate_vp_id(vha); down(&ha->vport_sem); ha->cur_vport_count--; clear_bit(vha->vp_idx, (unsigned long *)ha->vp_idx_map); up(&ha->vport_sem); kfree(vha->node_name); kfree(vha->port_name); if (vha->timer_active) { qla2x00_vp_stop_timer(vha); DEBUG15(printk ("scsi(%ld): timer for the vport[%d] = %p " "has stopped\n", vha->host_no, vha->vp_idx, vha)); } fc_remove_host(vha->host); scsi_remove_host(vha->host); scsi_host_put(vha->host); return 0;}intqla24xx_vport_disable(struct fc_vport *fc_vport, bool disable){ scsi_qla_host_t *vha = fc_vport->dd_data; if (disable) qla24xx_disable_vp(vha); else qla24xx_enable_vp(vha); return 0;}struct fc_function_template qla2xxx_transport_functions = { .show_host_node_name = 1, .show_host_port_name = 1, .show_host_supported_classes = 1, .get_host_port_id = qla2x00_get_host_port_id, .show_host_port_id = 1, .get_host_speed = qla2x00_get_host_speed, .show_host_speed = 1, .get_host_port_type = qla2x00_get_host_port_type, .show_host_port_type = 1, .get_host_symbolic_name = qla2x00_get_host_symbolic_name, .show_host_symbolic_name = 1, .set_host_system_hostname = qla2x00_set_host_system_hostname, .show_host_system_hostname = 1, .get_host_fabric_name = qla2x00_get_host_fabric_name, .show_host_fabric_name = 1, .get_host_port_state = qla2x00_get_host_port_state, .show_host_port_state = 1, .dd_fcrport_size = sizeof(struct fc_port *), .show_rport_supported_classes = 1, .get_starget_node_name = qla2x00_get_starget_node_name, .show_starget_node_name = 1, .get_starget_port_name = qla2x00_get_starget_port_name, .show_starget_port_name = 1, .get_starget_port_id = qla2x00_get_starget_port_id, .show_starget_port_id = 1, .get_rport_dev_loss_tmo = qla2x00_get_rport_loss_tmo, .set_rport_dev_loss_tmo = qla2x00_set_rport_loss_tmo, .show_rport_dev_loss_tmo = 1, .issue_fc_host_lip = qla2x00_issue_lip, .get_fc_host_stats = qla2x00_get_fc_host_stats, .vport_create = qla24xx_vport_create, .vport_disable = qla24xx_vport_disable, .vport_delete = qla24xx_vport_delete,};struct fc_function_template qla2xxx_transport_vport_functions = { .show_host_node_name = 1, .show_host_port_name = 1, .show_host_supported_classes = 1, .get_host_port_id = qla2x00_get_host_port_id, .show_host_port_id = 1, .get_host_speed = qla2x00_get_host_speed, .show_host_speed = 1, .get_host_port_type = qla2x00_get_host_port_type, .show_host_port_type = 1, .get_host_symbolic_name = qla2x00_get_host_symbolic_name, .show_host_symbolic_name = 1, .set_host_system_hostname = qla2x00_set_host_system_hostname, .show_host_system_hostname = 1, .get_host_fabric_name = qla2x00_get_host_fabric_name, .show_host_fabric_name = 1, .get_host_port_state = qla2x00_get_host_port_state, .show_host_port_state = 1, .dd_fcrport_size = sizeof(struct fc_port *), .show_rport_supported_classes = 1, .get_starget_node_name = qla2x00_get_starget_node_name, .show_starget_node_name = 1, .get_starget_port_name = qla2x00_get_starget_port_name, .show_starget_port_name = 1, .get_starget_port_id = qla2x00_get_starget_port_id, .show_starget_port_id = 1, .get_rport_dev_loss_tmo = qla2x00_get_rport_loss_tmo, .set_rport_dev_loss_tmo = qla2x00_set_rport_loss_tmo, .show_rport_dev_loss_tmo = 1, .issue_fc_host_lip = qla2x00_issue_lip, .get_fc_host_stats = qla2x00_get_fc_host_stats,};voidqla2x00_init_host_attr(scsi_qla_host_t *ha){ fc_host_node_name(ha->host) = wwn_to_u64(ha->node_name); fc_host_port_name(ha->host) = wwn_to_u64(ha->port_name); fc_host_supported_classes(ha->host) = FC_COS_CLASS3; fc_host_max_npiv_vports(ha->host) = ha->max_npiv_vports;; fc_host_npiv_vports_inuse(ha->host) = ha->cur_vport_count;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?