cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

scsi_transport_spi.c (45111B)


      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 */
     40enum {
     41	SPI_BLIST_NOIUS = (__force blist_flags_t)0x1,
     42};
     43
     44/* blacklist table, modelled on scsi_devinfo.c */
     45static 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
     59struct 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
     66static 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
     87static 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
    107static int spi_execute(struct scsi_device *sdev, const void *cmd,
    108		       enum dma_data_direction dir,
    109		       void *buffer, unsigned bufflen,
    110		       struct scsi_sense_hdr *sshdr)
    111{
    112	int i, result;
    113	unsigned char sense[SCSI_SENSE_BUFFERSIZE];
    114	struct scsi_sense_hdr sshdr_tmp;
    115
    116	if (!sshdr)
    117		sshdr = &sshdr_tmp;
    118
    119	for(i = 0; i < DV_RETRIES; i++) {
    120		/*
    121		 * The purpose of the RQF_PM flag below is to bypass the
    122		 * SDEV_QUIESCE state.
    123		 */
    124		result = scsi_execute(sdev, cmd, dir, buffer, bufflen, sense,
    125				      sshdr, DV_TIMEOUT, /* retries */ 1,
    126				      REQ_FAILFAST_DEV |
    127				      REQ_FAILFAST_TRANSPORT |
    128				      REQ_FAILFAST_DRIVER,
    129				      RQF_PM, NULL);
    130		if (result < 0 || !scsi_sense_valid(sshdr) ||
    131		    sshdr->sense_key != UNIT_ATTENTION)
    132			break;
    133	}
    134	return result;
    135}
    136
    137static 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
    147static 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}
    157static 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
    170static 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
    180static int spi_host_configure(struct transport_container *tc,
    181			      struct device *dev,
    182			      struct device *cdev);
    183
    184static DECLARE_TRANSPORT_CLASS(spi_host_class,
    185			       "spi_host",
    186			       spi_host_setup,
    187			       NULL,
    188			       spi_host_configure);
    189
    190static 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
    206static int spi_target_configure(struct transport_container *tc,
    207				struct device *dev,
    208				struct device *cdev);
    209
    210static 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
    239static 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									\
    271static ssize_t								\
    272show_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									\
    284static ssize_t								\
    285store_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									\
    301static ssize_t								\
    302show_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)		\
    316static ssize_t								\
    317store_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)			\
    334static ssize_t								\
    335store_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)		\
    358static 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)		\
    365static 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)		\
    373static DEVICE_ATTR(field, S_IRUGO,				\
    374		   show_spi_transport_##field,			\
    375		   store_spi_transport_##field);
    376
    377/* The Parallel SCSI Tranport Attributes: */
    378spi_transport_max_attr(offset, "%d\n");
    379spi_transport_max_attr(width, "%d\n");
    380spi_transport_max_attr(iu, "%d\n");
    381spi_transport_rd_attr(dt, "%d\n");
    382spi_transport_max_attr(qas, "%d\n");
    383spi_transport_rd_attr(wr_flow, "%d\n");
    384spi_transport_rd_attr(rd_strm, "%d\n");
    385spi_transport_rd_attr(rti, "%d\n");
    386spi_transport_rd_attr(pcomp_en, "%d\n");
    387spi_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 */
    391static 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
    400static ssize_t
    401store_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}
    409static 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 */
    413static 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
    434static ssize_t
    435show_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
    443static ssize_t
    444store_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
    480static ssize_t
    481show_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
    496static ssize_t
    497store_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
    520static DEVICE_ATTR(period, S_IRUGO,
    521		   show_spi_transport_period,
    522		   store_spi_transport_period);
    523
    524static ssize_t
    525show_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
    540static ssize_t
    541store_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
    554static DEVICE_ATTR(min_period, S_IRUGO,
    555		   show_spi_transport_min_period,
    556		   store_spi_transport_min_period);
    557
    558
    559static 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}
    571static 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}
    587static DEVICE_ATTR(signalling, S_IRUGO,
    588		   show_spi_host_signalling,
    589		   store_spi_host_signalling);
    590
    591static 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}
    599static DEVICE_ATTR(host_width, S_IRUGO,
    600		   show_spi_host_width, NULL);
    601
    602static 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}
    610static 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
    617enum 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 */
    626static enum spi_compare_returns
    627spi_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, DMA_TO_DEVICE,
    679				     buffer, len, &sshdr);
    680		if(result || !scsi_device_online(sdev)) {
    681
    682			scsi_device_set_state(sdev, SDEV_QUIESCE);
    683			if (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, DMA_FROM_DEVICE,
    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 */
    712static enum spi_compare_returns
    713spi_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, DMA_FROM_DEVICE,
    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
    748static enum spi_compare_returns
    749spi_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
    806static int
    807spi_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, DMA_NONE, 
    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			     DMA_FROM_DEVICE, 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
    853static void
    854spi_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 */
    997void
    998spi_dv_device(struct scsi_device *sdev)
    999{
   1000	struct scsi_target *starget = sdev->sdev_target;
   1001	u8 *buffer;
   1002	const int len = SPI_MAX_ECHO_BUFFER_SIZE*2;
   1003
   1004	/*
   1005	 * Because this function and the power management code both call
   1006	 * scsi_device_quiesce(), it is not safe to perform domain validation
   1007	 * while suspend or resume is in progress. Hence the
   1008	 * lock/unlock_system_sleep() calls.
   1009	 */
   1010	lock_system_sleep();
   1011
   1012	if (scsi_autopm_get_device(sdev))
   1013		goto unlock_system_sleep;
   1014
   1015	if (unlikely(spi_dv_in_progress(starget)))
   1016		goto put_autopm;
   1017
   1018	if (unlikely(scsi_device_get(sdev)))
   1019		goto put_autopm;
   1020
   1021	spi_dv_in_progress(starget) = 1;
   1022
   1023	buffer = kzalloc(len, GFP_KERNEL);
   1024
   1025	if (unlikely(!buffer))
   1026		goto put_sdev;
   1027
   1028	/* We need to verify that the actual device will quiesce; the
   1029	 * later target quiesce is just a nice to have */
   1030	if (unlikely(scsi_device_quiesce(sdev)))
   1031		goto free_buffer;
   1032
   1033	scsi_target_quiesce(starget);
   1034
   1035	spi_dv_pending(starget) = 1;
   1036	mutex_lock(&spi_dv_mutex(starget));
   1037
   1038	starget_printk(KERN_INFO, starget, "Beginning Domain Validation\n");
   1039
   1040	spi_dv_device_internal(sdev, buffer);
   1041
   1042	starget_printk(KERN_INFO, starget, "Ending Domain Validation\n");
   1043
   1044	mutex_unlock(&spi_dv_mutex(starget));
   1045	spi_dv_pending(starget) = 0;
   1046
   1047	scsi_target_resume(starget);
   1048
   1049	spi_initial_dv(starget) = 1;
   1050
   1051free_buffer:
   1052	kfree(buffer);
   1053
   1054put_sdev:
   1055	spi_dv_in_progress(starget) = 0;
   1056	scsi_device_put(sdev);
   1057put_autopm:
   1058	scsi_autopm_put_device(sdev);
   1059
   1060unlock_system_sleep:
   1061	unlock_system_sleep();
   1062}
   1063EXPORT_SYMBOL(spi_dv_device);
   1064
   1065struct work_queue_wrapper {
   1066	struct work_struct	work;
   1067	struct scsi_device	*sdev;
   1068};
   1069
   1070static void
   1071spi_dv_device_work_wrapper(struct work_struct *work)
   1072{
   1073	struct work_queue_wrapper *wqw =
   1074		container_of(work, struct work_queue_wrapper, work);
   1075	struct scsi_device *sdev = wqw->sdev;
   1076
   1077	kfree(wqw);
   1078	spi_dv_device(sdev);
   1079	spi_dv_pending(sdev->sdev_target) = 0;
   1080	scsi_device_put(sdev);
   1081}
   1082
   1083
   1084/**
   1085 *	spi_schedule_dv_device - schedule domain validation to occur on the device
   1086 *	@sdev:	The device to validate
   1087 *
   1088 *	Identical to spi_dv_device() above, except that the DV will be
   1089 *	scheduled to occur in a workqueue later.  All memory allocations
   1090 *	are atomic, so may be called from any context including those holding
   1091 *	SCSI locks.
   1092 */
   1093void
   1094spi_schedule_dv_device(struct scsi_device *sdev)
   1095{
   1096	struct work_queue_wrapper *wqw =
   1097		kmalloc(sizeof(struct work_queue_wrapper), GFP_ATOMIC);
   1098
   1099	if (unlikely(!wqw))
   1100		return;
   1101
   1102	if (unlikely(spi_dv_pending(sdev->sdev_target))) {
   1103		kfree(wqw);
   1104		return;
   1105	}
   1106	/* Set pending early (dv_device doesn't check it, only sets it) */
   1107	spi_dv_pending(sdev->sdev_target) = 1;
   1108	if (unlikely(scsi_device_get(sdev))) {
   1109		kfree(wqw);
   1110		spi_dv_pending(sdev->sdev_target) = 0;
   1111		return;
   1112	}
   1113
   1114	INIT_WORK(&wqw->work, spi_dv_device_work_wrapper);
   1115	wqw->sdev = sdev;
   1116
   1117	schedule_work(&wqw->work);
   1118}
   1119EXPORT_SYMBOL(spi_schedule_dv_device);
   1120
   1121/**
   1122 * spi_display_xfer_agreement - Print the current target transfer agreement
   1123 * @starget: The target for which to display the agreement
   1124 *
   1125 * Each SPI port is required to maintain a transfer agreement for each
   1126 * other port on the bus.  This function prints a one-line summary of
   1127 * the current agreement; more detailed information is available in sysfs.
   1128 */
   1129void spi_display_xfer_agreement(struct scsi_target *starget)
   1130{
   1131	struct spi_transport_attrs *tp;
   1132	tp = (struct spi_transport_attrs *)&starget->starget_data;
   1133
   1134	if (tp->offset > 0 && tp->period > 0) {
   1135		unsigned int picosec, kb100;
   1136		char *scsi = "FAST-?";
   1137		char tmp[8];
   1138
   1139		if (tp->period <= SPI_STATIC_PPR) {
   1140			picosec = ppr_to_ps[tp->period];
   1141			switch (tp->period) {
   1142				case  7: scsi = "FAST-320"; break;
   1143				case  8: scsi = "FAST-160"; break;
   1144				case  9: scsi = "FAST-80"; break;
   1145				case 10:
   1146				case 11: scsi = "FAST-40"; break;
   1147				case 12: scsi = "FAST-20"; break;
   1148			}
   1149		} else {
   1150			picosec = tp->period * 4000;
   1151			if (tp->period < 25)
   1152				scsi = "FAST-20";
   1153			else if (tp->period < 50)
   1154				scsi = "FAST-10";
   1155			else
   1156				scsi = "FAST-5";
   1157		}
   1158
   1159		kb100 = (10000000 + picosec / 2) / picosec;
   1160		if (tp->width)
   1161			kb100 *= 2;
   1162		sprint_frac(tmp, picosec, 1000);
   1163
   1164		dev_info(&starget->dev,
   1165			 "%s %sSCSI %d.%d MB/s %s%s%s%s%s%s%s%s (%s ns, offset %d)\n",
   1166			 scsi, tp->width ? "WIDE " : "", kb100/10, kb100 % 10,
   1167			 tp->dt ? "DT" : "ST",
   1168			 tp->iu ? " IU" : "",
   1169			 tp->qas  ? " QAS" : "",
   1170			 tp->rd_strm ? " RDSTRM" : "",
   1171			 tp->rti ? " RTI" : "",
   1172			 tp->wr_flow ? " WRFLOW" : "",
   1173			 tp->pcomp_en ? " PCOMP" : "",
   1174			 tp->hold_mcs ? " HMCS" : "",
   1175			 tmp, tp->offset);
   1176	} else {
   1177		dev_info(&starget->dev, "%sasynchronous\n",
   1178				tp->width ? "wide " : "");
   1179	}
   1180}
   1181EXPORT_SYMBOL(spi_display_xfer_agreement);
   1182
   1183int spi_populate_width_msg(unsigned char *msg, int width)
   1184{
   1185	msg[0] = EXTENDED_MESSAGE;
   1186	msg[1] = 2;
   1187	msg[2] = EXTENDED_WDTR;
   1188	msg[3] = width;
   1189	return 4;
   1190}
   1191EXPORT_SYMBOL_GPL(spi_populate_width_msg);
   1192
   1193int spi_populate_sync_msg(unsigned char *msg, int period, int offset)
   1194{
   1195	msg[0] = EXTENDED_MESSAGE;
   1196	msg[1] = 3;
   1197	msg[2] = EXTENDED_SDTR;
   1198	msg[3] = period;
   1199	msg[4] = offset;
   1200	return 5;
   1201}
   1202EXPORT_SYMBOL_GPL(spi_populate_sync_msg);
   1203
   1204int spi_populate_ppr_msg(unsigned char *msg, int period, int offset,
   1205		int width, int options)
   1206{
   1207	msg[0] = EXTENDED_MESSAGE;
   1208	msg[1] = 6;
   1209	msg[2] = EXTENDED_PPR;
   1210	msg[3] = period;
   1211	msg[4] = 0;
   1212	msg[5] = offset;
   1213	msg[6] = width;
   1214	msg[7] = options;
   1215	return 8;
   1216}
   1217EXPORT_SYMBOL_GPL(spi_populate_ppr_msg);
   1218
   1219/**
   1220 * spi_populate_tag_msg - place a tag message in a buffer
   1221 * @msg:	pointer to the area to place the tag
   1222 * @cmd:	pointer to the scsi command for the tag
   1223 *
   1224 * Notes:
   1225 *	designed to create the correct type of tag message for the 
   1226 *	particular request.  Returns the size of the tag message.
   1227 *	May return 0 if TCQ is disabled for this device.
   1228 **/
   1229int spi_populate_tag_msg(unsigned char *msg, struct scsi_cmnd *cmd)
   1230{
   1231        if (cmd->flags & SCMD_TAGGED) {
   1232		*msg++ = SIMPLE_QUEUE_TAG;
   1233		*msg++ = scsi_cmd_to_rq(cmd)->tag;
   1234        	return 2;
   1235	}
   1236
   1237	return 0;
   1238}
   1239EXPORT_SYMBOL_GPL(spi_populate_tag_msg);
   1240
   1241#ifdef CONFIG_SCSI_CONSTANTS
   1242static const char * const one_byte_msgs[] = {
   1243/* 0x00 */ "Task Complete", NULL /* Extended Message */, "Save Pointers",
   1244/* 0x03 */ "Restore Pointers", "Disconnect", "Initiator Error", 
   1245/* 0x06 */ "Abort Task Set", "Message Reject", "Nop", "Message Parity Error",
   1246/* 0x0a */ "Linked Command Complete", "Linked Command Complete w/flag",
   1247/* 0x0c */ "Target Reset", "Abort Task", "Clear Task Set", 
   1248/* 0x0f */ "Initiate Recovery", "Release Recovery",
   1249/* 0x11 */ "Terminate Process", "Continue Task", "Target Transfer Disable",
   1250/* 0x14 */ NULL, NULL, "Clear ACA", "LUN Reset"
   1251};
   1252
   1253static const char * const two_byte_msgs[] = {
   1254/* 0x20 */ "Simple Queue Tag", "Head of Queue Tag", "Ordered Queue Tag",
   1255/* 0x23 */ "Ignore Wide Residue", "ACA"
   1256};
   1257
   1258static const char * const extended_msgs[] = {
   1259/* 0x00 */ "Modify Data Pointer", "Synchronous Data Transfer Request",
   1260/* 0x02 */ "SCSI-I Extended Identify", "Wide Data Transfer Request",
   1261/* 0x04 */ "Parallel Protocol Request", "Modify Bidirectional Data Pointer"
   1262};
   1263
   1264static void print_nego(const unsigned char *msg, int per, int off, int width)
   1265{
   1266	if (per) {
   1267		char buf[20];
   1268		period_to_str(buf, msg[per]);
   1269		printk("period = %s ns ", buf);
   1270	}
   1271
   1272	if (off)
   1273		printk("offset = %d ", msg[off]);
   1274	if (width)
   1275		printk("width = %d ", 8 << msg[width]);
   1276}
   1277
   1278static void print_ptr(const unsigned char *msg, int msb, const char *desc)
   1279{
   1280	int ptr = (msg[msb] << 24) | (msg[msb+1] << 16) | (msg[msb+2] << 8) |
   1281			msg[msb+3];
   1282	printk("%s = %d ", desc, ptr);
   1283}
   1284
   1285int spi_print_msg(const unsigned char *msg)
   1286{
   1287	int len = 1, i;
   1288	if (msg[0] == EXTENDED_MESSAGE) {
   1289		len = 2 + msg[1];
   1290		if (len == 2)
   1291			len += 256;
   1292		if (msg[2] < ARRAY_SIZE(extended_msgs))
   1293			printk ("%s ", extended_msgs[msg[2]]); 
   1294		else 
   1295			printk ("Extended Message, reserved code (0x%02x) ",
   1296				(int) msg[2]);
   1297		switch (msg[2]) {
   1298		case EXTENDED_MODIFY_DATA_POINTER:
   1299			print_ptr(msg, 3, "pointer");
   1300			break;
   1301		case EXTENDED_SDTR:
   1302			print_nego(msg, 3, 4, 0);
   1303			break;
   1304		case EXTENDED_WDTR:
   1305			print_nego(msg, 0, 0, 3);
   1306			break;
   1307		case EXTENDED_PPR:
   1308			print_nego(msg, 3, 5, 6);
   1309			break;
   1310		case EXTENDED_MODIFY_BIDI_DATA_PTR:
   1311			print_ptr(msg, 3, "out");
   1312			print_ptr(msg, 7, "in");
   1313			break;
   1314		default:
   1315		for (i = 2; i < len; ++i) 
   1316			printk("%02x ", msg[i]);
   1317		}
   1318	/* Identify */
   1319	} else if (msg[0] & 0x80) {
   1320		printk("Identify disconnect %sallowed %s %d ",
   1321			(msg[0] & 0x40) ? "" : "not ",
   1322			(msg[0] & 0x20) ? "target routine" : "lun",
   1323			msg[0] & 0x7);
   1324	/* Normal One byte */
   1325	} else if (msg[0] < 0x1f) {
   1326		if (msg[0] < ARRAY_SIZE(one_byte_msgs) && one_byte_msgs[msg[0]])
   1327			printk("%s ", one_byte_msgs[msg[0]]);
   1328		else
   1329			printk("reserved (%02x) ", msg[0]);
   1330	} else if (msg[0] == 0x55) {
   1331		printk("QAS Request ");
   1332	/* Two byte */
   1333	} else if (msg[0] <= 0x2f) {
   1334		if ((msg[0] - 0x20) < ARRAY_SIZE(two_byte_msgs))
   1335			printk("%s %02x ", two_byte_msgs[msg[0] - 0x20], 
   1336				msg[1]);
   1337		else 
   1338			printk("reserved two byte (%02x %02x) ", 
   1339				msg[0], msg[1]);
   1340		len = 2;
   1341	} else 
   1342		printk("reserved ");
   1343	return len;
   1344}
   1345EXPORT_SYMBOL(spi_print_msg);
   1346
   1347#else  /* ifndef CONFIG_SCSI_CONSTANTS */
   1348
   1349int spi_print_msg(const unsigned char *msg)
   1350{
   1351	int len = 1, i;
   1352
   1353	if (msg[0] == EXTENDED_MESSAGE) {
   1354		len = 2 + msg[1];
   1355		if (len == 2)
   1356			len += 256;
   1357		for (i = 0; i < len; ++i)
   1358			printk("%02x ", msg[i]);
   1359	/* Identify */
   1360	} else if (msg[0] & 0x80) {
   1361		printk("%02x ", msg[0]);
   1362	/* Normal One byte */
   1363	} else if ((msg[0] < 0x1f) || (msg[0] == 0x55)) {
   1364		printk("%02x ", msg[0]);
   1365	/* Two byte */
   1366	} else if (msg[0] <= 0x2f) {
   1367		printk("%02x %02x", msg[0], msg[1]);
   1368		len = 2;
   1369	} else 
   1370		printk("%02x ", msg[0]);
   1371	return len;
   1372}
   1373EXPORT_SYMBOL(spi_print_msg);
   1374#endif /* ! CONFIG_SCSI_CONSTANTS */
   1375
   1376static int spi_device_match(struct attribute_container *cont,
   1377			    struct device *dev)
   1378{
   1379	struct scsi_device *sdev;
   1380	struct Scsi_Host *shost;
   1381	struct spi_internal *i;
   1382
   1383	if (!scsi_is_sdev_device(dev))
   1384		return 0;
   1385
   1386	sdev = to_scsi_device(dev);
   1387	shost = sdev->host;
   1388	if (!shost->transportt  || shost->transportt->host_attrs.ac.class
   1389	    != &spi_host_class.class)
   1390		return 0;
   1391	/* Note: this class has no device attributes, so it has
   1392	 * no per-HBA allocation and thus we don't need to distinguish
   1393	 * the attribute containers for the device */
   1394	i = to_spi_internal(shost->transportt);
   1395	if (i->f->deny_binding && i->f->deny_binding(sdev->sdev_target))
   1396		return 0;
   1397	return 1;
   1398}
   1399
   1400static int spi_target_match(struct attribute_container *cont,
   1401			    struct device *dev)
   1402{
   1403	struct Scsi_Host *shost;
   1404	struct scsi_target *starget;
   1405	struct spi_internal *i;
   1406
   1407	if (!scsi_is_target_device(dev))
   1408		return 0;
   1409
   1410	shost = dev_to_shost(dev->parent);
   1411	if (!shost->transportt  || shost->transportt->host_attrs.ac.class
   1412	    != &spi_host_class.class)
   1413		return 0;
   1414
   1415	i = to_spi_internal(shost->transportt);
   1416	starget = to_scsi_target(dev);
   1417
   1418	if (i->f->deny_binding && i->f->deny_binding(starget))
   1419		return 0;
   1420
   1421	return &i->t.target_attrs.ac == cont;
   1422}
   1423
   1424static DECLARE_TRANSPORT_CLASS(spi_transport_class,
   1425			       "spi_transport",
   1426			       spi_setup_transport_attrs,
   1427			       NULL,
   1428			       spi_target_configure);
   1429
   1430static DECLARE_ANON_TRANSPORT_CLASS(spi_device_class,
   1431				    spi_device_match,
   1432				    spi_device_configure);
   1433
   1434static struct attribute *host_attributes[] = {
   1435	&dev_attr_signalling.attr,
   1436	&dev_attr_host_width.attr,
   1437	&dev_attr_hba_id.attr,
   1438	NULL
   1439};
   1440
   1441static struct attribute_group host_attribute_group = {
   1442	.attrs = host_attributes,
   1443};
   1444
   1445static int spi_host_configure(struct transport_container *tc,
   1446			      struct device *dev,
   1447			      struct device *cdev)
   1448{
   1449	struct kobject *kobj = &cdev->kobj;
   1450	struct Scsi_Host *shost = transport_class_to_shost(cdev);
   1451	struct spi_internal *si = to_spi_internal(shost->transportt);
   1452	struct attribute *attr = &dev_attr_signalling.attr;
   1453	int rc = 0;
   1454
   1455	if (si->f->set_signalling)
   1456		rc = sysfs_chmod_file(kobj, attr, attr->mode | S_IWUSR);
   1457
   1458	return rc;
   1459}
   1460
   1461/* returns true if we should be showing the variable.  Also
   1462 * overloads the return by setting 1<<1 if the attribute should
   1463 * be writeable */
   1464#define TARGET_ATTRIBUTE_HELPER(name) \
   1465	(si->f->show_##name ? S_IRUGO : 0) | \
   1466	(si->f->set_##name ? S_IWUSR : 0)
   1467
   1468static umode_t target_attribute_is_visible(struct kobject *kobj,
   1469					  struct attribute *attr, int i)
   1470{
   1471	struct device *cdev = container_of(kobj, struct device, kobj);
   1472	struct scsi_target *starget = transport_class_to_starget(cdev);
   1473	struct Scsi_Host *shost = transport_class_to_shost(cdev);
   1474	struct spi_internal *si = to_spi_internal(shost->transportt);
   1475
   1476	if (attr == &dev_attr_period.attr &&
   1477	    spi_support_sync(starget))
   1478		return TARGET_ATTRIBUTE_HELPER(period);
   1479	else if (attr == &dev_attr_min_period.attr &&
   1480		 spi_support_sync(starget))
   1481		return TARGET_ATTRIBUTE_HELPER(period);
   1482	else if (attr == &dev_attr_offset.attr &&
   1483		 spi_support_sync(starget))
   1484		return TARGET_ATTRIBUTE_HELPER(offset);
   1485	else if (attr == &dev_attr_max_offset.attr &&
   1486		 spi_support_sync(starget))
   1487		return TARGET_ATTRIBUTE_HELPER(offset);
   1488	else if (attr == &dev_attr_width.attr &&
   1489		 spi_support_wide(starget))
   1490		return TARGET_ATTRIBUTE_HELPER(width);
   1491	else if (attr == &dev_attr_max_width.attr &&
   1492		 spi_support_wide(starget))
   1493		return TARGET_ATTRIBUTE_HELPER(width);
   1494	else if (attr == &dev_attr_iu.attr &&
   1495		 spi_support_ius(starget))
   1496		return TARGET_ATTRIBUTE_HELPER(iu);
   1497	else if (attr == &dev_attr_max_iu.attr &&
   1498		 spi_support_ius(starget))
   1499		return TARGET_ATTRIBUTE_HELPER(iu);
   1500	else if (attr == &dev_attr_dt.attr &&
   1501		 spi_support_dt(starget))
   1502		return TARGET_ATTRIBUTE_HELPER(dt);
   1503	else if (attr == &dev_attr_qas.attr &&
   1504		 spi_support_qas(starget))
   1505		return TARGET_ATTRIBUTE_HELPER(qas);
   1506	else if (attr == &dev_attr_max_qas.attr &&
   1507		 spi_support_qas(starget))
   1508		return TARGET_ATTRIBUTE_HELPER(qas);
   1509	else if (attr == &dev_attr_wr_flow.attr &&
   1510		 spi_support_ius(starget))
   1511		return TARGET_ATTRIBUTE_HELPER(wr_flow);
   1512	else if (attr == &dev_attr_rd_strm.attr &&
   1513		 spi_support_ius(starget))
   1514		return TARGET_ATTRIBUTE_HELPER(rd_strm);
   1515	else if (attr == &dev_attr_rti.attr &&
   1516		 spi_support_ius(starget))
   1517		return TARGET_ATTRIBUTE_HELPER(rti);
   1518	else if (attr == &dev_attr_pcomp_en.attr &&
   1519		 spi_support_ius(starget))
   1520		return TARGET_ATTRIBUTE_HELPER(pcomp_en);
   1521	else if (attr == &dev_attr_hold_mcs.attr &&
   1522		 spi_support_ius(starget))
   1523		return TARGET_ATTRIBUTE_HELPER(hold_mcs);
   1524	else if (attr == &dev_attr_revalidate.attr)
   1525		return S_IWUSR;
   1526
   1527	return 0;
   1528}
   1529
   1530static struct attribute *target_attributes[] = {
   1531	&dev_attr_period.attr,
   1532	&dev_attr_min_period.attr,
   1533	&dev_attr_offset.attr,
   1534	&dev_attr_max_offset.attr,
   1535	&dev_attr_width.attr,
   1536	&dev_attr_max_width.attr,
   1537	&dev_attr_iu.attr,
   1538	&dev_attr_max_iu.attr,
   1539	&dev_attr_dt.attr,
   1540	&dev_attr_qas.attr,
   1541	&dev_attr_max_qas.attr,
   1542	&dev_attr_wr_flow.attr,
   1543	&dev_attr_rd_strm.attr,
   1544	&dev_attr_rti.attr,
   1545	&dev_attr_pcomp_en.attr,
   1546	&dev_attr_hold_mcs.attr,
   1547	&dev_attr_revalidate.attr,
   1548	NULL
   1549};
   1550
   1551static struct attribute_group target_attribute_group = {
   1552	.attrs = target_attributes,
   1553	.is_visible = target_attribute_is_visible,
   1554};
   1555
   1556static int spi_target_configure(struct transport_container *tc,
   1557				struct device *dev,
   1558				struct device *cdev)
   1559{
   1560	struct kobject *kobj = &cdev->kobj;
   1561
   1562	/* force an update based on parameters read from the device */
   1563	sysfs_update_group(kobj, &target_attribute_group);
   1564
   1565	return 0;
   1566}
   1567
   1568struct scsi_transport_template *
   1569spi_attach_transport(struct spi_function_template *ft)
   1570{
   1571	struct spi_internal *i = kzalloc(sizeof(struct spi_internal),
   1572					 GFP_KERNEL);
   1573
   1574	if (unlikely(!i))
   1575		return NULL;
   1576
   1577	i->t.target_attrs.ac.class = &spi_transport_class.class;
   1578	i->t.target_attrs.ac.grp = &target_attribute_group;
   1579	i->t.target_attrs.ac.match = spi_target_match;
   1580	transport_container_register(&i->t.target_attrs);
   1581	i->t.target_size = sizeof(struct spi_transport_attrs);
   1582	i->t.host_attrs.ac.class = &spi_host_class.class;
   1583	i->t.host_attrs.ac.grp = &host_attribute_group;
   1584	i->t.host_attrs.ac.match = spi_host_match;
   1585	transport_container_register(&i->t.host_attrs);
   1586	i->t.host_size = sizeof(struct spi_host_attrs);
   1587	i->f = ft;
   1588
   1589	return &i->t;
   1590}
   1591EXPORT_SYMBOL(spi_attach_transport);
   1592
   1593void spi_release_transport(struct scsi_transport_template *t)
   1594{
   1595	struct spi_internal *i = to_spi_internal(t);
   1596
   1597	transport_container_unregister(&i->t.target_attrs);
   1598	transport_container_unregister(&i->t.host_attrs);
   1599
   1600	kfree(i);
   1601}
   1602EXPORT_SYMBOL(spi_release_transport);
   1603
   1604static __init int spi_transport_init(void)
   1605{
   1606	int error = scsi_dev_info_add_list(SCSI_DEVINFO_SPI,
   1607					   "SCSI Parallel Transport Class");
   1608	if (!error) {
   1609		int i;
   1610
   1611		for (i = 0; spi_static_device_list[i].vendor; i++)
   1612			scsi_dev_info_list_add_keyed(1,	/* compatible */
   1613						     spi_static_device_list[i].vendor,
   1614						     spi_static_device_list[i].model,
   1615						     NULL,
   1616						     spi_static_device_list[i].flags,
   1617						     SCSI_DEVINFO_SPI);
   1618	}
   1619
   1620	error = transport_class_register(&spi_transport_class);
   1621	if (error)
   1622		return error;
   1623	error = anon_transport_class_register(&spi_device_class);
   1624	return transport_class_register(&spi_host_class);
   1625}
   1626
   1627static void __exit spi_transport_exit(void)
   1628{
   1629	transport_class_unregister(&spi_transport_class);
   1630	anon_transport_class_unregister(&spi_device_class);
   1631	transport_class_unregister(&spi_host_class);
   1632	scsi_dev_info_remove_list(SCSI_DEVINFO_SPI);
   1633}
   1634
   1635MODULE_AUTHOR("Martin Hicks");
   1636MODULE_DESCRIPTION("SPI Transport Attributes");
   1637MODULE_LICENSE("GPL");
   1638
   1639module_init(spi_transport_init);
   1640module_exit(spi_transport_exit);