aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/qla2xxx/qla_attr.c
diff options
context:
space:
mode:
authorAndrew Vasquez <andrew.vasquez@qlogic.com>2006-06-23 19:10:50 -0400
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>2006-06-26 17:22:40 -0400
commit88729e53a4798df20e7a7ef68e0a816f4a268da4 (patch)
tree23635e817ed3385167c3ee73ce4bafbabdb33848 /drivers/scsi/qla2xxx/qla_attr.c
parent8baa51a6f027a2f581930da12f867d8054907656 (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.c53
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
341static ssize_t
342qla2x00_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
378static 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
341void 388void
342qla2x00_alloc_sysfs_attr(scsi_qla_host_t *ha) 389qla2x00_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
354void 404void
@@ -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);