diff options
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_attr.c | 132 | ||||
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_gbl.h | 2 | ||||
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 2 |
3 files changed, 136 insertions, 0 deletions
diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index d05280eecc60..fe0fce71adc7 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c | |||
| @@ -211,6 +211,138 @@ qla2x00_free_sysfs_attr(scsi_qla_host_t *ha) | |||
| 211 | sysfs_remove_bin_file(&host->shost_gendev.kobj, &sysfs_nvram_attr); | 211 | sysfs_remove_bin_file(&host->shost_gendev.kobj, &sysfs_nvram_attr); |
| 212 | } | 212 | } |
| 213 | 213 | ||
| 214 | /* Scsi_Host attributes. */ | ||
| 215 | |||
| 216 | static ssize_t | ||
| 217 | qla2x00_drvr_version_show(struct class_device *cdev, char *buf) | ||
| 218 | { | ||
| 219 | return snprintf(buf, PAGE_SIZE, "%s\n", qla2x00_version_str); | ||
| 220 | } | ||
| 221 | |||
| 222 | static ssize_t | ||
| 223 | qla2x00_fw_version_show(struct class_device *cdev, char *buf) | ||
| 224 | { | ||
| 225 | scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev)); | ||
| 226 | char fw_str[30]; | ||
| 227 | |||
| 228 | return snprintf(buf, PAGE_SIZE, "%s\n", | ||
| 229 | ha->isp_ops.fw_version_str(ha, fw_str)); | ||
| 230 | } | ||
| 231 | |||
| 232 | static ssize_t | ||
| 233 | qla2x00_serial_num_show(struct class_device *cdev, char *buf) | ||
| 234 | { | ||
| 235 | scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev)); | ||
| 236 | uint32_t sn; | ||
| 237 | |||
| 238 | sn = ((ha->serial0 & 0x1f) << 16) | (ha->serial2 << 8) | ha->serial1; | ||
| 239 | return snprintf(buf, PAGE_SIZE, "%c%05d\n", 'A' + sn / 100000, | ||
| 240 | sn % 100000); | ||
| 241 | } | ||
| 242 | |||
| 243 | static ssize_t | ||
| 244 | qla2x00_isp_name_show(struct class_device *cdev, char *buf) | ||
| 245 | { | ||
| 246 | scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev)); | ||
| 247 | return snprintf(buf, PAGE_SIZE, "%s\n", ha->brd_info->isp_name); | ||
| 248 | } | ||
| 249 | |||
| 250 | static ssize_t | ||
| 251 | qla2x00_isp_id_show(struct class_device *cdev, char *buf) | ||
| 252 | { | ||
| 253 | scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev)); | ||
| 254 | return snprintf(buf, PAGE_SIZE, "%04x %04x %04x %04x\n", | ||
| 255 | ha->product_id[0], ha->product_id[1], ha->product_id[2], | ||
| 256 | ha->product_id[3]); | ||
| 257 | } | ||
| 258 | |||
| 259 | static ssize_t | ||
| 260 | qla2x00_model_name_show(struct class_device *cdev, char *buf) | ||
| 261 | { | ||
| 262 | scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev)); | ||
| 263 | return snprintf(buf, PAGE_SIZE, "%s\n", ha->model_number); | ||
| 264 | } | ||
| 265 | |||
| 266 | static ssize_t | ||
| 267 | qla2x00_model_desc_show(struct class_device *cdev, char *buf) | ||
| 268 | { | ||
| 269 | scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev)); | ||
| 270 | return snprintf(buf, PAGE_SIZE, "%s\n", | ||
| 271 | ha->model_desc ? ha->model_desc: ""); | ||
| 272 | } | ||
| 273 | |||
| 274 | static ssize_t | ||
| 275 | qla2x00_pci_info_show(struct class_device *cdev, char *buf) | ||
| 276 | { | ||
| 277 | scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev)); | ||
| 278 | char pci_info[30]; | ||
| 279 | |||
| 280 | return snprintf(buf, PAGE_SIZE, "%s\n", | ||
| 281 | ha->isp_ops.pci_info_str(ha, pci_info)); | ||
| 282 | } | ||
| 283 | |||
| 284 | static ssize_t | ||
| 285 | qla2x00_state_show(struct class_device *cdev, char *buf) | ||
| 286 | { | ||
| 287 | scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev)); | ||
| 288 | int len = 0; | ||
| 289 | |||
| 290 | if (atomic_read(&ha->loop_state) == LOOP_DOWN || | ||
| 291 | atomic_read(&ha->loop_state) == LOOP_DEAD) | ||
| 292 | len = snprintf(buf, PAGE_SIZE, "Link Down\n"); | ||
| 293 | else if (atomic_read(&ha->loop_state) != LOOP_READY || | ||
| 294 | test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags) || | ||
| 295 | test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) | ||
| 296 | len = snprintf(buf, PAGE_SIZE, "Unknown Link State\n"); | ||
| 297 | else { | ||
| 298 | len = snprintf(buf, PAGE_SIZE, "Link Up - "); | ||
| 299 | |||
| 300 | switch (ha->current_topology) { | ||
| 301 | case ISP_CFG_NL: | ||
| 302 | len += snprintf(buf + len, PAGE_SIZE-len, "Loop\n"); | ||
| 303 | break; | ||
| 304 | case ISP_CFG_FL: | ||
| 305 | len += snprintf(buf + len, PAGE_SIZE-len, "FL_Port\n"); | ||
| 306 | break; | ||
| 307 | case ISP_CFG_N: | ||
| 308 | len += snprintf(buf + len, PAGE_SIZE-len, | ||
| 309 | "N_Port to N_Port\n"); | ||
| 310 | break; | ||
| 311 | case ISP_CFG_F: | ||
| 312 | len += snprintf(buf + len, PAGE_SIZE-len, "F_Port\n"); | ||
| 313 | break; | ||
| 314 | default: | ||
| 315 | len += snprintf(buf + len, PAGE_SIZE-len, "Loop\n"); | ||
| 316 | break; | ||
| 317 | } | ||
| 318 | } | ||
| 319 | return len; | ||
| 320 | } | ||
| 321 | |||
| 322 | static CLASS_DEVICE_ATTR(driver_version, S_IRUGO, qla2x00_drvr_version_show, | ||
| 323 | NULL); | ||
| 324 | static CLASS_DEVICE_ATTR(fw_version, S_IRUGO, qla2x00_fw_version_show, NULL); | ||
| 325 | static CLASS_DEVICE_ATTR(serial_num, S_IRUGO, qla2x00_serial_num_show, NULL); | ||
| 326 | static CLASS_DEVICE_ATTR(isp_name, S_IRUGO, qla2x00_isp_name_show, NULL); | ||
| 327 | static CLASS_DEVICE_ATTR(isp_id, S_IRUGO, qla2x00_isp_id_show, NULL); | ||
| 328 | static CLASS_DEVICE_ATTR(model_name, S_IRUGO, qla2x00_model_name_show, NULL); | ||
| 329 | static CLASS_DEVICE_ATTR(model_desc, S_IRUGO, qla2x00_model_desc_show, NULL); | ||
| 330 | static CLASS_DEVICE_ATTR(pci_info, S_IRUGO, qla2x00_pci_info_show, NULL); | ||
| 331 | static CLASS_DEVICE_ATTR(state, S_IRUGO, qla2x00_state_show, NULL); | ||
| 332 | |||
| 333 | struct class_device_attribute *qla2x00_host_attrs[] = { | ||
| 334 | &class_device_attr_driver_version, | ||
| 335 | &class_device_attr_fw_version, | ||
| 336 | &class_device_attr_serial_num, | ||
| 337 | &class_device_attr_isp_name, | ||
| 338 | &class_device_attr_isp_id, | ||
| 339 | &class_device_attr_model_name, | ||
| 340 | &class_device_attr_model_desc, | ||
| 341 | &class_device_attr_pci_info, | ||
| 342 | &class_device_attr_state, | ||
| 343 | NULL, | ||
| 344 | }; | ||
| 345 | |||
| 214 | /* Host attributes. */ | 346 | /* Host attributes. */ |
| 215 | 347 | ||
| 216 | static void | 348 | static void |
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h index 5deaa7e6ee60..95fb0c4941aa 100644 --- a/drivers/scsi/qla2xxx/qla_gbl.h +++ b/drivers/scsi/qla2xxx/qla_gbl.h | |||
| @@ -290,6 +290,8 @@ extern void qla2x00_cancel_io_descriptors(scsi_qla_host_t *); | |||
| 290 | /* | 290 | /* |
| 291 | * Global Function Prototypes in qla_attr.c source file. | 291 | * Global Function Prototypes in qla_attr.c source file. |
| 292 | */ | 292 | */ |
| 293 | struct class_device_attribute; | ||
| 294 | extern struct class_device_attribute *qla2x00_host_attrs[]; | ||
| 293 | struct fc_function_template; | 295 | struct fc_function_template; |
| 294 | extern struct fc_function_template qla2xxx_transport_functions; | 296 | extern struct fc_function_template qla2xxx_transport_functions; |
| 295 | extern void qla2x00_alloc_sysfs_attr(scsi_qla_host_t *); | 297 | extern void qla2x00_alloc_sysfs_attr(scsi_qla_host_t *); |
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 413ccc152de5..14f2f9077c81 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
| @@ -140,6 +140,7 @@ static struct scsi_host_template qla2x00_driver_template = { | |||
| 140 | * which equates to 0x800000 sectors. | 140 | * which equates to 0x800000 sectors. |
| 141 | */ | 141 | */ |
| 142 | .max_sectors = 0xFFFF, | 142 | .max_sectors = 0xFFFF, |
| 143 | .shost_attrs = qla2x00_host_attrs, | ||
| 143 | }; | 144 | }; |
| 144 | 145 | ||
| 145 | static struct scsi_host_template qla24xx_driver_template = { | 146 | static struct scsi_host_template qla24xx_driver_template = { |
| @@ -164,6 +165,7 @@ static struct scsi_host_template qla24xx_driver_template = { | |||
| 164 | .sg_tablesize = SG_ALL, | 165 | .sg_tablesize = SG_ALL, |
| 165 | 166 | ||
| 166 | .max_sectors = 0xFFFF, | 167 | .max_sectors = 0xFFFF, |
| 168 | .shost_attrs = qla2x00_host_attrs, | ||
| 167 | }; | 169 | }; |
| 168 | 170 | ||
| 169 | static struct scsi_transport_template *qla2xxx_transport_template = NULL; | 171 | static struct scsi_transport_template *qla2xxx_transport_template = NULL; |
