17ad633c0SHarish Zunjarrao /* 27ad633c0SHarish Zunjarrao * QLogic iSCSI HBA Driver 37ad633c0SHarish Zunjarrao * Copyright (c) 2003-2011 QLogic Corporation 47ad633c0SHarish Zunjarrao * 57ad633c0SHarish Zunjarrao * See LICENSE.qla4xxx for copyright and licensing details. 67ad633c0SHarish Zunjarrao */ 77ad633c0SHarish Zunjarrao 87ad633c0SHarish Zunjarrao #include "ql4_def.h" 97ad633c0SHarish Zunjarrao #include "ql4_glbl.h" 107ad633c0SHarish Zunjarrao #include "ql4_dbg.h" 117ad633c0SHarish Zunjarrao 12068237c8STej Parkash static ssize_t 13068237c8STej Parkash qla4_8xxx_sysfs_read_fw_dump(struct file *filep, struct kobject *kobj, 14068237c8STej Parkash struct bin_attribute *ba, char *buf, loff_t off, 15068237c8STej Parkash size_t count) 16068237c8STej Parkash { 17068237c8STej Parkash struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj, 18068237c8STej Parkash struct device, kobj))); 19068237c8STej Parkash 20ee996a69SVikas Chaudhary if (is_qla40XX(ha)) 21068237c8STej Parkash return -EINVAL; 22068237c8STej Parkash 23068237c8STej Parkash if (!test_bit(AF_82XX_DUMP_READING, &ha->flags)) 24068237c8STej Parkash return 0; 25068237c8STej Parkash 26068237c8STej Parkash return memory_read_from_buffer(buf, count, &off, ha->fw_dump, 27068237c8STej Parkash ha->fw_dump_size); 28068237c8STej Parkash } 29068237c8STej Parkash 30068237c8STej Parkash static ssize_t 31068237c8STej Parkash qla4_8xxx_sysfs_write_fw_dump(struct file *filep, struct kobject *kobj, 32068237c8STej Parkash struct bin_attribute *ba, char *buf, loff_t off, 33068237c8STej Parkash size_t count) 34068237c8STej Parkash { 35068237c8STej Parkash struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj, 36068237c8STej Parkash struct device, kobj))); 37068237c8STej Parkash uint32_t dev_state; 38068237c8STej Parkash long reading; 39068237c8STej Parkash int ret = 0; 40068237c8STej Parkash 41ee996a69SVikas Chaudhary if (is_qla40XX(ha)) 42068237c8STej Parkash return -EINVAL; 43068237c8STej Parkash 44068237c8STej Parkash if (off != 0) 45068237c8STej Parkash return ret; 46068237c8STej Parkash 47068237c8STej Parkash buf[1] = 0; 48068237c8STej Parkash ret = kstrtol(buf, 10, &reading); 49068237c8STej Parkash if (ret) { 50068237c8STej Parkash ql4_printk(KERN_ERR, ha, "%s: Invalid input. Return err %d\n", 51068237c8STej Parkash __func__, ret); 52068237c8STej Parkash return ret; 53068237c8STej Parkash } 54068237c8STej Parkash 55068237c8STej Parkash switch (reading) { 56068237c8STej Parkash case 0: 57068237c8STej Parkash /* clear dump collection flags */ 58068237c8STej Parkash if (test_and_clear_bit(AF_82XX_DUMP_READING, &ha->flags)) { 59068237c8STej Parkash clear_bit(AF_82XX_FW_DUMPED, &ha->flags); 60068237c8STej Parkash /* Reload minidump template */ 61068237c8STej Parkash qla4xxx_alloc_fw_dump(ha); 62068237c8STej Parkash DEBUG2(ql4_printk(KERN_INFO, ha, 63068237c8STej Parkash "Firmware template reloaded\n")); 64068237c8STej Parkash } 65068237c8STej Parkash break; 66068237c8STej Parkash case 1: 67068237c8STej Parkash /* Set flag to read dump */ 68068237c8STej Parkash if (test_bit(AF_82XX_FW_DUMPED, &ha->flags) && 69068237c8STej Parkash !test_bit(AF_82XX_DUMP_READING, &ha->flags)) { 70068237c8STej Parkash set_bit(AF_82XX_DUMP_READING, &ha->flags); 71068237c8STej Parkash DEBUG2(ql4_printk(KERN_INFO, ha, 72068237c8STej Parkash "Raw firmware dump ready for read on (%ld).\n", 73068237c8STej Parkash ha->host_no)); 74068237c8STej Parkash } 75068237c8STej Parkash break; 76068237c8STej Parkash case 2: 779661975fSVikas Chaudhary /* Reset HBA and collect FW dump */ 7833693c7aSVikas Chaudhary ha->isp_ops->idc_lock(ha); 7933693c7aSVikas Chaudhary dev_state = qla4_8xxx_rd_direct(ha, QLA8XXX_CRB_DEV_STATE); 80de8c72daSVikas Chaudhary if (dev_state == QLA8XXX_DEV_READY) { 819661975fSVikas Chaudhary ql4_printk(KERN_INFO, ha, "%s: Setting Need reset\n", 829661975fSVikas Chaudhary __func__); 8333693c7aSVikas Chaudhary qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE, 84de8c72daSVikas Chaudhary QLA8XXX_DEV_NEED_RESET); 859661975fSVikas Chaudhary if (is_qla8022(ha) || 869661975fSVikas Chaudhary (is_qla8032(ha) && 879661975fSVikas Chaudhary qla4_83xx_can_perform_reset(ha))) { 88de8c72daSVikas Chaudhary set_bit(AF_8XXX_RST_OWNER, &ha->flags); 899661975fSVikas Chaudhary set_bit(AF_FW_RECOVERY, &ha->flags); 909661975fSVikas Chaudhary ql4_printk(KERN_INFO, ha, "%s: Reset owner is 0x%x\n", 919661975fSVikas Chaudhary __func__, ha->func_num); 929661975fSVikas Chaudhary } 93068237c8STej Parkash } else 94068237c8STej Parkash ql4_printk(KERN_INFO, ha, 95068237c8STej Parkash "%s: Reset not performed as device state is 0x%x\n", 96068237c8STej Parkash __func__, dev_state); 97068237c8STej Parkash 9833693c7aSVikas Chaudhary ha->isp_ops->idc_unlock(ha); 99068237c8STej Parkash break; 100068237c8STej Parkash default: 101068237c8STej Parkash /* do nothing */ 102068237c8STej Parkash break; 103068237c8STej Parkash } 104068237c8STej Parkash 105068237c8STej Parkash return count; 106068237c8STej Parkash } 107068237c8STej Parkash 108068237c8STej Parkash static struct bin_attribute sysfs_fw_dump_attr = { 109068237c8STej Parkash .attr = { 110068237c8STej Parkash .name = "fw_dump", 111068237c8STej Parkash .mode = S_IRUSR | S_IWUSR, 112068237c8STej Parkash }, 113068237c8STej Parkash .size = 0, 114068237c8STej Parkash .read = qla4_8xxx_sysfs_read_fw_dump, 115068237c8STej Parkash .write = qla4_8xxx_sysfs_write_fw_dump, 116068237c8STej Parkash }; 117068237c8STej Parkash 118068237c8STej Parkash static struct sysfs_entry { 119068237c8STej Parkash char *name; 120068237c8STej Parkash struct bin_attribute *attr; 121068237c8STej Parkash } bin_file_entries[] = { 122068237c8STej Parkash { "fw_dump", &sysfs_fw_dump_attr }, 123068237c8STej Parkash { NULL }, 124068237c8STej Parkash }; 125068237c8STej Parkash 126068237c8STej Parkash void qla4_8xxx_alloc_sysfs_attr(struct scsi_qla_host *ha) 127068237c8STej Parkash { 128068237c8STej Parkash struct Scsi_Host *host = ha->host; 129068237c8STej Parkash struct sysfs_entry *iter; 130068237c8STej Parkash int ret; 131068237c8STej Parkash 132068237c8STej Parkash for (iter = bin_file_entries; iter->name; iter++) { 133068237c8STej Parkash ret = sysfs_create_bin_file(&host->shost_gendev.kobj, 134068237c8STej Parkash iter->attr); 135068237c8STej Parkash if (ret) 136068237c8STej Parkash ql4_printk(KERN_ERR, ha, 137068237c8STej Parkash "Unable to create sysfs %s binary attribute (%d).\n", 138068237c8STej Parkash iter->name, ret); 139068237c8STej Parkash } 140068237c8STej Parkash } 141068237c8STej Parkash 142068237c8STej Parkash void qla4_8xxx_free_sysfs_attr(struct scsi_qla_host *ha) 143068237c8STej Parkash { 144068237c8STej Parkash struct Scsi_Host *host = ha->host; 145068237c8STej Parkash struct sysfs_entry *iter; 146068237c8STej Parkash 147068237c8STej Parkash for (iter = bin_file_entries; iter->name; iter++) 148068237c8STej Parkash sysfs_remove_bin_file(&host->shost_gendev.kobj, 149068237c8STej Parkash iter->attr); 150068237c8STej Parkash } 151068237c8STej Parkash 1527ad633c0SHarish Zunjarrao /* Scsi_Host attributes. */ 1537ad633c0SHarish Zunjarrao static ssize_t 1547ad633c0SHarish Zunjarrao qla4xxx_fw_version_show(struct device *dev, 1557ad633c0SHarish Zunjarrao struct device_attribute *attr, char *buf) 1567ad633c0SHarish Zunjarrao { 1577ad633c0SHarish Zunjarrao struct scsi_qla_host *ha = to_qla_host(class_to_shost(dev)); 1587ad633c0SHarish Zunjarrao 1596e7b4292SVikas Chaudhary if (is_qla80XX(ha)) 1607ad633c0SHarish Zunjarrao return snprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%x)\n", 161*eee06a0fSAdheer Chandravanshi ha->fw_info.fw_major, ha->fw_info.fw_minor, 162*eee06a0fSAdheer Chandravanshi ha->fw_info.fw_patch, ha->fw_info.fw_build); 1637ad633c0SHarish Zunjarrao else 1647ad633c0SHarish Zunjarrao return snprintf(buf, PAGE_SIZE, "%d.%02d.%02d.%02d\n", 165*eee06a0fSAdheer Chandravanshi ha->fw_info.fw_major, ha->fw_info.fw_minor, 166*eee06a0fSAdheer Chandravanshi ha->fw_info.fw_patch, ha->fw_info.fw_build); 1677ad633c0SHarish Zunjarrao } 1687ad633c0SHarish Zunjarrao 1697ad633c0SHarish Zunjarrao static ssize_t 1707ad633c0SHarish Zunjarrao qla4xxx_serial_num_show(struct device *dev, struct device_attribute *attr, 1717ad633c0SHarish Zunjarrao char *buf) 1727ad633c0SHarish Zunjarrao { 1737ad633c0SHarish Zunjarrao struct scsi_qla_host *ha = to_qla_host(class_to_shost(dev)); 1747ad633c0SHarish Zunjarrao return snprintf(buf, PAGE_SIZE, "%s\n", ha->serial_number); 1757ad633c0SHarish Zunjarrao } 1767ad633c0SHarish Zunjarrao 1777ad633c0SHarish Zunjarrao static ssize_t 1787ad633c0SHarish Zunjarrao qla4xxx_iscsi_version_show(struct device *dev, struct device_attribute *attr, 1797ad633c0SHarish Zunjarrao char *buf) 1807ad633c0SHarish Zunjarrao { 1817ad633c0SHarish Zunjarrao struct scsi_qla_host *ha = to_qla_host(class_to_shost(dev)); 182*eee06a0fSAdheer Chandravanshi return snprintf(buf, PAGE_SIZE, "%d.%02d\n", ha->fw_info.iscsi_major, 183*eee06a0fSAdheer Chandravanshi ha->fw_info.iscsi_minor); 1847ad633c0SHarish Zunjarrao } 1857ad633c0SHarish Zunjarrao 1867ad633c0SHarish Zunjarrao static ssize_t 1877ad633c0SHarish Zunjarrao qla4xxx_optrom_version_show(struct device *dev, struct device_attribute *attr, 1887ad633c0SHarish Zunjarrao char *buf) 1897ad633c0SHarish Zunjarrao { 1907ad633c0SHarish Zunjarrao struct scsi_qla_host *ha = to_qla_host(class_to_shost(dev)); 1917ad633c0SHarish Zunjarrao return snprintf(buf, PAGE_SIZE, "%d.%02d.%02d.%02d\n", 192*eee06a0fSAdheer Chandravanshi ha->fw_info.bootload_major, ha->fw_info.bootload_minor, 193*eee06a0fSAdheer Chandravanshi ha->fw_info.bootload_patch, ha->fw_info.bootload_build); 1947ad633c0SHarish Zunjarrao } 1957ad633c0SHarish Zunjarrao 19691ec7cecSVikas Chaudhary static ssize_t 19791ec7cecSVikas Chaudhary qla4xxx_board_id_show(struct device *dev, struct device_attribute *attr, 19891ec7cecSVikas Chaudhary char *buf) 19991ec7cecSVikas Chaudhary { 20091ec7cecSVikas Chaudhary struct scsi_qla_host *ha = to_qla_host(class_to_shost(dev)); 20191ec7cecSVikas Chaudhary return snprintf(buf, PAGE_SIZE, "0x%08X\n", ha->board_id); 20291ec7cecSVikas Chaudhary } 20391ec7cecSVikas Chaudhary 20491ec7cecSVikas Chaudhary static ssize_t 20591ec7cecSVikas Chaudhary qla4xxx_fw_state_show(struct device *dev, struct device_attribute *attr, 20691ec7cecSVikas Chaudhary char *buf) 20791ec7cecSVikas Chaudhary { 20891ec7cecSVikas Chaudhary struct scsi_qla_host *ha = to_qla_host(class_to_shost(dev)); 20991ec7cecSVikas Chaudhary 21091ec7cecSVikas Chaudhary qla4xxx_get_firmware_state(ha); 21191ec7cecSVikas Chaudhary return snprintf(buf, PAGE_SIZE, "0x%08X%8X\n", ha->firmware_state, 21291ec7cecSVikas Chaudhary ha->addl_fw_state); 21391ec7cecSVikas Chaudhary } 21491ec7cecSVikas Chaudhary 21591ec7cecSVikas Chaudhary static ssize_t 21691ec7cecSVikas Chaudhary qla4xxx_phy_port_cnt_show(struct device *dev, struct device_attribute *attr, 21791ec7cecSVikas Chaudhary char *buf) 21891ec7cecSVikas Chaudhary { 21991ec7cecSVikas Chaudhary struct scsi_qla_host *ha = to_qla_host(class_to_shost(dev)); 22091ec7cecSVikas Chaudhary 221ee996a69SVikas Chaudhary if (is_qla40XX(ha)) 22291ec7cecSVikas Chaudhary return -ENOSYS; 22391ec7cecSVikas Chaudhary 22491ec7cecSVikas Chaudhary return snprintf(buf, PAGE_SIZE, "0x%04X\n", ha->phy_port_cnt); 22591ec7cecSVikas Chaudhary } 22691ec7cecSVikas Chaudhary 22791ec7cecSVikas Chaudhary static ssize_t 22891ec7cecSVikas Chaudhary qla4xxx_phy_port_num_show(struct device *dev, struct device_attribute *attr, 22991ec7cecSVikas Chaudhary char *buf) 23091ec7cecSVikas Chaudhary { 23191ec7cecSVikas Chaudhary struct scsi_qla_host *ha = to_qla_host(class_to_shost(dev)); 23291ec7cecSVikas Chaudhary 233ee996a69SVikas Chaudhary if (is_qla40XX(ha)) 23491ec7cecSVikas Chaudhary return -ENOSYS; 23591ec7cecSVikas Chaudhary 23691ec7cecSVikas Chaudhary return snprintf(buf, PAGE_SIZE, "0x%04X\n", ha->phy_port_num); 23791ec7cecSVikas Chaudhary } 23891ec7cecSVikas Chaudhary 23991ec7cecSVikas Chaudhary static ssize_t 24091ec7cecSVikas Chaudhary qla4xxx_iscsi_func_cnt_show(struct device *dev, struct device_attribute *attr, 24191ec7cecSVikas Chaudhary char *buf) 24291ec7cecSVikas Chaudhary { 24391ec7cecSVikas Chaudhary struct scsi_qla_host *ha = to_qla_host(class_to_shost(dev)); 24491ec7cecSVikas Chaudhary 245ee996a69SVikas Chaudhary if (is_qla40XX(ha)) 24691ec7cecSVikas Chaudhary return -ENOSYS; 24791ec7cecSVikas Chaudhary 24891ec7cecSVikas Chaudhary return snprintf(buf, PAGE_SIZE, "0x%04X\n", ha->iscsi_pci_func_cnt); 24991ec7cecSVikas Chaudhary } 25091ec7cecSVikas Chaudhary 25191ec7cecSVikas Chaudhary static ssize_t 25291ec7cecSVikas Chaudhary qla4xxx_hba_model_show(struct device *dev, struct device_attribute *attr, 25391ec7cecSVikas Chaudhary char *buf) 25491ec7cecSVikas Chaudhary { 25591ec7cecSVikas Chaudhary struct scsi_qla_host *ha = to_qla_host(class_to_shost(dev)); 25691ec7cecSVikas Chaudhary 25791ec7cecSVikas Chaudhary return snprintf(buf, PAGE_SIZE, "%s\n", ha->model_name); 25891ec7cecSVikas Chaudhary } 25991ec7cecSVikas Chaudhary 260*eee06a0fSAdheer Chandravanshi static ssize_t 261*eee06a0fSAdheer Chandravanshi qla4xxx_fw_timestamp_show(struct device *dev, struct device_attribute *attr, 262*eee06a0fSAdheer Chandravanshi char *buf) 263*eee06a0fSAdheer Chandravanshi { 264*eee06a0fSAdheer Chandravanshi struct scsi_qla_host *ha = to_qla_host(class_to_shost(dev)); 265*eee06a0fSAdheer Chandravanshi return snprintf(buf, PAGE_SIZE, "%s %s\n", ha->fw_info.fw_build_date, 266*eee06a0fSAdheer Chandravanshi ha->fw_info.fw_build_time); 267*eee06a0fSAdheer Chandravanshi } 268*eee06a0fSAdheer Chandravanshi 269*eee06a0fSAdheer Chandravanshi static ssize_t 270*eee06a0fSAdheer Chandravanshi qla4xxx_fw_build_user_show(struct device *dev, struct device_attribute *attr, 271*eee06a0fSAdheer Chandravanshi char *buf) 272*eee06a0fSAdheer Chandravanshi { 273*eee06a0fSAdheer Chandravanshi struct scsi_qla_host *ha = to_qla_host(class_to_shost(dev)); 274*eee06a0fSAdheer Chandravanshi return snprintf(buf, PAGE_SIZE, "%s\n", ha->fw_info.fw_build_user); 275*eee06a0fSAdheer Chandravanshi } 276*eee06a0fSAdheer Chandravanshi 277*eee06a0fSAdheer Chandravanshi static ssize_t 278*eee06a0fSAdheer Chandravanshi qla4xxx_fw_ext_timestamp_show(struct device *dev, struct device_attribute *attr, 279*eee06a0fSAdheer Chandravanshi char *buf) 280*eee06a0fSAdheer Chandravanshi { 281*eee06a0fSAdheer Chandravanshi struct scsi_qla_host *ha = to_qla_host(class_to_shost(dev)); 282*eee06a0fSAdheer Chandravanshi return snprintf(buf, PAGE_SIZE, "%s\n", ha->fw_info.extended_timestamp); 283*eee06a0fSAdheer Chandravanshi } 284*eee06a0fSAdheer Chandravanshi 285*eee06a0fSAdheer Chandravanshi static ssize_t 286*eee06a0fSAdheer Chandravanshi qla4xxx_fw_load_src_show(struct device *dev, struct device_attribute *attr, 287*eee06a0fSAdheer Chandravanshi char *buf) 288*eee06a0fSAdheer Chandravanshi { 289*eee06a0fSAdheer Chandravanshi struct scsi_qla_host *ha = to_qla_host(class_to_shost(dev)); 290*eee06a0fSAdheer Chandravanshi char *load_src = NULL; 291*eee06a0fSAdheer Chandravanshi 292*eee06a0fSAdheer Chandravanshi switch (ha->fw_info.fw_load_source) { 293*eee06a0fSAdheer Chandravanshi case 1: 294*eee06a0fSAdheer Chandravanshi load_src = "Flash Primary"; 295*eee06a0fSAdheer Chandravanshi break; 296*eee06a0fSAdheer Chandravanshi case 2: 297*eee06a0fSAdheer Chandravanshi load_src = "Flash Secondary"; 298*eee06a0fSAdheer Chandravanshi break; 299*eee06a0fSAdheer Chandravanshi case 3: 300*eee06a0fSAdheer Chandravanshi load_src = "Host Download"; 301*eee06a0fSAdheer Chandravanshi break; 302*eee06a0fSAdheer Chandravanshi } 303*eee06a0fSAdheer Chandravanshi 304*eee06a0fSAdheer Chandravanshi return snprintf(buf, PAGE_SIZE, "%s\n", load_src); 305*eee06a0fSAdheer Chandravanshi } 306*eee06a0fSAdheer Chandravanshi 307*eee06a0fSAdheer Chandravanshi static ssize_t 308*eee06a0fSAdheer Chandravanshi qla4xxx_fw_uptime_show(struct device *dev, struct device_attribute *attr, 309*eee06a0fSAdheer Chandravanshi char *buf) 310*eee06a0fSAdheer Chandravanshi { 311*eee06a0fSAdheer Chandravanshi struct scsi_qla_host *ha = to_qla_host(class_to_shost(dev)); 312*eee06a0fSAdheer Chandravanshi qla4xxx_about_firmware(ha); 313*eee06a0fSAdheer Chandravanshi return snprintf(buf, PAGE_SIZE, "%u.%u secs\n", ha->fw_uptime_secs, 314*eee06a0fSAdheer Chandravanshi ha->fw_uptime_msecs); 315*eee06a0fSAdheer Chandravanshi } 316*eee06a0fSAdheer Chandravanshi 3177ad633c0SHarish Zunjarrao static DEVICE_ATTR(fw_version, S_IRUGO, qla4xxx_fw_version_show, NULL); 3187ad633c0SHarish Zunjarrao static DEVICE_ATTR(serial_num, S_IRUGO, qla4xxx_serial_num_show, NULL); 3197ad633c0SHarish Zunjarrao static DEVICE_ATTR(iscsi_version, S_IRUGO, qla4xxx_iscsi_version_show, NULL); 3207ad633c0SHarish Zunjarrao static DEVICE_ATTR(optrom_version, S_IRUGO, qla4xxx_optrom_version_show, NULL); 32191ec7cecSVikas Chaudhary static DEVICE_ATTR(board_id, S_IRUGO, qla4xxx_board_id_show, NULL); 32291ec7cecSVikas Chaudhary static DEVICE_ATTR(fw_state, S_IRUGO, qla4xxx_fw_state_show, NULL); 32391ec7cecSVikas Chaudhary static DEVICE_ATTR(phy_port_cnt, S_IRUGO, qla4xxx_phy_port_cnt_show, NULL); 32491ec7cecSVikas Chaudhary static DEVICE_ATTR(phy_port_num, S_IRUGO, qla4xxx_phy_port_num_show, NULL); 32591ec7cecSVikas Chaudhary static DEVICE_ATTR(iscsi_func_cnt, S_IRUGO, qla4xxx_iscsi_func_cnt_show, NULL); 32691ec7cecSVikas Chaudhary static DEVICE_ATTR(hba_model, S_IRUGO, qla4xxx_hba_model_show, NULL); 327*eee06a0fSAdheer Chandravanshi static DEVICE_ATTR(fw_timestamp, S_IRUGO, qla4xxx_fw_timestamp_show, NULL); 328*eee06a0fSAdheer Chandravanshi static DEVICE_ATTR(fw_build_user, S_IRUGO, qla4xxx_fw_build_user_show, NULL); 329*eee06a0fSAdheer Chandravanshi static DEVICE_ATTR(fw_ext_timestamp, S_IRUGO, qla4xxx_fw_ext_timestamp_show, 330*eee06a0fSAdheer Chandravanshi NULL); 331*eee06a0fSAdheer Chandravanshi static DEVICE_ATTR(fw_load_src, S_IRUGO, qla4xxx_fw_load_src_show, NULL); 332*eee06a0fSAdheer Chandravanshi static DEVICE_ATTR(fw_uptime, S_IRUGO, qla4xxx_fw_uptime_show, NULL); 3337ad633c0SHarish Zunjarrao 3347ad633c0SHarish Zunjarrao struct device_attribute *qla4xxx_host_attrs[] = { 3357ad633c0SHarish Zunjarrao &dev_attr_fw_version, 3367ad633c0SHarish Zunjarrao &dev_attr_serial_num, 3377ad633c0SHarish Zunjarrao &dev_attr_iscsi_version, 3387ad633c0SHarish Zunjarrao &dev_attr_optrom_version, 33991ec7cecSVikas Chaudhary &dev_attr_board_id, 34091ec7cecSVikas Chaudhary &dev_attr_fw_state, 34191ec7cecSVikas Chaudhary &dev_attr_phy_port_cnt, 34291ec7cecSVikas Chaudhary &dev_attr_phy_port_num, 34391ec7cecSVikas Chaudhary &dev_attr_iscsi_func_cnt, 34491ec7cecSVikas Chaudhary &dev_attr_hba_model, 345*eee06a0fSAdheer Chandravanshi &dev_attr_fw_timestamp, 346*eee06a0fSAdheer Chandravanshi &dev_attr_fw_build_user, 347*eee06a0fSAdheer Chandravanshi &dev_attr_fw_ext_timestamp, 348*eee06a0fSAdheer Chandravanshi &dev_attr_fw_load_src, 349*eee06a0fSAdheer Chandravanshi &dev_attr_fw_uptime, 3507ad633c0SHarish Zunjarrao NULL, 3517ad633c0SHarish Zunjarrao }; 352