more SPI transport attribute updates
PATCH 1/1 more SPI transport attribute updates
This does three things
- Fix the signedness of the bit attributes (otherwise they show up as -1 when on, not 1)
- Make the period adjust to the closest value rather than ignoring values it doesn't understand.
- Add a visibility field to attributes, so drivers can get rid of attributes they're never going to care about
James
===== drivers/scsi/scsi_transport_spi.c 1.3 vs edited =====
drivers/scsi/scsi_transport_spi.c +9 -21
@@ -204,39 +204,26 @@ }if (period ==-1 ) { -int val =simple_strtoul (buf,NULL ,0 ); +int val =simple_strtoul (buf,NULL ,0 ); - -if (val >= (SPI_STATIC_PPR +1 )*4 ) - period = val/4 ; +/* Should probably check limits here, but this +* gets reasonably close to OK for most things */ + period = val/4 ; } -if (period ==-1 || period >0xff ) -return -EINVAL ; +if (period >0xff ) + period =0xff ; i->f->set_period (sdev, period);return count; } - - - - - static CLASS_DEVICE_ATTR(period, S_IRUGO | S_IWUSR, show_spi_transport_period, store_spi_transport_period); - -struct scsi_transport_template spi_transport_template = { - .class = &spi_transport_class, - .setup = &spi_setup_transport_attrs, - .cleanup =NULL , - .size =sizeof (struct spi_transport_attrs ) -sizeof (unsigned long ), -}; -#define SETUP_ATTRIBUTE (field) \ i->private_attrs[count] = class_device_attr_##field; \ if(!i->f->set_##field) { \
@@ -244,7 +231,8 @@ i->private_attrs[count].store =NULL ; \ } \ i->attrs[count] = &i->private_attrs[count]; \ - count++ + if(i->f->show_##field) \ + count++struct scsi_transport_template *spi_attach_transport (struct spi_function_template *ft)
@@ -277,7 +265,7 @@/* if you add an attribute but forget to increase SPI_NUM_ATTRS * this bug will trigger */ -BUG_ON (count !=SPI_NUM_ATTRS ); +BUG_ON (count >SPI_NUM_ATTRS ); i->attrs[count] =NULL ;
===== include/scsi/scsi_transport_spi.h 1.3 vs edited =====
include/scsi/scsi_transport_spi.h +22 -8
@@ -27,14 +27,14 @@struct spi_transport_attrs {int period;/* value in the PPR/SDTR command */ int offset; -int width:1 ;/* 0 - narrow, 1 - wide */ -int iu:1 ;/* Information Units enabled */ -int dt:1 ;/* DT clocking enabled */ -int qas:1 ;/* Quick Arbitration and Selection enabled */ -int wr_flow:1 ;/* Write Flow control enabled */ -int rd_strm:1 ;/* Read streaming enabled */ -int rti:1 ;/* Retain Training Information */ -int pcomp_en:1 ;/* Precompensation enabled */ +unsigned int width:1 ;/* 0 - narrow, 1 - wide */ +unsigned int iu:1 ;/* Information Units enabled */ +unsigned int dt:1 ;/* DT clocking enabled */ +unsigned int qas:1 ;/* Quick Arbitration and Selection enabled */ +unsigned int wr_flow:1 ;/* Write Flow control enabled */ +unsigned int rd_strm:1 ;/* Read streaming enabled */ +unsigned int rti:1 ;/* Retain Training Information */ +unsigned int pcomp_en:1 ;/* Precompensation enabled */ };/* accessor functions */
@@ -71,6 +71,20 @@void (*set_rti)(struct scsi_device *,int );void (*get_pcomp_en)(struct scsi_device *);void (*set_pcomp_en)(struct scsi_device *,int ); +/* The driver sets these to tell the transport class it +* wants the attributes displayed in sysfs. If the show_ flag +* is not set, the attribute will be private to the transport +* class */ + unsigned long show_period:1; + unsigned long show_offset:1; + unsigned long show_width:1; + unsigned long show_iu:1; + unsigned long show_dt:1; + unsigned long show_qas:1; + unsigned long show_wr_flow:1; + unsigned long show_rd_strm:1; + unsigned long show_rti:1; + unsigned long show_pcomp_en:1; };struct scsi_transport_template *spi_attach_transport (struct spi_function_template *);