1  // SPDX-License-Identifier: GPL-2.0-or-later
2  /*
3   *  Parallel SCSI (SPI) transport specific attributes exported to sysfs.
4   *
5   *  Copyright (c) 2003 Silicon Graphics, Inc.  All rights reserved.
6   *  Copyright (c) 2004, 2005 James Bottomley <James.Bottomley@SteelEye.com>
7   */
8  #include <linux/ctype.h>
9  #include <linux/init.h>
10  #include <linux/module.h>
11  #include <linux/workqueue.h>
12  #include <linux/blkdev.h>
13  #include <linux/mutex.h>
14  #include <linux/sysfs.h>
15  #include <linux/slab.h>
16  #include <linux/suspend.h>
17  #include <scsi/scsi.h>
18  #include "scsi_priv.h"
19  #include <scsi/scsi_device.h>
20  #include <scsi/scsi_host.h>
21  #include <scsi/scsi_cmnd.h>
22  #include <scsi/scsi_eh.h>
23  #include <scsi/scsi_tcq.h>
24  #include <scsi/scsi_transport.h>
25  #include <scsi/scsi_transport_spi.h>
26  
27  #define SPI_NUM_ATTRS 14	/* increase this if you add attributes */
28  #define SPI_OTHER_ATTRS 1	/* Increase this if you add "always
29  				 * on" attributes */
30  #define SPI_HOST_ATTRS	1
31  
32  #define SPI_MAX_ECHO_BUFFER_SIZE	4096
33  
34  #define DV_LOOPS	3
35  #define DV_TIMEOUT	(10*HZ)
36  #define DV_RETRIES	3	/* should only need at most
37  				 * two cc/ua clears */
38  
39  /* Our blacklist flags */
40  enum {
41  	SPI_BLIST_NOIUS = (__force blist_flags_t)0x1,
42  };
43  
44  /* blacklist table, modelled on scsi_devinfo.c */
45  static struct {
46  	char *vendor;
47  	char *model;
48  	blist_flags_t flags;
49  } spi_static_device_list[] __initdata = {
50  	{"HP", "Ultrium 3-SCSI", SPI_BLIST_NOIUS },
51  	{"IBM", "ULTRIUM-TD3", SPI_BLIST_NOIUS },
52  	{NULL, NULL, 0}
53  };
54  
55  /* Private data accessors (keep these out of the header file) */
56  #define spi_dv_in_progress(x) (((struct spi_transport_attrs *)&(x)->starget_data)->dv_in_progress)
57  #define spi_dv_mutex(x) (((struct spi_transport_attrs *)&(x)->starget_data)->dv_mutex)
58  
59  struct spi_internal {
60  	struct scsi_transport_template t;
61  	struct spi_function_template *f;
62  };
63  
64  #define to_spi_internal(tmpl)	container_of(tmpl, struct spi_internal, t)
65  
66  static const int ppr_to_ps[] = {
67  	/* The PPR values 0-6 are reserved, fill them in when
68  	 * the committee defines them */
69  	-1,			/* 0x00 */
70  	-1,			/* 0x01 */
71  	-1,			/* 0x02 */
72  	-1,			/* 0x03 */
73  	-1,			/* 0x04 */
74  	-1,			/* 0x05 */
75  	-1,			/* 0x06 */
76  	 3125,			/* 0x07 */
77  	 6250,			/* 0x08 */
78  	12500,			/* 0x09 */
79  	25000,			/* 0x0a */
80  	30300,			/* 0x0b */
81  	50000,			/* 0x0c */
82  };
83  /* The PPR values at which you calculate the period in ns by multiplying
84   * by 4 */
85  #define SPI_STATIC_PPR	0x0c
86  
sprint_frac(char * dest,int value,int denom)87  static int sprint_frac(char *dest, int value, int denom)
88  {
89  	int frac = value % denom;
90  	int result = sprintf(dest, "%d", value / denom);
91  
92  	if (frac == 0)
93  		return result;
94  	dest[result++] = '.';
95  
96  	do {
97  		denom /= 10;
98  		sprintf(dest + result, "%d", frac / denom);
99  		result++;
100  		frac %= denom;
101  	} while (frac);
102  
103  	dest[result++] = '\0';
104  	return result;
105  }
106  
spi_execute(struct scsi_device * sdev,const void * cmd,enum req_op op,void * buffer,unsigned int bufflen,struct scsi_sense_hdr * sshdr)107  static int spi_execute(struct scsi_device *sdev, const void *cmd,
108  		       enum req_op op, void *buffer, unsigned int bufflen,
109  		       struct scsi_sense_hdr *sshdr)
110  {
111  	blk_opf_t opf = op | REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT |
112  			REQ_FAILFAST_DRIVER;
113  	struct scsi_failure failure_defs[] = {
114  		{
115  			.sense = UNIT_ATTENTION,
116  			.asc = SCMD_FAILURE_ASC_ANY,
117  			.ascq = SCMD_FAILURE_ASCQ_ANY,
118  			.allowed = DV_RETRIES,
119  			.result = SAM_STAT_CHECK_CONDITION,
120  		},
121  		{}
122  	};
123  	struct scsi_failures failures = {
124  		.failure_definitions = failure_defs,
125  	};
126  	const struct scsi_exec_args exec_args = {
127  		/* bypass the SDEV_QUIESCE state with BLK_MQ_REQ_PM */
128  		.req_flags = BLK_MQ_REQ_PM,
129  		.sshdr = sshdr,
130  		.failures = &failures,
131  	};
132  
133  	return scsi_execute_cmd(sdev, cmd, opf, buffer, bufflen, DV_TIMEOUT, 1,
134  				&exec_args);
135  }
136  
137  static struct {
138  	enum spi_signal_type	value;
139  	char			*name;
140  } signal_types[] = {
141  	{ SPI_SIGNAL_UNKNOWN, "unknown" },
142  	{ SPI_SIGNAL_SE, "SE" },
143  	{ SPI_SIGNAL_LVD, "LVD" },
144  	{ SPI_SIGNAL_HVD, "HVD" },
145  };
146  
spi_signal_to_string(enum spi_signal_type type)147  static inline const char *spi_signal_to_string(enum spi_signal_type type)
148  {
149  	int i;
150  
151  	for (i = 0; i < ARRAY_SIZE(signal_types); i++) {
152  		if (type == signal_types[i].value)
153  			return signal_types[i].name;
154  	}
155  	return NULL;
156  }
spi_signal_to_value(const char * name)157  static inline enum spi_signal_type spi_signal_to_value(const char *name)
158  {
159  	int i, len;
160  
161  	for (i = 0; i < ARRAY_SIZE(signal_types); i++) {
162  		len =  strlen(signal_types[i].name);
163  		if (strncmp(name, signal_types[i].name, len) == 0 &&
164  		    (name[len] == '\n' || name[len] == '\0'))
165  			return signal_types[i].value;
166  	}
167  	return SPI_SIGNAL_UNKNOWN;
168  }
169  
spi_host_setup(struct transport_container * tc,struct device * dev,struct device * cdev)170  static int spi_host_setup(struct transport_container *tc, struct device *dev,
171  			  struct device *cdev)
172  {
173  	struct Scsi_Host *shost = dev_to_shost(dev);
174  
175  	spi_signalling(shost) = SPI_SIGNAL_UNKNOWN;
176  
177  	return 0;
178  }
179  
180  static int spi_host_configure(struct transport_container *tc,
181  			      struct device *dev,
182  			      struct device *cdev);
183  
184  static DECLARE_TRANSPORT_CLASS(spi_host_class,
185  			       "spi_host",
186  			       spi_host_setup,
187  			       NULL,
188  			       spi_host_configure);
189  
spi_host_match(struct attribute_container * cont,struct device * dev)190  static int spi_host_match(struct attribute_container *cont,
191  			  struct device *dev)
192  {
193  	struct Scsi_Host *shost;
194  
195  	if (!scsi_is_host_device(dev))
196  		return 0;
197  
198  	shost = dev_to_shost(dev);
199  	if (!shost->transportt  || shost->transportt->host_attrs.ac.class
200  	    != &spi_host_class.class)
201  		return 0;
202  
203  	return &shost->transportt->host_attrs.ac == cont;
204  }
205  
206  static int spi_target_configure(struct transport_container *tc,
207  				struct device *dev,
208  				struct device *cdev);
209  
spi_device_configure(struct transport_container * tc,struct device * dev,struct device * cdev)210  static int spi_device_configure(struct transport_container *tc,
211  				struct device *dev,
212  				struct device *cdev)
213  {
214  	struct scsi_device *sdev = to_scsi_device(dev);
215  	struct scsi_target *starget = sdev->sdev_target;
216  	blist_flags_t bflags;
217  
218  	bflags = scsi_get_device_flags_keyed(sdev, &sdev->inquiry[8],
219  					     &sdev->inquiry[16],
220  					     SCSI_DEVINFO_SPI);
221  
222  	/* Populate the target capability fields with the values
223  	 * gleaned from the device inquiry */
224  
225  	spi_support_sync(starget) = scsi_device_sync(sdev);
226  	spi_support_wide(starget) = scsi_device_wide(sdev);
227  	spi_support_dt(starget) = scsi_device_dt(sdev);
228  	spi_support_dt_only(starget) = scsi_device_dt_only(sdev);
229  	spi_support_ius(starget) = scsi_device_ius(sdev);
230  	if (bflags & SPI_BLIST_NOIUS) {
231  		dev_info(dev, "Information Units disabled by blacklist\n");
232  		spi_support_ius(starget) = 0;
233  	}
234  	spi_support_qas(starget) = scsi_device_qas(sdev);
235  
236  	return 0;
237  }
238  
spi_setup_transport_attrs(struct transport_container * tc,struct device * dev,struct device * cdev)239  static int spi_setup_transport_attrs(struct transport_container *tc,
240  				     struct device *dev,
241  				     struct device *cdev)
242  {
243  	struct scsi_target *starget = to_scsi_target(dev);
244  
245  	spi_period(starget) = -1;	/* illegal value */
246  	spi_min_period(starget) = 0;
247  	spi_offset(starget) = 0;	/* async */
248  	spi_max_offset(starget) = 255;
249  	spi_width(starget) = 0;	/* narrow */
250  	spi_max_width(starget) = 1;
251  	spi_iu(starget) = 0;	/* no IU */
252  	spi_max_iu(starget) = 1;
253  	spi_dt(starget) = 0;	/* ST */
254  	spi_qas(starget) = 0;
255  	spi_max_qas(starget) = 1;
256  	spi_wr_flow(starget) = 0;
257  	spi_rd_strm(starget) = 0;
258  	spi_rti(starget) = 0;
259  	spi_pcomp_en(starget) = 0;
260  	spi_hold_mcs(starget) = 0;
261  	spi_dv_pending(starget) = 0;
262  	spi_dv_in_progress(starget) = 0;
263  	spi_initial_dv(starget) = 0;
264  	mutex_init(&spi_dv_mutex(starget));
265  
266  	return 0;
267  }
268  
269  #define spi_transport_show_simple(field, format_string)			\
270  									\
271  static ssize_t								\
272  show_spi_transport_##field(struct device *dev, 			\
273  			   struct device_attribute *attr, char *buf)	\
274  {									\
275  	struct scsi_target *starget = transport_class_to_starget(dev);	\
276  	struct spi_transport_attrs *tp;					\
277  									\
278  	tp = (struct spi_transport_attrs *)&starget->starget_data;	\
279  	return snprintf(buf, 20, format_string, tp->field);		\
280  }
281  
282  #define spi_transport_store_simple(field, format_string)		\
283  									\
284  static ssize_t								\
285  store_spi_transport_##field(struct device *dev, 			\
286  			    struct device_attribute *attr, 		\
287  			    const char *buf, size_t count)		\
288  {									\
289  	int val;							\
290  	struct scsi_target *starget = transport_class_to_starget(dev);	\
291  	struct spi_transport_attrs *tp;					\
292  									\
293  	tp = (struct spi_transport_attrs *)&starget->starget_data;	\
294  	val = simple_strtoul(buf, NULL, 0);				\
295  	tp->field = val;						\
296  	return count;							\
297  }
298  
299  #define spi_transport_show_function(field, format_string)		\
300  									\
301  static ssize_t								\
302  show_spi_transport_##field(struct device *dev, 			\
303  			   struct device_attribute *attr, char *buf)	\
304  {									\
305  	struct scsi_target *starget = transport_class_to_starget(dev);	\
306  	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);	\
307  	struct spi_transport_attrs *tp;					\
308  	struct spi_internal *i = to_spi_internal(shost->transportt);	\
309  	tp = (struct spi_transport_attrs *)&starget->starget_data;	\
310  	if (i->f->get_##field)						\
311  		i->f->get_##field(starget);				\
312  	return snprintf(buf, 20, format_string, tp->field);		\
313  }
314  
315  #define spi_transport_store_function(field, format_string)		\
316  static ssize_t								\
317  store_spi_transport_##field(struct device *dev, 			\
318  			    struct device_attribute *attr,		\
319  			    const char *buf, size_t count)		\
320  {									\
321  	int val;							\
322  	struct scsi_target *starget = transport_class_to_starget(dev);	\
323  	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);	\
324  	struct spi_internal *i = to_spi_internal(shost->transportt);	\
325  									\
326  	if (!i->f->set_##field)						\
327  		return -EINVAL;						\
328  	val = simple_strtoul(buf, NULL, 0);				\
329  	i->f->set_##field(starget, val);				\
330  	return count;							\
331  }
332  
333  #define spi_transport_store_max(field, format_string)			\
334  static ssize_t								\
335  store_spi_transport_##field(struct device *dev, 			\
336  			    struct device_attribute *attr,		\
337  			    const char *buf, size_t count)		\
338  {									\
339  	int val;							\
340  	struct scsi_target *starget = transport_class_to_starget(dev);	\
341  	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);	\
342  	struct spi_internal *i = to_spi_internal(shost->transportt);	\
343  	struct spi_transport_attrs *tp					\
344  		= (struct spi_transport_attrs *)&starget->starget_data;	\
345  									\
346  	if (!i->f->set_##field)						\
347  		return -EINVAL;						\
348  	val = simple_strtoul(buf, NULL, 0);				\
349  	if (val > tp->max_##field)					\
350  		val = tp->max_##field;					\
351  	i->f->set_##field(starget, val);				\
352  	return count;							\
353  }
354  
355  #define spi_transport_rd_attr(field, format_string)			\
356  	spi_transport_show_function(field, format_string)		\
357  	spi_transport_store_function(field, format_string)		\
358  static DEVICE_ATTR(field, S_IRUGO,				\
359  		   show_spi_transport_##field,			\
360  		   store_spi_transport_##field);
361  
362  #define spi_transport_simple_attr(field, format_string)			\
363  	spi_transport_show_simple(field, format_string)			\
364  	spi_transport_store_simple(field, format_string)		\
365  static DEVICE_ATTR(field, S_IRUGO,				\
366  		   show_spi_transport_##field,			\
367  		   store_spi_transport_##field);
368  
369  #define spi_transport_max_attr(field, format_string)			\
370  	spi_transport_show_function(field, format_string)		\
371  	spi_transport_store_max(field, format_string)			\
372  	spi_transport_simple_attr(max_##field, format_string)		\
373  static DEVICE_ATTR(field, S_IRUGO,				\
374  		   show_spi_transport_##field,			\
375  		   store_spi_transport_##field);
376  
377  /* The Parallel SCSI Tranport Attributes: */
378  spi_transport_max_attr(offset, "%d\n");
379  spi_transport_max_attr(width, "%d\n");
380  spi_transport_max_attr(iu, "%d\n");
381  spi_transport_rd_attr(dt, "%d\n");
382  spi_transport_max_attr(qas, "%d\n");
383  spi_transport_rd_attr(wr_flow, "%d\n");
384  spi_transport_rd_attr(rd_strm, "%d\n");
385  spi_transport_rd_attr(rti, "%d\n");
386  spi_transport_rd_attr(pcomp_en, "%d\n");
387  spi_transport_rd_attr(hold_mcs, "%d\n");
388  
389  /* we only care about the first child device that's a real SCSI device
390   * so we return 1 to terminate the iteration when we find it */
child_iter(struct device * dev,void * data)391  static int child_iter(struct device *dev, void *data)
392  {
393  	if (!scsi_is_sdev_device(dev))
394  		return 0;
395  
396  	spi_dv_device(to_scsi_device(dev));
397  	return 1;
398  }
399  
400  static ssize_t
store_spi_revalidate(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)401  store_spi_revalidate(struct device *dev, struct device_attribute *attr,
402  		     const char *buf, size_t count)
403  {
404  	struct scsi_target *starget = transport_class_to_starget(dev);
405  
406  	device_for_each_child(&starget->dev, NULL, child_iter);
407  	return count;
408  }
409  static DEVICE_ATTR(revalidate, S_IWUSR, NULL, store_spi_revalidate);
410  
411  /* Translate the period into ns according to the current spec
412   * for SDTR/PPR messages */
period_to_str(char * buf,int period)413  static int period_to_str(char *buf, int period)
414  {
415  	int len, picosec;
416  
417  	if (period < 0 || period > 0xff) {
418  		picosec = -1;
419  	} else if (period <= SPI_STATIC_PPR) {
420  		picosec = ppr_to_ps[period];
421  	} else {
422  		picosec = period * 4000;
423  	}
424  
425  	if (picosec == -1) {
426  		len = sprintf(buf, "reserved");
427  	} else {
428  		len = sprint_frac(buf, picosec, 1000);
429  	}
430  
431  	return len;
432  }
433  
434  static ssize_t
show_spi_transport_period_helper(char * buf,int period)435  show_spi_transport_period_helper(char *buf, int period)
436  {
437  	int len = period_to_str(buf, period);
438  	buf[len++] = '\n';
439  	buf[len] = '\0';
440  	return len;
441  }
442  
443  static ssize_t
store_spi_transport_period_helper(struct device * dev,const char * buf,size_t count,int * periodp)444  store_spi_transport_period_helper(struct device *dev, const char *buf,
445  				  size_t count, int *periodp)
446  {
447  	int j, picosec, period = -1;
448  	char *endp;
449  
450  	picosec = simple_strtoul(buf, &endp, 10) * 1000;
451  	if (*endp == '.') {
452  		int mult = 100;
453  		do {
454  			endp++;
455  			if (!isdigit(*endp))
456  				break;
457  			picosec += (*endp - '0') * mult;
458  			mult /= 10;
459  		} while (mult > 0);
460  	}
461  
462  	for (j = 0; j <= SPI_STATIC_PPR; j++) {
463  		if (ppr_to_ps[j] < picosec)
464  			continue;
465  		period = j;
466  		break;
467  	}
468  
469  	if (period == -1)
470  		period = picosec / 4000;
471  
472  	if (period > 0xff)
473  		period = 0xff;
474  
475  	*periodp = period;
476  
477  	return count;
478  }
479  
480  static ssize_t
show_spi_transport_period(struct device * dev,struct device_attribute * attr,char * buf)481  show_spi_transport_period(struct device *dev,
482  			  struct device_attribute *attr, char *buf)
483  {
484  	struct scsi_target *starget = transport_class_to_starget(dev);
485  	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
486  	struct spi_internal *i = to_spi_internal(shost->transportt);
487  	struct spi_transport_attrs *tp =
488  		(struct spi_transport_attrs *)&starget->starget_data;
489  
490  	if (i->f->get_period)
491  		i->f->get_period(starget);
492  
493  	return show_spi_transport_period_helper(buf, tp->period);
494  }
495  
496  static ssize_t
store_spi_transport_period(struct device * cdev,struct device_attribute * attr,const char * buf,size_t count)497  store_spi_transport_period(struct device *cdev, struct device_attribute *attr,
498  			   const char *buf, size_t count)
499  {
500  	struct scsi_target *starget = transport_class_to_starget(cdev);
501  	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
502  	struct spi_internal *i = to_spi_internal(shost->transportt);
503  	struct spi_transport_attrs *tp =
504  		(struct spi_transport_attrs *)&starget->starget_data;
505  	int period, retval;
506  
507  	if (!i->f->set_period)
508  		return -EINVAL;
509  
510  	retval = store_spi_transport_period_helper(cdev, buf, count, &period);
511  
512  	if (period < tp->min_period)
513  		period = tp->min_period;
514  
515  	i->f->set_period(starget, period);
516  
517  	return retval;
518  }
519  
520  static DEVICE_ATTR(period, S_IRUGO,
521  		   show_spi_transport_period,
522  		   store_spi_transport_period);
523  
524  static ssize_t
show_spi_transport_min_period(struct device * cdev,struct device_attribute * attr,char * buf)525  show_spi_transport_min_period(struct device *cdev,
526  			      struct device_attribute *attr, char *buf)
527  {
528  	struct scsi_target *starget = transport_class_to_starget(cdev);
529  	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
530  	struct spi_internal *i = to_spi_internal(shost->transportt);
531  	struct spi_transport_attrs *tp =
532  		(struct spi_transport_attrs *)&starget->starget_data;
533  
534  	if (!i->f->set_period)
535  		return -EINVAL;
536  
537  	return show_spi_transport_period_helper(buf, tp->min_period);
538  }
539  
540  static ssize_t
store_spi_transport_min_period(struct device * cdev,struct device_attribute * attr,const char * buf,size_t count)541  store_spi_transport_min_period(struct device *cdev,
542  			       struct device_attribute *attr,
543  			       const char *buf, size_t count)
544  {
545  	struct scsi_target *starget = transport_class_to_starget(cdev);
546  	struct spi_transport_attrs *tp =
547  		(struct spi_transport_attrs *)&starget->starget_data;
548  
549  	return store_spi_transport_period_helper(cdev, buf, count,
550  						 &tp->min_period);
551  }
552  
553  
554  static DEVICE_ATTR(min_period, S_IRUGO,
555  		   show_spi_transport_min_period,
556  		   store_spi_transport_min_period);
557  
558  
show_spi_host_signalling(struct device * cdev,struct device_attribute * attr,char * buf)559  static ssize_t show_spi_host_signalling(struct device *cdev,
560  					struct device_attribute *attr,
561  					char *buf)
562  {
563  	struct Scsi_Host *shost = transport_class_to_shost(cdev);
564  	struct spi_internal *i = to_spi_internal(shost->transportt);
565  
566  	if (i->f->get_signalling)
567  		i->f->get_signalling(shost);
568  
569  	return sprintf(buf, "%s\n", spi_signal_to_string(spi_signalling(shost)));
570  }
store_spi_host_signalling(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)571  static ssize_t store_spi_host_signalling(struct device *dev,
572  					 struct device_attribute *attr,
573  					 const char *buf, size_t count)
574  {
575  	struct Scsi_Host *shost = transport_class_to_shost(dev);
576  	struct spi_internal *i = to_spi_internal(shost->transportt);
577  	enum spi_signal_type type = spi_signal_to_value(buf);
578  
579  	if (!i->f->set_signalling)
580  		return -EINVAL;
581  
582  	if (type != SPI_SIGNAL_UNKNOWN)
583  		i->f->set_signalling(shost, type);
584  
585  	return count;
586  }
587  static DEVICE_ATTR(signalling, S_IRUGO,
588  		   show_spi_host_signalling,
589  		   store_spi_host_signalling);
590  
show_spi_host_width(struct device * cdev,struct device_attribute * attr,char * buf)591  static ssize_t show_spi_host_width(struct device *cdev,
592  				      struct device_attribute *attr,
593  				      char *buf)
594  {
595  	struct Scsi_Host *shost = transport_class_to_shost(cdev);
596  
597  	return sprintf(buf, "%s\n", shost->max_id == 16 ? "wide" : "narrow");
598  }
599  static DEVICE_ATTR(host_width, S_IRUGO,
600  		   show_spi_host_width, NULL);
601  
show_spi_host_hba_id(struct device * cdev,struct device_attribute * attr,char * buf)602  static ssize_t show_spi_host_hba_id(struct device *cdev,
603  				    struct device_attribute *attr,
604  				    char *buf)
605  {
606  	struct Scsi_Host *shost = transport_class_to_shost(cdev);
607  
608  	return sprintf(buf, "%d\n", shost->this_id);
609  }
610  static DEVICE_ATTR(hba_id, S_IRUGO,
611  		   show_spi_host_hba_id, NULL);
612  
613  #define DV_SET(x, y)			\
614  	if(i->f->set_##x)		\
615  		i->f->set_##x(sdev->sdev_target, y)
616  
617  enum spi_compare_returns {
618  	SPI_COMPARE_SUCCESS,
619  	SPI_COMPARE_FAILURE,
620  	SPI_COMPARE_SKIP_TEST,
621  };
622  
623  
624  /* This is for read/write Domain Validation:  If the device supports
625   * an echo buffer, we do read/write tests to it */
626  static enum spi_compare_returns
spi_dv_device_echo_buffer(struct scsi_device * sdev,u8 * buffer,u8 * ptr,const int retries)627  spi_dv_device_echo_buffer(struct scsi_device *sdev, u8 *buffer,
628  			  u8 *ptr, const int retries)
629  {
630  	int len = ptr - buffer;
631  	int j, k, r, result;
632  	unsigned int pattern = 0x0000ffff;
633  	struct scsi_sense_hdr sshdr;
634  
635  	const char spi_write_buffer[] = {
636  		WRITE_BUFFER, 0x0a, 0, 0, 0, 0, 0, len >> 8, len & 0xff, 0
637  	};
638  	const char spi_read_buffer[] = {
639  		READ_BUFFER, 0x0a, 0, 0, 0, 0, 0, len >> 8, len & 0xff, 0
640  	};
641  
642  	/* set up the pattern buffer.  Doesn't matter if we spill
643  	 * slightly beyond since that's where the read buffer is */
644  	for (j = 0; j < len; ) {
645  
646  		/* fill the buffer with counting (test a) */
647  		for ( ; j < min(len, 32); j++)
648  			buffer[j] = j;
649  		k = j;
650  		/* fill the buffer with alternating words of 0x0 and
651  		 * 0xffff (test b) */
652  		for ( ; j < min(len, k + 32); j += 2) {
653  			u16 *word = (u16 *)&buffer[j];
654  
655  			*word = (j & 0x02) ? 0x0000 : 0xffff;
656  		}
657  		k = j;
658  		/* fill with crosstalk (alternating 0x5555 0xaaa)
659                   * (test c) */
660  		for ( ; j < min(len, k + 32); j += 2) {
661  			u16 *word = (u16 *)&buffer[j];
662  
663  			*word = (j & 0x02) ? 0x5555 : 0xaaaa;
664  		}
665  		k = j;
666  		/* fill with shifting bits (test d) */
667  		for ( ; j < min(len, k + 32); j += 4) {
668  			u32 *word = (unsigned int *)&buffer[j];
669  			u32 roll = (pattern & 0x80000000) ? 1 : 0;
670  
671  			*word = pattern;
672  			pattern = (pattern << 1) | roll;
673  		}
674  		/* don't bother with random data (test e) */
675  	}
676  
677  	for (r = 0; r < retries; r++) {
678  		result = spi_execute(sdev, spi_write_buffer, REQ_OP_DRV_OUT,
679  				     buffer, len, &sshdr);
680  		if (result || !scsi_device_online(sdev)) {
681  
682  			scsi_device_set_state(sdev, SDEV_QUIESCE);
683  			if (result > 0 && scsi_sense_valid(&sshdr)
684  			    && sshdr.sense_key == ILLEGAL_REQUEST
685  			    /* INVALID FIELD IN CDB */
686  			    && sshdr.asc == 0x24 && sshdr.ascq == 0x00)
687  				/* This would mean that the drive lied
688  				 * to us about supporting an echo
689  				 * buffer (unfortunately some Western
690  				 * Digital drives do precisely this)
691  				 */
692  				return SPI_COMPARE_SKIP_TEST;
693  
694  
695  			sdev_printk(KERN_ERR, sdev, "Write Buffer failure %x\n", result);
696  			return SPI_COMPARE_FAILURE;
697  		}
698  
699  		memset(ptr, 0, len);
700  		spi_execute(sdev, spi_read_buffer, REQ_OP_DRV_IN,
701  			    ptr, len, NULL);
702  		scsi_device_set_state(sdev, SDEV_QUIESCE);
703  
704  		if (memcmp(buffer, ptr, len) != 0)
705  			return SPI_COMPARE_FAILURE;
706  	}
707  	return SPI_COMPARE_SUCCESS;
708  }
709  
710  /* This is for the simplest form of Domain Validation: a read test
711   * on the inquiry data from the device */
712  static enum spi_compare_returns
spi_dv_device_compare_inquiry(struct scsi_device * sdev,u8 * buffer,u8 * ptr,const int retries)713  spi_dv_device_compare_inquiry(struct scsi_device *sdev, u8 *buffer,
714  			      u8 *ptr, const int retries)
715  {
716  	int r, result;
717  	const int len = sdev->inquiry_len;
718  	const char spi_inquiry[] = {
719  		INQUIRY, 0, 0, 0, len, 0
720  	};
721  
722  	for (r = 0; r < retries; r++) {
723  		memset(ptr, 0, len);
724  
725  		result = spi_execute(sdev, spi_inquiry, REQ_OP_DRV_IN,
726  				     ptr, len, NULL);
727  
728  		if(result || !scsi_device_online(sdev)) {
729  			scsi_device_set_state(sdev, SDEV_QUIESCE);
730  			return SPI_COMPARE_FAILURE;
731  		}
732  
733  		/* If we don't have the inquiry data already, the
734  		 * first read gets it */
735  		if (ptr == buffer) {
736  			ptr += len;
737  			--r;
738  			continue;
739  		}
740  
741  		if (memcmp(buffer, ptr, len) != 0)
742  			/* failure */
743  			return SPI_COMPARE_FAILURE;
744  	}
745  	return SPI_COMPARE_SUCCESS;
746  }
747  
748  static enum spi_compare_returns
spi_dv_retrain(struct scsi_device * sdev,u8 * buffer,u8 * ptr,enum spi_compare_returns (* compare_fn)(struct scsi_device *,u8 *,u8 *,int))749  spi_dv_retrain(struct scsi_device *sdev, u8 *buffer, u8 *ptr,
750  	       enum spi_compare_returns
751  	       (*compare_fn)(struct scsi_device *, u8 *, u8 *, int))
752  {
753  	struct spi_internal *i = to_spi_internal(sdev->host->transportt);
754  	struct scsi_target *starget = sdev->sdev_target;
755  	int period = 0, prevperiod = 0;
756  	enum spi_compare_returns retval;
757  
758  
759  	for (;;) {
760  		int newperiod;
761  		retval = compare_fn(sdev, buffer, ptr, DV_LOOPS);
762  
763  		if (retval == SPI_COMPARE_SUCCESS
764  		    || retval == SPI_COMPARE_SKIP_TEST)
765  			break;
766  
767  		/* OK, retrain, fallback */
768  		if (i->f->get_iu)
769  			i->f->get_iu(starget);
770  		if (i->f->get_qas)
771  			i->f->get_qas(starget);
772  		if (i->f->get_period)
773  			i->f->get_period(sdev->sdev_target);
774  
775  		/* Here's the fallback sequence; first try turning off
776  		 * IU, then QAS (if we can control them), then finally
777  		 * fall down the periods */
778  		if (i->f->set_iu && spi_iu(starget)) {
779  			starget_printk(KERN_ERR, starget, "Domain Validation Disabling Information Units\n");
780  			DV_SET(iu, 0);
781  		} else if (i->f->set_qas && spi_qas(starget)) {
782  			starget_printk(KERN_ERR, starget, "Domain Validation Disabling Quick Arbitration and Selection\n");
783  			DV_SET(qas, 0);
784  		} else {
785  			newperiod = spi_period(starget);
786  			period = newperiod > period ? newperiod : period;
787  			if (period < 0x0d)
788  				period++;
789  			else
790  				period += period >> 1;
791  
792  			if (unlikely(period > 0xff || period == prevperiod)) {
793  				/* Total failure; set to async and return */
794  				starget_printk(KERN_ERR, starget, "Domain Validation Failure, dropping back to Asynchronous\n");
795  				DV_SET(offset, 0);
796  				return SPI_COMPARE_FAILURE;
797  			}
798  			starget_printk(KERN_ERR, starget, "Domain Validation detected failure, dropping back\n");
799  			DV_SET(period, period);
800  			prevperiod = period;
801  		}
802  	}
803  	return retval;
804  }
805  
806  static int
spi_dv_device_get_echo_buffer(struct scsi_device * sdev,u8 * buffer)807  spi_dv_device_get_echo_buffer(struct scsi_device *sdev, u8 *buffer)
808  {
809  	int l, result;
810  
811  	/* first off do a test unit ready.  This can error out
812  	 * because of reservations or some other reason.  If it
813  	 * fails, the device won't let us write to the echo buffer
814  	 * so just return failure */
815  
816  	static const char spi_test_unit_ready[] = {
817  		TEST_UNIT_READY, 0, 0, 0, 0, 0
818  	};
819  
820  	static const char spi_read_buffer_descriptor[] = {
821  		READ_BUFFER, 0x0b, 0, 0, 0, 0, 0, 0, 4, 0
822  	};
823  
824  
825  	/* We send a set of three TURs to clear any outstanding
826  	 * unit attention conditions if they exist (Otherwise the
827  	 * buffer tests won't be happy).  If the TUR still fails
828  	 * (reservation conflict, device not ready, etc) just
829  	 * skip the write tests */
830  	for (l = 0; ; l++) {
831  		result = spi_execute(sdev, spi_test_unit_ready, REQ_OP_DRV_IN,
832  				     NULL, 0, NULL);
833  
834  		if(result) {
835  			if(l >= 3)
836  				return 0;
837  		} else {
838  			/* TUR succeeded */
839  			break;
840  		}
841  	}
842  
843  	result = spi_execute(sdev, spi_read_buffer_descriptor,
844  			     REQ_OP_DRV_IN, buffer, 4, NULL);
845  
846  	if (result)
847  		/* Device has no echo buffer */
848  		return 0;
849  
850  	return buffer[3] + ((buffer[2] & 0x1f) << 8);
851  }
852  
853  static void
spi_dv_device_internal(struct scsi_device * sdev,u8 * buffer)854  spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer)
855  {
856  	struct spi_internal *i = to_spi_internal(sdev->host->transportt);
857  	struct scsi_target *starget = sdev->sdev_target;
858  	struct Scsi_Host *shost = sdev->host;
859  	int len = sdev->inquiry_len;
860  	int min_period = spi_min_period(starget);
861  	int max_width = spi_max_width(starget);
862  	/* first set us up for narrow async */
863  	DV_SET(offset, 0);
864  	DV_SET(width, 0);
865  
866  	if (spi_dv_device_compare_inquiry(sdev, buffer, buffer, DV_LOOPS)
867  	    != SPI_COMPARE_SUCCESS) {
868  		starget_printk(KERN_ERR, starget, "Domain Validation Initial Inquiry Failed\n");
869  		/* FIXME: should probably offline the device here? */
870  		return;
871  	}
872  
873  	if (!spi_support_wide(starget)) {
874  		spi_max_width(starget) = 0;
875  		max_width = 0;
876  	}
877  
878  	/* test width */
879  	if (i->f->set_width && max_width) {
880  		i->f->set_width(starget, 1);
881  
882  		if (spi_dv_device_compare_inquiry(sdev, buffer,
883  						   buffer + len,
884  						   DV_LOOPS)
885  		    != SPI_COMPARE_SUCCESS) {
886  			starget_printk(KERN_ERR, starget, "Wide Transfers Fail\n");
887  			i->f->set_width(starget, 0);
888  			/* Make sure we don't force wide back on by asking
889  			 * for a transfer period that requires it */
890  			max_width = 0;
891  			if (min_period < 10)
892  				min_period = 10;
893  		}
894  	}
895  
896  	if (!i->f->set_period)
897  		return;
898  
899  	/* device can't handle synchronous */
900  	if (!spi_support_sync(starget) && !spi_support_dt(starget))
901  		return;
902  
903  	/* len == -1 is the signal that we need to ascertain the
904  	 * presence of an echo buffer before trying to use it.  len ==
905  	 * 0 means we don't have an echo buffer */
906  	len = -1;
907  
908   retry:
909  
910  	/* now set up to the maximum */
911  	DV_SET(offset, spi_max_offset(starget));
912  	DV_SET(period, min_period);
913  
914  	/* try QAS requests; this should be harmless to set if the
915  	 * target supports it */
916  	if (spi_support_qas(starget) && spi_max_qas(starget)) {
917  		DV_SET(qas, 1);
918  	} else {
919  		DV_SET(qas, 0);
920  	}
921  
922  	if (spi_support_ius(starget) && spi_max_iu(starget) &&
923  	    min_period < 9) {
924  		/* This u320 (or u640). Set IU transfers */
925  		DV_SET(iu, 1);
926  		/* Then set the optional parameters */
927  		DV_SET(rd_strm, 1);
928  		DV_SET(wr_flow, 1);
929  		DV_SET(rti, 1);
930  		if (min_period == 8)
931  			DV_SET(pcomp_en, 1);
932  	} else {
933  		DV_SET(iu, 0);
934  	}
935  
936  	/* now that we've done all this, actually check the bus
937  	 * signal type (if known).  Some devices are stupid on
938  	 * a SE bus and still claim they can try LVD only settings */
939  	if (i->f->get_signalling)
940  		i->f->get_signalling(shost);
941  	if (spi_signalling(shost) == SPI_SIGNAL_SE ||
942  	    spi_signalling(shost) == SPI_SIGNAL_HVD ||
943  	    !spi_support_dt(starget)) {
944  		DV_SET(dt, 0);
945  	} else {
946  		DV_SET(dt, 1);
947  	}
948  	/* set width last because it will pull all the other
949  	 * parameters down to required values */
950  	DV_SET(width, max_width);
951  
952  	/* Do the read only INQUIRY tests */
953  	spi_dv_retrain(sdev, buffer, buffer + sdev->inquiry_len,
954  		       spi_dv_device_compare_inquiry);
955  	/* See if we actually managed to negotiate and sustain DT */
956  	if (i->f->get_dt)
957  		i->f->get_dt(starget);
958  
959  	/* see if the device has an echo buffer.  If it does we can do
960  	 * the SPI pattern write tests.  Because of some broken
961  	 * devices, we *only* try this on a device that has actually
962  	 * negotiated DT */
963  
964  	if (len == -1 && spi_dt(starget))
965  		len = spi_dv_device_get_echo_buffer(sdev, buffer);
966  
967  	if (len <= 0) {
968  		starget_printk(KERN_INFO, starget, "Domain Validation skipping write tests\n");
969  		return;
970  	}
971  
972  	if (len > SPI_MAX_ECHO_BUFFER_SIZE) {
973  		starget_printk(KERN_WARNING, starget, "Echo buffer size %d is too big, trimming to %d\n", len, SPI_MAX_ECHO_BUFFER_SIZE);
974  		len = SPI_MAX_ECHO_BUFFER_SIZE;
975  	}
976  
977  	if (spi_dv_retrain(sdev, buffer, buffer + len,
978  			   spi_dv_device_echo_buffer)
979  	    == SPI_COMPARE_SKIP_TEST) {
980  		/* OK, the stupid drive can't do a write echo buffer
981  		 * test after all, fall back to the read tests */
982  		len = 0;
983  		goto retry;
984  	}
985  }
986  
987  
988  /**	spi_dv_device - Do Domain Validation on the device
989   *	@sdev:		scsi device to validate
990   *
991   *	Performs the domain validation on the given device in the
992   *	current execution thread.  Since DV operations may sleep,
993   *	the current thread must have user context.  Also no SCSI
994   *	related locks that would deadlock I/O issued by the DV may
995   *	be held.
996   */
997  void
spi_dv_device(struct scsi_device * sdev)998  spi_dv_device(struct scsi_device *sdev)
999  {
1000  	struct scsi_target *starget = sdev->sdev_target;
1001  	const int len = SPI_MAX_ECHO_BUFFER_SIZE*2;
1002  	unsigned int sleep_flags;
1003  	u8 *buffer;
1004  
1005  	/*
1006  	 * Because this function and the power management code both call
1007  	 * scsi_device_quiesce(), it is not safe to perform domain validation
1008  	 * while suspend or resume is in progress. Hence the
1009  	 * lock/unlock_system_sleep() calls.
1010  	 */
1011  	sleep_flags = lock_system_sleep();
1012  
1013  	if (scsi_autopm_get_device(sdev))
1014  		goto unlock_system_sleep;
1015  
1016  	if (unlikely(spi_dv_in_progress(starget)))
1017  		goto put_autopm;
1018  
1019  	if (unlikely(scsi_device_get(sdev)))
1020  		goto put_autopm;
1021  
1022  	spi_dv_in_progress(starget) = 1;
1023  
1024  	buffer = kzalloc(len, GFP_KERNEL);
1025  
1026  	if (unlikely(!buffer))
1027  		goto put_sdev;
1028  
1029  	/* We need to verify that the actual device will quiesce; the
1030  	 * later target quiesce is just a nice to have */
1031  	if (unlikely(scsi_device_quiesce(sdev)))
1032  		goto free_buffer;
1033  
1034  	scsi_target_quiesce(starget);
1035  
1036  	spi_dv_pending(starget) = 1;
1037  	mutex_lock(&spi_dv_mutex(starget));
1038  
1039  	starget_printk(KERN_INFO, starget, "Beginning Domain Validation\n");
1040  
1041  	spi_dv_device_internal(sdev, buffer);
1042  
1043  	starget_printk(KERN_INFO, starget, "Ending Domain Validation\n");
1044  
1045  	mutex_unlock(&spi_dv_mutex(starget));
1046  	spi_dv_pending(starget) = 0;
1047  
1048  	scsi_target_resume(starget);
1049  
1050  	spi_initial_dv(starget) = 1;
1051  
1052  free_buffer:
1053  	kfree(buffer);
1054  
1055  put_sdev:
1056  	spi_dv_in_progress(starget) = 0;
1057  	scsi_device_put(sdev);
1058  put_autopm:
1059  	scsi_autopm_put_device(sdev);
1060  
1061  unlock_system_sleep:
1062  	unlock_system_sleep(sleep_flags);
1063  }
1064  EXPORT_SYMBOL(spi_dv_device);
1065  
1066  struct work_queue_wrapper {
1067  	struct work_struct	work;
1068  	struct scsi_device	*sdev;
1069  };
1070  
1071  static void
spi_dv_device_work_wrapper(struct work_struct * work)1072  spi_dv_device_work_wrapper(struct work_struct *work)
1073  {
1074  	struct work_queue_wrapper *wqw =
1075  		container_of(work, struct work_queue_wrapper, work);
1076  	struct scsi_device *sdev = wqw->sdev;
1077  
1078  	kfree(wqw);
1079  	spi_dv_device(sdev);
1080  	spi_dv_pending(sdev->sdev_target) = 0;
1081  	scsi_device_put(sdev);
1082  }
1083  
1084  
1085  /**
1086   *	spi_schedule_dv_device - schedule domain validation to occur on the device
1087   *	@sdev:	The device to validate
1088   *
1089   *	Identical to spi_dv_device() above, except that the DV will be
1090   *	scheduled to occur in a workqueue later.  All memory allocations
1091   *	are atomic, so may be called from any context including those holding
1092   *	SCSI locks.
1093   */
1094  void
spi_schedule_dv_device(struct scsi_device * sdev)1095  spi_schedule_dv_device(struct scsi_device *sdev)
1096  {
1097  	struct work_queue_wrapper *wqw =
1098  		kmalloc(sizeof(struct work_queue_wrapper), GFP_ATOMIC);
1099  
1100  	if (unlikely(!wqw))
1101  		return;
1102  
1103  	if (unlikely(spi_dv_pending(sdev->sdev_target))) {
1104  		kfree(wqw);
1105  		return;
1106  	}
1107  	/* Set pending early (dv_device doesn't check it, only sets it) */
1108  	spi_dv_pending(sdev->sdev_target) = 1;
1109  	if (unlikely(scsi_device_get(sdev))) {
1110  		kfree(wqw);
1111  		spi_dv_pending(sdev->sdev_target) = 0;
1112  		return;
1113  	}
1114  
1115  	INIT_WORK(&wqw->work, spi_dv_device_work_wrapper);
1116  	wqw->sdev = sdev;
1117  
1118  	schedule_work(&wqw->work);
1119  }
1120  EXPORT_SYMBOL(spi_schedule_dv_device);
1121  
1122  /**
1123   * spi_display_xfer_agreement - Print the current target transfer agreement
1124   * @starget: The target for which to display the agreement
1125   *
1126   * Each SPI port is required to maintain a transfer agreement for each
1127   * other port on the bus.  This function prints a one-line summary of
1128   * the current agreement; more detailed information is available in sysfs.
1129   */
spi_display_xfer_agreement(struct scsi_target * starget)1130  void spi_display_xfer_agreement(struct scsi_target *starget)
1131  {
1132  	struct spi_transport_attrs *tp;
1133  	tp = (struct spi_transport_attrs *)&starget->starget_data;
1134  
1135  	if (tp->offset > 0 && tp->period > 0) {
1136  		unsigned int picosec, kb100;
1137  		char *scsi = "FAST-?";
1138  		char tmp[8];
1139  
1140  		if (tp->period <= SPI_STATIC_PPR) {
1141  			picosec = ppr_to_ps[tp->period];
1142  			switch (tp->period) {
1143  				case  7: scsi = "FAST-320"; break;
1144  				case  8: scsi = "FAST-160"; break;
1145  				case  9: scsi = "FAST-80"; break;
1146  				case 10:
1147  				case 11: scsi = "FAST-40"; break;
1148  				case 12: scsi = "FAST-20"; break;
1149  			}
1150  		} else {
1151  			picosec = tp->period * 4000;
1152  			if (tp->period < 25)
1153  				scsi = "FAST-20";
1154  			else if (tp->period < 50)
1155  				scsi = "FAST-10";
1156  			else
1157  				scsi = "FAST-5";
1158  		}
1159  
1160  		kb100 = (10000000 + picosec / 2) / picosec;
1161  		if (tp->width)
1162  			kb100 *= 2;
1163  		sprint_frac(tmp, picosec, 1000);
1164  
1165  		dev_info(&starget->dev,
1166  			 "%s %sSCSI %d.%d MB/s %s%s%s%s%s%s%s%s (%s ns, offset %d)\n",
1167  			 scsi, tp->width ? "WIDE " : "", kb100/10, kb100 % 10,
1168  			 tp->dt ? "DT" : "ST",
1169  			 tp->iu ? " IU" : "",
1170  			 tp->qas  ? " QAS" : "",
1171  			 tp->rd_strm ? " RDSTRM" : "",
1172  			 tp->rti ? " RTI" : "",
1173  			 tp->wr_flow ? " WRFLOW" : "",
1174  			 tp->pcomp_en ? " PCOMP" : "",
1175  			 tp->hold_mcs ? " HMCS" : "",
1176  			 tmp, tp->offset);
1177  	} else {
1178  		dev_info(&starget->dev, "%sasynchronous\n",
1179  				tp->width ? "wide " : "");
1180  	}
1181  }
1182  EXPORT_SYMBOL(spi_display_xfer_agreement);
1183  
spi_populate_width_msg(unsigned char * msg,int width)1184  int spi_populate_width_msg(unsigned char *msg, int width)
1185  {
1186  	msg[0] = EXTENDED_MESSAGE;
1187  	msg[1] = 2;
1188  	msg[2] = EXTENDED_WDTR;
1189  	msg[3] = width;
1190  	return 4;
1191  }
1192  EXPORT_SYMBOL_GPL(spi_populate_width_msg);
1193  
spi_populate_sync_msg(unsigned char * msg,int period,int offset)1194  int spi_populate_sync_msg(unsigned char *msg, int period, int offset)
1195  {
1196  	msg[0] = EXTENDED_MESSAGE;
1197  	msg[1] = 3;
1198  	msg[2] = EXTENDED_SDTR;
1199  	msg[3] = period;
1200  	msg[4] = offset;
1201  	return 5;
1202  }
1203  EXPORT_SYMBOL_GPL(spi_populate_sync_msg);
1204  
spi_populate_ppr_msg(unsigned char * msg,int period,int offset,int width,int options)1205  int spi_populate_ppr_msg(unsigned char *msg, int period, int offset,
1206  		int width, int options)
1207  {
1208  	msg[0] = EXTENDED_MESSAGE;
1209  	msg[1] = 6;
1210  	msg[2] = EXTENDED_PPR;
1211  	msg[3] = period;
1212  	msg[4] = 0;
1213  	msg[5] = offset;
1214  	msg[6] = width;
1215  	msg[7] = options;
1216  	return 8;
1217  }
1218  EXPORT_SYMBOL_GPL(spi_populate_ppr_msg);
1219  
1220  /**
1221   * spi_populate_tag_msg - place a tag message in a buffer
1222   * @msg:	pointer to the area to place the tag
1223   * @cmd:	pointer to the scsi command for the tag
1224   *
1225   * Notes:
1226   *	designed to create the correct type of tag message for the
1227   *	particular request.  Returns the size of the tag message.
1228   *	May return 0 if TCQ is disabled for this device.
1229   **/
spi_populate_tag_msg(unsigned char * msg,struct scsi_cmnd * cmd)1230  int spi_populate_tag_msg(unsigned char *msg, struct scsi_cmnd *cmd)
1231  {
1232          if (cmd->flags & SCMD_TAGGED) {
1233  		*msg++ = SIMPLE_QUEUE_TAG;
1234  		*msg++ = scsi_cmd_to_rq(cmd)->tag;
1235          	return 2;
1236  	}
1237  
1238  	return 0;
1239  }
1240  EXPORT_SYMBOL_GPL(spi_populate_tag_msg);
1241  
1242  #ifdef CONFIG_SCSI_CONSTANTS
1243  static const char * const one_byte_msgs[] = {
1244  /* 0x00 */ "Task Complete", NULL /* Extended Message */, "Save Pointers",
1245  /* 0x03 */ "Restore Pointers", "Disconnect", "Initiator Error",
1246  /* 0x06 */ "Abort Task Set", "Message Reject", "Nop", "Message Parity Error",
1247  /* 0x0a */ "Linked Command Complete", "Linked Command Complete w/flag",
1248  /* 0x0c */ "Target Reset", "Abort Task", "Clear Task Set",
1249  /* 0x0f */ "Initiate Recovery", "Release Recovery",
1250  /* 0x11 */ "Terminate Process", "Continue Task", "Target Transfer Disable",
1251  /* 0x14 */ NULL, NULL, "Clear ACA", "LUN Reset"
1252  };
1253  
1254  static const char * const two_byte_msgs[] = {
1255  /* 0x20 */ "Simple Queue Tag", "Head of Queue Tag", "Ordered Queue Tag",
1256  /* 0x23 */ "Ignore Wide Residue", "ACA"
1257  };
1258  
1259  static const char * const extended_msgs[] = {
1260  /* 0x00 */ "Modify Data Pointer", "Synchronous Data Transfer Request",
1261  /* 0x02 */ "SCSI-I Extended Identify", "Wide Data Transfer Request",
1262  /* 0x04 */ "Parallel Protocol Request", "Modify Bidirectional Data Pointer"
1263  };
1264  
print_nego(const unsigned char * msg,int per,int off,int width)1265  static void print_nego(const unsigned char *msg, int per, int off, int width)
1266  {
1267  	if (per) {
1268  		char buf[20];
1269  		period_to_str(buf, msg[per]);
1270  		printk("period = %s ns ", buf);
1271  	}
1272  
1273  	if (off)
1274  		printk("offset = %d ", msg[off]);
1275  	if (width)
1276  		printk("width = %d ", 8 << msg[width]);
1277  }
1278  
print_ptr(const unsigned char * msg,int msb,const char * desc)1279  static void print_ptr(const unsigned char *msg, int msb, const char *desc)
1280  {
1281  	int ptr = (msg[msb] << 24) | (msg[msb+1] << 16) | (msg[msb+2] << 8) |
1282  			msg[msb+3];
1283  	printk("%s = %d ", desc, ptr);
1284  }
1285  
spi_print_msg(const unsigned char * msg)1286  int spi_print_msg(const unsigned char *msg)
1287  {
1288  	int len = 1, i;
1289  	if (msg[0] == EXTENDED_MESSAGE) {
1290  		len = 2 + msg[1];
1291  		if (len == 2)
1292  			len += 256;
1293  		if (msg[2] < ARRAY_SIZE(extended_msgs))
1294  			printk ("%s ", extended_msgs[msg[2]]);
1295  		else
1296  			printk ("Extended Message, reserved code (0x%02x) ",
1297  				(int) msg[2]);
1298  		switch (msg[2]) {
1299  		case EXTENDED_MODIFY_DATA_POINTER:
1300  			print_ptr(msg, 3, "pointer");
1301  			break;
1302  		case EXTENDED_SDTR:
1303  			print_nego(msg, 3, 4, 0);
1304  			break;
1305  		case EXTENDED_WDTR:
1306  			print_nego(msg, 0, 0, 3);
1307  			break;
1308  		case EXTENDED_PPR:
1309  			print_nego(msg, 3, 5, 6);
1310  			break;
1311  		case EXTENDED_MODIFY_BIDI_DATA_PTR:
1312  			print_ptr(msg, 3, "out");
1313  			print_ptr(msg, 7, "in");
1314  			break;
1315  		default:
1316  		for (i = 2; i < len; ++i)
1317  			printk("%02x ", msg[i]);
1318  		}
1319  	/* Identify */
1320  	} else if (msg[0] & 0x80) {
1321  		printk("Identify disconnect %sallowed %s %d ",
1322  			(msg[0] & 0x40) ? "" : "not ",
1323  			(msg[0] & 0x20) ? "target routine" : "lun",
1324  			msg[0] & 0x7);
1325  	/* Normal One byte */
1326  	} else if (msg[0] < 0x1f) {
1327  		if (msg[0] < ARRAY_SIZE(one_byte_msgs) && one_byte_msgs[msg[0]])
1328  			printk("%s ", one_byte_msgs[msg[0]]);
1329  		else
1330  			printk("reserved (%02x) ", msg[0]);
1331  	} else if (msg[0] == 0x55) {
1332  		printk("QAS Request ");
1333  	/* Two byte */
1334  	} else if (msg[0] <= 0x2f) {
1335  		if ((msg[0] - 0x20) < ARRAY_SIZE(two_byte_msgs))
1336  			printk("%s %02x ", two_byte_msgs[msg[0] - 0x20],
1337  				msg[1]);
1338  		else
1339  			printk("reserved two byte (%02x %02x) ",
1340  				msg[0], msg[1]);
1341  		len = 2;
1342  	} else
1343  		printk("reserved ");
1344  	return len;
1345  }
1346  EXPORT_SYMBOL(spi_print_msg);
1347  
1348  #else  /* ifndef CONFIG_SCSI_CONSTANTS */
1349  
spi_print_msg(const unsigned char * msg)1350  int spi_print_msg(const unsigned char *msg)
1351  {
1352  	int len = 1, i;
1353  
1354  	if (msg[0] == EXTENDED_MESSAGE) {
1355  		len = 2 + msg[1];
1356  		if (len == 2)
1357  			len += 256;
1358  		for (i = 0; i < len; ++i)
1359  			printk("%02x ", msg[i]);
1360  	/* Identify */
1361  	} else if (msg[0] & 0x80) {
1362  		printk("%02x ", msg[0]);
1363  	/* Normal One byte */
1364  	} else if ((msg[0] < 0x1f) || (msg[0] == 0x55)) {
1365  		printk("%02x ", msg[0]);
1366  	/* Two byte */
1367  	} else if (msg[0] <= 0x2f) {
1368  		printk("%02x %02x", msg[0], msg[1]);
1369  		len = 2;
1370  	} else
1371  		printk("%02x ", msg[0]);
1372  	return len;
1373  }
1374  EXPORT_SYMBOL(spi_print_msg);
1375  #endif /* ! CONFIG_SCSI_CONSTANTS */
1376  
spi_device_match(struct attribute_container * cont,struct device * dev)1377  static int spi_device_match(struct attribute_container *cont,
1378  			    struct device *dev)
1379  {
1380  	struct scsi_device *sdev;
1381  	struct Scsi_Host *shost;
1382  	struct spi_internal *i;
1383  
1384  	if (!scsi_is_sdev_device(dev))
1385  		return 0;
1386  
1387  	sdev = to_scsi_device(dev);
1388  	shost = sdev->host;
1389  	if (!shost->transportt  || shost->transportt->host_attrs.ac.class
1390  	    != &spi_host_class.class)
1391  		return 0;
1392  	/* Note: this class has no device attributes, so it has
1393  	 * no per-HBA allocation and thus we don't need to distinguish
1394  	 * the attribute containers for the device */
1395  	i = to_spi_internal(shost->transportt);
1396  	if (i->f->deny_binding && i->f->deny_binding(sdev->sdev_target))
1397  		return 0;
1398  	return 1;
1399  }
1400  
spi_target_match(struct attribute_container * cont,struct device * dev)1401  static int spi_target_match(struct attribute_container *cont,
1402  			    struct device *dev)
1403  {
1404  	struct Scsi_Host *shost;
1405  	struct scsi_target *starget;
1406  	struct spi_internal *i;
1407  
1408  	if (!scsi_is_target_device(dev))
1409  		return 0;
1410  
1411  	shost = dev_to_shost(dev->parent);
1412  	if (!shost->transportt  || shost->transportt->host_attrs.ac.class
1413  	    != &spi_host_class.class)
1414  		return 0;
1415  
1416  	i = to_spi_internal(shost->transportt);
1417  	starget = to_scsi_target(dev);
1418  
1419  	if (i->f->deny_binding && i->f->deny_binding(starget))
1420  		return 0;
1421  
1422  	return &i->t.target_attrs.ac == cont;
1423  }
1424  
1425  static DECLARE_TRANSPORT_CLASS(spi_transport_class,
1426  			       "spi_transport",
1427  			       spi_setup_transport_attrs,
1428  			       NULL,
1429  			       spi_target_configure);
1430  
1431  static DECLARE_ANON_TRANSPORT_CLASS(spi_device_class,
1432  				    spi_device_match,
1433  				    spi_device_configure);
1434  
1435  static struct attribute *host_attributes[] = {
1436  	&dev_attr_signalling.attr,
1437  	&dev_attr_host_width.attr,
1438  	&dev_attr_hba_id.attr,
1439  	NULL
1440  };
1441  
1442  static struct attribute_group host_attribute_group = {
1443  	.attrs = host_attributes,
1444  };
1445  
spi_host_configure(struct transport_container * tc,struct device * dev,struct device * cdev)1446  static int spi_host_configure(struct transport_container *tc,
1447  			      struct device *dev,
1448  			      struct device *cdev)
1449  {
1450  	struct kobject *kobj = &cdev->kobj;
1451  	struct Scsi_Host *shost = transport_class_to_shost(cdev);
1452  	struct spi_internal *si = to_spi_internal(shost->transportt);
1453  	struct attribute *attr = &dev_attr_signalling.attr;
1454  	int rc = 0;
1455  
1456  	if (si->f->set_signalling)
1457  		rc = sysfs_chmod_file(kobj, attr, attr->mode | S_IWUSR);
1458  
1459  	return rc;
1460  }
1461  
1462  /* returns true if we should be showing the variable.  Also
1463   * overloads the return by setting 1<<1 if the attribute should
1464   * be writeable */
1465  #define TARGET_ATTRIBUTE_HELPER(name) \
1466  	(si->f->show_##name ? S_IRUGO : 0) | \
1467  	(si->f->set_##name ? S_IWUSR : 0)
1468  
target_attribute_is_visible(struct kobject * kobj,struct attribute * attr,int i)1469  static umode_t target_attribute_is_visible(struct kobject *kobj,
1470  					  struct attribute *attr, int i)
1471  {
1472  	struct device *cdev = container_of(kobj, struct device, kobj);
1473  	struct scsi_target *starget = transport_class_to_starget(cdev);
1474  	struct Scsi_Host *shost = transport_class_to_shost(cdev);
1475  	struct spi_internal *si = to_spi_internal(shost->transportt);
1476  
1477  	if (attr == &dev_attr_period.attr &&
1478  	    spi_support_sync(starget))
1479  		return TARGET_ATTRIBUTE_HELPER(period);
1480  	else if (attr == &dev_attr_min_period.attr &&
1481  		 spi_support_sync(starget))
1482  		return TARGET_ATTRIBUTE_HELPER(period);
1483  	else if (attr == &dev_attr_offset.attr &&
1484  		 spi_support_sync(starget))
1485  		return TARGET_ATTRIBUTE_HELPER(offset);
1486  	else if (attr == &dev_attr_max_offset.attr &&
1487  		 spi_support_sync(starget))
1488  		return TARGET_ATTRIBUTE_HELPER(offset);
1489  	else if (attr == &dev_attr_width.attr &&
1490  		 spi_support_wide(starget))
1491  		return TARGET_ATTRIBUTE_HELPER(width);
1492  	else if (attr == &dev_attr_max_width.attr &&
1493  		 spi_support_wide(starget))
1494  		return TARGET_ATTRIBUTE_HELPER(width);
1495  	else if (attr == &dev_attr_iu.attr &&
1496  		 spi_support_ius(starget))
1497  		return TARGET_ATTRIBUTE_HELPER(iu);
1498  	else if (attr == &dev_attr_max_iu.attr &&
1499  		 spi_support_ius(starget))
1500  		return TARGET_ATTRIBUTE_HELPER(iu);
1501  	else if (attr == &dev_attr_dt.attr &&
1502  		 spi_support_dt(starget))
1503  		return TARGET_ATTRIBUTE_HELPER(dt);
1504  	else if (attr == &dev_attr_qas.attr &&
1505  		 spi_support_qas(starget))
1506  		return TARGET_ATTRIBUTE_HELPER(qas);
1507  	else if (attr == &dev_attr_max_qas.attr &&
1508  		 spi_support_qas(starget))
1509  		return TARGET_ATTRIBUTE_HELPER(qas);
1510  	else if (attr == &dev_attr_wr_flow.attr &&
1511  		 spi_support_ius(starget))
1512  		return TARGET_ATTRIBUTE_HELPER(wr_flow);
1513  	else if (attr == &dev_attr_rd_strm.attr &&
1514  		 spi_support_ius(starget))
1515  		return TARGET_ATTRIBUTE_HELPER(rd_strm);
1516  	else if (attr == &dev_attr_rti.attr &&
1517  		 spi_support_ius(starget))
1518  		return TARGET_ATTRIBUTE_HELPER(rti);
1519  	else if (attr == &dev_attr_pcomp_en.attr &&
1520  		 spi_support_ius(starget))
1521  		return TARGET_ATTRIBUTE_HELPER(pcomp_en);
1522  	else if (attr == &dev_attr_hold_mcs.attr &&
1523  		 spi_support_ius(starget))
1524  		return TARGET_ATTRIBUTE_HELPER(hold_mcs);
1525  	else if (attr == &dev_attr_revalidate.attr)
1526  		return S_IWUSR;
1527  
1528  	return 0;
1529  }
1530  
1531  static struct attribute *target_attributes[] = {
1532  	&dev_attr_period.attr,
1533  	&dev_attr_min_period.attr,
1534  	&dev_attr_offset.attr,
1535  	&dev_attr_max_offset.attr,
1536  	&dev_attr_width.attr,
1537  	&dev_attr_max_width.attr,
1538  	&dev_attr_iu.attr,
1539  	&dev_attr_max_iu.attr,
1540  	&dev_attr_dt.attr,
1541  	&dev_attr_qas.attr,
1542  	&dev_attr_max_qas.attr,
1543  	&dev_attr_wr_flow.attr,
1544  	&dev_attr_rd_strm.attr,
1545  	&dev_attr_rti.attr,
1546  	&dev_attr_pcomp_en.attr,
1547  	&dev_attr_hold_mcs.attr,
1548  	&dev_attr_revalidate.attr,
1549  	NULL
1550  };
1551  
1552  static struct attribute_group target_attribute_group = {
1553  	.attrs = target_attributes,
1554  	.is_visible = target_attribute_is_visible,
1555  };
1556  
spi_target_configure(struct transport_container * tc,struct device * dev,struct device * cdev)1557  static int spi_target_configure(struct transport_container *tc,
1558  				struct device *dev,
1559  				struct device *cdev)
1560  {
1561  	struct kobject *kobj = &cdev->kobj;
1562  
1563  	/* force an update based on parameters read from the device */
1564  	sysfs_update_group(kobj, &target_attribute_group);
1565  
1566  	return 0;
1567  }
1568  
1569  struct scsi_transport_template *
spi_attach_transport(struct spi_function_template * ft)1570  spi_attach_transport(struct spi_function_template *ft)
1571  {
1572  	struct spi_internal *i = kzalloc(sizeof(struct spi_internal),
1573  					 GFP_KERNEL);
1574  
1575  	if (unlikely(!i))
1576  		return NULL;
1577  
1578  	i->t.target_attrs.ac.class = &spi_transport_class.class;
1579  	i->t.target_attrs.ac.grp = &target_attribute_group;
1580  	i->t.target_attrs.ac.match = spi_target_match;
1581  	transport_container_register(&i->t.target_attrs);
1582  	i->t.target_size = sizeof(struct spi_transport_attrs);
1583  	i->t.host_attrs.ac.class = &spi_host_class.class;
1584  	i->t.host_attrs.ac.grp = &host_attribute_group;
1585  	i->t.host_attrs.ac.match = spi_host_match;
1586  	transport_container_register(&i->t.host_attrs);
1587  	i->t.host_size = sizeof(struct spi_host_attrs);
1588  	i->f = ft;
1589  
1590  	return &i->t;
1591  }
1592  EXPORT_SYMBOL(spi_attach_transport);
1593  
spi_release_transport(struct scsi_transport_template * t)1594  void spi_release_transport(struct scsi_transport_template *t)
1595  {
1596  	struct spi_internal *i = to_spi_internal(t);
1597  
1598  	transport_container_unregister(&i->t.target_attrs);
1599  	transport_container_unregister(&i->t.host_attrs);
1600  
1601  	kfree(i);
1602  }
1603  EXPORT_SYMBOL(spi_release_transport);
1604  
spi_transport_init(void)1605  static __init int spi_transport_init(void)
1606  {
1607  	int error = scsi_dev_info_add_list(SCSI_DEVINFO_SPI,
1608  					   "SCSI Parallel Transport Class");
1609  	if (!error) {
1610  		int i;
1611  
1612  		for (i = 0; spi_static_device_list[i].vendor; i++)
1613  			scsi_dev_info_list_add_keyed(1,	/* compatible */
1614  						     spi_static_device_list[i].vendor,
1615  						     spi_static_device_list[i].model,
1616  						     NULL,
1617  						     spi_static_device_list[i].flags,
1618  						     SCSI_DEVINFO_SPI);
1619  	}
1620  
1621  	error = transport_class_register(&spi_transport_class);
1622  	if (error)
1623  		return error;
1624  	error = anon_transport_class_register(&spi_device_class);
1625  	return transport_class_register(&spi_host_class);
1626  }
1627  
spi_transport_exit(void)1628  static void __exit spi_transport_exit(void)
1629  {
1630  	transport_class_unregister(&spi_transport_class);
1631  	anon_transport_class_unregister(&spi_device_class);
1632  	transport_class_unregister(&spi_host_class);
1633  	scsi_dev_info_remove_list(SCSI_DEVINFO_SPI);
1634  }
1635  
1636  MODULE_AUTHOR("Martin Hicks");
1637  MODULE_DESCRIPTION("SPI Transport Attributes");
1638  MODULE_LICENSE("GPL");
1639  
1640  module_init(spi_transport_init);
1641  module_exit(spi_transport_exit);
1642