public inbox for linux-scsi@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] convert 53c700 driver to use change_queue_depth API
@ 2004-12-12  0:54 James Bottomley
  2004-12-20 15:42 ` Guennadi Liakhovetski
  0 siblings, 1 reply; 4+ messages in thread
From: James Bottomley @ 2004-12-12  0:54 UTC (permalink / raw)
  To: SCSI Mailing List

rather than using an attribute override.

James

===== drivers/scsi/53c700.c 1.58 vs edited =====
--- 1.58/drivers/scsi/53c700.c	2004-10-20 19:41:52 -05:00
+++ edited/drivers/scsi/53c700.c	2004-12-11 17:48:57 -06:00
@@ -176,6 +176,7 @@
 STATIC void NCR_700_chip_reset(struct Scsi_Host *host);
 STATIC int NCR_700_slave_configure(struct scsi_device *SDpnt);
 STATIC void NCR_700_slave_destroy(struct scsi_device *SDpnt);
+static int NCR_700_change_queue_depth(struct scsi_device *SDpnt, int depth);
 
 STATIC struct device_attribute *NCR_700_dev_attrs[];
 
@@ -338,6 +339,7 @@
 	tpnt->use_clustering = ENABLE_CLUSTERING;
 	tpnt->slave_configure = NCR_700_slave_configure;
 	tpnt->slave_destroy = NCR_700_slave_destroy;
+	tpnt->change_queue_depth = NCR_700_change_queue_depth;
 	
 	if(tpnt->name == NULL)
 		tpnt->name = "53c700";
@@ -2102,18 +2104,14 @@
 	/* to do here: deallocate memory */
 }
 
-static ssize_t
-NCR_700_store_queue_depth(struct device *dev, const char *buf, size_t count)
+static int
+NCR_700_change_queue_depth(struct scsi_device *SDp, int depth)
 {
-	int depth;
-
-	struct scsi_device *SDp = to_scsi_device(dev);
-	depth = simple_strtoul(buf, NULL, 0);
 	if(depth > NCR_700_MAX_TAGS)
-		return -EINVAL;
+		depth = NCR_700_MAX_TAGS;
 	scsi_adjust_queue_depth(SDp, MSG_ORDERED_TAG, depth);
 
-	return count;
+	return depth;
 }
 
 static ssize_t
@@ -2124,14 +2122,6 @@
 	return snprintf(buf, 20, "%d\n", NCR_700_get_depth(SDp));
 }
 
-static struct device_attribute NCR_700_queue_depth_attr = {
-	.attr = {
-		.name = 	"queue_depth",
-		.mode =		S_IWUSR,
-	},
-	.store = NCR_700_store_queue_depth,
-};
-
 static struct device_attribute NCR_700_active_tags_attr = {
 	.attr = {
 		.name =		"active_tags",
@@ -2141,7 +2131,6 @@
 };
 
 STATIC struct device_attribute *NCR_700_dev_attrs[] = {
-	&NCR_700_queue_depth_attr,
 	&NCR_700_active_tags_attr,
 	NULL,
 };



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] convert 53c700 driver to use change_queue_depth API
  2004-12-12  0:54 [PATCH] convert 53c700 driver to use change_queue_depth API James Bottomley
@ 2004-12-20 15:42 ` Guennadi Liakhovetski
  2004-12-20 16:04   ` Guennadi Liakhovetski
  0 siblings, 1 reply; 4+ messages in thread
From: Guennadi Liakhovetski @ 2004-12-20 15:42 UTC (permalink / raw)
  To: James Bottomley; +Cc: SCSI Mailing List

In the comment to the method declaration:

On Sat, 11 Dec 2004, James Bottomley wrote:

> 	/*
> +	 * fill in this function to allow the queue depth of this host
> +	 * to be changeable (on a per device basis).  returns either
> +	 * the current queue depth setting (may be different from what
> +	 * was passed in) or an error.  An error should only be
> +	 * returned if the requested depth is legal but the driver was
> +	 * unable to set it.  If the requested depth is illegal, the
> +	 * driver should set and return the closest legal queue depth.
> +	 *
> +	 */
> +	int (* change_queue_depth)(struct scsi_device *, int);

And then you implement it for the 53c700 as follows:

> ===== drivers/scsi/53c700.c 1.58 vs edited =====
> --- 1.58/drivers/scsi/53c700.c	2004-10-20 19:41:52 -05:00
> +++ edited/drivers/scsi/53c700.c	2004-12-11 17:48:57 -06:00

...

> @@ -2102,18 +2104,14 @@
>  	/* to do here: deallocate memory */
>  }
>  
> -static ssize_t
> -NCR_700_store_queue_depth(struct device *dev, const char *buf, size_t count)
> +static int
> +NCR_700_change_queue_depth(struct scsi_device *SDp, int depth)
>  {
> -	int depth;
> -
> -	struct scsi_device *SDp = to_scsi_device(dev);
> -	depth = simple_strtoul(buf, NULL, 0);
>  	if(depth > NCR_700_MAX_TAGS)
> -		return -EINVAL;
> +		depth = NCR_700_MAX_TAGS;
>  	scsi_adjust_queue_depth(SDp, MSG_ORDERED_TAG, depth);
>  
> -	return count;
> +	return depth;
>  }
>  
>  static ssize_t

Shouldn't it really be something like

 	if(depth > NCR_700_MAX_TAGS)
-		return -EINVAL;
+		depth = NCR_700_MAX_TAGS;
+	if (depth < 0)
+		depth = 0;
 	scsi_adjust_queue_depth(SDp, MSG_ORDERED_TAG, depth);
 
-	return count;
+	return SDp->queue_depth == depth ? depth : -EFAIL;
 }

And, actually (nitpicking), shouldn't the comment rather be

--- include/scsi/scsi_host.h~	Tue Dec 14 22:14:07 2004
+++ include/scsi/scsi_host.h	Mon Dec 20 16:21:08 2004
@@ -219,11 +219,10 @@
 	 * fill in this function to allow the queue depth of this host
 	 * to be changeable (on a per device basis).  returns either
 	 * the current queue depth setting (may be different from what
-	 * was passed in) or an error.  An error should only be
-	 * returned if the requested depth is legal but the driver was
-	 * unable to set it.  If the requested depth is illegal, the
-	 * driver should set and return the closest legal queue depth.
-	 *
+	 * was passed in) or an error.  If the requested depth is illegal,
+	 * the driver should set and return the closest legal queue depth.
+	 * An error should only be returned if the driver was unable to
+	 * set the new depth.
 	 */
 	int (* change_queue_depth)(struct scsi_device *, int);
 
? And one more (unrelated) question (possibly, known / discussed before): 
simple_strtoul converts "-1" to 0, whereas, glibc strtoul would return 
(unsigned long)-1. It is the intended behaviour, isn't it? Perhaps, worth 
documenting in vsprintf.c...

Thanks
Guennadi
---
Guennadi Liakhovetski


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] convert 53c700 driver to use change_queue_depth API
  2004-12-20 15:42 ` Guennadi Liakhovetski
@ 2004-12-20 16:04   ` Guennadi Liakhovetski
  2004-12-22 16:53     ` James Bottomley
  0 siblings, 1 reply; 4+ messages in thread
From: Guennadi Liakhovetski @ 2004-12-20 16:04 UTC (permalink / raw)
  To: James Bottomley; +Cc: SCSI Mailing List

On Mon, 20 Dec 2004, Guennadi Liakhovetski wrote:

> Shouldn't it really be something like
> 
>  	if(depth > NCR_700_MAX_TAGS)
> -		return -EINVAL;
> +		depth = NCR_700_MAX_TAGS;
> +	if (depth < 0)
> +		depth = 0;

Ahh, yeah, sure, because of the simple_strtoul incompatibility with glibc 
this check is superfluous, but, the below doubt still remains

>  	scsi_adjust_queue_depth(SDp, MSG_ORDERED_TAG, depth);
>  
> -	return count;
> +	return SDp->queue_depth == depth ? depth : -EFAIL;
>  }
> 


Thanks
Guennadi
---
Guennadi Liakhovetski


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] convert 53c700 driver to use change_queue_depth API
  2004-12-20 16:04   ` Guennadi Liakhovetski
@ 2004-12-22 16:53     ` James Bottomley
  0 siblings, 0 replies; 4+ messages in thread
From: James Bottomley @ 2004-12-22 16:53 UTC (permalink / raw)
  To: Guennadi Liakhovetski; +Cc: SCSI Mailing List

On Mon, 2004-12-20 at 17:04 +0100, Guennadi Liakhovetski wrote:
> On Mon, 20 Dec 2004, Guennadi Liakhovetski wrote:
> 
> > Shouldn't it really be something like
> > 
> >  	if(depth > NCR_700_MAX_TAGS)
> > -		return -EINVAL;
> > +		depth = NCR_700_MAX_TAGS;
> > +	if (depth < 0)
> > +		depth = 0;
> 
> Ahh, yeah, sure, because of the simple_strtoul incompatibility with glibc 
> this check is superfluous, but, the below doubt still remains

Actually, depth may never be zero.  There is a check in an updated piece
of code which I'll send out shortly that checks it is never less than
one (in the main routine).  This got folded into an update I did and
then not properly separated again.

I'll send the update under a new subject.

James



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2004-12-22 16:53 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-12-12  0:54 [PATCH] convert 53c700 driver to use change_queue_depth API James Bottomley
2004-12-20 15:42 ` Guennadi Liakhovetski
2004-12-20 16:04   ` Guennadi Liakhovetski
2004-12-22 16:53     ` James Bottomley

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox