scsi_debug.c revision 5447ed6c968e7270b656afa273c2b79d15d82edd
1/*
2 * vvvvvvvvvvvvvvvvvvvvvvv Original vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
3 *  Copyright (C) 1992  Eric Youngdale
4 *  Simulate a host adapter with 2 disks attached.  Do a lot of checking
5 *  to make sure that we are not getting blocks mixed up, and PANIC if
6 *  anything out of the ordinary is seen.
7 * ^^^^^^^^^^^^^^^^^^^^^^^ Original ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
8 *
9 *  This version is more generic, simulating a variable number of disk
10 *  (or disk like devices) sharing a common amount of RAM. To be more
11 *  realistic, the simulated devices have the transport attributes of
12 *  SAS disks.
13 *
14 *
15 *  For documentation see http://www.torque.net/sg/sdebug26.html
16 *
17 *   D. Gilbert (dpg) work for Magneto-Optical device test [20010421]
18 *   dpg: work for devfs large number of disks [20010809]
19 *        forked for lk 2.5 series [20011216, 20020101]
20 *        use vmalloc() more inquiry+mode_sense [20020302]
21 *        add timers for delayed responses [20020721]
22 *   Patrick Mansfield <patmans@us.ibm.com> max_luns+scsi_level [20021031]
23 *   Mike Anderson <andmike@us.ibm.com> sysfs work [20021118]
24 *   dpg: change style of boot options to "scsi_debug.num_tgts=2" and
25 *        module options to "modprobe scsi_debug num_tgts=2" [20021221]
26 */
27
28#include <linux/module.h>
29
30#include <linux/kernel.h>
31#include <linux/errno.h>
32#include <linux/timer.h>
33#include <linux/slab.h>
34#include <linux/types.h>
35#include <linux/string.h>
36#include <linux/genhd.h>
37#include <linux/fs.h>
38#include <linux/init.h>
39#include <linux/proc_fs.h>
40#include <linux/vmalloc.h>
41#include <linux/moduleparam.h>
42#include <linux/scatterlist.h>
43#include <linux/blkdev.h>
44#include <linux/crc-t10dif.h>
45
46#include <net/checksum.h>
47
48#include <asm/unaligned.h>
49
50#include <scsi/scsi.h>
51#include <scsi/scsi_cmnd.h>
52#include <scsi/scsi_device.h>
53#include <scsi/scsi_host.h>
54#include <scsi/scsicam.h>
55#include <scsi/scsi_eh.h>
56#include <scsi/scsi_dbg.h>
57
58#include "sd.h"
59#include "scsi_logging.h"
60
61#define SCSI_DEBUG_VERSION "1.81"
62static const char * scsi_debug_version_date = "20070104";
63
64/* Additional Sense Code (ASC) */
65#define NO_ADDITIONAL_SENSE 0x0
66#define LOGICAL_UNIT_NOT_READY 0x4
67#define UNRECOVERED_READ_ERR 0x11
68#define PARAMETER_LIST_LENGTH_ERR 0x1a
69#define INVALID_OPCODE 0x20
70#define ADDR_OUT_OF_RANGE 0x21
71#define INVALID_COMMAND_OPCODE 0x20
72#define INVALID_FIELD_IN_CDB 0x24
73#define INVALID_FIELD_IN_PARAM_LIST 0x26
74#define POWERON_RESET 0x29
75#define SAVING_PARAMS_UNSUP 0x39
76#define TRANSPORT_PROBLEM 0x4b
77#define THRESHOLD_EXCEEDED 0x5d
78#define LOW_POWER_COND_ON 0x5e
79
80/* Additional Sense Code Qualifier (ASCQ) */
81#define ACK_NAK_TO 0x3
82
83#define SDEBUG_TAGGED_QUEUING 0 /* 0 | MSG_SIMPLE_TAG | MSG_ORDERED_TAG */
84
85/* Default values for driver parameters */
86#define DEF_NUM_HOST   1
87#define DEF_NUM_TGTS   1
88#define DEF_MAX_LUNS   1
89/* With these defaults, this driver will make 1 host with 1 target
90 * (id 0) containing 1 logical unit (lun 0). That is 1 device.
91 */
92#define DEF_DELAY   1
93#define DEF_DEV_SIZE_MB   8
94#define DEF_EVERY_NTH   0
95#define DEF_NUM_PARTS   0
96#define DEF_OPTS   0
97#define DEF_SCSI_LEVEL   5    /* INQUIRY, byte2 [5->SPC-3] */
98#define DEF_PTYPE   0
99#define DEF_D_SENSE   0
100#define DEF_NO_LUN_0   0
101#define DEF_VIRTUAL_GB   0
102#define DEF_FAKE_RW	0
103#define DEF_VPD_USE_HOSTNO 1
104#define DEF_SECTOR_SIZE 512
105#define DEF_DIX 0
106#define DEF_DIF 0
107#define DEF_GUARD 0
108#define DEF_ATO 1
109#define DEF_PHYSBLK_EXP 0
110#define DEF_LOWEST_ALIGNED 0
111#define DEF_UNMAP_MAX_BLOCKS 0
112#define DEF_UNMAP_MAX_DESC 0
113#define DEF_UNMAP_GRANULARITY 0
114#define DEF_UNMAP_ALIGNMENT 0
115
116/* bit mask values for scsi_debug_opts */
117#define SCSI_DEBUG_OPT_NOISE   1
118#define SCSI_DEBUG_OPT_MEDIUM_ERR   2
119#define SCSI_DEBUG_OPT_TIMEOUT   4
120#define SCSI_DEBUG_OPT_RECOVERED_ERR   8
121#define SCSI_DEBUG_OPT_TRANSPORT_ERR   16
122#define SCSI_DEBUG_OPT_DIF_ERR   32
123#define SCSI_DEBUG_OPT_DIX_ERR   64
124/* When "every_nth" > 0 then modulo "every_nth" commands:
125 *   - a no response is simulated if SCSI_DEBUG_OPT_TIMEOUT is set
126 *   - a RECOVERED_ERROR is simulated on successful read and write
127 *     commands if SCSI_DEBUG_OPT_RECOVERED_ERR is set.
128 *   - a TRANSPORT_ERROR is simulated on successful read and write
129 *     commands if SCSI_DEBUG_OPT_TRANSPORT_ERR is set.
130 *
131 * When "every_nth" < 0 then after "- every_nth" commands:
132 *   - a no response is simulated if SCSI_DEBUG_OPT_TIMEOUT is set
133 *   - a RECOVERED_ERROR is simulated on successful read and write
134 *     commands if SCSI_DEBUG_OPT_RECOVERED_ERR is set.
135 *   - a TRANSPORT_ERROR is simulated on successful read and write
136 *     commands if SCSI_DEBUG_OPT_TRANSPORT_ERR is set.
137 * This will continue until some other action occurs (e.g. the user
138 * writing a new value (other than -1 or 1) to every_nth via sysfs).
139 */
140
141/* when 1==SCSI_DEBUG_OPT_MEDIUM_ERR, a medium error is simulated at this
142 * sector on read commands: */
143#define OPT_MEDIUM_ERR_ADDR   0x1234 /* that's sector 4660 in decimal */
144
145/* If REPORT LUNS has luns >= 256 it can choose "flat space" (value 1)
146 * or "peripheral device" addressing (value 0) */
147#define SAM2_LUN_ADDRESS_METHOD 0
148#define SAM2_WLUN_REPORT_LUNS 0xc101
149
150static int scsi_debug_add_host = DEF_NUM_HOST;
151static int scsi_debug_delay = DEF_DELAY;
152static int scsi_debug_dev_size_mb = DEF_DEV_SIZE_MB;
153static int scsi_debug_every_nth = DEF_EVERY_NTH;
154static int scsi_debug_max_luns = DEF_MAX_LUNS;
155static int scsi_debug_num_parts = DEF_NUM_PARTS;
156static int scsi_debug_num_tgts = DEF_NUM_TGTS; /* targets per host */
157static int scsi_debug_opts = DEF_OPTS;
158static int scsi_debug_scsi_level = DEF_SCSI_LEVEL;
159static int scsi_debug_ptype = DEF_PTYPE; /* SCSI peripheral type (0==disk) */
160static int scsi_debug_dsense = DEF_D_SENSE;
161static int scsi_debug_no_lun_0 = DEF_NO_LUN_0;
162static int scsi_debug_virtual_gb = DEF_VIRTUAL_GB;
163static int scsi_debug_fake_rw = DEF_FAKE_RW;
164static int scsi_debug_vpd_use_hostno = DEF_VPD_USE_HOSTNO;
165static int scsi_debug_sector_size = DEF_SECTOR_SIZE;
166static int scsi_debug_dix = DEF_DIX;
167static int scsi_debug_dif = DEF_DIF;
168static int scsi_debug_guard = DEF_GUARD;
169static int scsi_debug_ato = DEF_ATO;
170static int scsi_debug_physblk_exp = DEF_PHYSBLK_EXP;
171static int scsi_debug_lowest_aligned = DEF_LOWEST_ALIGNED;
172static int scsi_debug_unmap_max_desc = DEF_UNMAP_MAX_DESC;
173static int scsi_debug_unmap_max_blocks = DEF_UNMAP_MAX_BLOCKS;
174static int scsi_debug_unmap_granularity = DEF_UNMAP_GRANULARITY;
175static int scsi_debug_unmap_alignment = DEF_UNMAP_ALIGNMENT;
176
177static int scsi_debug_cmnd_count = 0;
178
179#define DEV_READONLY(TGT)      (0)
180#define DEV_REMOVEABLE(TGT)    (0)
181
182static unsigned int sdebug_store_sectors;
183static sector_t sdebug_capacity;	/* in sectors */
184
185/* old BIOS stuff, kernel may get rid of them but some mode sense pages
186   may still need them */
187static int sdebug_heads;		/* heads per disk */
188static int sdebug_cylinders_per;	/* cylinders per surface */
189static int sdebug_sectors_per;		/* sectors per cylinder */
190
191#define SDEBUG_MAX_PARTS 4
192
193#define SDEBUG_SENSE_LEN 32
194
195#define SCSI_DEBUG_CANQUEUE  255
196#define SCSI_DEBUG_MAX_CMD_LEN 32
197
198struct sdebug_dev_info {
199	struct list_head dev_list;
200	unsigned char sense_buff[SDEBUG_SENSE_LEN];	/* weak nexus */
201	unsigned int channel;
202	unsigned int target;
203	unsigned int lun;
204	struct sdebug_host_info *sdbg_host;
205	unsigned int wlun;
206	char reset;
207	char stopped;
208	char used;
209};
210
211struct sdebug_host_info {
212	struct list_head host_list;
213	struct Scsi_Host *shost;
214	struct device dev;
215	struct list_head dev_info_list;
216};
217
218#define to_sdebug_host(d)	\
219	container_of(d, struct sdebug_host_info, dev)
220
221static LIST_HEAD(sdebug_host_list);
222static DEFINE_SPINLOCK(sdebug_host_list_lock);
223
224typedef void (* done_funct_t) (struct scsi_cmnd *);
225
226struct sdebug_queued_cmd {
227	int in_use;
228	struct timer_list cmnd_timer;
229	done_funct_t done_funct;
230	struct scsi_cmnd * a_cmnd;
231	int scsi_result;
232};
233static struct sdebug_queued_cmd queued_arr[SCSI_DEBUG_CANQUEUE];
234
235static unsigned char * fake_storep;	/* ramdisk storage */
236static unsigned char *dif_storep;	/* protection info */
237static void *map_storep;		/* provisioning map */
238
239static unsigned long map_size;
240static int num_aborts = 0;
241static int num_dev_resets = 0;
242static int num_bus_resets = 0;
243static int num_host_resets = 0;
244static int dix_writes;
245static int dix_reads;
246static int dif_errors;
247
248static DEFINE_SPINLOCK(queued_arr_lock);
249static DEFINE_RWLOCK(atomic_rw);
250
251static char sdebug_proc_name[] = "scsi_debug";
252
253static struct bus_type pseudo_lld_bus;
254
255static inline sector_t dif_offset(sector_t sector)
256{
257	return sector << 3;
258}
259
260static struct device_driver sdebug_driverfs_driver = {
261	.name 		= sdebug_proc_name,
262	.bus		= &pseudo_lld_bus,
263};
264
265static const int check_condition_result =
266		(DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
267
268static const int illegal_condition_result =
269	(DRIVER_SENSE << 24) | (DID_ABORT << 16) | SAM_STAT_CHECK_CONDITION;
270
271static unsigned char ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
272				    0, 0, 0x2, 0x4b};
273static unsigned char iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
274			           0, 0, 0x0, 0x0};
275
276static int sdebug_add_adapter(void);
277static void sdebug_remove_adapter(void);
278
279static void sdebug_max_tgts_luns(void)
280{
281	struct sdebug_host_info *sdbg_host;
282	struct Scsi_Host *hpnt;
283
284	spin_lock(&sdebug_host_list_lock);
285	list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
286		hpnt = sdbg_host->shost;
287		if ((hpnt->this_id >= 0) &&
288		    (scsi_debug_num_tgts > hpnt->this_id))
289			hpnt->max_id = scsi_debug_num_tgts + 1;
290		else
291			hpnt->max_id = scsi_debug_num_tgts;
292		/* scsi_debug_max_luns; */
293		hpnt->max_lun = SAM2_WLUN_REPORT_LUNS;
294	}
295	spin_unlock(&sdebug_host_list_lock);
296}
297
298static void mk_sense_buffer(struct sdebug_dev_info *devip, int key,
299			    int asc, int asq)
300{
301	unsigned char *sbuff;
302
303	sbuff = devip->sense_buff;
304	memset(sbuff, 0, SDEBUG_SENSE_LEN);
305
306	scsi_build_sense_buffer(scsi_debug_dsense, sbuff, key, asc, asq);
307
308	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
309		printk(KERN_INFO "scsi_debug:    [sense_key,asc,ascq]: "
310		      "[0x%x,0x%x,0x%x]\n", key, asc, asq);
311}
312
313static void get_data_transfer_info(unsigned char *cmd,
314				   unsigned long long *lba, unsigned int *num,
315				   u32 *ei_lba)
316{
317	*ei_lba = 0;
318
319	switch (*cmd) {
320	case VARIABLE_LENGTH_CMD:
321		*lba = (u64)cmd[19] | (u64)cmd[18] << 8 |
322			(u64)cmd[17] << 16 | (u64)cmd[16] << 24 |
323			(u64)cmd[15] << 32 | (u64)cmd[14] << 40 |
324			(u64)cmd[13] << 48 | (u64)cmd[12] << 56;
325
326		*ei_lba = (u32)cmd[23] | (u32)cmd[22] << 8 |
327			(u32)cmd[21] << 16 | (u32)cmd[20] << 24;
328
329		*num = (u32)cmd[31] | (u32)cmd[30] << 8 | (u32)cmd[29] << 16 |
330			(u32)cmd[28] << 24;
331		break;
332
333	case WRITE_SAME_16:
334	case WRITE_16:
335	case READ_16:
336		*lba = (u64)cmd[9] | (u64)cmd[8] << 8 |
337			(u64)cmd[7] << 16 | (u64)cmd[6] << 24 |
338			(u64)cmd[5] << 32 | (u64)cmd[4] << 40 |
339			(u64)cmd[3] << 48 | (u64)cmd[2] << 56;
340
341		*num = (u32)cmd[13] | (u32)cmd[12] << 8 | (u32)cmd[11] << 16 |
342			(u32)cmd[10] << 24;
343		break;
344	case WRITE_12:
345	case READ_12:
346		*lba = (u32)cmd[5] | (u32)cmd[4] << 8 | (u32)cmd[3] << 16 |
347			(u32)cmd[2] << 24;
348
349		*num = (u32)cmd[9] | (u32)cmd[8] << 8 | (u32)cmd[7] << 16 |
350			(u32)cmd[6] << 24;
351		break;
352	case WRITE_SAME:
353	case WRITE_10:
354	case READ_10:
355	case XDWRITEREAD_10:
356		*lba = (u32)cmd[5] | (u32)cmd[4] << 8 |	(u32)cmd[3] << 16 |
357			(u32)cmd[2] << 24;
358
359		*num = (u32)cmd[8] | (u32)cmd[7] << 8;
360		break;
361	case WRITE_6:
362	case READ_6:
363		*lba = (u32)cmd[3] | (u32)cmd[2] << 8 |
364			(u32)(cmd[1] & 0x1f) << 16;
365		*num = (0 == cmd[4]) ? 256 : cmd[4];
366		break;
367	default:
368		break;
369	}
370}
371
372static int scsi_debug_ioctl(struct scsi_device *dev, int cmd, void __user *arg)
373{
374	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) {
375		printk(KERN_INFO "scsi_debug: ioctl: cmd=0x%x\n", cmd);
376	}
377	return -EINVAL;
378	/* return -ENOTTY; // correct return but upsets fdisk */
379}
380
381static int check_readiness(struct scsi_cmnd * SCpnt, int reset_only,
382			   struct sdebug_dev_info * devip)
383{
384	if (devip->reset) {
385		if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
386			printk(KERN_INFO "scsi_debug: Reporting Unit "
387			       "attention: power on reset\n");
388		devip->reset = 0;
389		mk_sense_buffer(devip, UNIT_ATTENTION, POWERON_RESET, 0);
390		return check_condition_result;
391	}
392	if ((0 == reset_only) && devip->stopped) {
393		if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
394			printk(KERN_INFO "scsi_debug: Reporting Not "
395			       "ready: initializing command required\n");
396		mk_sense_buffer(devip, NOT_READY, LOGICAL_UNIT_NOT_READY,
397				0x2);
398		return check_condition_result;
399	}
400	return 0;
401}
402
403/* Returns 0 if ok else (DID_ERROR << 16). Sets scp->resid . */
404static int fill_from_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
405				int arr_len)
406{
407	int act_len;
408	struct scsi_data_buffer *sdb = scsi_in(scp);
409
410	if (!sdb->length)
411		return 0;
412	if (!(scsi_bidi_cmnd(scp) || scp->sc_data_direction == DMA_FROM_DEVICE))
413		return (DID_ERROR << 16);
414
415	act_len = sg_copy_from_buffer(sdb->table.sgl, sdb->table.nents,
416				      arr, arr_len);
417	if (sdb->resid)
418		sdb->resid -= act_len;
419	else
420		sdb->resid = scsi_bufflen(scp) - act_len;
421
422	return 0;
423}
424
425/* Returns number of bytes fetched into 'arr' or -1 if error. */
426static int fetch_to_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
427			       int arr_len)
428{
429	if (!scsi_bufflen(scp))
430		return 0;
431	if (!(scsi_bidi_cmnd(scp) || scp->sc_data_direction == DMA_TO_DEVICE))
432		return -1;
433
434	return scsi_sg_copy_to_buffer(scp, arr, arr_len);
435}
436
437
438static const char * inq_vendor_id = "Linux   ";
439static const char * inq_product_id = "scsi_debug      ";
440static const char * inq_product_rev = "0004";
441
442static int inquiry_evpd_83(unsigned char * arr, int port_group_id,
443			   int target_dev_id, int dev_id_num,
444			   const char * dev_id_str,
445			   int dev_id_str_len)
446{
447	int num, port_a;
448	char b[32];
449
450	port_a = target_dev_id + 1;
451	/* T10 vendor identifier field format (faked) */
452	arr[0] = 0x2;	/* ASCII */
453	arr[1] = 0x1;
454	arr[2] = 0x0;
455	memcpy(&arr[4], inq_vendor_id, 8);
456	memcpy(&arr[12], inq_product_id, 16);
457	memcpy(&arr[28], dev_id_str, dev_id_str_len);
458	num = 8 + 16 + dev_id_str_len;
459	arr[3] = num;
460	num += 4;
461	if (dev_id_num >= 0) {
462		/* NAA-5, Logical unit identifier (binary) */
463		arr[num++] = 0x1;	/* binary (not necessarily sas) */
464		arr[num++] = 0x3;	/* PIV=0, lu, naa */
465		arr[num++] = 0x0;
466		arr[num++] = 0x8;
467		arr[num++] = 0x53;  /* naa-5 ieee company id=0x333333 (fake) */
468		arr[num++] = 0x33;
469		arr[num++] = 0x33;
470		arr[num++] = 0x30;
471		arr[num++] = (dev_id_num >> 24);
472		arr[num++] = (dev_id_num >> 16) & 0xff;
473		arr[num++] = (dev_id_num >> 8) & 0xff;
474		arr[num++] = dev_id_num & 0xff;
475		/* Target relative port number */
476		arr[num++] = 0x61;	/* proto=sas, binary */
477		arr[num++] = 0x94;	/* PIV=1, target port, rel port */
478		arr[num++] = 0x0;	/* reserved */
479		arr[num++] = 0x4;	/* length */
480		arr[num++] = 0x0;	/* reserved */
481		arr[num++] = 0x0;	/* reserved */
482		arr[num++] = 0x0;
483		arr[num++] = 0x1;	/* relative port A */
484	}
485	/* NAA-5, Target port identifier */
486	arr[num++] = 0x61;	/* proto=sas, binary */
487	arr[num++] = 0x93;	/* piv=1, target port, naa */
488	arr[num++] = 0x0;
489	arr[num++] = 0x8;
490	arr[num++] = 0x52;	/* naa-5, company id=0x222222 (fake) */
491	arr[num++] = 0x22;
492	arr[num++] = 0x22;
493	arr[num++] = 0x20;
494	arr[num++] = (port_a >> 24);
495	arr[num++] = (port_a >> 16) & 0xff;
496	arr[num++] = (port_a >> 8) & 0xff;
497	arr[num++] = port_a & 0xff;
498	/* NAA-5, Target port group identifier */
499	arr[num++] = 0x61;	/* proto=sas, binary */
500	arr[num++] = 0x95;	/* piv=1, target port group id */
501	arr[num++] = 0x0;
502	arr[num++] = 0x4;
503	arr[num++] = 0;
504	arr[num++] = 0;
505	arr[num++] = (port_group_id >> 8) & 0xff;
506	arr[num++] = port_group_id & 0xff;
507	/* NAA-5, Target device identifier */
508	arr[num++] = 0x61;	/* proto=sas, binary */
509	arr[num++] = 0xa3;	/* piv=1, target device, naa */
510	arr[num++] = 0x0;
511	arr[num++] = 0x8;
512	arr[num++] = 0x52;	/* naa-5, company id=0x222222 (fake) */
513	arr[num++] = 0x22;
514	arr[num++] = 0x22;
515	arr[num++] = 0x20;
516	arr[num++] = (target_dev_id >> 24);
517	arr[num++] = (target_dev_id >> 16) & 0xff;
518	arr[num++] = (target_dev_id >> 8) & 0xff;
519	arr[num++] = target_dev_id & 0xff;
520	/* SCSI name string: Target device identifier */
521	arr[num++] = 0x63;	/* proto=sas, UTF-8 */
522	arr[num++] = 0xa8;	/* piv=1, target device, SCSI name string */
523	arr[num++] = 0x0;
524	arr[num++] = 24;
525	memcpy(arr + num, "naa.52222220", 12);
526	num += 12;
527	snprintf(b, sizeof(b), "%08X", target_dev_id);
528	memcpy(arr + num, b, 8);
529	num += 8;
530	memset(arr + num, 0, 4);
531	num += 4;
532	return num;
533}
534
535
536static unsigned char vpd84_data[] = {
537/* from 4th byte */ 0x22,0x22,0x22,0x0,0xbb,0x0,
538    0x22,0x22,0x22,0x0,0xbb,0x1,
539    0x22,0x22,0x22,0x0,0xbb,0x2,
540};
541
542static int inquiry_evpd_84(unsigned char * arr)
543{
544	memcpy(arr, vpd84_data, sizeof(vpd84_data));
545	return sizeof(vpd84_data);
546}
547
548static int inquiry_evpd_85(unsigned char * arr)
549{
550	int num = 0;
551	const char * na1 = "https://www.kernel.org/config";
552	const char * na2 = "http://www.kernel.org/log";
553	int plen, olen;
554
555	arr[num++] = 0x1;	/* lu, storage config */
556	arr[num++] = 0x0;	/* reserved */
557	arr[num++] = 0x0;
558	olen = strlen(na1);
559	plen = olen + 1;
560	if (plen % 4)
561		plen = ((plen / 4) + 1) * 4;
562	arr[num++] = plen;	/* length, null termianted, padded */
563	memcpy(arr + num, na1, olen);
564	memset(arr + num + olen, 0, plen - olen);
565	num += plen;
566
567	arr[num++] = 0x4;	/* lu, logging */
568	arr[num++] = 0x0;	/* reserved */
569	arr[num++] = 0x0;
570	olen = strlen(na2);
571	plen = olen + 1;
572	if (plen % 4)
573		plen = ((plen / 4) + 1) * 4;
574	arr[num++] = plen;	/* length, null terminated, padded */
575	memcpy(arr + num, na2, olen);
576	memset(arr + num + olen, 0, plen - olen);
577	num += plen;
578
579	return num;
580}
581
582/* SCSI ports VPD page */
583static int inquiry_evpd_88(unsigned char * arr, int target_dev_id)
584{
585	int num = 0;
586	int port_a, port_b;
587
588	port_a = target_dev_id + 1;
589	port_b = port_a + 1;
590	arr[num++] = 0x0;	/* reserved */
591	arr[num++] = 0x0;	/* reserved */
592	arr[num++] = 0x0;
593	arr[num++] = 0x1;	/* relative port 1 (primary) */
594	memset(arr + num, 0, 6);
595	num += 6;
596	arr[num++] = 0x0;
597	arr[num++] = 12;	/* length tp descriptor */
598	/* naa-5 target port identifier (A) */
599	arr[num++] = 0x61;	/* proto=sas, binary */
600	arr[num++] = 0x93;	/* PIV=1, target port, NAA */
601	arr[num++] = 0x0;	/* reserved */
602	arr[num++] = 0x8;	/* length */
603	arr[num++] = 0x52;	/* NAA-5, company_id=0x222222 (fake) */
604	arr[num++] = 0x22;
605	arr[num++] = 0x22;
606	arr[num++] = 0x20;
607	arr[num++] = (port_a >> 24);
608	arr[num++] = (port_a >> 16) & 0xff;
609	arr[num++] = (port_a >> 8) & 0xff;
610	arr[num++] = port_a & 0xff;
611
612	arr[num++] = 0x0;	/* reserved */
613	arr[num++] = 0x0;	/* reserved */
614	arr[num++] = 0x0;
615	arr[num++] = 0x2;	/* relative port 2 (secondary) */
616	memset(arr + num, 0, 6);
617	num += 6;
618	arr[num++] = 0x0;
619	arr[num++] = 12;	/* length tp descriptor */
620	/* naa-5 target port identifier (B) */
621	arr[num++] = 0x61;	/* proto=sas, binary */
622	arr[num++] = 0x93;	/* PIV=1, target port, NAA */
623	arr[num++] = 0x0;	/* reserved */
624	arr[num++] = 0x8;	/* length */
625	arr[num++] = 0x52;	/* NAA-5, company_id=0x222222 (fake) */
626	arr[num++] = 0x22;
627	arr[num++] = 0x22;
628	arr[num++] = 0x20;
629	arr[num++] = (port_b >> 24);
630	arr[num++] = (port_b >> 16) & 0xff;
631	arr[num++] = (port_b >> 8) & 0xff;
632	arr[num++] = port_b & 0xff;
633
634	return num;
635}
636
637
638static unsigned char vpd89_data[] = {
639/* from 4th byte */ 0,0,0,0,
640'l','i','n','u','x',' ',' ',' ',
641'S','A','T',' ','s','c','s','i','_','d','e','b','u','g',' ',' ',
642'1','2','3','4',
6430x34,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
6440xec,0,0,0,
6450x5a,0xc,0xff,0x3f,0x37,0xc8,0x10,0,0,0,0,0,0x3f,0,0,0,
6460,0,0,0,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x20,0x20,0x20,0x20,
6470x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0,0,0,0x40,0x4,0,0x2e,0x33,
6480x38,0x31,0x20,0x20,0x20,0x20,0x54,0x53,0x38,0x33,0x30,0x30,0x33,0x31,
6490x53,0x41,
6500x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
6510x20,0x20,
6520x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
6530x10,0x80,
6540,0,0,0x2f,0,0,0,0x2,0,0x2,0x7,0,0xff,0xff,0x1,0,
6550x3f,0,0xc1,0xff,0x3e,0,0x10,0x1,0xb0,0xf8,0x50,0x9,0,0,0x7,0,
6560x3,0,0x78,0,0x78,0,0xf0,0,0x78,0,0,0,0,0,0,0,
6570,0,0,0,0,0,0,0,0x2,0,0,0,0,0,0,0,
6580x7e,0,0x1b,0,0x6b,0x34,0x1,0x7d,0x3,0x40,0x69,0x34,0x1,0x3c,0x3,0x40,
6590x7f,0x40,0,0,0,0,0xfe,0xfe,0,0,0,0,0,0xfe,0,0,
6600,0,0,0,0,0,0,0,0xb0,0xf8,0x50,0x9,0,0,0,0,
6610,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
6620,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
6630,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
6640x1,0,0xb0,0xf8,0x50,0x9,0xb0,0xf8,0x50,0x9,0x20,0x20,0x2,0,0xb6,0x42,
6650,0x80,0x8a,0,0x6,0x3c,0xa,0x3c,0xff,0xff,0xc6,0x7,0,0x1,0,0x8,
6660xf0,0xf,0,0x10,0x2,0,0x30,0,0,0,0,0,0,0,0x6,0xfe,
6670,0,0x2,0,0x50,0,0x8a,0,0x4f,0x95,0,0,0x21,0,0xb,0,
6680,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
6690,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
6700,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
6710,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
6720,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
6730,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
6740,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
6750,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
6760,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
6770,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
6780,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
6790,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa5,0x51,
680};
681
682static int inquiry_evpd_89(unsigned char * arr)
683{
684	memcpy(arr, vpd89_data, sizeof(vpd89_data));
685	return sizeof(vpd89_data);
686}
687
688
689/* Block limits VPD page (SBC-3) */
690static unsigned char vpdb0_data[] = {
691	/* from 4th byte */ 0,0,0,4, 0,0,0x4,0, 0,0,0,64,
692	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
693	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
694	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
695};
696
697static int inquiry_evpd_b0(unsigned char * arr)
698{
699	unsigned int gran;
700
701	memcpy(arr, vpdb0_data, sizeof(vpdb0_data));
702	gran = 1 << scsi_debug_physblk_exp;
703	arr[2] = (gran >> 8) & 0xff;
704	arr[3] = gran & 0xff;
705	if (sdebug_store_sectors > 0x400) {
706		arr[4] = (sdebug_store_sectors >> 24) & 0xff;
707		arr[5] = (sdebug_store_sectors >> 16) & 0xff;
708		arr[6] = (sdebug_store_sectors >> 8) & 0xff;
709		arr[7] = sdebug_store_sectors & 0xff;
710	}
711
712	if (scsi_debug_unmap_max_desc) {
713		unsigned int blocks;
714
715		if (scsi_debug_unmap_max_blocks)
716			blocks = scsi_debug_unmap_max_blocks;
717		else
718			blocks = 0xffffffff;
719
720		put_unaligned_be32(blocks, &arr[16]);
721		put_unaligned_be32(scsi_debug_unmap_max_desc, &arr[20]);
722	}
723
724	if (scsi_debug_unmap_alignment) {
725		put_unaligned_be32(scsi_debug_unmap_alignment, &arr[28]);
726		arr[28] |= 0x80; /* UGAVALID */
727	}
728
729	if (scsi_debug_unmap_granularity) {
730		put_unaligned_be32(scsi_debug_unmap_granularity, &arr[24]);
731		return 0x3c; /* Mandatory page length for thin provisioning */
732	}
733
734	return sizeof(vpdb0_data);
735}
736
737/* Block device characteristics VPD page (SBC-3) */
738static int inquiry_evpd_b1(unsigned char *arr)
739{
740	memset(arr, 0, 0x3c);
741	arr[0] = 0;
742	arr[1] = 1;	/* non rotating medium (e.g. solid state) */
743	arr[2] = 0;
744	arr[3] = 5;	/* less than 1.8" */
745
746	return 0x3c;
747}
748
749#define SDEBUG_LONG_INQ_SZ 96
750#define SDEBUG_MAX_INQ_ARR_SZ 584
751
752static int resp_inquiry(struct scsi_cmnd * scp, int target,
753			struct sdebug_dev_info * devip)
754{
755	unsigned char pq_pdt;
756	unsigned char * arr;
757	unsigned char *cmd = (unsigned char *)scp->cmnd;
758	int alloc_len, n, ret;
759
760	alloc_len = (cmd[3] << 8) + cmd[4];
761	arr = kzalloc(SDEBUG_MAX_INQ_ARR_SZ, GFP_ATOMIC);
762	if (! arr)
763		return DID_REQUEUE << 16;
764	if (devip->wlun)
765		pq_pdt = 0x1e;	/* present, wlun */
766	else if (scsi_debug_no_lun_0 && (0 == devip->lun))
767		pq_pdt = 0x7f;	/* not present, no device type */
768	else
769		pq_pdt = (scsi_debug_ptype & 0x1f);
770	arr[0] = pq_pdt;
771	if (0x2 & cmd[1]) {  /* CMDDT bit set */
772		mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
773			       	0);
774		kfree(arr);
775		return check_condition_result;
776	} else if (0x1 & cmd[1]) {  /* EVPD bit set */
777		int lu_id_num, port_group_id, target_dev_id, len;
778		char lu_id_str[6];
779		int host_no = devip->sdbg_host->shost->host_no;
780
781		port_group_id = (((host_no + 1) & 0x7f) << 8) +
782		    (devip->channel & 0x7f);
783		if (0 == scsi_debug_vpd_use_hostno)
784			host_no = 0;
785		lu_id_num = devip->wlun ? -1 : (((host_no + 1) * 2000) +
786			    (devip->target * 1000) + devip->lun);
787		target_dev_id = ((host_no + 1) * 2000) +
788				 (devip->target * 1000) - 3;
789		len = scnprintf(lu_id_str, 6, "%d", lu_id_num);
790		if (0 == cmd[2]) { /* supported vital product data pages */
791			arr[1] = cmd[2];	/*sanity */
792			n = 4;
793			arr[n++] = 0x0;   /* this page */
794			arr[n++] = 0x80;  /* unit serial number */
795			arr[n++] = 0x83;  /* device identification */
796			arr[n++] = 0x84;  /* software interface ident. */
797			arr[n++] = 0x85;  /* management network addresses */
798			arr[n++] = 0x86;  /* extended inquiry */
799			arr[n++] = 0x87;  /* mode page policy */
800			arr[n++] = 0x88;  /* SCSI ports */
801			arr[n++] = 0x89;  /* ATA information */
802			arr[n++] = 0xb0;  /* Block limits (SBC) */
803			arr[n++] = 0xb1;  /* Block characteristics (SBC) */
804			arr[3] = n - 4;	  /* number of supported VPD pages */
805		} else if (0x80 == cmd[2]) { /* unit serial number */
806			arr[1] = cmd[2];	/*sanity */
807			arr[3] = len;
808			memcpy(&arr[4], lu_id_str, len);
809		} else if (0x83 == cmd[2]) { /* device identification */
810			arr[1] = cmd[2];	/*sanity */
811			arr[3] = inquiry_evpd_83(&arr[4], port_group_id,
812						 target_dev_id, lu_id_num,
813						 lu_id_str, len);
814		} else if (0x84 == cmd[2]) { /* Software interface ident. */
815			arr[1] = cmd[2];	/*sanity */
816			arr[3] = inquiry_evpd_84(&arr[4]);
817		} else if (0x85 == cmd[2]) { /* Management network addresses */
818			arr[1] = cmd[2];	/*sanity */
819			arr[3] = inquiry_evpd_85(&arr[4]);
820		} else if (0x86 == cmd[2]) { /* extended inquiry */
821			arr[1] = cmd[2];	/*sanity */
822			arr[3] = 0x3c;	/* number of following entries */
823			if (scsi_debug_dif == SD_DIF_TYPE3_PROTECTION)
824				arr[4] = 0x4;	/* SPT: GRD_CHK:1 */
825			else if (scsi_debug_dif)
826				arr[4] = 0x5;   /* SPT: GRD_CHK:1, REF_CHK:1 */
827			else
828				arr[4] = 0x0;   /* no protection stuff */
829			arr[5] = 0x7;   /* head of q, ordered + simple q's */
830		} else if (0x87 == cmd[2]) { /* mode page policy */
831			arr[1] = cmd[2];	/*sanity */
832			arr[3] = 0x8;	/* number of following entries */
833			arr[4] = 0x2;	/* disconnect-reconnect mp */
834			arr[6] = 0x80;	/* mlus, shared */
835			arr[8] = 0x18;	 /* protocol specific lu */
836			arr[10] = 0x82;	 /* mlus, per initiator port */
837		} else if (0x88 == cmd[2]) { /* SCSI Ports */
838			arr[1] = cmd[2];	/*sanity */
839			arr[3] = inquiry_evpd_88(&arr[4], target_dev_id);
840		} else if (0x89 == cmd[2]) { /* ATA information */
841			arr[1] = cmd[2];        /*sanity */
842			n = inquiry_evpd_89(&arr[4]);
843			arr[2] = (n >> 8);
844			arr[3] = (n & 0xff);
845		} else if (0xb0 == cmd[2]) { /* Block limits (SBC) */
846			arr[1] = cmd[2];        /*sanity */
847			arr[3] = inquiry_evpd_b0(&arr[4]);
848		} else if (0xb1 == cmd[2]) { /* Block characteristics (SBC) */
849			arr[1] = cmd[2];        /*sanity */
850			arr[3] = inquiry_evpd_b1(&arr[4]);
851		} else {
852			/* Illegal request, invalid field in cdb */
853			mk_sense_buffer(devip, ILLEGAL_REQUEST,
854					INVALID_FIELD_IN_CDB, 0);
855			kfree(arr);
856			return check_condition_result;
857		}
858		len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len);
859		ret = fill_from_dev_buffer(scp, arr,
860			    min(len, SDEBUG_MAX_INQ_ARR_SZ));
861		kfree(arr);
862		return ret;
863	}
864	/* drops through here for a standard inquiry */
865	arr[1] = DEV_REMOVEABLE(target) ? 0x80 : 0;	/* Removable disk */
866	arr[2] = scsi_debug_scsi_level;
867	arr[3] = 2;    /* response_data_format==2 */
868	arr[4] = SDEBUG_LONG_INQ_SZ - 5;
869	arr[5] = scsi_debug_dif ? 1 : 0; /* PROTECT bit */
870	if (0 == scsi_debug_vpd_use_hostno)
871		arr[5] = 0x10; /* claim: implicit TGPS */
872	arr[6] = 0x10; /* claim: MultiP */
873	/* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */
874	arr[7] = 0xa; /* claim: LINKED + CMDQUE */
875	memcpy(&arr[8], inq_vendor_id, 8);
876	memcpy(&arr[16], inq_product_id, 16);
877	memcpy(&arr[32], inq_product_rev, 4);
878	/* version descriptors (2 bytes each) follow */
879	arr[58] = 0x0; arr[59] = 0x77; /* SAM-3 ANSI */
880	arr[60] = 0x3; arr[61] = 0x14;  /* SPC-3 ANSI */
881	n = 62;
882	if (scsi_debug_ptype == 0) {
883		arr[n++] = 0x3; arr[n++] = 0x3d; /* SBC-2 ANSI */
884	} else if (scsi_debug_ptype == 1) {
885		arr[n++] = 0x3; arr[n++] = 0x60; /* SSC-2 no version */
886	}
887	arr[n++] = 0xc; arr[n++] = 0xf;  /* SAS-1.1 rev 10 */
888	ret = fill_from_dev_buffer(scp, arr,
889			    min(alloc_len, SDEBUG_LONG_INQ_SZ));
890	kfree(arr);
891	return ret;
892}
893
894static int resp_requests(struct scsi_cmnd * scp,
895			 struct sdebug_dev_info * devip)
896{
897	unsigned char * sbuff;
898	unsigned char *cmd = (unsigned char *)scp->cmnd;
899	unsigned char arr[SDEBUG_SENSE_LEN];
900	int want_dsense;
901	int len = 18;
902
903	memset(arr, 0, sizeof(arr));
904	if (devip->reset == 1)
905		mk_sense_buffer(devip, 0, NO_ADDITIONAL_SENSE, 0);
906	want_dsense = !!(cmd[1] & 1) || scsi_debug_dsense;
907	sbuff = devip->sense_buff;
908	if ((iec_m_pg[2] & 0x4) && (6 == (iec_m_pg[3] & 0xf))) {
909		if (want_dsense) {
910			arr[0] = 0x72;
911			arr[1] = 0x0;		/* NO_SENSE in sense_key */
912			arr[2] = THRESHOLD_EXCEEDED;
913			arr[3] = 0xff;		/* TEST set and MRIE==6 */
914		} else {
915			arr[0] = 0x70;
916			arr[2] = 0x0;		/* NO_SENSE in sense_key */
917			arr[7] = 0xa;   	/* 18 byte sense buffer */
918			arr[12] = THRESHOLD_EXCEEDED;
919			arr[13] = 0xff;		/* TEST set and MRIE==6 */
920		}
921	} else {
922		memcpy(arr, sbuff, SDEBUG_SENSE_LEN);
923		if ((cmd[1] & 1) && (! scsi_debug_dsense)) {
924			/* DESC bit set and sense_buff in fixed format */
925			memset(arr, 0, sizeof(arr));
926			arr[0] = 0x72;
927			arr[1] = sbuff[2];     /* sense key */
928			arr[2] = sbuff[12];    /* asc */
929			arr[3] = sbuff[13];    /* ascq */
930			len = 8;
931		}
932	}
933	mk_sense_buffer(devip, 0, NO_ADDITIONAL_SENSE, 0);
934	return fill_from_dev_buffer(scp, arr, len);
935}
936
937static int resp_start_stop(struct scsi_cmnd * scp,
938			   struct sdebug_dev_info * devip)
939{
940	unsigned char *cmd = (unsigned char *)scp->cmnd;
941	int power_cond, errsts, start;
942
943	if ((errsts = check_readiness(scp, 1, devip)))
944		return errsts;
945	power_cond = (cmd[4] & 0xf0) >> 4;
946	if (power_cond) {
947		mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
948			       	0);
949		return check_condition_result;
950	}
951	start = cmd[4] & 1;
952	if (start == devip->stopped)
953		devip->stopped = !start;
954	return 0;
955}
956
957static sector_t get_sdebug_capacity(void)
958{
959	if (scsi_debug_virtual_gb > 0)
960		return (sector_t)scsi_debug_virtual_gb *
961			(1073741824 / scsi_debug_sector_size);
962	else
963		return sdebug_store_sectors;
964}
965
966#define SDEBUG_READCAP_ARR_SZ 8
967static int resp_readcap(struct scsi_cmnd * scp,
968			struct sdebug_dev_info * devip)
969{
970	unsigned char arr[SDEBUG_READCAP_ARR_SZ];
971	unsigned int capac;
972	int errsts;
973
974	if ((errsts = check_readiness(scp, 1, devip)))
975		return errsts;
976	/* following just in case virtual_gb changed */
977	sdebug_capacity = get_sdebug_capacity();
978	memset(arr, 0, SDEBUG_READCAP_ARR_SZ);
979	if (sdebug_capacity < 0xffffffff) {
980		capac = (unsigned int)sdebug_capacity - 1;
981		arr[0] = (capac >> 24);
982		arr[1] = (capac >> 16) & 0xff;
983		arr[2] = (capac >> 8) & 0xff;
984		arr[3] = capac & 0xff;
985	} else {
986		arr[0] = 0xff;
987		arr[1] = 0xff;
988		arr[2] = 0xff;
989		arr[3] = 0xff;
990	}
991	arr[6] = (scsi_debug_sector_size >> 8) & 0xff;
992	arr[7] = scsi_debug_sector_size & 0xff;
993	return fill_from_dev_buffer(scp, arr, SDEBUG_READCAP_ARR_SZ);
994}
995
996#define SDEBUG_READCAP16_ARR_SZ 32
997static int resp_readcap16(struct scsi_cmnd * scp,
998			  struct sdebug_dev_info * devip)
999{
1000	unsigned char *cmd = (unsigned char *)scp->cmnd;
1001	unsigned char arr[SDEBUG_READCAP16_ARR_SZ];
1002	unsigned long long capac;
1003	int errsts, k, alloc_len;
1004
1005	if ((errsts = check_readiness(scp, 1, devip)))
1006		return errsts;
1007	alloc_len = ((cmd[10] << 24) + (cmd[11] << 16) + (cmd[12] << 8)
1008		     + cmd[13]);
1009	/* following just in case virtual_gb changed */
1010	sdebug_capacity = get_sdebug_capacity();
1011	memset(arr, 0, SDEBUG_READCAP16_ARR_SZ);
1012	capac = sdebug_capacity - 1;
1013	for (k = 0; k < 8; ++k, capac >>= 8)
1014		arr[7 - k] = capac & 0xff;
1015	arr[8] = (scsi_debug_sector_size >> 24) & 0xff;
1016	arr[9] = (scsi_debug_sector_size >> 16) & 0xff;
1017	arr[10] = (scsi_debug_sector_size >> 8) & 0xff;
1018	arr[11] = scsi_debug_sector_size & 0xff;
1019	arr[13] = scsi_debug_physblk_exp & 0xf;
1020	arr[14] = (scsi_debug_lowest_aligned >> 8) & 0x3f;
1021
1022	if (scsi_debug_unmap_granularity)
1023		arr[14] |= 0x80; /* TPE */
1024
1025	arr[15] = scsi_debug_lowest_aligned & 0xff;
1026
1027	if (scsi_debug_dif) {
1028		arr[12] = (scsi_debug_dif - 1) << 1; /* P_TYPE */
1029		arr[12] |= 1; /* PROT_EN */
1030	}
1031
1032	return fill_from_dev_buffer(scp, arr,
1033				    min(alloc_len, SDEBUG_READCAP16_ARR_SZ));
1034}
1035
1036#define SDEBUG_MAX_TGTPGS_ARR_SZ 1412
1037
1038static int resp_report_tgtpgs(struct scsi_cmnd * scp,
1039			      struct sdebug_dev_info * devip)
1040{
1041	unsigned char *cmd = (unsigned char *)scp->cmnd;
1042	unsigned char * arr;
1043	int host_no = devip->sdbg_host->shost->host_no;
1044	int n, ret, alen, rlen;
1045	int port_group_a, port_group_b, port_a, port_b;
1046
1047	alen = ((cmd[6] << 24) + (cmd[7] << 16) + (cmd[8] << 8)
1048		+ cmd[9]);
1049
1050	arr = kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ, GFP_ATOMIC);
1051	if (! arr)
1052		return DID_REQUEUE << 16;
1053	/*
1054	 * EVPD page 0x88 states we have two ports, one
1055	 * real and a fake port with no device connected.
1056	 * So we create two port groups with one port each
1057	 * and set the group with port B to unavailable.
1058	 */
1059	port_a = 0x1; /* relative port A */
1060	port_b = 0x2; /* relative port B */
1061	port_group_a = (((host_no + 1) & 0x7f) << 8) +
1062	    (devip->channel & 0x7f);
1063	port_group_b = (((host_no + 1) & 0x7f) << 8) +
1064	    (devip->channel & 0x7f) + 0x80;
1065
1066	/*
1067	 * The asymmetric access state is cycled according to the host_id.
1068	 */
1069	n = 4;
1070	if (0 == scsi_debug_vpd_use_hostno) {
1071	    arr[n++] = host_no % 3; /* Asymm access state */
1072	    arr[n++] = 0x0F; /* claim: all states are supported */
1073	} else {
1074	    arr[n++] = 0x0; /* Active/Optimized path */
1075	    arr[n++] = 0x01; /* claim: only support active/optimized paths */
1076	}
1077	arr[n++] = (port_group_a >> 8) & 0xff;
1078	arr[n++] = port_group_a & 0xff;
1079	arr[n++] = 0;    /* Reserved */
1080	arr[n++] = 0;    /* Status code */
1081	arr[n++] = 0;    /* Vendor unique */
1082	arr[n++] = 0x1;  /* One port per group */
1083	arr[n++] = 0;    /* Reserved */
1084	arr[n++] = 0;    /* Reserved */
1085	arr[n++] = (port_a >> 8) & 0xff;
1086	arr[n++] = port_a & 0xff;
1087	arr[n++] = 3;    /* Port unavailable */
1088	arr[n++] = 0x08; /* claim: only unavailalbe paths are supported */
1089	arr[n++] = (port_group_b >> 8) & 0xff;
1090	arr[n++] = port_group_b & 0xff;
1091	arr[n++] = 0;    /* Reserved */
1092	arr[n++] = 0;    /* Status code */
1093	arr[n++] = 0;    /* Vendor unique */
1094	arr[n++] = 0x1;  /* One port per group */
1095	arr[n++] = 0;    /* Reserved */
1096	arr[n++] = 0;    /* Reserved */
1097	arr[n++] = (port_b >> 8) & 0xff;
1098	arr[n++] = port_b & 0xff;
1099
1100	rlen = n - 4;
1101	arr[0] = (rlen >> 24) & 0xff;
1102	arr[1] = (rlen >> 16) & 0xff;
1103	arr[2] = (rlen >> 8) & 0xff;
1104	arr[3] = rlen & 0xff;
1105
1106	/*
1107	 * Return the smallest value of either
1108	 * - The allocated length
1109	 * - The constructed command length
1110	 * - The maximum array size
1111	 */
1112	rlen = min(alen,n);
1113	ret = fill_from_dev_buffer(scp, arr,
1114				   min(rlen, SDEBUG_MAX_TGTPGS_ARR_SZ));
1115	kfree(arr);
1116	return ret;
1117}
1118
1119/* <<Following mode page info copied from ST318451LW>> */
1120
1121static int resp_err_recov_pg(unsigned char * p, int pcontrol, int target)
1122{	/* Read-Write Error Recovery page for mode_sense */
1123	unsigned char err_recov_pg[] = {0x1, 0xa, 0xc0, 11, 240, 0, 0, 0,
1124					5, 0, 0xff, 0xff};
1125
1126	memcpy(p, err_recov_pg, sizeof(err_recov_pg));
1127	if (1 == pcontrol)
1128		memset(p + 2, 0, sizeof(err_recov_pg) - 2);
1129	return sizeof(err_recov_pg);
1130}
1131
1132static int resp_disconnect_pg(unsigned char * p, int pcontrol, int target)
1133{ 	/* Disconnect-Reconnect page for mode_sense */
1134	unsigned char disconnect_pg[] = {0x2, 0xe, 128, 128, 0, 10, 0, 0,
1135					 0, 0, 0, 0, 0, 0, 0, 0};
1136
1137	memcpy(p, disconnect_pg, sizeof(disconnect_pg));
1138	if (1 == pcontrol)
1139		memset(p + 2, 0, sizeof(disconnect_pg) - 2);
1140	return sizeof(disconnect_pg);
1141}
1142
1143static int resp_format_pg(unsigned char * p, int pcontrol, int target)
1144{       /* Format device page for mode_sense */
1145	unsigned char format_pg[] = {0x3, 0x16, 0, 0, 0, 0, 0, 0,
1146				     0, 0, 0, 0, 0, 0, 0, 0,
1147				     0, 0, 0, 0, 0x40, 0, 0, 0};
1148
1149	memcpy(p, format_pg, sizeof(format_pg));
1150	p[10] = (sdebug_sectors_per >> 8) & 0xff;
1151	p[11] = sdebug_sectors_per & 0xff;
1152	p[12] = (scsi_debug_sector_size >> 8) & 0xff;
1153	p[13] = scsi_debug_sector_size & 0xff;
1154	if (DEV_REMOVEABLE(target))
1155		p[20] |= 0x20; /* should agree with INQUIRY */
1156	if (1 == pcontrol)
1157		memset(p + 2, 0, sizeof(format_pg) - 2);
1158	return sizeof(format_pg);
1159}
1160
1161static int resp_caching_pg(unsigned char * p, int pcontrol, int target)
1162{ 	/* Caching page for mode_sense */
1163	unsigned char caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
1164		0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0,     0, 0, 0, 0};
1165
1166	memcpy(p, caching_pg, sizeof(caching_pg));
1167	if (1 == pcontrol)
1168		memset(p + 2, 0, sizeof(caching_pg) - 2);
1169	return sizeof(caching_pg);
1170}
1171
1172static int resp_ctrl_m_pg(unsigned char * p, int pcontrol, int target)
1173{ 	/* Control mode page for mode_sense */
1174	unsigned char ch_ctrl_m_pg[] = {/* 0xa, 10, */ 0x6, 0, 0, 0, 0, 0,
1175				        0, 0, 0, 0};
1176	unsigned char d_ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
1177				     0, 0, 0x2, 0x4b};
1178
1179	if (scsi_debug_dsense)
1180		ctrl_m_pg[2] |= 0x4;
1181	else
1182		ctrl_m_pg[2] &= ~0x4;
1183
1184	if (scsi_debug_ato)
1185		ctrl_m_pg[5] |= 0x80; /* ATO=1 */
1186
1187	memcpy(p, ctrl_m_pg, sizeof(ctrl_m_pg));
1188	if (1 == pcontrol)
1189		memcpy(p + 2, ch_ctrl_m_pg, sizeof(ch_ctrl_m_pg));
1190	else if (2 == pcontrol)
1191		memcpy(p, d_ctrl_m_pg, sizeof(d_ctrl_m_pg));
1192	return sizeof(ctrl_m_pg);
1193}
1194
1195
1196static int resp_iec_m_pg(unsigned char * p, int pcontrol, int target)
1197{	/* Informational Exceptions control mode page for mode_sense */
1198	unsigned char ch_iec_m_pg[] = {/* 0x1c, 0xa, */ 0x4, 0xf, 0, 0, 0, 0,
1199				       0, 0, 0x0, 0x0};
1200	unsigned char d_iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
1201				      0, 0, 0x0, 0x0};
1202
1203	memcpy(p, iec_m_pg, sizeof(iec_m_pg));
1204	if (1 == pcontrol)
1205		memcpy(p + 2, ch_iec_m_pg, sizeof(ch_iec_m_pg));
1206	else if (2 == pcontrol)
1207		memcpy(p, d_iec_m_pg, sizeof(d_iec_m_pg));
1208	return sizeof(iec_m_pg);
1209}
1210
1211static int resp_sas_sf_m_pg(unsigned char * p, int pcontrol, int target)
1212{	/* SAS SSP mode page - short format for mode_sense */
1213	unsigned char sas_sf_m_pg[] = {0x19, 0x6,
1214		0x6, 0x0, 0x7, 0xd0, 0x0, 0x0};
1215
1216	memcpy(p, sas_sf_m_pg, sizeof(sas_sf_m_pg));
1217	if (1 == pcontrol)
1218		memset(p + 2, 0, sizeof(sas_sf_m_pg) - 2);
1219	return sizeof(sas_sf_m_pg);
1220}
1221
1222
1223static int resp_sas_pcd_m_spg(unsigned char * p, int pcontrol, int target,
1224			      int target_dev_id)
1225{	/* SAS phy control and discover mode page for mode_sense */
1226	unsigned char sas_pcd_m_pg[] = {0x59, 0x1, 0, 0x64, 0, 0x6, 0, 2,
1227		    0, 0, 0, 0, 0x10, 0x9, 0x8, 0x0,
1228		    0x52, 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0,
1229		    0x51, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x1,
1230		    0x2, 0, 0, 0, 0, 0, 0, 0,
1231		    0x88, 0x99, 0, 0, 0, 0, 0, 0,
1232		    0, 0, 0, 0, 0, 0, 0, 0,
1233		    0, 1, 0, 0, 0x10, 0x9, 0x8, 0x0,
1234		    0x52, 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0,
1235		    0x51, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x1,
1236		    0x3, 0, 0, 0, 0, 0, 0, 0,
1237		    0x88, 0x99, 0, 0, 0, 0, 0, 0,
1238		    0, 0, 0, 0, 0, 0, 0, 0,
1239		};
1240	int port_a, port_b;
1241
1242	port_a = target_dev_id + 1;
1243	port_b = port_a + 1;
1244	memcpy(p, sas_pcd_m_pg, sizeof(sas_pcd_m_pg));
1245	p[20] = (port_a >> 24);
1246	p[21] = (port_a >> 16) & 0xff;
1247	p[22] = (port_a >> 8) & 0xff;
1248	p[23] = port_a & 0xff;
1249	p[48 + 20] = (port_b >> 24);
1250	p[48 + 21] = (port_b >> 16) & 0xff;
1251	p[48 + 22] = (port_b >> 8) & 0xff;
1252	p[48 + 23] = port_b & 0xff;
1253	if (1 == pcontrol)
1254		memset(p + 4, 0, sizeof(sas_pcd_m_pg) - 4);
1255	return sizeof(sas_pcd_m_pg);
1256}
1257
1258static int resp_sas_sha_m_spg(unsigned char * p, int pcontrol)
1259{	/* SAS SSP shared protocol specific port mode subpage */
1260	unsigned char sas_sha_m_pg[] = {0x59, 0x2, 0, 0xc, 0, 0x6, 0x10, 0,
1261		    0, 0, 0, 0, 0, 0, 0, 0,
1262		};
1263
1264	memcpy(p, sas_sha_m_pg, sizeof(sas_sha_m_pg));
1265	if (1 == pcontrol)
1266		memset(p + 4, 0, sizeof(sas_sha_m_pg) - 4);
1267	return sizeof(sas_sha_m_pg);
1268}
1269
1270#define SDEBUG_MAX_MSENSE_SZ 256
1271
1272static int resp_mode_sense(struct scsi_cmnd * scp, int target,
1273			   struct sdebug_dev_info * devip)
1274{
1275	unsigned char dbd, llbaa;
1276	int pcontrol, pcode, subpcode, bd_len;
1277	unsigned char dev_spec;
1278	int k, alloc_len, msense_6, offset, len, errsts, target_dev_id;
1279	unsigned char * ap;
1280	unsigned char arr[SDEBUG_MAX_MSENSE_SZ];
1281	unsigned char *cmd = (unsigned char *)scp->cmnd;
1282
1283	if ((errsts = check_readiness(scp, 1, devip)))
1284		return errsts;
1285	dbd = !!(cmd[1] & 0x8);
1286	pcontrol = (cmd[2] & 0xc0) >> 6;
1287	pcode = cmd[2] & 0x3f;
1288	subpcode = cmd[3];
1289	msense_6 = (MODE_SENSE == cmd[0]);
1290	llbaa = msense_6 ? 0 : !!(cmd[1] & 0x10);
1291	if ((0 == scsi_debug_ptype) && (0 == dbd))
1292		bd_len = llbaa ? 16 : 8;
1293	else
1294		bd_len = 0;
1295	alloc_len = msense_6 ? cmd[4] : ((cmd[7] << 8) | cmd[8]);
1296	memset(arr, 0, SDEBUG_MAX_MSENSE_SZ);
1297	if (0x3 == pcontrol) {  /* Saving values not supported */
1298		mk_sense_buffer(devip, ILLEGAL_REQUEST, SAVING_PARAMS_UNSUP,
1299			       	0);
1300		return check_condition_result;
1301	}
1302	target_dev_id = ((devip->sdbg_host->shost->host_no + 1) * 2000) +
1303			(devip->target * 1000) - 3;
1304	/* set DPOFUA bit for disks */
1305	if (0 == scsi_debug_ptype)
1306		dev_spec = (DEV_READONLY(target) ? 0x80 : 0x0) | 0x10;
1307	else
1308		dev_spec = 0x0;
1309	if (msense_6) {
1310		arr[2] = dev_spec;
1311		arr[3] = bd_len;
1312		offset = 4;
1313	} else {
1314		arr[3] = dev_spec;
1315		if (16 == bd_len)
1316			arr[4] = 0x1;	/* set LONGLBA bit */
1317		arr[7] = bd_len;	/* assume 255 or less */
1318		offset = 8;
1319	}
1320	ap = arr + offset;
1321	if ((bd_len > 0) && (!sdebug_capacity))
1322		sdebug_capacity = get_sdebug_capacity();
1323
1324	if (8 == bd_len) {
1325		if (sdebug_capacity > 0xfffffffe) {
1326			ap[0] = 0xff;
1327			ap[1] = 0xff;
1328			ap[2] = 0xff;
1329			ap[3] = 0xff;
1330		} else {
1331			ap[0] = (sdebug_capacity >> 24) & 0xff;
1332			ap[1] = (sdebug_capacity >> 16) & 0xff;
1333			ap[2] = (sdebug_capacity >> 8) & 0xff;
1334			ap[3] = sdebug_capacity & 0xff;
1335		}
1336		ap[6] = (scsi_debug_sector_size >> 8) & 0xff;
1337		ap[7] = scsi_debug_sector_size & 0xff;
1338		offset += bd_len;
1339		ap = arr + offset;
1340	} else if (16 == bd_len) {
1341		unsigned long long capac = sdebug_capacity;
1342
1343        	for (k = 0; k < 8; ++k, capac >>= 8)
1344                	ap[7 - k] = capac & 0xff;
1345		ap[12] = (scsi_debug_sector_size >> 24) & 0xff;
1346		ap[13] = (scsi_debug_sector_size >> 16) & 0xff;
1347		ap[14] = (scsi_debug_sector_size >> 8) & 0xff;
1348		ap[15] = scsi_debug_sector_size & 0xff;
1349		offset += bd_len;
1350		ap = arr + offset;
1351	}
1352
1353	if ((subpcode > 0x0) && (subpcode < 0xff) && (0x19 != pcode)) {
1354		/* TODO: Control Extension page */
1355		mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1356			       	0);
1357		return check_condition_result;
1358	}
1359	switch (pcode) {
1360	case 0x1:	/* Read-Write error recovery page, direct access */
1361		len = resp_err_recov_pg(ap, pcontrol, target);
1362		offset += len;
1363		break;
1364	case 0x2:	/* Disconnect-Reconnect page, all devices */
1365		len = resp_disconnect_pg(ap, pcontrol, target);
1366		offset += len;
1367		break;
1368        case 0x3:       /* Format device page, direct access */
1369                len = resp_format_pg(ap, pcontrol, target);
1370                offset += len;
1371                break;
1372	case 0x8:	/* Caching page, direct access */
1373		len = resp_caching_pg(ap, pcontrol, target);
1374		offset += len;
1375		break;
1376	case 0xa:	/* Control Mode page, all devices */
1377		len = resp_ctrl_m_pg(ap, pcontrol, target);
1378		offset += len;
1379		break;
1380	case 0x19:	/* if spc==1 then sas phy, control+discover */
1381		if ((subpcode > 0x2) && (subpcode < 0xff)) {
1382		        mk_sense_buffer(devip, ILLEGAL_REQUEST,
1383					INVALID_FIELD_IN_CDB, 0);
1384			return check_condition_result;
1385	        }
1386		len = 0;
1387		if ((0x0 == subpcode) || (0xff == subpcode))
1388			len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
1389		if ((0x1 == subpcode) || (0xff == subpcode))
1390			len += resp_sas_pcd_m_spg(ap + len, pcontrol, target,
1391						  target_dev_id);
1392		if ((0x2 == subpcode) || (0xff == subpcode))
1393			len += resp_sas_sha_m_spg(ap + len, pcontrol);
1394		offset += len;
1395		break;
1396	case 0x1c:	/* Informational Exceptions Mode page, all devices */
1397		len = resp_iec_m_pg(ap, pcontrol, target);
1398		offset += len;
1399		break;
1400	case 0x3f:	/* Read all Mode pages */
1401		if ((0 == subpcode) || (0xff == subpcode)) {
1402			len = resp_err_recov_pg(ap, pcontrol, target);
1403			len += resp_disconnect_pg(ap + len, pcontrol, target);
1404			len += resp_format_pg(ap + len, pcontrol, target);
1405			len += resp_caching_pg(ap + len, pcontrol, target);
1406			len += resp_ctrl_m_pg(ap + len, pcontrol, target);
1407			len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
1408			if (0xff == subpcode) {
1409				len += resp_sas_pcd_m_spg(ap + len, pcontrol,
1410						  target, target_dev_id);
1411				len += resp_sas_sha_m_spg(ap + len, pcontrol);
1412			}
1413			len += resp_iec_m_pg(ap + len, pcontrol, target);
1414		} else {
1415			mk_sense_buffer(devip, ILLEGAL_REQUEST,
1416					INVALID_FIELD_IN_CDB, 0);
1417			return check_condition_result;
1418                }
1419		offset += len;
1420		break;
1421	default:
1422		mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1423			       	0);
1424		return check_condition_result;
1425	}
1426	if (msense_6)
1427		arr[0] = offset - 1;
1428	else {
1429		arr[0] = ((offset - 2) >> 8) & 0xff;
1430		arr[1] = (offset - 2) & 0xff;
1431	}
1432	return fill_from_dev_buffer(scp, arr, min(alloc_len, offset));
1433}
1434
1435#define SDEBUG_MAX_MSELECT_SZ 512
1436
1437static int resp_mode_select(struct scsi_cmnd * scp, int mselect6,
1438			    struct sdebug_dev_info * devip)
1439{
1440	int pf, sp, ps, md_len, bd_len, off, spf, pg_len;
1441	int param_len, res, errsts, mpage;
1442	unsigned char arr[SDEBUG_MAX_MSELECT_SZ];
1443	unsigned char *cmd = (unsigned char *)scp->cmnd;
1444
1445	if ((errsts = check_readiness(scp, 1, devip)))
1446		return errsts;
1447	memset(arr, 0, sizeof(arr));
1448	pf = cmd[1] & 0x10;
1449	sp = cmd[1] & 0x1;
1450	param_len = mselect6 ? cmd[4] : ((cmd[7] << 8) + cmd[8]);
1451	if ((0 == pf) || sp || (param_len > SDEBUG_MAX_MSELECT_SZ)) {
1452		mk_sense_buffer(devip, ILLEGAL_REQUEST,
1453				INVALID_FIELD_IN_CDB, 0);
1454		return check_condition_result;
1455	}
1456        res = fetch_to_dev_buffer(scp, arr, param_len);
1457        if (-1 == res)
1458                return (DID_ERROR << 16);
1459        else if ((res < param_len) &&
1460                 (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
1461                printk(KERN_INFO "scsi_debug: mode_select: cdb indicated=%d, "
1462                       " IO sent=%d bytes\n", param_len, res);
1463	md_len = mselect6 ? (arr[0] + 1) : ((arr[0] << 8) + arr[1] + 2);
1464	bd_len = mselect6 ? arr[3] : ((arr[6] << 8) + arr[7]);
1465	if (md_len > 2) {
1466		mk_sense_buffer(devip, ILLEGAL_REQUEST,
1467				INVALID_FIELD_IN_PARAM_LIST, 0);
1468		return check_condition_result;
1469	}
1470	off = bd_len + (mselect6 ? 4 : 8);
1471	mpage = arr[off] & 0x3f;
1472	ps = !!(arr[off] & 0x80);
1473	if (ps) {
1474		mk_sense_buffer(devip, ILLEGAL_REQUEST,
1475				INVALID_FIELD_IN_PARAM_LIST, 0);
1476		return check_condition_result;
1477	}
1478	spf = !!(arr[off] & 0x40);
1479	pg_len = spf ? ((arr[off + 2] << 8) + arr[off + 3] + 4) :
1480		       (arr[off + 1] + 2);
1481	if ((pg_len + off) > param_len) {
1482		mk_sense_buffer(devip, ILLEGAL_REQUEST,
1483				PARAMETER_LIST_LENGTH_ERR, 0);
1484		return check_condition_result;
1485	}
1486	switch (mpage) {
1487	case 0xa:      /* Control Mode page */
1488		if (ctrl_m_pg[1] == arr[off + 1]) {
1489			memcpy(ctrl_m_pg + 2, arr + off + 2,
1490			       sizeof(ctrl_m_pg) - 2);
1491			scsi_debug_dsense = !!(ctrl_m_pg[2] & 0x4);
1492			return 0;
1493		}
1494		break;
1495	case 0x1c:      /* Informational Exceptions Mode page */
1496		if (iec_m_pg[1] == arr[off + 1]) {
1497			memcpy(iec_m_pg + 2, arr + off + 2,
1498			       sizeof(iec_m_pg) - 2);
1499			return 0;
1500		}
1501		break;
1502	default:
1503		break;
1504	}
1505	mk_sense_buffer(devip, ILLEGAL_REQUEST,
1506			INVALID_FIELD_IN_PARAM_LIST, 0);
1507	return check_condition_result;
1508}
1509
1510static int resp_temp_l_pg(unsigned char * arr)
1511{
1512	unsigned char temp_l_pg[] = {0x0, 0x0, 0x3, 0x2, 0x0, 38,
1513				     0x0, 0x1, 0x3, 0x2, 0x0, 65,
1514		};
1515
1516        memcpy(arr, temp_l_pg, sizeof(temp_l_pg));
1517        return sizeof(temp_l_pg);
1518}
1519
1520static int resp_ie_l_pg(unsigned char * arr)
1521{
1522	unsigned char ie_l_pg[] = {0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 38,
1523		};
1524
1525        memcpy(arr, ie_l_pg, sizeof(ie_l_pg));
1526	if (iec_m_pg[2] & 0x4) {	/* TEST bit set */
1527		arr[4] = THRESHOLD_EXCEEDED;
1528		arr[5] = 0xff;
1529	}
1530        return sizeof(ie_l_pg);
1531}
1532
1533#define SDEBUG_MAX_LSENSE_SZ 512
1534
1535static int resp_log_sense(struct scsi_cmnd * scp,
1536                          struct sdebug_dev_info * devip)
1537{
1538	int ppc, sp, pcontrol, pcode, subpcode, alloc_len, errsts, len, n;
1539	unsigned char arr[SDEBUG_MAX_LSENSE_SZ];
1540	unsigned char *cmd = (unsigned char *)scp->cmnd;
1541
1542	if ((errsts = check_readiness(scp, 1, devip)))
1543		return errsts;
1544	memset(arr, 0, sizeof(arr));
1545	ppc = cmd[1] & 0x2;
1546	sp = cmd[1] & 0x1;
1547	if (ppc || sp) {
1548		mk_sense_buffer(devip, ILLEGAL_REQUEST,
1549				INVALID_FIELD_IN_CDB, 0);
1550		return check_condition_result;
1551	}
1552	pcontrol = (cmd[2] & 0xc0) >> 6;
1553	pcode = cmd[2] & 0x3f;
1554	subpcode = cmd[3] & 0xff;
1555	alloc_len = (cmd[7] << 8) + cmd[8];
1556	arr[0] = pcode;
1557	if (0 == subpcode) {
1558		switch (pcode) {
1559		case 0x0:	/* Supported log pages log page */
1560			n = 4;
1561			arr[n++] = 0x0;		/* this page */
1562			arr[n++] = 0xd;		/* Temperature */
1563			arr[n++] = 0x2f;	/* Informational exceptions */
1564			arr[3] = n - 4;
1565			break;
1566		case 0xd:	/* Temperature log page */
1567			arr[3] = resp_temp_l_pg(arr + 4);
1568			break;
1569		case 0x2f:	/* Informational exceptions log page */
1570			arr[3] = resp_ie_l_pg(arr + 4);
1571			break;
1572		default:
1573			mk_sense_buffer(devip, ILLEGAL_REQUEST,
1574					INVALID_FIELD_IN_CDB, 0);
1575			return check_condition_result;
1576		}
1577	} else if (0xff == subpcode) {
1578		arr[0] |= 0x40;
1579		arr[1] = subpcode;
1580		switch (pcode) {
1581		case 0x0:	/* Supported log pages and subpages log page */
1582			n = 4;
1583			arr[n++] = 0x0;
1584			arr[n++] = 0x0;		/* 0,0 page */
1585			arr[n++] = 0x0;
1586			arr[n++] = 0xff;	/* this page */
1587			arr[n++] = 0xd;
1588			arr[n++] = 0x0;		/* Temperature */
1589			arr[n++] = 0x2f;
1590			arr[n++] = 0x0;	/* Informational exceptions */
1591			arr[3] = n - 4;
1592			break;
1593		case 0xd:	/* Temperature subpages */
1594			n = 4;
1595			arr[n++] = 0xd;
1596			arr[n++] = 0x0;		/* Temperature */
1597			arr[3] = n - 4;
1598			break;
1599		case 0x2f:	/* Informational exceptions subpages */
1600			n = 4;
1601			arr[n++] = 0x2f;
1602			arr[n++] = 0x0;		/* Informational exceptions */
1603			arr[3] = n - 4;
1604			break;
1605		default:
1606			mk_sense_buffer(devip, ILLEGAL_REQUEST,
1607					INVALID_FIELD_IN_CDB, 0);
1608			return check_condition_result;
1609		}
1610	} else {
1611		mk_sense_buffer(devip, ILLEGAL_REQUEST,
1612				INVALID_FIELD_IN_CDB, 0);
1613		return check_condition_result;
1614	}
1615	len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len);
1616	return fill_from_dev_buffer(scp, arr,
1617		    min(len, SDEBUG_MAX_INQ_ARR_SZ));
1618}
1619
1620static int check_device_access_params(struct sdebug_dev_info *devi,
1621				      unsigned long long lba, unsigned int num)
1622{
1623	if (lba + num > sdebug_capacity) {
1624		mk_sense_buffer(devi, ILLEGAL_REQUEST, ADDR_OUT_OF_RANGE, 0);
1625		return check_condition_result;
1626	}
1627	/* transfer length excessive (tie in to block limits VPD page) */
1628	if (num > sdebug_store_sectors) {
1629		mk_sense_buffer(devi, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
1630		return check_condition_result;
1631	}
1632	return 0;
1633}
1634
1635static int do_device_access(struct scsi_cmnd *scmd,
1636			    struct sdebug_dev_info *devi,
1637			    unsigned long long lba, unsigned int num, int write)
1638{
1639	int ret;
1640	unsigned int block, rest = 0;
1641	int (*func)(struct scsi_cmnd *, unsigned char *, int);
1642
1643	func = write ? fetch_to_dev_buffer : fill_from_dev_buffer;
1644
1645	block = do_div(lba, sdebug_store_sectors);
1646	if (block + num > sdebug_store_sectors)
1647		rest = block + num - sdebug_store_sectors;
1648
1649	ret = func(scmd, fake_storep + (block * scsi_debug_sector_size),
1650		   (num - rest) * scsi_debug_sector_size);
1651	if (!ret && rest)
1652		ret = func(scmd, fake_storep, rest * scsi_debug_sector_size);
1653
1654	return ret;
1655}
1656
1657static int prot_verify_read(struct scsi_cmnd *SCpnt, sector_t start_sec,
1658			    unsigned int sectors, u32 ei_lba)
1659{
1660	unsigned int i, resid;
1661	struct scatterlist *psgl;
1662	struct sd_dif_tuple *sdt;
1663	sector_t sector;
1664	sector_t tmp_sec = start_sec;
1665	void *paddr;
1666
1667	start_sec = do_div(tmp_sec, sdebug_store_sectors);
1668
1669	sdt = (struct sd_dif_tuple *)(dif_storep + dif_offset(start_sec));
1670
1671	for (i = 0 ; i < sectors ; i++) {
1672		u16 csum;
1673
1674		if (sdt[i].app_tag == 0xffff)
1675			continue;
1676
1677		sector = start_sec + i;
1678
1679		switch (scsi_debug_guard) {
1680		case 1:
1681			csum = ip_compute_csum(fake_storep +
1682					       sector * scsi_debug_sector_size,
1683					       scsi_debug_sector_size);
1684			break;
1685		case 0:
1686			csum = crc_t10dif(fake_storep +
1687					  sector * scsi_debug_sector_size,
1688					  scsi_debug_sector_size);
1689			csum = cpu_to_be16(csum);
1690			break;
1691		default:
1692			BUG();
1693		}
1694
1695		if (sdt[i].guard_tag != csum) {
1696			printk(KERN_ERR "%s: GUARD check failed on sector %lu" \
1697			       " rcvd 0x%04x, data 0x%04x\n", __func__,
1698			       (unsigned long)sector,
1699			       be16_to_cpu(sdt[i].guard_tag),
1700			       be16_to_cpu(csum));
1701			dif_errors++;
1702			return 0x01;
1703		}
1704
1705		if (scsi_debug_dif == SD_DIF_TYPE1_PROTECTION &&
1706		    be32_to_cpu(sdt[i].ref_tag) != (sector & 0xffffffff)) {
1707			printk(KERN_ERR "%s: REF check failed on sector %lu\n",
1708			       __func__, (unsigned long)sector);
1709			dif_errors++;
1710			return 0x03;
1711		}
1712
1713		if (scsi_debug_dif == SD_DIF_TYPE2_PROTECTION &&
1714		    be32_to_cpu(sdt[i].ref_tag) != ei_lba) {
1715			printk(KERN_ERR "%s: REF check failed on sector %lu\n",
1716			       __func__, (unsigned long)sector);
1717			dif_errors++;
1718			return 0x03;
1719		}
1720
1721		ei_lba++;
1722	}
1723
1724	resid = sectors * 8; /* Bytes of protection data to copy into sgl */
1725	sector = start_sec;
1726
1727	scsi_for_each_prot_sg(SCpnt, psgl, scsi_prot_sg_count(SCpnt), i) {
1728		int len = min(psgl->length, resid);
1729
1730		paddr = kmap_atomic(sg_page(psgl), KM_IRQ0) + psgl->offset;
1731		memcpy(paddr, dif_storep + dif_offset(sector), len);
1732
1733		sector += len >> 3;
1734		if (sector >= sdebug_store_sectors) {
1735			/* Force wrap */
1736			tmp_sec = sector;
1737			sector = do_div(tmp_sec, sdebug_store_sectors);
1738		}
1739		resid -= len;
1740		kunmap_atomic(paddr, KM_IRQ0);
1741	}
1742
1743	dix_reads++;
1744
1745	return 0;
1746}
1747
1748static int resp_read(struct scsi_cmnd *SCpnt, unsigned long long lba,
1749		     unsigned int num, struct sdebug_dev_info *devip,
1750		     u32 ei_lba)
1751{
1752	unsigned long iflags;
1753	int ret;
1754
1755	ret = check_device_access_params(devip, lba, num);
1756	if (ret)
1757		return ret;
1758
1759	if ((SCSI_DEBUG_OPT_MEDIUM_ERR & scsi_debug_opts) &&
1760	    (lba <= OPT_MEDIUM_ERR_ADDR) &&
1761	    ((lba + num) > OPT_MEDIUM_ERR_ADDR)) {
1762		/* claim unrecoverable read error */
1763		mk_sense_buffer(devip, MEDIUM_ERROR, UNRECOVERED_READ_ERR,
1764				0);
1765		/* set info field and valid bit for fixed descriptor */
1766		if (0x70 == (devip->sense_buff[0] & 0x7f)) {
1767			devip->sense_buff[0] |= 0x80;	/* Valid bit */
1768			ret = OPT_MEDIUM_ERR_ADDR;
1769			devip->sense_buff[3] = (ret >> 24) & 0xff;
1770			devip->sense_buff[4] = (ret >> 16) & 0xff;
1771			devip->sense_buff[5] = (ret >> 8) & 0xff;
1772			devip->sense_buff[6] = ret & 0xff;
1773		}
1774		return check_condition_result;
1775	}
1776
1777	/* DIX + T10 DIF */
1778	if (scsi_debug_dix && scsi_prot_sg_count(SCpnt)) {
1779		int prot_ret = prot_verify_read(SCpnt, lba, num, ei_lba);
1780
1781		if (prot_ret) {
1782			mk_sense_buffer(devip, ABORTED_COMMAND, 0x10, prot_ret);
1783			return illegal_condition_result;
1784		}
1785	}
1786
1787	read_lock_irqsave(&atomic_rw, iflags);
1788	ret = do_device_access(SCpnt, devip, lba, num, 0);
1789	read_unlock_irqrestore(&atomic_rw, iflags);
1790	return ret;
1791}
1792
1793void dump_sector(unsigned char *buf, int len)
1794{
1795	int i, j;
1796
1797	printk(KERN_ERR ">>> Sector Dump <<<\n");
1798
1799	for (i = 0 ; i < len ; i += 16) {
1800		printk(KERN_ERR "%04d: ", i);
1801
1802		for (j = 0 ; j < 16 ; j++) {
1803			unsigned char c = buf[i+j];
1804			if (c >= 0x20 && c < 0x7e)
1805				printk(" %c ", buf[i+j]);
1806			else
1807				printk("%02x ", buf[i+j]);
1808		}
1809
1810		printk("\n");
1811	}
1812}
1813
1814static int prot_verify_write(struct scsi_cmnd *SCpnt, sector_t start_sec,
1815			     unsigned int sectors, u32 ei_lba)
1816{
1817	int i, j, ret;
1818	struct sd_dif_tuple *sdt;
1819	struct scatterlist *dsgl = scsi_sglist(SCpnt);
1820	struct scatterlist *psgl = scsi_prot_sglist(SCpnt);
1821	void *daddr, *paddr;
1822	sector_t tmp_sec = start_sec;
1823	sector_t sector;
1824	int ppage_offset;
1825	unsigned short csum;
1826
1827	sector = do_div(tmp_sec, sdebug_store_sectors);
1828
1829	BUG_ON(scsi_sg_count(SCpnt) == 0);
1830	BUG_ON(scsi_prot_sg_count(SCpnt) == 0);
1831
1832	paddr = kmap_atomic(sg_page(psgl), KM_IRQ1) + psgl->offset;
1833	ppage_offset = 0;
1834
1835	/* For each data page */
1836	scsi_for_each_sg(SCpnt, dsgl, scsi_sg_count(SCpnt), i) {
1837		daddr = kmap_atomic(sg_page(dsgl), KM_IRQ0) + dsgl->offset;
1838
1839		/* For each sector-sized chunk in data page */
1840		for (j = 0 ; j < dsgl->length ; j += scsi_debug_sector_size) {
1841
1842			/* If we're at the end of the current
1843			 * protection page advance to the next one
1844			 */
1845			if (ppage_offset >= psgl->length) {
1846				kunmap_atomic(paddr, KM_IRQ1);
1847				psgl = sg_next(psgl);
1848				BUG_ON(psgl == NULL);
1849				paddr = kmap_atomic(sg_page(psgl), KM_IRQ1)
1850					+ psgl->offset;
1851				ppage_offset = 0;
1852			}
1853
1854			sdt = paddr + ppage_offset;
1855
1856			switch (scsi_debug_guard) {
1857			case 1:
1858				csum = ip_compute_csum(daddr,
1859						       scsi_debug_sector_size);
1860				break;
1861			case 0:
1862				csum = cpu_to_be16(crc_t10dif(daddr,
1863						      scsi_debug_sector_size));
1864				break;
1865			default:
1866				BUG();
1867				ret = 0;
1868				goto out;
1869			}
1870
1871			if (sdt->guard_tag != csum) {
1872				printk(KERN_ERR
1873				       "%s: GUARD check failed on sector %lu " \
1874				       "rcvd 0x%04x, calculated 0x%04x\n",
1875				       __func__, (unsigned long)sector,
1876				       be16_to_cpu(sdt->guard_tag),
1877				       be16_to_cpu(csum));
1878				ret = 0x01;
1879				dump_sector(daddr, scsi_debug_sector_size);
1880				goto out;
1881			}
1882
1883			if (scsi_debug_dif == SD_DIF_TYPE1_PROTECTION &&
1884			    be32_to_cpu(sdt->ref_tag)
1885			    != (start_sec & 0xffffffff)) {
1886				printk(KERN_ERR
1887				       "%s: REF check failed on sector %lu\n",
1888				       __func__, (unsigned long)sector);
1889				ret = 0x03;
1890				dump_sector(daddr, scsi_debug_sector_size);
1891				goto out;
1892			}
1893
1894			if (scsi_debug_dif == SD_DIF_TYPE2_PROTECTION &&
1895			    be32_to_cpu(sdt->ref_tag) != ei_lba) {
1896				printk(KERN_ERR
1897				       "%s: REF check failed on sector %lu\n",
1898				       __func__, (unsigned long)sector);
1899				ret = 0x03;
1900				dump_sector(daddr, scsi_debug_sector_size);
1901				goto out;
1902			}
1903
1904			/* Would be great to copy this in bigger
1905			 * chunks.  However, for the sake of
1906			 * correctness we need to verify each sector
1907			 * before writing it to "stable" storage
1908			 */
1909			memcpy(dif_storep + dif_offset(sector), sdt, 8);
1910
1911			sector++;
1912
1913			if (sector == sdebug_store_sectors)
1914				sector = 0;	/* Force wrap */
1915
1916			start_sec++;
1917			ei_lba++;
1918			daddr += scsi_debug_sector_size;
1919			ppage_offset += sizeof(struct sd_dif_tuple);
1920		}
1921
1922		kunmap_atomic(daddr, KM_IRQ0);
1923	}
1924
1925	kunmap_atomic(paddr, KM_IRQ1);
1926
1927	dix_writes++;
1928
1929	return 0;
1930
1931out:
1932	dif_errors++;
1933	kunmap_atomic(daddr, KM_IRQ0);
1934	kunmap_atomic(paddr, KM_IRQ1);
1935	return ret;
1936}
1937
1938static unsigned int map_state(sector_t lba, unsigned int *num)
1939{
1940	unsigned int granularity, alignment, mapped;
1941	sector_t block, next, end;
1942
1943	granularity = scsi_debug_unmap_granularity;
1944	alignment = granularity - scsi_debug_unmap_alignment;
1945	block = lba + alignment;
1946	do_div(block, granularity);
1947
1948	mapped = test_bit(block, map_storep);
1949
1950	if (mapped)
1951		next = find_next_zero_bit(map_storep, map_size, block);
1952	else
1953		next = find_next_bit(map_storep, map_size, block);
1954
1955	end = next * granularity - scsi_debug_unmap_alignment;
1956	*num = end - lba;
1957
1958	return mapped;
1959}
1960
1961static void map_region(sector_t lba, unsigned int len)
1962{
1963	unsigned int granularity, alignment;
1964	sector_t end = lba + len;
1965
1966	granularity = scsi_debug_unmap_granularity;
1967	alignment = granularity - scsi_debug_unmap_alignment;
1968
1969	while (lba < end) {
1970		sector_t block, rem;
1971
1972		block = lba + alignment;
1973		rem = do_div(block, granularity);
1974
1975		set_bit(block, map_storep);
1976
1977		lba += granularity - rem;
1978	}
1979}
1980
1981static void unmap_region(sector_t lba, unsigned int len)
1982{
1983	unsigned int granularity, alignment;
1984	sector_t end = lba + len;
1985
1986	granularity = scsi_debug_unmap_granularity;
1987	alignment = granularity - scsi_debug_unmap_alignment;
1988
1989	while (lba < end) {
1990		sector_t block, rem;
1991
1992		block = lba + alignment;
1993		rem = do_div(block, granularity);
1994
1995		if (rem == 0 && lba + granularity <= end)
1996			clear_bit(block, map_storep);
1997
1998		lba += granularity - rem;
1999	}
2000}
2001
2002static int resp_write(struct scsi_cmnd *SCpnt, unsigned long long lba,
2003		      unsigned int num, struct sdebug_dev_info *devip,
2004		      u32 ei_lba)
2005{
2006	unsigned long iflags;
2007	int ret;
2008
2009	ret = check_device_access_params(devip, lba, num);
2010	if (ret)
2011		return ret;
2012
2013	/* DIX + T10 DIF */
2014	if (scsi_debug_dix && scsi_prot_sg_count(SCpnt)) {
2015		int prot_ret = prot_verify_write(SCpnt, lba, num, ei_lba);
2016
2017		if (prot_ret) {
2018			mk_sense_buffer(devip, ILLEGAL_REQUEST, 0x10, prot_ret);
2019			return illegal_condition_result;
2020		}
2021	}
2022
2023	write_lock_irqsave(&atomic_rw, iflags);
2024	ret = do_device_access(SCpnt, devip, lba, num, 1);
2025	if (scsi_debug_unmap_granularity)
2026		map_region(lba, num);
2027	write_unlock_irqrestore(&atomic_rw, iflags);
2028	if (-1 == ret)
2029		return (DID_ERROR << 16);
2030	else if ((ret < (num * scsi_debug_sector_size)) &&
2031		 (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
2032		printk(KERN_INFO "scsi_debug: write: cdb indicated=%u, "
2033		       " IO sent=%d bytes\n", num * scsi_debug_sector_size, ret);
2034
2035	return 0;
2036}
2037
2038static int resp_write_same(struct scsi_cmnd *scmd, unsigned long long lba,
2039		      unsigned int num, struct sdebug_dev_info *devip,
2040			   u32 ei_lba, unsigned int unmap)
2041{
2042	unsigned long iflags;
2043	unsigned long long i;
2044	int ret;
2045
2046	ret = check_device_access_params(devip, lba, num);
2047	if (ret)
2048		return ret;
2049
2050	write_lock_irqsave(&atomic_rw, iflags);
2051
2052	if (unmap && scsi_debug_unmap_granularity) {
2053		unmap_region(lba, num);
2054		goto out;
2055	}
2056
2057	/* Else fetch one logical block */
2058	ret = fetch_to_dev_buffer(scmd,
2059				  fake_storep + (lba * scsi_debug_sector_size),
2060				  scsi_debug_sector_size);
2061
2062	if (-1 == ret) {
2063		write_unlock_irqrestore(&atomic_rw, iflags);
2064		return (DID_ERROR << 16);
2065	} else if ((ret < (num * scsi_debug_sector_size)) &&
2066		 (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
2067		printk(KERN_INFO "scsi_debug: write same: cdb indicated=%u, "
2068		       " IO sent=%d bytes\n", num * scsi_debug_sector_size, ret);
2069
2070	/* Copy first sector to remaining blocks */
2071	for (i = 1 ; i < num ; i++)
2072		memcpy(fake_storep + ((lba + i) * scsi_debug_sector_size),
2073		       fake_storep + (lba * scsi_debug_sector_size),
2074		       scsi_debug_sector_size);
2075
2076	if (scsi_debug_unmap_granularity)
2077		map_region(lba, num);
2078out:
2079	write_unlock_irqrestore(&atomic_rw, iflags);
2080
2081	return 0;
2082}
2083
2084struct unmap_block_desc {
2085	__be64	lba;
2086	__be32	blocks;
2087	__be32	__reserved;
2088};
2089
2090static int resp_unmap(struct scsi_cmnd * scmd, struct sdebug_dev_info * devip)
2091{
2092	unsigned char *buf;
2093	struct unmap_block_desc *desc;
2094	unsigned int i, payload_len, descriptors;
2095	int ret;
2096
2097	ret = check_readiness(scmd, 1, devip);
2098	if (ret)
2099		return ret;
2100
2101	payload_len = get_unaligned_be16(&scmd->cmnd[7]);
2102	BUG_ON(scsi_bufflen(scmd) != payload_len);
2103
2104	descriptors = (payload_len - 8) / 16;
2105
2106	buf = kmalloc(scsi_bufflen(scmd), GFP_ATOMIC);
2107	if (!buf)
2108		return check_condition_result;
2109
2110	scsi_sg_copy_to_buffer(scmd, buf, scsi_bufflen(scmd));
2111
2112	BUG_ON(get_unaligned_be16(&buf[0]) != payload_len - 2);
2113	BUG_ON(get_unaligned_be16(&buf[2]) != descriptors * 16);
2114
2115	desc = (void *)&buf[8];
2116
2117	for (i = 0 ; i < descriptors ; i++) {
2118		unsigned long long lba = get_unaligned_be64(&desc[i].lba);
2119		unsigned int num = get_unaligned_be32(&desc[i].blocks);
2120
2121		ret = check_device_access_params(devip, lba, num);
2122		if (ret)
2123			goto out;
2124
2125		unmap_region(lba, num);
2126	}
2127
2128	ret = 0;
2129
2130out:
2131	kfree(buf);
2132
2133	return ret;
2134}
2135
2136#define SDEBUG_GET_LBA_STATUS_LEN 32
2137
2138static int resp_get_lba_status(struct scsi_cmnd * scmd,
2139			       struct sdebug_dev_info * devip)
2140{
2141	unsigned long long lba;
2142	unsigned int alloc_len, mapped, num;
2143	unsigned char arr[SDEBUG_GET_LBA_STATUS_LEN];
2144	int ret;
2145
2146	ret = check_readiness(scmd, 1, devip);
2147	if (ret)
2148		return ret;
2149
2150	lba = get_unaligned_be64(&scmd->cmnd[2]);
2151	alloc_len = get_unaligned_be32(&scmd->cmnd[10]);
2152
2153	if (alloc_len < 24)
2154		return 0;
2155
2156	ret = check_device_access_params(devip, lba, 1);
2157	if (ret)
2158		return ret;
2159
2160	mapped = map_state(lba, &num);
2161
2162	memset(arr, 0, SDEBUG_GET_LBA_STATUS_LEN);
2163	put_unaligned_be32(16, &arr[0]);	/* Parameter Data Length */
2164	put_unaligned_be64(lba, &arr[8]);	/* LBA */
2165	put_unaligned_be32(num, &arr[16]);	/* Number of blocks */
2166	arr[20] = !mapped;			/* mapped = 0, unmapped = 1 */
2167
2168	return fill_from_dev_buffer(scmd, arr, SDEBUG_GET_LBA_STATUS_LEN);
2169}
2170
2171#define SDEBUG_RLUN_ARR_SZ 256
2172
2173static int resp_report_luns(struct scsi_cmnd * scp,
2174			    struct sdebug_dev_info * devip)
2175{
2176	unsigned int alloc_len;
2177	int lun_cnt, i, upper, num, n, wlun, lun;
2178	unsigned char *cmd = (unsigned char *)scp->cmnd;
2179	int select_report = (int)cmd[2];
2180	struct scsi_lun *one_lun;
2181	unsigned char arr[SDEBUG_RLUN_ARR_SZ];
2182	unsigned char * max_addr;
2183
2184	alloc_len = cmd[9] + (cmd[8] << 8) + (cmd[7] << 16) + (cmd[6] << 24);
2185	if ((alloc_len < 4) || (select_report > 2)) {
2186		mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
2187			       	0);
2188		return check_condition_result;
2189	}
2190	/* can produce response with up to 16k luns (lun 0 to lun 16383) */
2191	memset(arr, 0, SDEBUG_RLUN_ARR_SZ);
2192	lun_cnt = scsi_debug_max_luns;
2193	if (1 == select_report)
2194		lun_cnt = 0;
2195	else if (scsi_debug_no_lun_0 && (lun_cnt > 0))
2196		--lun_cnt;
2197	wlun = (select_report > 0) ? 1 : 0;
2198	num = lun_cnt + wlun;
2199	arr[2] = ((sizeof(struct scsi_lun) * num) >> 8) & 0xff;
2200	arr[3] = (sizeof(struct scsi_lun) * num) & 0xff;
2201	n = min((int)((SDEBUG_RLUN_ARR_SZ - 8) /
2202			    sizeof(struct scsi_lun)), num);
2203	if (n < num) {
2204		wlun = 0;
2205		lun_cnt = n;
2206	}
2207	one_lun = (struct scsi_lun *) &arr[8];
2208	max_addr = arr + SDEBUG_RLUN_ARR_SZ;
2209	for (i = 0, lun = (scsi_debug_no_lun_0 ? 1 : 0);
2210             ((i < lun_cnt) && ((unsigned char *)(one_lun + i) < max_addr));
2211	     i++, lun++) {
2212		upper = (lun >> 8) & 0x3f;
2213		if (upper)
2214			one_lun[i].scsi_lun[0] =
2215			    (upper | (SAM2_LUN_ADDRESS_METHOD << 6));
2216		one_lun[i].scsi_lun[1] = lun & 0xff;
2217	}
2218	if (wlun) {
2219		one_lun[i].scsi_lun[0] = (SAM2_WLUN_REPORT_LUNS >> 8) & 0xff;
2220		one_lun[i].scsi_lun[1] = SAM2_WLUN_REPORT_LUNS & 0xff;
2221		i++;
2222	}
2223	alloc_len = (unsigned char *)(one_lun + i) - arr;
2224	return fill_from_dev_buffer(scp, arr,
2225				    min((int)alloc_len, SDEBUG_RLUN_ARR_SZ));
2226}
2227
2228static int resp_xdwriteread(struct scsi_cmnd *scp, unsigned long long lba,
2229			    unsigned int num, struct sdebug_dev_info *devip)
2230{
2231	int i, j, ret = -1;
2232	unsigned char *kaddr, *buf;
2233	unsigned int offset;
2234	struct scatterlist *sg;
2235	struct scsi_data_buffer *sdb = scsi_in(scp);
2236
2237	/* better not to use temporary buffer. */
2238	buf = kmalloc(scsi_bufflen(scp), GFP_ATOMIC);
2239	if (!buf)
2240		return ret;
2241
2242	scsi_sg_copy_to_buffer(scp, buf, scsi_bufflen(scp));
2243
2244	offset = 0;
2245	for_each_sg(sdb->table.sgl, sg, sdb->table.nents, i) {
2246		kaddr = (unsigned char *)kmap_atomic(sg_page(sg), KM_USER0);
2247		if (!kaddr)
2248			goto out;
2249
2250		for (j = 0; j < sg->length; j++)
2251			*(kaddr + sg->offset + j) ^= *(buf + offset + j);
2252
2253		offset += sg->length;
2254		kunmap_atomic(kaddr, KM_USER0);
2255	}
2256	ret = 0;
2257out:
2258	kfree(buf);
2259
2260	return ret;
2261}
2262
2263/* When timer goes off this function is called. */
2264static void timer_intr_handler(unsigned long indx)
2265{
2266	struct sdebug_queued_cmd * sqcp;
2267	unsigned long iflags;
2268
2269	if (indx >= SCSI_DEBUG_CANQUEUE) {
2270		printk(KERN_ERR "scsi_debug:timer_intr_handler: indx too "
2271		       "large\n");
2272		return;
2273	}
2274	spin_lock_irqsave(&queued_arr_lock, iflags);
2275	sqcp = &queued_arr[(int)indx];
2276	if (! sqcp->in_use) {
2277		printk(KERN_ERR "scsi_debug:timer_intr_handler: Unexpected "
2278		       "interrupt\n");
2279		spin_unlock_irqrestore(&queued_arr_lock, iflags);
2280		return;
2281	}
2282	sqcp->in_use = 0;
2283	if (sqcp->done_funct) {
2284		sqcp->a_cmnd->result = sqcp->scsi_result;
2285		sqcp->done_funct(sqcp->a_cmnd); /* callback to mid level */
2286	}
2287	sqcp->done_funct = NULL;
2288	spin_unlock_irqrestore(&queued_arr_lock, iflags);
2289}
2290
2291
2292static struct sdebug_dev_info *
2293sdebug_device_create(struct sdebug_host_info *sdbg_host, gfp_t flags)
2294{
2295	struct sdebug_dev_info *devip;
2296
2297	devip = kzalloc(sizeof(*devip), flags);
2298	if (devip) {
2299		devip->sdbg_host = sdbg_host;
2300		list_add_tail(&devip->dev_list, &sdbg_host->dev_info_list);
2301	}
2302	return devip;
2303}
2304
2305static struct sdebug_dev_info * devInfoReg(struct scsi_device * sdev)
2306{
2307	struct sdebug_host_info * sdbg_host;
2308	struct sdebug_dev_info * open_devip = NULL;
2309	struct sdebug_dev_info * devip =
2310			(struct sdebug_dev_info *)sdev->hostdata;
2311
2312	if (devip)
2313		return devip;
2314	sdbg_host = *(struct sdebug_host_info **)shost_priv(sdev->host);
2315	if (!sdbg_host) {
2316                printk(KERN_ERR "Host info NULL\n");
2317		return NULL;
2318        }
2319	list_for_each_entry(devip, &sdbg_host->dev_info_list, dev_list) {
2320		if ((devip->used) && (devip->channel == sdev->channel) &&
2321                    (devip->target == sdev->id) &&
2322                    (devip->lun == sdev->lun))
2323                        return devip;
2324		else {
2325			if ((!devip->used) && (!open_devip))
2326				open_devip = devip;
2327		}
2328	}
2329	if (!open_devip) { /* try and make a new one */
2330		open_devip = sdebug_device_create(sdbg_host, GFP_ATOMIC);
2331		if (!open_devip) {
2332			printk(KERN_ERR "%s: out of memory at line %d\n",
2333				__func__, __LINE__);
2334			return NULL;
2335		}
2336	}
2337
2338	open_devip->channel = sdev->channel;
2339	open_devip->target = sdev->id;
2340	open_devip->lun = sdev->lun;
2341	open_devip->sdbg_host = sdbg_host;
2342	open_devip->reset = 1;
2343	open_devip->used = 1;
2344	memset(open_devip->sense_buff, 0, SDEBUG_SENSE_LEN);
2345	if (scsi_debug_dsense)
2346		open_devip->sense_buff[0] = 0x72;
2347	else {
2348		open_devip->sense_buff[0] = 0x70;
2349		open_devip->sense_buff[7] = 0xa;
2350	}
2351	if (sdev->lun == SAM2_WLUN_REPORT_LUNS)
2352		open_devip->wlun = SAM2_WLUN_REPORT_LUNS & 0xff;
2353
2354	return open_devip;
2355}
2356
2357static int scsi_debug_slave_alloc(struct scsi_device *sdp)
2358{
2359	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2360		printk(KERN_INFO "scsi_debug: slave_alloc <%u %u %u %u>\n",
2361		       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
2362	queue_flag_set_unlocked(QUEUE_FLAG_BIDI, sdp->request_queue);
2363	return 0;
2364}
2365
2366static int scsi_debug_slave_configure(struct scsi_device *sdp)
2367{
2368	struct sdebug_dev_info *devip;
2369
2370	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2371		printk(KERN_INFO "scsi_debug: slave_configure <%u %u %u %u>\n",
2372		       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
2373	if (sdp->host->max_cmd_len != SCSI_DEBUG_MAX_CMD_LEN)
2374		sdp->host->max_cmd_len = SCSI_DEBUG_MAX_CMD_LEN;
2375	devip = devInfoReg(sdp);
2376	if (NULL == devip)
2377		return 1;	/* no resources, will be marked offline */
2378	sdp->hostdata = devip;
2379	if (sdp->host->cmd_per_lun)
2380		scsi_adjust_queue_depth(sdp, SDEBUG_TAGGED_QUEUING,
2381					sdp->host->cmd_per_lun);
2382	blk_queue_max_segment_size(sdp->request_queue, 256 * 1024);
2383	return 0;
2384}
2385
2386static void scsi_debug_slave_destroy(struct scsi_device *sdp)
2387{
2388	struct sdebug_dev_info *devip =
2389		(struct sdebug_dev_info *)sdp->hostdata;
2390
2391	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2392		printk(KERN_INFO "scsi_debug: slave_destroy <%u %u %u %u>\n",
2393		       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
2394	if (devip) {
2395		/* make this slot avaliable for re-use */
2396		devip->used = 0;
2397		sdp->hostdata = NULL;
2398	}
2399}
2400
2401/* Returns 1 if found 'cmnd' and deleted its timer. else returns 0 */
2402static int stop_queued_cmnd(struct scsi_cmnd *cmnd)
2403{
2404	unsigned long iflags;
2405	int k;
2406	struct sdebug_queued_cmd *sqcp;
2407
2408	spin_lock_irqsave(&queued_arr_lock, iflags);
2409	for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
2410		sqcp = &queued_arr[k];
2411		if (sqcp->in_use && (cmnd == sqcp->a_cmnd)) {
2412			del_timer_sync(&sqcp->cmnd_timer);
2413			sqcp->in_use = 0;
2414			sqcp->a_cmnd = NULL;
2415			break;
2416		}
2417	}
2418	spin_unlock_irqrestore(&queued_arr_lock, iflags);
2419	return (k < SCSI_DEBUG_CANQUEUE) ? 1 : 0;
2420}
2421
2422/* Deletes (stops) timers of all queued commands */
2423static void stop_all_queued(void)
2424{
2425	unsigned long iflags;
2426	int k;
2427	struct sdebug_queued_cmd *sqcp;
2428
2429	spin_lock_irqsave(&queued_arr_lock, iflags);
2430	for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
2431		sqcp = &queued_arr[k];
2432		if (sqcp->in_use && sqcp->a_cmnd) {
2433			del_timer_sync(&sqcp->cmnd_timer);
2434			sqcp->in_use = 0;
2435			sqcp->a_cmnd = NULL;
2436		}
2437	}
2438	spin_unlock_irqrestore(&queued_arr_lock, iflags);
2439}
2440
2441static int scsi_debug_abort(struct scsi_cmnd * SCpnt)
2442{
2443	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2444		printk(KERN_INFO "scsi_debug: abort\n");
2445	++num_aborts;
2446	stop_queued_cmnd(SCpnt);
2447	return SUCCESS;
2448}
2449
2450static int scsi_debug_biosparam(struct scsi_device *sdev,
2451		struct block_device * bdev, sector_t capacity, int *info)
2452{
2453	int res;
2454	unsigned char *buf;
2455
2456	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2457		printk(KERN_INFO "scsi_debug: biosparam\n");
2458	buf = scsi_bios_ptable(bdev);
2459	if (buf) {
2460		res = scsi_partsize(buf, capacity,
2461				    &info[2], &info[0], &info[1]);
2462		kfree(buf);
2463		if (! res)
2464			return res;
2465	}
2466	info[0] = sdebug_heads;
2467	info[1] = sdebug_sectors_per;
2468	info[2] = sdebug_cylinders_per;
2469	return 0;
2470}
2471
2472static int scsi_debug_device_reset(struct scsi_cmnd * SCpnt)
2473{
2474	struct sdebug_dev_info * devip;
2475
2476	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2477		printk(KERN_INFO "scsi_debug: device_reset\n");
2478	++num_dev_resets;
2479	if (SCpnt) {
2480		devip = devInfoReg(SCpnt->device);
2481		if (devip)
2482			devip->reset = 1;
2483	}
2484	return SUCCESS;
2485}
2486
2487static int scsi_debug_bus_reset(struct scsi_cmnd * SCpnt)
2488{
2489	struct sdebug_host_info *sdbg_host;
2490        struct sdebug_dev_info * dev_info;
2491        struct scsi_device * sdp;
2492        struct Scsi_Host * hp;
2493
2494	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2495		printk(KERN_INFO "scsi_debug: bus_reset\n");
2496	++num_bus_resets;
2497	if (SCpnt && ((sdp = SCpnt->device)) && ((hp = sdp->host))) {
2498		sdbg_host = *(struct sdebug_host_info **)shost_priv(hp);
2499		if (sdbg_host) {
2500			list_for_each_entry(dev_info,
2501                                            &sdbg_host->dev_info_list,
2502                                            dev_list)
2503				dev_info->reset = 1;
2504		}
2505	}
2506	return SUCCESS;
2507}
2508
2509static int scsi_debug_host_reset(struct scsi_cmnd * SCpnt)
2510{
2511	struct sdebug_host_info * sdbg_host;
2512        struct sdebug_dev_info * dev_info;
2513
2514	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2515		printk(KERN_INFO "scsi_debug: host_reset\n");
2516	++num_host_resets;
2517        spin_lock(&sdebug_host_list_lock);
2518        list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
2519                list_for_each_entry(dev_info, &sdbg_host->dev_info_list,
2520                                    dev_list)
2521                        dev_info->reset = 1;
2522        }
2523        spin_unlock(&sdebug_host_list_lock);
2524	stop_all_queued();
2525	return SUCCESS;
2526}
2527
2528/* Initializes timers in queued array */
2529static void __init init_all_queued(void)
2530{
2531	unsigned long iflags;
2532	int k;
2533	struct sdebug_queued_cmd * sqcp;
2534
2535	spin_lock_irqsave(&queued_arr_lock, iflags);
2536	for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
2537		sqcp = &queued_arr[k];
2538		init_timer(&sqcp->cmnd_timer);
2539		sqcp->in_use = 0;
2540		sqcp->a_cmnd = NULL;
2541	}
2542	spin_unlock_irqrestore(&queued_arr_lock, iflags);
2543}
2544
2545static void __init sdebug_build_parts(unsigned char *ramp,
2546				      unsigned long store_size)
2547{
2548	struct partition * pp;
2549	int starts[SDEBUG_MAX_PARTS + 2];
2550	int sectors_per_part, num_sectors, k;
2551	int heads_by_sects, start_sec, end_sec;
2552
2553	/* assume partition table already zeroed */
2554	if ((scsi_debug_num_parts < 1) || (store_size < 1048576))
2555		return;
2556	if (scsi_debug_num_parts > SDEBUG_MAX_PARTS) {
2557		scsi_debug_num_parts = SDEBUG_MAX_PARTS;
2558		printk(KERN_WARNING "scsi_debug:build_parts: reducing "
2559				    "partitions to %d\n", SDEBUG_MAX_PARTS);
2560	}
2561	num_sectors = (int)sdebug_store_sectors;
2562	sectors_per_part = (num_sectors - sdebug_sectors_per)
2563			   / scsi_debug_num_parts;
2564	heads_by_sects = sdebug_heads * sdebug_sectors_per;
2565        starts[0] = sdebug_sectors_per;
2566	for (k = 1; k < scsi_debug_num_parts; ++k)
2567		starts[k] = ((k * sectors_per_part) / heads_by_sects)
2568			    * heads_by_sects;
2569	starts[scsi_debug_num_parts] = num_sectors;
2570	starts[scsi_debug_num_parts + 1] = 0;
2571
2572	ramp[510] = 0x55;	/* magic partition markings */
2573	ramp[511] = 0xAA;
2574	pp = (struct partition *)(ramp + 0x1be);
2575	for (k = 0; starts[k + 1]; ++k, ++pp) {
2576		start_sec = starts[k];
2577		end_sec = starts[k + 1] - 1;
2578		pp->boot_ind = 0;
2579
2580		pp->cyl = start_sec / heads_by_sects;
2581		pp->head = (start_sec - (pp->cyl * heads_by_sects))
2582			   / sdebug_sectors_per;
2583		pp->sector = (start_sec % sdebug_sectors_per) + 1;
2584
2585		pp->end_cyl = end_sec / heads_by_sects;
2586		pp->end_head = (end_sec - (pp->end_cyl * heads_by_sects))
2587			       / sdebug_sectors_per;
2588		pp->end_sector = (end_sec % sdebug_sectors_per) + 1;
2589
2590		pp->start_sect = start_sec;
2591		pp->nr_sects = end_sec - start_sec + 1;
2592		pp->sys_ind = 0x83;	/* plain Linux partition */
2593	}
2594}
2595
2596static int schedule_resp(struct scsi_cmnd * cmnd,
2597			 struct sdebug_dev_info * devip,
2598			 done_funct_t done, int scsi_result, int delta_jiff)
2599{
2600	if ((SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) && cmnd) {
2601		if (scsi_result) {
2602			struct scsi_device * sdp = cmnd->device;
2603
2604			printk(KERN_INFO "scsi_debug:    <%u %u %u %u> "
2605			       "non-zero result=0x%x\n", sdp->host->host_no,
2606			       sdp->channel, sdp->id, sdp->lun, scsi_result);
2607		}
2608	}
2609	if (cmnd && devip) {
2610		/* simulate autosense by this driver */
2611		if (SAM_STAT_CHECK_CONDITION == (scsi_result & 0xff))
2612			memcpy(cmnd->sense_buffer, devip->sense_buff,
2613			       (SCSI_SENSE_BUFFERSIZE > SDEBUG_SENSE_LEN) ?
2614			       SDEBUG_SENSE_LEN : SCSI_SENSE_BUFFERSIZE);
2615	}
2616	if (delta_jiff <= 0) {
2617		if (cmnd)
2618			cmnd->result = scsi_result;
2619		if (done)
2620			done(cmnd);
2621		return 0;
2622	} else {
2623		unsigned long iflags;
2624		int k;
2625		struct sdebug_queued_cmd * sqcp = NULL;
2626
2627		spin_lock_irqsave(&queued_arr_lock, iflags);
2628		for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
2629			sqcp = &queued_arr[k];
2630			if (! sqcp->in_use)
2631				break;
2632		}
2633		if (k >= SCSI_DEBUG_CANQUEUE) {
2634			spin_unlock_irqrestore(&queued_arr_lock, iflags);
2635			printk(KERN_WARNING "scsi_debug: can_queue exceeded\n");
2636			return 1;	/* report busy to mid level */
2637		}
2638		sqcp->in_use = 1;
2639		sqcp->a_cmnd = cmnd;
2640		sqcp->scsi_result = scsi_result;
2641		sqcp->done_funct = done;
2642		sqcp->cmnd_timer.function = timer_intr_handler;
2643		sqcp->cmnd_timer.data = k;
2644		sqcp->cmnd_timer.expires = jiffies + delta_jiff;
2645		add_timer(&sqcp->cmnd_timer);
2646		spin_unlock_irqrestore(&queued_arr_lock, iflags);
2647		if (cmnd)
2648			cmnd->result = 0;
2649		return 0;
2650	}
2651}
2652/* Note: The following macros create attribute files in the
2653   /sys/module/scsi_debug/parameters directory. Unfortunately this
2654   driver is unaware of a change and cannot trigger auxiliary actions
2655   as it can when the corresponding attribute in the
2656   /sys/bus/pseudo/drivers/scsi_debug directory is changed.
2657 */
2658module_param_named(add_host, scsi_debug_add_host, int, S_IRUGO | S_IWUSR);
2659module_param_named(delay, scsi_debug_delay, int, S_IRUGO | S_IWUSR);
2660module_param_named(dev_size_mb, scsi_debug_dev_size_mb, int, S_IRUGO);
2661module_param_named(dsense, scsi_debug_dsense, int, S_IRUGO | S_IWUSR);
2662module_param_named(every_nth, scsi_debug_every_nth, int, S_IRUGO | S_IWUSR);
2663module_param_named(fake_rw, scsi_debug_fake_rw, int, S_IRUGO | S_IWUSR);
2664module_param_named(max_luns, scsi_debug_max_luns, int, S_IRUGO | S_IWUSR);
2665module_param_named(no_lun_0, scsi_debug_no_lun_0, int, S_IRUGO | S_IWUSR);
2666module_param_named(num_parts, scsi_debug_num_parts, int, S_IRUGO);
2667module_param_named(num_tgts, scsi_debug_num_tgts, int, S_IRUGO | S_IWUSR);
2668module_param_named(opts, scsi_debug_opts, int, S_IRUGO | S_IWUSR);
2669module_param_named(ptype, scsi_debug_ptype, int, S_IRUGO | S_IWUSR);
2670module_param_named(scsi_level, scsi_debug_scsi_level, int, S_IRUGO);
2671module_param_named(virtual_gb, scsi_debug_virtual_gb, int, S_IRUGO | S_IWUSR);
2672module_param_named(vpd_use_hostno, scsi_debug_vpd_use_hostno, int,
2673		   S_IRUGO | S_IWUSR);
2674module_param_named(sector_size, scsi_debug_sector_size, int, S_IRUGO);
2675module_param_named(dix, scsi_debug_dix, int, S_IRUGO);
2676module_param_named(dif, scsi_debug_dif, int, S_IRUGO);
2677module_param_named(guard, scsi_debug_guard, int, S_IRUGO);
2678module_param_named(ato, scsi_debug_ato, int, S_IRUGO);
2679module_param_named(physblk_exp, scsi_debug_physblk_exp, int, S_IRUGO);
2680module_param_named(lowest_aligned, scsi_debug_lowest_aligned, int, S_IRUGO);
2681module_param_named(unmap_max_blocks, scsi_debug_unmap_max_blocks, int, S_IRUGO);
2682module_param_named(unmap_max_desc, scsi_debug_unmap_max_desc, int, S_IRUGO);
2683module_param_named(unmap_granularity, scsi_debug_unmap_granularity, int, S_IRUGO);
2684module_param_named(unmap_alignment, scsi_debug_unmap_alignment, int, S_IRUGO);
2685
2686MODULE_AUTHOR("Eric Youngdale + Douglas Gilbert");
2687MODULE_DESCRIPTION("SCSI debug adapter driver");
2688MODULE_LICENSE("GPL");
2689MODULE_VERSION(SCSI_DEBUG_VERSION);
2690
2691MODULE_PARM_DESC(add_host, "0..127 hosts allowed(def=1)");
2692MODULE_PARM_DESC(delay, "# of jiffies to delay response(def=1)");
2693MODULE_PARM_DESC(dev_size_mb, "size in MB of ram shared by devs(def=8)");
2694MODULE_PARM_DESC(dsense, "use descriptor sense format(def=0 -> fixed)");
2695MODULE_PARM_DESC(every_nth, "timeout every nth command(def=0)");
2696MODULE_PARM_DESC(fake_rw, "fake reads/writes instead of copying (def=0)");
2697MODULE_PARM_DESC(max_luns, "number of LUNs per target to simulate(def=1)");
2698MODULE_PARM_DESC(no_lun_0, "no LU number 0 (def=0 -> have lun 0)");
2699MODULE_PARM_DESC(num_parts, "number of partitions(def=0)");
2700MODULE_PARM_DESC(num_tgts, "number of targets per host to simulate(def=1)");
2701MODULE_PARM_DESC(opts, "1->noise, 2->medium_err, 4->timeout, 8->recovered_err... (def=0)");
2702MODULE_PARM_DESC(ptype, "SCSI peripheral type(def=0[disk])");
2703MODULE_PARM_DESC(scsi_level, "SCSI level to simulate(def=5[SPC-3])");
2704MODULE_PARM_DESC(virtual_gb, "virtual gigabyte size (def=0 -> use dev_size_mb)");
2705MODULE_PARM_DESC(vpd_use_hostno, "0 -> dev ids ignore hostno (def=1 -> unique dev ids)");
2706MODULE_PARM_DESC(sector_size, "logical block size in bytes (def=512)");
2707MODULE_PARM_DESC(physblk_exp, "physical block exponent (def=0)");
2708MODULE_PARM_DESC(lowest_aligned, "lowest aligned lba (def=0)");
2709MODULE_PARM_DESC(dix, "data integrity extensions mask (def=0)");
2710MODULE_PARM_DESC(dif, "data integrity field type: 0-3 (def=0)");
2711MODULE_PARM_DESC(guard, "protection checksum: 0=crc, 1=ip (def=0)");
2712MODULE_PARM_DESC(ato, "application tag ownership: 0=disk 1=host (def=1)");
2713MODULE_PARM_DESC(unmap_max_blocks, "max # of blocks can be unmapped in one cmd (def=0)");
2714MODULE_PARM_DESC(unmap_max_desc, "max # of ranges that can be unmapped in one cmd (def=0)");
2715MODULE_PARM_DESC(unmap_granularity, "thin provisioning granularity in blocks (def=0)");
2716MODULE_PARM_DESC(unmap_alignment, "lowest aligned thin provisioning lba (def=0)");
2717
2718static char sdebug_info[256];
2719
2720static const char * scsi_debug_info(struct Scsi_Host * shp)
2721{
2722	sprintf(sdebug_info, "scsi_debug, version %s [%s], "
2723		"dev_size_mb=%d, opts=0x%x", SCSI_DEBUG_VERSION,
2724		scsi_debug_version_date, scsi_debug_dev_size_mb,
2725		scsi_debug_opts);
2726	return sdebug_info;
2727}
2728
2729/* scsi_debug_proc_info
2730 * Used if the driver currently has no own support for /proc/scsi
2731 */
2732static int scsi_debug_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset,
2733				int length, int inout)
2734{
2735	int len, pos, begin;
2736	int orig_length;
2737
2738	orig_length = length;
2739
2740	if (inout == 1) {
2741		char arr[16];
2742		int minLen = length > 15 ? 15 : length;
2743
2744		if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
2745			return -EACCES;
2746		memcpy(arr, buffer, minLen);
2747		arr[minLen] = '\0';
2748		if (1 != sscanf(arr, "%d", &pos))
2749			return -EINVAL;
2750		scsi_debug_opts = pos;
2751		if (scsi_debug_every_nth != 0)
2752                        scsi_debug_cmnd_count = 0;
2753		return length;
2754	}
2755	begin = 0;
2756	pos = len = sprintf(buffer, "scsi_debug adapter driver, version "
2757	    "%s [%s]\n"
2758	    "num_tgts=%d, shared (ram) size=%d MB, opts=0x%x, "
2759	    "every_nth=%d(curr:%d)\n"
2760	    "delay=%d, max_luns=%d, scsi_level=%d\n"
2761	    "sector_size=%d bytes, cylinders=%d, heads=%d, sectors=%d\n"
2762	    "number of aborts=%d, device_reset=%d, bus_resets=%d, "
2763	    "host_resets=%d\ndix_reads=%d dix_writes=%d dif_errors=%d\n",
2764	    SCSI_DEBUG_VERSION, scsi_debug_version_date, scsi_debug_num_tgts,
2765	    scsi_debug_dev_size_mb, scsi_debug_opts, scsi_debug_every_nth,
2766	    scsi_debug_cmnd_count, scsi_debug_delay,
2767	    scsi_debug_max_luns, scsi_debug_scsi_level,
2768	    scsi_debug_sector_size, sdebug_cylinders_per, sdebug_heads,
2769	    sdebug_sectors_per, num_aborts, num_dev_resets, num_bus_resets,
2770	    num_host_resets, dix_reads, dix_writes, dif_errors);
2771	if (pos < offset) {
2772		len = 0;
2773		begin = pos;
2774	}
2775	*start = buffer + (offset - begin);	/* Start of wanted data */
2776	len -= (offset - begin);
2777	if (len > length)
2778		len = length;
2779	return len;
2780}
2781
2782static ssize_t sdebug_delay_show(struct device_driver * ddp, char * buf)
2783{
2784        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_delay);
2785}
2786
2787static ssize_t sdebug_delay_store(struct device_driver * ddp,
2788				  const char * buf, size_t count)
2789{
2790        int delay;
2791	char work[20];
2792
2793        if (1 == sscanf(buf, "%10s", work)) {
2794		if ((1 == sscanf(work, "%d", &delay)) && (delay >= 0)) {
2795			scsi_debug_delay = delay;
2796			return count;
2797		}
2798	}
2799	return -EINVAL;
2800}
2801DRIVER_ATTR(delay, S_IRUGO | S_IWUSR, sdebug_delay_show,
2802	    sdebug_delay_store);
2803
2804static ssize_t sdebug_opts_show(struct device_driver * ddp, char * buf)
2805{
2806        return scnprintf(buf, PAGE_SIZE, "0x%x\n", scsi_debug_opts);
2807}
2808
2809static ssize_t sdebug_opts_store(struct device_driver * ddp,
2810				 const char * buf, size_t count)
2811{
2812        int opts;
2813	char work[20];
2814
2815        if (1 == sscanf(buf, "%10s", work)) {
2816		if (0 == strnicmp(work,"0x", 2)) {
2817			if (1 == sscanf(&work[2], "%x", &opts))
2818				goto opts_done;
2819		} else {
2820			if (1 == sscanf(work, "%d", &opts))
2821				goto opts_done;
2822		}
2823	}
2824	return -EINVAL;
2825opts_done:
2826	scsi_debug_opts = opts;
2827	scsi_debug_cmnd_count = 0;
2828	return count;
2829}
2830DRIVER_ATTR(opts, S_IRUGO | S_IWUSR, sdebug_opts_show,
2831	    sdebug_opts_store);
2832
2833static ssize_t sdebug_ptype_show(struct device_driver * ddp, char * buf)
2834{
2835        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_ptype);
2836}
2837static ssize_t sdebug_ptype_store(struct device_driver * ddp,
2838				  const char * buf, size_t count)
2839{
2840        int n;
2841
2842	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2843		scsi_debug_ptype = n;
2844		return count;
2845	}
2846	return -EINVAL;
2847}
2848DRIVER_ATTR(ptype, S_IRUGO | S_IWUSR, sdebug_ptype_show, sdebug_ptype_store);
2849
2850static ssize_t sdebug_dsense_show(struct device_driver * ddp, char * buf)
2851{
2852        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dsense);
2853}
2854static ssize_t sdebug_dsense_store(struct device_driver * ddp,
2855				  const char * buf, size_t count)
2856{
2857        int n;
2858
2859	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2860		scsi_debug_dsense = n;
2861		return count;
2862	}
2863	return -EINVAL;
2864}
2865DRIVER_ATTR(dsense, S_IRUGO | S_IWUSR, sdebug_dsense_show,
2866	    sdebug_dsense_store);
2867
2868static ssize_t sdebug_fake_rw_show(struct device_driver * ddp, char * buf)
2869{
2870        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_fake_rw);
2871}
2872static ssize_t sdebug_fake_rw_store(struct device_driver * ddp,
2873				    const char * buf, size_t count)
2874{
2875        int n;
2876
2877	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2878		scsi_debug_fake_rw = n;
2879		return count;
2880	}
2881	return -EINVAL;
2882}
2883DRIVER_ATTR(fake_rw, S_IRUGO | S_IWUSR, sdebug_fake_rw_show,
2884	    sdebug_fake_rw_store);
2885
2886static ssize_t sdebug_no_lun_0_show(struct device_driver * ddp, char * buf)
2887{
2888        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_no_lun_0);
2889}
2890static ssize_t sdebug_no_lun_0_store(struct device_driver * ddp,
2891				     const char * buf, size_t count)
2892{
2893        int n;
2894
2895	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2896		scsi_debug_no_lun_0 = n;
2897		return count;
2898	}
2899	return -EINVAL;
2900}
2901DRIVER_ATTR(no_lun_0, S_IRUGO | S_IWUSR, sdebug_no_lun_0_show,
2902	    sdebug_no_lun_0_store);
2903
2904static ssize_t sdebug_num_tgts_show(struct device_driver * ddp, char * buf)
2905{
2906        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_num_tgts);
2907}
2908static ssize_t sdebug_num_tgts_store(struct device_driver * ddp,
2909				     const char * buf, size_t count)
2910{
2911        int n;
2912
2913	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2914		scsi_debug_num_tgts = n;
2915		sdebug_max_tgts_luns();
2916		return count;
2917	}
2918	return -EINVAL;
2919}
2920DRIVER_ATTR(num_tgts, S_IRUGO | S_IWUSR, sdebug_num_tgts_show,
2921	    sdebug_num_tgts_store);
2922
2923static ssize_t sdebug_dev_size_mb_show(struct device_driver * ddp, char * buf)
2924{
2925        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dev_size_mb);
2926}
2927DRIVER_ATTR(dev_size_mb, S_IRUGO, sdebug_dev_size_mb_show, NULL);
2928
2929static ssize_t sdebug_num_parts_show(struct device_driver * ddp, char * buf)
2930{
2931        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_num_parts);
2932}
2933DRIVER_ATTR(num_parts, S_IRUGO, sdebug_num_parts_show, NULL);
2934
2935static ssize_t sdebug_every_nth_show(struct device_driver * ddp, char * buf)
2936{
2937        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_every_nth);
2938}
2939static ssize_t sdebug_every_nth_store(struct device_driver * ddp,
2940				      const char * buf, size_t count)
2941{
2942        int nth;
2943
2944	if ((count > 0) && (1 == sscanf(buf, "%d", &nth))) {
2945		scsi_debug_every_nth = nth;
2946		scsi_debug_cmnd_count = 0;
2947		return count;
2948	}
2949	return -EINVAL;
2950}
2951DRIVER_ATTR(every_nth, S_IRUGO | S_IWUSR, sdebug_every_nth_show,
2952	    sdebug_every_nth_store);
2953
2954static ssize_t sdebug_max_luns_show(struct device_driver * ddp, char * buf)
2955{
2956        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_max_luns);
2957}
2958static ssize_t sdebug_max_luns_store(struct device_driver * ddp,
2959				     const char * buf, size_t count)
2960{
2961        int n;
2962
2963	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2964		scsi_debug_max_luns = n;
2965		sdebug_max_tgts_luns();
2966		return count;
2967	}
2968	return -EINVAL;
2969}
2970DRIVER_ATTR(max_luns, S_IRUGO | S_IWUSR, sdebug_max_luns_show,
2971	    sdebug_max_luns_store);
2972
2973static ssize_t sdebug_scsi_level_show(struct device_driver * ddp, char * buf)
2974{
2975        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_scsi_level);
2976}
2977DRIVER_ATTR(scsi_level, S_IRUGO, sdebug_scsi_level_show, NULL);
2978
2979static ssize_t sdebug_virtual_gb_show(struct device_driver * ddp, char * buf)
2980{
2981        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_virtual_gb);
2982}
2983static ssize_t sdebug_virtual_gb_store(struct device_driver * ddp,
2984				       const char * buf, size_t count)
2985{
2986        int n;
2987
2988	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2989		scsi_debug_virtual_gb = n;
2990
2991		sdebug_capacity = get_sdebug_capacity();
2992
2993		return count;
2994	}
2995	return -EINVAL;
2996}
2997DRIVER_ATTR(virtual_gb, S_IRUGO | S_IWUSR, sdebug_virtual_gb_show,
2998	    sdebug_virtual_gb_store);
2999
3000static ssize_t sdebug_add_host_show(struct device_driver * ddp, char * buf)
3001{
3002        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_add_host);
3003}
3004
3005static ssize_t sdebug_add_host_store(struct device_driver * ddp,
3006				     const char * buf, size_t count)
3007{
3008	int delta_hosts;
3009
3010	if (sscanf(buf, "%d", &delta_hosts) != 1)
3011		return -EINVAL;
3012	if (delta_hosts > 0) {
3013		do {
3014			sdebug_add_adapter();
3015		} while (--delta_hosts);
3016	} else if (delta_hosts < 0) {
3017		do {
3018			sdebug_remove_adapter();
3019		} while (++delta_hosts);
3020	}
3021	return count;
3022}
3023DRIVER_ATTR(add_host, S_IRUGO | S_IWUSR, sdebug_add_host_show,
3024	    sdebug_add_host_store);
3025
3026static ssize_t sdebug_vpd_use_hostno_show(struct device_driver * ddp,
3027					  char * buf)
3028{
3029	return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_vpd_use_hostno);
3030}
3031static ssize_t sdebug_vpd_use_hostno_store(struct device_driver * ddp,
3032					   const char * buf, size_t count)
3033{
3034	int n;
3035
3036	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
3037		scsi_debug_vpd_use_hostno = n;
3038		return count;
3039	}
3040	return -EINVAL;
3041}
3042DRIVER_ATTR(vpd_use_hostno, S_IRUGO | S_IWUSR, sdebug_vpd_use_hostno_show,
3043	    sdebug_vpd_use_hostno_store);
3044
3045static ssize_t sdebug_sector_size_show(struct device_driver * ddp, char * buf)
3046{
3047	return scnprintf(buf, PAGE_SIZE, "%u\n", scsi_debug_sector_size);
3048}
3049DRIVER_ATTR(sector_size, S_IRUGO, sdebug_sector_size_show, NULL);
3050
3051static ssize_t sdebug_dix_show(struct device_driver *ddp, char *buf)
3052{
3053	return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dix);
3054}
3055DRIVER_ATTR(dix, S_IRUGO, sdebug_dix_show, NULL);
3056
3057static ssize_t sdebug_dif_show(struct device_driver *ddp, char *buf)
3058{
3059	return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dif);
3060}
3061DRIVER_ATTR(dif, S_IRUGO, sdebug_dif_show, NULL);
3062
3063static ssize_t sdebug_guard_show(struct device_driver *ddp, char *buf)
3064{
3065	return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_guard);
3066}
3067DRIVER_ATTR(guard, S_IRUGO, sdebug_guard_show, NULL);
3068
3069static ssize_t sdebug_ato_show(struct device_driver *ddp, char *buf)
3070{
3071	return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_ato);
3072}
3073DRIVER_ATTR(ato, S_IRUGO, sdebug_ato_show, NULL);
3074
3075static ssize_t sdebug_map_show(struct device_driver *ddp, char *buf)
3076{
3077	ssize_t count;
3078
3079	if (scsi_debug_unmap_granularity == 0)
3080		return scnprintf(buf, PAGE_SIZE, "0-%u\n",
3081				 sdebug_store_sectors);
3082
3083	count = bitmap_scnlistprintf(buf, PAGE_SIZE, map_storep, map_size);
3084
3085	buf[count++] = '\n';
3086	buf[count++] = 0;
3087
3088	return count;
3089}
3090DRIVER_ATTR(map, S_IRUGO, sdebug_map_show, NULL);
3091
3092
3093/* Note: The following function creates attribute files in the
3094   /sys/bus/pseudo/drivers/scsi_debug directory. The advantage of these
3095   files (over those found in the /sys/module/scsi_debug/parameters
3096   directory) is that auxiliary actions can be triggered when an attribute
3097   is changed. For example see: sdebug_add_host_store() above.
3098 */
3099static int do_create_driverfs_files(void)
3100{
3101	int ret;
3102
3103	ret = driver_create_file(&sdebug_driverfs_driver, &driver_attr_add_host);
3104	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_delay);
3105	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dev_size_mb);
3106	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dsense);
3107	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_every_nth);
3108	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_fake_rw);
3109	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_max_luns);
3110	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_no_lun_0);
3111	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_num_parts);
3112	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_num_tgts);
3113	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_ptype);
3114	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_opts);
3115	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_scsi_level);
3116	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_virtual_gb);
3117	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_vpd_use_hostno);
3118	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_sector_size);
3119	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dix);
3120	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dif);
3121	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_guard);
3122	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_ato);
3123	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_map);
3124	return ret;
3125}
3126
3127static void do_remove_driverfs_files(void)
3128{
3129	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_map);
3130	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_ato);
3131	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_guard);
3132	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dif);
3133	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dix);
3134	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_sector_size);
3135	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_vpd_use_hostno);
3136	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_virtual_gb);
3137	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_scsi_level);
3138	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_opts);
3139	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_ptype);
3140	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_num_tgts);
3141	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_num_parts);
3142	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_no_lun_0);
3143	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_max_luns);
3144	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_fake_rw);
3145	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_every_nth);
3146	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dsense);
3147	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dev_size_mb);
3148	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_delay);
3149	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_add_host);
3150}
3151
3152static void pseudo_0_release(struct device *dev)
3153{
3154	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
3155		printk(KERN_INFO "scsi_debug: pseudo_0_release() called\n");
3156}
3157
3158static struct device pseudo_primary = {
3159	.init_name	= "pseudo_0",
3160	.release	= pseudo_0_release,
3161};
3162
3163static int __init scsi_debug_init(void)
3164{
3165	unsigned long sz;
3166	int host_to_add;
3167	int k;
3168	int ret;
3169
3170	switch (scsi_debug_sector_size) {
3171	case  512:
3172	case 1024:
3173	case 2048:
3174	case 4096:
3175		break;
3176	default:
3177		printk(KERN_ERR "scsi_debug_init: invalid sector_size %d\n",
3178		       scsi_debug_sector_size);
3179		return -EINVAL;
3180	}
3181
3182	switch (scsi_debug_dif) {
3183
3184	case SD_DIF_TYPE0_PROTECTION:
3185	case SD_DIF_TYPE1_PROTECTION:
3186	case SD_DIF_TYPE2_PROTECTION:
3187	case SD_DIF_TYPE3_PROTECTION:
3188		break;
3189
3190	default:
3191		printk(KERN_ERR "scsi_debug_init: dif must be 0, 1, 2 or 3\n");
3192		return -EINVAL;
3193	}
3194
3195	if (scsi_debug_guard > 1) {
3196		printk(KERN_ERR "scsi_debug_init: guard must be 0 or 1\n");
3197		return -EINVAL;
3198	}
3199
3200	if (scsi_debug_ato > 1) {
3201		printk(KERN_ERR "scsi_debug_init: ato must be 0 or 1\n");
3202		return -EINVAL;
3203	}
3204
3205	if (scsi_debug_physblk_exp > 15) {
3206		printk(KERN_ERR "scsi_debug_init: invalid physblk_exp %u\n",
3207		       scsi_debug_physblk_exp);
3208		return -EINVAL;
3209	}
3210
3211	if (scsi_debug_lowest_aligned > 0x3fff) {
3212		printk(KERN_ERR "scsi_debug_init: lowest_aligned too big: %u\n",
3213		       scsi_debug_lowest_aligned);
3214		return -EINVAL;
3215	}
3216
3217	if (scsi_debug_dev_size_mb < 1)
3218		scsi_debug_dev_size_mb = 1;  /* force minimum 1 MB ramdisk */
3219	sz = (unsigned long)scsi_debug_dev_size_mb * 1048576;
3220	sdebug_store_sectors = sz / scsi_debug_sector_size;
3221	sdebug_capacity = get_sdebug_capacity();
3222
3223	/* play around with geometry, don't waste too much on track 0 */
3224	sdebug_heads = 8;
3225	sdebug_sectors_per = 32;
3226	if (scsi_debug_dev_size_mb >= 16)
3227		sdebug_heads = 32;
3228	else if (scsi_debug_dev_size_mb >= 256)
3229		sdebug_heads = 64;
3230	sdebug_cylinders_per = (unsigned long)sdebug_capacity /
3231			       (sdebug_sectors_per * sdebug_heads);
3232	if (sdebug_cylinders_per >= 1024) {
3233		/* other LLDs do this; implies >= 1GB ram disk ... */
3234		sdebug_heads = 255;
3235		sdebug_sectors_per = 63;
3236		sdebug_cylinders_per = (unsigned long)sdebug_capacity /
3237			       (sdebug_sectors_per * sdebug_heads);
3238	}
3239
3240	fake_storep = vmalloc(sz);
3241	if (NULL == fake_storep) {
3242		printk(KERN_ERR "scsi_debug_init: out of memory, 1\n");
3243		return -ENOMEM;
3244	}
3245	memset(fake_storep, 0, sz);
3246	if (scsi_debug_num_parts > 0)
3247		sdebug_build_parts(fake_storep, sz);
3248
3249	if (scsi_debug_dif) {
3250		int dif_size;
3251
3252		dif_size = sdebug_store_sectors * sizeof(struct sd_dif_tuple);
3253		dif_storep = vmalloc(dif_size);
3254
3255		printk(KERN_ERR "scsi_debug_init: dif_storep %u bytes @ %p\n",
3256		       dif_size, dif_storep);
3257
3258		if (dif_storep == NULL) {
3259			printk(KERN_ERR "scsi_debug_init: out of mem. (DIX)\n");
3260			ret = -ENOMEM;
3261			goto free_vm;
3262		}
3263
3264		memset(dif_storep, 0xff, dif_size);
3265	}
3266
3267	if (scsi_debug_unmap_granularity) {
3268		unsigned int map_bytes;
3269
3270		if (scsi_debug_unmap_granularity < scsi_debug_unmap_alignment) {
3271			printk(KERN_ERR
3272			       "%s: ERR: unmap_granularity < unmap_alignment\n",
3273			       __func__);
3274			return -EINVAL;
3275		}
3276
3277		map_size = (sdebug_store_sectors / scsi_debug_unmap_granularity);
3278		map_bytes = map_size >> 3;
3279		map_storep = vmalloc(map_bytes);
3280
3281		printk(KERN_INFO "scsi_debug_init: %lu provisioning blocks\n",
3282		       map_size);
3283
3284		if (map_storep == NULL) {
3285			printk(KERN_ERR "scsi_debug_init: out of mem. (MAP)\n");
3286			ret = -ENOMEM;
3287			goto free_vm;
3288		}
3289
3290		memset(map_storep, 0x0, map_bytes);
3291
3292		/* Map first 1KB for partition table */
3293		if (scsi_debug_num_parts)
3294			map_region(0, 2);
3295	}
3296
3297	ret = device_register(&pseudo_primary);
3298	if (ret < 0) {
3299		printk(KERN_WARNING "scsi_debug: device_register error: %d\n",
3300			ret);
3301		goto free_vm;
3302	}
3303	ret = bus_register(&pseudo_lld_bus);
3304	if (ret < 0) {
3305		printk(KERN_WARNING "scsi_debug: bus_register error: %d\n",
3306			ret);
3307		goto dev_unreg;
3308	}
3309	ret = driver_register(&sdebug_driverfs_driver);
3310	if (ret < 0) {
3311		printk(KERN_WARNING "scsi_debug: driver_register error: %d\n",
3312			ret);
3313		goto bus_unreg;
3314	}
3315	ret = do_create_driverfs_files();
3316	if (ret < 0) {
3317		printk(KERN_WARNING "scsi_debug: driver_create_file error: %d\n",
3318			ret);
3319		goto del_files;
3320	}
3321
3322	init_all_queued();
3323
3324	host_to_add = scsi_debug_add_host;
3325        scsi_debug_add_host = 0;
3326
3327        for (k = 0; k < host_to_add; k++) {
3328                if (sdebug_add_adapter()) {
3329                        printk(KERN_ERR "scsi_debug_init: "
3330                               "sdebug_add_adapter failed k=%d\n", k);
3331                        break;
3332                }
3333        }
3334
3335	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) {
3336		printk(KERN_INFO "scsi_debug_init: built %d host(s)\n",
3337		       scsi_debug_add_host);
3338	}
3339	return 0;
3340
3341del_files:
3342	do_remove_driverfs_files();
3343	driver_unregister(&sdebug_driverfs_driver);
3344bus_unreg:
3345	bus_unregister(&pseudo_lld_bus);
3346dev_unreg:
3347	device_unregister(&pseudo_primary);
3348free_vm:
3349	if (map_storep)
3350		vfree(map_storep);
3351	if (dif_storep)
3352		vfree(dif_storep);
3353	vfree(fake_storep);
3354
3355	return ret;
3356}
3357
3358static void __exit scsi_debug_exit(void)
3359{
3360	int k = scsi_debug_add_host;
3361
3362	stop_all_queued();
3363	for (; k; k--)
3364		sdebug_remove_adapter();
3365	do_remove_driverfs_files();
3366	driver_unregister(&sdebug_driverfs_driver);
3367	bus_unregister(&pseudo_lld_bus);
3368	device_unregister(&pseudo_primary);
3369
3370	if (dif_storep)
3371		vfree(dif_storep);
3372
3373	vfree(fake_storep);
3374}
3375
3376device_initcall(scsi_debug_init);
3377module_exit(scsi_debug_exit);
3378
3379static void sdebug_release_adapter(struct device * dev)
3380{
3381        struct sdebug_host_info *sdbg_host;
3382
3383	sdbg_host = to_sdebug_host(dev);
3384        kfree(sdbg_host);
3385}
3386
3387static int sdebug_add_adapter(void)
3388{
3389	int k, devs_per_host;
3390        int error = 0;
3391        struct sdebug_host_info *sdbg_host;
3392	struct sdebug_dev_info *sdbg_devinfo, *tmp;
3393
3394        sdbg_host = kzalloc(sizeof(*sdbg_host),GFP_KERNEL);
3395        if (NULL == sdbg_host) {
3396                printk(KERN_ERR "%s: out of memory at line %d\n",
3397                       __func__, __LINE__);
3398                return -ENOMEM;
3399        }
3400
3401        INIT_LIST_HEAD(&sdbg_host->dev_info_list);
3402
3403	devs_per_host = scsi_debug_num_tgts * scsi_debug_max_luns;
3404        for (k = 0; k < devs_per_host; k++) {
3405		sdbg_devinfo = sdebug_device_create(sdbg_host, GFP_KERNEL);
3406		if (!sdbg_devinfo) {
3407                        printk(KERN_ERR "%s: out of memory at line %d\n",
3408                               __func__, __LINE__);
3409                        error = -ENOMEM;
3410			goto clean;
3411                }
3412        }
3413
3414        spin_lock(&sdebug_host_list_lock);
3415        list_add_tail(&sdbg_host->host_list, &sdebug_host_list);
3416        spin_unlock(&sdebug_host_list_lock);
3417
3418        sdbg_host->dev.bus = &pseudo_lld_bus;
3419        sdbg_host->dev.parent = &pseudo_primary;
3420        sdbg_host->dev.release = &sdebug_release_adapter;
3421        dev_set_name(&sdbg_host->dev, "adapter%d", scsi_debug_add_host);
3422
3423        error = device_register(&sdbg_host->dev);
3424
3425        if (error)
3426		goto clean;
3427
3428	++scsi_debug_add_host;
3429        return error;
3430
3431clean:
3432	list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
3433				 dev_list) {
3434		list_del(&sdbg_devinfo->dev_list);
3435		kfree(sdbg_devinfo);
3436	}
3437
3438	kfree(sdbg_host);
3439        return error;
3440}
3441
3442static void sdebug_remove_adapter(void)
3443{
3444        struct sdebug_host_info * sdbg_host = NULL;
3445
3446        spin_lock(&sdebug_host_list_lock);
3447        if (!list_empty(&sdebug_host_list)) {
3448                sdbg_host = list_entry(sdebug_host_list.prev,
3449                                       struct sdebug_host_info, host_list);
3450		list_del(&sdbg_host->host_list);
3451	}
3452        spin_unlock(&sdebug_host_list_lock);
3453
3454	if (!sdbg_host)
3455		return;
3456
3457        device_unregister(&sdbg_host->dev);
3458        --scsi_debug_add_host;
3459}
3460
3461static
3462int scsi_debug_queuecommand(struct scsi_cmnd *SCpnt, done_funct_t done)
3463{
3464	unsigned char *cmd = (unsigned char *) SCpnt->cmnd;
3465	int len, k;
3466	unsigned int num;
3467	unsigned long long lba;
3468	u32 ei_lba;
3469	int errsts = 0;
3470	int target = SCpnt->device->id;
3471	struct sdebug_dev_info *devip = NULL;
3472	int inj_recovered = 0;
3473	int inj_transport = 0;
3474	int inj_dif = 0;
3475	int inj_dix = 0;
3476	int delay_override = 0;
3477	int unmap = 0;
3478
3479	scsi_set_resid(SCpnt, 0);
3480	if ((SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) && cmd) {
3481		printk(KERN_INFO "scsi_debug: cmd ");
3482		for (k = 0, len = SCpnt->cmd_len; k < len; ++k)
3483			printk("%02x ", (int)cmd[k]);
3484		printk("\n");
3485	}
3486
3487	if (target == SCpnt->device->host->hostt->this_id) {
3488		printk(KERN_INFO "scsi_debug: initiator's id used as "
3489		       "target!\n");
3490		return schedule_resp(SCpnt, NULL, done,
3491				     DID_NO_CONNECT << 16, 0);
3492	}
3493
3494	if ((SCpnt->device->lun >= scsi_debug_max_luns) &&
3495	    (SCpnt->device->lun != SAM2_WLUN_REPORT_LUNS))
3496		return schedule_resp(SCpnt, NULL, done,
3497				     DID_NO_CONNECT << 16, 0);
3498	devip = devInfoReg(SCpnt->device);
3499	if (NULL == devip)
3500		return schedule_resp(SCpnt, NULL, done,
3501				     DID_NO_CONNECT << 16, 0);
3502
3503	if ((scsi_debug_every_nth != 0) &&
3504	    (++scsi_debug_cmnd_count >= abs(scsi_debug_every_nth))) {
3505		scsi_debug_cmnd_count = 0;
3506		if (scsi_debug_every_nth < -1)
3507			scsi_debug_every_nth = -1;
3508		if (SCSI_DEBUG_OPT_TIMEOUT & scsi_debug_opts)
3509			return 0; /* ignore command causing timeout */
3510		else if (SCSI_DEBUG_OPT_RECOVERED_ERR & scsi_debug_opts)
3511			inj_recovered = 1; /* to reads and writes below */
3512		else if (SCSI_DEBUG_OPT_TRANSPORT_ERR & scsi_debug_opts)
3513			inj_transport = 1; /* to reads and writes below */
3514		else if (SCSI_DEBUG_OPT_DIF_ERR & scsi_debug_opts)
3515			inj_dif = 1; /* to reads and writes below */
3516		else if (SCSI_DEBUG_OPT_DIX_ERR & scsi_debug_opts)
3517			inj_dix = 1; /* to reads and writes below */
3518	}
3519
3520	if (devip->wlun) {
3521		switch (*cmd) {
3522		case INQUIRY:
3523		case REQUEST_SENSE:
3524		case TEST_UNIT_READY:
3525		case REPORT_LUNS:
3526			break;  /* only allowable wlun commands */
3527		default:
3528			if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
3529				printk(KERN_INFO "scsi_debug: Opcode: 0x%x "
3530				       "not supported for wlun\n", *cmd);
3531			mk_sense_buffer(devip, ILLEGAL_REQUEST,
3532					INVALID_OPCODE, 0);
3533			errsts = check_condition_result;
3534			return schedule_resp(SCpnt, devip, done, errsts,
3535					     0);
3536		}
3537	}
3538
3539	switch (*cmd) {
3540	case INQUIRY:     /* mandatory, ignore unit attention */
3541		delay_override = 1;
3542		errsts = resp_inquiry(SCpnt, target, devip);
3543		break;
3544	case REQUEST_SENSE:	/* mandatory, ignore unit attention */
3545		delay_override = 1;
3546		errsts = resp_requests(SCpnt, devip);
3547		break;
3548	case REZERO_UNIT:	/* actually this is REWIND for SSC */
3549	case START_STOP:
3550		errsts = resp_start_stop(SCpnt, devip);
3551		break;
3552	case ALLOW_MEDIUM_REMOVAL:
3553		errsts = check_readiness(SCpnt, 1, devip);
3554		if (errsts)
3555			break;
3556		if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
3557			printk(KERN_INFO "scsi_debug: Medium removal %s\n",
3558			       cmd[4] ? "inhibited" : "enabled");
3559		break;
3560	case SEND_DIAGNOSTIC:     /* mandatory */
3561		errsts = check_readiness(SCpnt, 1, devip);
3562		break;
3563	case TEST_UNIT_READY:     /* mandatory */
3564		delay_override = 1;
3565		errsts = check_readiness(SCpnt, 0, devip);
3566		break;
3567	case RESERVE:
3568		errsts = check_readiness(SCpnt, 1, devip);
3569		break;
3570	case RESERVE_10:
3571		errsts = check_readiness(SCpnt, 1, devip);
3572		break;
3573	case RELEASE:
3574		errsts = check_readiness(SCpnt, 1, devip);
3575		break;
3576	case RELEASE_10:
3577		errsts = check_readiness(SCpnt, 1, devip);
3578		break;
3579	case READ_CAPACITY:
3580		errsts = resp_readcap(SCpnt, devip);
3581		break;
3582	case SERVICE_ACTION_IN:
3583		if (cmd[1] == SAI_READ_CAPACITY_16)
3584			errsts = resp_readcap16(SCpnt, devip);
3585		else if (cmd[1] == SAI_GET_LBA_STATUS) {
3586
3587			if (scsi_debug_unmap_max_desc == 0) {
3588				mk_sense_buffer(devip, ILLEGAL_REQUEST,
3589						INVALID_COMMAND_OPCODE, 0);
3590				errsts = check_condition_result;
3591			} else
3592				errsts = resp_get_lba_status(SCpnt, devip);
3593		} else {
3594			mk_sense_buffer(devip, ILLEGAL_REQUEST,
3595					INVALID_OPCODE, 0);
3596			errsts = check_condition_result;
3597		}
3598		break;
3599	case MAINTENANCE_IN:
3600		if (MI_REPORT_TARGET_PGS != cmd[1]) {
3601			mk_sense_buffer(devip, ILLEGAL_REQUEST,
3602					INVALID_OPCODE, 0);
3603			errsts = check_condition_result;
3604			break;
3605		}
3606		errsts = resp_report_tgtpgs(SCpnt, devip);
3607		break;
3608	case READ_16:
3609	case READ_12:
3610	case READ_10:
3611		/* READ{10,12,16} and DIF Type 2 are natural enemies */
3612		if (scsi_debug_dif == SD_DIF_TYPE2_PROTECTION &&
3613		    cmd[1] & 0xe0) {
3614			mk_sense_buffer(devip, ILLEGAL_REQUEST,
3615					INVALID_COMMAND_OPCODE, 0);
3616			errsts = check_condition_result;
3617			break;
3618		}
3619
3620		if ((scsi_debug_dif == SD_DIF_TYPE1_PROTECTION ||
3621		     scsi_debug_dif == SD_DIF_TYPE3_PROTECTION) &&
3622		    (cmd[1] & 0xe0) == 0)
3623			printk(KERN_ERR "Unprotected RD/WR to DIF device\n");
3624
3625		/* fall through */
3626	case READ_6:
3627read:
3628		errsts = check_readiness(SCpnt, 0, devip);
3629		if (errsts)
3630			break;
3631		if (scsi_debug_fake_rw)
3632			break;
3633		get_data_transfer_info(cmd, &lba, &num, &ei_lba);
3634		errsts = resp_read(SCpnt, lba, num, devip, ei_lba);
3635		if (inj_recovered && (0 == errsts)) {
3636			mk_sense_buffer(devip, RECOVERED_ERROR,
3637					THRESHOLD_EXCEEDED, 0);
3638			errsts = check_condition_result;
3639		} else if (inj_transport && (0 == errsts)) {
3640			mk_sense_buffer(devip, ABORTED_COMMAND,
3641					TRANSPORT_PROBLEM, ACK_NAK_TO);
3642			errsts = check_condition_result;
3643		} else if (inj_dif && (0 == errsts)) {
3644			mk_sense_buffer(devip, ABORTED_COMMAND, 0x10, 1);
3645			errsts = illegal_condition_result;
3646		} else if (inj_dix && (0 == errsts)) {
3647			mk_sense_buffer(devip, ILLEGAL_REQUEST, 0x10, 1);
3648			errsts = illegal_condition_result;
3649		}
3650		break;
3651	case REPORT_LUNS:	/* mandatory, ignore unit attention */
3652		delay_override = 1;
3653		errsts = resp_report_luns(SCpnt, devip);
3654		break;
3655	case VERIFY:		/* 10 byte SBC-2 command */
3656		errsts = check_readiness(SCpnt, 0, devip);
3657		break;
3658	case WRITE_16:
3659	case WRITE_12:
3660	case WRITE_10:
3661		/* WRITE{10,12,16} and DIF Type 2 are natural enemies */
3662		if (scsi_debug_dif == SD_DIF_TYPE2_PROTECTION &&
3663		    cmd[1] & 0xe0) {
3664			mk_sense_buffer(devip, ILLEGAL_REQUEST,
3665					INVALID_COMMAND_OPCODE, 0);
3666			errsts = check_condition_result;
3667			break;
3668		}
3669
3670		if ((scsi_debug_dif == SD_DIF_TYPE1_PROTECTION ||
3671		     scsi_debug_dif == SD_DIF_TYPE3_PROTECTION) &&
3672		    (cmd[1] & 0xe0) == 0)
3673			printk(KERN_ERR "Unprotected RD/WR to DIF device\n");
3674
3675		/* fall through */
3676	case WRITE_6:
3677write:
3678		errsts = check_readiness(SCpnt, 0, devip);
3679		if (errsts)
3680			break;
3681		if (scsi_debug_fake_rw)
3682			break;
3683		get_data_transfer_info(cmd, &lba, &num, &ei_lba);
3684		errsts = resp_write(SCpnt, lba, num, devip, ei_lba);
3685		if (inj_recovered && (0 == errsts)) {
3686			mk_sense_buffer(devip, RECOVERED_ERROR,
3687					THRESHOLD_EXCEEDED, 0);
3688			errsts = check_condition_result;
3689		} else if (inj_dif && (0 == errsts)) {
3690			mk_sense_buffer(devip, ABORTED_COMMAND, 0x10, 1);
3691			errsts = illegal_condition_result;
3692		} else if (inj_dix && (0 == errsts)) {
3693			mk_sense_buffer(devip, ILLEGAL_REQUEST, 0x10, 1);
3694			errsts = illegal_condition_result;
3695		}
3696		break;
3697	case WRITE_SAME_16:
3698		if (cmd[1] & 0x8)
3699			unmap = 1;
3700		/* fall through */
3701	case WRITE_SAME:
3702		errsts = check_readiness(SCpnt, 0, devip);
3703		if (errsts)
3704			break;
3705		get_data_transfer_info(cmd, &lba, &num, &ei_lba);
3706		errsts = resp_write_same(SCpnt, lba, num, devip, ei_lba, unmap);
3707		break;
3708	case UNMAP:
3709		errsts = check_readiness(SCpnt, 0, devip);
3710		if (errsts)
3711			break;
3712
3713		if (scsi_debug_unmap_max_desc == 0) {
3714			mk_sense_buffer(devip, ILLEGAL_REQUEST,
3715					INVALID_COMMAND_OPCODE, 0);
3716			errsts = check_condition_result;
3717		} else
3718			errsts = resp_unmap(SCpnt, devip);
3719		break;
3720	case MODE_SENSE:
3721	case MODE_SENSE_10:
3722		errsts = resp_mode_sense(SCpnt, target, devip);
3723		break;
3724	case MODE_SELECT:
3725		errsts = resp_mode_select(SCpnt, 1, devip);
3726		break;
3727	case MODE_SELECT_10:
3728		errsts = resp_mode_select(SCpnt, 0, devip);
3729		break;
3730	case LOG_SENSE:
3731		errsts = resp_log_sense(SCpnt, devip);
3732		break;
3733	case SYNCHRONIZE_CACHE:
3734		delay_override = 1;
3735		errsts = check_readiness(SCpnt, 0, devip);
3736		break;
3737	case WRITE_BUFFER:
3738		errsts = check_readiness(SCpnt, 1, devip);
3739		break;
3740	case XDWRITEREAD_10:
3741		if (!scsi_bidi_cmnd(SCpnt)) {
3742			mk_sense_buffer(devip, ILLEGAL_REQUEST,
3743					INVALID_FIELD_IN_CDB, 0);
3744			errsts = check_condition_result;
3745			break;
3746		}
3747
3748		errsts = check_readiness(SCpnt, 0, devip);
3749		if (errsts)
3750			break;
3751		if (scsi_debug_fake_rw)
3752			break;
3753		get_data_transfer_info(cmd, &lba, &num, &ei_lba);
3754		errsts = resp_read(SCpnt, lba, num, devip, ei_lba);
3755		if (errsts)
3756			break;
3757		errsts = resp_write(SCpnt, lba, num, devip, ei_lba);
3758		if (errsts)
3759			break;
3760		errsts = resp_xdwriteread(SCpnt, lba, num, devip);
3761		break;
3762	case VARIABLE_LENGTH_CMD:
3763		if (scsi_debug_dif == SD_DIF_TYPE2_PROTECTION) {
3764
3765			if ((cmd[10] & 0xe0) == 0)
3766				printk(KERN_ERR
3767				       "Unprotected RD/WR to DIF device\n");
3768
3769			if (cmd[9] == READ_32) {
3770				BUG_ON(SCpnt->cmd_len < 32);
3771				goto read;
3772			}
3773
3774			if (cmd[9] == WRITE_32) {
3775				BUG_ON(SCpnt->cmd_len < 32);
3776				goto write;
3777			}
3778		}
3779
3780		mk_sense_buffer(devip, ILLEGAL_REQUEST,
3781				INVALID_FIELD_IN_CDB, 0);
3782		errsts = check_condition_result;
3783		break;
3784
3785	default:
3786		if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
3787			printk(KERN_INFO "scsi_debug: Opcode: 0x%x not "
3788			       "supported\n", *cmd);
3789		errsts = check_readiness(SCpnt, 1, devip);
3790		if (errsts)
3791			break;	/* Unit attention takes precedence */
3792		mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_OPCODE, 0);
3793		errsts = check_condition_result;
3794		break;
3795	}
3796	return schedule_resp(SCpnt, devip, done, errsts,
3797			     (delay_override ? 0 : scsi_debug_delay));
3798}
3799
3800static struct scsi_host_template sdebug_driver_template = {
3801	.proc_info =		scsi_debug_proc_info,
3802	.proc_name =		sdebug_proc_name,
3803	.name =			"SCSI DEBUG",
3804	.info =			scsi_debug_info,
3805	.slave_alloc =		scsi_debug_slave_alloc,
3806	.slave_configure =	scsi_debug_slave_configure,
3807	.slave_destroy =	scsi_debug_slave_destroy,
3808	.ioctl =		scsi_debug_ioctl,
3809	.queuecommand =		scsi_debug_queuecommand,
3810	.eh_abort_handler =	scsi_debug_abort,
3811	.eh_bus_reset_handler = scsi_debug_bus_reset,
3812	.eh_device_reset_handler = scsi_debug_device_reset,
3813	.eh_host_reset_handler = scsi_debug_host_reset,
3814	.bios_param =		scsi_debug_biosparam,
3815	.can_queue =		SCSI_DEBUG_CANQUEUE,
3816	.this_id =		7,
3817	.sg_tablesize =		256,
3818	.cmd_per_lun =		16,
3819	.max_sectors =		0xffff,
3820	.use_clustering = 	DISABLE_CLUSTERING,
3821	.module =		THIS_MODULE,
3822};
3823
3824static int sdebug_driver_probe(struct device * dev)
3825{
3826        int error = 0;
3827        struct sdebug_host_info *sdbg_host;
3828        struct Scsi_Host *hpnt;
3829	int host_prot;
3830
3831	sdbg_host = to_sdebug_host(dev);
3832
3833        hpnt = scsi_host_alloc(&sdebug_driver_template, sizeof(sdbg_host));
3834        if (NULL == hpnt) {
3835                printk(KERN_ERR "%s: scsi_register failed\n", __func__);
3836                error = -ENODEV;
3837		return error;
3838        }
3839
3840        sdbg_host->shost = hpnt;
3841	*((struct sdebug_host_info **)hpnt->hostdata) = sdbg_host;
3842	if ((hpnt->this_id >= 0) && (scsi_debug_num_tgts > hpnt->this_id))
3843		hpnt->max_id = scsi_debug_num_tgts + 1;
3844	else
3845		hpnt->max_id = scsi_debug_num_tgts;
3846	hpnt->max_lun = SAM2_WLUN_REPORT_LUNS;	/* = scsi_debug_max_luns; */
3847
3848	host_prot = 0;
3849
3850	switch (scsi_debug_dif) {
3851
3852	case SD_DIF_TYPE1_PROTECTION:
3853		host_prot = SHOST_DIF_TYPE1_PROTECTION;
3854		if (scsi_debug_dix)
3855			host_prot |= SHOST_DIX_TYPE1_PROTECTION;
3856		break;
3857
3858	case SD_DIF_TYPE2_PROTECTION:
3859		host_prot = SHOST_DIF_TYPE2_PROTECTION;
3860		if (scsi_debug_dix)
3861			host_prot |= SHOST_DIX_TYPE2_PROTECTION;
3862		break;
3863
3864	case SD_DIF_TYPE3_PROTECTION:
3865		host_prot = SHOST_DIF_TYPE3_PROTECTION;
3866		if (scsi_debug_dix)
3867			host_prot |= SHOST_DIX_TYPE3_PROTECTION;
3868		break;
3869
3870	default:
3871		if (scsi_debug_dix)
3872			host_prot |= SHOST_DIX_TYPE0_PROTECTION;
3873		break;
3874	}
3875
3876	scsi_host_set_prot(hpnt, host_prot);
3877
3878	printk(KERN_INFO "scsi_debug: host protection%s%s%s%s%s%s%s\n",
3879	       (host_prot & SHOST_DIF_TYPE1_PROTECTION) ? " DIF1" : "",
3880	       (host_prot & SHOST_DIF_TYPE2_PROTECTION) ? " DIF2" : "",
3881	       (host_prot & SHOST_DIF_TYPE3_PROTECTION) ? " DIF3" : "",
3882	       (host_prot & SHOST_DIX_TYPE0_PROTECTION) ? " DIX0" : "",
3883	       (host_prot & SHOST_DIX_TYPE1_PROTECTION) ? " DIX1" : "",
3884	       (host_prot & SHOST_DIX_TYPE2_PROTECTION) ? " DIX2" : "",
3885	       (host_prot & SHOST_DIX_TYPE3_PROTECTION) ? " DIX3" : "");
3886
3887	if (scsi_debug_guard == 1)
3888		scsi_host_set_guard(hpnt, SHOST_DIX_GUARD_IP);
3889	else
3890		scsi_host_set_guard(hpnt, SHOST_DIX_GUARD_CRC);
3891
3892        error = scsi_add_host(hpnt, &sdbg_host->dev);
3893        if (error) {
3894                printk(KERN_ERR "%s: scsi_add_host failed\n", __func__);
3895                error = -ENODEV;
3896		scsi_host_put(hpnt);
3897        } else
3898		scsi_scan_host(hpnt);
3899
3900
3901        return error;
3902}
3903
3904static int sdebug_driver_remove(struct device * dev)
3905{
3906        struct sdebug_host_info *sdbg_host;
3907	struct sdebug_dev_info *sdbg_devinfo, *tmp;
3908
3909	sdbg_host = to_sdebug_host(dev);
3910
3911	if (!sdbg_host) {
3912		printk(KERN_ERR "%s: Unable to locate host info\n",
3913		       __func__);
3914		return -ENODEV;
3915	}
3916
3917        scsi_remove_host(sdbg_host->shost);
3918
3919	list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
3920				 dev_list) {
3921                list_del(&sdbg_devinfo->dev_list);
3922                kfree(sdbg_devinfo);
3923        }
3924
3925        scsi_host_put(sdbg_host->shost);
3926        return 0;
3927}
3928
3929static int pseudo_lld_bus_match(struct device *dev,
3930				struct device_driver *dev_driver)
3931{
3932	return 1;
3933}
3934
3935static struct bus_type pseudo_lld_bus = {
3936	.name = "pseudo",
3937	.match = pseudo_lld_bus_match,
3938	.probe = sdebug_driver_probe,
3939	.remove = sdebug_driver_remove,
3940};
3941