diff options
author | Andrew Vasquez <andrew.vasquez@qlogic.com> | 2006-06-23 19:10:50 -0400 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2006-06-26 17:22:40 -0400 |
commit | 88729e53a4798df20e7a7ef68e0a816f4a268da4 (patch) | |
tree | 23635e817ed3385167c3ee73ce4bafbabdb33848 /drivers/scsi/qla2xxx/qla_attr.c | |
parent | 8baa51a6f027a2f581930da12f867d8054907656 (diff) |
[SCSI] qla2xxx: Add DMI (Diagnostics Monitoring Interface) support.
Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_attr.c')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_attr.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index 78eec6799343..1a766b284cfc 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c | |||
@@ -338,6 +338,53 @@ static struct bin_attribute sysfs_vpd_attr = { | |||
338 | .write = qla2x00_sysfs_write_vpd, | 338 | .write = qla2x00_sysfs_write_vpd, |
339 | }; | 339 | }; |
340 | 340 | ||
341 | static ssize_t | ||
342 | qla2x00_sysfs_read_sfp(struct kobject *kobj, char *buf, loff_t off, | ||
343 | size_t count) | ||
344 | { | ||
345 | struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj, | ||
346 | struct device, kobj))); | ||
347 | uint16_t iter, addr, offset; | ||
348 | int rval; | ||
349 | |||
350 | if (!capable(CAP_SYS_ADMIN) || off != 0 || count != SFP_DEV_SIZE * 2) | ||
351 | return 0; | ||
352 | |||
353 | addr = 0xa0; | ||
354 | for (iter = 0, offset = 0; iter < (SFP_DEV_SIZE * 2) / SFP_BLOCK_SIZE; | ||
355 | iter++, offset += SFP_BLOCK_SIZE) { | ||
356 | if (iter == 4) { | ||
357 | /* Skip to next device address. */ | ||
358 | addr = 0xa2; | ||
359 | offset = 0; | ||
360 | } | ||
361 | |||
362 | rval = qla2x00_read_sfp(ha, ha->sfp_data_dma, addr, offset, | ||
363 | SFP_BLOCK_SIZE); | ||
364 | if (rval != QLA_SUCCESS) { | ||
365 | qla_printk(KERN_WARNING, ha, | ||
366 | "Unable to read SFP data (%x/%x/%x).\n", rval, | ||
367 | addr, offset); | ||
368 | count = 0; | ||
369 | break; | ||
370 | } | ||
371 | memcpy(buf, ha->sfp_data, SFP_BLOCK_SIZE); | ||
372 | buf += SFP_BLOCK_SIZE; | ||
373 | } | ||
374 | |||
375 | return count; | ||
376 | } | ||
377 | |||
378 | static struct bin_attribute sysfs_sfp_attr = { | ||
379 | .attr = { | ||
380 | .name = "sfp", | ||
381 | .mode = S_IRUSR | S_IWUSR, | ||
382 | .owner = THIS_MODULE, | ||
383 | }, | ||
384 | .size = SFP_DEV_SIZE * 2, | ||
385 | .read = qla2x00_sysfs_read_sfp, | ||
386 | }; | ||
387 | |||
341 | void | 388 | void |
342 | qla2x00_alloc_sysfs_attr(scsi_qla_host_t *ha) | 389 | qla2x00_alloc_sysfs_attr(scsi_qla_host_t *ha) |
343 | { | 390 | { |
@@ -349,6 +396,9 @@ qla2x00_alloc_sysfs_attr(scsi_qla_host_t *ha) | |||
349 | sysfs_create_bin_file(&host->shost_gendev.kobj, | 396 | sysfs_create_bin_file(&host->shost_gendev.kobj, |
350 | &sysfs_optrom_ctl_attr); | 397 | &sysfs_optrom_ctl_attr); |
351 | sysfs_create_bin_file(&host->shost_gendev.kobj, &sysfs_vpd_attr); | 398 | sysfs_create_bin_file(&host->shost_gendev.kobj, &sysfs_vpd_attr); |
399 | if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) | ||
400 | sysfs_create_bin_file(&host->shost_gendev.kobj, | ||
401 | &sysfs_sfp_attr); | ||
352 | } | 402 | } |
353 | 403 | ||
354 | void | 404 | void |
@@ -362,6 +412,9 @@ qla2x00_free_sysfs_attr(scsi_qla_host_t *ha) | |||
362 | sysfs_remove_bin_file(&host->shost_gendev.kobj, | 412 | sysfs_remove_bin_file(&host->shost_gendev.kobj, |
363 | &sysfs_optrom_ctl_attr); | 413 | &sysfs_optrom_ctl_attr); |
364 | sysfs_remove_bin_file(&host->shost_gendev.kobj, &sysfs_vpd_attr); | 414 | sysfs_remove_bin_file(&host->shost_gendev.kobj, &sysfs_vpd_attr); |
415 | if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) | ||
416 | sysfs_remove_bin_file(&host->shost_gendev.kobj, | ||
417 | &sysfs_sfp_attr); | ||
365 | 418 | ||
366 | if (ha->beacon_blink_led == 1) | 419 | if (ha->beacon_blink_led == 1) |
367 | ha->isp_ops.beacon_off(ha); | 420 | ha->isp_ops.beacon_off(ha); |