xref: /linux/drivers/scsi/scsi_transport_spi.c (revision 2624f124b3b5d550ab2fbef7ee3bc0e1fed09722)
1 /*
2  *  Parallel SCSI (SPI) transport specific attributes exported to sysfs.
3  *
4  *  Copyright (c) 2003 Silicon Graphics, Inc.  All rights reserved.
5  *  Copyright (c) 2004, 2005 James Bottomley <James.Bottomley@SteelEye.com>
6  *
7  *  This program is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation; either version 2 of the License, or
10  *  (at your option) any later version.
11  *
12  *  This program is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License
18  *  along with this program; if not, write to the Free Software
19  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  */
21 #include <linux/ctype.h>
22 #include <linux/init.h>
23 #include <linux/module.h>
24 #include <linux/workqueue.h>
25 #include <linux/blkdev.h>
26 #include <asm/semaphore.h>
27 #include <scsi/scsi.h>
28 #include "scsi_priv.h"
29 #include <scsi/scsi_device.h>
30 #include <scsi/scsi_host.h>
31 #include <scsi/scsi_cmnd.h>
32 #include <scsi/scsi_eh.h>
33 #include <scsi/scsi_transport.h>
34 #include <scsi/scsi_transport_spi.h>
35 
36 #define SPI_PRINTK(x, l, f, a...)	dev_printk(l, &(x)->dev, f , ##a)
37 
38 #define SPI_NUM_ATTRS 14	/* increase this if you add attributes */
39 #define SPI_OTHER_ATTRS 1	/* Increase this if you add "always
40 				 * on" attributes */
41 #define SPI_HOST_ATTRS	1
42 
43 #define SPI_MAX_ECHO_BUFFER_SIZE	4096
44 
45 #define DV_LOOPS	3
46 #define DV_TIMEOUT	(10*HZ)
47 #define DV_RETRIES	3	/* should only need at most
48 				 * two cc/ua clears */
49 
50 /* Private data accessors (keep these out of the header file) */
51 #define spi_dv_pending(x) (((struct spi_transport_attrs *)&(x)->starget_data)->dv_pending)
52 #define spi_dv_sem(x) (((struct spi_transport_attrs *)&(x)->starget_data)->dv_sem)
53 
54 struct spi_internal {
55 	struct scsi_transport_template t;
56 	struct spi_function_template *f;
57 	/* The actual attributes */
58 	struct class_device_attribute private_attrs[SPI_NUM_ATTRS];
59 	/* The array of null terminated pointers to attributes
60 	 * needed by scsi_sysfs.c */
61 	struct class_device_attribute *attrs[SPI_NUM_ATTRS + SPI_OTHER_ATTRS + 1];
62 	struct class_device_attribute private_host_attrs[SPI_HOST_ATTRS];
63 	struct class_device_attribute *host_attrs[SPI_HOST_ATTRS + 1];
64 };
65 
66 #define to_spi_internal(tmpl)	container_of(tmpl, struct spi_internal, t)
67 
68 static const int ppr_to_ps[] = {
69 	/* The PPR values 0-6 are reserved, fill them in when
70 	 * the committee defines them */
71 	-1,			/* 0x00 */
72 	-1,			/* 0x01 */
73 	-1,			/* 0x02 */
74 	-1,			/* 0x03 */
75 	-1,			/* 0x04 */
76 	-1,			/* 0x05 */
77 	-1,			/* 0x06 */
78 	 3125,			/* 0x07 */
79 	 6250,			/* 0x08 */
80 	12500,			/* 0x09 */
81 	25000,			/* 0x0a */
82 	30300,			/* 0x0b */
83 	50000,			/* 0x0c */
84 };
85 /* The PPR values at which you calculate the period in ns by multiplying
86  * by 4 */
87 #define SPI_STATIC_PPR	0x0c
88 
89 static int sprint_frac(char *dest, int value, int denom)
90 {
91 	int frac = value % denom;
92 	int result = sprintf(dest, "%d", value / denom);
93 
94 	if (frac == 0)
95 		return result;
96 	dest[result++] = '.';
97 
98 	do {
99 		denom /= 10;
100 		sprintf(dest + result, "%d", frac / denom);
101 		result++;
102 		frac %= denom;
103 	} while (frac);
104 
105 	dest[result++] = '\0';
106 	return result;
107 }
108 
109 static int spi_execute(struct scsi_device *sdev, const void *cmd,
110 		       enum dma_data_direction dir,
111 		       void *buffer, unsigned bufflen,
112 		       struct scsi_sense_hdr *sshdr)
113 {
114 	int i, result;
115 	unsigned char sense[SCSI_SENSE_BUFFERSIZE];
116 
117 	for(i = 0; i < DV_RETRIES; i++) {
118 		result = scsi_execute(sdev, cmd, dir, buffer, bufflen,
119 				      sense, DV_TIMEOUT, /* retries */ 1,
120 				      REQ_FAILFAST);
121 		if (result & DRIVER_SENSE) {
122 			struct scsi_sense_hdr sshdr_tmp;
123 			if (!sshdr)
124 				sshdr = &sshdr_tmp;
125 
126 			if (scsi_normalize_sense(sense, sizeof(*sense),
127 						 sshdr)
128 			    && sshdr->sense_key == UNIT_ATTENTION)
129 				continue;
130 		}
131 		break;
132 	}
133 	return result;
134 }
135 
136 static struct {
137 	enum spi_signal_type	value;
138 	char			*name;
139 } signal_types[] = {
140 	{ SPI_SIGNAL_UNKNOWN, "unknown" },
141 	{ SPI_SIGNAL_SE, "SE" },
142 	{ SPI_SIGNAL_LVD, "LVD" },
143 	{ SPI_SIGNAL_HVD, "HVD" },
144 };
145 
146 static inline const char *spi_signal_to_string(enum spi_signal_type type)
147 {
148 	int i;
149 
150 	for (i = 0; i < sizeof(signal_types)/sizeof(signal_types[0]); i++) {
151 		if (type == signal_types[i].value)
152 			return signal_types[i].name;
153 	}
154 	return NULL;
155 }
156 static inline enum spi_signal_type spi_signal_to_value(const char *name)
157 {
158 	int i, len;
159 
160 	for (i = 0; i < sizeof(signal_types)/sizeof(signal_types[0]); i++) {
161 		len =  strlen(signal_types[i].name);
162 		if (strncmp(name, signal_types[i].name, len) == 0 &&
163 		    (name[len] == '\n' || name[len] == '\0'))
164 			return signal_types[i].value;
165 	}
166 	return SPI_SIGNAL_UNKNOWN;
167 }
168 
169 static int spi_host_setup(struct transport_container *tc, struct device *dev,
170 			  struct class_device *cdev)
171 {
172 	struct Scsi_Host *shost = dev_to_shost(dev);
173 
174 	spi_signalling(shost) = SPI_SIGNAL_UNKNOWN;
175 
176 	return 0;
177 }
178 
179 static DECLARE_TRANSPORT_CLASS(spi_host_class,
180 			       "spi_host",
181 			       spi_host_setup,
182 			       NULL,
183 			       NULL);
184 
185 static int spi_host_match(struct attribute_container *cont,
186 			  struct device *dev)
187 {
188 	struct Scsi_Host *shost;
189 	struct spi_internal *i;
190 
191 	if (!scsi_is_host_device(dev))
192 		return 0;
193 
194 	shost = dev_to_shost(dev);
195 	if (!shost->transportt  || shost->transportt->host_attrs.ac.class
196 	    != &spi_host_class.class)
197 		return 0;
198 
199 	i = to_spi_internal(shost->transportt);
200 
201 	return &i->t.host_attrs.ac == cont;
202 }
203 
204 static int spi_device_configure(struct transport_container *tc,
205 				struct device *dev,
206 				struct class_device *cdev)
207 {
208 	struct scsi_device *sdev = to_scsi_device(dev);
209 	struct scsi_target *starget = sdev->sdev_target;
210 
211 	/* Populate the target capability fields with the values
212 	 * gleaned from the device inquiry */
213 
214 	spi_support_sync(starget) = scsi_device_sync(sdev);
215 	spi_support_wide(starget) = scsi_device_wide(sdev);
216 	spi_support_dt(starget) = scsi_device_dt(sdev);
217 	spi_support_dt_only(starget) = scsi_device_dt_only(sdev);
218 	spi_support_ius(starget) = scsi_device_ius(sdev);
219 	spi_support_qas(starget) = scsi_device_qas(sdev);
220 
221 	return 0;
222 }
223 
224 static int spi_setup_transport_attrs(struct transport_container *tc,
225 				     struct device *dev,
226 				     struct class_device *cdev)
227 {
228 	struct scsi_target *starget = to_scsi_target(dev);
229 
230 	spi_period(starget) = -1;	/* illegal value */
231 	spi_min_period(starget) = 0;
232 	spi_offset(starget) = 0;	/* async */
233 	spi_max_offset(starget) = 255;
234 	spi_width(starget) = 0;	/* narrow */
235 	spi_max_width(starget) = 1;
236 	spi_iu(starget) = 0;	/* no IU */
237 	spi_dt(starget) = 0;	/* ST */
238 	spi_qas(starget) = 0;
239 	spi_wr_flow(starget) = 0;
240 	spi_rd_strm(starget) = 0;
241 	spi_rti(starget) = 0;
242 	spi_pcomp_en(starget) = 0;
243 	spi_hold_mcs(starget) = 0;
244 	spi_dv_pending(starget) = 0;
245 	spi_initial_dv(starget) = 0;
246 	init_MUTEX(&spi_dv_sem(starget));
247 
248 	return 0;
249 }
250 
251 #define spi_transport_show_simple(field, format_string)			\
252 									\
253 static ssize_t								\
254 show_spi_transport_##field(struct class_device *cdev, char *buf)	\
255 {									\
256 	struct scsi_target *starget = transport_class_to_starget(cdev);	\
257 	struct spi_transport_attrs *tp;					\
258 									\
259 	tp = (struct spi_transport_attrs *)&starget->starget_data;	\
260 	return snprintf(buf, 20, format_string, tp->field);		\
261 }
262 
263 #define spi_transport_store_simple(field, format_string)		\
264 									\
265 static ssize_t								\
266 store_spi_transport_##field(struct class_device *cdev, const char *buf, \
267 			    size_t count)				\
268 {									\
269 	int val;							\
270 	struct scsi_target *starget = transport_class_to_starget(cdev);	\
271 	struct spi_transport_attrs *tp;					\
272 									\
273 	tp = (struct spi_transport_attrs *)&starget->starget_data;	\
274 	val = simple_strtoul(buf, NULL, 0);				\
275 	tp->field = val;						\
276 	return count;							\
277 }
278 
279 #define spi_transport_show_function(field, format_string)		\
280 									\
281 static ssize_t								\
282 show_spi_transport_##field(struct class_device *cdev, char *buf)	\
283 {									\
284 	struct scsi_target *starget = transport_class_to_starget(cdev);	\
285 	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);	\
286 	struct spi_transport_attrs *tp;					\
287 	struct spi_internal *i = to_spi_internal(shost->transportt);	\
288 	tp = (struct spi_transport_attrs *)&starget->starget_data;	\
289 	if (i->f->get_##field)						\
290 		i->f->get_##field(starget);				\
291 	return snprintf(buf, 20, format_string, tp->field);		\
292 }
293 
294 #define spi_transport_store_function(field, format_string)		\
295 static ssize_t								\
296 store_spi_transport_##field(struct class_device *cdev, const char *buf, \
297 			    size_t count)				\
298 {									\
299 	int val;							\
300 	struct scsi_target *starget = transport_class_to_starget(cdev);	\
301 	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);	\
302 	struct spi_internal *i = to_spi_internal(shost->transportt);	\
303 									\
304 	val = simple_strtoul(buf, NULL, 0);				\
305 	i->f->set_##field(starget, val);			\
306 	return count;							\
307 }
308 
309 #define spi_transport_store_max(field, format_string)			\
310 static ssize_t								\
311 store_spi_transport_##field(struct class_device *cdev, const char *buf, \
312 			    size_t count)				\
313 {									\
314 	int val;							\
315 	struct scsi_target *starget = transport_class_to_starget(cdev);	\
316 	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);	\
317 	struct spi_internal *i = to_spi_internal(shost->transportt);	\
318 	struct spi_transport_attrs *tp					\
319 		= (struct spi_transport_attrs *)&starget->starget_data;	\
320 									\
321 	val = simple_strtoul(buf, NULL, 0);				\
322 	if (val > tp->max_##field)					\
323 		val = tp->max_##field;					\
324 	i->f->set_##field(starget, val);				\
325 	return count;							\
326 }
327 
328 #define spi_transport_rd_attr(field, format_string)			\
329 	spi_transport_show_function(field, format_string)		\
330 	spi_transport_store_function(field, format_string)		\
331 static CLASS_DEVICE_ATTR(field, S_IRUGO | S_IWUSR,			\
332 			 show_spi_transport_##field,			\
333 			 store_spi_transport_##field);
334 
335 #define spi_transport_simple_attr(field, format_string)			\
336 	spi_transport_show_simple(field, format_string)			\
337 	spi_transport_store_simple(field, format_string)		\
338 static CLASS_DEVICE_ATTR(field, S_IRUGO | S_IWUSR,			\
339 			 show_spi_transport_##field,			\
340 			 store_spi_transport_##field);
341 
342 #define spi_transport_max_attr(field, format_string)			\
343 	spi_transport_show_function(field, format_string)		\
344 	spi_transport_store_max(field, format_string)			\
345 	spi_transport_simple_attr(max_##field, format_string)		\
346 static CLASS_DEVICE_ATTR(field, S_IRUGO | S_IWUSR,			\
347 			 show_spi_transport_##field,			\
348 			 store_spi_transport_##field);
349 
350 /* The Parallel SCSI Tranport Attributes: */
351 spi_transport_max_attr(offset, "%d\n");
352 spi_transport_max_attr(width, "%d\n");
353 spi_transport_rd_attr(iu, "%d\n");
354 spi_transport_rd_attr(dt, "%d\n");
355 spi_transport_rd_attr(qas, "%d\n");
356 spi_transport_rd_attr(wr_flow, "%d\n");
357 spi_transport_rd_attr(rd_strm, "%d\n");
358 spi_transport_rd_attr(rti, "%d\n");
359 spi_transport_rd_attr(pcomp_en, "%d\n");
360 spi_transport_rd_attr(hold_mcs, "%d\n");
361 
362 /* we only care about the first child device so we return 1 */
363 static int child_iter(struct device *dev, void *data)
364 {
365 	struct scsi_device *sdev = to_scsi_device(dev);
366 
367 	spi_dv_device(sdev);
368 	return 1;
369 }
370 
371 static ssize_t
372 store_spi_revalidate(struct class_device *cdev, const char *buf, size_t count)
373 {
374 	struct scsi_target *starget = transport_class_to_starget(cdev);
375 
376 	device_for_each_child(&starget->dev, NULL, child_iter);
377 	return count;
378 }
379 static CLASS_DEVICE_ATTR(revalidate, S_IWUSR, NULL, store_spi_revalidate);
380 
381 /* Translate the period into ns according to the current spec
382  * for SDTR/PPR messages */
383 static ssize_t
384 show_spi_transport_period_helper(struct class_device *cdev, char *buf,
385 				 int period)
386 {
387 	int len, picosec;
388 
389 	if (period < 0 || period > 0xff) {
390 		picosec = -1;
391 	} else if (period <= SPI_STATIC_PPR) {
392 		picosec = ppr_to_ps[period];
393 	} else {
394 		picosec = period * 4000;
395 	}
396 
397 	if (picosec == -1) {
398 		len = sprintf(buf, "reserved");
399 	} else {
400 		len = sprint_frac(buf, picosec, 1000);
401 	}
402 
403 	buf[len++] = '\n';
404 	buf[len] = '\0';
405 	return len;
406 }
407 
408 static ssize_t
409 store_spi_transport_period_helper(struct class_device *cdev, const char *buf,
410 				  size_t count, int *periodp)
411 {
412 	int j, picosec, period = -1;
413 	char *endp;
414 
415 	picosec = simple_strtoul(buf, &endp, 10) * 1000;
416 	if (*endp == '.') {
417 		int mult = 100;
418 		do {
419 			endp++;
420 			if (!isdigit(*endp))
421 				break;
422 			picosec += (*endp - '0') * mult;
423 			mult /= 10;
424 		} while (mult > 0);
425 	}
426 
427 	for (j = 0; j <= SPI_STATIC_PPR; j++) {
428 		if (ppr_to_ps[j] < picosec)
429 			continue;
430 		period = j;
431 		break;
432 	}
433 
434 	if (period == -1)
435 		period = picosec / 4000;
436 
437 	if (period > 0xff)
438 		period = 0xff;
439 
440 	*periodp = period;
441 
442 	return count;
443 }
444 
445 static ssize_t
446 show_spi_transport_period(struct class_device *cdev, char *buf)
447 {
448 	struct scsi_target *starget = transport_class_to_starget(cdev);
449 	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
450 	struct spi_internal *i = to_spi_internal(shost->transportt);
451 	struct spi_transport_attrs *tp =
452 		(struct spi_transport_attrs *)&starget->starget_data;
453 
454 	if (i->f->get_period)
455 		i->f->get_period(starget);
456 
457 	return show_spi_transport_period_helper(cdev, buf, tp->period);
458 }
459 
460 static ssize_t
461 store_spi_transport_period(struct class_device *cdev, const char *buf,
462 			    size_t count)
463 {
464 	struct scsi_target *starget = transport_class_to_starget(cdev);
465 	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
466 	struct spi_internal *i = to_spi_internal(shost->transportt);
467 	struct spi_transport_attrs *tp =
468 		(struct spi_transport_attrs *)&starget->starget_data;
469 	int period, retval;
470 
471 	retval = store_spi_transport_period_helper(cdev, buf, count, &period);
472 
473 	if (period < tp->min_period)
474 		period = tp->min_period;
475 
476 	i->f->set_period(starget, period);
477 
478 	return retval;
479 }
480 
481 static CLASS_DEVICE_ATTR(period, S_IRUGO | S_IWUSR,
482 			 show_spi_transport_period,
483 			 store_spi_transport_period);
484 
485 static ssize_t
486 show_spi_transport_min_period(struct class_device *cdev, char *buf)
487 {
488 	struct scsi_target *starget = transport_class_to_starget(cdev);
489 	struct spi_transport_attrs *tp =
490 		(struct spi_transport_attrs *)&starget->starget_data;
491 
492 	return show_spi_transport_period_helper(cdev, buf, tp->min_period);
493 }
494 
495 static ssize_t
496 store_spi_transport_min_period(struct class_device *cdev, const char *buf,
497 			    size_t count)
498 {
499 	struct scsi_target *starget = transport_class_to_starget(cdev);
500 	struct spi_transport_attrs *tp =
501 		(struct spi_transport_attrs *)&starget->starget_data;
502 
503 	return store_spi_transport_period_helper(cdev, buf, count,
504 						 &tp->min_period);
505 }
506 
507 
508 static CLASS_DEVICE_ATTR(min_period, S_IRUGO | S_IWUSR,
509 			 show_spi_transport_min_period,
510 			 store_spi_transport_min_period);
511 
512 
513 static ssize_t show_spi_host_signalling(struct class_device *cdev, char *buf)
514 {
515 	struct Scsi_Host *shost = transport_class_to_shost(cdev);
516 	struct spi_internal *i = to_spi_internal(shost->transportt);
517 
518 	if (i->f->get_signalling)
519 		i->f->get_signalling(shost);
520 
521 	return sprintf(buf, "%s\n", spi_signal_to_string(spi_signalling(shost)));
522 }
523 static ssize_t store_spi_host_signalling(struct class_device *cdev,
524 					 const char *buf, size_t count)
525 {
526 	struct Scsi_Host *shost = transport_class_to_shost(cdev);
527 	struct spi_internal *i = to_spi_internal(shost->transportt);
528 	enum spi_signal_type type = spi_signal_to_value(buf);
529 
530 	if (type != SPI_SIGNAL_UNKNOWN)
531 		i->f->set_signalling(shost, type);
532 
533 	return count;
534 }
535 static CLASS_DEVICE_ATTR(signalling, S_IRUGO | S_IWUSR,
536 			 show_spi_host_signalling,
537 			 store_spi_host_signalling);
538 
539 #define DV_SET(x, y)			\
540 	if(i->f->set_##x)		\
541 		i->f->set_##x(sdev->sdev_target, y)
542 
543 enum spi_compare_returns {
544 	SPI_COMPARE_SUCCESS,
545 	SPI_COMPARE_FAILURE,
546 	SPI_COMPARE_SKIP_TEST,
547 };
548 
549 
550 /* This is for read/write Domain Validation:  If the device supports
551  * an echo buffer, we do read/write tests to it */
552 static enum spi_compare_returns
553 spi_dv_device_echo_buffer(struct scsi_device *sdev, u8 *buffer,
554 			  u8 *ptr, const int retries)
555 {
556 	int len = ptr - buffer;
557 	int j, k, r, result;
558 	unsigned int pattern = 0x0000ffff;
559 	struct scsi_sense_hdr sshdr;
560 
561 	const char spi_write_buffer[] = {
562 		WRITE_BUFFER, 0x0a, 0, 0, 0, 0, 0, len >> 8, len & 0xff, 0
563 	};
564 	const char spi_read_buffer[] = {
565 		READ_BUFFER, 0x0a, 0, 0, 0, 0, 0, len >> 8, len & 0xff, 0
566 	};
567 
568 	/* set up the pattern buffer.  Doesn't matter if we spill
569 	 * slightly beyond since that's where the read buffer is */
570 	for (j = 0; j < len; ) {
571 
572 		/* fill the buffer with counting (test a) */
573 		for ( ; j < min(len, 32); j++)
574 			buffer[j] = j;
575 		k = j;
576 		/* fill the buffer with alternating words of 0x0 and
577 		 * 0xffff (test b) */
578 		for ( ; j < min(len, k + 32); j += 2) {
579 			u16 *word = (u16 *)&buffer[j];
580 
581 			*word = (j & 0x02) ? 0x0000 : 0xffff;
582 		}
583 		k = j;
584 		/* fill with crosstalk (alternating 0x5555 0xaaa)
585                  * (test c) */
586 		for ( ; j < min(len, k + 32); j += 2) {
587 			u16 *word = (u16 *)&buffer[j];
588 
589 			*word = (j & 0x02) ? 0x5555 : 0xaaaa;
590 		}
591 		k = j;
592 		/* fill with shifting bits (test d) */
593 		for ( ; j < min(len, k + 32); j += 4) {
594 			u32 *word = (unsigned int *)&buffer[j];
595 			u32 roll = (pattern & 0x80000000) ? 1 : 0;
596 
597 			*word = pattern;
598 			pattern = (pattern << 1) | roll;
599 		}
600 		/* don't bother with random data (test e) */
601 	}
602 
603 	for (r = 0; r < retries; r++) {
604 		result = spi_execute(sdev, spi_write_buffer, DMA_TO_DEVICE,
605 				     buffer, len, &sshdr);
606 		if(result || !scsi_device_online(sdev)) {
607 
608 			scsi_device_set_state(sdev, SDEV_QUIESCE);
609 			if (scsi_sense_valid(&sshdr)
610 			    && sshdr.sense_key == ILLEGAL_REQUEST
611 			    /* INVALID FIELD IN CDB */
612 			    && sshdr.asc == 0x24 && sshdr.ascq == 0x00)
613 				/* This would mean that the drive lied
614 				 * to us about supporting an echo
615 				 * buffer (unfortunately some Western
616 				 * Digital drives do precisely this)
617 				 */
618 				return SPI_COMPARE_SKIP_TEST;
619 
620 
621 			SPI_PRINTK(sdev->sdev_target, KERN_ERR, "Write Buffer failure %x\n", result);
622 			return SPI_COMPARE_FAILURE;
623 		}
624 
625 		memset(ptr, 0, len);
626 		spi_execute(sdev, spi_read_buffer, DMA_FROM_DEVICE,
627 			    ptr, len, NULL);
628 		scsi_device_set_state(sdev, SDEV_QUIESCE);
629 
630 		if (memcmp(buffer, ptr, len) != 0)
631 			return SPI_COMPARE_FAILURE;
632 	}
633 	return SPI_COMPARE_SUCCESS;
634 }
635 
636 /* This is for the simplest form of Domain Validation: a read test
637  * on the inquiry data from the device */
638 static enum spi_compare_returns
639 spi_dv_device_compare_inquiry(struct scsi_device *sdev, u8 *buffer,
640 			      u8 *ptr, const int retries)
641 {
642 	int r, result;
643 	const int len = sdev->inquiry_len;
644 	const char spi_inquiry[] = {
645 		INQUIRY, 0, 0, 0, len, 0
646 	};
647 
648 	for (r = 0; r < retries; r++) {
649 		memset(ptr, 0, len);
650 
651 		result = spi_execute(sdev, spi_inquiry, DMA_FROM_DEVICE,
652 				     ptr, len, NULL);
653 
654 		if(result || !scsi_device_online(sdev)) {
655 			scsi_device_set_state(sdev, SDEV_QUIESCE);
656 			return SPI_COMPARE_FAILURE;
657 		}
658 
659 		/* If we don't have the inquiry data already, the
660 		 * first read gets it */
661 		if (ptr == buffer) {
662 			ptr += len;
663 			--r;
664 			continue;
665 		}
666 
667 		if (memcmp(buffer, ptr, len) != 0)
668 			/* failure */
669 			return SPI_COMPARE_FAILURE;
670 	}
671 	return SPI_COMPARE_SUCCESS;
672 }
673 
674 static enum spi_compare_returns
675 spi_dv_retrain(struct scsi_device *sdev, u8 *buffer, u8 *ptr,
676 	       enum spi_compare_returns
677 	       (*compare_fn)(struct scsi_device *, u8 *, u8 *, int))
678 {
679 	struct spi_internal *i = to_spi_internal(sdev->host->transportt);
680 	struct scsi_target *starget = sdev->sdev_target;
681 	int period = 0, prevperiod = 0;
682 	enum spi_compare_returns retval;
683 
684 
685 	for (;;) {
686 		int newperiod;
687 		retval = compare_fn(sdev, buffer, ptr, DV_LOOPS);
688 
689 		if (retval == SPI_COMPARE_SUCCESS
690 		    || retval == SPI_COMPARE_SKIP_TEST)
691 			break;
692 
693 		/* OK, retrain, fallback */
694 		if (i->f->get_iu)
695 			i->f->get_iu(starget);
696 		if (i->f->get_qas)
697 			i->f->get_qas(starget);
698 		if (i->f->get_period)
699 			i->f->get_period(sdev->sdev_target);
700 
701 		/* Here's the fallback sequence; first try turning off
702 		 * IU, then QAS (if we can control them), then finally
703 		 * fall down the periods */
704 		if (i->f->set_iu && spi_iu(starget)) {
705 			SPI_PRINTK(starget, KERN_ERR, "Domain Validation Disabing Information Units\n");
706 			DV_SET(iu, 0);
707 		} else if (i->f->set_qas && spi_qas(starget)) {
708 			SPI_PRINTK(starget, KERN_ERR, "Domain Validation Disabing Quick Arbitration and Selection\n");
709 			DV_SET(qas, 0);
710 		} else {
711 			newperiod = spi_period(starget);
712 			period = newperiod > period ? newperiod : period;
713 			if (period < 0x0d)
714 				period++;
715 			else
716 				period += period >> 1;
717 
718 			if (unlikely(period > 0xff || period == prevperiod)) {
719 				/* Total failure; set to async and return */
720 				SPI_PRINTK(starget, KERN_ERR, "Domain Validation Failure, dropping back to Asynchronous\n");
721 				DV_SET(offset, 0);
722 				return SPI_COMPARE_FAILURE;
723 			}
724 			SPI_PRINTK(starget, KERN_ERR, "Domain Validation detected failure, dropping back\n");
725 			DV_SET(period, period);
726 			prevperiod = period;
727 		}
728 	}
729 	return retval;
730 }
731 
732 static int
733 spi_dv_device_get_echo_buffer(struct scsi_device *sdev, u8 *buffer)
734 {
735 	int l, result;
736 
737 	/* first off do a test unit ready.  This can error out
738 	 * because of reservations or some other reason.  If it
739 	 * fails, the device won't let us write to the echo buffer
740 	 * so just return failure */
741 
742 	const char spi_test_unit_ready[] = {
743 		TEST_UNIT_READY, 0, 0, 0, 0, 0
744 	};
745 
746 	const char spi_read_buffer_descriptor[] = {
747 		READ_BUFFER, 0x0b, 0, 0, 0, 0, 0, 0, 4, 0
748 	};
749 
750 
751 	/* We send a set of three TURs to clear any outstanding
752 	 * unit attention conditions if they exist (Otherwise the
753 	 * buffer tests won't be happy).  If the TUR still fails
754 	 * (reservation conflict, device not ready, etc) just
755 	 * skip the write tests */
756 	for (l = 0; ; l++) {
757 		result = spi_execute(sdev, spi_test_unit_ready, DMA_NONE,
758 				     NULL, 0, NULL);
759 
760 		if(result) {
761 			if(l >= 3)
762 				return 0;
763 		} else {
764 			/* TUR succeeded */
765 			break;
766 		}
767 	}
768 
769 	result = spi_execute(sdev, spi_read_buffer_descriptor,
770 			     DMA_FROM_DEVICE, buffer, 4, NULL);
771 
772 	if (result)
773 		/* Device has no echo buffer */
774 		return 0;
775 
776 	return buffer[3] + ((buffer[2] & 0x1f) << 8);
777 }
778 
779 static void
780 spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer)
781 {
782 	struct spi_internal *i = to_spi_internal(sdev->host->transportt);
783 	struct scsi_target *starget = sdev->sdev_target;
784 	int len = sdev->inquiry_len;
785 	/* first set us up for narrow async */
786 	DV_SET(offset, 0);
787 	DV_SET(width, 0);
788 
789 	if (spi_dv_device_compare_inquiry(sdev, buffer, buffer, DV_LOOPS)
790 	    != SPI_COMPARE_SUCCESS) {
791 		SPI_PRINTK(starget, KERN_ERR, "Domain Validation Initial Inquiry Failed\n");
792 		/* FIXME: should probably offline the device here? */
793 		return;
794 	}
795 
796 	/* test width */
797 	if (i->f->set_width && spi_max_width(starget) &&
798 	    scsi_device_wide(sdev)) {
799 		i->f->set_width(starget, 1);
800 
801 		if (spi_dv_device_compare_inquiry(sdev, buffer,
802 						   buffer + len,
803 						   DV_LOOPS)
804 		    != SPI_COMPARE_SUCCESS) {
805 			SPI_PRINTK(starget, KERN_ERR, "Wide Transfers Fail\n");
806 			i->f->set_width(starget, 0);
807 		}
808 	}
809 
810 	if (!i->f->set_period)
811 		return;
812 
813 	/* device can't handle synchronous */
814 	if (!scsi_device_sync(sdev) && !scsi_device_dt(sdev))
815 		return;
816 
817 	/* see if the device has an echo buffer.  If it does we can
818 	 * do the SPI pattern write tests */
819 
820 	len = 0;
821 	if (scsi_device_dt(sdev))
822 		len = spi_dv_device_get_echo_buffer(sdev, buffer);
823 
824  retry:
825 
826 	/* now set up to the maximum */
827 	DV_SET(offset, spi_max_offset(starget));
828 	DV_SET(period, spi_min_period(starget));
829 	/* try QAS requests; this should be harmless to set if the
830 	 * target supports it */
831 	if (scsi_device_qas(sdev))
832 		DV_SET(qas, 1);
833 	/* Also try IU transfers */
834 	if (scsi_device_ius(sdev))
835 		DV_SET(iu, 1);
836 	if (spi_min_period(starget) < 9) {
837 		/* This u320 (or u640). Ignore the coupled parameters
838 		 * like DT and IU, but set the optional ones */
839 		DV_SET(rd_strm, 1);
840 		DV_SET(wr_flow, 1);
841 		DV_SET(rti, 1);
842 		if (spi_min_period(starget) == 8)
843 			DV_SET(pcomp_en, 1);
844 	}
845 
846 	if (len == 0) {
847 		SPI_PRINTK(starget, KERN_INFO, "Domain Validation skipping write tests\n");
848 		spi_dv_retrain(sdev, buffer, buffer + len,
849 			       spi_dv_device_compare_inquiry);
850 		return;
851 	}
852 
853 	if (len > SPI_MAX_ECHO_BUFFER_SIZE) {
854 		SPI_PRINTK(starget, KERN_WARNING, "Echo buffer size %d is too big, trimming to %d\n", len, SPI_MAX_ECHO_BUFFER_SIZE);
855 		len = SPI_MAX_ECHO_BUFFER_SIZE;
856 	}
857 
858 	if (spi_dv_retrain(sdev, buffer, buffer + len,
859 			   spi_dv_device_echo_buffer)
860 	    == SPI_COMPARE_SKIP_TEST) {
861 		/* OK, the stupid drive can't do a write echo buffer
862 		 * test after all, fall back to the read tests */
863 		len = 0;
864 		goto retry;
865 	}
866 }
867 
868 
869 /**	spi_dv_device - Do Domain Validation on the device
870  *	@sdev:		scsi device to validate
871  *
872  *	Performs the domain validation on the given device in the
873  *	current execution thread.  Since DV operations may sleep,
874  *	the current thread must have user context.  Also no SCSI
875  *	related locks that would deadlock I/O issued by the DV may
876  *	be held.
877  */
878 void
879 spi_dv_device(struct scsi_device *sdev)
880 {
881 	struct scsi_target *starget = sdev->sdev_target;
882 	u8 *buffer;
883 	const int len = SPI_MAX_ECHO_BUFFER_SIZE*2;
884 
885 	if (unlikely(scsi_device_get(sdev)))
886 		return;
887 
888 	buffer = kmalloc(len, GFP_KERNEL);
889 
890 	if (unlikely(!buffer))
891 		goto out_put;
892 
893 	memset(buffer, 0, len);
894 
895 	/* We need to verify that the actual device will quiesce; the
896 	 * later target quiesce is just a nice to have */
897 	if (unlikely(scsi_device_quiesce(sdev)))
898 		goto out_free;
899 
900 	scsi_target_quiesce(starget);
901 
902 	spi_dv_pending(starget) = 1;
903 	down(&spi_dv_sem(starget));
904 
905 	SPI_PRINTK(starget, KERN_INFO, "Beginning Domain Validation\n");
906 
907 	spi_dv_device_internal(sdev, buffer);
908 
909 	SPI_PRINTK(starget, KERN_INFO, "Ending Domain Validation\n");
910 
911 	up(&spi_dv_sem(starget));
912 	spi_dv_pending(starget) = 0;
913 
914 	scsi_target_resume(starget);
915 
916 	spi_initial_dv(starget) = 1;
917 
918  out_free:
919 	kfree(buffer);
920  out_put:
921 	scsi_device_put(sdev);
922 }
923 EXPORT_SYMBOL(spi_dv_device);
924 
925 struct work_queue_wrapper {
926 	struct work_struct	work;
927 	struct scsi_device	*sdev;
928 };
929 
930 static void
931 spi_dv_device_work_wrapper(void *data)
932 {
933 	struct work_queue_wrapper *wqw = (struct work_queue_wrapper *)data;
934 	struct scsi_device *sdev = wqw->sdev;
935 
936 	kfree(wqw);
937 	spi_dv_device(sdev);
938 	spi_dv_pending(sdev->sdev_target) = 0;
939 	scsi_device_put(sdev);
940 }
941 
942 
943 /**
944  *	spi_schedule_dv_device - schedule domain validation to occur on the device
945  *	@sdev:	The device to validate
946  *
947  *	Identical to spi_dv_device() above, except that the DV will be
948  *	scheduled to occur in a workqueue later.  All memory allocations
949  *	are atomic, so may be called from any context including those holding
950  *	SCSI locks.
951  */
952 void
953 spi_schedule_dv_device(struct scsi_device *sdev)
954 {
955 	struct work_queue_wrapper *wqw =
956 		kmalloc(sizeof(struct work_queue_wrapper), GFP_ATOMIC);
957 
958 	if (unlikely(!wqw))
959 		return;
960 
961 	if (unlikely(spi_dv_pending(sdev->sdev_target))) {
962 		kfree(wqw);
963 		return;
964 	}
965 	/* Set pending early (dv_device doesn't check it, only sets it) */
966 	spi_dv_pending(sdev->sdev_target) = 1;
967 	if (unlikely(scsi_device_get(sdev))) {
968 		kfree(wqw);
969 		spi_dv_pending(sdev->sdev_target) = 0;
970 		return;
971 	}
972 
973 	INIT_WORK(&wqw->work, spi_dv_device_work_wrapper, wqw);
974 	wqw->sdev = sdev;
975 
976 	schedule_work(&wqw->work);
977 }
978 EXPORT_SYMBOL(spi_schedule_dv_device);
979 
980 /**
981  * spi_display_xfer_agreement - Print the current target transfer agreement
982  * @starget: The target for which to display the agreement
983  *
984  * Each SPI port is required to maintain a transfer agreement for each
985  * other port on the bus.  This function prints a one-line summary of
986  * the current agreement; more detailed information is available in sysfs.
987  */
988 void spi_display_xfer_agreement(struct scsi_target *starget)
989 {
990 	struct spi_transport_attrs *tp;
991 	tp = (struct spi_transport_attrs *)&starget->starget_data;
992 
993 	if (tp->offset > 0 && tp->period > 0) {
994 		unsigned int picosec, kb100;
995 		char *scsi = "FAST-?";
996 		char tmp[8];
997 
998 		if (tp->period <= SPI_STATIC_PPR) {
999 			picosec = ppr_to_ps[tp->period];
1000 			switch (tp->period) {
1001 				case  7: scsi = "FAST-320"; break;
1002 				case  8: scsi = "FAST-160"; break;
1003 				case  9: scsi = "FAST-80"; break;
1004 				case 10:
1005 				case 11: scsi = "FAST-40"; break;
1006 				case 12: scsi = "FAST-20"; break;
1007 			}
1008 		} else {
1009 			picosec = tp->period * 4000;
1010 			if (tp->period < 25)
1011 				scsi = "FAST-20";
1012 			else if (tp->period < 50)
1013 				scsi = "FAST-10";
1014 			else
1015 				scsi = "FAST-5";
1016 		}
1017 
1018 		kb100 = (10000000 + picosec / 2) / picosec;
1019 		if (tp->width)
1020 			kb100 *= 2;
1021 		sprint_frac(tmp, picosec, 1000);
1022 
1023 		dev_info(&starget->dev,
1024 			 "%s %sSCSI %d.%d MB/s %s%s%s%s%s%s%s%s (%s ns, offset %d)\n",
1025 			 scsi, tp->width ? "WIDE " : "", kb100/10, kb100 % 10,
1026 			 tp->dt ? "DT" : "ST",
1027 			 tp->iu ? " IU" : "",
1028 			 tp->qas  ? " QAS" : "",
1029 			 tp->rd_strm ? " RDSTRM" : "",
1030 			 tp->rti ? " RTI" : "",
1031 			 tp->wr_flow ? " WRFLOW" : "",
1032 			 tp->pcomp_en ? " PCOMP" : "",
1033 			 tp->hold_mcs ? " HMCS" : "",
1034 			 tmp, tp->offset);
1035 	} else {
1036 		dev_info(&starget->dev, "%sasynchronous.\n",
1037 				tp->width ? "wide " : "");
1038 	}
1039 }
1040 EXPORT_SYMBOL(spi_display_xfer_agreement);
1041 
1042 #define SETUP_ATTRIBUTE(field)						\
1043 	i->private_attrs[count] = class_device_attr_##field;		\
1044 	if (!i->f->set_##field) {					\
1045 		i->private_attrs[count].attr.mode = S_IRUGO;		\
1046 		i->private_attrs[count].store = NULL;			\
1047 	}								\
1048 	i->attrs[count] = &i->private_attrs[count];			\
1049 	if (i->f->show_##field)						\
1050 		count++
1051 
1052 #define SETUP_RELATED_ATTRIBUTE(field, rel_field)			\
1053 	i->private_attrs[count] = class_device_attr_##field;		\
1054 	if (!i->f->set_##rel_field) {					\
1055 		i->private_attrs[count].attr.mode = S_IRUGO;		\
1056 		i->private_attrs[count].store = NULL;			\
1057 	}								\
1058 	i->attrs[count] = &i->private_attrs[count];			\
1059 	if (i->f->show_##rel_field)					\
1060 		count++
1061 
1062 #define SETUP_HOST_ATTRIBUTE(field)					\
1063 	i->private_host_attrs[count] = class_device_attr_##field;	\
1064 	if (!i->f->set_##field) {					\
1065 		i->private_host_attrs[count].attr.mode = S_IRUGO;	\
1066 		i->private_host_attrs[count].store = NULL;		\
1067 	}								\
1068 	i->host_attrs[count] = &i->private_host_attrs[count];		\
1069 	count++
1070 
1071 static int spi_device_match(struct attribute_container *cont,
1072 			    struct device *dev)
1073 {
1074 	struct scsi_device *sdev;
1075 	struct Scsi_Host *shost;
1076 	struct spi_internal *i;
1077 
1078 	if (!scsi_is_sdev_device(dev))
1079 		return 0;
1080 
1081 	sdev = to_scsi_device(dev);
1082 	shost = sdev->host;
1083 	if (!shost->transportt  || shost->transportt->host_attrs.ac.class
1084 	    != &spi_host_class.class)
1085 		return 0;
1086 	/* Note: this class has no device attributes, so it has
1087 	 * no per-HBA allocation and thus we don't need to distinguish
1088 	 * the attribute containers for the device */
1089 	i = to_spi_internal(shost->transportt);
1090 	if (i->f->deny_binding && i->f->deny_binding(sdev->sdev_target))
1091 		return 0;
1092 	return 1;
1093 }
1094 
1095 static int spi_target_match(struct attribute_container *cont,
1096 			    struct device *dev)
1097 {
1098 	struct Scsi_Host *shost;
1099 	struct scsi_target *starget;
1100 	struct spi_internal *i;
1101 
1102 	if (!scsi_is_target_device(dev))
1103 		return 0;
1104 
1105 	shost = dev_to_shost(dev->parent);
1106 	if (!shost->transportt  || shost->transportt->host_attrs.ac.class
1107 	    != &spi_host_class.class)
1108 		return 0;
1109 
1110 	i = to_spi_internal(shost->transportt);
1111 	starget = to_scsi_target(dev);
1112 
1113 	if (i->f->deny_binding && i->f->deny_binding(starget))
1114 		return 0;
1115 
1116 	return &i->t.target_attrs.ac == cont;
1117 }
1118 
1119 static DECLARE_TRANSPORT_CLASS(spi_transport_class,
1120 			       "spi_transport",
1121 			       spi_setup_transport_attrs,
1122 			       NULL,
1123 			       NULL);
1124 
1125 static DECLARE_ANON_TRANSPORT_CLASS(spi_device_class,
1126 				    spi_device_match,
1127 				    spi_device_configure);
1128 
1129 struct scsi_transport_template *
1130 spi_attach_transport(struct spi_function_template *ft)
1131 {
1132 	struct spi_internal *i = kmalloc(sizeof(struct spi_internal),
1133 					 GFP_KERNEL);
1134 	int count = 0;
1135 	if (unlikely(!i))
1136 		return NULL;
1137 
1138 	memset(i, 0, sizeof(struct spi_internal));
1139 
1140 
1141 	i->t.target_attrs.ac.class = &spi_transport_class.class;
1142 	i->t.target_attrs.ac.attrs = &i->attrs[0];
1143 	i->t.target_attrs.ac.match = spi_target_match;
1144 	transport_container_register(&i->t.target_attrs);
1145 	i->t.target_size = sizeof(struct spi_transport_attrs);
1146 	i->t.host_attrs.ac.class = &spi_host_class.class;
1147 	i->t.host_attrs.ac.attrs = &i->host_attrs[0];
1148 	i->t.host_attrs.ac.match = spi_host_match;
1149 	transport_container_register(&i->t.host_attrs);
1150 	i->t.host_size = sizeof(struct spi_host_attrs);
1151 	i->f = ft;
1152 
1153 	SETUP_ATTRIBUTE(period);
1154 	SETUP_RELATED_ATTRIBUTE(min_period, period);
1155 	SETUP_ATTRIBUTE(offset);
1156 	SETUP_RELATED_ATTRIBUTE(max_offset, offset);
1157 	SETUP_ATTRIBUTE(width);
1158 	SETUP_RELATED_ATTRIBUTE(max_width, width);
1159 	SETUP_ATTRIBUTE(iu);
1160 	SETUP_ATTRIBUTE(dt);
1161 	SETUP_ATTRIBUTE(qas);
1162 	SETUP_ATTRIBUTE(wr_flow);
1163 	SETUP_ATTRIBUTE(rd_strm);
1164 	SETUP_ATTRIBUTE(rti);
1165 	SETUP_ATTRIBUTE(pcomp_en);
1166 	SETUP_ATTRIBUTE(hold_mcs);
1167 
1168 	/* if you add an attribute but forget to increase SPI_NUM_ATTRS
1169 	 * this bug will trigger */
1170 	BUG_ON(count > SPI_NUM_ATTRS);
1171 
1172 	i->attrs[count++] = &class_device_attr_revalidate;
1173 
1174 	i->attrs[count] = NULL;
1175 
1176 	count = 0;
1177 	SETUP_HOST_ATTRIBUTE(signalling);
1178 
1179 	BUG_ON(count > SPI_HOST_ATTRS);
1180 
1181 	i->host_attrs[count] = NULL;
1182 
1183 	return &i->t;
1184 }
1185 EXPORT_SYMBOL(spi_attach_transport);
1186 
1187 void spi_release_transport(struct scsi_transport_template *t)
1188 {
1189 	struct spi_internal *i = to_spi_internal(t);
1190 
1191 	transport_container_unregister(&i->t.target_attrs);
1192 	transport_container_unregister(&i->t.host_attrs);
1193 
1194 	kfree(i);
1195 }
1196 EXPORT_SYMBOL(spi_release_transport);
1197 
1198 static __init int spi_transport_init(void)
1199 {
1200 	int error = transport_class_register(&spi_transport_class);
1201 	if (error)
1202 		return error;
1203 	error = anon_transport_class_register(&spi_device_class);
1204 	return transport_class_register(&spi_host_class);
1205 }
1206 
1207 static void __exit spi_transport_exit(void)
1208 {
1209 	transport_class_unregister(&spi_transport_class);
1210 	anon_transport_class_unregister(&spi_device_class);
1211 	transport_class_unregister(&spi_host_class);
1212 }
1213 
1214 MODULE_AUTHOR("Martin Hicks");
1215 MODULE_DESCRIPTION("SPI Transport Attributes");
1216 MODULE_LICENSE("GPL");
1217 
1218 module_init(spi_transport_init);
1219 module_exit(spi_transport_exit);
1220