mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-19 02:34:01 +08:00
[SCSI] qla2xxx: Add host attributes.
Export additional host information via the shost_attrs member in the scsi_host template. Attributes include: driver version, firmware version, ISP serial number, ISP type, ISP product ID, HBA model name, HBA model description, PCI interconnect information, and HBA port state. Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
parent
ce7e4af7f5
commit
afb046e2be
@ -211,6 +211,138 @@ qla2x00_free_sysfs_attr(scsi_qla_host_t *ha)
|
||||
sysfs_remove_bin_file(&host->shost_gendev.kobj, &sysfs_nvram_attr);
|
||||
}
|
||||
|
||||
/* Scsi_Host attributes. */
|
||||
|
||||
static ssize_t
|
||||
qla2x00_drvr_version_show(struct class_device *cdev, char *buf)
|
||||
{
|
||||
return snprintf(buf, PAGE_SIZE, "%s\n", qla2x00_version_str);
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
qla2x00_fw_version_show(struct class_device *cdev, char *buf)
|
||||
{
|
||||
scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev));
|
||||
char fw_str[30];
|
||||
|
||||
return snprintf(buf, PAGE_SIZE, "%s\n",
|
||||
ha->isp_ops.fw_version_str(ha, fw_str));
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
qla2x00_serial_num_show(struct class_device *cdev, char *buf)
|
||||
{
|
||||
scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev));
|
||||
uint32_t sn;
|
||||
|
||||
sn = ((ha->serial0 & 0x1f) << 16) | (ha->serial2 << 8) | ha->serial1;
|
||||
return snprintf(buf, PAGE_SIZE, "%c%05d\n", 'A' + sn / 100000,
|
||||
sn % 100000);
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
qla2x00_isp_name_show(struct class_device *cdev, char *buf)
|
||||
{
|
||||
scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev));
|
||||
return snprintf(buf, PAGE_SIZE, "%s\n", ha->brd_info->isp_name);
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
qla2x00_isp_id_show(struct class_device *cdev, char *buf)
|
||||
{
|
||||
scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev));
|
||||
return snprintf(buf, PAGE_SIZE, "%04x %04x %04x %04x\n",
|
||||
ha->product_id[0], ha->product_id[1], ha->product_id[2],
|
||||
ha->product_id[3]);
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
qla2x00_model_name_show(struct class_device *cdev, char *buf)
|
||||
{
|
||||
scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev));
|
||||
return snprintf(buf, PAGE_SIZE, "%s\n", ha->model_number);
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
qla2x00_model_desc_show(struct class_device *cdev, char *buf)
|
||||
{
|
||||
scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev));
|
||||
return snprintf(buf, PAGE_SIZE, "%s\n",
|
||||
ha->model_desc ? ha->model_desc: "");
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
qla2x00_pci_info_show(struct class_device *cdev, char *buf)
|
||||
{
|
||||
scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev));
|
||||
char pci_info[30];
|
||||
|
||||
return snprintf(buf, PAGE_SIZE, "%s\n",
|
||||
ha->isp_ops.pci_info_str(ha, pci_info));
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
qla2x00_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 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);
|
||||
|
||||
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,
|
||||
NULL,
|
||||
};
|
||||
|
||||
/* Host attributes. */
|
||||
|
||||
static void
|
||||
|
@ -290,6 +290,8 @@ extern void qla2x00_cancel_io_descriptors(scsi_qla_host_t *);
|
||||
/*
|
||||
* Global Function Prototypes in qla_attr.c source file.
|
||||
*/
|
||||
struct class_device_attribute;
|
||||
extern struct class_device_attribute *qla2x00_host_attrs[];
|
||||
struct fc_function_template;
|
||||
extern struct fc_function_template qla2xxx_transport_functions;
|
||||
extern void qla2x00_alloc_sysfs_attr(scsi_qla_host_t *);
|
||||
|
@ -140,6 +140,7 @@ static struct scsi_host_template qla2x00_driver_template = {
|
||||
* which equates to 0x800000 sectors.
|
||||
*/
|
||||
.max_sectors = 0xFFFF,
|
||||
.shost_attrs = qla2x00_host_attrs,
|
||||
};
|
||||
|
||||
static struct scsi_host_template qla24xx_driver_template = {
|
||||
@ -164,6 +165,7 @@ static struct scsi_host_template qla24xx_driver_template = {
|
||||
.sg_tablesize = SG_ALL,
|
||||
|
||||
.max_sectors = 0xFFFF,
|
||||
.shost_attrs = qla2x00_host_attrs,
|
||||
};
|
||||
|
||||
static struct scsi_transport_template *qla2xxx_transport_template = NULL;
|
||||
|
Loading…
Reference in New Issue
Block a user