Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[deliverable/linux.git] / drivers / scsi / scsi_debug.c
CommitLineData
1da177e4 1/*
1da177e4
LT
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 *
773642d9 9 * Copyright (C) 2001 - 2016 Douglas Gilbert
1da177e4 10 *
773642d9
DG
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2, or (at your option)
14 * any later version.
1da177e4 15 *
78d4e5a0 16 * For documentation see http://sg.danny.cz/sg/sdebug26.html
1da177e4 17 *
1da177e4
LT
18 */
19
c1287970
TW
20
21#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__
22
1da177e4
LT
23#include <linux/module.h>
24
25#include <linux/kernel.h>
1da177e4 26#include <linux/errno.h>
b333a819 27#include <linux/jiffies.h>
5a0e3ad6 28#include <linux/slab.h>
1da177e4
LT
29#include <linux/types.h>
30#include <linux/string.h>
31#include <linux/genhd.h>
32#include <linux/fs.h>
33#include <linux/init.h>
34#include <linux/proc_fs.h>
1da177e4
LT
35#include <linux/vmalloc.h>
36#include <linux/moduleparam.h>
852e034d 37#include <linux/scatterlist.h>
1da177e4 38#include <linux/blkdev.h>
c6a44287 39#include <linux/crc-t10dif.h>
cbf67842
DG
40#include <linux/spinlock.h>
41#include <linux/interrupt.h>
42#include <linux/atomic.h>
43#include <linux/hrtimer.h>
09ba24c1 44#include <linux/uuid.h>
c6a44287
MP
45
46#include <net/checksum.h>
9ff26eef 47
44d92694
MP
48#include <asm/unaligned.h>
49
9ff26eef
FT
50#include <scsi/scsi.h>
51#include <scsi/scsi_cmnd.h>
52#include <scsi/scsi_device.h>
1da177e4
LT
53#include <scsi/scsi_host.h>
54#include <scsi/scsicam.h>
a34c4e98 55#include <scsi/scsi_eh.h>
cbf67842 56#include <scsi/scsi_tcq.h>
395cef03 57#include <scsi/scsi_dbg.h>
1da177e4 58
c6a44287 59#include "sd.h"
1da177e4 60#include "scsi_logging.h"
1da177e4 61
773642d9 62/* make sure inq_product_rev string corresponds to this version */
b01f6f83
DG
63#define SDEBUG_VERSION "1.86"
64static const char *sdebug_version_date = "20160430";
cbf67842
DG
65
66#define MY_NAME "scsi_debug"
1da177e4 67
6f3cbf55 68/* Additional Sense Code (ASC) */
c65b1445
DG
69#define NO_ADDITIONAL_SENSE 0x0
70#define LOGICAL_UNIT_NOT_READY 0x4
c2248fc9 71#define LOGICAL_UNIT_COMMUNICATION_FAILURE 0x8
1da177e4 72#define UNRECOVERED_READ_ERR 0x11
c65b1445 73#define PARAMETER_LIST_LENGTH_ERR 0x1a
1da177e4 74#define INVALID_OPCODE 0x20
22017ed2 75#define LBA_OUT_OF_RANGE 0x21
1da177e4 76#define INVALID_FIELD_IN_CDB 0x24
c65b1445 77#define INVALID_FIELD_IN_PARAM_LIST 0x26
cbf67842
DG
78#define UA_RESET_ASC 0x29
79#define UA_CHANGED_ASC 0x2a
19c8ead7
EM
80#define TARGET_CHANGED_ASC 0x3f
81#define LUNS_CHANGED_ASCQ 0x0e
22017ed2
DG
82#define INSUFF_RES_ASC 0x55
83#define INSUFF_RES_ASCQ 0x3
cbf67842
DG
84#define POWER_ON_RESET_ASCQ 0x0
85#define BUS_RESET_ASCQ 0x2 /* scsi bus reset occurred */
86#define MODE_CHANGED_ASCQ 0x1 /* mode parameters changed */
22017ed2 87#define CAPACITY_CHANGED_ASCQ 0x9
1da177e4 88#define SAVING_PARAMS_UNSUP 0x39
6f3cbf55 89#define TRANSPORT_PROBLEM 0x4b
c65b1445
DG
90#define THRESHOLD_EXCEEDED 0x5d
91#define LOW_POWER_COND_ON 0x5e
22017ed2 92#define MISCOMPARE_VERIFY_ASC 0x1d
acafd0b9
EM
93#define MICROCODE_CHANGED_ASCQ 0x1 /* with TARGET_CHANGED_ASC */
94#define MICROCODE_CHANGED_WO_RESET_ASCQ 0x16
1da177e4 95
6f3cbf55
DG
96/* Additional Sense Code Qualifier (ASCQ) */
97#define ACK_NAK_TO 0x3
98
1da177e4
LT
99/* Default values for driver parameters */
100#define DEF_NUM_HOST 1
101#define DEF_NUM_TGTS 1
102#define DEF_MAX_LUNS 1
103/* With these defaults, this driver will make 1 host with 1 target
104 * (id 0) containing 1 logical unit (lun 0). That is 1 device.
105 */
5b94e232 106#define DEF_ATO 1
c2206098 107#define DEF_JDELAY 1 /* if > 0 unit is a jiffy */
1da177e4 108#define DEF_DEV_SIZE_MB 8
5b94e232
MP
109#define DEF_DIF 0
110#define DEF_DIX 0
1da177e4 111#define DEF_D_SENSE 0
5b94e232 112#define DEF_EVERY_NTH 0
23183910 113#define DEF_FAKE_RW 0
c6a44287 114#define DEF_GUARD 0
cbf67842 115#define DEF_HOST_LOCK 0
5b94e232
MP
116#define DEF_LBPU 0
117#define DEF_LBPWS 0
118#define DEF_LBPWS10 0
be1dd78d 119#define DEF_LBPRZ 1
ea61fca5 120#define DEF_LOWEST_ALIGNED 0
cbf67842 121#define DEF_NDELAY 0 /* if > 0 unit is a nanosecond */
5b94e232
MP
122#define DEF_NO_LUN_0 0
123#define DEF_NUM_PARTS 0
124#define DEF_OPTS 0
32c5844a 125#define DEF_OPT_BLKS 1024
5b94e232 126#define DEF_PHYSBLK_EXP 0
b01f6f83 127#define DEF_PTYPE TYPE_DISK
d986788b 128#define DEF_REMOVABLE false
760f3b03 129#define DEF_SCSI_LEVEL 7 /* INQUIRY, byte2 [6->SPC-4; 7->SPC-5] */
5b94e232
MP
130#define DEF_SECTOR_SIZE 512
131#define DEF_UNMAP_ALIGNMENT 0
132#define DEF_UNMAP_GRANULARITY 1
6014759c
MP
133#define DEF_UNMAP_MAX_BLOCKS 0xFFFFFFFF
134#define DEF_UNMAP_MAX_DESC 256
5b94e232
MP
135#define DEF_VIRTUAL_GB 0
136#define DEF_VPD_USE_HOSTNO 1
137#define DEF_WRITESAME_LENGTH 0xFFFF
c2248fc9 138#define DEF_STRICT 0
c4837394
DG
139#define DEF_STATISTICS false
140#define DEF_SUBMIT_QUEUES 1
09ba24c1 141#define DEF_UUID_CTL 0
c2206098 142#define JDELAY_OVERRIDDEN -9999
1da177e4 143
b01f6f83
DG
144#define SDEBUG_LUN_0_VAL 0
145
773642d9
DG
146/* bit mask values for sdebug_opts */
147#define SDEBUG_OPT_NOISE 1
148#define SDEBUG_OPT_MEDIUM_ERR 2
149#define SDEBUG_OPT_TIMEOUT 4
150#define SDEBUG_OPT_RECOVERED_ERR 8
151#define SDEBUG_OPT_TRANSPORT_ERR 16
152#define SDEBUG_OPT_DIF_ERR 32
153#define SDEBUG_OPT_DIX_ERR 64
154#define SDEBUG_OPT_MAC_TIMEOUT 128
155#define SDEBUG_OPT_SHORT_TRANSFER 0x100
156#define SDEBUG_OPT_Q_NOISE 0x200
157#define SDEBUG_OPT_ALL_TSF 0x400
158#define SDEBUG_OPT_RARE_TSF 0x800
159#define SDEBUG_OPT_N_WCE 0x1000
160#define SDEBUG_OPT_RESET_NOISE 0x2000
161#define SDEBUG_OPT_NO_CDB_NOISE 0x4000
162#define SDEBUG_OPT_ALL_NOISE (SDEBUG_OPT_NOISE | SDEBUG_OPT_Q_NOISE | \
163 SDEBUG_OPT_RESET_NOISE)
164#define SDEBUG_OPT_ALL_INJECTING (SDEBUG_OPT_RECOVERED_ERR | \
165 SDEBUG_OPT_TRANSPORT_ERR | \
166 SDEBUG_OPT_DIF_ERR | SDEBUG_OPT_DIX_ERR | \
167 SDEBUG_OPT_SHORT_TRANSFER)
1da177e4 168/* When "every_nth" > 0 then modulo "every_nth" commands:
fd32119b 169 * - a missing response is simulated if SDEBUG_OPT_TIMEOUT is set
1da177e4 170 * - a RECOVERED_ERROR is simulated on successful read and write
773642d9 171 * commands if SDEBUG_OPT_RECOVERED_ERR is set.
6f3cbf55 172 * - a TRANSPORT_ERROR is simulated on successful read and write
773642d9 173 * commands if SDEBUG_OPT_TRANSPORT_ERR is set.
1da177e4
LT
174 *
175 * When "every_nth" < 0 then after "- every_nth" commands:
fd32119b 176 * - a missing response is simulated if SDEBUG_OPT_TIMEOUT is set
1da177e4 177 * - a RECOVERED_ERROR is simulated on successful read and write
773642d9 178 * commands if SDEBUG_OPT_RECOVERED_ERR is set.
6f3cbf55 179 * - a TRANSPORT_ERROR is simulated on successful read and write
773642d9
DG
180 * commands if _DEBUG_OPT_TRANSPORT_ERR is set.
181 * This will continue on every subsequent command until some other action
182 * occurs (e.g. the user * writing a new value (other than -1 or 1) to
183 * every_nth via sysfs).
1da177e4
LT
184 */
185
fd32119b 186/* As indicated in SAM-5 and SPC-4 Unit Attentions (UAs) are returned in
cbf67842
DG
187 * priority order. In the subset implemented here lower numbers have higher
188 * priority. The UA numbers should be a sequence starting from 0 with
189 * SDEBUG_NUM_UAS being 1 higher than the highest numbered UA. */
190#define SDEBUG_UA_POR 0 /* Power on, reset, or bus device reset */
191#define SDEBUG_UA_BUS_RESET 1
192#define SDEBUG_UA_MODE_CHANGED 2
0d01c5df 193#define SDEBUG_UA_CAPACITY_CHANGED 3
19c8ead7 194#define SDEBUG_UA_LUNS_CHANGED 4
acafd0b9
EM
195#define SDEBUG_UA_MICROCODE_CHANGED 5 /* simulate firmware change */
196#define SDEBUG_UA_MICROCODE_CHANGED_WO_RESET 6
197#define SDEBUG_NUM_UAS 7
cbf67842 198
773642d9 199/* when 1==SDEBUG_OPT_MEDIUM_ERR, a medium error is simulated at this
1da177e4
LT
200 * sector on read commands: */
201#define OPT_MEDIUM_ERR_ADDR 0x1234 /* that's sector 4660 in decimal */
32f7ef73 202#define OPT_MEDIUM_ERR_NUM 10 /* number of consecutive medium errs */
1da177e4
LT
203
204/* If REPORT LUNS has luns >= 256 it can choose "flat space" (value 1)
205 * or "peripheral device" addressing (value 0) */
206#define SAM2_LUN_ADDRESS_METHOD 0
207
c4837394
DG
208/* SDEBUG_CANQUEUE is the maximum number of commands that can be queued
209 * (for response) per submit queue at one time. Can be reduced by max_queue
210 * option. Command responses are not queued when jdelay=0 and ndelay=0. The
211 * per-device DEF_CMD_PER_LUN can be changed via sysfs:
212 * /sys/class/scsi_device/<h:c:t:l>/device/queue_depth
213 * but cannot exceed SDEBUG_CANQUEUE .
214 */
215#define SDEBUG_CANQUEUE_WORDS 3 /* a WORD is bits in a long */
216#define SDEBUG_CANQUEUE (SDEBUG_CANQUEUE_WORDS * BITS_PER_LONG)
cbf67842
DG
217#define DEF_CMD_PER_LUN 255
218
fd32119b
DG
219#define F_D_IN 1
220#define F_D_OUT 2
221#define F_D_OUT_MAYBE 4 /* WRITE SAME, NDOB bit */
222#define F_D_UNKN 8
223#define F_RL_WLUN_OK 0x10
224#define F_SKIP_UA 0x20
225#define F_DELAY_OVERR 0x40
226#define F_SA_LOW 0x80 /* cdb byte 1, bits 4 to 0 */
227#define F_SA_HIGH 0x100 /* as used by variable length cdbs */
228#define F_INV_OP 0x200
229#define F_FAKE_RW 0x400
230#define F_M_ACCESS 0x800 /* media access */
231
232#define FF_RESPOND (F_RL_WLUN_OK | F_SKIP_UA | F_DELAY_OVERR)
233#define FF_DIRECT_IO (F_M_ACCESS | F_FAKE_RW)
234#define FF_SA (F_SA_HIGH | F_SA_LOW)
235
236#define SDEBUG_MAX_PARTS 4
237
b01f6f83 238#define SDEBUG_MAX_CMD_LEN 32
fd32119b
DG
239
240
241struct sdebug_dev_info {
242 struct list_head dev_list;
243 unsigned int channel;
244 unsigned int target;
245 u64 lun;
09ba24c1 246 uuid_be lu_name;
fd32119b
DG
247 struct sdebug_host_info *sdbg_host;
248 unsigned long uas_bm[1];
249 atomic_t num_in_q;
c4837394 250 atomic_t stopped;
fd32119b
DG
251 bool used;
252};
253
254struct sdebug_host_info {
255 struct list_head host_list;
256 struct Scsi_Host *shost;
257 struct device dev;
258 struct list_head dev_info_list;
259};
260
261#define to_sdebug_host(d) \
262 container_of(d, struct sdebug_host_info, dev)
263
264struct sdebug_defer {
265 struct hrtimer hrt;
266 struct execute_work ew;
c4837394
DG
267 int sqa_idx; /* index of sdebug_queue array */
268 int qc_idx; /* index of sdebug_queued_cmd array within sqa_idx */
269 int issuing_cpu;
fd32119b
DG
270};
271
272struct sdebug_queued_cmd {
c4837394
DG
273 /* corresponding bit set in in_use_bm[] in owning struct sdebug_queue
274 * instance indicates this slot is in use.
275 */
fd32119b
DG
276 struct sdebug_defer *sd_dp;
277 struct scsi_cmnd *a_cmnd;
c4837394
DG
278 unsigned int inj_recovered:1;
279 unsigned int inj_transport:1;
280 unsigned int inj_dif:1;
281 unsigned int inj_dix:1;
282 unsigned int inj_short:1;
fd32119b
DG
283};
284
c4837394
DG
285struct sdebug_queue {
286 struct sdebug_queued_cmd qc_arr[SDEBUG_CANQUEUE];
287 unsigned long in_use_bm[SDEBUG_CANQUEUE_WORDS];
288 spinlock_t qc_lock;
289 atomic_t blocked; /* to temporarily stop more being queued */
fd32119b
DG
290};
291
c4837394
DG
292static atomic_t sdebug_cmnd_count; /* number of incoming commands */
293static atomic_t sdebug_completions; /* count of deferred completions */
294static atomic_t sdebug_miss_cpus; /* submission + completion cpus differ */
295static atomic_t sdebug_a_tsf; /* 'almost task set full' counter */
296
fd32119b 297struct opcode_info_t {
b01f6f83
DG
298 u8 num_attached; /* 0 if this is it (i.e. a leaf); use 0xff */
299 /* for terminating element */
fd32119b
DG
300 u8 opcode; /* if num_attached > 0, preferred */
301 u16 sa; /* service action */
302 u32 flags; /* OR-ed set of SDEB_F_* */
303 int (*pfp)(struct scsi_cmnd *, struct sdebug_dev_info *);
304 const struct opcode_info_t *arrp; /* num_attached elements or NULL */
305 u8 len_mask[16]; /* len=len_mask[0], then mask for cdb[1]... */
306 /* ignore cdb bytes after position 15 */
307};
308
309/* SCSI opcodes (first byte of cdb) of interest mapped onto these indexes */
c2248fc9
DG
310enum sdeb_opcode_index {
311 SDEB_I_INVALID_OPCODE = 0,
312 SDEB_I_INQUIRY = 1,
313 SDEB_I_REPORT_LUNS = 2,
314 SDEB_I_REQUEST_SENSE = 3,
315 SDEB_I_TEST_UNIT_READY = 4,
316 SDEB_I_MODE_SENSE = 5, /* 6, 10 */
317 SDEB_I_MODE_SELECT = 6, /* 6, 10 */
318 SDEB_I_LOG_SENSE = 7,
319 SDEB_I_READ_CAPACITY = 8, /* 10; 16 is in SA_IN(16) */
320 SDEB_I_READ = 9, /* 6, 10, 12, 16 */
321 SDEB_I_WRITE = 10, /* 6, 10, 12, 16 */
322 SDEB_I_START_STOP = 11,
323 SDEB_I_SERV_ACT_IN = 12, /* 12, 16 */
324 SDEB_I_SERV_ACT_OUT = 13, /* 12, 16 */
325 SDEB_I_MAINT_IN = 14,
326 SDEB_I_MAINT_OUT = 15,
327 SDEB_I_VERIFY = 16, /* 10 only */
328 SDEB_I_VARIABLE_LEN = 17,
329 SDEB_I_RESERVE = 18, /* 6, 10 */
330 SDEB_I_RELEASE = 19, /* 6, 10 */
331 SDEB_I_ALLOW_REMOVAL = 20, /* PREVENT ALLOW MEDIUM REMOVAL */
332 SDEB_I_REZERO_UNIT = 21, /* REWIND in SSC */
333 SDEB_I_ATA_PT = 22, /* 12, 16 */
334 SDEB_I_SEND_DIAG = 23,
335 SDEB_I_UNMAP = 24,
336 SDEB_I_XDWRITEREAD = 25, /* 10 only */
337 SDEB_I_WRITE_BUFFER = 26,
338 SDEB_I_WRITE_SAME = 27, /* 10, 16 */
339 SDEB_I_SYNC_CACHE = 28, /* 10 only */
340 SDEB_I_COMP_WRITE = 29,
341 SDEB_I_LAST_ELEMENT = 30, /* keep this last */
342};
343
c4837394 344
c2248fc9
DG
345static const unsigned char opcode_ind_arr[256] = {
346/* 0x0; 0x0->0x1f: 6 byte cdbs */
347 SDEB_I_TEST_UNIT_READY, SDEB_I_REZERO_UNIT, 0, SDEB_I_REQUEST_SENSE,
348 0, 0, 0, 0,
349 SDEB_I_READ, 0, SDEB_I_WRITE, 0, 0, 0, 0, 0,
350 0, 0, SDEB_I_INQUIRY, 0, 0, SDEB_I_MODE_SELECT, SDEB_I_RESERVE,
351 SDEB_I_RELEASE,
352 0, 0, SDEB_I_MODE_SENSE, SDEB_I_START_STOP, 0, SDEB_I_SEND_DIAG,
353 SDEB_I_ALLOW_REMOVAL, 0,
354/* 0x20; 0x20->0x3f: 10 byte cdbs */
355 0, 0, 0, 0, 0, SDEB_I_READ_CAPACITY, 0, 0,
356 SDEB_I_READ, 0, SDEB_I_WRITE, 0, 0, 0, 0, SDEB_I_VERIFY,
357 0, 0, 0, 0, 0, SDEB_I_SYNC_CACHE, 0, 0,
358 0, 0, 0, SDEB_I_WRITE_BUFFER, 0, 0, 0, 0,
359/* 0x40; 0x40->0x5f: 10 byte cdbs */
360 0, SDEB_I_WRITE_SAME, SDEB_I_UNMAP, 0, 0, 0, 0, 0,
361 0, 0, 0, 0, 0, SDEB_I_LOG_SENSE, 0, 0,
362 0, 0, 0, SDEB_I_XDWRITEREAD, 0, SDEB_I_MODE_SELECT, SDEB_I_RESERVE,
363 SDEB_I_RELEASE,
364 0, 0, SDEB_I_MODE_SENSE, 0, 0, 0, 0, 0,
fd32119b 365/* 0x60; 0x60->0x7d are reserved, 0x7e is "extended cdb" */
c2248fc9
DG
366 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
367 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
368 0, SDEB_I_VARIABLE_LEN,
369/* 0x80; 0x80->0x9f: 16 byte cdbs */
370 0, 0, 0, 0, 0, SDEB_I_ATA_PT, 0, 0,
371 SDEB_I_READ, SDEB_I_COMP_WRITE, SDEB_I_WRITE, 0, 0, 0, 0, 0,
372 0, 0, 0, SDEB_I_WRITE_SAME, 0, 0, 0, 0,
373 0, 0, 0, 0, 0, 0, SDEB_I_SERV_ACT_IN, SDEB_I_SERV_ACT_OUT,
374/* 0xa0; 0xa0->0xbf: 12 byte cdbs */
375 SDEB_I_REPORT_LUNS, SDEB_I_ATA_PT, 0, SDEB_I_MAINT_IN,
376 SDEB_I_MAINT_OUT, 0, 0, 0,
377 SDEB_I_READ, SDEB_I_SERV_ACT_OUT, SDEB_I_WRITE, SDEB_I_SERV_ACT_IN,
378 0, 0, 0, 0,
379 0, 0, 0, 0, 0, 0, 0, 0,
380 0, 0, 0, 0, 0, 0, 0, 0,
381/* 0xc0; 0xc0->0xff: vendor specific */
382 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
383 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
384 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
385 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
386};
387
c2248fc9
DG
388static int resp_inquiry(struct scsi_cmnd *, struct sdebug_dev_info *);
389static int resp_report_luns(struct scsi_cmnd *, struct sdebug_dev_info *);
390static int resp_requests(struct scsi_cmnd *, struct sdebug_dev_info *);
391static int resp_mode_sense(struct scsi_cmnd *, struct sdebug_dev_info *);
392static int resp_mode_select(struct scsi_cmnd *, struct sdebug_dev_info *);
393static int resp_log_sense(struct scsi_cmnd *, struct sdebug_dev_info *);
394static int resp_readcap(struct scsi_cmnd *, struct sdebug_dev_info *);
395static int resp_read_dt0(struct scsi_cmnd *, struct sdebug_dev_info *);
396static int resp_write_dt0(struct scsi_cmnd *, struct sdebug_dev_info *);
397static int resp_start_stop(struct scsi_cmnd *, struct sdebug_dev_info *);
398static int resp_readcap16(struct scsi_cmnd *, struct sdebug_dev_info *);
399static int resp_get_lba_status(struct scsi_cmnd *, struct sdebug_dev_info *);
400static int resp_report_tgtpgs(struct scsi_cmnd *, struct sdebug_dev_info *);
401static int resp_unmap(struct scsi_cmnd *, struct sdebug_dev_info *);
38d5c833
DG
402static int resp_rsup_opcodes(struct scsi_cmnd *, struct sdebug_dev_info *);
403static int resp_rsup_tmfs(struct scsi_cmnd *, struct sdebug_dev_info *);
c2248fc9
DG
404static int resp_write_same_10(struct scsi_cmnd *, struct sdebug_dev_info *);
405static int resp_write_same_16(struct scsi_cmnd *, struct sdebug_dev_info *);
406static int resp_xdwriteread_10(struct scsi_cmnd *, struct sdebug_dev_info *);
38d5c833 407static int resp_comp_write(struct scsi_cmnd *, struct sdebug_dev_info *);
acafd0b9 408static int resp_write_buffer(struct scsi_cmnd *, struct sdebug_dev_info *);
c2248fc9 409
c2248fc9
DG
410static const struct opcode_info_t msense_iarr[1] = {
411 {0, 0x1a, 0, F_D_IN, NULL, NULL,
412 {6, 0xe8, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
413};
414
415static const struct opcode_info_t mselect_iarr[1] = {
416 {0, 0x15, 0, F_D_OUT, NULL, NULL,
417 {6, 0xf1, 0, 0, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
418};
419
420static const struct opcode_info_t read_iarr[3] = {
421 {0, 0x28, 0, F_D_IN | FF_DIRECT_IO, resp_read_dt0, NULL,/* READ(10) */
422 {10, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xc7, 0, 0,
423 0, 0, 0, 0} },
424 {0, 0x8, 0, F_D_IN | FF_DIRECT_IO, resp_read_dt0, NULL, /* READ(6) */
425 {6, 0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
426 {0, 0xa8, 0, F_D_IN | FF_DIRECT_IO, resp_read_dt0, NULL,/* READ(12) */
427 {12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f,
428 0xc7, 0, 0, 0, 0} },
429};
430
431static const struct opcode_info_t write_iarr[3] = {
432 {0, 0x2a, 0, F_D_OUT | FF_DIRECT_IO, resp_write_dt0, NULL, /* 10 */
433 {10, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xc7, 0, 0,
434 0, 0, 0, 0} },
435 {0, 0xa, 0, F_D_OUT | FF_DIRECT_IO, resp_write_dt0, NULL, /* 6 */
436 {6, 0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
437 {0, 0xaa, 0, F_D_OUT | FF_DIRECT_IO, resp_write_dt0, NULL, /* 12 */
438 {12, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f,
439 0xc7, 0, 0, 0, 0} },
440};
441
442static const struct opcode_info_t sa_in_iarr[1] = {
443 {0, 0x9e, 0x12, F_SA_LOW | F_D_IN, resp_get_lba_status, NULL,
444 {16, 0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
445 0xff, 0xff, 0xff, 0, 0xc7} },
446};
447
448static const struct opcode_info_t vl_iarr[1] = { /* VARIABLE LENGTH */
449 {0, 0x7f, 0xb, F_SA_HIGH | F_D_OUT | FF_DIRECT_IO, resp_write_dt0,
450 NULL, {32, 0xc7, 0, 0, 0, 0, 0x1f, 0x18, 0x0, 0xb, 0xfa,
451 0, 0xff, 0xff, 0xff, 0xff} }, /* WRITE(32) */
452};
453
454static const struct opcode_info_t maint_in_iarr[2] = {
38d5c833 455 {0, 0xa3, 0xc, F_SA_LOW | F_D_IN, resp_rsup_opcodes, NULL,
c2248fc9
DG
456 {12, 0xc, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0,
457 0xc7, 0, 0, 0, 0} },
38d5c833 458 {0, 0xa3, 0xd, F_SA_LOW | F_D_IN, resp_rsup_tmfs, NULL,
c2248fc9
DG
459 {12, 0xd, 0x80, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0xc7, 0, 0,
460 0, 0} },
461};
462
463static const struct opcode_info_t write_same_iarr[1] = {
464 {0, 0x93, 0, F_D_OUT_MAYBE | FF_DIRECT_IO, resp_write_same_16, NULL,
465 {16, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
466 0xff, 0xff, 0xff, 0x1f, 0xc7} },
467};
468
469static const struct opcode_info_t reserve_iarr[1] = {
470 {0, 0x16, 0, F_D_OUT, NULL, NULL, /* RESERVE(6) */
471 {6, 0x1f, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
472};
473
474static const struct opcode_info_t release_iarr[1] = {
475 {0, 0x17, 0, F_D_OUT, NULL, NULL, /* RELEASE(6) */
476 {6, 0x1f, 0xff, 0, 0, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
477};
478
479
480/* This array is accessed via SDEB_I_* values. Make sure all are mapped,
481 * plus the terminating elements for logic that scans this table such as
482 * REPORT SUPPORTED OPERATION CODES. */
483static const struct opcode_info_t opcode_info_arr[SDEB_I_LAST_ELEMENT + 1] = {
484/* 0 */
485 {0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL,
486 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
487 {0, 0x12, 0, FF_RESPOND | F_D_IN, resp_inquiry, NULL,
488 {6, 0xe3, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
489 {0, 0xa0, 0, FF_RESPOND | F_D_IN, resp_report_luns, NULL,
490 {12, 0xe3, 0xff, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0xc7, 0, 0,
491 0, 0} },
492 {0, 0x3, 0, FF_RESPOND | F_D_IN, resp_requests, NULL,
493 {6, 0xe1, 0, 0, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
494 {0, 0x0, 0, F_M_ACCESS | F_RL_WLUN_OK, NULL, NULL,/* TEST UNIT READY */
495 {6, 0, 0, 0, 0, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
496 {1, 0x5a, 0, F_D_IN, resp_mode_sense, msense_iarr,
497 {10, 0xf8, 0xff, 0xff, 0, 0, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0,
498 0} },
499 {1, 0x55, 0, F_D_OUT, resp_mode_select, mselect_iarr,
500 {10, 0xf1, 0, 0, 0, 0, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0} },
501 {0, 0x4d, 0, F_D_IN, resp_log_sense, NULL,
502 {10, 0xe3, 0xff, 0xff, 0, 0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0,
503 0, 0, 0} },
504 {0, 0x25, 0, F_D_IN, resp_readcap, NULL,
505 {10, 0xe1, 0xff, 0xff, 0xff, 0xff, 0, 0, 0x1, 0xc7, 0, 0, 0, 0,
506 0, 0} },
507 {3, 0x88, 0, F_D_IN | FF_DIRECT_IO, resp_read_dt0, read_iarr,
508 {16, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
509 0xff, 0xff, 0xff, 0x9f, 0xc7} }, /* READ(16) */
510/* 10 */
511 {3, 0x8a, 0, F_D_OUT | FF_DIRECT_IO, resp_write_dt0, write_iarr,
512 {16, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
513 0xff, 0xff, 0xff, 0x9f, 0xc7} }, /* WRITE(16) */
514 {0, 0x1b, 0, 0, resp_start_stop, NULL, /* START STOP UNIT */
515 {6, 0x1, 0, 0xf, 0xf7, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
516 {1, 0x9e, 0x10, F_SA_LOW | F_D_IN, resp_readcap16, sa_in_iarr,
517 {16, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
518 0xff, 0xff, 0xff, 0x1, 0xc7} }, /* READ CAPACITY(16) */
519 {0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL, /* SA OUT */
520 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
521 {2, 0xa3, 0xa, F_SA_LOW | F_D_IN, resp_report_tgtpgs, maint_in_iarr,
522 {12, 0xea, 0, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0xc7, 0, 0, 0,
523 0} },
524 {0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL, /* MAINT OUT */
525 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
f7f9f26b
DG
526 {0, 0x2f, 0, F_D_OUT_MAYBE | FF_DIRECT_IO, NULL, NULL, /* VERIFY(10) */
527 {10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7,
528 0, 0, 0, 0, 0, 0} },
c2248fc9
DG
529 {1, 0x7f, 0x9, F_SA_HIGH | F_D_IN | FF_DIRECT_IO, resp_read_dt0,
530 vl_iarr, {32, 0xc7, 0, 0, 0, 0, 0x1f, 0x18, 0x0, 0x9, 0xfe, 0,
531 0xff, 0xff, 0xff, 0xff} },/* VARIABLE LENGTH, READ(32) */
532 {1, 0x56, 0, F_D_OUT, NULL, reserve_iarr, /* RESERVE(10) */
533 {10, 0xff, 0xff, 0xff, 0, 0, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0,
534 0} },
535 {1, 0x57, 0, F_D_OUT, NULL, release_iarr, /* RELEASE(10) */
536 {10, 0x13, 0xff, 0xff, 0, 0, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0,
537 0} },
538/* 20 */
f7f9f26b
DG
539 {0, 0x1e, 0, 0, NULL, NULL, /* ALLOW REMOVAL */
540 {6, 0, 0, 0, 0x3, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
c2248fc9
DG
541 {0, 0x1, 0, 0, resp_start_stop, NULL, /* REWIND ?? */
542 {6, 0x1, 0, 0, 0, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
543 {0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL, /* ATA_PT */
544 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
545 {0, 0x1d, F_D_OUT, 0, NULL, NULL, /* SEND DIAGNOSTIC */
546 {6, 0xf7, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
547 {0, 0x42, 0, F_D_OUT | FF_DIRECT_IO, resp_unmap, NULL, /* UNMAP */
548 {10, 0x1, 0, 0, 0, 0, 0x1f, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0} },
549 {0, 0x53, 0, F_D_IN | F_D_OUT | FF_DIRECT_IO, resp_xdwriteread_10,
550 NULL, {10, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xc7,
551 0, 0, 0, 0, 0, 0} },
acafd0b9
EM
552 {0, 0x3b, 0, F_D_OUT_MAYBE, resp_write_buffer, NULL,
553 {10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0,
554 0, 0, 0, 0} }, /* WRITE_BUFFER */
c2248fc9
DG
555 {1, 0x41, 0, F_D_OUT_MAYBE | FF_DIRECT_IO, resp_write_same_10,
556 write_same_iarr, {10, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff,
557 0xff, 0xc7, 0, 0, 0, 0, 0, 0} },
558 {0, 0x35, 0, F_DELAY_OVERR | FF_DIRECT_IO, NULL, NULL, /* SYNC_CACHE */
559 {10, 0x7, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xc7, 0, 0,
560 0, 0, 0, 0} },
38d5c833 561 {0, 0x89, 0, F_D_OUT | FF_DIRECT_IO, resp_comp_write, NULL,
c2248fc9
DG
562 {16, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0,
563 0, 0xff, 0x1f, 0xc7} }, /* COMPARE AND WRITE */
564
565/* 30 */
566 {0xff, 0, 0, 0, NULL, NULL, /* terminating element */
567 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
568};
569
773642d9
DG
570static int sdebug_add_host = DEF_NUM_HOST;
571static int sdebug_ato = DEF_ATO;
c2206098 572static int sdebug_jdelay = DEF_JDELAY; /* if > 0 then unit is jiffies */
773642d9
DG
573static int sdebug_dev_size_mb = DEF_DEV_SIZE_MB;
574static int sdebug_dif = DEF_DIF;
575static int sdebug_dix = DEF_DIX;
576static int sdebug_dsense = DEF_D_SENSE;
577static int sdebug_every_nth = DEF_EVERY_NTH;
578static int sdebug_fake_rw = DEF_FAKE_RW;
579static unsigned int sdebug_guard = DEF_GUARD;
580static int sdebug_lowest_aligned = DEF_LOWEST_ALIGNED;
581static int sdebug_max_luns = DEF_MAX_LUNS;
c4837394 582static int sdebug_max_queue = SDEBUG_CANQUEUE; /* per submit queue */
cbf67842 583static atomic_t retired_max_queue; /* if > 0 then was prior max_queue */
c2206098 584static int sdebug_ndelay = DEF_NDELAY; /* if > 0 then unit is nanoseconds */
773642d9
DG
585static int sdebug_no_lun_0 = DEF_NO_LUN_0;
586static int sdebug_no_uld;
587static int sdebug_num_parts = DEF_NUM_PARTS;
588static int sdebug_num_tgts = DEF_NUM_TGTS; /* targets per host */
589static int sdebug_opt_blks = DEF_OPT_BLKS;
590static int sdebug_opts = DEF_OPTS;
591static int sdebug_physblk_exp = DEF_PHYSBLK_EXP;
b01f6f83 592static int sdebug_ptype = DEF_PTYPE; /* SCSI peripheral device type */
773642d9
DG
593static int sdebug_scsi_level = DEF_SCSI_LEVEL;
594static int sdebug_sector_size = DEF_SECTOR_SIZE;
595static int sdebug_virtual_gb = DEF_VIRTUAL_GB;
596static int sdebug_vpd_use_hostno = DEF_VPD_USE_HOSTNO;
597static unsigned int sdebug_lbpu = DEF_LBPU;
598static unsigned int sdebug_lbpws = DEF_LBPWS;
599static unsigned int sdebug_lbpws10 = DEF_LBPWS10;
600static unsigned int sdebug_lbprz = DEF_LBPRZ;
601static unsigned int sdebug_unmap_alignment = DEF_UNMAP_ALIGNMENT;
602static unsigned int sdebug_unmap_granularity = DEF_UNMAP_GRANULARITY;
603static unsigned int sdebug_unmap_max_blocks = DEF_UNMAP_MAX_BLOCKS;
604static unsigned int sdebug_unmap_max_desc = DEF_UNMAP_MAX_DESC;
605static unsigned int sdebug_write_same_length = DEF_WRITESAME_LENGTH;
09ba24c1 606static int sdebug_uuid_ctl = DEF_UUID_CTL;
773642d9
DG
607static bool sdebug_removable = DEF_REMOVABLE;
608static bool sdebug_clustering;
609static bool sdebug_host_lock = DEF_HOST_LOCK;
610static bool sdebug_strict = DEF_STRICT;
817fd66b 611static bool sdebug_any_injecting_opt;
773642d9 612static bool sdebug_verbose;
f46eb0e9 613static bool have_dif_prot;
c4837394
DG
614static bool sdebug_statistics = DEF_STATISTICS;
615static bool sdebug_mq_active;
1da177e4 616
c65b1445 617static unsigned int sdebug_store_sectors;
1da177e4
LT
618static sector_t sdebug_capacity; /* in sectors */
619
620/* old BIOS stuff, kernel may get rid of them but some mode sense pages
621 may still need them */
622static int sdebug_heads; /* heads per disk */
623static int sdebug_cylinders_per; /* cylinders per surface */
624static int sdebug_sectors_per; /* sectors per cylinder */
625
1da177e4
LT
626static LIST_HEAD(sdebug_host_list);
627static DEFINE_SPINLOCK(sdebug_host_list_lock);
628
fd32119b 629static unsigned char *fake_storep; /* ramdisk storage */
e18d8bea 630static struct sd_dif_tuple *dif_storep; /* protection info */
44d92694 631static void *map_storep; /* provisioning map */
1da177e4 632
44d92694 633static unsigned long map_size;
cbf67842
DG
634static int num_aborts;
635static int num_dev_resets;
636static int num_target_resets;
637static int num_bus_resets;
638static int num_host_resets;
c6a44287
MP
639static int dix_writes;
640static int dix_reads;
641static int dif_errors;
1da177e4 642
c4837394
DG
643static int submit_queues = DEF_SUBMIT_QUEUES; /* > 1 for multi-queue (mq) */
644static struct sdebug_queue *sdebug_q_arr; /* ptr to array of submit queues */
fd32119b 645
1da177e4
LT
646static DEFINE_RWLOCK(atomic_rw);
647
cbf67842
DG
648static char sdebug_proc_name[] = MY_NAME;
649static const char *my_name = MY_NAME;
1da177e4 650
1da177e4
LT
651static struct bus_type pseudo_lld_bus;
652
653static struct device_driver sdebug_driverfs_driver = {
654 .name = sdebug_proc_name,
655 .bus = &pseudo_lld_bus,
1da177e4
LT
656};
657
658static const int check_condition_result =
659 (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
660
c6a44287
MP
661static const int illegal_condition_result =
662 (DRIVER_SENSE << 24) | (DID_ABORT << 16) | SAM_STAT_CHECK_CONDITION;
663
cbf67842
DG
664static const int device_qfull_result =
665 (DID_OK << 16) | (COMMAND_COMPLETE << 8) | SAM_STAT_TASK_SET_FULL;
666
fd32119b 667
760f3b03
DG
668/* Only do the extra work involved in logical block provisioning if one or
669 * more of the lbpu, lbpws or lbpws10 parameters are given and we are doing
670 * real reads and writes (i.e. not skipping them for speed).
671 */
672static inline bool scsi_debug_lbp(void)
fd32119b
DG
673{
674 return 0 == sdebug_fake_rw &&
675 (sdebug_lbpu || sdebug_lbpws || sdebug_lbpws10);
676}
c65b1445 677
14faa944
AM
678static void *fake_store(unsigned long long lba)
679{
680 lba = do_div(lba, sdebug_store_sectors);
681
773642d9 682 return fake_storep + lba * sdebug_sector_size;
14faa944
AM
683}
684
685static struct sd_dif_tuple *dif_store(sector_t sector)
686{
49413112 687 sector = sector_div(sector, sdebug_store_sectors);
14faa944
AM
688
689 return dif_storep + sector;
690}
691
8dea0d02
FT
692static void sdebug_max_tgts_luns(void)
693{
694 struct sdebug_host_info *sdbg_host;
695 struct Scsi_Host *hpnt;
696
697 spin_lock(&sdebug_host_list_lock);
698 list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
699 hpnt = sdbg_host->shost;
700 if ((hpnt->this_id >= 0) &&
773642d9
DG
701 (sdebug_num_tgts > hpnt->this_id))
702 hpnt->max_id = sdebug_num_tgts + 1;
8dea0d02 703 else
773642d9
DG
704 hpnt->max_id = sdebug_num_tgts;
705 /* sdebug_max_luns; */
f2d3fd29 706 hpnt->max_lun = SCSI_W_LUN_REPORT_LUNS + 1;
8dea0d02
FT
707 }
708 spin_unlock(&sdebug_host_list_lock);
709}
710
22017ed2
DG
711enum sdeb_cmd_data {SDEB_IN_DATA = 0, SDEB_IN_CDB = 1};
712
713/* Set in_bit to -1 to indicate no bit position of invalid field */
fd32119b
DG
714static void mk_sense_invalid_fld(struct scsi_cmnd *scp,
715 enum sdeb_cmd_data c_d,
716 int in_byte, int in_bit)
22017ed2
DG
717{
718 unsigned char *sbuff;
719 u8 sks[4];
720 int sl, asc;
721
722 sbuff = scp->sense_buffer;
723 if (!sbuff) {
724 sdev_printk(KERN_ERR, scp->device,
725 "%s: sense_buffer is NULL\n", __func__);
726 return;
727 }
728 asc = c_d ? INVALID_FIELD_IN_CDB : INVALID_FIELD_IN_PARAM_LIST;
729 memset(sbuff, 0, SCSI_SENSE_BUFFERSIZE);
773642d9 730 scsi_build_sense_buffer(sdebug_dsense, sbuff, ILLEGAL_REQUEST, asc, 0);
22017ed2
DG
731 memset(sks, 0, sizeof(sks));
732 sks[0] = 0x80;
733 if (c_d)
734 sks[0] |= 0x40;
735 if (in_bit >= 0) {
736 sks[0] |= 0x8;
737 sks[0] |= 0x7 & in_bit;
738 }
739 put_unaligned_be16(in_byte, sks + 1);
773642d9 740 if (sdebug_dsense) {
22017ed2
DG
741 sl = sbuff[7] + 8;
742 sbuff[7] = sl;
743 sbuff[sl] = 0x2;
744 sbuff[sl + 1] = 0x6;
745 memcpy(sbuff + sl + 4, sks, 3);
746 } else
747 memcpy(sbuff + 15, sks, 3);
773642d9 748 if (sdebug_verbose)
22017ed2
DG
749 sdev_printk(KERN_INFO, scp->device, "%s: [sense_key,asc,ascq"
750 "]: [0x5,0x%x,0x0] %c byte=%d, bit=%d\n",
751 my_name, asc, c_d ? 'C' : 'D', in_byte, in_bit);
752}
753
cbf67842 754static void mk_sense_buffer(struct scsi_cmnd *scp, int key, int asc, int asq)
8dea0d02
FT
755{
756 unsigned char *sbuff;
757
cbf67842
DG
758 sbuff = scp->sense_buffer;
759 if (!sbuff) {
760 sdev_printk(KERN_ERR, scp->device,
761 "%s: sense_buffer is NULL\n", __func__);
762 return;
763 }
764 memset(sbuff, 0, SCSI_SENSE_BUFFERSIZE);
8dea0d02 765
773642d9 766 scsi_build_sense_buffer(sdebug_dsense, sbuff, key, asc, asq);
8dea0d02 767
773642d9 768 if (sdebug_verbose)
cbf67842
DG
769 sdev_printk(KERN_INFO, scp->device,
770 "%s: [sense_key,asc,ascq]: [0x%x,0x%x,0x%x]\n",
771 my_name, key, asc, asq);
8dea0d02 772}
1da177e4 773
fd32119b 774static void mk_sense_invalid_opcode(struct scsi_cmnd *scp)
22017ed2
DG
775{
776 mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_OPCODE, 0);
777}
778
1da177e4
LT
779static int scsi_debug_ioctl(struct scsi_device *dev, int cmd, void __user *arg)
780{
773642d9 781 if (sdebug_verbose) {
cbf67842
DG
782 if (0x1261 == cmd)
783 sdev_printk(KERN_INFO, dev,
784 "%s: BLKFLSBUF [0x1261]\n", __func__);
785 else if (0x5331 == cmd)
786 sdev_printk(KERN_INFO, dev,
787 "%s: CDROM_GET_CAPABILITY [0x5331]\n",
788 __func__);
789 else
790 sdev_printk(KERN_INFO, dev, "%s: cmd=0x%x\n",
791 __func__, cmd);
1da177e4
LT
792 }
793 return -EINVAL;
794 /* return -ENOTTY; // correct return but upsets fdisk */
795}
796
19c8ead7
EM
797static void clear_luns_changed_on_target(struct sdebug_dev_info *devip)
798{
799 struct sdebug_host_info *sdhp;
800 struct sdebug_dev_info *dp;
801
802 spin_lock(&sdebug_host_list_lock);
803 list_for_each_entry(sdhp, &sdebug_host_list, host_list) {
804 list_for_each_entry(dp, &sdhp->dev_info_list, dev_list) {
805 if ((devip->sdbg_host == dp->sdbg_host) &&
806 (devip->target == dp->target))
807 clear_bit(SDEBUG_UA_LUNS_CHANGED, dp->uas_bm);
808 }
809 }
810 spin_unlock(&sdebug_host_list_lock);
811}
812
f46eb0e9 813static int make_ua(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
1da177e4 814{
cbf67842 815 int k;
cbf67842
DG
816
817 k = find_first_bit(devip->uas_bm, SDEBUG_NUM_UAS);
818 if (k != SDEBUG_NUM_UAS) {
819 const char *cp = NULL;
820
821 switch (k) {
822 case SDEBUG_UA_POR:
f46eb0e9
DG
823 mk_sense_buffer(scp, UNIT_ATTENTION, UA_RESET_ASC,
824 POWER_ON_RESET_ASCQ);
773642d9 825 if (sdebug_verbose)
cbf67842
DG
826 cp = "power on reset";
827 break;
828 case SDEBUG_UA_BUS_RESET:
f46eb0e9
DG
829 mk_sense_buffer(scp, UNIT_ATTENTION, UA_RESET_ASC,
830 BUS_RESET_ASCQ);
773642d9 831 if (sdebug_verbose)
cbf67842
DG
832 cp = "bus reset";
833 break;
834 case SDEBUG_UA_MODE_CHANGED:
f46eb0e9
DG
835 mk_sense_buffer(scp, UNIT_ATTENTION, UA_CHANGED_ASC,
836 MODE_CHANGED_ASCQ);
773642d9 837 if (sdebug_verbose)
cbf67842
DG
838 cp = "mode parameters changed";
839 break;
0d01c5df 840 case SDEBUG_UA_CAPACITY_CHANGED:
f46eb0e9
DG
841 mk_sense_buffer(scp, UNIT_ATTENTION, UA_CHANGED_ASC,
842 CAPACITY_CHANGED_ASCQ);
773642d9 843 if (sdebug_verbose)
0d01c5df 844 cp = "capacity data changed";
f49accf1 845 break;
acafd0b9 846 case SDEBUG_UA_MICROCODE_CHANGED:
f46eb0e9 847 mk_sense_buffer(scp, UNIT_ATTENTION,
b01f6f83
DG
848 TARGET_CHANGED_ASC,
849 MICROCODE_CHANGED_ASCQ);
773642d9 850 if (sdebug_verbose)
acafd0b9
EM
851 cp = "microcode has been changed";
852 break;
853 case SDEBUG_UA_MICROCODE_CHANGED_WO_RESET:
f46eb0e9 854 mk_sense_buffer(scp, UNIT_ATTENTION,
acafd0b9
EM
855 TARGET_CHANGED_ASC,
856 MICROCODE_CHANGED_WO_RESET_ASCQ);
773642d9 857 if (sdebug_verbose)
acafd0b9
EM
858 cp = "microcode has been changed without reset";
859 break;
19c8ead7
EM
860 case SDEBUG_UA_LUNS_CHANGED:
861 /*
862 * SPC-3 behavior is to report a UNIT ATTENTION with
863 * ASC/ASCQ REPORTED LUNS DATA HAS CHANGED on every LUN
864 * on the target, until a REPORT LUNS command is
865 * received. SPC-4 behavior is to report it only once.
773642d9 866 * NOTE: sdebug_scsi_level does not use the same
19c8ead7
EM
867 * values as struct scsi_device->scsi_level.
868 */
773642d9 869 if (sdebug_scsi_level >= 6) /* SPC-4 and above */
19c8ead7 870 clear_luns_changed_on_target(devip);
f46eb0e9 871 mk_sense_buffer(scp, UNIT_ATTENTION,
19c8ead7
EM
872 TARGET_CHANGED_ASC,
873 LUNS_CHANGED_ASCQ);
773642d9 874 if (sdebug_verbose)
19c8ead7
EM
875 cp = "reported luns data has changed";
876 break;
cbf67842 877 default:
773642d9
DG
878 pr_warn("unexpected unit attention code=%d\n", k);
879 if (sdebug_verbose)
cbf67842
DG
880 cp = "unknown";
881 break;
882 }
883 clear_bit(k, devip->uas_bm);
773642d9 884 if (sdebug_verbose)
f46eb0e9 885 sdev_printk(KERN_INFO, scp->device,
cbf67842
DG
886 "%s reports: Unit attention: %s\n",
887 my_name, cp);
1da177e4
LT
888 return check_condition_result;
889 }
890 return 0;
891}
892
893/* Returns 0 if ok else (DID_ERROR << 16). Sets scp->resid . */
21a61829 894static int fill_from_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
1da177e4
LT
895 int arr_len)
896{
21a61829 897 int act_len;
072d0bb3 898 struct scsi_data_buffer *sdb = scsi_in(scp);
1da177e4 899
072d0bb3 900 if (!sdb->length)
1da177e4 901 return 0;
072d0bb3 902 if (!(scsi_bidi_cmnd(scp) || scp->sc_data_direction == DMA_FROM_DEVICE))
773642d9 903 return DID_ERROR << 16;
21a61829
FT
904
905 act_len = sg_copy_from_buffer(sdb->table.sgl, sdb->table.nents,
906 arr, arr_len);
a4517511 907 sdb->resid = scsi_bufflen(scp) - act_len;
21a61829 908
1da177e4
LT
909 return 0;
910}
911
912/* Returns number of bytes fetched into 'arr' or -1 if error. */
21a61829
FT
913static int fetch_to_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
914 int arr_len)
1da177e4 915{
21a61829 916 if (!scsi_bufflen(scp))
1da177e4 917 return 0;
072d0bb3 918 if (!(scsi_bidi_cmnd(scp) || scp->sc_data_direction == DMA_TO_DEVICE))
1da177e4 919 return -1;
21a61829
FT
920
921 return scsi_sg_copy_to_buffer(scp, arr, arr_len);
1da177e4
LT
922}
923
924
925static const char * inq_vendor_id = "Linux ";
926static const char * inq_product_id = "scsi_debug ";
773642d9 927static const char *inq_product_rev = "0186"; /* version less '.' */
1b37bd60
DG
928/* Use some locally assigned NAAs for SAS addresses. */
929static const u64 naa3_comp_a = 0x3222222000000000ULL;
930static const u64 naa3_comp_b = 0x3333333000000000ULL;
931static const u64 naa3_comp_c = 0x3111111000000000ULL;
1da177e4 932
cbf67842 933/* Device identification VPD page. Returns number of bytes placed in arr */
760f3b03
DG
934static int inquiry_vpd_83(unsigned char *arr, int port_group_id,
935 int target_dev_id, int dev_id_num,
09ba24c1
DG
936 const char *dev_id_str, int dev_id_str_len,
937 const uuid_be *lu_name)
1da177e4 938{
c65b1445
DG
939 int num, port_a;
940 char b[32];
1da177e4 941
c65b1445 942 port_a = target_dev_id + 1;
1da177e4
LT
943 /* T10 vendor identifier field format (faked) */
944 arr[0] = 0x2; /* ASCII */
945 arr[1] = 0x1;
946 arr[2] = 0x0;
947 memcpy(&arr[4], inq_vendor_id, 8);
948 memcpy(&arr[12], inq_product_id, 16);
949 memcpy(&arr[28], dev_id_str, dev_id_str_len);
950 num = 8 + 16 + dev_id_str_len;
951 arr[3] = num;
952 num += 4;
c65b1445 953 if (dev_id_num >= 0) {
09ba24c1
DG
954 if (sdebug_uuid_ctl) {
955 /* Locally assigned UUID */
956 arr[num++] = 0x1; /* binary (not necessarily sas) */
957 arr[num++] = 0xa; /* PIV=0, lu, naa */
958 arr[num++] = 0x0;
959 arr[num++] = 0x12;
960 arr[num++] = 0x10; /* uuid type=1, locally assigned */
961 arr[num++] = 0x0;
962 memcpy(arr + num, lu_name, 16);
963 num += 16;
964 } else {
1b37bd60 965 /* NAA-3, Logical unit identifier (binary) */
09ba24c1
DG
966 arr[num++] = 0x1; /* binary (not necessarily sas) */
967 arr[num++] = 0x3; /* PIV=0, lu, naa */
968 arr[num++] = 0x0;
969 arr[num++] = 0x8;
1b37bd60 970 put_unaligned_be64(naa3_comp_b + dev_id_num, arr + num);
09ba24c1
DG
971 num += 8;
972 }
c65b1445
DG
973 /* Target relative port number */
974 arr[num++] = 0x61; /* proto=sas, binary */
975 arr[num++] = 0x94; /* PIV=1, target port, rel port */
976 arr[num++] = 0x0; /* reserved */
977 arr[num++] = 0x4; /* length */
978 arr[num++] = 0x0; /* reserved */
979 arr[num++] = 0x0; /* reserved */
980 arr[num++] = 0x0;
981 arr[num++] = 0x1; /* relative port A */
982 }
1b37bd60 983 /* NAA-3, Target port identifier */
c65b1445
DG
984 arr[num++] = 0x61; /* proto=sas, binary */
985 arr[num++] = 0x93; /* piv=1, target port, naa */
986 arr[num++] = 0x0;
987 arr[num++] = 0x8;
1b37bd60 988 put_unaligned_be64(naa3_comp_a + port_a, arr + num);
773642d9 989 num += 8;
1b37bd60 990 /* NAA-3, Target port group identifier */
5a09e398
HR
991 arr[num++] = 0x61; /* proto=sas, binary */
992 arr[num++] = 0x95; /* piv=1, target port group id */
993 arr[num++] = 0x0;
994 arr[num++] = 0x4;
995 arr[num++] = 0;
996 arr[num++] = 0;
773642d9
DG
997 put_unaligned_be16(port_group_id, arr + num);
998 num += 2;
1b37bd60 999 /* NAA-3, Target device identifier */
c65b1445
DG
1000 arr[num++] = 0x61; /* proto=sas, binary */
1001 arr[num++] = 0xa3; /* piv=1, target device, naa */
1002 arr[num++] = 0x0;
1003 arr[num++] = 0x8;
1b37bd60 1004 put_unaligned_be64(naa3_comp_a + target_dev_id, arr + num);
773642d9 1005 num += 8;
c65b1445
DG
1006 /* SCSI name string: Target device identifier */
1007 arr[num++] = 0x63; /* proto=sas, UTF-8 */
1008 arr[num++] = 0xa8; /* piv=1, target device, SCSI name string */
1009 arr[num++] = 0x0;
1010 arr[num++] = 24;
1b37bd60 1011 memcpy(arr + num, "naa.32222220", 12);
c65b1445
DG
1012 num += 12;
1013 snprintf(b, sizeof(b), "%08X", target_dev_id);
1014 memcpy(arr + num, b, 8);
1015 num += 8;
1016 memset(arr + num, 0, 4);
1017 num += 4;
1018 return num;
1019}
1020
c65b1445
DG
1021static unsigned char vpd84_data[] = {
1022/* from 4th byte */ 0x22,0x22,0x22,0x0,0xbb,0x0,
1023 0x22,0x22,0x22,0x0,0xbb,0x1,
1024 0x22,0x22,0x22,0x0,0xbb,0x2,
1025};
1026
cbf67842 1027/* Software interface identification VPD page */
760f3b03 1028static int inquiry_vpd_84(unsigned char *arr)
c65b1445
DG
1029{
1030 memcpy(arr, vpd84_data, sizeof(vpd84_data));
1031 return sizeof(vpd84_data);
1032}
1033
cbf67842 1034/* Management network addresses VPD page */
760f3b03 1035static int inquiry_vpd_85(unsigned char *arr)
c65b1445
DG
1036{
1037 int num = 0;
1038 const char * na1 = "https://www.kernel.org/config";
1039 const char * na2 = "http://www.kernel.org/log";
1040 int plen, olen;
1041
1042 arr[num++] = 0x1; /* lu, storage config */
1043 arr[num++] = 0x0; /* reserved */
1044 arr[num++] = 0x0;
1045 olen = strlen(na1);
1046 plen = olen + 1;
1047 if (plen % 4)
1048 plen = ((plen / 4) + 1) * 4;
1049 arr[num++] = plen; /* length, null termianted, padded */
1050 memcpy(arr + num, na1, olen);
1051 memset(arr + num + olen, 0, plen - olen);
1052 num += plen;
1053
1054 arr[num++] = 0x4; /* lu, logging */
1055 arr[num++] = 0x0; /* reserved */
1056 arr[num++] = 0x0;
1057 olen = strlen(na2);
1058 plen = olen + 1;
1059 if (plen % 4)
1060 plen = ((plen / 4) + 1) * 4;
1061 arr[num++] = plen; /* length, null terminated, padded */
1062 memcpy(arr + num, na2, olen);
1063 memset(arr + num + olen, 0, plen - olen);
1064 num += plen;
1065
1066 return num;
1067}
1068
1069/* SCSI ports VPD page */
760f3b03 1070static int inquiry_vpd_88(unsigned char *arr, int target_dev_id)
c65b1445
DG
1071{
1072 int num = 0;
1073 int port_a, port_b;
1074
1075 port_a = target_dev_id + 1;
1076 port_b = port_a + 1;
1077 arr[num++] = 0x0; /* reserved */
1078 arr[num++] = 0x0; /* reserved */
1079 arr[num++] = 0x0;
1080 arr[num++] = 0x1; /* relative port 1 (primary) */
1081 memset(arr + num, 0, 6);
1082 num += 6;
1083 arr[num++] = 0x0;
1084 arr[num++] = 12; /* length tp descriptor */
1085 /* naa-5 target port identifier (A) */
1086 arr[num++] = 0x61; /* proto=sas, binary */
1087 arr[num++] = 0x93; /* PIV=1, target port, NAA */
1088 arr[num++] = 0x0; /* reserved */
1089 arr[num++] = 0x8; /* length */
1b37bd60 1090 put_unaligned_be64(naa3_comp_a + port_a, arr + num);
773642d9 1091 num += 8;
c65b1445
DG
1092 arr[num++] = 0x0; /* reserved */
1093 arr[num++] = 0x0; /* reserved */
1094 arr[num++] = 0x0;
1095 arr[num++] = 0x2; /* relative port 2 (secondary) */
1096 memset(arr + num, 0, 6);
1097 num += 6;
1098 arr[num++] = 0x0;
1099 arr[num++] = 12; /* length tp descriptor */
1100 /* naa-5 target port identifier (B) */
1101 arr[num++] = 0x61; /* proto=sas, binary */
1102 arr[num++] = 0x93; /* PIV=1, target port, NAA */
1103 arr[num++] = 0x0; /* reserved */
1104 arr[num++] = 0x8; /* length */
1b37bd60 1105 put_unaligned_be64(naa3_comp_a + port_b, arr + num);
773642d9 1106 num += 8;
c65b1445
DG
1107
1108 return num;
1109}
1110
1111
1112static unsigned char vpd89_data[] = {
1113/* from 4th byte */ 0,0,0,0,
1114'l','i','n','u','x',' ',' ',' ',
1115'S','A','T',' ','s','c','s','i','_','d','e','b','u','g',' ',' ',
1116'1','2','3','4',
11170x34,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
11180xec,0,0,0,
11190x5a,0xc,0xff,0x3f,0x37,0xc8,0x10,0,0,0,0,0,0x3f,0,0,0,
11200,0,0,0,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x20,0x20,0x20,0x20,
11210x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0,0,0,0x40,0x4,0,0x2e,0x33,
11220x38,0x31,0x20,0x20,0x20,0x20,0x54,0x53,0x38,0x33,0x30,0x30,0x33,0x31,
11230x53,0x41,
11240x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
11250x20,0x20,
11260x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
11270x10,0x80,
11280,0,0,0x2f,0,0,0,0x2,0,0x2,0x7,0,0xff,0xff,0x1,0,
11290x3f,0,0xc1,0xff,0x3e,0,0x10,0x1,0xb0,0xf8,0x50,0x9,0,0,0x7,0,
11300x3,0,0x78,0,0x78,0,0xf0,0,0x78,0,0,0,0,0,0,0,
11310,0,0,0,0,0,0,0,0x2,0,0,0,0,0,0,0,
11320x7e,0,0x1b,0,0x6b,0x34,0x1,0x7d,0x3,0x40,0x69,0x34,0x1,0x3c,0x3,0x40,
11330x7f,0x40,0,0,0,0,0xfe,0xfe,0,0,0,0,0,0xfe,0,0,
11340,0,0,0,0,0,0,0,0xb0,0xf8,0x50,0x9,0,0,0,0,
11350,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11370,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11380x1,0,0xb0,0xf8,0x50,0x9,0xb0,0xf8,0x50,0x9,0x20,0x20,0x2,0,0xb6,0x42,
11390,0x80,0x8a,0,0x6,0x3c,0xa,0x3c,0xff,0xff,0xc6,0x7,0,0x1,0,0x8,
11400xf0,0xf,0,0x10,0x2,0,0x30,0,0,0,0,0,0,0,0x6,0xfe,
11410,0,0x2,0,0x50,0,0x8a,0,0x4f,0x95,0,0,0x21,0,0xb,0,
11420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11430,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11440,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11450,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11460,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11470,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11490,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11510,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11520,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11530,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa5,0x51,
1154};
1155
cbf67842 1156/* ATA Information VPD page */
760f3b03 1157static int inquiry_vpd_89(unsigned char *arr)
c65b1445
DG
1158{
1159 memcpy(arr, vpd89_data, sizeof(vpd89_data));
1160 return sizeof(vpd89_data);
1161}
1162
1163
1164static unsigned char vpdb0_data[] = {
1e49f785
DG
1165 /* from 4th byte */ 0,0,0,4, 0,0,0x4,0, 0,0,0,64,
1166 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1167 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1168 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
c65b1445
DG
1169};
1170
cbf67842 1171/* Block limits VPD page (SBC-3) */
760f3b03 1172static int inquiry_vpd_b0(unsigned char *arr)
c65b1445 1173{
ea61fca5
MP
1174 unsigned int gran;
1175
c65b1445 1176 memcpy(arr, vpdb0_data, sizeof(vpdb0_data));
e308b3d1
MP
1177
1178 /* Optimal transfer length granularity */
773642d9
DG
1179 gran = 1 << sdebug_physblk_exp;
1180 put_unaligned_be16(gran, arr + 2);
e308b3d1
MP
1181
1182 /* Maximum Transfer Length */
773642d9
DG
1183 if (sdebug_store_sectors > 0x400)
1184 put_unaligned_be32(sdebug_store_sectors, arr + 4);
44d92694 1185
e308b3d1 1186 /* Optimal Transfer Length */
773642d9 1187 put_unaligned_be32(sdebug_opt_blks, &arr[8]);
e308b3d1 1188
773642d9 1189 if (sdebug_lbpu) {
e308b3d1 1190 /* Maximum Unmap LBA Count */
773642d9 1191 put_unaligned_be32(sdebug_unmap_max_blocks, &arr[16]);
e308b3d1
MP
1192
1193 /* Maximum Unmap Block Descriptor Count */
773642d9 1194 put_unaligned_be32(sdebug_unmap_max_desc, &arr[20]);
44d92694
MP
1195 }
1196
e308b3d1 1197 /* Unmap Granularity Alignment */
773642d9
DG
1198 if (sdebug_unmap_alignment) {
1199 put_unaligned_be32(sdebug_unmap_alignment, &arr[28]);
44d92694
MP
1200 arr[28] |= 0x80; /* UGAVALID */
1201 }
1202
e308b3d1 1203 /* Optimal Unmap Granularity */
773642d9 1204 put_unaligned_be32(sdebug_unmap_granularity, &arr[24]);
6014759c 1205
5b94e232 1206 /* Maximum WRITE SAME Length */
773642d9 1207 put_unaligned_be64(sdebug_write_same_length, &arr[32]);
5b94e232
MP
1208
1209 return 0x3c; /* Mandatory page length for Logical Block Provisioning */
44d92694 1210
c65b1445 1211 return sizeof(vpdb0_data);
1da177e4
LT
1212}
1213
1e49f785 1214/* Block device characteristics VPD page (SBC-3) */
760f3b03 1215static int inquiry_vpd_b1(unsigned char *arr)
eac6e8e4
MW
1216{
1217 memset(arr, 0, 0x3c);
1218 arr[0] = 0;
1e49f785
DG
1219 arr[1] = 1; /* non rotating medium (e.g. solid state) */
1220 arr[2] = 0;
1221 arr[3] = 5; /* less than 1.8" */
eac6e8e4
MW
1222
1223 return 0x3c;
1224}
1da177e4 1225
760f3b03
DG
1226/* Logical block provisioning VPD page (SBC-4) */
1227static int inquiry_vpd_b2(unsigned char *arr)
6014759c 1228{
3f0bc3b3 1229 memset(arr, 0, 0x4);
6014759c 1230 arr[0] = 0; /* threshold exponent */
773642d9 1231 if (sdebug_lbpu)
6014759c 1232 arr[1] = 1 << 7;
773642d9 1233 if (sdebug_lbpws)
6014759c 1234 arr[1] |= 1 << 6;
773642d9 1235 if (sdebug_lbpws10)
5b94e232 1236 arr[1] |= 1 << 5;
760f3b03
DG
1237 if (sdebug_lbprz && scsi_debug_lbp())
1238 arr[1] |= (sdebug_lbprz & 0x7) << 2; /* sbc4r07 and later */
1239 /* anc_sup=0; dp=0 (no provisioning group descriptor) */
1240 /* minimum_percentage=0; provisioning_type=0 (unknown) */
1241 /* threshold_percentage=0 */
3f0bc3b3 1242 return 0x4;
6014759c
MP
1243}
1244
1da177e4 1245#define SDEBUG_LONG_INQ_SZ 96
c65b1445 1246#define SDEBUG_MAX_INQ_ARR_SZ 584
1da177e4 1247
c2248fc9 1248static int resp_inquiry(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
1da177e4
LT
1249{
1250 unsigned char pq_pdt;
5a09e398 1251 unsigned char * arr;
01123ef4 1252 unsigned char *cmd = scp->cmnd;
5a09e398 1253 int alloc_len, n, ret;
760f3b03 1254 bool have_wlun, is_disk;
1da177e4 1255
773642d9 1256 alloc_len = get_unaligned_be16(cmd + 3);
6f3cbf55
DG
1257 arr = kzalloc(SDEBUG_MAX_INQ_ARR_SZ, GFP_ATOMIC);
1258 if (! arr)
1259 return DID_REQUEUE << 16;
760f3b03 1260 is_disk = (sdebug_ptype == TYPE_DISK);
b01f6f83 1261 have_wlun = scsi_is_wlun(scp->device->lun);
c2248fc9 1262 if (have_wlun)
b01f6f83
DG
1263 pq_pdt = TYPE_WLUN; /* present, wlun */
1264 else if (sdebug_no_lun_0 && (devip->lun == SDEBUG_LUN_0_VAL))
1265 pq_pdt = 0x7f; /* not present, PQ=3, PDT=0x1f */
c65b1445 1266 else
773642d9 1267 pq_pdt = (sdebug_ptype & 0x1f);
1da177e4
LT
1268 arr[0] = pq_pdt;
1269 if (0x2 & cmd[1]) { /* CMDDT bit set */
22017ed2 1270 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 1);
5a09e398 1271 kfree(arr);
1da177e4
LT
1272 return check_condition_result;
1273 } else if (0x1 & cmd[1]) { /* EVPD bit set */
5a09e398 1274 int lu_id_num, port_group_id, target_dev_id, len;
c65b1445
DG
1275 char lu_id_str[6];
1276 int host_no = devip->sdbg_host->shost->host_no;
1da177e4 1277
5a09e398
HR
1278 port_group_id = (((host_no + 1) & 0x7f) << 8) +
1279 (devip->channel & 0x7f);
b01f6f83 1280 if (sdebug_vpd_use_hostno == 0)
23183910 1281 host_no = 0;
c2248fc9 1282 lu_id_num = have_wlun ? -1 : (((host_no + 1) * 2000) +
c65b1445
DG
1283 (devip->target * 1000) + devip->lun);
1284 target_dev_id = ((host_no + 1) * 2000) +
1285 (devip->target * 1000) - 3;
1286 len = scnprintf(lu_id_str, 6, "%d", lu_id_num);
1da177e4 1287 if (0 == cmd[2]) { /* supported vital product data pages */
c65b1445
DG
1288 arr[1] = cmd[2]; /*sanity */
1289 n = 4;
1290 arr[n++] = 0x0; /* this page */
1291 arr[n++] = 0x80; /* unit serial number */
1292 arr[n++] = 0x83; /* device identification */
1293 arr[n++] = 0x84; /* software interface ident. */
1294 arr[n++] = 0x85; /* management network addresses */
1295 arr[n++] = 0x86; /* extended inquiry */
1296 arr[n++] = 0x87; /* mode page policy */
1297 arr[n++] = 0x88; /* SCSI ports */
760f3b03
DG
1298 if (is_disk) { /* SBC only */
1299 arr[n++] = 0x89; /* ATA information */
1300 arr[n++] = 0xb0; /* Block limits */
1301 arr[n++] = 0xb1; /* Block characteristics */
1302 arr[n++] = 0xb2; /* Logical Block Prov */
1303 }
c65b1445 1304 arr[3] = n - 4; /* number of supported VPD pages */
1da177e4 1305 } else if (0x80 == cmd[2]) { /* unit serial number */
c65b1445 1306 arr[1] = cmd[2]; /*sanity */
1da177e4 1307 arr[3] = len;
c65b1445 1308 memcpy(&arr[4], lu_id_str, len);
1da177e4 1309 } else if (0x83 == cmd[2]) { /* device identification */
c65b1445 1310 arr[1] = cmd[2]; /*sanity */
760f3b03
DG
1311 arr[3] = inquiry_vpd_83(&arr[4], port_group_id,
1312 target_dev_id, lu_id_num,
09ba24c1
DG
1313 lu_id_str, len,
1314 &devip->lu_name);
c65b1445
DG
1315 } else if (0x84 == cmd[2]) { /* Software interface ident. */
1316 arr[1] = cmd[2]; /*sanity */
760f3b03 1317 arr[3] = inquiry_vpd_84(&arr[4]);
c65b1445
DG
1318 } else if (0x85 == cmd[2]) { /* Management network addresses */
1319 arr[1] = cmd[2]; /*sanity */
760f3b03 1320 arr[3] = inquiry_vpd_85(&arr[4]);
c65b1445
DG
1321 } else if (0x86 == cmd[2]) { /* extended inquiry */
1322 arr[1] = cmd[2]; /*sanity */
1323 arr[3] = 0x3c; /* number of following entries */
773642d9 1324 if (sdebug_dif == SD_DIF_TYPE3_PROTECTION)
c6a44287 1325 arr[4] = 0x4; /* SPT: GRD_CHK:1 */
760f3b03 1326 else if (have_dif_prot)
c6a44287
MP
1327 arr[4] = 0x5; /* SPT: GRD_CHK:1, REF_CHK:1 */
1328 else
1329 arr[4] = 0x0; /* no protection stuff */
c65b1445
DG
1330 arr[5] = 0x7; /* head of q, ordered + simple q's */
1331 } else if (0x87 == cmd[2]) { /* mode page policy */
1332 arr[1] = cmd[2]; /*sanity */
1333 arr[3] = 0x8; /* number of following entries */
1334 arr[4] = 0x2; /* disconnect-reconnect mp */
1335 arr[6] = 0x80; /* mlus, shared */
1336 arr[8] = 0x18; /* protocol specific lu */
1337 arr[10] = 0x82; /* mlus, per initiator port */
1338 } else if (0x88 == cmd[2]) { /* SCSI Ports */
1339 arr[1] = cmd[2]; /*sanity */
760f3b03
DG
1340 arr[3] = inquiry_vpd_88(&arr[4], target_dev_id);
1341 } else if (is_disk && 0x89 == cmd[2]) { /* ATA information */
c65b1445 1342 arr[1] = cmd[2]; /*sanity */
760f3b03 1343 n = inquiry_vpd_89(&arr[4]);
773642d9 1344 put_unaligned_be16(n, arr + 2);
760f3b03 1345 } else if (is_disk && 0xb0 == cmd[2]) { /* Block limits */
c65b1445 1346 arr[1] = cmd[2]; /*sanity */
760f3b03
DG
1347 arr[3] = inquiry_vpd_b0(&arr[4]);
1348 } else if (is_disk && 0xb1 == cmd[2]) { /* Block char. */
eac6e8e4 1349 arr[1] = cmd[2]; /*sanity */
760f3b03
DG
1350 arr[3] = inquiry_vpd_b1(&arr[4]);
1351 } else if (is_disk && 0xb2 == cmd[2]) { /* LB Prov. */
6014759c 1352 arr[1] = cmd[2]; /*sanity */
760f3b03 1353 arr[3] = inquiry_vpd_b2(&arr[4]);
1da177e4 1354 } else {
22017ed2 1355 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, -1);
5a09e398 1356 kfree(arr);
1da177e4
LT
1357 return check_condition_result;
1358 }
773642d9 1359 len = min(get_unaligned_be16(arr + 2) + 4, alloc_len);
5a09e398 1360 ret = fill_from_dev_buffer(scp, arr,
c65b1445 1361 min(len, SDEBUG_MAX_INQ_ARR_SZ));
5a09e398
HR
1362 kfree(arr);
1363 return ret;
1da177e4
LT
1364 }
1365 /* drops through here for a standard inquiry */
773642d9
DG
1366 arr[1] = sdebug_removable ? 0x80 : 0; /* Removable disk */
1367 arr[2] = sdebug_scsi_level;
1da177e4
LT
1368 arr[3] = 2; /* response_data_format==2 */
1369 arr[4] = SDEBUG_LONG_INQ_SZ - 5;
f46eb0e9 1370 arr[5] = (int)have_dif_prot; /* PROTECT bit */
b01f6f83 1371 if (sdebug_vpd_use_hostno == 0)
5a09e398 1372 arr[5] = 0x10; /* claim: implicit TGPS */
c65b1445 1373 arr[6] = 0x10; /* claim: MultiP */
1da177e4 1374 /* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */
c65b1445 1375 arr[7] = 0xa; /* claim: LINKED + CMDQUE */
1da177e4
LT
1376 memcpy(&arr[8], inq_vendor_id, 8);
1377 memcpy(&arr[16], inq_product_id, 16);
1378 memcpy(&arr[32], inq_product_rev, 4);
1379 /* version descriptors (2 bytes each) follow */
760f3b03
DG
1380 put_unaligned_be16(0xc0, arr + 58); /* SAM-6 no version claimed */
1381 put_unaligned_be16(0x5c0, arr + 60); /* SPC-5 no version claimed */
c65b1445 1382 n = 62;
760f3b03
DG
1383 if (is_disk) { /* SBC-4 no version claimed */
1384 put_unaligned_be16(0x600, arr + n);
1385 n += 2;
1386 } else if (sdebug_ptype == TYPE_TAPE) { /* SSC-4 rev 3 */
1387 put_unaligned_be16(0x525, arr + n);
1388 n += 2;
1da177e4 1389 }
760f3b03 1390 put_unaligned_be16(0x2100, arr + n); /* SPL-4 no version claimed */
5a09e398 1391 ret = fill_from_dev_buffer(scp, arr,
1da177e4 1392 min(alloc_len, SDEBUG_LONG_INQ_SZ));
5a09e398
HR
1393 kfree(arr);
1394 return ret;
1da177e4
LT
1395}
1396
fd32119b
DG
1397static unsigned char iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
1398 0, 0, 0x0, 0x0};
1399
1da177e4
LT
1400static int resp_requests(struct scsi_cmnd * scp,
1401 struct sdebug_dev_info * devip)
1402{
1403 unsigned char * sbuff;
01123ef4 1404 unsigned char *cmd = scp->cmnd;
cbf67842 1405 unsigned char arr[SCSI_SENSE_BUFFERSIZE];
2492fc09 1406 bool dsense;
1da177e4
LT
1407 int len = 18;
1408
c65b1445 1409 memset(arr, 0, sizeof(arr));
c2248fc9 1410 dsense = !!(cmd[1] & 1);
cbf67842 1411 sbuff = scp->sense_buffer;
c65b1445 1412 if ((iec_m_pg[2] & 0x4) && (6 == (iec_m_pg[3] & 0xf))) {
c2248fc9 1413 if (dsense) {
c65b1445
DG
1414 arr[0] = 0x72;
1415 arr[1] = 0x0; /* NO_SENSE in sense_key */
1416 arr[2] = THRESHOLD_EXCEEDED;
1417 arr[3] = 0xff; /* TEST set and MRIE==6 */
c2248fc9 1418 len = 8;
c65b1445
DG
1419 } else {
1420 arr[0] = 0x70;
1421 arr[2] = 0x0; /* NO_SENSE in sense_key */
1422 arr[7] = 0xa; /* 18 byte sense buffer */
1423 arr[12] = THRESHOLD_EXCEEDED;
1424 arr[13] = 0xff; /* TEST set and MRIE==6 */
1425 }
c65b1445 1426 } else {
cbf67842 1427 memcpy(arr, sbuff, SCSI_SENSE_BUFFERSIZE);
773642d9 1428 if (arr[0] >= 0x70 && dsense == sdebug_dsense)
c2248fc9
DG
1429 ; /* have sense and formats match */
1430 else if (arr[0] <= 0x70) {
1431 if (dsense) {
1432 memset(arr, 0, 8);
1433 arr[0] = 0x72;
1434 len = 8;
1435 } else {
1436 memset(arr, 0, 18);
1437 arr[0] = 0x70;
1438 arr[7] = 0xa;
1439 }
1440 } else if (dsense) {
1441 memset(arr, 0, 8);
c65b1445
DG
1442 arr[0] = 0x72;
1443 arr[1] = sbuff[2]; /* sense key */
1444 arr[2] = sbuff[12]; /* asc */
1445 arr[3] = sbuff[13]; /* ascq */
1446 len = 8;
c2248fc9
DG
1447 } else {
1448 memset(arr, 0, 18);
1449 arr[0] = 0x70;
1450 arr[2] = sbuff[1];
1451 arr[7] = 0xa;
1452 arr[12] = sbuff[1];
1453 arr[13] = sbuff[3];
c65b1445 1454 }
c2248fc9 1455
c65b1445 1456 }
cbf67842 1457 mk_sense_buffer(scp, 0, NO_ADDITIONAL_SENSE, 0);
1da177e4
LT
1458 return fill_from_dev_buffer(scp, arr, len);
1459}
1460
c65b1445
DG
1461static int resp_start_stop(struct scsi_cmnd * scp,
1462 struct sdebug_dev_info * devip)
1463{
01123ef4 1464 unsigned char *cmd = scp->cmnd;
c4837394 1465 int power_cond, stop;
c65b1445 1466
c65b1445
DG
1467 power_cond = (cmd[4] & 0xf0) >> 4;
1468 if (power_cond) {
22017ed2 1469 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 4, 7);
c65b1445
DG
1470 return check_condition_result;
1471 }
c4837394
DG
1472 stop = !(cmd[4] & 1);
1473 atomic_xchg(&devip->stopped, stop);
c65b1445
DG
1474 return 0;
1475}
1476
28898873
FT
1477static sector_t get_sdebug_capacity(void)
1478{
773642d9
DG
1479 static const unsigned int gibibyte = 1073741824;
1480
1481 if (sdebug_virtual_gb > 0)
1482 return (sector_t)sdebug_virtual_gb *
1483 (gibibyte / sdebug_sector_size);
28898873
FT
1484 else
1485 return sdebug_store_sectors;
1486}
1487
1da177e4
LT
1488#define SDEBUG_READCAP_ARR_SZ 8
1489static int resp_readcap(struct scsi_cmnd * scp,
1490 struct sdebug_dev_info * devip)
1491{
1492 unsigned char arr[SDEBUG_READCAP_ARR_SZ];
c65b1445 1493 unsigned int capac;
1da177e4 1494
c65b1445 1495 /* following just in case virtual_gb changed */
28898873 1496 sdebug_capacity = get_sdebug_capacity();
1da177e4 1497 memset(arr, 0, SDEBUG_READCAP_ARR_SZ);
c65b1445
DG
1498 if (sdebug_capacity < 0xffffffff) {
1499 capac = (unsigned int)sdebug_capacity - 1;
773642d9
DG
1500 put_unaligned_be32(capac, arr + 0);
1501 } else
1502 put_unaligned_be32(0xffffffff, arr + 0);
1503 put_unaligned_be16(sdebug_sector_size, arr + 6);
1da177e4
LT
1504 return fill_from_dev_buffer(scp, arr, SDEBUG_READCAP_ARR_SZ);
1505}
1506
c65b1445
DG
1507#define SDEBUG_READCAP16_ARR_SZ 32
1508static int resp_readcap16(struct scsi_cmnd * scp,
1509 struct sdebug_dev_info * devip)
1510{
01123ef4 1511 unsigned char *cmd = scp->cmnd;
c65b1445 1512 unsigned char arr[SDEBUG_READCAP16_ARR_SZ];
773642d9 1513 int alloc_len;
c65b1445 1514
773642d9 1515 alloc_len = get_unaligned_be32(cmd + 10);
c65b1445 1516 /* following just in case virtual_gb changed */
28898873 1517 sdebug_capacity = get_sdebug_capacity();
c65b1445 1518 memset(arr, 0, SDEBUG_READCAP16_ARR_SZ);
773642d9
DG
1519 put_unaligned_be64((u64)(sdebug_capacity - 1), arr + 0);
1520 put_unaligned_be32(sdebug_sector_size, arr + 8);
1521 arr[13] = sdebug_physblk_exp & 0xf;
1522 arr[14] = (sdebug_lowest_aligned >> 8) & 0x3f;
44d92694 1523
be1dd78d 1524 if (scsi_debug_lbp()) {
5b94e232 1525 arr[14] |= 0x80; /* LBPME */
760f3b03
DG
1526 /* from sbc4r07, this LBPRZ field is 1 bit, but the LBPRZ in
1527 * the LB Provisioning VPD page is 3 bits. Note that lbprz=2
1528 * in the wider field maps to 0 in this field.
1529 */
1530 if (sdebug_lbprz & 1) /* precisely what the draft requires */
1531 arr[14] |= 0x40;
be1dd78d 1532 }
44d92694 1533
773642d9 1534 arr[15] = sdebug_lowest_aligned & 0xff;
c6a44287 1535
760f3b03 1536 if (have_dif_prot) {
773642d9 1537 arr[12] = (sdebug_dif - 1) << 1; /* P_TYPE */
c6a44287
MP
1538 arr[12] |= 1; /* PROT_EN */
1539 }
1540
c65b1445
DG
1541 return fill_from_dev_buffer(scp, arr,
1542 min(alloc_len, SDEBUG_READCAP16_ARR_SZ));
1543}
1544
5a09e398
HR
1545#define SDEBUG_MAX_TGTPGS_ARR_SZ 1412
1546
1547static int resp_report_tgtpgs(struct scsi_cmnd * scp,
1548 struct sdebug_dev_info * devip)
1549{
01123ef4 1550 unsigned char *cmd = scp->cmnd;
5a09e398
HR
1551 unsigned char * arr;
1552 int host_no = devip->sdbg_host->shost->host_no;
1553 int n, ret, alen, rlen;
1554 int port_group_a, port_group_b, port_a, port_b;
1555
773642d9 1556 alen = get_unaligned_be32(cmd + 6);
6f3cbf55
DG
1557 arr = kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ, GFP_ATOMIC);
1558 if (! arr)
1559 return DID_REQUEUE << 16;
5a09e398
HR
1560 /*
1561 * EVPD page 0x88 states we have two ports, one
1562 * real and a fake port with no device connected.
1563 * So we create two port groups with one port each
1564 * and set the group with port B to unavailable.
1565 */
1566 port_a = 0x1; /* relative port A */
1567 port_b = 0x2; /* relative port B */
1568 port_group_a = (((host_no + 1) & 0x7f) << 8) +
773642d9 1569 (devip->channel & 0x7f);
5a09e398 1570 port_group_b = (((host_no + 1) & 0x7f) << 8) +
773642d9 1571 (devip->channel & 0x7f) + 0x80;
5a09e398
HR
1572
1573 /*
1574 * The asymmetric access state is cycled according to the host_id.
1575 */
1576 n = 4;
b01f6f83 1577 if (sdebug_vpd_use_hostno == 0) {
773642d9
DG
1578 arr[n++] = host_no % 3; /* Asymm access state */
1579 arr[n++] = 0x0F; /* claim: all states are supported */
5a09e398 1580 } else {
773642d9
DG
1581 arr[n++] = 0x0; /* Active/Optimized path */
1582 arr[n++] = 0x01; /* only support active/optimized paths */
5a09e398 1583 }
773642d9
DG
1584 put_unaligned_be16(port_group_a, arr + n);
1585 n += 2;
5a09e398
HR
1586 arr[n++] = 0; /* Reserved */
1587 arr[n++] = 0; /* Status code */
1588 arr[n++] = 0; /* Vendor unique */
1589 arr[n++] = 0x1; /* One port per group */
1590 arr[n++] = 0; /* Reserved */
1591 arr[n++] = 0; /* Reserved */
773642d9
DG
1592 put_unaligned_be16(port_a, arr + n);
1593 n += 2;
5a09e398
HR
1594 arr[n++] = 3; /* Port unavailable */
1595 arr[n++] = 0x08; /* claim: only unavailalbe paths are supported */
773642d9
DG
1596 put_unaligned_be16(port_group_b, arr + n);
1597 n += 2;
5a09e398
HR
1598 arr[n++] = 0; /* Reserved */
1599 arr[n++] = 0; /* Status code */
1600 arr[n++] = 0; /* Vendor unique */
1601 arr[n++] = 0x1; /* One port per group */
1602 arr[n++] = 0; /* Reserved */
1603 arr[n++] = 0; /* Reserved */
773642d9
DG
1604 put_unaligned_be16(port_b, arr + n);
1605 n += 2;
5a09e398
HR
1606
1607 rlen = n - 4;
773642d9 1608 put_unaligned_be32(rlen, arr + 0);
5a09e398
HR
1609
1610 /*
1611 * Return the smallest value of either
1612 * - The allocated length
1613 * - The constructed command length
1614 * - The maximum array size
1615 */
1616 rlen = min(alen,n);
1617 ret = fill_from_dev_buffer(scp, arr,
1618 min(rlen, SDEBUG_MAX_TGTPGS_ARR_SZ));
1619 kfree(arr);
1620 return ret;
1621}
1622
fd32119b
DG
1623static int resp_rsup_opcodes(struct scsi_cmnd *scp,
1624 struct sdebug_dev_info *devip)
38d5c833
DG
1625{
1626 bool rctd;
1627 u8 reporting_opts, req_opcode, sdeb_i, supp;
1628 u16 req_sa, u;
1629 u32 alloc_len, a_len;
1630 int k, offset, len, errsts, count, bump, na;
1631 const struct opcode_info_t *oip;
1632 const struct opcode_info_t *r_oip;
1633 u8 *arr;
1634 u8 *cmd = scp->cmnd;
1635
1636 rctd = !!(cmd[2] & 0x80);
1637 reporting_opts = cmd[2] & 0x7;
1638 req_opcode = cmd[3];
1639 req_sa = get_unaligned_be16(cmd + 4);
1640 alloc_len = get_unaligned_be32(cmd + 6);
6d310dfb 1641 if (alloc_len < 4 || alloc_len > 0xffff) {
38d5c833
DG
1642 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 6, -1);
1643 return check_condition_result;
1644 }
1645 if (alloc_len > 8192)
1646 a_len = 8192;
1647 else
1648 a_len = alloc_len;
99531e60 1649 arr = kzalloc((a_len < 256) ? 320 : a_len + 64, GFP_ATOMIC);
38d5c833
DG
1650 if (NULL == arr) {
1651 mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
1652 INSUFF_RES_ASCQ);
1653 return check_condition_result;
1654 }
1655 switch (reporting_opts) {
1656 case 0: /* all commands */
1657 /* count number of commands */
1658 for (count = 0, oip = opcode_info_arr;
1659 oip->num_attached != 0xff; ++oip) {
1660 if (F_INV_OP & oip->flags)
1661 continue;
1662 count += (oip->num_attached + 1);
1663 }
1664 bump = rctd ? 20 : 8;
1665 put_unaligned_be32(count * bump, arr);
1666 for (offset = 4, oip = opcode_info_arr;
1667 oip->num_attached != 0xff && offset < a_len; ++oip) {
1668 if (F_INV_OP & oip->flags)
1669 continue;
1670 na = oip->num_attached;
1671 arr[offset] = oip->opcode;
1672 put_unaligned_be16(oip->sa, arr + offset + 2);
1673 if (rctd)
1674 arr[offset + 5] |= 0x2;
1675 if (FF_SA & oip->flags)
1676 arr[offset + 5] |= 0x1;
1677 put_unaligned_be16(oip->len_mask[0], arr + offset + 6);
1678 if (rctd)
1679 put_unaligned_be16(0xa, arr + offset + 8);
1680 r_oip = oip;
1681 for (k = 0, oip = oip->arrp; k < na; ++k, ++oip) {
1682 if (F_INV_OP & oip->flags)
1683 continue;
1684 offset += bump;
1685 arr[offset] = oip->opcode;
1686 put_unaligned_be16(oip->sa, arr + offset + 2);
1687 if (rctd)
1688 arr[offset + 5] |= 0x2;
1689 if (FF_SA & oip->flags)
1690 arr[offset + 5] |= 0x1;
1691 put_unaligned_be16(oip->len_mask[0],
1692 arr + offset + 6);
1693 if (rctd)
1694 put_unaligned_be16(0xa,
1695 arr + offset + 8);
1696 }
1697 oip = r_oip;
1698 offset += bump;
1699 }
1700 break;
1701 case 1: /* one command: opcode only */
1702 case 2: /* one command: opcode plus service action */
1703 case 3: /* one command: if sa==0 then opcode only else opcode+sa */
1704 sdeb_i = opcode_ind_arr[req_opcode];
1705 oip = &opcode_info_arr[sdeb_i];
1706 if (F_INV_OP & oip->flags) {
1707 supp = 1;
1708 offset = 4;
1709 } else {
1710 if (1 == reporting_opts) {
1711 if (FF_SA & oip->flags) {
1712 mk_sense_invalid_fld(scp, SDEB_IN_CDB,
1713 2, 2);
1714 kfree(arr);
1715 return check_condition_result;
1716 }
1717 req_sa = 0;
1718 } else if (2 == reporting_opts &&
1719 0 == (FF_SA & oip->flags)) {
1720 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 4, -1);
1721 kfree(arr); /* point at requested sa */
1722 return check_condition_result;
1723 }
1724 if (0 == (FF_SA & oip->flags) &&
1725 req_opcode == oip->opcode)
1726 supp = 3;
1727 else if (0 == (FF_SA & oip->flags)) {
1728 na = oip->num_attached;
1729 for (k = 0, oip = oip->arrp; k < na;
1730 ++k, ++oip) {
1731 if (req_opcode == oip->opcode)
1732 break;
1733 }
1734 supp = (k >= na) ? 1 : 3;
1735 } else if (req_sa != oip->sa) {
1736 na = oip->num_attached;
1737 for (k = 0, oip = oip->arrp; k < na;
1738 ++k, ++oip) {
1739 if (req_sa == oip->sa)
1740 break;
1741 }
1742 supp = (k >= na) ? 1 : 3;
1743 } else
1744 supp = 3;
1745 if (3 == supp) {
1746 u = oip->len_mask[0];
1747 put_unaligned_be16(u, arr + 2);
1748 arr[4] = oip->opcode;
1749 for (k = 1; k < u; ++k)
1750 arr[4 + k] = (k < 16) ?
1751 oip->len_mask[k] : 0xff;
1752 offset = 4 + u;
1753 } else
1754 offset = 4;
1755 }
1756 arr[1] = (rctd ? 0x80 : 0) | supp;
1757 if (rctd) {
1758 put_unaligned_be16(0xa, arr + offset);
1759 offset += 12;
1760 }
1761 break;
1762 default:
1763 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 2);
1764 kfree(arr);
1765 return check_condition_result;
1766 }
1767 offset = (offset < a_len) ? offset : a_len;
1768 len = (offset < alloc_len) ? offset : alloc_len;
1769 errsts = fill_from_dev_buffer(scp, arr, len);
1770 kfree(arr);
1771 return errsts;
1772}
1773
fd32119b
DG
1774static int resp_rsup_tmfs(struct scsi_cmnd *scp,
1775 struct sdebug_dev_info *devip)
38d5c833
DG
1776{
1777 bool repd;
1778 u32 alloc_len, len;
1779 u8 arr[16];
1780 u8 *cmd = scp->cmnd;
1781
1782 memset(arr, 0, sizeof(arr));
1783 repd = !!(cmd[2] & 0x80);
1784 alloc_len = get_unaligned_be32(cmd + 6);
1785 if (alloc_len < 4) {
1786 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 6, -1);
1787 return check_condition_result;
1788 }
1789 arr[0] = 0xc8; /* ATS | ATSS | LURS */
1790 arr[1] = 0x1; /* ITNRS */
1791 if (repd) {
1792 arr[3] = 0xc;
1793 len = 16;
1794 } else
1795 len = 4;
1796
1797 len = (len < alloc_len) ? len : alloc_len;
1798 return fill_from_dev_buffer(scp, arr, len);
1799}
1800
1da177e4
LT
1801/* <<Following mode page info copied from ST318451LW>> */
1802
1803static int resp_err_recov_pg(unsigned char * p, int pcontrol, int target)
1804{ /* Read-Write Error Recovery page for mode_sense */
1805 unsigned char err_recov_pg[] = {0x1, 0xa, 0xc0, 11, 240, 0, 0, 0,
1806 5, 0, 0xff, 0xff};
1807
1808 memcpy(p, err_recov_pg, sizeof(err_recov_pg));
1809 if (1 == pcontrol)
1810 memset(p + 2, 0, sizeof(err_recov_pg) - 2);
1811 return sizeof(err_recov_pg);
1812}
1813
1814static int resp_disconnect_pg(unsigned char * p, int pcontrol, int target)
1815{ /* Disconnect-Reconnect page for mode_sense */
1816 unsigned char disconnect_pg[] = {0x2, 0xe, 128, 128, 0, 10, 0, 0,
1817 0, 0, 0, 0, 0, 0, 0, 0};
1818
1819 memcpy(p, disconnect_pg, sizeof(disconnect_pg));
1820 if (1 == pcontrol)
1821 memset(p + 2, 0, sizeof(disconnect_pg) - 2);
1822 return sizeof(disconnect_pg);
1823}
1824
1825static int resp_format_pg(unsigned char * p, int pcontrol, int target)
1826{ /* Format device page for mode_sense */
597136ab
MP
1827 unsigned char format_pg[] = {0x3, 0x16, 0, 0, 0, 0, 0, 0,
1828 0, 0, 0, 0, 0, 0, 0, 0,
1829 0, 0, 0, 0, 0x40, 0, 0, 0};
1830
1831 memcpy(p, format_pg, sizeof(format_pg));
773642d9
DG
1832 put_unaligned_be16(sdebug_sectors_per, p + 10);
1833 put_unaligned_be16(sdebug_sector_size, p + 12);
1834 if (sdebug_removable)
597136ab
MP
1835 p[20] |= 0x20; /* should agree with INQUIRY */
1836 if (1 == pcontrol)
1837 memset(p + 2, 0, sizeof(format_pg) - 2);
1838 return sizeof(format_pg);
1da177e4
LT
1839}
1840
fd32119b
DG
1841static unsigned char caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
1842 0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0,
1843 0, 0, 0, 0};
1844
1da177e4
LT
1845static int resp_caching_pg(unsigned char * p, int pcontrol, int target)
1846{ /* Caching page for mode_sense */
cbf67842
DG
1847 unsigned char ch_caching_pg[] = {/* 0x8, 18, */ 0x4, 0, 0, 0, 0, 0,
1848 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1849 unsigned char d_caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
1da177e4
LT
1850 0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0, 0, 0, 0, 0};
1851
773642d9 1852 if (SDEBUG_OPT_N_WCE & sdebug_opts)
cbf67842 1853 caching_pg[2] &= ~0x4; /* set WCE=0 (default WCE=1) */
1da177e4
LT
1854 memcpy(p, caching_pg, sizeof(caching_pg));
1855 if (1 == pcontrol)
cbf67842
DG
1856 memcpy(p + 2, ch_caching_pg, sizeof(ch_caching_pg));
1857 else if (2 == pcontrol)
1858 memcpy(p, d_caching_pg, sizeof(d_caching_pg));
1da177e4
LT
1859 return sizeof(caching_pg);
1860}
1861
fd32119b
DG
1862static unsigned char ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
1863 0, 0, 0x2, 0x4b};
1864
1da177e4
LT
1865static int resp_ctrl_m_pg(unsigned char * p, int pcontrol, int target)
1866{ /* Control mode page for mode_sense */
c65b1445
DG
1867 unsigned char ch_ctrl_m_pg[] = {/* 0xa, 10, */ 0x6, 0, 0, 0, 0, 0,
1868 0, 0, 0, 0};
1869 unsigned char d_ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
1da177e4
LT
1870 0, 0, 0x2, 0x4b};
1871
773642d9 1872 if (sdebug_dsense)
1da177e4 1873 ctrl_m_pg[2] |= 0x4;
c65b1445
DG
1874 else
1875 ctrl_m_pg[2] &= ~0x4;
c6a44287 1876
773642d9 1877 if (sdebug_ato)
c6a44287
MP
1878 ctrl_m_pg[5] |= 0x80; /* ATO=1 */
1879
1da177e4
LT
1880 memcpy(p, ctrl_m_pg, sizeof(ctrl_m_pg));
1881 if (1 == pcontrol)
c65b1445
DG
1882 memcpy(p + 2, ch_ctrl_m_pg, sizeof(ch_ctrl_m_pg));
1883 else if (2 == pcontrol)
1884 memcpy(p, d_ctrl_m_pg, sizeof(d_ctrl_m_pg));
1da177e4
LT
1885 return sizeof(ctrl_m_pg);
1886}
1887
c65b1445 1888
1da177e4
LT
1889static int resp_iec_m_pg(unsigned char * p, int pcontrol, int target)
1890{ /* Informational Exceptions control mode page for mode_sense */
c65b1445
DG
1891 unsigned char ch_iec_m_pg[] = {/* 0x1c, 0xa, */ 0x4, 0xf, 0, 0, 0, 0,
1892 0, 0, 0x0, 0x0};
1893 unsigned char d_iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
1894 0, 0, 0x0, 0x0};
1895
1da177e4
LT
1896 memcpy(p, iec_m_pg, sizeof(iec_m_pg));
1897 if (1 == pcontrol)
c65b1445
DG
1898 memcpy(p + 2, ch_iec_m_pg, sizeof(ch_iec_m_pg));
1899 else if (2 == pcontrol)
1900 memcpy(p, d_iec_m_pg, sizeof(d_iec_m_pg));
1da177e4
LT
1901 return sizeof(iec_m_pg);
1902}
1903
c65b1445
DG
1904static int resp_sas_sf_m_pg(unsigned char * p, int pcontrol, int target)
1905{ /* SAS SSP mode page - short format for mode_sense */
1906 unsigned char sas_sf_m_pg[] = {0x19, 0x6,
1907 0x6, 0x0, 0x7, 0xd0, 0x0, 0x0};
1908
1909 memcpy(p, sas_sf_m_pg, sizeof(sas_sf_m_pg));
1910 if (1 == pcontrol)
1911 memset(p + 2, 0, sizeof(sas_sf_m_pg) - 2);
1912 return sizeof(sas_sf_m_pg);
1913}
1914
1915
1916static int resp_sas_pcd_m_spg(unsigned char * p, int pcontrol, int target,
1917 int target_dev_id)
1918{ /* SAS phy control and discover mode page for mode_sense */
1919 unsigned char sas_pcd_m_pg[] = {0x59, 0x1, 0, 0x64, 0, 0x6, 0, 2,
1920 0, 0, 0, 0, 0x10, 0x9, 0x8, 0x0,
773642d9
DG
1921 0, 0, 0, 0, 0, 0, 0, 0, /* insert SAS addr */
1922 0, 0, 0, 0, 0, 0, 0, 0, /* insert SAS addr */
c65b1445
DG
1923 0x2, 0, 0, 0, 0, 0, 0, 0,
1924 0x88, 0x99, 0, 0, 0, 0, 0, 0,
1925 0, 0, 0, 0, 0, 0, 0, 0,
1926 0, 1, 0, 0, 0x10, 0x9, 0x8, 0x0,
773642d9
DG
1927 0, 0, 0, 0, 0, 0, 0, 0, /* insert SAS addr */
1928 0, 0, 0, 0, 0, 0, 0, 0, /* insert SAS addr */
c65b1445
DG
1929 0x3, 0, 0, 0, 0, 0, 0, 0,
1930 0x88, 0x99, 0, 0, 0, 0, 0, 0,
1931 0, 0, 0, 0, 0, 0, 0, 0,
1932 };
1933 int port_a, port_b;
1934
1b37bd60
DG
1935 put_unaligned_be64(naa3_comp_a, sas_pcd_m_pg + 16);
1936 put_unaligned_be64(naa3_comp_c + 1, sas_pcd_m_pg + 24);
1937 put_unaligned_be64(naa3_comp_a, sas_pcd_m_pg + 64);
1938 put_unaligned_be64(naa3_comp_c + 1, sas_pcd_m_pg + 72);
c65b1445
DG
1939 port_a = target_dev_id + 1;
1940 port_b = port_a + 1;
1941 memcpy(p, sas_pcd_m_pg, sizeof(sas_pcd_m_pg));
773642d9
DG
1942 put_unaligned_be32(port_a, p + 20);
1943 put_unaligned_be32(port_b, p + 48 + 20);
c65b1445
DG
1944 if (1 == pcontrol)
1945 memset(p + 4, 0, sizeof(sas_pcd_m_pg) - 4);
1946 return sizeof(sas_pcd_m_pg);
1947}
1948
1949static int resp_sas_sha_m_spg(unsigned char * p, int pcontrol)
1950{ /* SAS SSP shared protocol specific port mode subpage */
1951 unsigned char sas_sha_m_pg[] = {0x59, 0x2, 0, 0xc, 0, 0x6, 0x10, 0,
1952 0, 0, 0, 0, 0, 0, 0, 0,
1953 };
1954
1955 memcpy(p, sas_sha_m_pg, sizeof(sas_sha_m_pg));
1956 if (1 == pcontrol)
1957 memset(p + 4, 0, sizeof(sas_sha_m_pg) - 4);
1958 return sizeof(sas_sha_m_pg);
1959}
1960
1da177e4
LT
1961#define SDEBUG_MAX_MSENSE_SZ 256
1962
fd32119b
DG
1963static int resp_mode_sense(struct scsi_cmnd *scp,
1964 struct sdebug_dev_info *devip)
1da177e4 1965{
23183910 1966 int pcontrol, pcode, subpcode, bd_len;
1da177e4 1967 unsigned char dev_spec;
760f3b03 1968 int alloc_len, offset, len, target_dev_id;
c2248fc9 1969 int target = scp->device->id;
1da177e4
LT
1970 unsigned char * ap;
1971 unsigned char arr[SDEBUG_MAX_MSENSE_SZ];
01123ef4 1972 unsigned char *cmd = scp->cmnd;
760f3b03 1973 bool dbd, llbaa, msense_6, is_disk, bad_pcode;
1da177e4 1974
760f3b03 1975 dbd = !!(cmd[1] & 0x8); /* disable block descriptors */
1da177e4
LT
1976 pcontrol = (cmd[2] & 0xc0) >> 6;
1977 pcode = cmd[2] & 0x3f;
1978 subpcode = cmd[3];
1979 msense_6 = (MODE_SENSE == cmd[0]);
760f3b03
DG
1980 llbaa = msense_6 ? false : !!(cmd[1] & 0x10);
1981 is_disk = (sdebug_ptype == TYPE_DISK);
1982 if (is_disk && !dbd)
23183910
DG
1983 bd_len = llbaa ? 16 : 8;
1984 else
1985 bd_len = 0;
773642d9 1986 alloc_len = msense_6 ? cmd[4] : get_unaligned_be16(cmd + 7);
1da177e4
LT
1987 memset(arr, 0, SDEBUG_MAX_MSENSE_SZ);
1988 if (0x3 == pcontrol) { /* Saving values not supported */
cbf67842 1989 mk_sense_buffer(scp, ILLEGAL_REQUEST, SAVING_PARAMS_UNSUP, 0);
1da177e4
LT
1990 return check_condition_result;
1991 }
c65b1445
DG
1992 target_dev_id = ((devip->sdbg_host->shost->host_no + 1) * 2000) +
1993 (devip->target * 1000) - 3;
b01f6f83 1994 /* for disks set DPOFUA bit and clear write protect (WP) bit */
760f3b03 1995 if (is_disk)
b01f6f83 1996 dev_spec = 0x10; /* =0x90 if WP=1 implies read-only */
23183910
DG
1997 else
1998 dev_spec = 0x0;
1da177e4
LT
1999 if (msense_6) {
2000 arr[2] = dev_spec;
23183910 2001 arr[3] = bd_len;
1da177e4
LT
2002 offset = 4;
2003 } else {
2004 arr[3] = dev_spec;
23183910
DG
2005 if (16 == bd_len)
2006 arr[4] = 0x1; /* set LONGLBA bit */
2007 arr[7] = bd_len; /* assume 255 or less */
1da177e4
LT
2008 offset = 8;
2009 }
2010 ap = arr + offset;
28898873
FT
2011 if ((bd_len > 0) && (!sdebug_capacity))
2012 sdebug_capacity = get_sdebug_capacity();
2013
23183910 2014 if (8 == bd_len) {
773642d9
DG
2015 if (sdebug_capacity > 0xfffffffe)
2016 put_unaligned_be32(0xffffffff, ap + 0);
2017 else
2018 put_unaligned_be32(sdebug_capacity, ap + 0);
2019 put_unaligned_be16(sdebug_sector_size, ap + 6);
23183910
DG
2020 offset += bd_len;
2021 ap = arr + offset;
2022 } else if (16 == bd_len) {
773642d9
DG
2023 put_unaligned_be64((u64)sdebug_capacity, ap + 0);
2024 put_unaligned_be32(sdebug_sector_size, ap + 12);
23183910
DG
2025 offset += bd_len;
2026 ap = arr + offset;
2027 }
1da177e4 2028
c65b1445
DG
2029 if ((subpcode > 0x0) && (subpcode < 0xff) && (0x19 != pcode)) {
2030 /* TODO: Control Extension page */
22017ed2 2031 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
1da177e4
LT
2032 return check_condition_result;
2033 }
760f3b03
DG
2034 bad_pcode = false;
2035
1da177e4
LT
2036 switch (pcode) {
2037 case 0x1: /* Read-Write error recovery page, direct access */
2038 len = resp_err_recov_pg(ap, pcontrol, target);
2039 offset += len;
2040 break;
2041 case 0x2: /* Disconnect-Reconnect page, all devices */
2042 len = resp_disconnect_pg(ap, pcontrol, target);
2043 offset += len;
2044 break;
2045 case 0x3: /* Format device page, direct access */
760f3b03
DG
2046 if (is_disk) {
2047 len = resp_format_pg(ap, pcontrol, target);
2048 offset += len;
2049 } else
2050 bad_pcode = true;
1da177e4
LT
2051 break;
2052 case 0x8: /* Caching page, direct access */
760f3b03
DG
2053 if (is_disk) {
2054 len = resp_caching_pg(ap, pcontrol, target);
2055 offset += len;
2056 } else
2057 bad_pcode = true;
1da177e4
LT
2058 break;
2059 case 0xa: /* Control Mode page, all devices */
2060 len = resp_ctrl_m_pg(ap, pcontrol, target);
2061 offset += len;
2062 break;
c65b1445
DG
2063 case 0x19: /* if spc==1 then sas phy, control+discover */
2064 if ((subpcode > 0x2) && (subpcode < 0xff)) {
22017ed2 2065 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
c65b1445
DG
2066 return check_condition_result;
2067 }
2068 len = 0;
2069 if ((0x0 == subpcode) || (0xff == subpcode))
2070 len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
2071 if ((0x1 == subpcode) || (0xff == subpcode))
2072 len += resp_sas_pcd_m_spg(ap + len, pcontrol, target,
2073 target_dev_id);
2074 if ((0x2 == subpcode) || (0xff == subpcode))
2075 len += resp_sas_sha_m_spg(ap + len, pcontrol);
2076 offset += len;
2077 break;
1da177e4
LT
2078 case 0x1c: /* Informational Exceptions Mode page, all devices */
2079 len = resp_iec_m_pg(ap, pcontrol, target);
2080 offset += len;
2081 break;
2082 case 0x3f: /* Read all Mode pages */
c65b1445
DG
2083 if ((0 == subpcode) || (0xff == subpcode)) {
2084 len = resp_err_recov_pg(ap, pcontrol, target);
2085 len += resp_disconnect_pg(ap + len, pcontrol, target);
760f3b03
DG
2086 if (is_disk) {
2087 len += resp_format_pg(ap + len, pcontrol,
2088 target);
2089 len += resp_caching_pg(ap + len, pcontrol,
2090 target);
2091 }
c65b1445
DG
2092 len += resp_ctrl_m_pg(ap + len, pcontrol, target);
2093 len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
2094 if (0xff == subpcode) {
2095 len += resp_sas_pcd_m_spg(ap + len, pcontrol,
2096 target, target_dev_id);
2097 len += resp_sas_sha_m_spg(ap + len, pcontrol);
2098 }
2099 len += resp_iec_m_pg(ap + len, pcontrol, target);
760f3b03 2100 offset += len;
c65b1445 2101 } else {
22017ed2 2102 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
c65b1445
DG
2103 return check_condition_result;
2104 }
1da177e4
LT
2105 break;
2106 default:
760f3b03
DG
2107 bad_pcode = true;
2108 break;
2109 }
2110 if (bad_pcode) {
22017ed2 2111 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 5);
1da177e4
LT
2112 return check_condition_result;
2113 }
2114 if (msense_6)
2115 arr[0] = offset - 1;
773642d9
DG
2116 else
2117 put_unaligned_be16((offset - 2), arr + 0);
1da177e4
LT
2118 return fill_from_dev_buffer(scp, arr, min(alloc_len, offset));
2119}
2120
c65b1445
DG
2121#define SDEBUG_MAX_MSELECT_SZ 512
2122
fd32119b
DG
2123static int resp_mode_select(struct scsi_cmnd *scp,
2124 struct sdebug_dev_info *devip)
c65b1445
DG
2125{
2126 int pf, sp, ps, md_len, bd_len, off, spf, pg_len;
c2248fc9 2127 int param_len, res, mpage;
c65b1445 2128 unsigned char arr[SDEBUG_MAX_MSELECT_SZ];
01123ef4 2129 unsigned char *cmd = scp->cmnd;
c2248fc9 2130 int mselect6 = (MODE_SELECT == cmd[0]);
c65b1445 2131
c65b1445
DG
2132 memset(arr, 0, sizeof(arr));
2133 pf = cmd[1] & 0x10;
2134 sp = cmd[1] & 0x1;
773642d9 2135 param_len = mselect6 ? cmd[4] : get_unaligned_be16(cmd + 7);
c65b1445 2136 if ((0 == pf) || sp || (param_len > SDEBUG_MAX_MSELECT_SZ)) {
22017ed2 2137 mk_sense_invalid_fld(scp, SDEB_IN_CDB, mselect6 ? 4 : 7, -1);
c65b1445
DG
2138 return check_condition_result;
2139 }
2140 res = fetch_to_dev_buffer(scp, arr, param_len);
2141 if (-1 == res)
773642d9
DG
2142 return DID_ERROR << 16;
2143 else if (sdebug_verbose && (res < param_len))
cbf67842
DG
2144 sdev_printk(KERN_INFO, scp->device,
2145 "%s: cdb indicated=%d, IO sent=%d bytes\n",
2146 __func__, param_len, res);
773642d9
DG
2147 md_len = mselect6 ? (arr[0] + 1) : (get_unaligned_be16(arr + 0) + 2);
2148 bd_len = mselect6 ? arr[3] : get_unaligned_be16(arr + 6);
23183910 2149 if (md_len > 2) {
22017ed2 2150 mk_sense_invalid_fld(scp, SDEB_IN_DATA, 0, -1);
c65b1445
DG
2151 return check_condition_result;
2152 }
2153 off = bd_len + (mselect6 ? 4 : 8);
2154 mpage = arr[off] & 0x3f;
2155 ps = !!(arr[off] & 0x80);
2156 if (ps) {
22017ed2 2157 mk_sense_invalid_fld(scp, SDEB_IN_DATA, off, 7);
c65b1445
DG
2158 return check_condition_result;
2159 }
2160 spf = !!(arr[off] & 0x40);
773642d9 2161 pg_len = spf ? (get_unaligned_be16(arr + off + 2) + 4) :
c65b1445
DG
2162 (arr[off + 1] + 2);
2163 if ((pg_len + off) > param_len) {
cbf67842 2164 mk_sense_buffer(scp, ILLEGAL_REQUEST,
c65b1445
DG
2165 PARAMETER_LIST_LENGTH_ERR, 0);
2166 return check_condition_result;
2167 }
2168 switch (mpage) {
cbf67842
DG
2169 case 0x8: /* Caching Mode page */
2170 if (caching_pg[1] == arr[off + 1]) {
2171 memcpy(caching_pg + 2, arr + off + 2,
2172 sizeof(caching_pg) - 2);
2173 goto set_mode_changed_ua;
2174 }
2175 break;
c65b1445
DG
2176 case 0xa: /* Control Mode page */
2177 if (ctrl_m_pg[1] == arr[off + 1]) {
2178 memcpy(ctrl_m_pg + 2, arr + off + 2,
2179 sizeof(ctrl_m_pg) - 2);
773642d9 2180 sdebug_dsense = !!(ctrl_m_pg[2] & 0x4);
cbf67842 2181 goto set_mode_changed_ua;
c65b1445
DG
2182 }
2183 break;
2184 case 0x1c: /* Informational Exceptions Mode page */
2185 if (iec_m_pg[1] == arr[off + 1]) {
2186 memcpy(iec_m_pg + 2, arr + off + 2,
2187 sizeof(iec_m_pg) - 2);
cbf67842 2188 goto set_mode_changed_ua;
c65b1445
DG
2189 }
2190 break;
2191 default:
2192 break;
2193 }
22017ed2 2194 mk_sense_invalid_fld(scp, SDEB_IN_DATA, off, 5);
c65b1445 2195 return check_condition_result;
cbf67842
DG
2196set_mode_changed_ua:
2197 set_bit(SDEBUG_UA_MODE_CHANGED, devip->uas_bm);
2198 return 0;
c65b1445
DG
2199}
2200
2201static int resp_temp_l_pg(unsigned char * arr)
2202{
2203 unsigned char temp_l_pg[] = {0x0, 0x0, 0x3, 0x2, 0x0, 38,
2204 0x0, 0x1, 0x3, 0x2, 0x0, 65,
2205 };
2206
2207 memcpy(arr, temp_l_pg, sizeof(temp_l_pg));
2208 return sizeof(temp_l_pg);
2209}
2210
2211static int resp_ie_l_pg(unsigned char * arr)
2212{
2213 unsigned char ie_l_pg[] = {0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 38,
2214 };
2215
2216 memcpy(arr, ie_l_pg, sizeof(ie_l_pg));
2217 if (iec_m_pg[2] & 0x4) { /* TEST bit set */
2218 arr[4] = THRESHOLD_EXCEEDED;
2219 arr[5] = 0xff;
2220 }
2221 return sizeof(ie_l_pg);
2222}
2223
2224#define SDEBUG_MAX_LSENSE_SZ 512
2225
2226static int resp_log_sense(struct scsi_cmnd * scp,
2227 struct sdebug_dev_info * devip)
2228{
c2248fc9 2229 int ppc, sp, pcontrol, pcode, subpcode, alloc_len, len, n;
c65b1445 2230 unsigned char arr[SDEBUG_MAX_LSENSE_SZ];
01123ef4 2231 unsigned char *cmd = scp->cmnd;
c65b1445 2232
c65b1445
DG
2233 memset(arr, 0, sizeof(arr));
2234 ppc = cmd[1] & 0x2;
2235 sp = cmd[1] & 0x1;
2236 if (ppc || sp) {
22017ed2 2237 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, ppc ? 1 : 0);
c65b1445
DG
2238 return check_condition_result;
2239 }
2240 pcontrol = (cmd[2] & 0xc0) >> 6;
2241 pcode = cmd[2] & 0x3f;
23183910 2242 subpcode = cmd[3] & 0xff;
773642d9 2243 alloc_len = get_unaligned_be16(cmd + 7);
c65b1445 2244 arr[0] = pcode;
23183910
DG
2245 if (0 == subpcode) {
2246 switch (pcode) {
2247 case 0x0: /* Supported log pages log page */
2248 n = 4;
2249 arr[n++] = 0x0; /* this page */
2250 arr[n++] = 0xd; /* Temperature */
2251 arr[n++] = 0x2f; /* Informational exceptions */
2252 arr[3] = n - 4;
2253 break;
2254 case 0xd: /* Temperature log page */
2255 arr[3] = resp_temp_l_pg(arr + 4);
2256 break;
2257 case 0x2f: /* Informational exceptions log page */
2258 arr[3] = resp_ie_l_pg(arr + 4);
2259 break;
2260 default:
22017ed2 2261 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 5);
23183910
DG
2262 return check_condition_result;
2263 }
2264 } else if (0xff == subpcode) {
2265 arr[0] |= 0x40;
2266 arr[1] = subpcode;
2267 switch (pcode) {
2268 case 0x0: /* Supported log pages and subpages log page */
2269 n = 4;
2270 arr[n++] = 0x0;
2271 arr[n++] = 0x0; /* 0,0 page */
2272 arr[n++] = 0x0;
2273 arr[n++] = 0xff; /* this page */
2274 arr[n++] = 0xd;
2275 arr[n++] = 0x0; /* Temperature */
2276 arr[n++] = 0x2f;
2277 arr[n++] = 0x0; /* Informational exceptions */
2278 arr[3] = n - 4;
2279 break;
2280 case 0xd: /* Temperature subpages */
2281 n = 4;
2282 arr[n++] = 0xd;
2283 arr[n++] = 0x0; /* Temperature */
2284 arr[3] = n - 4;
2285 break;
2286 case 0x2f: /* Informational exceptions subpages */
2287 n = 4;
2288 arr[n++] = 0x2f;
2289 arr[n++] = 0x0; /* Informational exceptions */
2290 arr[3] = n - 4;
2291 break;
2292 default:
22017ed2 2293 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 5);
23183910
DG
2294 return check_condition_result;
2295 }
2296 } else {
22017ed2 2297 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
c65b1445
DG
2298 return check_condition_result;
2299 }
773642d9 2300 len = min(get_unaligned_be16(arr + 2) + 4, alloc_len);
c65b1445
DG
2301 return fill_from_dev_buffer(scp, arr,
2302 min(len, SDEBUG_MAX_INQ_ARR_SZ));
2303}
2304
cbf67842 2305static int check_device_access_params(struct scsi_cmnd *scp,
19789100 2306 unsigned long long lba, unsigned int num)
1da177e4 2307{
c65b1445 2308 if (lba + num > sdebug_capacity) {
22017ed2 2309 mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
1da177e4
LT
2310 return check_condition_result;
2311 }
c65b1445
DG
2312 /* transfer length excessive (tie in to block limits VPD page) */
2313 if (num > sdebug_store_sectors) {
22017ed2 2314 /* needs work to find which cdb byte 'num' comes from */
cbf67842 2315 mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
c65b1445
DG
2316 return check_condition_result;
2317 }
19789100
FT
2318 return 0;
2319}
2320
a4517511 2321/* Returns number of bytes copied or -1 if error. */
fd32119b
DG
2322static int do_device_access(struct scsi_cmnd *scmd, u64 lba, u32 num,
2323 bool do_write)
19789100
FT
2324{
2325 int ret;
c2248fc9 2326 u64 block, rest = 0;
a4517511
AM
2327 struct scsi_data_buffer *sdb;
2328 enum dma_data_direction dir;
a4517511 2329
c2248fc9 2330 if (do_write) {
a4517511
AM
2331 sdb = scsi_out(scmd);
2332 dir = DMA_TO_DEVICE;
a4517511
AM
2333 } else {
2334 sdb = scsi_in(scmd);
2335 dir = DMA_FROM_DEVICE;
a4517511 2336 }
19789100 2337
a4517511
AM
2338 if (!sdb->length)
2339 return 0;
2340 if (!(scsi_bidi_cmnd(scmd) || scmd->sc_data_direction == dir))
2341 return -1;
19789100
FT
2342
2343 block = do_div(lba, sdebug_store_sectors);
2344 if (block + num > sdebug_store_sectors)
2345 rest = block + num - sdebug_store_sectors;
2346
386ecb12 2347 ret = sg_copy_buffer(sdb->table.sgl, sdb->table.nents,
773642d9
DG
2348 fake_storep + (block * sdebug_sector_size),
2349 (num - rest) * sdebug_sector_size, 0, do_write);
2350 if (ret != (num - rest) * sdebug_sector_size)
a4517511
AM
2351 return ret;
2352
2353 if (rest) {
386ecb12 2354 ret += sg_copy_buffer(sdb->table.sgl, sdb->table.nents,
773642d9
DG
2355 fake_storep, rest * sdebug_sector_size,
2356 (num - rest) * sdebug_sector_size, do_write);
a4517511 2357 }
19789100
FT
2358
2359 return ret;
2360}
2361
38d5c833
DG
2362/* If fake_store(lba,num) compares equal to arr(num), then copy top half of
2363 * arr into fake_store(lba,num) and return true. If comparison fails then
2364 * return false. */
fd32119b 2365static bool comp_write_worker(u64 lba, u32 num, const u8 *arr)
38d5c833
DG
2366{
2367 bool res;
2368 u64 block, rest = 0;
2369 u32 store_blks = sdebug_store_sectors;
773642d9 2370 u32 lb_size = sdebug_sector_size;
38d5c833
DG
2371
2372 block = do_div(lba, store_blks);
2373 if (block + num > store_blks)
2374 rest = block + num - store_blks;
2375
2376 res = !memcmp(fake_storep + (block * lb_size), arr,
2377 (num - rest) * lb_size);
2378 if (!res)
2379 return res;
2380 if (rest)
2381 res = memcmp(fake_storep, arr + ((num - rest) * lb_size),
2382 rest * lb_size);
2383 if (!res)
2384 return res;
2385 arr += num * lb_size;
2386 memcpy(fake_storep + (block * lb_size), arr, (num - rest) * lb_size);
2387 if (rest)
2388 memcpy(fake_storep, arr + ((num - rest) * lb_size),
2389 rest * lb_size);
2390 return res;
2391}
2392
51d648af 2393static __be16 dif_compute_csum(const void *buf, int len)
beb40ea4 2394{
51d648af 2395 __be16 csum;
beb40ea4 2396
773642d9 2397 if (sdebug_guard)
51d648af
AM
2398 csum = (__force __be16)ip_compute_csum(buf, len);
2399 else
beb40ea4 2400 csum = cpu_to_be16(crc_t10dif(buf, len));
51d648af 2401
beb40ea4
AM
2402 return csum;
2403}
2404
2405static int dif_verify(struct sd_dif_tuple *sdt, const void *data,
2406 sector_t sector, u32 ei_lba)
2407{
773642d9 2408 __be16 csum = dif_compute_csum(data, sdebug_sector_size);
beb40ea4
AM
2409
2410 if (sdt->guard_tag != csum) {
c1287970 2411 pr_err("GUARD check failed on sector %lu rcvd 0x%04x, data 0x%04x\n",
beb40ea4
AM
2412 (unsigned long)sector,
2413 be16_to_cpu(sdt->guard_tag),
2414 be16_to_cpu(csum));
2415 return 0x01;
2416 }
773642d9 2417 if (sdebug_dif == SD_DIF_TYPE1_PROTECTION &&
beb40ea4 2418 be32_to_cpu(sdt->ref_tag) != (sector & 0xffffffff)) {
c1287970
TW
2419 pr_err("REF check failed on sector %lu\n",
2420 (unsigned long)sector);
beb40ea4
AM
2421 return 0x03;
2422 }
773642d9 2423 if (sdebug_dif == SD_DIF_TYPE2_PROTECTION &&
beb40ea4 2424 be32_to_cpu(sdt->ref_tag) != ei_lba) {
c1287970
TW
2425 pr_err("REF check failed on sector %lu\n",
2426 (unsigned long)sector);
beb40ea4
AM
2427 return 0x03;
2428 }
2429 return 0;
2430}
2431
bb8c063c 2432static void dif_copy_prot(struct scsi_cmnd *SCpnt, sector_t sector,
65f72f2a 2433 unsigned int sectors, bool read)
c6a44287 2434{
be4e11be 2435 size_t resid;
c6a44287 2436 void *paddr;
14faa944 2437 const void *dif_store_end = dif_storep + sdebug_store_sectors;
be4e11be 2438 struct sg_mapping_iter miter;
c6a44287 2439
e18d8bea
AM
2440 /* Bytes of protection data to copy into sgl */
2441 resid = sectors * sizeof(*dif_storep);
c6a44287 2442
be4e11be
AM
2443 sg_miter_start(&miter, scsi_prot_sglist(SCpnt),
2444 scsi_prot_sg_count(SCpnt), SG_MITER_ATOMIC |
2445 (read ? SG_MITER_TO_SG : SG_MITER_FROM_SG));
2446
2447 while (sg_miter_next(&miter) && resid > 0) {
2448 size_t len = min(miter.length, resid);
14faa944 2449 void *start = dif_store(sector);
be4e11be 2450 size_t rest = 0;
14faa944
AM
2451
2452 if (dif_store_end < start + len)
2453 rest = start + len - dif_store_end;
c6a44287 2454
be4e11be 2455 paddr = miter.addr;
14faa944 2456
65f72f2a
AM
2457 if (read)
2458 memcpy(paddr, start, len - rest);
2459 else
2460 memcpy(start, paddr, len - rest);
2461
2462 if (rest) {
2463 if (read)
2464 memcpy(paddr + len - rest, dif_storep, rest);
2465 else
2466 memcpy(dif_storep, paddr + len - rest, rest);
2467 }
c6a44287 2468
e18d8bea 2469 sector += len / sizeof(*dif_storep);
c6a44287 2470 resid -= len;
c6a44287 2471 }
be4e11be 2472 sg_miter_stop(&miter);
bb8c063c
AM
2473}
2474
2475static int prot_verify_read(struct scsi_cmnd *SCpnt, sector_t start_sec,
2476 unsigned int sectors, u32 ei_lba)
2477{
2478 unsigned int i;
2479 struct sd_dif_tuple *sdt;
2480 sector_t sector;
2481
c45eabec 2482 for (i = 0; i < sectors; i++, ei_lba++) {
bb8c063c
AM
2483 int ret;
2484
2485 sector = start_sec + i;
2486 sdt = dif_store(sector);
2487
51d648af 2488 if (sdt->app_tag == cpu_to_be16(0xffff))
bb8c063c
AM
2489 continue;
2490
2491 ret = dif_verify(sdt, fake_store(sector), sector, ei_lba);
2492 if (ret) {
2493 dif_errors++;
2494 return ret;
2495 }
bb8c063c 2496 }
c6a44287 2497
65f72f2a 2498 dif_copy_prot(SCpnt, start_sec, sectors, true);
c6a44287
MP
2499 dix_reads++;
2500
2501 return 0;
2502}
2503
fd32119b 2504static int resp_read_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
19789100 2505{
c2248fc9 2506 u8 *cmd = scp->cmnd;
c4837394 2507 struct sdebug_queued_cmd *sqcp;
c2248fc9
DG
2508 u64 lba;
2509 u32 num;
2510 u32 ei_lba;
19789100
FT
2511 unsigned long iflags;
2512 int ret;
c2248fc9 2513 bool check_prot;
19789100 2514
c2248fc9
DG
2515 switch (cmd[0]) {
2516 case READ_16:
2517 ei_lba = 0;
2518 lba = get_unaligned_be64(cmd + 2);
2519 num = get_unaligned_be32(cmd + 10);
2520 check_prot = true;
2521 break;
2522 case READ_10:
2523 ei_lba = 0;
2524 lba = get_unaligned_be32(cmd + 2);
2525 num = get_unaligned_be16(cmd + 7);
2526 check_prot = true;
2527 break;
2528 case READ_6:
2529 ei_lba = 0;
2530 lba = (u32)cmd[3] | (u32)cmd[2] << 8 |
2531 (u32)(cmd[1] & 0x1f) << 16;
2532 num = (0 == cmd[4]) ? 256 : cmd[4];
2533 check_prot = true;
2534 break;
2535 case READ_12:
2536 ei_lba = 0;
2537 lba = get_unaligned_be32(cmd + 2);
2538 num = get_unaligned_be32(cmd + 6);
2539 check_prot = true;
2540 break;
2541 case XDWRITEREAD_10:
2542 ei_lba = 0;
2543 lba = get_unaligned_be32(cmd + 2);
2544 num = get_unaligned_be16(cmd + 7);
2545 check_prot = false;
2546 break;
2547 default: /* assume READ(32) */
2548 lba = get_unaligned_be64(cmd + 12);
2549 ei_lba = get_unaligned_be32(cmd + 20);
2550 num = get_unaligned_be32(cmd + 28);
2551 check_prot = false;
2552 break;
2553 }
f46eb0e9 2554 if (unlikely(have_dif_prot && check_prot)) {
773642d9 2555 if (sdebug_dif == SD_DIF_TYPE2_PROTECTION &&
c2248fc9
DG
2556 (cmd[1] & 0xe0)) {
2557 mk_sense_invalid_opcode(scp);
2558 return check_condition_result;
2559 }
773642d9
DG
2560 if ((sdebug_dif == SD_DIF_TYPE1_PROTECTION ||
2561 sdebug_dif == SD_DIF_TYPE3_PROTECTION) &&
c2248fc9
DG
2562 (cmd[1] & 0xe0) == 0)
2563 sdev_printk(KERN_ERR, scp->device, "Unprotected RD "
2564 "to DIF device\n");
2565 }
f46eb0e9 2566 if (unlikely(sdebug_any_injecting_opt)) {
c4837394 2567 sqcp = (struct sdebug_queued_cmd *)scp->host_scribble;
c2248fc9 2568
c4837394
DG
2569 if (sqcp) {
2570 if (sqcp->inj_short)
2571 num /= 2;
2572 }
2573 } else
2574 sqcp = NULL;
c2248fc9
DG
2575
2576 /* inline check_device_access_params() */
f46eb0e9 2577 if (unlikely(lba + num > sdebug_capacity)) {
c2248fc9
DG
2578 mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
2579 return check_condition_result;
2580 }
2581 /* transfer length excessive (tie in to block limits VPD page) */
f46eb0e9 2582 if (unlikely(num > sdebug_store_sectors)) {
c2248fc9
DG
2583 /* needs work to find which cdb byte 'num' comes from */
2584 mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
2585 return check_condition_result;
2586 }
19789100 2587
f46eb0e9
DG
2588 if (unlikely((SDEBUG_OPT_MEDIUM_ERR & sdebug_opts) &&
2589 (lba <= (OPT_MEDIUM_ERR_ADDR + OPT_MEDIUM_ERR_NUM - 1)) &&
2590 ((lba + num) > OPT_MEDIUM_ERR_ADDR))) {
c65b1445 2591 /* claim unrecoverable read error */
c2248fc9 2592 mk_sense_buffer(scp, MEDIUM_ERROR, UNRECOVERED_READ_ERR, 0);
c65b1445 2593 /* set info field and valid bit for fixed descriptor */
c2248fc9
DG
2594 if (0x70 == (scp->sense_buffer[0] & 0x7f)) {
2595 scp->sense_buffer[0] |= 0x80; /* Valid bit */
32f7ef73
DG
2596 ret = (lba < OPT_MEDIUM_ERR_ADDR)
2597 ? OPT_MEDIUM_ERR_ADDR : (int)lba;
c2248fc9 2598 put_unaligned_be32(ret, scp->sense_buffer + 3);
c65b1445 2599 }
c2248fc9 2600 scsi_set_resid(scp, scsi_bufflen(scp));
1da177e4
LT
2601 return check_condition_result;
2602 }
c6a44287 2603
6c78cc06
AM
2604 read_lock_irqsave(&atomic_rw, iflags);
2605
c6a44287 2606 /* DIX + T10 DIF */
f46eb0e9 2607 if (unlikely(sdebug_dix && scsi_prot_sg_count(scp))) {
c2248fc9 2608 int prot_ret = prot_verify_read(scp, lba, num, ei_lba);
c6a44287
MP
2609
2610 if (prot_ret) {
6c78cc06 2611 read_unlock_irqrestore(&atomic_rw, iflags);
c2248fc9 2612 mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, prot_ret);
c6a44287
MP
2613 return illegal_condition_result;
2614 }
2615 }
2616
c2248fc9 2617 ret = do_device_access(scp, lba, num, false);
1da177e4 2618 read_unlock_irqrestore(&atomic_rw, iflags);
f46eb0e9 2619 if (unlikely(ret == -1))
a4517511
AM
2620 return DID_ERROR << 16;
2621
c2248fc9 2622 scsi_in(scp)->resid = scsi_bufflen(scp) - ret;
a4517511 2623
c4837394
DG
2624 if (unlikely(sqcp)) {
2625 if (sqcp->inj_recovered) {
c2248fc9
DG
2626 mk_sense_buffer(scp, RECOVERED_ERROR,
2627 THRESHOLD_EXCEEDED, 0);
2628 return check_condition_result;
c4837394 2629 } else if (sqcp->inj_transport) {
c2248fc9
DG
2630 mk_sense_buffer(scp, ABORTED_COMMAND,
2631 TRANSPORT_PROBLEM, ACK_NAK_TO);
2632 return check_condition_result;
c4837394 2633 } else if (sqcp->inj_dif) {
c2248fc9
DG
2634 /* Logical block guard check failed */
2635 mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 1);
2636 return illegal_condition_result;
c4837394 2637 } else if (sqcp->inj_dix) {
c2248fc9
DG
2638 mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 1);
2639 return illegal_condition_result;
2640 }
2641 }
a4517511 2642 return 0;
1da177e4
LT
2643}
2644
58a8635d 2645static void dump_sector(unsigned char *buf, int len)
c6a44287 2646{
cbf67842 2647 int i, j, n;
c6a44287 2648
cbf67842 2649 pr_err(">>> Sector Dump <<<\n");
c6a44287 2650 for (i = 0 ; i < len ; i += 16) {
cbf67842 2651 char b[128];
c6a44287 2652
cbf67842 2653 for (j = 0, n = 0; j < 16; j++) {
c6a44287 2654 unsigned char c = buf[i+j];
cbf67842 2655
c6a44287 2656 if (c >= 0x20 && c < 0x7e)
cbf67842
DG
2657 n += scnprintf(b + n, sizeof(b) - n,
2658 " %c ", buf[i+j]);
c6a44287 2659 else
cbf67842
DG
2660 n += scnprintf(b + n, sizeof(b) - n,
2661 "%02x ", buf[i+j]);
c6a44287 2662 }
cbf67842 2663 pr_err("%04d: %s\n", i, b);
c6a44287
MP
2664 }
2665}
2666
2667static int prot_verify_write(struct scsi_cmnd *SCpnt, sector_t start_sec,
395cef03 2668 unsigned int sectors, u32 ei_lba)
c6a44287 2669{
be4e11be 2670 int ret;
c6a44287 2671 struct sd_dif_tuple *sdt;
be4e11be 2672 void *daddr;
65f72f2a 2673 sector_t sector = start_sec;
c6a44287 2674 int ppage_offset;
be4e11be
AM
2675 int dpage_offset;
2676 struct sg_mapping_iter diter;
2677 struct sg_mapping_iter piter;
c6a44287 2678
c6a44287
MP
2679 BUG_ON(scsi_sg_count(SCpnt) == 0);
2680 BUG_ON(scsi_prot_sg_count(SCpnt) == 0);
2681
be4e11be
AM
2682 sg_miter_start(&piter, scsi_prot_sglist(SCpnt),
2683 scsi_prot_sg_count(SCpnt),
2684 SG_MITER_ATOMIC | SG_MITER_FROM_SG);
2685 sg_miter_start(&diter, scsi_sglist(SCpnt), scsi_sg_count(SCpnt),
2686 SG_MITER_ATOMIC | SG_MITER_FROM_SG);
2687
2688 /* For each protection page */
2689 while (sg_miter_next(&piter)) {
2690 dpage_offset = 0;
2691 if (WARN_ON(!sg_miter_next(&diter))) {
2692 ret = 0x01;
2693 goto out;
2694 }
c6a44287 2695
be4e11be
AM
2696 for (ppage_offset = 0; ppage_offset < piter.length;
2697 ppage_offset += sizeof(struct sd_dif_tuple)) {
c6a44287 2698 /* If we're at the end of the current
be4e11be 2699 * data page advance to the next one
c6a44287 2700 */
be4e11be
AM
2701 if (dpage_offset >= diter.length) {
2702 if (WARN_ON(!sg_miter_next(&diter))) {
2703 ret = 0x01;
2704 goto out;
2705 }
2706 dpage_offset = 0;
c6a44287
MP
2707 }
2708
be4e11be
AM
2709 sdt = piter.addr + ppage_offset;
2710 daddr = diter.addr + dpage_offset;
c6a44287 2711
be4e11be 2712 ret = dif_verify(sdt, daddr, sector, ei_lba);
beb40ea4 2713 if (ret) {
773642d9 2714 dump_sector(daddr, sdebug_sector_size);
395cef03
MP
2715 goto out;
2716 }
2717
c6a44287 2718 sector++;
395cef03 2719 ei_lba++;
773642d9 2720 dpage_offset += sdebug_sector_size;
c6a44287 2721 }
be4e11be
AM
2722 diter.consumed = dpage_offset;
2723 sg_miter_stop(&diter);
c6a44287 2724 }
be4e11be 2725 sg_miter_stop(&piter);
c6a44287 2726
65f72f2a 2727 dif_copy_prot(SCpnt, start_sec, sectors, false);
c6a44287
MP
2728 dix_writes++;
2729
2730 return 0;
2731
2732out:
2733 dif_errors++;
be4e11be
AM
2734 sg_miter_stop(&diter);
2735 sg_miter_stop(&piter);
c6a44287
MP
2736 return ret;
2737}
2738
b90ebc3d
AM
2739static unsigned long lba_to_map_index(sector_t lba)
2740{
773642d9
DG
2741 if (sdebug_unmap_alignment)
2742 lba += sdebug_unmap_granularity - sdebug_unmap_alignment;
2743 sector_div(lba, sdebug_unmap_granularity);
b90ebc3d
AM
2744 return lba;
2745}
2746
2747static sector_t map_index_to_lba(unsigned long index)
44d92694 2748{
773642d9 2749 sector_t lba = index * sdebug_unmap_granularity;
a027b5b9 2750
773642d9
DG
2751 if (sdebug_unmap_alignment)
2752 lba -= sdebug_unmap_granularity - sdebug_unmap_alignment;
a027b5b9 2753 return lba;
b90ebc3d 2754}
44d92694 2755
b90ebc3d
AM
2756static unsigned int map_state(sector_t lba, unsigned int *num)
2757{
2758 sector_t end;
2759 unsigned int mapped;
2760 unsigned long index;
2761 unsigned long next;
44d92694 2762
b90ebc3d
AM
2763 index = lba_to_map_index(lba);
2764 mapped = test_bit(index, map_storep);
44d92694
MP
2765
2766 if (mapped)
b90ebc3d 2767 next = find_next_zero_bit(map_storep, map_size, index);
44d92694 2768 else
b90ebc3d 2769 next = find_next_bit(map_storep, map_size, index);
44d92694 2770
b90ebc3d 2771 end = min_t(sector_t, sdebug_store_sectors, map_index_to_lba(next));
44d92694 2772 *num = end - lba;
44d92694
MP
2773 return mapped;
2774}
2775
2776static void map_region(sector_t lba, unsigned int len)
2777{
44d92694
MP
2778 sector_t end = lba + len;
2779
44d92694 2780 while (lba < end) {
b90ebc3d 2781 unsigned long index = lba_to_map_index(lba);
44d92694 2782
b90ebc3d
AM
2783 if (index < map_size)
2784 set_bit(index, map_storep);
44d92694 2785
b90ebc3d 2786 lba = map_index_to_lba(index + 1);
44d92694
MP
2787 }
2788}
2789
2790static void unmap_region(sector_t lba, unsigned int len)
2791{
44d92694
MP
2792 sector_t end = lba + len;
2793
44d92694 2794 while (lba < end) {
b90ebc3d 2795 unsigned long index = lba_to_map_index(lba);
44d92694 2796
b90ebc3d 2797 if (lba == map_index_to_lba(index) &&
773642d9 2798 lba + sdebug_unmap_granularity <= end &&
b90ebc3d
AM
2799 index < map_size) {
2800 clear_bit(index, map_storep);
760f3b03 2801 if (sdebug_lbprz) { /* for LBPRZ=2 return 0xff_s */
be1dd78d 2802 memset(fake_storep +
760f3b03
DG
2803 lba * sdebug_sector_size,
2804 (sdebug_lbprz & 1) ? 0 : 0xff,
773642d9
DG
2805 sdebug_sector_size *
2806 sdebug_unmap_granularity);
b90ebc3d 2807 }
e9926b43
AM
2808 if (dif_storep) {
2809 memset(dif_storep + lba, 0xff,
2810 sizeof(*dif_storep) *
773642d9 2811 sdebug_unmap_granularity);
e9926b43 2812 }
be1dd78d 2813 }
b90ebc3d 2814 lba = map_index_to_lba(index + 1);
44d92694
MP
2815 }
2816}
2817
fd32119b 2818static int resp_write_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
1da177e4 2819{
c2248fc9
DG
2820 u8 *cmd = scp->cmnd;
2821 u64 lba;
2822 u32 num;
2823 u32 ei_lba;
1da177e4 2824 unsigned long iflags;
19789100 2825 int ret;
c2248fc9 2826 bool check_prot;
1da177e4 2827
c2248fc9
DG
2828 switch (cmd[0]) {
2829 case WRITE_16:
2830 ei_lba = 0;
2831 lba = get_unaligned_be64(cmd + 2);
2832 num = get_unaligned_be32(cmd + 10);
2833 check_prot = true;
2834 break;
2835 case WRITE_10:
2836 ei_lba = 0;
2837 lba = get_unaligned_be32(cmd + 2);
2838 num = get_unaligned_be16(cmd + 7);
2839 check_prot = true;
2840 break;
2841 case WRITE_6:
2842 ei_lba = 0;
2843 lba = (u32)cmd[3] | (u32)cmd[2] << 8 |
2844 (u32)(cmd[1] & 0x1f) << 16;
2845 num = (0 == cmd[4]) ? 256 : cmd[4];
2846 check_prot = true;
2847 break;
2848 case WRITE_12:
2849 ei_lba = 0;
2850 lba = get_unaligned_be32(cmd + 2);
2851 num = get_unaligned_be32(cmd + 6);
2852 check_prot = true;
2853 break;
2854 case 0x53: /* XDWRITEREAD(10) */
2855 ei_lba = 0;
2856 lba = get_unaligned_be32(cmd + 2);
2857 num = get_unaligned_be16(cmd + 7);
2858 check_prot = false;
2859 break;
2860 default: /* assume WRITE(32) */
2861 lba = get_unaligned_be64(cmd + 12);
2862 ei_lba = get_unaligned_be32(cmd + 20);
2863 num = get_unaligned_be32(cmd + 28);
2864 check_prot = false;
2865 break;
2866 }
f46eb0e9 2867 if (unlikely(have_dif_prot && check_prot)) {
773642d9 2868 if (sdebug_dif == SD_DIF_TYPE2_PROTECTION &&
c2248fc9
DG
2869 (cmd[1] & 0xe0)) {
2870 mk_sense_invalid_opcode(scp);
2871 return check_condition_result;
2872 }
773642d9
DG
2873 if ((sdebug_dif == SD_DIF_TYPE1_PROTECTION ||
2874 sdebug_dif == SD_DIF_TYPE3_PROTECTION) &&
c2248fc9
DG
2875 (cmd[1] & 0xe0) == 0)
2876 sdev_printk(KERN_ERR, scp->device, "Unprotected WR "
2877 "to DIF device\n");
2878 }
2879
2880 /* inline check_device_access_params() */
f46eb0e9 2881 if (unlikely(lba + num > sdebug_capacity)) {
c2248fc9
DG
2882 mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
2883 return check_condition_result;
2884 }
2885 /* transfer length excessive (tie in to block limits VPD page) */
f46eb0e9 2886 if (unlikely(num > sdebug_store_sectors)) {
c2248fc9
DG
2887 /* needs work to find which cdb byte 'num' comes from */
2888 mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
2889 return check_condition_result;
2890 }
1da177e4 2891
6c78cc06
AM
2892 write_lock_irqsave(&atomic_rw, iflags);
2893
c6a44287 2894 /* DIX + T10 DIF */
f46eb0e9 2895 if (unlikely(sdebug_dix && scsi_prot_sg_count(scp))) {
c2248fc9 2896 int prot_ret = prot_verify_write(scp, lba, num, ei_lba);
c6a44287
MP
2897
2898 if (prot_ret) {
6c78cc06 2899 write_unlock_irqrestore(&atomic_rw, iflags);
c2248fc9 2900 mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, prot_ret);
c6a44287
MP
2901 return illegal_condition_result;
2902 }
2903 }
2904
c2248fc9 2905 ret = do_device_access(scp, lba, num, true);
f46eb0e9 2906 if (unlikely(scsi_debug_lbp()))
44d92694 2907 map_region(lba, num);
1da177e4 2908 write_unlock_irqrestore(&atomic_rw, iflags);
f46eb0e9 2909 if (unlikely(-1 == ret))
773642d9 2910 return DID_ERROR << 16;
c4837394
DG
2911 else if (unlikely(sdebug_verbose &&
2912 (ret < (num * sdebug_sector_size))))
c2248fc9 2913 sdev_printk(KERN_INFO, scp->device,
cbf67842 2914 "%s: write: cdb indicated=%u, IO sent=%d bytes\n",
773642d9 2915 my_name, num * sdebug_sector_size, ret);
44d92694 2916
f46eb0e9 2917 if (unlikely(sdebug_any_injecting_opt)) {
c4837394
DG
2918 struct sdebug_queued_cmd *sqcp =
2919 (struct sdebug_queued_cmd *)scp->host_scribble;
c2248fc9 2920
c4837394
DG
2921 if (sqcp) {
2922 if (sqcp->inj_recovered) {
2923 mk_sense_buffer(scp, RECOVERED_ERROR,
2924 THRESHOLD_EXCEEDED, 0);
2925 return check_condition_result;
2926 } else if (sqcp->inj_dif) {
2927 /* Logical block guard check failed */
2928 mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 1);
2929 return illegal_condition_result;
2930 } else if (sqcp->inj_dix) {
2931 mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 1);
2932 return illegal_condition_result;
2933 }
c2248fc9
DG
2934 }
2935 }
44d92694
MP
2936 return 0;
2937}
2938
fd32119b
DG
2939static int resp_write_same(struct scsi_cmnd *scp, u64 lba, u32 num,
2940 u32 ei_lba, bool unmap, bool ndob)
44d92694
MP
2941{
2942 unsigned long iflags;
2943 unsigned long long i;
2944 int ret;
773642d9 2945 u64 lba_off;
44d92694 2946
c2248fc9 2947 ret = check_device_access_params(scp, lba, num);
44d92694
MP
2948 if (ret)
2949 return ret;
2950
2951 write_lock_irqsave(&atomic_rw, iflags);
2952
9ed8d3dc 2953 if (unmap && scsi_debug_lbp()) {
44d92694
MP
2954 unmap_region(lba, num);
2955 goto out;
2956 }
2957
773642d9 2958 lba_off = lba * sdebug_sector_size;
c2248fc9
DG
2959 /* if ndob then zero 1 logical block, else fetch 1 logical block */
2960 if (ndob) {
773642d9 2961 memset(fake_storep + lba_off, 0, sdebug_sector_size);
c2248fc9
DG
2962 ret = 0;
2963 } else
773642d9
DG
2964 ret = fetch_to_dev_buffer(scp, fake_storep + lba_off,
2965 sdebug_sector_size);
44d92694
MP
2966
2967 if (-1 == ret) {
2968 write_unlock_irqrestore(&atomic_rw, iflags);
773642d9
DG
2969 return DID_ERROR << 16;
2970 } else if (sdebug_verbose && (ret < (num * sdebug_sector_size)))
c2248fc9 2971 sdev_printk(KERN_INFO, scp->device,
cbf67842
DG
2972 "%s: %s: cdb indicated=%u, IO sent=%d bytes\n",
2973 my_name, "write same",
773642d9 2974 num * sdebug_sector_size, ret);
44d92694
MP
2975
2976 /* Copy first sector to remaining blocks */
2977 for (i = 1 ; i < num ; i++)
773642d9
DG
2978 memcpy(fake_storep + ((lba + i) * sdebug_sector_size),
2979 fake_storep + lba_off,
2980 sdebug_sector_size);
44d92694 2981
9ed8d3dc 2982 if (scsi_debug_lbp())
44d92694
MP
2983 map_region(lba, num);
2984out:
2985 write_unlock_irqrestore(&atomic_rw, iflags);
2986
1da177e4
LT
2987 return 0;
2988}
2989
fd32119b
DG
2990static int resp_write_same_10(struct scsi_cmnd *scp,
2991 struct sdebug_dev_info *devip)
c2248fc9
DG
2992{
2993 u8 *cmd = scp->cmnd;
2994 u32 lba;
2995 u16 num;
2996 u32 ei_lba = 0;
2997 bool unmap = false;
2998
2999 if (cmd[1] & 0x8) {
773642d9 3000 if (sdebug_lbpws10 == 0) {
c2248fc9
DG
3001 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 3);
3002 return check_condition_result;
3003 } else
3004 unmap = true;
3005 }
3006 lba = get_unaligned_be32(cmd + 2);
3007 num = get_unaligned_be16(cmd + 7);
773642d9 3008 if (num > sdebug_write_same_length) {
c2248fc9
DG
3009 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 7, -1);
3010 return check_condition_result;
3011 }
3012 return resp_write_same(scp, lba, num, ei_lba, unmap, false);
3013}
3014
fd32119b
DG
3015static int resp_write_same_16(struct scsi_cmnd *scp,
3016 struct sdebug_dev_info *devip)
c2248fc9
DG
3017{
3018 u8 *cmd = scp->cmnd;
3019 u64 lba;
3020 u32 num;
3021 u32 ei_lba = 0;
3022 bool unmap = false;
3023 bool ndob = false;
3024
3025 if (cmd[1] & 0x8) { /* UNMAP */
773642d9 3026 if (sdebug_lbpws == 0) {
c2248fc9
DG
3027 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 3);
3028 return check_condition_result;
3029 } else
3030 unmap = true;
3031 }
3032 if (cmd[1] & 0x1) /* NDOB (no data-out buffer, assumes zeroes) */
3033 ndob = true;
3034 lba = get_unaligned_be64(cmd + 2);
3035 num = get_unaligned_be32(cmd + 10);
773642d9 3036 if (num > sdebug_write_same_length) {
c2248fc9
DG
3037 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 10, -1);
3038 return check_condition_result;
3039 }
3040 return resp_write_same(scp, lba, num, ei_lba, unmap, ndob);
3041}
3042
acafd0b9
EM
3043/* Note the mode field is in the same position as the (lower) service action
3044 * field. For the Report supported operation codes command, SPC-4 suggests
3045 * each mode of this command should be reported separately; for future. */
fd32119b
DG
3046static int resp_write_buffer(struct scsi_cmnd *scp,
3047 struct sdebug_dev_info *devip)
acafd0b9
EM
3048{
3049 u8 *cmd = scp->cmnd;
3050 struct scsi_device *sdp = scp->device;
3051 struct sdebug_dev_info *dp;
3052 u8 mode;
3053
3054 mode = cmd[1] & 0x1f;
3055 switch (mode) {
3056 case 0x4: /* download microcode (MC) and activate (ACT) */
3057 /* set UAs on this device only */
3058 set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
3059 set_bit(SDEBUG_UA_MICROCODE_CHANGED, devip->uas_bm);
3060 break;
3061 case 0x5: /* download MC, save and ACT */
3062 set_bit(SDEBUG_UA_MICROCODE_CHANGED_WO_RESET, devip->uas_bm);
3063 break;
3064 case 0x6: /* download MC with offsets and ACT */
3065 /* set UAs on most devices (LUs) in this target */
3066 list_for_each_entry(dp,
3067 &devip->sdbg_host->dev_info_list,
3068 dev_list)
3069 if (dp->target == sdp->id) {
3070 set_bit(SDEBUG_UA_BUS_RESET, dp->uas_bm);
3071 if (devip != dp)
3072 set_bit(SDEBUG_UA_MICROCODE_CHANGED,
3073 dp->uas_bm);
3074 }
3075 break;
3076 case 0x7: /* download MC with offsets, save, and ACT */
3077 /* set UA on all devices (LUs) in this target */
3078 list_for_each_entry(dp,
3079 &devip->sdbg_host->dev_info_list,
3080 dev_list)
3081 if (dp->target == sdp->id)
3082 set_bit(SDEBUG_UA_MICROCODE_CHANGED_WO_RESET,
3083 dp->uas_bm);
3084 break;
3085 default:
3086 /* do nothing for this command for other mode values */
3087 break;
3088 }
3089 return 0;
3090}
3091
fd32119b
DG
3092static int resp_comp_write(struct scsi_cmnd *scp,
3093 struct sdebug_dev_info *devip)
38d5c833
DG
3094{
3095 u8 *cmd = scp->cmnd;
3096 u8 *arr;
3097 u8 *fake_storep_hold;
3098 u64 lba;
3099 u32 dnum;
773642d9 3100 u32 lb_size = sdebug_sector_size;
38d5c833
DG
3101 u8 num;
3102 unsigned long iflags;
3103 int ret;
d467d31f 3104 int retval = 0;
38d5c833 3105
d467d31f 3106 lba = get_unaligned_be64(cmd + 2);
38d5c833
DG
3107 num = cmd[13]; /* 1 to a maximum of 255 logical blocks */
3108 if (0 == num)
3109 return 0; /* degenerate case, not an error */
773642d9 3110 if (sdebug_dif == SD_DIF_TYPE2_PROTECTION &&
38d5c833
DG
3111 (cmd[1] & 0xe0)) {
3112 mk_sense_invalid_opcode(scp);
3113 return check_condition_result;
3114 }
773642d9
DG
3115 if ((sdebug_dif == SD_DIF_TYPE1_PROTECTION ||
3116 sdebug_dif == SD_DIF_TYPE3_PROTECTION) &&
38d5c833
DG
3117 (cmd[1] & 0xe0) == 0)
3118 sdev_printk(KERN_ERR, scp->device, "Unprotected WR "
3119 "to DIF device\n");
3120
3121 /* inline check_device_access_params() */
3122 if (lba + num > sdebug_capacity) {
3123 mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
3124 return check_condition_result;
3125 }
3126 /* transfer length excessive (tie in to block limits VPD page) */
3127 if (num > sdebug_store_sectors) {
3128 /* needs work to find which cdb byte 'num' comes from */
3129 mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
3130 return check_condition_result;
3131 }
d467d31f
DG
3132 dnum = 2 * num;
3133 arr = kzalloc(dnum * lb_size, GFP_ATOMIC);
3134 if (NULL == arr) {
3135 mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
3136 INSUFF_RES_ASCQ);
3137 return check_condition_result;
3138 }
38d5c833
DG
3139
3140 write_lock_irqsave(&atomic_rw, iflags);
3141
3142 /* trick do_device_access() to fetch both compare and write buffers
3143 * from data-in into arr. Safe (atomic) since write_lock held. */
3144 fake_storep_hold = fake_storep;
3145 fake_storep = arr;
3146 ret = do_device_access(scp, 0, dnum, true);
3147 fake_storep = fake_storep_hold;
3148 if (ret == -1) {
d467d31f
DG
3149 retval = DID_ERROR << 16;
3150 goto cleanup;
773642d9 3151 } else if (sdebug_verbose && (ret < (dnum * lb_size)))
38d5c833
DG
3152 sdev_printk(KERN_INFO, scp->device, "%s: compare_write: cdb "
3153 "indicated=%u, IO sent=%d bytes\n", my_name,
3154 dnum * lb_size, ret);
3155 if (!comp_write_worker(lba, num, arr)) {
38d5c833 3156 mk_sense_buffer(scp, MISCOMPARE, MISCOMPARE_VERIFY_ASC, 0);
d467d31f
DG
3157 retval = check_condition_result;
3158 goto cleanup;
38d5c833
DG
3159 }
3160 if (scsi_debug_lbp())
3161 map_region(lba, num);
d467d31f 3162cleanup:
38d5c833 3163 write_unlock_irqrestore(&atomic_rw, iflags);
d467d31f
DG
3164 kfree(arr);
3165 return retval;
38d5c833
DG
3166}
3167
44d92694
MP
3168struct unmap_block_desc {
3169 __be64 lba;
3170 __be32 blocks;
3171 __be32 __reserved;
3172};
3173
fd32119b 3174static int resp_unmap(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
44d92694
MP
3175{
3176 unsigned char *buf;
3177 struct unmap_block_desc *desc;
3178 unsigned int i, payload_len, descriptors;
3179 int ret;
6c78cc06 3180 unsigned long iflags;
44d92694 3181
44d92694 3182
c2248fc9
DG
3183 if (!scsi_debug_lbp())
3184 return 0; /* fib and say its done */
3185 payload_len = get_unaligned_be16(scp->cmnd + 7);
3186 BUG_ON(scsi_bufflen(scp) != payload_len);
44d92694
MP
3187
3188 descriptors = (payload_len - 8) / 16;
773642d9 3189 if (descriptors > sdebug_unmap_max_desc) {
c2248fc9
DG
3190 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 7, -1);
3191 return check_condition_result;
3192 }
44d92694 3193
b333a819 3194 buf = kzalloc(scsi_bufflen(scp), GFP_ATOMIC);
c2248fc9
DG
3195 if (!buf) {
3196 mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
3197 INSUFF_RES_ASCQ);
44d92694 3198 return check_condition_result;
c2248fc9 3199 }
44d92694 3200
c2248fc9 3201 scsi_sg_copy_to_buffer(scp, buf, scsi_bufflen(scp));
44d92694
MP
3202
3203 BUG_ON(get_unaligned_be16(&buf[0]) != payload_len - 2);
3204 BUG_ON(get_unaligned_be16(&buf[2]) != descriptors * 16);
3205
3206 desc = (void *)&buf[8];
3207
6c78cc06
AM
3208 write_lock_irqsave(&atomic_rw, iflags);
3209
44d92694
MP
3210 for (i = 0 ; i < descriptors ; i++) {
3211 unsigned long long lba = get_unaligned_be64(&desc[i].lba);
3212 unsigned int num = get_unaligned_be32(&desc[i].blocks);
3213
c2248fc9 3214 ret = check_device_access_params(scp, lba, num);
44d92694
MP
3215 if (ret)
3216 goto out;
3217
3218 unmap_region(lba, num);
3219 }
3220
3221 ret = 0;
3222
3223out:
6c78cc06 3224 write_unlock_irqrestore(&atomic_rw, iflags);
44d92694
MP
3225 kfree(buf);
3226
3227 return ret;
3228}
3229
3230#define SDEBUG_GET_LBA_STATUS_LEN 32
3231
fd32119b
DG
3232static int resp_get_lba_status(struct scsi_cmnd *scp,
3233 struct sdebug_dev_info *devip)
44d92694 3234{
c2248fc9
DG
3235 u8 *cmd = scp->cmnd;
3236 u64 lba;
3237 u32 alloc_len, mapped, num;
3238 u8 arr[SDEBUG_GET_LBA_STATUS_LEN];
44d92694
MP
3239 int ret;
3240
c2248fc9
DG
3241 lba = get_unaligned_be64(cmd + 2);
3242 alloc_len = get_unaligned_be32(cmd + 10);
44d92694
MP
3243
3244 if (alloc_len < 24)
3245 return 0;
3246
c2248fc9 3247 ret = check_device_access_params(scp, lba, 1);
44d92694
MP
3248 if (ret)
3249 return ret;
3250
c2248fc9
DG
3251 if (scsi_debug_lbp())
3252 mapped = map_state(lba, &num);
3253 else {
3254 mapped = 1;
3255 /* following just in case virtual_gb changed */
3256 sdebug_capacity = get_sdebug_capacity();
3257 if (sdebug_capacity - lba <= 0xffffffff)
3258 num = sdebug_capacity - lba;
3259 else
3260 num = 0xffffffff;
3261 }
44d92694
MP
3262
3263 memset(arr, 0, SDEBUG_GET_LBA_STATUS_LEN);
c2248fc9
DG
3264 put_unaligned_be32(20, arr); /* Parameter Data Length */
3265 put_unaligned_be64(lba, arr + 8); /* LBA */
3266 put_unaligned_be32(num, arr + 16); /* Number of blocks */
3267 arr[20] = !mapped; /* prov_stat=0: mapped; 1: dealloc */
44d92694 3268
c2248fc9 3269 return fill_from_dev_buffer(scp, arr, SDEBUG_GET_LBA_STATUS_LEN);
44d92694
MP
3270}
3271
8d039e22
DG
3272/* Even though each pseudo target has a REPORT LUNS "well known logical unit"
3273 * (W-LUN), the normal Linux scanning logic does not associate it with a
3274 * device (e.g. /dev/sg7). The following magic will make that association:
3275 * "cd /sys/class/scsi_host/host<n> ; echo '- - 49409' > scan"
3276 * where <n> is a host number. If there are multiple targets in a host then
3277 * the above will associate a W-LUN to each target. To only get a W-LUN
3278 * for target 2, then use "echo '- 2 49409' > scan" .
3279 */
3280static int resp_report_luns(struct scsi_cmnd *scp,
3281 struct sdebug_dev_info *devip)
1da177e4 3282{
8d039e22 3283 unsigned char *cmd = scp->cmnd;
1da177e4 3284 unsigned int alloc_len;
8d039e22 3285 unsigned char select_report;
22017ed2 3286 u64 lun;
8d039e22
DG
3287 struct scsi_lun *lun_p;
3288 u8 *arr;
3289 unsigned int lun_cnt; /* normal LUN count (max: 256) */
3290 unsigned int wlun_cnt; /* report luns W-LUN count */
3291 unsigned int tlun_cnt; /* total LUN count */
3292 unsigned int rlen; /* response length (in bytes) */
3293 int i, res;
1da177e4 3294
19c8ead7 3295 clear_luns_changed_on_target(devip);
8d039e22
DG
3296
3297 select_report = cmd[2];
3298 alloc_len = get_unaligned_be32(cmd + 6);
3299
3300 if (alloc_len < 4) {
3301 pr_err("alloc len too small %d\n", alloc_len);
3302 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 6, -1);
1da177e4
LT
3303 return check_condition_result;
3304 }
8d039e22
DG
3305
3306 switch (select_report) {
3307 case 0: /* all LUNs apart from W-LUNs */
3308 lun_cnt = sdebug_max_luns;
3309 wlun_cnt = 0;
3310 break;
3311 case 1: /* only W-LUNs */
c65b1445 3312 lun_cnt = 0;
8d039e22
DG
3313 wlun_cnt = 1;
3314 break;
3315 case 2: /* all LUNs */
3316 lun_cnt = sdebug_max_luns;
3317 wlun_cnt = 1;
3318 break;
3319 case 0x10: /* only administrative LUs */
3320 case 0x11: /* see SPC-5 */
3321 case 0x12: /* only subsiduary LUs owned by referenced LU */
3322 default:
3323 pr_debug("select report invalid %d\n", select_report);
3324 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, -1);
3325 return check_condition_result;
3326 }
3327
3328 if (sdebug_no_lun_0 && (lun_cnt > 0))
c65b1445 3329 --lun_cnt;
8d039e22
DG
3330
3331 tlun_cnt = lun_cnt + wlun_cnt;
3332
3333 rlen = (tlun_cnt * sizeof(struct scsi_lun)) + 8;
3334 arr = vmalloc(rlen);
3335 if (!arr) {
3336 mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
3337 INSUFF_RES_ASCQ);
3338 return check_condition_result;
3339 }
3340 memset(arr, 0, rlen);
3341 pr_debug("select_report %d luns = %d wluns = %d no_lun0 %d\n",
3342 select_report, lun_cnt, wlun_cnt, sdebug_no_lun_0);
3343
3344 /* luns start at byte 8 in response following the header */
3345 lun_p = (struct scsi_lun *)&arr[8];
3346
3347 /* LUNs use single level peripheral device addressing method */
3348 lun = sdebug_no_lun_0 ? 1 : 0;
3349 for (i = 0; i < lun_cnt; i++)
3350 int_to_scsilun(lun++, lun_p++);
3351
3352 if (wlun_cnt)
3353 int_to_scsilun(SCSI_W_LUN_REPORT_LUNS, lun_p++);
3354
3355 put_unaligned_be32(rlen - 8, &arr[0]);
3356
3357 res = fill_from_dev_buffer(scp, arr, rlen);
3358 vfree(arr);
3359 return res;
1da177e4
LT
3360}
3361
c639d14e
FT
3362static int resp_xdwriteread(struct scsi_cmnd *scp, unsigned long long lba,
3363 unsigned int num, struct sdebug_dev_info *devip)
3364{
be4e11be 3365 int j;
c639d14e
FT
3366 unsigned char *kaddr, *buf;
3367 unsigned int offset;
c639d14e 3368 struct scsi_data_buffer *sdb = scsi_in(scp);
be4e11be 3369 struct sg_mapping_iter miter;
c639d14e
FT
3370
3371 /* better not to use temporary buffer. */
b333a819 3372 buf = kzalloc(scsi_bufflen(scp), GFP_ATOMIC);
c5af0db9 3373 if (!buf) {
22017ed2
DG
3374 mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
3375 INSUFF_RES_ASCQ);
c5af0db9
AM
3376 return check_condition_result;
3377 }
c639d14e 3378
21a61829 3379 scsi_sg_copy_to_buffer(scp, buf, scsi_bufflen(scp));
c639d14e
FT
3380
3381 offset = 0;
be4e11be
AM
3382 sg_miter_start(&miter, sdb->table.sgl, sdb->table.nents,
3383 SG_MITER_ATOMIC | SG_MITER_TO_SG);
c639d14e 3384
be4e11be
AM
3385 while (sg_miter_next(&miter)) {
3386 kaddr = miter.addr;
3387 for (j = 0; j < miter.length; j++)
3388 *(kaddr + j) ^= *(buf + offset + j);
c639d14e 3389
be4e11be 3390 offset += miter.length;
c639d14e 3391 }
be4e11be 3392 sg_miter_stop(&miter);
c639d14e
FT
3393 kfree(buf);
3394
be4e11be 3395 return 0;
c639d14e
FT
3396}
3397
fd32119b
DG
3398static int resp_xdwriteread_10(struct scsi_cmnd *scp,
3399 struct sdebug_dev_info *devip)
c2248fc9
DG
3400{
3401 u8 *cmd = scp->cmnd;
3402 u64 lba;
3403 u32 num;
3404 int errsts;
3405
3406 if (!scsi_bidi_cmnd(scp)) {
3407 mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
3408 INSUFF_RES_ASCQ);
3409 return check_condition_result;
3410 }
3411 errsts = resp_read_dt0(scp, devip);
3412 if (errsts)
3413 return errsts;
3414 if (!(cmd[1] & 0x4)) { /* DISABLE_WRITE is not set */
3415 errsts = resp_write_dt0(scp, devip);
3416 if (errsts)
3417 return errsts;
3418 }
3419 lba = get_unaligned_be32(cmd + 2);
3420 num = get_unaligned_be16(cmd + 7);
3421 return resp_xdwriteread(scp, lba, num, devip);
3422}
3423
c4837394
DG
3424static struct sdebug_queue *get_queue(struct scsi_cmnd *cmnd)
3425{
3426 struct sdebug_queue *sqp = sdebug_q_arr;
3427
3428 if (sdebug_mq_active) {
3429 u32 tag = blk_mq_unique_tag(cmnd->request);
3430 u16 hwq = blk_mq_unique_tag_to_hwq(tag);
3431
3432 if (unlikely(hwq >= submit_queues)) {
3433 pr_warn("Unexpected hwq=%d, apply modulo\n", hwq);
3434 hwq %= submit_queues;
3435 }
3436 pr_debug("tag=%u, hwq=%d\n", tag, hwq);
3437 return sqp + hwq;
3438 } else
3439 return sqp;
3440}
3441
3442/* Queued (deferred) command completions converge here. */
fd32119b 3443static void sdebug_q_cmd_complete(struct sdebug_defer *sd_dp)
1da177e4 3444{
c4837394 3445 int qc_idx;
cbf67842 3446 int retiring = 0;
1da177e4 3447 unsigned long iflags;
c4837394 3448 struct sdebug_queue *sqp;
cbf67842
DG
3449 struct sdebug_queued_cmd *sqcp;
3450 struct scsi_cmnd *scp;
3451 struct sdebug_dev_info *devip;
1da177e4 3452
c4837394
DG
3453 qc_idx = sd_dp->qc_idx;
3454 sqp = sdebug_q_arr + sd_dp->sqa_idx;
3455 if (sdebug_statistics) {
3456 atomic_inc(&sdebug_completions);
3457 if (raw_smp_processor_id() != sd_dp->issuing_cpu)
3458 atomic_inc(&sdebug_miss_cpus);
3459 }
3460 if (unlikely((qc_idx < 0) || (qc_idx >= SDEBUG_CANQUEUE))) {
3461 pr_err("wild qc_idx=%d\n", qc_idx);
1da177e4
LT
3462 return;
3463 }
c4837394
DG
3464 spin_lock_irqsave(&sqp->qc_lock, iflags);
3465 sqcp = &sqp->qc_arr[qc_idx];
cbf67842 3466 scp = sqcp->a_cmnd;
b01f6f83 3467 if (unlikely(scp == NULL)) {
c4837394
DG
3468 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
3469 pr_err("scp is NULL, sqa_idx=%d, qc_idx=%d\n",
3470 sd_dp->sqa_idx, qc_idx);
cbf67842
DG
3471 return;
3472 }
3473 devip = (struct sdebug_dev_info *)scp->device->hostdata;
f46eb0e9 3474 if (likely(devip))
cbf67842
DG
3475 atomic_dec(&devip->num_in_q);
3476 else
c1287970 3477 pr_err("devip=NULL\n");
f46eb0e9 3478 if (unlikely(atomic_read(&retired_max_queue) > 0))
cbf67842
DG
3479 retiring = 1;
3480
3481 sqcp->a_cmnd = NULL;
c4837394
DG
3482 if (unlikely(!test_and_clear_bit(qc_idx, sqp->in_use_bm))) {
3483 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
c1287970 3484 pr_err("Unexpected completion\n");
1da177e4
LT
3485 return;
3486 }
cbf67842
DG
3487
3488 if (unlikely(retiring)) { /* user has reduced max_queue */
3489 int k, retval;
3490
3491 retval = atomic_read(&retired_max_queue);
c4837394
DG
3492 if (qc_idx >= retval) {
3493 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
c1287970 3494 pr_err("index %d too large\n", retval);
cbf67842
DG
3495 return;
3496 }
c4837394 3497 k = find_last_bit(sqp->in_use_bm, retval);
773642d9 3498 if ((k < sdebug_max_queue) || (k == retval))
cbf67842
DG
3499 atomic_set(&retired_max_queue, 0);
3500 else
3501 atomic_set(&retired_max_queue, k + 1);
1da177e4 3502 }
c4837394 3503 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
cbf67842 3504 scp->scsi_done(scp); /* callback to mid level */
1da177e4
LT
3505}
3506
cbf67842 3507/* When high resolution timer goes off this function is called. */
fd32119b 3508static enum hrtimer_restart sdebug_q_cmd_hrt_complete(struct hrtimer *timer)
cbf67842 3509{
a10bc12a
DG
3510 struct sdebug_defer *sd_dp = container_of(timer, struct sdebug_defer,
3511 hrt);
3512 sdebug_q_cmd_complete(sd_dp);
cbf67842
DG
3513 return HRTIMER_NORESTART;
3514}
1da177e4 3515
a10bc12a 3516/* When work queue schedules work, it calls this function. */
fd32119b 3517static void sdebug_q_cmd_wq_complete(struct work_struct *work)
a10bc12a
DG
3518{
3519 struct sdebug_defer *sd_dp = container_of(work, struct sdebug_defer,
3520 ew.work);
3521 sdebug_q_cmd_complete(sd_dp);
3522}
3523
09ba24c1
DG
3524static bool got_shared_uuid;
3525static uuid_be shared_uuid;
3526
fd32119b
DG
3527static struct sdebug_dev_info *sdebug_device_create(
3528 struct sdebug_host_info *sdbg_host, gfp_t flags)
5cb2fc06
FT
3529{
3530 struct sdebug_dev_info *devip;
3531
3532 devip = kzalloc(sizeof(*devip), flags);
3533 if (devip) {
09ba24c1
DG
3534 if (sdebug_uuid_ctl == 1)
3535 uuid_be_gen(&devip->lu_name);
3536 else if (sdebug_uuid_ctl == 2) {
3537 if (got_shared_uuid)
3538 devip->lu_name = shared_uuid;
3539 else {
3540 uuid_be_gen(&shared_uuid);
3541 got_shared_uuid = true;
3542 devip->lu_name = shared_uuid;
3543 }
3544 }
5cb2fc06
FT
3545 devip->sdbg_host = sdbg_host;
3546 list_add_tail(&devip->dev_list, &sdbg_host->dev_info_list);
3547 }
3548 return devip;
3549}
3550
f46eb0e9 3551static struct sdebug_dev_info *find_build_dev_info(struct scsi_device *sdev)
1da177e4 3552{
f46eb0e9
DG
3553 struct sdebug_host_info *sdbg_host;
3554 struct sdebug_dev_info *open_devip = NULL;
3555 struct sdebug_dev_info *devip;
1da177e4 3556
d1e4c9c5
FT
3557 sdbg_host = *(struct sdebug_host_info **)shost_priv(sdev->host);
3558 if (!sdbg_host) {
c1287970 3559 pr_err("Host info NULL\n");
1da177e4
LT
3560 return NULL;
3561 }
3562 list_for_each_entry(devip, &sdbg_host->dev_info_list, dev_list) {
3563 if ((devip->used) && (devip->channel == sdev->channel) &&
3564 (devip->target == sdev->id) &&
3565 (devip->lun == sdev->lun))
3566 return devip;
3567 else {
3568 if ((!devip->used) && (!open_devip))
3569 open_devip = devip;
3570 }
3571 }
5cb2fc06
FT
3572 if (!open_devip) { /* try and make a new one */
3573 open_devip = sdebug_device_create(sdbg_host, GFP_ATOMIC);
3574 if (!open_devip) {
c1287970 3575 pr_err("out of memory at line %d\n", __LINE__);
1da177e4
LT
3576 return NULL;
3577 }
1da177e4 3578 }
a75869d1
FT
3579
3580 open_devip->channel = sdev->channel;
3581 open_devip->target = sdev->id;
3582 open_devip->lun = sdev->lun;
3583 open_devip->sdbg_host = sdbg_host;
cbf67842
DG
3584 atomic_set(&open_devip->num_in_q, 0);
3585 set_bit(SDEBUG_UA_POR, open_devip->uas_bm);
c2248fc9 3586 open_devip->used = true;
a75869d1 3587 return open_devip;
1da177e4
LT
3588}
3589
8dea0d02 3590static int scsi_debug_slave_alloc(struct scsi_device *sdp)
1da177e4 3591{
773642d9 3592 if (sdebug_verbose)
c1287970 3593 pr_info("slave_alloc <%u %u %u %llu>\n",
8dea0d02 3594 sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
75ad23bc 3595 queue_flag_set_unlocked(QUEUE_FLAG_BIDI, sdp->request_queue);
8dea0d02
FT
3596 return 0;
3597}
1da177e4 3598
8dea0d02
FT
3599static int scsi_debug_slave_configure(struct scsi_device *sdp)
3600{
f46eb0e9
DG
3601 struct sdebug_dev_info *devip =
3602 (struct sdebug_dev_info *)sdp->hostdata;
a34c4e98 3603
773642d9 3604 if (sdebug_verbose)
c1287970 3605 pr_info("slave_configure <%u %u %u %llu>\n",
8dea0d02 3606 sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
b01f6f83
DG
3607 if (sdp->host->max_cmd_len != SDEBUG_MAX_CMD_LEN)
3608 sdp->host->max_cmd_len = SDEBUG_MAX_CMD_LEN;
3609 if (devip == NULL) {
f46eb0e9 3610 devip = find_build_dev_info(sdp);
b01f6f83 3611 if (devip == NULL)
f46eb0e9
DG
3612 return 1; /* no resources, will be marked offline */
3613 }
c8b09f6f 3614 sdp->hostdata = devip;
6bb5e6e7 3615 blk_queue_max_segment_size(sdp->request_queue, -1U);
773642d9 3616 if (sdebug_no_uld)
78d4e5a0 3617 sdp->no_uld_attach = 1;
8dea0d02
FT
3618 return 0;
3619}
3620
3621static void scsi_debug_slave_destroy(struct scsi_device *sdp)
3622{
3623 struct sdebug_dev_info *devip =
3624 (struct sdebug_dev_info *)sdp->hostdata;
a34c4e98 3625
773642d9 3626 if (sdebug_verbose)
c1287970 3627 pr_info("slave_destroy <%u %u %u %llu>\n",
8dea0d02
FT
3628 sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
3629 if (devip) {
25985edc 3630 /* make this slot available for re-use */
c2248fc9 3631 devip->used = false;
8dea0d02
FT
3632 sdp->hostdata = NULL;
3633 }
3634}
3635
c4837394
DG
3636static void stop_qc_helper(struct sdebug_defer *sd_dp)
3637{
3638 if (!sd_dp)
3639 return;
3640 if ((sdebug_jdelay > 0) || (sdebug_ndelay > 0))
3641 hrtimer_cancel(&sd_dp->hrt);
3642 else if (sdebug_jdelay < 0)
3643 cancel_work_sync(&sd_dp->ew.work);
3644}
3645
a10bc12a
DG
3646/* If @cmnd found deletes its timer or work queue and returns true; else
3647 returns false */
3648static bool stop_queued_cmnd(struct scsi_cmnd *cmnd)
8dea0d02
FT
3649{
3650 unsigned long iflags;
c4837394
DG
3651 int j, k, qmax, r_qmax;
3652 struct sdebug_queue *sqp;
8dea0d02 3653 struct sdebug_queued_cmd *sqcp;
cbf67842 3654 struct sdebug_dev_info *devip;
a10bc12a 3655 struct sdebug_defer *sd_dp;
8dea0d02 3656
c4837394
DG
3657 for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
3658 spin_lock_irqsave(&sqp->qc_lock, iflags);
3659 qmax = sdebug_max_queue;
3660 r_qmax = atomic_read(&retired_max_queue);
3661 if (r_qmax > qmax)
3662 qmax = r_qmax;
3663 for (k = 0; k < qmax; ++k) {
3664 if (test_bit(k, sqp->in_use_bm)) {
3665 sqcp = &sqp->qc_arr[k];
3666 if (cmnd != sqcp->a_cmnd)
3667 continue;
3668 /* found */
3669 devip = (struct sdebug_dev_info *)
3670 cmnd->device->hostdata;
3671 if (devip)
3672 atomic_dec(&devip->num_in_q);
3673 sqcp->a_cmnd = NULL;
3674 sd_dp = sqcp->sd_dp;
3675 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
3676 stop_qc_helper(sd_dp);
3677 clear_bit(k, sqp->in_use_bm);
3678 return true;
cbf67842 3679 }
8dea0d02 3680 }
c4837394 3681 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
8dea0d02 3682 }
a10bc12a 3683 return false;
8dea0d02
FT
3684}
3685
a10bc12a 3686/* Deletes (stops) timers or work queues of all queued commands */
8dea0d02
FT
3687static void stop_all_queued(void)
3688{
3689 unsigned long iflags;
c4837394
DG
3690 int j, k;
3691 struct sdebug_queue *sqp;
8dea0d02 3692 struct sdebug_queued_cmd *sqcp;
cbf67842 3693 struct sdebug_dev_info *devip;
a10bc12a 3694 struct sdebug_defer *sd_dp;
8dea0d02 3695
c4837394
DG
3696 for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
3697 spin_lock_irqsave(&sqp->qc_lock, iflags);
3698 for (k = 0; k < SDEBUG_CANQUEUE; ++k) {
3699 if (test_bit(k, sqp->in_use_bm)) {
3700 sqcp = &sqp->qc_arr[k];
3701 if (sqcp->a_cmnd == NULL)
3702 continue;
3703 devip = (struct sdebug_dev_info *)
3704 sqcp->a_cmnd->device->hostdata;
3705 if (devip)
3706 atomic_dec(&devip->num_in_q);
3707 sqcp->a_cmnd = NULL;
3708 sd_dp = sqcp->sd_dp;
3709 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
3710 stop_qc_helper(sd_dp);
3711 clear_bit(k, sqp->in_use_bm);
3712 spin_lock_irqsave(&sqp->qc_lock, iflags);
cbf67842 3713 }
8dea0d02 3714 }
c4837394 3715 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
8dea0d02 3716 }
1da177e4
LT
3717}
3718
cbf67842
DG
3719/* Free queued command memory on heap */
3720static void free_all_queued(void)
1da177e4 3721{
c4837394
DG
3722 int j, k;
3723 struct sdebug_queue *sqp;
cbf67842
DG
3724 struct sdebug_queued_cmd *sqcp;
3725
c4837394
DG
3726 for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
3727 for (k = 0; k < SDEBUG_CANQUEUE; ++k) {
3728 sqcp = &sqp->qc_arr[k];
3729 kfree(sqcp->sd_dp);
3730 sqcp->sd_dp = NULL;
3731 }
cbf67842 3732 }
1da177e4
LT
3733}
3734
cbf67842 3735static int scsi_debug_abort(struct scsi_cmnd *SCpnt)
1da177e4 3736{
a10bc12a
DG
3737 bool ok;
3738
cbf67842
DG
3739 ++num_aborts;
3740 if (SCpnt) {
a10bc12a
DG
3741 ok = stop_queued_cmnd(SCpnt);
3742 if (SCpnt->device && (SDEBUG_OPT_ALL_NOISE & sdebug_opts))
3743 sdev_printk(KERN_INFO, SCpnt->device,
3744 "%s: command%s found\n", __func__,
3745 ok ? "" : " not");
cbf67842
DG
3746 }
3747 return SUCCESS;
1da177e4
LT
3748}
3749
3750static int scsi_debug_device_reset(struct scsi_cmnd * SCpnt)
3751{
1da177e4 3752 ++num_dev_resets;
cbf67842
DG
3753 if (SCpnt && SCpnt->device) {
3754 struct scsi_device *sdp = SCpnt->device;
f46eb0e9
DG
3755 struct sdebug_dev_info *devip =
3756 (struct sdebug_dev_info *)sdp->hostdata;
cbf67842 3757
773642d9 3758 if (SDEBUG_OPT_ALL_NOISE & sdebug_opts)
cbf67842 3759 sdev_printk(KERN_INFO, sdp, "%s\n", __func__);
1da177e4 3760 if (devip)
cbf67842
DG
3761 set_bit(SDEBUG_UA_POR, devip->uas_bm);
3762 }
3763 return SUCCESS;
3764}
3765
3766static int scsi_debug_target_reset(struct scsi_cmnd *SCpnt)
3767{
3768 struct sdebug_host_info *sdbg_host;
3769 struct sdebug_dev_info *devip;
3770 struct scsi_device *sdp;
3771 struct Scsi_Host *hp;
3772 int k = 0;
3773
3774 ++num_target_resets;
3775 if (!SCpnt)
3776 goto lie;
3777 sdp = SCpnt->device;
3778 if (!sdp)
3779 goto lie;
773642d9 3780 if (SDEBUG_OPT_ALL_NOISE & sdebug_opts)
cbf67842
DG
3781 sdev_printk(KERN_INFO, sdp, "%s\n", __func__);
3782 hp = sdp->host;
3783 if (!hp)
3784 goto lie;
3785 sdbg_host = *(struct sdebug_host_info **)shost_priv(hp);
3786 if (sdbg_host) {
3787 list_for_each_entry(devip,
3788 &sdbg_host->dev_info_list,
3789 dev_list)
3790 if (devip->target == sdp->id) {
3791 set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
3792 ++k;
3793 }
1da177e4 3794 }
773642d9 3795 if (SDEBUG_OPT_RESET_NOISE & sdebug_opts)
cbf67842
DG
3796 sdev_printk(KERN_INFO, sdp,
3797 "%s: %d device(s) found in target\n", __func__, k);
3798lie:
1da177e4
LT
3799 return SUCCESS;
3800}
3801
3802static int scsi_debug_bus_reset(struct scsi_cmnd * SCpnt)
3803{
3804 struct sdebug_host_info *sdbg_host;
cbf67842 3805 struct sdebug_dev_info *devip;
1da177e4
LT
3806 struct scsi_device * sdp;
3807 struct Scsi_Host * hp;
cbf67842 3808 int k = 0;
1da177e4 3809
1da177e4 3810 ++num_bus_resets;
cbf67842
DG
3811 if (!(SCpnt && SCpnt->device))
3812 goto lie;
3813 sdp = SCpnt->device;
773642d9 3814 if (SDEBUG_OPT_ALL_NOISE & sdebug_opts)
cbf67842
DG
3815 sdev_printk(KERN_INFO, sdp, "%s\n", __func__);
3816 hp = sdp->host;
3817 if (hp) {
d1e4c9c5 3818 sdbg_host = *(struct sdebug_host_info **)shost_priv(hp);
1da177e4 3819 if (sdbg_host) {
cbf67842 3820 list_for_each_entry(devip,
1da177e4 3821 &sdbg_host->dev_info_list,
cbf67842
DG
3822 dev_list) {
3823 set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
3824 ++k;
3825 }
1da177e4
LT
3826 }
3827 }
773642d9 3828 if (SDEBUG_OPT_RESET_NOISE & sdebug_opts)
cbf67842
DG
3829 sdev_printk(KERN_INFO, sdp,
3830 "%s: %d device(s) found in host\n", __func__, k);
3831lie:
1da177e4
LT
3832 return SUCCESS;
3833}
3834
3835static int scsi_debug_host_reset(struct scsi_cmnd * SCpnt)
3836{
3837 struct sdebug_host_info * sdbg_host;
cbf67842
DG
3838 struct sdebug_dev_info *devip;
3839 int k = 0;
1da177e4 3840
1da177e4 3841 ++num_host_resets;
773642d9 3842 if ((SCpnt->device) && (SDEBUG_OPT_ALL_NOISE & sdebug_opts))
cbf67842 3843 sdev_printk(KERN_INFO, SCpnt->device, "%s\n", __func__);
1da177e4
LT
3844 spin_lock(&sdebug_host_list_lock);
3845 list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
cbf67842
DG
3846 list_for_each_entry(devip, &sdbg_host->dev_info_list,
3847 dev_list) {
3848 set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
3849 ++k;
3850 }
1da177e4
LT
3851 }
3852 spin_unlock(&sdebug_host_list_lock);
3853 stop_all_queued();
773642d9 3854 if (SDEBUG_OPT_RESET_NOISE & sdebug_opts)
cbf67842
DG
3855 sdev_printk(KERN_INFO, SCpnt->device,
3856 "%s: %d device(s) found\n", __func__, k);
1da177e4
LT
3857 return SUCCESS;
3858}
3859
f58b0efb 3860static void __init sdebug_build_parts(unsigned char *ramp,
5f2578e5 3861 unsigned long store_size)
1da177e4
LT
3862{
3863 struct partition * pp;
3864 int starts[SDEBUG_MAX_PARTS + 2];
3865 int sectors_per_part, num_sectors, k;
3866 int heads_by_sects, start_sec, end_sec;
3867
3868 /* assume partition table already zeroed */
773642d9 3869 if ((sdebug_num_parts < 1) || (store_size < 1048576))
1da177e4 3870 return;
773642d9
DG
3871 if (sdebug_num_parts > SDEBUG_MAX_PARTS) {
3872 sdebug_num_parts = SDEBUG_MAX_PARTS;
c1287970 3873 pr_warn("reducing partitions to %d\n", SDEBUG_MAX_PARTS);
1da177e4 3874 }
c65b1445 3875 num_sectors = (int)sdebug_store_sectors;
1da177e4 3876 sectors_per_part = (num_sectors - sdebug_sectors_per)
773642d9 3877 / sdebug_num_parts;
1da177e4
LT
3878 heads_by_sects = sdebug_heads * sdebug_sectors_per;
3879 starts[0] = sdebug_sectors_per;
773642d9 3880 for (k = 1; k < sdebug_num_parts; ++k)
1da177e4
LT
3881 starts[k] = ((k * sectors_per_part) / heads_by_sects)
3882 * heads_by_sects;
773642d9
DG
3883 starts[sdebug_num_parts] = num_sectors;
3884 starts[sdebug_num_parts + 1] = 0;
1da177e4
LT
3885
3886 ramp[510] = 0x55; /* magic partition markings */
3887 ramp[511] = 0xAA;
3888 pp = (struct partition *)(ramp + 0x1be);
3889 for (k = 0; starts[k + 1]; ++k, ++pp) {
3890 start_sec = starts[k];
3891 end_sec = starts[k + 1] - 1;
3892 pp->boot_ind = 0;
3893
3894 pp->cyl = start_sec / heads_by_sects;
3895 pp->head = (start_sec - (pp->cyl * heads_by_sects))
3896 / sdebug_sectors_per;
3897 pp->sector = (start_sec % sdebug_sectors_per) + 1;
3898
3899 pp->end_cyl = end_sec / heads_by_sects;
3900 pp->end_head = (end_sec - (pp->end_cyl * heads_by_sects))
3901 / sdebug_sectors_per;
3902 pp->end_sector = (end_sec % sdebug_sectors_per) + 1;
3903
150c3544
AM
3904 pp->start_sect = cpu_to_le32(start_sec);
3905 pp->nr_sects = cpu_to_le32(end_sec - start_sec + 1);
1da177e4
LT
3906 pp->sys_ind = 0x83; /* plain Linux partition */
3907 }
3908}
3909
c4837394
DG
3910static void block_unblock_all_queues(bool block)
3911{
3912 int j;
3913 struct sdebug_queue *sqp;
3914
3915 for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp)
3916 atomic_set(&sqp->blocked, (int)block);
3917}
3918
3919/* Adjust (by rounding down) the sdebug_cmnd_count so abs(every_nth)-1
3920 * commands will be processed normally before triggers occur.
3921 */
3922static void tweak_cmnd_count(void)
3923{
3924 int count, modulo;
3925
3926 modulo = abs(sdebug_every_nth);
3927 if (modulo < 2)
3928 return;
3929 block_unblock_all_queues(true);
3930 count = atomic_read(&sdebug_cmnd_count);
3931 atomic_set(&sdebug_cmnd_count, (count / modulo) * modulo);
3932 block_unblock_all_queues(false);
3933}
3934
3935static void clear_queue_stats(void)
3936{
3937 atomic_set(&sdebug_cmnd_count, 0);
3938 atomic_set(&sdebug_completions, 0);
3939 atomic_set(&sdebug_miss_cpus, 0);
3940 atomic_set(&sdebug_a_tsf, 0);
3941}
3942
3943static void setup_inject(struct sdebug_queue *sqp,
3944 struct sdebug_queued_cmd *sqcp)
3945{
3946 if ((atomic_read(&sdebug_cmnd_count) % abs(sdebug_every_nth)) > 0)
3947 return;
3948 sqcp->inj_recovered = !!(SDEBUG_OPT_RECOVERED_ERR & sdebug_opts);
3949 sqcp->inj_transport = !!(SDEBUG_OPT_TRANSPORT_ERR & sdebug_opts);
3950 sqcp->inj_dif = !!(SDEBUG_OPT_DIF_ERR & sdebug_opts);
3951 sqcp->inj_dix = !!(SDEBUG_OPT_DIX_ERR & sdebug_opts);
3952 sqcp->inj_short = !!(SDEBUG_OPT_SHORT_TRANSFER & sdebug_opts);
3953}
3954
3955/* Complete the processing of the thread that queued a SCSI command to this
3956 * driver. It either completes the command by calling cmnd_done() or
3957 * schedules a hr timer or work queue then returns 0. Returns
3958 * SCSI_MLQUEUE_HOST_BUSY if temporarily out of resources.
3959 */
fd32119b
DG
3960static int schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip,
3961 int scsi_result, int delta_jiff)
1da177e4 3962{
cbf67842 3963 unsigned long iflags;
cd62b7da 3964 int k, num_in_q, qdepth, inject;
c4837394
DG
3965 struct sdebug_queue *sqp;
3966 struct sdebug_queued_cmd *sqcp;
299b6c07 3967 struct scsi_device *sdp;
a10bc12a 3968 struct sdebug_defer *sd_dp;
299b6c07 3969
b01f6f83
DG
3970 if (unlikely(devip == NULL)) {
3971 if (scsi_result == 0)
f46eb0e9
DG
3972 scsi_result = DID_NO_CONNECT << 16;
3973 goto respond_in_thread;
cbf67842 3974 }
299b6c07
TW
3975 sdp = cmnd->device;
3976
f46eb0e9 3977 if (unlikely(sdebug_verbose && scsi_result))
cbf67842
DG
3978 sdev_printk(KERN_INFO, sdp, "%s: non-zero result=0x%x\n",
3979 __func__, scsi_result);
cd62b7da
DG
3980 if (delta_jiff == 0)
3981 goto respond_in_thread;
1da177e4 3982
cd62b7da 3983 /* schedule the response at a later time if resources permit */
c4837394
DG
3984 sqp = get_queue(cmnd);
3985 spin_lock_irqsave(&sqp->qc_lock, iflags);
3986 if (unlikely(atomic_read(&sqp->blocked))) {
3987 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
3988 return SCSI_MLQUEUE_HOST_BUSY;
3989 }
cbf67842
DG
3990 num_in_q = atomic_read(&devip->num_in_q);
3991 qdepth = cmnd->device->queue_depth;
cbf67842 3992 inject = 0;
f46eb0e9 3993 if (unlikely((qdepth > 0) && (num_in_q >= qdepth))) {
cd62b7da 3994 if (scsi_result) {
c4837394 3995 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
cd62b7da
DG
3996 goto respond_in_thread;
3997 } else
3998 scsi_result = device_qfull_result;
c4837394 3999 } else if (unlikely(sdebug_every_nth &&
f46eb0e9
DG
4000 (SDEBUG_OPT_RARE_TSF & sdebug_opts) &&
4001 (scsi_result == 0))) {
cbf67842
DG
4002 if ((num_in_q == (qdepth - 1)) &&
4003 (atomic_inc_return(&sdebug_a_tsf) >=
773642d9 4004 abs(sdebug_every_nth))) {
cbf67842
DG
4005 atomic_set(&sdebug_a_tsf, 0);
4006 inject = 1;
cd62b7da 4007 scsi_result = device_qfull_result;
1da177e4
LT
4008 }
4009 }
1da177e4 4010
c4837394 4011 k = find_first_zero_bit(sqp->in_use_bm, sdebug_max_queue);
f46eb0e9 4012 if (unlikely(k >= sdebug_max_queue)) {
c4837394 4013 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
cd62b7da
DG
4014 if (scsi_result)
4015 goto respond_in_thread;
773642d9 4016 else if (SDEBUG_OPT_ALL_TSF & sdebug_opts)
cd62b7da 4017 scsi_result = device_qfull_result;
773642d9 4018 if (SDEBUG_OPT_Q_NOISE & sdebug_opts)
cbf67842 4019 sdev_printk(KERN_INFO, sdp,
cd62b7da 4020 "%s: max_queue=%d exceeded, %s\n",
773642d9 4021 __func__, sdebug_max_queue,
cd62b7da
DG
4022 (scsi_result ? "status: TASK SET FULL" :
4023 "report: host busy"));
4024 if (scsi_result)
4025 goto respond_in_thread;
4026 else
cbf67842
DG
4027 return SCSI_MLQUEUE_HOST_BUSY;
4028 }
c4837394 4029 __set_bit(k, sqp->in_use_bm);
cbf67842 4030 atomic_inc(&devip->num_in_q);
c4837394 4031 sqcp = &sqp->qc_arr[k];
cbf67842 4032 sqcp->a_cmnd = cmnd;
c4837394 4033 cmnd->host_scribble = (unsigned char *)sqcp;
cbf67842 4034 cmnd->result = scsi_result;
a10bc12a 4035 sd_dp = sqcp->sd_dp;
c4837394
DG
4036 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
4037 if (unlikely(sdebug_every_nth && sdebug_any_injecting_opt))
4038 setup_inject(sqp, sqcp);
b01f6f83 4039 if (delta_jiff > 0 || sdebug_ndelay > 0) {
b333a819 4040 ktime_t kt;
cbf67842 4041
b333a819
DG
4042 if (delta_jiff > 0) {
4043 struct timespec ts;
4044
4045 jiffies_to_timespec(delta_jiff, &ts);
4046 kt = ktime_set(ts.tv_sec, ts.tv_nsec);
4047 } else
4048 kt = ktime_set(0, sdebug_ndelay);
a10bc12a
DG
4049 if (NULL == sd_dp) {
4050 sd_dp = kzalloc(sizeof(*sd_dp), GFP_ATOMIC);
4051 if (NULL == sd_dp)
cbf67842 4052 return SCSI_MLQUEUE_HOST_BUSY;
a10bc12a
DG
4053 sqcp->sd_dp = sd_dp;
4054 hrtimer_init(&sd_dp->hrt, CLOCK_MONOTONIC,
c4837394 4055 HRTIMER_MODE_REL_PINNED);
a10bc12a 4056 sd_dp->hrt.function = sdebug_q_cmd_hrt_complete;
c4837394
DG
4057 sd_dp->sqa_idx = sqp - sdebug_q_arr;
4058 sd_dp->qc_idx = k;
1da177e4 4059 }
c4837394
DG
4060 if (sdebug_statistics)
4061 sd_dp->issuing_cpu = raw_smp_processor_id();
4062 hrtimer_start(&sd_dp->hrt, kt, HRTIMER_MODE_REL_PINNED);
4063 } else { /* jdelay < 0, use work queue */
a10bc12a
DG
4064 if (NULL == sd_dp) {
4065 sd_dp = kzalloc(sizeof(*sqcp->sd_dp), GFP_ATOMIC);
4066 if (NULL == sd_dp)
cbf67842 4067 return SCSI_MLQUEUE_HOST_BUSY;
a10bc12a 4068 sqcp->sd_dp = sd_dp;
c4837394
DG
4069 sd_dp->sqa_idx = sqp - sdebug_q_arr;
4070 sd_dp->qc_idx = k;
a10bc12a 4071 INIT_WORK(&sd_dp->ew.work, sdebug_q_cmd_wq_complete);
cbf67842 4072 }
c4837394
DG
4073 if (sdebug_statistics)
4074 sd_dp->issuing_cpu = raw_smp_processor_id();
a10bc12a 4075 schedule_work(&sd_dp->ew.work);
1da177e4 4076 }
f46eb0e9
DG
4077 if (unlikely((SDEBUG_OPT_Q_NOISE & sdebug_opts) &&
4078 (scsi_result == device_qfull_result)))
cbf67842
DG
4079 sdev_printk(KERN_INFO, sdp,
4080 "%s: num_in_q=%d +1, %s%s\n", __func__,
4081 num_in_q, (inject ? "<inject> " : ""),
4082 "status: TASK SET FULL");
4083 return 0;
cd62b7da
DG
4084
4085respond_in_thread: /* call back to mid-layer using invocation thread */
4086 cmnd->result = scsi_result;
4087 cmnd->scsi_done(cmnd);
4088 return 0;
1da177e4 4089}
cbf67842 4090
23183910
DG
4091/* Note: The following macros create attribute files in the
4092 /sys/module/scsi_debug/parameters directory. Unfortunately this
4093 driver is unaware of a change and cannot trigger auxiliary actions
4094 as it can when the corresponding attribute in the
4095 /sys/bus/pseudo/drivers/scsi_debug directory is changed.
4096 */
773642d9
DG
4097module_param_named(add_host, sdebug_add_host, int, S_IRUGO | S_IWUSR);
4098module_param_named(ato, sdebug_ato, int, S_IRUGO);
4099module_param_named(clustering, sdebug_clustering, bool, S_IRUGO | S_IWUSR);
c2206098 4100module_param_named(delay, sdebug_jdelay, int, S_IRUGO | S_IWUSR);
773642d9
DG
4101module_param_named(dev_size_mb, sdebug_dev_size_mb, int, S_IRUGO);
4102module_param_named(dif, sdebug_dif, int, S_IRUGO);
4103module_param_named(dix, sdebug_dix, int, S_IRUGO);
4104module_param_named(dsense, sdebug_dsense, int, S_IRUGO | S_IWUSR);
4105module_param_named(every_nth, sdebug_every_nth, int, S_IRUGO | S_IWUSR);
4106module_param_named(fake_rw, sdebug_fake_rw, int, S_IRUGO | S_IWUSR);
4107module_param_named(guard, sdebug_guard, uint, S_IRUGO);
4108module_param_named(host_lock, sdebug_host_lock, bool, S_IRUGO | S_IWUSR);
4109module_param_named(lbpu, sdebug_lbpu, int, S_IRUGO);
4110module_param_named(lbpws, sdebug_lbpws, int, S_IRUGO);
4111module_param_named(lbpws10, sdebug_lbpws10, int, S_IRUGO);
4112module_param_named(lbprz, sdebug_lbprz, int, S_IRUGO);
4113module_param_named(lowest_aligned, sdebug_lowest_aligned, int, S_IRUGO);
4114module_param_named(max_luns, sdebug_max_luns, int, S_IRUGO | S_IWUSR);
4115module_param_named(max_queue, sdebug_max_queue, int, S_IRUGO | S_IWUSR);
4116module_param_named(ndelay, sdebug_ndelay, int, S_IRUGO | S_IWUSR);
4117module_param_named(no_lun_0, sdebug_no_lun_0, int, S_IRUGO | S_IWUSR);
4118module_param_named(no_uld, sdebug_no_uld, int, S_IRUGO);
4119module_param_named(num_parts, sdebug_num_parts, int, S_IRUGO);
4120module_param_named(num_tgts, sdebug_num_tgts, int, S_IRUGO | S_IWUSR);
4121module_param_named(opt_blks, sdebug_opt_blks, int, S_IRUGO);
4122module_param_named(opts, sdebug_opts, int, S_IRUGO | S_IWUSR);
4123module_param_named(physblk_exp, sdebug_physblk_exp, int, S_IRUGO);
4124module_param_named(ptype, sdebug_ptype, int, S_IRUGO | S_IWUSR);
4125module_param_named(removable, sdebug_removable, bool, S_IRUGO | S_IWUSR);
4126module_param_named(scsi_level, sdebug_scsi_level, int, S_IRUGO);
4127module_param_named(sector_size, sdebug_sector_size, int, S_IRUGO);
c4837394 4128module_param_named(statistics, sdebug_statistics, bool, S_IRUGO | S_IWUSR);
773642d9 4129module_param_named(strict, sdebug_strict, bool, S_IRUGO | S_IWUSR);
c4837394 4130module_param_named(submit_queues, submit_queues, int, S_IRUGO);
773642d9
DG
4131module_param_named(unmap_alignment, sdebug_unmap_alignment, int, S_IRUGO);
4132module_param_named(unmap_granularity, sdebug_unmap_granularity, int, S_IRUGO);
4133module_param_named(unmap_max_blocks, sdebug_unmap_max_blocks, int, S_IRUGO);
4134module_param_named(unmap_max_desc, sdebug_unmap_max_desc, int, S_IRUGO);
4135module_param_named(virtual_gb, sdebug_virtual_gb, int, S_IRUGO | S_IWUSR);
09ba24c1 4136module_param_named(uuid_ctl, sdebug_uuid_ctl, int, S_IRUGO);
773642d9 4137module_param_named(vpd_use_hostno, sdebug_vpd_use_hostno, int,
5b94e232 4138 S_IRUGO | S_IWUSR);
773642d9 4139module_param_named(write_same_length, sdebug_write_same_length, int,
5b94e232 4140 S_IRUGO | S_IWUSR);
1da177e4
LT
4141
4142MODULE_AUTHOR("Eric Youngdale + Douglas Gilbert");
4143MODULE_DESCRIPTION("SCSI debug adapter driver");
4144MODULE_LICENSE("GPL");
b01f6f83 4145MODULE_VERSION(SDEBUG_VERSION);
1da177e4
LT
4146
4147MODULE_PARM_DESC(add_host, "0..127 hosts allowed(def=1)");
5b94e232 4148MODULE_PARM_DESC(ato, "application tag ownership: 0=disk 1=host (def=1)");
0759c666 4149MODULE_PARM_DESC(clustering, "when set enables larger transfers (def=0)");
cbf67842 4150MODULE_PARM_DESC(delay, "response delay (def=1 jiffy); 0:imm, -1,-2:tiny");
c2248fc9 4151MODULE_PARM_DESC(dev_size_mb, "size in MiB of ram shared by devs(def=8)");
5b94e232
MP
4152MODULE_PARM_DESC(dif, "data integrity field type: 0-3 (def=0)");
4153MODULE_PARM_DESC(dix, "data integrity extensions mask (def=0)");
c65b1445 4154MODULE_PARM_DESC(dsense, "use descriptor sense format(def=0 -> fixed)");
beb87c33 4155MODULE_PARM_DESC(every_nth, "timeout every nth command(def=0)");
23183910 4156MODULE_PARM_DESC(fake_rw, "fake reads/writes instead of copying (def=0)");
5b94e232 4157MODULE_PARM_DESC(guard, "protection checksum: 0=crc, 1=ip (def=0)");
185dd232 4158MODULE_PARM_DESC(host_lock, "host_lock is ignored (def=0)");
5b94e232
MP
4159MODULE_PARM_DESC(lbpu, "enable LBP, support UNMAP command (def=0)");
4160MODULE_PARM_DESC(lbpws, "enable LBP, support WRITE SAME(16) with UNMAP bit (def=0)");
4161MODULE_PARM_DESC(lbpws10, "enable LBP, support WRITE SAME(10) with UNMAP bit (def=0)");
760f3b03
DG
4162MODULE_PARM_DESC(lbprz,
4163 "on read unmapped LBs return 0 when 1 (def), return 0xff when 2");
5b94e232 4164MODULE_PARM_DESC(lowest_aligned, "lowest aligned lba (def=0)");
c65b1445 4165MODULE_PARM_DESC(max_luns, "number of LUNs per target to simulate(def=1)");
cbf67842
DG
4166MODULE_PARM_DESC(max_queue, "max number of queued commands (1 to max(def))");
4167MODULE_PARM_DESC(ndelay, "response delay in nanoseconds (def=0 -> ignore)");
c65b1445 4168MODULE_PARM_DESC(no_lun_0, "no LU number 0 (def=0 -> have lun 0)");
78d4e5a0 4169MODULE_PARM_DESC(no_uld, "stop ULD (e.g. sd driver) attaching (def=0))");
1da177e4 4170MODULE_PARM_DESC(num_parts, "number of partitions(def=0)");
c65b1445 4171MODULE_PARM_DESC(num_tgts, "number of targets per host to simulate(def=1)");
32c5844a 4172MODULE_PARM_DESC(opt_blks, "optimal transfer length in blocks (def=1024)");
6f3cbf55 4173MODULE_PARM_DESC(opts, "1->noise, 2->medium_err, 4->timeout, 8->recovered_err... (def=0)");
5b94e232 4174MODULE_PARM_DESC(physblk_exp, "physical block exponent (def=0)");
1da177e4 4175MODULE_PARM_DESC(ptype, "SCSI peripheral type(def=0[disk])");
d986788b 4176MODULE_PARM_DESC(removable, "claim to have removable media (def=0)");
760f3b03 4177MODULE_PARM_DESC(scsi_level, "SCSI level to simulate(def=7[SPC-5])");
ea61fca5 4178MODULE_PARM_DESC(sector_size, "logical block size in bytes (def=512)");
c4837394 4179MODULE_PARM_DESC(statistics, "collect statistics on commands, queues (def=0)");
c2248fc9 4180MODULE_PARM_DESC(strict, "stricter checks: reserved field in cdb (def=0)");
c4837394 4181MODULE_PARM_DESC(submit_queues, "support for block multi-queue (def=1)");
5b94e232
MP
4182MODULE_PARM_DESC(unmap_alignment, "lowest aligned thin provisioning lba (def=0)");
4183MODULE_PARM_DESC(unmap_granularity, "thin provisioning granularity in blocks (def=1)");
6014759c
MP
4184MODULE_PARM_DESC(unmap_max_blocks, "max # of blocks can be unmapped in one cmd (def=0xffffffff)");
4185MODULE_PARM_DESC(unmap_max_desc, "max # of ranges that can be unmapped in one cmd (def=256)");
09ba24c1
DG
4186MODULE_PARM_DESC(uuid_ctl,
4187 "1->use uuid for lu name, 0->don't, 2->all use same (def=0)");
c2248fc9 4188MODULE_PARM_DESC(virtual_gb, "virtual gigabyte (GiB) size (def=0 -> use dev_size_mb)");
5b94e232
MP
4189MODULE_PARM_DESC(vpd_use_hostno, "0 -> dev ids ignore hostno (def=1 -> unique dev ids)");
4190MODULE_PARM_DESC(write_same_length, "Maximum blocks per WRITE SAME cmd (def=0xffff)");
1da177e4 4191
760f3b03
DG
4192#define SDEBUG_INFO_LEN 256
4193static char sdebug_info[SDEBUG_INFO_LEN];
1da177e4
LT
4194
4195static const char * scsi_debug_info(struct Scsi_Host * shp)
4196{
c4837394
DG
4197 int k;
4198
760f3b03
DG
4199 k = scnprintf(sdebug_info, SDEBUG_INFO_LEN, "%s: version %s [%s]\n",
4200 my_name, SDEBUG_VERSION, sdebug_version_date);
4201 if (k >= (SDEBUG_INFO_LEN - 1))
c4837394 4202 return sdebug_info;
760f3b03
DG
4203 scnprintf(sdebug_info + k, SDEBUG_INFO_LEN - k,
4204 " dev_size_mb=%d, opts=0x%x, submit_queues=%d, %s=%d",
4205 sdebug_dev_size_mb, sdebug_opts, submit_queues,
4206 "statistics", (int)sdebug_statistics);
1da177e4
LT
4207 return sdebug_info;
4208}
4209
cbf67842 4210/* 'echo <val> > /proc/scsi/scsi_debug/<host_id>' writes to opts */
fd32119b
DG
4211static int scsi_debug_write_info(struct Scsi_Host *host, char *buffer,
4212 int length)
1da177e4 4213{
c8ed555a
AV
4214 char arr[16];
4215 int opts;
4216 int minLen = length > 15 ? 15 : length;
1da177e4 4217
c8ed555a
AV
4218 if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
4219 return -EACCES;
4220 memcpy(arr, buffer, minLen);
4221 arr[minLen] = '\0';
4222 if (1 != sscanf(arr, "%d", &opts))
4223 return -EINVAL;
773642d9
DG
4224 sdebug_opts = opts;
4225 sdebug_verbose = !!(SDEBUG_OPT_NOISE & opts);
4226 sdebug_any_injecting_opt = !!(SDEBUG_OPT_ALL_INJECTING & opts);
4227 if (sdebug_every_nth != 0)
c4837394 4228 tweak_cmnd_count();
c8ed555a
AV
4229 return length;
4230}
1da177e4 4231
cbf67842
DG
4232/* Output seen with 'cat /proc/scsi/scsi_debug/<host_id>'. It will be the
4233 * same for each scsi_debug host (if more than one). Some of the counters
4234 * output are not atomics so might be inaccurate in a busy system. */
c8ed555a
AV
4235static int scsi_debug_show_info(struct seq_file *m, struct Scsi_Host *host)
4236{
c4837394
DG
4237 int f, j, l;
4238 struct sdebug_queue *sqp;
4239
4240 seq_printf(m, "scsi_debug adapter driver, version %s [%s]\n",
4241 SDEBUG_VERSION, sdebug_version_date);
4242 seq_printf(m, "num_tgts=%d, %ssize=%d MB, opts=0x%x, every_nth=%d\n",
4243 sdebug_num_tgts, "shared (ram) ", sdebug_dev_size_mb,
4244 sdebug_opts, sdebug_every_nth);
4245 seq_printf(m, "delay=%d, ndelay=%d, max_luns=%d, sector_size=%d %s\n",
4246 sdebug_jdelay, sdebug_ndelay, sdebug_max_luns,
4247 sdebug_sector_size, "bytes");
4248 seq_printf(m, "cylinders=%d, heads=%d, sectors=%d, command aborts=%d\n",
4249 sdebug_cylinders_per, sdebug_heads, sdebug_sectors_per,
4250 num_aborts);
4251 seq_printf(m, "RESETs: device=%d, target=%d, bus=%d, host=%d\n",
4252 num_dev_resets, num_target_resets, num_bus_resets,
4253 num_host_resets);
4254 seq_printf(m, "dix_reads=%d, dix_writes=%d, dif_errors=%d\n",
4255 dix_reads, dix_writes, dif_errors);
4256 seq_printf(m, "usec_in_jiffy=%lu, %s=%d, mq_active=%d\n",
4257 TICK_NSEC / 1000, "statistics", sdebug_statistics,
4258 sdebug_mq_active);
4259 seq_printf(m, "cmnd_count=%d, completions=%d, %s=%d, a_tsf=%d\n",
4260 atomic_read(&sdebug_cmnd_count),
4261 atomic_read(&sdebug_completions),
4262 "miss_cpus", atomic_read(&sdebug_miss_cpus),
4263 atomic_read(&sdebug_a_tsf));
4264
4265 seq_printf(m, "submit_queues=%d\n", submit_queues);
4266 for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
4267 seq_printf(m, " queue %d:\n", j);
4268 f = find_first_bit(sqp->in_use_bm, sdebug_max_queue);
4269 if (f != sdebug_max_queue) {
4270 l = find_last_bit(sqp->in_use_bm, sdebug_max_queue);
4271 seq_printf(m, " in_use_bm BUSY: %s: %d,%d\n",
4272 "first,last bits", f, l);
4273 }
cbf67842 4274 }
c8ed555a 4275 return 0;
1da177e4
LT
4276}
4277
82069379 4278static ssize_t delay_show(struct device_driver *ddp, char *buf)
1da177e4 4279{
c2206098 4280 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_jdelay);
1da177e4 4281}
c4837394
DG
4282/* Returns -EBUSY if jdelay is being changed and commands are queued. The unit
4283 * of delay is jiffies.
4284 */
82069379
AM
4285static ssize_t delay_store(struct device_driver *ddp, const char *buf,
4286 size_t count)
1da177e4 4287{
c2206098 4288 int jdelay, res;
cbf67842 4289
b01f6f83 4290 if (count > 0 && sscanf(buf, "%d", &jdelay) == 1) {
cbf67842 4291 res = count;
c2206098 4292 if (sdebug_jdelay != jdelay) {
c4837394
DG
4293 int j, k;
4294 struct sdebug_queue *sqp;
4295
4296 block_unblock_all_queues(true);
4297 for (j = 0, sqp = sdebug_q_arr; j < submit_queues;
4298 ++j, ++sqp) {
4299 k = find_first_bit(sqp->in_use_bm,
4300 sdebug_max_queue);
4301 if (k != sdebug_max_queue) {
4302 res = -EBUSY; /* queued commands */
4303 break;
4304 }
4305 }
4306 if (res > 0) {
a10bc12a
DG
4307 /* make sure sdebug_defer instances get
4308 * re-allocated for new delay variant */
4309 free_all_queued();
c2206098 4310 sdebug_jdelay = jdelay;
773642d9 4311 sdebug_ndelay = 0;
cbf67842 4312 }
c4837394 4313 block_unblock_all_queues(false);
1da177e4 4314 }
cbf67842 4315 return res;
1da177e4
LT
4316 }
4317 return -EINVAL;
4318}
82069379 4319static DRIVER_ATTR_RW(delay);
1da177e4 4320
cbf67842
DG
4321static ssize_t ndelay_show(struct device_driver *ddp, char *buf)
4322{
773642d9 4323 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_ndelay);
cbf67842
DG
4324}
4325/* Returns -EBUSY if ndelay is being changed and commands are queued */
c2206098 4326/* If > 0 and accepted then sdebug_jdelay is set to JDELAY_OVERRIDDEN */
cbf67842 4327static ssize_t ndelay_store(struct device_driver *ddp, const char *buf,
fd32119b 4328 size_t count)
cbf67842 4329{
c4837394 4330 int ndelay, res;
cbf67842
DG
4331
4332 if ((count > 0) && (1 == sscanf(buf, "%d", &ndelay)) &&
c4837394 4333 (ndelay >= 0) && (ndelay < (1000 * 1000 * 1000))) {
cbf67842 4334 res = count;
773642d9 4335 if (sdebug_ndelay != ndelay) {
c4837394
DG
4336 int j, k;
4337 struct sdebug_queue *sqp;
4338
4339 block_unblock_all_queues(true);
4340 for (j = 0, sqp = sdebug_q_arr; j < submit_queues;
4341 ++j, ++sqp) {
4342 k = find_first_bit(sqp->in_use_bm,
4343 sdebug_max_queue);
4344 if (k != sdebug_max_queue) {
4345 res = -EBUSY; /* queued commands */
4346 break;
4347 }
4348 }
4349 if (res > 0) {
a10bc12a
DG
4350 /* make sure sdebug_defer instances get
4351 * re-allocated for new delay variant */
4352 free_all_queued();
773642d9 4353 sdebug_ndelay = ndelay;
c2206098
DG
4354 sdebug_jdelay = ndelay ? JDELAY_OVERRIDDEN
4355 : DEF_JDELAY;
cbf67842 4356 }
c4837394 4357 block_unblock_all_queues(false);
cbf67842
DG
4358 }
4359 return res;
4360 }
4361 return -EINVAL;
4362}
4363static DRIVER_ATTR_RW(ndelay);
4364
82069379 4365static ssize_t opts_show(struct device_driver *ddp, char *buf)
1da177e4 4366{
773642d9 4367 return scnprintf(buf, PAGE_SIZE, "0x%x\n", sdebug_opts);
1da177e4
LT
4368}
4369
82069379
AM
4370static ssize_t opts_store(struct device_driver *ddp, const char *buf,
4371 size_t count)
1da177e4
LT
4372{
4373 int opts;
4374 char work[20];
4375
4376 if (1 == sscanf(buf, "%10s", work)) {
48a96876 4377 if (0 == strncasecmp(work,"0x", 2)) {
1da177e4
LT
4378 if (1 == sscanf(&work[2], "%x", &opts))
4379 goto opts_done;
4380 } else {
4381 if (1 == sscanf(work, "%d", &opts))
4382 goto opts_done;
4383 }
4384 }
4385 return -EINVAL;
4386opts_done:
773642d9
DG
4387 sdebug_opts = opts;
4388 sdebug_verbose = !!(SDEBUG_OPT_NOISE & opts);
4389 sdebug_any_injecting_opt = !!(SDEBUG_OPT_ALL_INJECTING & opts);
c4837394 4390 tweak_cmnd_count();
1da177e4
LT
4391 return count;
4392}
82069379 4393static DRIVER_ATTR_RW(opts);
1da177e4 4394
82069379 4395static ssize_t ptype_show(struct device_driver *ddp, char *buf)
1da177e4 4396{
773642d9 4397 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_ptype);
1da177e4 4398}
82069379
AM
4399static ssize_t ptype_store(struct device_driver *ddp, const char *buf,
4400 size_t count)
1da177e4
LT
4401{
4402 int n;
4403
4404 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
773642d9 4405 sdebug_ptype = n;
1da177e4
LT
4406 return count;
4407 }
4408 return -EINVAL;
4409}
82069379 4410static DRIVER_ATTR_RW(ptype);
1da177e4 4411
82069379 4412static ssize_t dsense_show(struct device_driver *ddp, char *buf)
1da177e4 4413{
773642d9 4414 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dsense);
1da177e4 4415}
82069379
AM
4416static ssize_t dsense_store(struct device_driver *ddp, const char *buf,
4417 size_t count)
1da177e4
LT
4418{
4419 int n;
4420
4421 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
773642d9 4422 sdebug_dsense = n;
1da177e4
LT
4423 return count;
4424 }
4425 return -EINVAL;
4426}
82069379 4427static DRIVER_ATTR_RW(dsense);
1da177e4 4428
82069379 4429static ssize_t fake_rw_show(struct device_driver *ddp, char *buf)
23183910 4430{
773642d9 4431 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_fake_rw);
23183910 4432}
82069379
AM
4433static ssize_t fake_rw_store(struct device_driver *ddp, const char *buf,
4434 size_t count)
23183910
DG
4435{
4436 int n;
4437
4438 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
cbf67842 4439 n = (n > 0);
773642d9
DG
4440 sdebug_fake_rw = (sdebug_fake_rw > 0);
4441 if (sdebug_fake_rw != n) {
cbf67842
DG
4442 if ((0 == n) && (NULL == fake_storep)) {
4443 unsigned long sz =
773642d9 4444 (unsigned long)sdebug_dev_size_mb *
cbf67842
DG
4445 1048576;
4446
4447 fake_storep = vmalloc(sz);
4448 if (NULL == fake_storep) {
c1287970 4449 pr_err("out of memory, 9\n");
cbf67842
DG
4450 return -ENOMEM;
4451 }
4452 memset(fake_storep, 0, sz);
4453 }
773642d9 4454 sdebug_fake_rw = n;
cbf67842 4455 }
23183910
DG
4456 return count;
4457 }
4458 return -EINVAL;
4459}
82069379 4460static DRIVER_ATTR_RW(fake_rw);
23183910 4461
82069379 4462static ssize_t no_lun_0_show(struct device_driver *ddp, char *buf)
c65b1445 4463{
773642d9 4464 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_no_lun_0);
c65b1445 4465}
82069379
AM
4466static ssize_t no_lun_0_store(struct device_driver *ddp, const char *buf,
4467 size_t count)
c65b1445
DG
4468{
4469 int n;
4470
4471 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
773642d9 4472 sdebug_no_lun_0 = n;
c65b1445
DG
4473 return count;
4474 }
4475 return -EINVAL;
4476}
82069379 4477static DRIVER_ATTR_RW(no_lun_0);
c65b1445 4478
82069379 4479static ssize_t num_tgts_show(struct device_driver *ddp, char *buf)
1da177e4 4480{
773642d9 4481 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_num_tgts);
1da177e4 4482}
82069379
AM
4483static ssize_t num_tgts_store(struct device_driver *ddp, const char *buf,
4484 size_t count)
1da177e4
LT
4485{
4486 int n;
4487
4488 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
773642d9 4489 sdebug_num_tgts = n;
1da177e4
LT
4490 sdebug_max_tgts_luns();
4491 return count;
4492 }
4493 return -EINVAL;
4494}
82069379 4495static DRIVER_ATTR_RW(num_tgts);
1da177e4 4496
82069379 4497static ssize_t dev_size_mb_show(struct device_driver *ddp, char *buf)
1da177e4 4498{
773642d9 4499 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dev_size_mb);
1da177e4 4500}
82069379 4501static DRIVER_ATTR_RO(dev_size_mb);
1da177e4 4502
82069379 4503static ssize_t num_parts_show(struct device_driver *ddp, char *buf)
1da177e4 4504{
773642d9 4505 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_num_parts);
1da177e4 4506}
82069379 4507static DRIVER_ATTR_RO(num_parts);
1da177e4 4508
82069379 4509static ssize_t every_nth_show(struct device_driver *ddp, char *buf)
1da177e4 4510{
773642d9 4511 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_every_nth);
1da177e4 4512}
82069379
AM
4513static ssize_t every_nth_store(struct device_driver *ddp, const char *buf,
4514 size_t count)
1da177e4
LT
4515{
4516 int nth;
4517
4518 if ((count > 0) && (1 == sscanf(buf, "%d", &nth))) {
773642d9 4519 sdebug_every_nth = nth;
c4837394
DG
4520 if (nth && !sdebug_statistics) {
4521 pr_info("every_nth needs statistics=1, set it\n");
4522 sdebug_statistics = true;
4523 }
4524 tweak_cmnd_count();
1da177e4
LT
4525 return count;
4526 }
4527 return -EINVAL;
4528}
82069379 4529static DRIVER_ATTR_RW(every_nth);
1da177e4 4530
82069379 4531static ssize_t max_luns_show(struct device_driver *ddp, char *buf)
1da177e4 4532{
773642d9 4533 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_max_luns);
1da177e4 4534}
82069379
AM
4535static ssize_t max_luns_store(struct device_driver *ddp, const char *buf,
4536 size_t count)
1da177e4
LT
4537{
4538 int n;
19c8ead7 4539 bool changed;
1da177e4
LT
4540
4541 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
8d039e22
DG
4542 if (n > 256) {
4543 pr_warn("max_luns can be no more than 256\n");
4544 return -EINVAL;
4545 }
773642d9
DG
4546 changed = (sdebug_max_luns != n);
4547 sdebug_max_luns = n;
1da177e4 4548 sdebug_max_tgts_luns();
773642d9 4549 if (changed && (sdebug_scsi_level >= 5)) { /* >= SPC-3 */
19c8ead7
EM
4550 struct sdebug_host_info *sdhp;
4551 struct sdebug_dev_info *dp;
4552
4553 spin_lock(&sdebug_host_list_lock);
4554 list_for_each_entry(sdhp, &sdebug_host_list,
4555 host_list) {
4556 list_for_each_entry(dp, &sdhp->dev_info_list,
4557 dev_list) {
4558 set_bit(SDEBUG_UA_LUNS_CHANGED,
4559 dp->uas_bm);
4560 }
4561 }
4562 spin_unlock(&sdebug_host_list_lock);
4563 }
1da177e4
LT
4564 return count;
4565 }
4566 return -EINVAL;
4567}
82069379 4568static DRIVER_ATTR_RW(max_luns);
1da177e4 4569
82069379 4570static ssize_t max_queue_show(struct device_driver *ddp, char *buf)
78d4e5a0 4571{
773642d9 4572 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_max_queue);
78d4e5a0 4573}
cbf67842
DG
4574/* N.B. max_queue can be changed while there are queued commands. In flight
4575 * commands beyond the new max_queue will be completed. */
82069379
AM
4576static ssize_t max_queue_store(struct device_driver *ddp, const char *buf,
4577 size_t count)
78d4e5a0 4578{
c4837394
DG
4579 int j, n, k, a;
4580 struct sdebug_queue *sqp;
78d4e5a0
DG
4581
4582 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n > 0) &&
c4837394
DG
4583 (n <= SDEBUG_CANQUEUE)) {
4584 block_unblock_all_queues(true);
4585 k = 0;
4586 for (j = 0, sqp = sdebug_q_arr; j < submit_queues;
4587 ++j, ++sqp) {
4588 a = find_last_bit(sqp->in_use_bm, SDEBUG_CANQUEUE);
4589 if (a > k)
4590 k = a;
4591 }
773642d9 4592 sdebug_max_queue = n;
c4837394 4593 if (k == SDEBUG_CANQUEUE)
cbf67842
DG
4594 atomic_set(&retired_max_queue, 0);
4595 else if (k >= n)
4596 atomic_set(&retired_max_queue, k + 1);
4597 else
4598 atomic_set(&retired_max_queue, 0);
c4837394 4599 block_unblock_all_queues(false);
78d4e5a0
DG
4600 return count;
4601 }
4602 return -EINVAL;
4603}
82069379 4604static DRIVER_ATTR_RW(max_queue);
78d4e5a0 4605
82069379 4606static ssize_t no_uld_show(struct device_driver *ddp, char *buf)
78d4e5a0 4607{
773642d9 4608 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_no_uld);
78d4e5a0 4609}
82069379 4610static DRIVER_ATTR_RO(no_uld);
78d4e5a0 4611
82069379 4612static ssize_t scsi_level_show(struct device_driver *ddp, char *buf)
1da177e4 4613{
773642d9 4614 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_scsi_level);
1da177e4 4615}
82069379 4616static DRIVER_ATTR_RO(scsi_level);
1da177e4 4617
82069379 4618static ssize_t virtual_gb_show(struct device_driver *ddp, char *buf)
c65b1445 4619{
773642d9 4620 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_virtual_gb);
c65b1445 4621}
82069379
AM
4622static ssize_t virtual_gb_store(struct device_driver *ddp, const char *buf,
4623 size_t count)
c65b1445 4624{
c2248fc9 4625 int n;
0d01c5df 4626 bool changed;
c65b1445
DG
4627
4628 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
773642d9
DG
4629 changed = (sdebug_virtual_gb != n);
4630 sdebug_virtual_gb = n;
28898873 4631 sdebug_capacity = get_sdebug_capacity();
0d01c5df
DG
4632 if (changed) {
4633 struct sdebug_host_info *sdhp;
4634 struct sdebug_dev_info *dp;
4635
4bc6b634 4636 spin_lock(&sdebug_host_list_lock);
0d01c5df
DG
4637 list_for_each_entry(sdhp, &sdebug_host_list,
4638 host_list) {
4639 list_for_each_entry(dp, &sdhp->dev_info_list,
4640 dev_list) {
4641 set_bit(SDEBUG_UA_CAPACITY_CHANGED,
4642 dp->uas_bm);
4643 }
4644 }
4bc6b634 4645 spin_unlock(&sdebug_host_list_lock);
0d01c5df 4646 }
c65b1445
DG
4647 return count;
4648 }
4649 return -EINVAL;
4650}
82069379 4651static DRIVER_ATTR_RW(virtual_gb);
c65b1445 4652
82069379 4653static ssize_t add_host_show(struct device_driver *ddp, char *buf)
1da177e4 4654{
773642d9 4655 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_add_host);
1da177e4
LT
4656}
4657
fd32119b
DG
4658static int sdebug_add_adapter(void);
4659static void sdebug_remove_adapter(void);
4660
82069379
AM
4661static ssize_t add_host_store(struct device_driver *ddp, const char *buf,
4662 size_t count)
1da177e4 4663{
f3df41cf 4664 int delta_hosts;
1da177e4 4665
f3df41cf 4666 if (sscanf(buf, "%d", &delta_hosts) != 1)
1da177e4 4667 return -EINVAL;
1da177e4
LT
4668 if (delta_hosts > 0) {
4669 do {
4670 sdebug_add_adapter();
4671 } while (--delta_hosts);
4672 } else if (delta_hosts < 0) {
4673 do {
4674 sdebug_remove_adapter();
4675 } while (++delta_hosts);
4676 }
4677 return count;
4678}
82069379 4679static DRIVER_ATTR_RW(add_host);
1da177e4 4680
82069379 4681static ssize_t vpd_use_hostno_show(struct device_driver *ddp, char *buf)
23183910 4682{
773642d9 4683 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_vpd_use_hostno);
23183910 4684}
82069379
AM
4685static ssize_t vpd_use_hostno_store(struct device_driver *ddp, const char *buf,
4686 size_t count)
23183910
DG
4687{
4688 int n;
4689
4690 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
773642d9 4691 sdebug_vpd_use_hostno = n;
23183910
DG
4692 return count;
4693 }
4694 return -EINVAL;
4695}
82069379 4696static DRIVER_ATTR_RW(vpd_use_hostno);
23183910 4697
c4837394
DG
4698static ssize_t statistics_show(struct device_driver *ddp, char *buf)
4699{
4700 return scnprintf(buf, PAGE_SIZE, "%d\n", (int)sdebug_statistics);
4701}
4702static ssize_t statistics_store(struct device_driver *ddp, const char *buf,
4703 size_t count)
4704{
4705 int n;
4706
4707 if ((count > 0) && (sscanf(buf, "%d", &n) == 1) && (n >= 0)) {
4708 if (n > 0)
4709 sdebug_statistics = true;
4710 else {
4711 clear_queue_stats();
4712 sdebug_statistics = false;
4713 }
4714 return count;
4715 }
4716 return -EINVAL;
4717}
4718static DRIVER_ATTR_RW(statistics);
4719
82069379 4720static ssize_t sector_size_show(struct device_driver *ddp, char *buf)
597136ab 4721{
773642d9 4722 return scnprintf(buf, PAGE_SIZE, "%u\n", sdebug_sector_size);
597136ab 4723}
82069379 4724static DRIVER_ATTR_RO(sector_size);
597136ab 4725
c4837394
DG
4726static ssize_t submit_queues_show(struct device_driver *ddp, char *buf)
4727{
4728 return scnprintf(buf, PAGE_SIZE, "%d\n", submit_queues);
4729}
4730static DRIVER_ATTR_RO(submit_queues);
4731
82069379 4732static ssize_t dix_show(struct device_driver *ddp, char *buf)
c6a44287 4733{
773642d9 4734 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dix);
c6a44287 4735}
82069379 4736static DRIVER_ATTR_RO(dix);
c6a44287 4737
82069379 4738static ssize_t dif_show(struct device_driver *ddp, char *buf)
c6a44287 4739{
773642d9 4740 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dif);
c6a44287 4741}
82069379 4742static DRIVER_ATTR_RO(dif);
c6a44287 4743
82069379 4744static ssize_t guard_show(struct device_driver *ddp, char *buf)
c6a44287 4745{
773642d9 4746 return scnprintf(buf, PAGE_SIZE, "%u\n", sdebug_guard);
c6a44287 4747}
82069379 4748static DRIVER_ATTR_RO(guard);
c6a44287 4749
82069379 4750static ssize_t ato_show(struct device_driver *ddp, char *buf)
c6a44287 4751{
773642d9 4752 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_ato);
c6a44287 4753}
82069379 4754static DRIVER_ATTR_RO(ato);
c6a44287 4755
82069379 4756static ssize_t map_show(struct device_driver *ddp, char *buf)
44d92694
MP
4757{
4758 ssize_t count;
4759
5b94e232 4760 if (!scsi_debug_lbp())
44d92694
MP
4761 return scnprintf(buf, PAGE_SIZE, "0-%u\n",
4762 sdebug_store_sectors);
4763
c7badc90
TH
4764 count = scnprintf(buf, PAGE_SIZE - 1, "%*pbl",
4765 (int)map_size, map_storep);
44d92694 4766 buf[count++] = '\n';
c7badc90 4767 buf[count] = '\0';
44d92694
MP
4768
4769 return count;
4770}
82069379 4771static DRIVER_ATTR_RO(map);
44d92694 4772
82069379 4773static ssize_t removable_show(struct device_driver *ddp, char *buf)
d986788b 4774{
773642d9 4775 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_removable ? 1 : 0);
d986788b 4776}
82069379
AM
4777static ssize_t removable_store(struct device_driver *ddp, const char *buf,
4778 size_t count)
d986788b
MP
4779{
4780 int n;
4781
4782 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
773642d9 4783 sdebug_removable = (n > 0);
d986788b
MP
4784 return count;
4785 }
4786 return -EINVAL;
4787}
82069379 4788static DRIVER_ATTR_RW(removable);
d986788b 4789
cbf67842
DG
4790static ssize_t host_lock_show(struct device_driver *ddp, char *buf)
4791{
773642d9 4792 return scnprintf(buf, PAGE_SIZE, "%d\n", !!sdebug_host_lock);
cbf67842 4793}
185dd232 4794/* N.B. sdebug_host_lock does nothing, kept for backward compatibility */
cbf67842
DG
4795static ssize_t host_lock_store(struct device_driver *ddp, const char *buf,
4796 size_t count)
4797{
185dd232 4798 int n;
cbf67842
DG
4799
4800 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
185dd232
DG
4801 sdebug_host_lock = (n > 0);
4802 return count;
cbf67842
DG
4803 }
4804 return -EINVAL;
4805}
4806static DRIVER_ATTR_RW(host_lock);
4807
c2248fc9
DG
4808static ssize_t strict_show(struct device_driver *ddp, char *buf)
4809{
773642d9 4810 return scnprintf(buf, PAGE_SIZE, "%d\n", !!sdebug_strict);
c2248fc9
DG
4811}
4812static ssize_t strict_store(struct device_driver *ddp, const char *buf,
4813 size_t count)
4814{
4815 int n;
4816
4817 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
773642d9 4818 sdebug_strict = (n > 0);
c2248fc9
DG
4819 return count;
4820 }
4821 return -EINVAL;
4822}
4823static DRIVER_ATTR_RW(strict);
4824
09ba24c1
DG
4825static ssize_t uuid_ctl_show(struct device_driver *ddp, char *buf)
4826{
4827 return scnprintf(buf, PAGE_SIZE, "%d\n", !!sdebug_uuid_ctl);
4828}
4829static DRIVER_ATTR_RO(uuid_ctl);
4830
cbf67842 4831
82069379 4832/* Note: The following array creates attribute files in the
23183910
DG
4833 /sys/bus/pseudo/drivers/scsi_debug directory. The advantage of these
4834 files (over those found in the /sys/module/scsi_debug/parameters
4835 directory) is that auxiliary actions can be triggered when an attribute
4836 is changed. For example see: sdebug_add_host_store() above.
4837 */
6ecaff7f 4838
82069379
AM
4839static struct attribute *sdebug_drv_attrs[] = {
4840 &driver_attr_delay.attr,
4841 &driver_attr_opts.attr,
4842 &driver_attr_ptype.attr,
4843 &driver_attr_dsense.attr,
4844 &driver_attr_fake_rw.attr,
4845 &driver_attr_no_lun_0.attr,
4846 &driver_attr_num_tgts.attr,
4847 &driver_attr_dev_size_mb.attr,
4848 &driver_attr_num_parts.attr,
4849 &driver_attr_every_nth.attr,
4850 &driver_attr_max_luns.attr,
4851 &driver_attr_max_queue.attr,
4852 &driver_attr_no_uld.attr,
4853 &driver_attr_scsi_level.attr,
4854 &driver_attr_virtual_gb.attr,
4855 &driver_attr_add_host.attr,
4856 &driver_attr_vpd_use_hostno.attr,
4857 &driver_attr_sector_size.attr,
c4837394
DG
4858 &driver_attr_statistics.attr,
4859 &driver_attr_submit_queues.attr,
82069379
AM
4860 &driver_attr_dix.attr,
4861 &driver_attr_dif.attr,
4862 &driver_attr_guard.attr,
4863 &driver_attr_ato.attr,
4864 &driver_attr_map.attr,
4865 &driver_attr_removable.attr,
cbf67842
DG
4866 &driver_attr_host_lock.attr,
4867 &driver_attr_ndelay.attr,
c2248fc9 4868 &driver_attr_strict.attr,
09ba24c1 4869 &driver_attr_uuid_ctl.attr,
82069379
AM
4870 NULL,
4871};
4872ATTRIBUTE_GROUPS(sdebug_drv);
1da177e4 4873
11ddceca 4874static struct device *pseudo_primary;
8dea0d02 4875
1da177e4
LT
4876static int __init scsi_debug_init(void)
4877{
5f2578e5 4878 unsigned long sz;
1da177e4
LT
4879 int host_to_add;
4880 int k;
6ecaff7f 4881 int ret;
1da177e4 4882
cbf67842
DG
4883 atomic_set(&retired_max_queue, 0);
4884
773642d9 4885 if (sdebug_ndelay >= 1000 * 1000 * 1000) {
c1287970 4886 pr_warn("ndelay must be less than 1 second, ignored\n");
773642d9
DG
4887 sdebug_ndelay = 0;
4888 } else if (sdebug_ndelay > 0)
c2206098 4889 sdebug_jdelay = JDELAY_OVERRIDDEN;
cbf67842 4890
773642d9 4891 switch (sdebug_sector_size) {
597136ab
MP
4892 case 512:
4893 case 1024:
4894 case 2048:
4895 case 4096:
4896 break;
4897 default:
773642d9 4898 pr_err("invalid sector_size %d\n", sdebug_sector_size);
597136ab
MP
4899 return -EINVAL;
4900 }
4901
773642d9 4902 switch (sdebug_dif) {
c6a44287
MP
4903
4904 case SD_DIF_TYPE0_PROTECTION:
f46eb0e9 4905 break;
c6a44287 4906 case SD_DIF_TYPE1_PROTECTION:
395cef03 4907 case SD_DIF_TYPE2_PROTECTION:
c6a44287 4908 case SD_DIF_TYPE3_PROTECTION:
f46eb0e9 4909 have_dif_prot = true;
c6a44287
MP
4910 break;
4911
4912 default:
c1287970 4913 pr_err("dif must be 0, 1, 2 or 3\n");
c6a44287
MP
4914 return -EINVAL;
4915 }
4916
773642d9 4917 if (sdebug_guard > 1) {
c1287970 4918 pr_err("guard must be 0 or 1\n");
c6a44287
MP
4919 return -EINVAL;
4920 }
4921
773642d9 4922 if (sdebug_ato > 1) {
c1287970 4923 pr_err("ato must be 0 or 1\n");
c6a44287
MP
4924 return -EINVAL;
4925 }
4926
773642d9
DG
4927 if (sdebug_physblk_exp > 15) {
4928 pr_err("invalid physblk_exp %u\n", sdebug_physblk_exp);
ea61fca5
MP
4929 return -EINVAL;
4930 }
8d039e22
DG
4931 if (sdebug_max_luns > 256) {
4932 pr_warn("max_luns can be no more than 256, use default\n");
4933 sdebug_max_luns = DEF_MAX_LUNS;
4934 }
ea61fca5 4935
773642d9
DG
4936 if (sdebug_lowest_aligned > 0x3fff) {
4937 pr_err("lowest_aligned too big: %u\n", sdebug_lowest_aligned);
ea61fca5
MP
4938 return -EINVAL;
4939 }
4940
c4837394
DG
4941 if (submit_queues < 1) {
4942 pr_err("submit_queues must be 1 or more\n");
4943 return -EINVAL;
4944 }
4945 sdebug_q_arr = kcalloc(submit_queues, sizeof(struct sdebug_queue),
4946 GFP_KERNEL);
4947 if (sdebug_q_arr == NULL)
4948 return -ENOMEM;
4949 for (k = 0; k < submit_queues; ++k)
4950 spin_lock_init(&sdebug_q_arr[k].qc_lock);
4951
773642d9
DG
4952 if (sdebug_dev_size_mb < 1)
4953 sdebug_dev_size_mb = 1; /* force minimum 1 MB ramdisk */
4954 sz = (unsigned long)sdebug_dev_size_mb * 1048576;
4955 sdebug_store_sectors = sz / sdebug_sector_size;
28898873 4956 sdebug_capacity = get_sdebug_capacity();
1da177e4
LT
4957
4958 /* play around with geometry, don't waste too much on track 0 */
4959 sdebug_heads = 8;
4960 sdebug_sectors_per = 32;
773642d9 4961 if (sdebug_dev_size_mb >= 256)
1da177e4 4962 sdebug_heads = 64;
773642d9 4963 else if (sdebug_dev_size_mb >= 16)
fa785f0a 4964 sdebug_heads = 32;
1da177e4
LT
4965 sdebug_cylinders_per = (unsigned long)sdebug_capacity /
4966 (sdebug_sectors_per * sdebug_heads);
4967 if (sdebug_cylinders_per >= 1024) {
4968 /* other LLDs do this; implies >= 1GB ram disk ... */
4969 sdebug_heads = 255;
4970 sdebug_sectors_per = 63;
4971 sdebug_cylinders_per = (unsigned long)sdebug_capacity /
4972 (sdebug_sectors_per * sdebug_heads);
4973 }
4974
b01f6f83 4975 if (sdebug_fake_rw == 0) {
cbf67842
DG
4976 fake_storep = vmalloc(sz);
4977 if (NULL == fake_storep) {
c1287970 4978 pr_err("out of memory, 1\n");
c4837394
DG
4979 ret = -ENOMEM;
4980 goto free_q_arr;
cbf67842
DG
4981 }
4982 memset(fake_storep, 0, sz);
773642d9 4983 if (sdebug_num_parts > 0)
cbf67842 4984 sdebug_build_parts(fake_storep, sz);
1da177e4 4985 }
1da177e4 4986
773642d9 4987 if (sdebug_dix) {
c6a44287
MP
4988 int dif_size;
4989
4990 dif_size = sdebug_store_sectors * sizeof(struct sd_dif_tuple);
4991 dif_storep = vmalloc(dif_size);
4992
c1287970 4993 pr_err("dif_storep %u bytes @ %p\n", dif_size, dif_storep);
c6a44287
MP
4994
4995 if (dif_storep == NULL) {
c1287970 4996 pr_err("out of mem. (DIX)\n");
c6a44287
MP
4997 ret = -ENOMEM;
4998 goto free_vm;
4999 }
5000
5001 memset(dif_storep, 0xff, dif_size);
5002 }
5003
5b94e232
MP
5004 /* Logical Block Provisioning */
5005 if (scsi_debug_lbp()) {
773642d9
DG
5006 sdebug_unmap_max_blocks =
5007 clamp(sdebug_unmap_max_blocks, 0U, 0xffffffffU);
6014759c 5008
773642d9
DG
5009 sdebug_unmap_max_desc =
5010 clamp(sdebug_unmap_max_desc, 0U, 256U);
6014759c 5011
773642d9
DG
5012 sdebug_unmap_granularity =
5013 clamp(sdebug_unmap_granularity, 1U, 0xffffffffU);
6014759c 5014
773642d9
DG
5015 if (sdebug_unmap_alignment &&
5016 sdebug_unmap_granularity <=
5017 sdebug_unmap_alignment) {
c1287970 5018 pr_err("ERR: unmap_granularity <= unmap_alignment\n");
c4837394
DG
5019 ret = -EINVAL;
5020 goto free_vm;
44d92694
MP
5021 }
5022
b90ebc3d
AM
5023 map_size = lba_to_map_index(sdebug_store_sectors - 1) + 1;
5024 map_storep = vmalloc(BITS_TO_LONGS(map_size) * sizeof(long));
44d92694 5025
c1287970 5026 pr_info("%lu provisioning blocks\n", map_size);
44d92694
MP
5027
5028 if (map_storep == NULL) {
c1287970 5029 pr_err("out of mem. (MAP)\n");
44d92694
MP
5030 ret = -ENOMEM;
5031 goto free_vm;
5032 }
5033
b90ebc3d 5034 bitmap_zero(map_storep, map_size);
44d92694
MP
5035
5036 /* Map first 1KB for partition table */
773642d9 5037 if (sdebug_num_parts)
44d92694
MP
5038 map_region(0, 2);
5039 }
5040
9b906779
NB
5041 pseudo_primary = root_device_register("pseudo_0");
5042 if (IS_ERR(pseudo_primary)) {
c1287970 5043 pr_warn("root_device_register() error\n");
9b906779 5044 ret = PTR_ERR(pseudo_primary);
6ecaff7f
RD
5045 goto free_vm;
5046 }
5047 ret = bus_register(&pseudo_lld_bus);
5048 if (ret < 0) {
c1287970 5049 pr_warn("bus_register error: %d\n", ret);
6ecaff7f
RD
5050 goto dev_unreg;
5051 }
5052 ret = driver_register(&sdebug_driverfs_driver);
5053 if (ret < 0) {
c1287970 5054 pr_warn("driver_register error: %d\n", ret);
6ecaff7f
RD
5055 goto bus_unreg;
5056 }
1da177e4 5057
773642d9
DG
5058 host_to_add = sdebug_add_host;
5059 sdebug_add_host = 0;
1da177e4
LT
5060
5061 for (k = 0; k < host_to_add; k++) {
5062 if (sdebug_add_adapter()) {
c1287970 5063 pr_err("sdebug_add_adapter failed k=%d\n", k);
1da177e4
LT
5064 break;
5065 }
5066 }
5067
773642d9
DG
5068 if (sdebug_verbose)
5069 pr_info("built %d host(s)\n", sdebug_add_host);
c1287970 5070
1da177e4 5071 return 0;
6ecaff7f 5072
6ecaff7f
RD
5073bus_unreg:
5074 bus_unregister(&pseudo_lld_bus);
5075dev_unreg:
9b906779 5076 root_device_unregister(pseudo_primary);
6ecaff7f 5077free_vm:
de232af6
TW
5078 vfree(map_storep);
5079 vfree(dif_storep);
6ecaff7f 5080 vfree(fake_storep);
c4837394
DG
5081free_q_arr:
5082 kfree(sdebug_q_arr);
6ecaff7f 5083 return ret;
1da177e4
LT
5084}
5085
5086static void __exit scsi_debug_exit(void)
5087{
773642d9 5088 int k = sdebug_add_host;
1da177e4
LT
5089
5090 stop_all_queued();
cbf67842 5091 free_all_queued();
1da177e4
LT
5092 for (; k; k--)
5093 sdebug_remove_adapter();
1da177e4
LT
5094 driver_unregister(&sdebug_driverfs_driver);
5095 bus_unregister(&pseudo_lld_bus);
9b906779 5096 root_device_unregister(pseudo_primary);
1da177e4 5097
de232af6 5098 vfree(dif_storep);
1da177e4 5099 vfree(fake_storep);
c4837394 5100 kfree(sdebug_q_arr);
1da177e4
LT
5101}
5102
5103device_initcall(scsi_debug_init);
5104module_exit(scsi_debug_exit);
5105
1da177e4
LT
5106static void sdebug_release_adapter(struct device * dev)
5107{
5108 struct sdebug_host_info *sdbg_host;
5109
5110 sdbg_host = to_sdebug_host(dev);
5111 kfree(sdbg_host);
5112}
5113
5114static int sdebug_add_adapter(void)
5115{
5116 int k, devs_per_host;
5117 int error = 0;
5118 struct sdebug_host_info *sdbg_host;
8b40228f 5119 struct sdebug_dev_info *sdbg_devinfo, *tmp;
1da177e4 5120
c65b1445 5121 sdbg_host = kzalloc(sizeof(*sdbg_host),GFP_KERNEL);
1da177e4 5122 if (NULL == sdbg_host) {
c1287970 5123 pr_err("out of memory at line %d\n", __LINE__);
1da177e4
LT
5124 return -ENOMEM;
5125 }
5126
1da177e4
LT
5127 INIT_LIST_HEAD(&sdbg_host->dev_info_list);
5128
773642d9 5129 devs_per_host = sdebug_num_tgts * sdebug_max_luns;
1da177e4 5130 for (k = 0; k < devs_per_host; k++) {
5cb2fc06
FT
5131 sdbg_devinfo = sdebug_device_create(sdbg_host, GFP_KERNEL);
5132 if (!sdbg_devinfo) {
c1287970 5133 pr_err("out of memory at line %d\n", __LINE__);
1da177e4
LT
5134 error = -ENOMEM;
5135 goto clean;
5136 }
1da177e4
LT
5137 }
5138
5139 spin_lock(&sdebug_host_list_lock);
5140 list_add_tail(&sdbg_host->host_list, &sdebug_host_list);
5141 spin_unlock(&sdebug_host_list_lock);
5142
5143 sdbg_host->dev.bus = &pseudo_lld_bus;
9b906779 5144 sdbg_host->dev.parent = pseudo_primary;
1da177e4 5145 sdbg_host->dev.release = &sdebug_release_adapter;
773642d9 5146 dev_set_name(&sdbg_host->dev, "adapter%d", sdebug_add_host);
1da177e4
LT
5147
5148 error = device_register(&sdbg_host->dev);
5149
5150 if (error)
5151 goto clean;
5152
773642d9 5153 ++sdebug_add_host;
1da177e4
LT
5154 return error;
5155
5156clean:
8b40228f
FT
5157 list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
5158 dev_list) {
1da177e4
LT
5159 list_del(&sdbg_devinfo->dev_list);
5160 kfree(sdbg_devinfo);
5161 }
5162
5163 kfree(sdbg_host);
5164 return error;
5165}
5166
5167static void sdebug_remove_adapter(void)
5168{
5169 struct sdebug_host_info * sdbg_host = NULL;
5170
5171 spin_lock(&sdebug_host_list_lock);
5172 if (!list_empty(&sdebug_host_list)) {
5173 sdbg_host = list_entry(sdebug_host_list.prev,
5174 struct sdebug_host_info, host_list);
5175 list_del(&sdbg_host->host_list);
5176 }
5177 spin_unlock(&sdebug_host_list_lock);
5178
5179 if (!sdbg_host)
5180 return;
5181
773642d9
DG
5182 device_unregister(&sdbg_host->dev);
5183 --sdebug_add_host;
1da177e4
LT
5184}
5185
fd32119b 5186static int sdebug_change_qdepth(struct scsi_device *sdev, int qdepth)
cbf67842
DG
5187{
5188 int num_in_q = 0;
cbf67842
DG
5189 struct sdebug_dev_info *devip;
5190
c4837394 5191 block_unblock_all_queues(true);
cbf67842
DG
5192 devip = (struct sdebug_dev_info *)sdev->hostdata;
5193 if (NULL == devip) {
c4837394 5194 block_unblock_all_queues(false);
cbf67842
DG
5195 return -ENODEV;
5196 }
5197 num_in_q = atomic_read(&devip->num_in_q);
c40ecc12
CH
5198
5199 if (qdepth < 1)
5200 qdepth = 1;
c4837394
DG
5201 /* allow to exceed max host qc_arr elements for testing */
5202 if (qdepth > SDEBUG_CANQUEUE + 10)
5203 qdepth = SDEBUG_CANQUEUE + 10;
db5ed4df 5204 scsi_change_queue_depth(sdev, qdepth);
c40ecc12 5205
773642d9 5206 if (SDEBUG_OPT_Q_NOISE & sdebug_opts) {
c4837394 5207 sdev_printk(KERN_INFO, sdev, "%s: qdepth=%d, num_in_q=%d\n",
c40ecc12 5208 __func__, qdepth, num_in_q);
cbf67842 5209 }
c4837394 5210 block_unblock_all_queues(false);
cbf67842
DG
5211 return sdev->queue_depth;
5212}
5213
c4837394 5214static bool fake_timeout(struct scsi_cmnd *scp)
817fd66b 5215{
c4837394 5216 if (0 == (atomic_read(&sdebug_cmnd_count) % abs(sdebug_every_nth))) {
773642d9
DG
5217 if (sdebug_every_nth < -1)
5218 sdebug_every_nth = -1;
5219 if (SDEBUG_OPT_TIMEOUT & sdebug_opts)
c4837394 5220 return true; /* ignore command causing timeout */
773642d9 5221 else if (SDEBUG_OPT_MAC_TIMEOUT & sdebug_opts &&
817fd66b 5222 scsi_medium_access_command(scp))
c4837394 5223 return true; /* time out reads and writes */
817fd66b 5224 }
c4837394 5225 return false;
817fd66b
DG
5226}
5227
fd32119b
DG
5228static int scsi_debug_queuecommand(struct Scsi_Host *shost,
5229 struct scsi_cmnd *scp)
c2248fc9
DG
5230{
5231 u8 sdeb_i;
5232 struct scsi_device *sdp = scp->device;
5233 const struct opcode_info_t *oip;
5234 const struct opcode_info_t *r_oip;
5235 struct sdebug_dev_info *devip;
5236 u8 *cmd = scp->cmnd;
5237 int (*r_pfp)(struct scsi_cmnd *, struct sdebug_dev_info *);
5238 int k, na;
5239 int errsts = 0;
c2248fc9
DG
5240 u32 flags;
5241 u16 sa;
5242 u8 opcode = cmd[0];
5243 bool has_wlun_rl;
c2248fc9
DG
5244
5245 scsi_set_resid(scp, 0);
c4837394
DG
5246 if (sdebug_statistics)
5247 atomic_inc(&sdebug_cmnd_count);
f46eb0e9
DG
5248 if (unlikely(sdebug_verbose &&
5249 !(SDEBUG_OPT_NO_CDB_NOISE & sdebug_opts))) {
c2248fc9
DG
5250 char b[120];
5251 int n, len, sb;
5252
5253 len = scp->cmd_len;
5254 sb = (int)sizeof(b);
5255 if (len > 32)
5256 strcpy(b, "too long, over 32 bytes");
5257 else {
5258 for (k = 0, n = 0; k < len && n < sb; ++k)
5259 n += scnprintf(b + n, sb - n, "%02x ",
5260 (u32)cmd[k]);
5261 }
c4837394
DG
5262 if (sdebug_mq_active)
5263 sdev_printk(KERN_INFO, sdp, "%s: tag=%u, cmd %s\n",
5264 my_name, blk_mq_unique_tag(scp->request),
5265 b);
5266 else
5267 sdev_printk(KERN_INFO, sdp, "%s: cmd %s\n", my_name,
5268 b);
c2248fc9 5269 }
34d55434 5270 has_wlun_rl = (sdp->lun == SCSI_W_LUN_REPORT_LUNS);
f46eb0e9
DG
5271 if (unlikely((sdp->lun >= sdebug_max_luns) && !has_wlun_rl))
5272 goto err_out;
c2248fc9
DG
5273
5274 sdeb_i = opcode_ind_arr[opcode]; /* fully mapped */
5275 oip = &opcode_info_arr[sdeb_i]; /* safe if table consistent */
5276 devip = (struct sdebug_dev_info *)sdp->hostdata;
f46eb0e9
DG
5277 if (unlikely(!devip)) {
5278 devip = find_build_dev_info(sdp);
c2248fc9 5279 if (NULL == devip)
f46eb0e9 5280 goto err_out;
c2248fc9
DG
5281 }
5282 na = oip->num_attached;
5283 r_pfp = oip->pfp;
5284 if (na) { /* multiple commands with this opcode */
5285 r_oip = oip;
5286 if (FF_SA & r_oip->flags) {
5287 if (F_SA_LOW & oip->flags)
5288 sa = 0x1f & cmd[1];
5289 else
5290 sa = get_unaligned_be16(cmd + 8);
5291 for (k = 0; k <= na; oip = r_oip->arrp + k++) {
5292 if (opcode == oip->opcode && sa == oip->sa)
5293 break;
5294 }
5295 } else { /* since no service action only check opcode */
5296 for (k = 0; k <= na; oip = r_oip->arrp + k++) {
5297 if (opcode == oip->opcode)
5298 break;
5299 }
5300 }
5301 if (k > na) {
5302 if (F_SA_LOW & r_oip->flags)
5303 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 4);
5304 else if (F_SA_HIGH & r_oip->flags)
5305 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 8, 7);
5306 else
5307 mk_sense_invalid_opcode(scp);
5308 goto check_cond;
5309 }
5310 } /* else (when na==0) we assume the oip is a match */
5311 flags = oip->flags;
f46eb0e9 5312 if (unlikely(F_INV_OP & flags)) {
c2248fc9
DG
5313 mk_sense_invalid_opcode(scp);
5314 goto check_cond;
5315 }
f46eb0e9 5316 if (unlikely(has_wlun_rl && !(F_RL_WLUN_OK & flags))) {
773642d9
DG
5317 if (sdebug_verbose)
5318 sdev_printk(KERN_INFO, sdp, "%s: Opcode 0x%x not%s\n",
5319 my_name, opcode, " supported for wlun");
c2248fc9
DG
5320 mk_sense_invalid_opcode(scp);
5321 goto check_cond;
5322 }
f46eb0e9 5323 if (unlikely(sdebug_strict)) { /* check cdb against mask */
c2248fc9
DG
5324 u8 rem;
5325 int j;
5326
5327 for (k = 1; k < oip->len_mask[0] && k < 16; ++k) {
5328 rem = ~oip->len_mask[k] & cmd[k];
5329 if (rem) {
5330 for (j = 7; j >= 0; --j, rem <<= 1) {
5331 if (0x80 & rem)
5332 break;
5333 }
5334 mk_sense_invalid_fld(scp, SDEB_IN_CDB, k, j);
5335 goto check_cond;
5336 }
5337 }
5338 }
f46eb0e9 5339 if (unlikely(!(F_SKIP_UA & flags) &&
b01f6f83
DG
5340 find_first_bit(devip->uas_bm,
5341 SDEBUG_NUM_UAS) != SDEBUG_NUM_UAS)) {
f46eb0e9 5342 errsts = make_ua(scp, devip);
c2248fc9
DG
5343 if (errsts)
5344 goto check_cond;
5345 }
c4837394 5346 if (unlikely((F_M_ACCESS & flags) && atomic_read(&devip->stopped))) {
c2248fc9 5347 mk_sense_buffer(scp, NOT_READY, LOGICAL_UNIT_NOT_READY, 0x2);
773642d9 5348 if (sdebug_verbose)
c2248fc9
DG
5349 sdev_printk(KERN_INFO, sdp, "%s reports: Not ready: "
5350 "%s\n", my_name, "initializing command "
5351 "required");
5352 errsts = check_condition_result;
5353 goto fini;
5354 }
773642d9 5355 if (sdebug_fake_rw && (F_FAKE_RW & flags))
c2248fc9 5356 goto fini;
f46eb0e9 5357 if (unlikely(sdebug_every_nth)) {
c4837394 5358 if (fake_timeout(scp))
c2248fc9
DG
5359 return 0; /* ignore command: make trouble */
5360 }
f46eb0e9
DG
5361 if (likely(oip->pfp))
5362 errsts = oip->pfp(scp, devip); /* calls a resp_* function */
c2248fc9
DG
5363 else if (r_pfp) /* if leaf function ptr NULL, try the root's */
5364 errsts = r_pfp(scp, devip);
5365
5366fini:
5367 return schedule_resp(scp, devip, errsts,
c2206098 5368 ((F_DELAY_OVERR & flags) ? 0 : sdebug_jdelay));
c2248fc9
DG
5369check_cond:
5370 return schedule_resp(scp, devip, check_condition_result, 0);
f46eb0e9
DG
5371err_out:
5372 return schedule_resp(scp, NULL, DID_NO_CONNECT << 16, 0);
c2248fc9
DG
5373}
5374
9e603ca0 5375static struct scsi_host_template sdebug_driver_template = {
c8ed555a
AV
5376 .show_info = scsi_debug_show_info,
5377 .write_info = scsi_debug_write_info,
9e603ca0
FT
5378 .proc_name = sdebug_proc_name,
5379 .name = "SCSI DEBUG",
5380 .info = scsi_debug_info,
5381 .slave_alloc = scsi_debug_slave_alloc,
5382 .slave_configure = scsi_debug_slave_configure,
5383 .slave_destroy = scsi_debug_slave_destroy,
5384 .ioctl = scsi_debug_ioctl,
185dd232 5385 .queuecommand = scsi_debug_queuecommand,
cbf67842 5386 .change_queue_depth = sdebug_change_qdepth,
9e603ca0 5387 .eh_abort_handler = scsi_debug_abort,
9e603ca0 5388 .eh_device_reset_handler = scsi_debug_device_reset,
cbf67842
DG
5389 .eh_target_reset_handler = scsi_debug_target_reset,
5390 .eh_bus_reset_handler = scsi_debug_bus_reset,
9e603ca0 5391 .eh_host_reset_handler = scsi_debug_host_reset,
c4837394 5392 .can_queue = SDEBUG_CANQUEUE,
9e603ca0 5393 .this_id = 7,
65e8617f 5394 .sg_tablesize = SG_MAX_SEGMENTS,
cbf67842 5395 .cmd_per_lun = DEF_CMD_PER_LUN,
6bb5e6e7 5396 .max_sectors = -1U,
9e603ca0
FT
5397 .use_clustering = DISABLE_CLUSTERING,
5398 .module = THIS_MODULE,
c40ecc12 5399 .track_queue_depth = 1,
9e603ca0
FT
5400};
5401
1da177e4
LT
5402static int sdebug_driver_probe(struct device * dev)
5403{
22017ed2
DG
5404 int error = 0;
5405 struct sdebug_host_info *sdbg_host;
5406 struct Scsi_Host *hpnt;
f46eb0e9 5407 int hprot;
1da177e4
LT
5408
5409 sdbg_host = to_sdebug_host(dev);
5410
773642d9
DG
5411 sdebug_driver_template.can_queue = sdebug_max_queue;
5412 if (sdebug_clustering)
0759c666 5413 sdebug_driver_template.use_clustering = ENABLE_CLUSTERING;
78d4e5a0
DG
5414 hpnt = scsi_host_alloc(&sdebug_driver_template, sizeof(sdbg_host));
5415 if (NULL == hpnt) {
c1287970 5416 pr_err("scsi_host_alloc failed\n");
78d4e5a0 5417 error = -ENODEV;
1da177e4 5418 return error;
78d4e5a0 5419 }
c4837394
DG
5420 if (submit_queues > nr_cpu_ids) {
5421 pr_warn("%s: trim submit_queues (was %d) to nr_cpu_ids=%d\n",
5422 my_name, submit_queues, nr_cpu_ids);
5423 submit_queues = nr_cpu_ids;
5424 }
5425 /* Decide whether to tell scsi subsystem that we want mq */
5426 /* Following should give the same answer for each host */
5427 sdebug_mq_active = shost_use_blk_mq(hpnt) && (submit_queues > 1);
5428 if (sdebug_mq_active)
5429 hpnt->nr_hw_queues = submit_queues;
1da177e4
LT
5430
5431 sdbg_host->shost = hpnt;
5432 *((struct sdebug_host_info **)hpnt->hostdata) = sdbg_host;
773642d9
DG
5433 if ((hpnt->this_id >= 0) && (sdebug_num_tgts > hpnt->this_id))
5434 hpnt->max_id = sdebug_num_tgts + 1;
1da177e4 5435 else
773642d9
DG
5436 hpnt->max_id = sdebug_num_tgts;
5437 /* = sdebug_max_luns; */
f2d3fd29 5438 hpnt->max_lun = SCSI_W_LUN_REPORT_LUNS + 1;
1da177e4 5439
f46eb0e9 5440 hprot = 0;
c6a44287 5441
773642d9 5442 switch (sdebug_dif) {
c6a44287
MP
5443
5444 case SD_DIF_TYPE1_PROTECTION:
f46eb0e9 5445 hprot = SHOST_DIF_TYPE1_PROTECTION;
773642d9 5446 if (sdebug_dix)
f46eb0e9 5447 hprot |= SHOST_DIX_TYPE1_PROTECTION;
c6a44287
MP
5448 break;
5449
5450 case SD_DIF_TYPE2_PROTECTION:
f46eb0e9 5451 hprot = SHOST_DIF_TYPE2_PROTECTION;
773642d9 5452 if (sdebug_dix)
f46eb0e9 5453 hprot |= SHOST_DIX_TYPE2_PROTECTION;
c6a44287
MP
5454 break;
5455
5456 case SD_DIF_TYPE3_PROTECTION:
f46eb0e9 5457 hprot = SHOST_DIF_TYPE3_PROTECTION;
773642d9 5458 if (sdebug_dix)
f46eb0e9 5459 hprot |= SHOST_DIX_TYPE3_PROTECTION;
c6a44287
MP
5460 break;
5461
5462 default:
773642d9 5463 if (sdebug_dix)
f46eb0e9 5464 hprot |= SHOST_DIX_TYPE0_PROTECTION;
c6a44287
MP
5465 break;
5466 }
5467
f46eb0e9 5468 scsi_host_set_prot(hpnt, hprot);
c6a44287 5469
f46eb0e9
DG
5470 if (have_dif_prot || sdebug_dix)
5471 pr_info("host protection%s%s%s%s%s%s%s\n",
5472 (hprot & SHOST_DIF_TYPE1_PROTECTION) ? " DIF1" : "",
5473 (hprot & SHOST_DIF_TYPE2_PROTECTION) ? " DIF2" : "",
5474 (hprot & SHOST_DIF_TYPE3_PROTECTION) ? " DIF3" : "",
5475 (hprot & SHOST_DIX_TYPE0_PROTECTION) ? " DIX0" : "",
5476 (hprot & SHOST_DIX_TYPE1_PROTECTION) ? " DIX1" : "",
5477 (hprot & SHOST_DIX_TYPE2_PROTECTION) ? " DIX2" : "",
5478 (hprot & SHOST_DIX_TYPE3_PROTECTION) ? " DIX3" : "");
c6a44287 5479
773642d9 5480 if (sdebug_guard == 1)
c6a44287
MP
5481 scsi_host_set_guard(hpnt, SHOST_DIX_GUARD_IP);
5482 else
5483 scsi_host_set_guard(hpnt, SHOST_DIX_GUARD_CRC);
5484
773642d9
DG
5485 sdebug_verbose = !!(SDEBUG_OPT_NOISE & sdebug_opts);
5486 sdebug_any_injecting_opt = !!(SDEBUG_OPT_ALL_INJECTING & sdebug_opts);
c4837394
DG
5487 if (sdebug_every_nth) /* need stats counters for every_nth */
5488 sdebug_statistics = true;
1da177e4
LT
5489 error = scsi_add_host(hpnt, &sdbg_host->dev);
5490 if (error) {
c1287970 5491 pr_err("scsi_add_host failed\n");
1da177e4
LT
5492 error = -ENODEV;
5493 scsi_host_put(hpnt);
5494 } else
5495 scsi_scan_host(hpnt);
5496
cbf67842 5497 return error;
1da177e4
LT
5498}
5499
5500static int sdebug_driver_remove(struct device * dev)
5501{
1da177e4 5502 struct sdebug_host_info *sdbg_host;
8b40228f 5503 struct sdebug_dev_info *sdbg_devinfo, *tmp;
1da177e4
LT
5504
5505 sdbg_host = to_sdebug_host(dev);
5506
5507 if (!sdbg_host) {
c1287970 5508 pr_err("Unable to locate host info\n");
1da177e4
LT
5509 return -ENODEV;
5510 }
5511
5512 scsi_remove_host(sdbg_host->shost);
5513
8b40228f
FT
5514 list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
5515 dev_list) {
1da177e4
LT
5516 list_del(&sdbg_devinfo->dev_list);
5517 kfree(sdbg_devinfo);
5518 }
5519
5520 scsi_host_put(sdbg_host->shost);
5521 return 0;
5522}
5523
8dea0d02
FT
5524static int pseudo_lld_bus_match(struct device *dev,
5525 struct device_driver *dev_driver)
1da177e4 5526{
8dea0d02 5527 return 1;
1da177e4 5528}
8dea0d02
FT
5529
5530static struct bus_type pseudo_lld_bus = {
5531 .name = "pseudo",
5532 .match = pseudo_lld_bus_match,
5533 .probe = sdebug_driver_probe,
5534 .remove = sdebug_driver_remove,
82069379 5535 .drv_groups = sdebug_drv_groups,
8dea0d02 5536};
This page took 2.0338 seconds and 5 git commands to generate.