Subject: Re: review of minor SCSIbus midlayer change, #1, possibly for 5.0
To: Matthew Jacob <mjacob@feral.com>
From: Eduardo Horvath <eeh@turbolinux.com>
List: tech-kern
Date: 08/08/2000 07:57:27
5.0?

On Mon, 7 Aug 2000, Matthew Jacob wrote:

> This allows both dynamic flag setting for 'acceleration' from userland as well
> as from initial configuration for host adapters that support the ioctl
> function.
> 
> Thoughts? Makes things cleaner, and is a start toward finer control.
> 
> 
> Index: sys/scsiio.h
> ===================================================================
> RCS file: /cvsroot/syssrc/sys/sys/scsiio.h,v
> retrieving revision 1.7
> diff -u -r1.7 scsiio.h
> --- scsiio.h	1998/10/10 03:18:51	1.7
> +++ scsiio.h	2000/08/07 23:43:34
> @@ -90,4 +90,15 @@
>  
>  #define	SCBUSIORESET	_IO('U', 1)	/* reset SCSI bus */
>  
> +/* enable/disable device properties */
> +struct scbusaccel_args {
> +	int	sa_target;	/* target to set property on */
> +	int	sa_lun;		/* lun to set property on */
> +	int	sa_flags;	/* flags to set or clear */
> +};
> +#define	SC_ACCEL_SYNC	0x01	/* enable sync mode */
> +#define	SC_ACCEL_WIDE	0x02	/* enable wide transfers */
> +#define	SC_ACCEL_TAGS	0x04	/* enable tagged queuing */
> +#define	SCBUSACCEL	_IOW('U', 2, struct scbusaccel_args)

2 things:

I think something like scsibusspeed might be a bit more appropriate.

I think you would want both a SCBUSGSPEED and SCBUSSSPEED to get and set
the bus speeds.

> +
>  #endif /* _SYS_SCSIIO_H_ */
> Index: dev/scsipi/scsiconf.c
> ===================================================================
> RCS file: /cvsroot/syssrc/sys/dev/scsipi/scsiconf.c,v
> retrieving revision 1.148
> diff -u -r1.148 scsiconf.c
> --- scsiconf.c	2000/08/03 12:36:08	1.148
> +++ scsiconf.c	2000/08/07 23:43:35
> @@ -817,7 +817,7 @@
>  	default:
>  		break;
>  	}
> -	if (checkdtype)
> +	if (checkdtype) {
>  		switch (inqbuf.device & SID_TYPE) {
>  		case T_DIRECT:
>  		case T_SEQUENTIAL:
> @@ -841,6 +841,25 @@
>  		case T_NODEVICE:
>  			goto bad;
>  		}
> +		/*
> +		 * At this point we can also tell the adapter that it
> +		 * may negotiate things as appropriate.
> +		 */
> +		if (sc_link->adapter->scsipi_ioctl) {
> +			struct scbusaccel_args s;
> +			s.sa_target = target;
> +			s.sa_lun = lun;
> +			s.sa_flags = 0;
> +			if ((sc_link->quirks & SDEV_NOTAG) == 0)
> +				s.sa_flags |= SC_ACCEL_TAGS;
> +			if ((sc_link->quirks & SDEV_NOSYNC) == 0)
> +				s.sa_flags |= SC_ACCEL_SYNC;
> +			if ((sc_link->quirks & SDEV_NOWIDE) == 0)
> +				s.sa_flags |= SC_ACCEL_WIDE;
> +			(void) (*sc_link->adapter->scsipi_ioctl)
> +			    (sc_link, SCBUSACCEL, (caddr_t)&s, FWRITE, curproc);
> +		}
> +	}
>  
>  	if ((cf = config_search(scsibussubmatch, (struct device *)scsi,
>  	    &sa)) != NULL) {
> 

Eduardo Horvath