qla_attr.c

来自「linux2.6.16版本」· C语言 代码 · 共 814 行 · 第 1/2 页

C
814
字号
static ssize_tqla2x00_state_show(struct class_device *cdev, char *buf){	scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev));	int len = 0;	if (atomic_read(&ha->loop_state) == LOOP_DOWN ||	    atomic_read(&ha->loop_state) == LOOP_DEAD)		len = snprintf(buf, PAGE_SIZE, "Link Down\n");	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))		len = snprintf(buf, PAGE_SIZE, "Unknown Link State\n");	else {		len = snprintf(buf, PAGE_SIZE, "Link Up - ");		switch (ha->current_topology) {		case ISP_CFG_NL:			len += snprintf(buf + len, PAGE_SIZE-len, "Loop\n");			break;		case ISP_CFG_FL:			len += snprintf(buf + len, PAGE_SIZE-len, "FL_Port\n");			break;		case ISP_CFG_N:			len += snprintf(buf + len, PAGE_SIZE-len,			    "N_Port to N_Port\n");			break;		case ISP_CFG_F:			len += snprintf(buf + len, PAGE_SIZE-len, "F_Port\n");			break;		default:			len += snprintf(buf + len, PAGE_SIZE-len, "Loop\n");			break;		}	}	return len;}static ssize_tqla2x00_zio_show(struct class_device *cdev, char *buf){	scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev));	int len = 0;	switch (ha->zio_mode) {	case QLA_ZIO_MODE_5:		len += snprintf(buf + len, PAGE_SIZE-len, "Mode 5\n");		break;	case QLA_ZIO_MODE_6:		len += snprintf(buf + len, PAGE_SIZE-len, "Mode 6\n");		break;	case QLA_ZIO_DISABLED:		len += snprintf(buf + len, PAGE_SIZE-len, "Disabled\n");		break;	}	return len;}static ssize_tqla2x00_zio_store(struct class_device *cdev, const char *buf, size_t count){	scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev));	int val = 0;	uint16_t zio_mode;	if (sscanf(buf, "%d", &val) != 1)		return -EINVAL;	switch (val) {	case 1:		zio_mode = QLA_ZIO_MODE_5;		break;	case 2:		zio_mode = QLA_ZIO_MODE_6;		break;	default:		zio_mode = QLA_ZIO_DISABLED;		break;	}	/* Update per-hba values and queue a reset. */	if (zio_mode != QLA_ZIO_DISABLED || ha->zio_mode != QLA_ZIO_DISABLED) {		ha->zio_mode = zio_mode;		set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);	}	return strlen(buf);}static ssize_tqla2x00_zio_timer_show(struct class_device *cdev, char *buf){	scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev));	return snprintf(buf, PAGE_SIZE, "%d us\n", ha->zio_timer * 100);}static ssize_tqla2x00_zio_timer_store(struct class_device *cdev, const char *buf,    size_t count){	scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev));	int val = 0;	uint16_t zio_timer;	if (sscanf(buf, "%d", &val) != 1)		return -EINVAL;	if (val > 25500 || val < 100)		return -ERANGE;	zio_timer = (uint16_t)(val / 100);	ha->zio_timer = zio_timer;	return strlen(buf);}static ssize_tqla2x00_beacon_show(struct class_device *cdev, char *buf){	scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev));	int len = 0;	if (ha->beacon_blink_led)		len += snprintf(buf + len, PAGE_SIZE-len, "Enabled\n");	else		len += snprintf(buf + len, PAGE_SIZE-len, "Disabled\n");	return len;}static ssize_tqla2x00_beacon_store(struct class_device *cdev, const char *buf,    size_t count){	scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev));	int val = 0;	int rval;	if (IS_QLA2100(ha) || IS_QLA2200(ha))		return -EPERM;	if (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) {		qla_printk(KERN_WARNING, ha,		    "Abort ISP active -- ignoring beacon request.\n");		return -EBUSY;	}	if (sscanf(buf, "%d", &val) != 1)		return -EINVAL;	if (val)		rval = ha->isp_ops.beacon_on(ha);	else		rval = ha->isp_ops.beacon_off(ha);	if (rval != QLA_SUCCESS)		count = 0;	return count;}static CLASS_DEVICE_ATTR(driver_version, S_IRUGO, qla2x00_drvr_version_show,	NULL);static CLASS_DEVICE_ATTR(fw_version, S_IRUGO, qla2x00_fw_version_show, NULL);static CLASS_DEVICE_ATTR(serial_num, S_IRUGO, qla2x00_serial_num_show, NULL);static CLASS_DEVICE_ATTR(isp_name, S_IRUGO, qla2x00_isp_name_show, NULL);static CLASS_DEVICE_ATTR(isp_id, S_IRUGO, qla2x00_isp_id_show, NULL);static CLASS_DEVICE_ATTR(model_name, S_IRUGO, qla2x00_model_name_show, NULL);static CLASS_DEVICE_ATTR(model_desc, S_IRUGO, qla2x00_model_desc_show, NULL);static CLASS_DEVICE_ATTR(pci_info, S_IRUGO, qla2x00_pci_info_show, NULL);static CLASS_DEVICE_ATTR(state, S_IRUGO, qla2x00_state_show, NULL);static CLASS_DEVICE_ATTR(zio, S_IRUGO | S_IWUSR, qla2x00_zio_show,    qla2x00_zio_store);static CLASS_DEVICE_ATTR(zio_timer, S_IRUGO | S_IWUSR, qla2x00_zio_timer_show,    qla2x00_zio_timer_store);static CLASS_DEVICE_ATTR(beacon, S_IRUGO | S_IWUSR, qla2x00_beacon_show,    qla2x00_beacon_store);struct class_device_attribute *qla2x00_host_attrs[] = {	&class_device_attr_driver_version,	&class_device_attr_fw_version,	&class_device_attr_serial_num,	&class_device_attr_isp_name,	&class_device_attr_isp_id,	&class_device_attr_model_name,	&class_device_attr_model_desc,	&class_device_attr_pci_info,	&class_device_attr_state,	&class_device_attr_zio,	&class_device_attr_zio_timer,	&class_device_attr_beacon,	NULL,};/* Host attributes. */static voidqla2x00_get_host_port_id(struct Scsi_Host *shost){	scsi_qla_host_t *ha = to_qla_host(shost);	fc_host_port_id(shost) = ha->d_id.b.domain << 16 |	    ha->d_id.b.area << 8 | ha->d_id.b.al_pa;}static voidqla2x00_get_host_speed(struct Scsi_Host *shost){	scsi_qla_host_t *ha = to_qla_host(shost);	uint32_t speed = 0;	switch (ha->link_data_rate) {	case LDR_1GB:		speed = 1;		break;	case LDR_2GB:		speed = 2;		break;	case LDR_4GB:		speed = 4;		break;	}	fc_host_speed(shost) = speed;}static voidqla2x00_get_host_port_type(struct Scsi_Host *shost){	scsi_qla_host_t *ha = to_qla_host(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 = to_qla_host(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 = to_qla_host(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 = to_qla_host(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 = to_qla_host(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 = to_qla_host(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 = to_qla_host(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 = to_qla_host(shost);	int rval;	uint16_t mb_stat[1];	link_stat_t stat_buf;	struct fc_host_statistics *pfc_host_stat;	pfc_host_stat = &ha->fc_host_stat;	memset(pfc_host_stat, -1, sizeof(struct fc_host_statistics));	if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) {		rval = qla24xx_get_isp_stats(ha, (uint32_t *)&stat_buf,		    sizeof(stat_buf) / 4, mb_stat);	} else {		rval = qla2x00_get_link_status(ha, ha->loop_id, &stat_buf,		    mb_stat);	}	if (rval != 0) {		qla_printk(KERN_WARNING, ha,		    "Unable to retrieve host statistics (%d).\n", mb_stat[0]);		return pfc_host_stat;	}	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;	return pfc_host_stat;}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,	.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;}

⌨️ 快捷键说明

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