[RFC] support for sysfs string based properties for SCSI (1/3)

From: James Bottomley (James.Bottomley@steeleye.com)
Date: Sat May 03 2003 - 14:11:36 EST


This first patch is of general interest (the other two are going to the
SCSI list only).

The problem this seeks to solve is that we have a bunch of properties in
SCSI that we'd like to expose through the sysfs interface. The
mid-layer can get their values, but setting them requires co-operation
from the host drivers, thus we'd like to expose a show/store interface
to all the SCSI drivers.

The current one call back per sysfs file is a bit unwieldy for
encapsulating in an interface like this. what this patch does is to
allow a fallback show/store method of the bus type (if the device type
doesn't exist). However, the bus_type show/store passes in the
attribute so a comparison may be done against the name of the attribute.

For details of how all this gets used, see the following SCSI patches.

James


===== drivers/scsi/NCR_D700.c 1.8 vs edited =====
--- 1.8/drivers/scsi/NCR_D700.c Sun Apr 27 05:31:39 2003
+++ edited/drivers/scsi/NCR_D700.c Thu May 1 11:11:48 2003
@@ -169,16 +169,18 @@
         struct Scsi_Host *hosts[2];
 };
 
-static int NCR_D700_probe_one(struct NCR_D700_private *p, int chan,
+static int
+NCR_D700_probe_one(struct NCR_D700_private *p, int siop,
                 int irq, int slot, u32 region, int differential)
 {
         struct NCR_700_Host_Parameters *hostdata;
         struct Scsi_Host *host;
+ int ret;
 
         hostdata = kmalloc(sizeof(*hostdata), GFP_KERNEL);
         if (!hostdata) {
- printk(KERN_ERR "NCR D700: Failed to allocate host data "
- "for channel %d, detatching\n", chan);
+ printk(KERN_ERR "NCR D700: SIOP%d: Failed to allocate host"
+ "data, detatching\n", siop);
                 return -ENOMEM;
         }
         memset(hostdata, 0, sizeof(*hostdata));
@@ -186,41 +188,49 @@
         if (!request_region(region, 64, "NCR_D700")) {
                 printk(KERN_ERR "NCR D700: Failed to reserve IO region 0x%x\n",
                                 region);
- kfree(hostdata);
- return -ENODEV;
+ ret = -ENODEV;
+ goto region_failed;
         }
                 
         /* Fill in the three required pieces of hostdata */
         hostdata->base = region;
- hostdata->differential = (((1<<chan) & differential) != 0);
+ hostdata->differential = (((1<<siop) & differential) != 0);
         hostdata->clock = NCR_D700_CLOCK_MHZ;
 
- /* and register the chip */
+ /* and register the siop */
         host = NCR_700_detect(&NCR_D700_driver_template, hostdata);
         if (!host) {
- kfree(hostdata);
- release_region(host->base, 64);
- return -ENOMEM;
+ ret = -ENOMEM;
+ goto detect_failed;
         }
 
         host->irq = irq;
         /* FIXME: Read this from SUS */
- host->this_id = id_array[slot * 2 + chan];
+ host->this_id = id_array[slot * 2 + siop];
         printk(KERN_NOTICE "NCR D700: SIOP%d, SCSI id is %d\n",
- chan, host->this_id);
+ siop, host->this_id);
         if (request_irq(irq, NCR_700_intr, SA_SHIRQ, "NCR_D700", host)) {
- printk(KERN_ERR "NCR D700, channel %d: irq problem, "
- "detatching\n", chan);
- scsi_unregister(host);
- NCR_700_release(host);
- return -ENODEV;
+ printk(KERN_ERR "NCR D700: SIOP%d: irq problem, "
+ "detatching\n", siop);
+ ret = -ENODEV;
+ goto irq_failed;
         }
 
- scsi_add_host(host, NULL);
+ scsi_add_host(host, p->dev);
 
- p->hosts[chan] = host;
+ p->hosts[siop] = host;
         hostdata->dev = p->dev;
         return 0;
+
+ irq_failed:
+ scsi_unregister(host);
+ NCR_700_release(host);
+ detect_failed:
+ release_region(host->base, 64);
+ region_failed:
+ kfree(hostdata);
+
+ return ret;
 }
 
 /* Detect a D700 card. Note, because of the setup --- the chips are
@@ -305,8 +315,15 @@
 
         /* plumb in both 700 chips */
         for (i = 0; i < 2; i++) {
- found |= NCR_D700_probe_one(p, i, irq, slot,
- offset_addr | (0x80 * i), differential);
+ int err;
+
+ if ((err = NCR_D700_probe_one(p, i, irq, slot,
+ offset_addr + (0x80 * i),
+ differential)) != 0)
+ printk("D700: SIOP%d: probe failed, error = %d\n",
+ i, err);
+ else
+ found++;
         }
 
         if (!found) {

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Wed May 07 2003 - 22:00:18 EST