media: amphion: decoder add support for contiguous planes
[linux-block.git] / drivers / scsi / scsi_debug.c
CommitLineData
8d7c56d0 1// SPDX-License-Identifier: GPL-2.0-or-later
1da177e4 2/*
1da177e4
LT
3 * vvvvvvvvvvvvvvvvvvvvvvv Original vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
4 * Copyright (C) 1992 Eric Youngdale
5 * Simulate a host adapter with 2 disks attached. Do a lot of checking
6 * to make sure that we are not getting blocks mixed up, and PANIC if
7 * anything out of the ordinary is seen.
8 * ^^^^^^^^^^^^^^^^^^^^^^^ Original ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
9 *
500d0d24 10 * Copyright (C) 2001 - 2021 Douglas Gilbert
1da177e4 11 *
30f67481 12 * For documentation see http://sg.danny.cz/sg/scsi_debug.html
1da177e4
LT
13 */
14
c1287970
TW
15
16#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__
17
1da177e4 18#include <linux/module.h>
4a5fc1c6 19#include <linux/align.h>
1da177e4 20#include <linux/kernel.h>
1da177e4 21#include <linux/errno.h>
b333a819 22#include <linux/jiffies.h>
5a0e3ad6 23#include <linux/slab.h>
1da177e4
LT
24#include <linux/types.h>
25#include <linux/string.h>
1da177e4
LT
26#include <linux/fs.h>
27#include <linux/init.h>
28#include <linux/proc_fs.h>
1da177e4
LT
29#include <linux/vmalloc.h>
30#include <linux/moduleparam.h>
852e034d 31#include <linux/scatterlist.h>
1da177e4 32#include <linux/blkdev.h>
c6a44287 33#include <linux/crc-t10dif.h>
cbf67842
DG
34#include <linux/spinlock.h>
35#include <linux/interrupt.h>
36#include <linux/atomic.h>
37#include <linux/hrtimer.h>
09ba24c1 38#include <linux/uuid.h>
6ebf105c 39#include <linux/t10-pi.h>
1442f76d 40#include <linux/msdos_partition.h>
0c4bc91d 41#include <linux/random.h>
87c715dc 42#include <linux/xarray.h>
ed9f3e25 43#include <linux/prefetch.h>
c6a44287
MP
44
45#include <net/checksum.h>
9ff26eef 46
44d92694
MP
47#include <asm/unaligned.h>
48
9ff26eef
FT
49#include <scsi/scsi.h>
50#include <scsi/scsi_cmnd.h>
51#include <scsi/scsi_device.h>
1da177e4
LT
52#include <scsi/scsi_host.h>
53#include <scsi/scsicam.h>
a34c4e98 54#include <scsi/scsi_eh.h>
cbf67842 55#include <scsi/scsi_tcq.h>
395cef03 56#include <scsi/scsi_dbg.h>
1da177e4 57
c6a44287 58#include "sd.h"
1da177e4 59#include "scsi_logging.h"
1da177e4 60
773642d9 61/* make sure inq_product_rev string corresponds to this version */
500d0d24
DG
62#define SDEBUG_VERSION "0191" /* format to fit INQUIRY revision field */
63static const char *sdebug_version_date = "20210520";
cbf67842
DG
64
65#define MY_NAME "scsi_debug"
1da177e4 66
6f3cbf55 67/* Additional Sense Code (ASC) */
c65b1445
DG
68#define NO_ADDITIONAL_SENSE 0x0
69#define LOGICAL_UNIT_NOT_READY 0x4
c2248fc9 70#define LOGICAL_UNIT_COMMUNICATION_FAILURE 0x8
1da177e4 71#define UNRECOVERED_READ_ERR 0x11
c65b1445 72#define PARAMETER_LIST_LENGTH_ERR 0x1a
1da177e4 73#define INVALID_OPCODE 0x20
22017ed2 74#define LBA_OUT_OF_RANGE 0x21
1da177e4 75#define INVALID_FIELD_IN_CDB 0x24
c65b1445 76#define INVALID_FIELD_IN_PARAM_LIST 0x26
9447b6ce 77#define WRITE_PROTECTED 0x27
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 84#define POWER_ON_RESET_ASCQ 0x0
500d0d24 85#define POWER_ON_OCCURRED_ASCQ 0x1
cbf67842
DG
86#define BUS_RESET_ASCQ 0x2 /* scsi bus reset occurred */
87#define MODE_CHANGED_ASCQ 0x1 /* mode parameters changed */
22017ed2 88#define CAPACITY_CHANGED_ASCQ 0x9
1da177e4 89#define SAVING_PARAMS_UNSUP 0x39
6f3cbf55 90#define TRANSPORT_PROBLEM 0x4b
c65b1445
DG
91#define THRESHOLD_EXCEEDED 0x5d
92#define LOW_POWER_COND_ON 0x5e
22017ed2 93#define MISCOMPARE_VERIFY_ASC 0x1d
acafd0b9
EM
94#define MICROCODE_CHANGED_ASCQ 0x1 /* with TARGET_CHANGED_ASC */
95#define MICROCODE_CHANGED_WO_RESET_ASCQ 0x16
481b5e5c 96#define WRITE_ERROR_ASC 0xc
f0d1cf93
DG
97#define UNALIGNED_WRITE_ASCQ 0x4
98#define WRITE_BOUNDARY_ASCQ 0x5
99#define READ_INVDATA_ASCQ 0x6
100#define READ_BOUNDARY_ASCQ 0x7
4a5fc1c6 101#define ATTEMPT_ACCESS_GAP 0x9
f0d1cf93 102#define INSUFF_ZONE_ASCQ 0xe
1da177e4 103
6f3cbf55
DG
104/* Additional Sense Code Qualifier (ASCQ) */
105#define ACK_NAK_TO 0x3
106
1da177e4
LT
107/* Default values for driver parameters */
108#define DEF_NUM_HOST 1
109#define DEF_NUM_TGTS 1
110#define DEF_MAX_LUNS 1
111/* With these defaults, this driver will make 1 host with 1 target
112 * (id 0) containing 1 logical unit (lun 0). That is 1 device.
113 */
5b94e232 114#define DEF_ATO 1
9b760fd8 115#define DEF_CDB_LEN 10
c2206098 116#define DEF_JDELAY 1 /* if > 0 unit is a jiffy */
9267e0eb 117#define DEF_DEV_SIZE_PRE_INIT 0
1da177e4 118#define DEF_DEV_SIZE_MB 8
9267e0eb 119#define DEF_ZBC_DEV_SIZE_MB 128
5b94e232
MP
120#define DEF_DIF 0
121#define DEF_DIX 0
87c715dc 122#define DEF_PER_HOST_STORE false
1da177e4 123#define DEF_D_SENSE 0
5b94e232 124#define DEF_EVERY_NTH 0
23183910 125#define DEF_FAKE_RW 0
c6a44287 126#define DEF_GUARD 0
cbf67842 127#define DEF_HOST_LOCK 0
5b94e232
MP
128#define DEF_LBPU 0
129#define DEF_LBPWS 0
130#define DEF_LBPWS10 0
be1dd78d 131#define DEF_LBPRZ 1
ea61fca5 132#define DEF_LOWEST_ALIGNED 0
cbf67842 133#define DEF_NDELAY 0 /* if > 0 unit is a nanosecond */
5b94e232
MP
134#define DEF_NO_LUN_0 0
135#define DEF_NUM_PARTS 0
136#define DEF_OPTS 0
32c5844a 137#define DEF_OPT_BLKS 1024
5b94e232 138#define DEF_PHYSBLK_EXP 0
86e6828a 139#define DEF_OPT_XFERLEN_EXP 0
b01f6f83 140#define DEF_PTYPE TYPE_DISK
0c4bc91d 141#define DEF_RANDOM false
d986788b 142#define DEF_REMOVABLE false
760f3b03 143#define DEF_SCSI_LEVEL 7 /* INQUIRY, byte2 [6->SPC-4; 7->SPC-5] */
5b94e232
MP
144#define DEF_SECTOR_SIZE 512
145#define DEF_UNMAP_ALIGNMENT 0
146#define DEF_UNMAP_GRANULARITY 1
6014759c
MP
147#define DEF_UNMAP_MAX_BLOCKS 0xFFFFFFFF
148#define DEF_UNMAP_MAX_DESC 256
5b94e232
MP
149#define DEF_VIRTUAL_GB 0
150#define DEF_VPD_USE_HOSTNO 1
151#define DEF_WRITESAME_LENGTH 0xFFFF
c2248fc9 152#define DEF_STRICT 0
c4837394
DG
153#define DEF_STATISTICS false
154#define DEF_SUBMIT_QUEUES 1
fc13638a 155#define DEF_TUR_MS_TO_READY 0
09ba24c1 156#define DEF_UUID_CTL 0
c2206098 157#define JDELAY_OVERRIDDEN -9999
1da177e4 158
f0d1cf93
DG
159/* Default parameters for ZBC drives */
160#define DEF_ZBC_ZONE_SIZE_MB 128
161#define DEF_ZBC_MAX_OPEN_ZONES 8
aa8fecf9 162#define DEF_ZBC_NR_CONV_ZONES 1
f0d1cf93 163
b01f6f83
DG
164#define SDEBUG_LUN_0_VAL 0
165
773642d9
DG
166/* bit mask values for sdebug_opts */
167#define SDEBUG_OPT_NOISE 1
168#define SDEBUG_OPT_MEDIUM_ERR 2
169#define SDEBUG_OPT_TIMEOUT 4
170#define SDEBUG_OPT_RECOVERED_ERR 8
171#define SDEBUG_OPT_TRANSPORT_ERR 16
172#define SDEBUG_OPT_DIF_ERR 32
173#define SDEBUG_OPT_DIX_ERR 64
174#define SDEBUG_OPT_MAC_TIMEOUT 128
175#define SDEBUG_OPT_SHORT_TRANSFER 0x100
176#define SDEBUG_OPT_Q_NOISE 0x200
7d5a129b 177#define SDEBUG_OPT_ALL_TSF 0x400 /* ignore */
773642d9
DG
178#define SDEBUG_OPT_RARE_TSF 0x800
179#define SDEBUG_OPT_N_WCE 0x1000
180#define SDEBUG_OPT_RESET_NOISE 0x2000
181#define SDEBUG_OPT_NO_CDB_NOISE 0x4000
7ee6d1b4 182#define SDEBUG_OPT_HOST_BUSY 0x8000
7382f9d8 183#define SDEBUG_OPT_CMD_ABORT 0x10000
773642d9
DG
184#define SDEBUG_OPT_ALL_NOISE (SDEBUG_OPT_NOISE | SDEBUG_OPT_Q_NOISE | \
185 SDEBUG_OPT_RESET_NOISE)
186#define SDEBUG_OPT_ALL_INJECTING (SDEBUG_OPT_RECOVERED_ERR | \
187 SDEBUG_OPT_TRANSPORT_ERR | \
188 SDEBUG_OPT_DIF_ERR | SDEBUG_OPT_DIX_ERR | \
7ee6d1b4 189 SDEBUG_OPT_SHORT_TRANSFER | \
7382f9d8
DG
190 SDEBUG_OPT_HOST_BUSY | \
191 SDEBUG_OPT_CMD_ABORT)
3a90a63d
DG
192#define SDEBUG_OPT_RECOV_DIF_DIX (SDEBUG_OPT_RECOVERED_ERR | \
193 SDEBUG_OPT_DIF_ERR | SDEBUG_OPT_DIX_ERR)
1da177e4 194
fd32119b 195/* As indicated in SAM-5 and SPC-4 Unit Attentions (UAs) are returned in
cbf67842
DG
196 * priority order. In the subset implemented here lower numbers have higher
197 * priority. The UA numbers should be a sequence starting from 0 with
198 * SDEBUG_NUM_UAS being 1 higher than the highest numbered UA. */
199#define SDEBUG_UA_POR 0 /* Power on, reset, or bus device reset */
500d0d24
DG
200#define SDEBUG_UA_POOCCUR 1 /* Power on occurred */
201#define SDEBUG_UA_BUS_RESET 2
202#define SDEBUG_UA_MODE_CHANGED 3
203#define SDEBUG_UA_CAPACITY_CHANGED 4
204#define SDEBUG_UA_LUNS_CHANGED 5
205#define SDEBUG_UA_MICROCODE_CHANGED 6 /* simulate firmware change */
206#define SDEBUG_UA_MICROCODE_CHANGED_WO_RESET 7
207#define SDEBUG_NUM_UAS 8
cbf67842 208
773642d9 209/* when 1==SDEBUG_OPT_MEDIUM_ERR, a medium error is simulated at this
1da177e4
LT
210 * sector on read commands: */
211#define OPT_MEDIUM_ERR_ADDR 0x1234 /* that's sector 4660 in decimal */
32f7ef73 212#define OPT_MEDIUM_ERR_NUM 10 /* number of consecutive medium errs */
1da177e4 213
c4837394
DG
214/* SDEBUG_CANQUEUE is the maximum number of commands that can be queued
215 * (for response) per submit queue at one time. Can be reduced by max_queue
216 * option. Command responses are not queued when jdelay=0 and ndelay=0. The
217 * per-device DEF_CMD_PER_LUN can be changed via sysfs:
218 * /sys/class/scsi_device/<h:c:t:l>/device/queue_depth
219 * but cannot exceed SDEBUG_CANQUEUE .
220 */
221#define SDEBUG_CANQUEUE_WORDS 3 /* a WORD is bits in a long */
222#define SDEBUG_CANQUEUE (SDEBUG_CANQUEUE_WORDS * BITS_PER_LONG)
fc09acb7 223#define DEF_CMD_PER_LUN SDEBUG_CANQUEUE
cbf67842 224
b6ff8ca7
DG
225/* UA - Unit Attention; SA - Service Action; SSU - Start Stop Unit */
226#define F_D_IN 1 /* Data-in command (e.g. READ) */
227#define F_D_OUT 2 /* Data-out command (e.g. WRITE) */
fd32119b
DG
228#define F_D_OUT_MAYBE 4 /* WRITE SAME, NDOB bit */
229#define F_D_UNKN 8
b6ff8ca7
DG
230#define F_RL_WLUN_OK 0x10 /* allowed with REPORT LUNS W-LUN */
231#define F_SKIP_UA 0x20 /* bypass UAs (e.g. INQUIRY command) */
232#define F_DELAY_OVERR 0x40 /* for commands like INQUIRY */
233#define F_SA_LOW 0x80 /* SA is in cdb byte 1, bits 4 to 0 */
234#define F_SA_HIGH 0x100 /* SA is in cdb bytes 8 and 9 */
235#define F_INV_OP 0x200 /* invalid opcode (not supported) */
236#define F_FAKE_RW 0x400 /* bypass resp_*() when fake_rw set */
237#define F_M_ACCESS 0x800 /* media access, reacts to SSU state */
238#define F_SSU_DELAY 0x1000 /* SSU command delay (long-ish) */
239#define F_SYNC_DELAY 0x2000 /* SYNCHRONIZE CACHE delay */
240
241/* Useful combinations of the above flags */
fd32119b 242#define FF_RESPOND (F_RL_WLUN_OK | F_SKIP_UA | F_DELAY_OVERR)
46f64e70 243#define FF_MEDIA_IO (F_M_ACCESS | F_FAKE_RW)
fd32119b 244#define FF_SA (F_SA_HIGH | F_SA_LOW)
4f2c8bf6 245#define F_LONG_DELAY (F_SSU_DELAY | F_SYNC_DELAY)
fd32119b
DG
246
247#define SDEBUG_MAX_PARTS 4
248
b01f6f83 249#define SDEBUG_MAX_CMD_LEN 32
fd32119b 250
87c715dc
DG
251#define SDEB_XA_NOT_IN_USE XA_MARK_1
252
64e14ece
DLM
253/* Zone types (zbcr05 table 25) */
254enum sdebug_z_type {
35dbe2b9
DLM
255 ZBC_ZTYPE_CNV = 0x1,
256 ZBC_ZTYPE_SWR = 0x2,
257 ZBC_ZTYPE_SWP = 0x3,
4a5fc1c6
DLM
258 /* ZBC_ZTYPE_SOBR = 0x4, */
259 ZBC_ZTYPE_GAP = 0x5,
64e14ece
DLM
260};
261
f0d1cf93
DG
262/* enumeration names taken from table 26, zbcr05 */
263enum sdebug_z_cond {
264 ZBC_NOT_WRITE_POINTER = 0x0,
265 ZC1_EMPTY = 0x1,
266 ZC2_IMPLICIT_OPEN = 0x2,
267 ZC3_EXPLICIT_OPEN = 0x3,
268 ZC4_CLOSED = 0x4,
269 ZC6_READ_ONLY = 0xd,
270 ZC5_FULL = 0xe,
271 ZC7_OFFLINE = 0xf,
272};
273
274struct sdeb_zone_state { /* ZBC: per zone state */
64e14ece 275 enum sdebug_z_type z_type;
f0d1cf93 276 enum sdebug_z_cond z_cond;
64e14ece 277 bool z_non_seq_resource;
f0d1cf93
DG
278 unsigned int z_size;
279 sector_t z_start;
280 sector_t z_wp;
281};
fd32119b
DG
282
283struct sdebug_dev_info {
284 struct list_head dev_list;
285 unsigned int channel;
286 unsigned int target;
287 u64 lun;
bf476433 288 uuid_t lu_name;
fd32119b
DG
289 struct sdebug_host_info *sdbg_host;
290 unsigned long uas_bm[1];
291 atomic_t num_in_q;
fc13638a 292 atomic_t stopped; /* 1: by SSU, 2: device start */
fd32119b 293 bool used;
f0d1cf93
DG
294
295 /* For ZBC devices */
64e14ece 296 enum blk_zoned_model zmodel;
4a5fc1c6 297 unsigned int zcap;
f0d1cf93
DG
298 unsigned int zsize;
299 unsigned int zsize_shift;
300 unsigned int nr_zones;
aa8fecf9 301 unsigned int nr_conv_zones;
4a5fc1c6 302 unsigned int nr_seq_zones;
f0d1cf93
DG
303 unsigned int nr_imp_open;
304 unsigned int nr_exp_open;
305 unsigned int nr_closed;
306 unsigned int max_open;
fc13638a 307 ktime_t create_ts; /* time since bootup that this device was created */
f0d1cf93 308 struct sdeb_zone_state *zstate;
fd32119b
DG
309};
310
311struct sdebug_host_info {
312 struct list_head host_list;
87c715dc 313 int si_idx; /* sdeb_store_info (per host) xarray index */
fd32119b
DG
314 struct Scsi_Host *shost;
315 struct device dev;
316 struct list_head dev_info_list;
317};
318
87c715dc
DG
319/* There is an xarray of pointers to this struct's objects, one per host */
320struct sdeb_store_info {
321 rwlock_t macc_lck; /* for atomic media access on this store */
322 u8 *storep; /* user data storage (ram) */
323 struct t10_pi_tuple *dif_storep; /* protection info */
324 void *map_storep; /* provisioning map */
325};
326
fd32119b
DG
327#define to_sdebug_host(d) \
328 container_of(d, struct sdebug_host_info, dev)
329
10bde980 330enum sdeb_defer_type {SDEB_DEFER_NONE = 0, SDEB_DEFER_HRT = 1,
4a0c6f43 331 SDEB_DEFER_WQ = 2, SDEB_DEFER_POLL = 3};
10bde980 332
fd32119b
DG
333struct sdebug_defer {
334 struct hrtimer hrt;
335 struct execute_work ew;
4a0c6f43 336 ktime_t cmpl_ts;/* time since boot to complete this cmd */
c4837394
DG
337 int sqa_idx; /* index of sdebug_queue array */
338 int qc_idx; /* index of sdebug_queued_cmd array within sqa_idx */
c10fa55f 339 int hc_idx; /* hostwide tag index */
c4837394 340 int issuing_cpu;
10bde980
DG
341 bool init_hrt;
342 bool init_wq;
4a0c6f43 343 bool init_poll;
7382f9d8 344 bool aborted; /* true when blk_abort_request() already called */
10bde980 345 enum sdeb_defer_type defer_t;
fd32119b
DG
346};
347
348struct sdebug_queued_cmd {
c4837394
DG
349 /* corresponding bit set in in_use_bm[] in owning struct sdebug_queue
350 * instance indicates this slot is in use.
351 */
fd32119b
DG
352 struct sdebug_defer *sd_dp;
353 struct scsi_cmnd *a_cmnd;
354};
355
c4837394
DG
356struct sdebug_queue {
357 struct sdebug_queued_cmd qc_arr[SDEBUG_CANQUEUE];
358 unsigned long in_use_bm[SDEBUG_CANQUEUE_WORDS];
359 spinlock_t qc_lock;
360 atomic_t blocked; /* to temporarily stop more being queued */
fd32119b
DG
361};
362
c4837394
DG
363static atomic_t sdebug_cmnd_count; /* number of incoming commands */
364static atomic_t sdebug_completions; /* count of deferred completions */
365static atomic_t sdebug_miss_cpus; /* submission + completion cpus differ */
366static atomic_t sdebug_a_tsf; /* 'almost task set full' counter */
3a90a63d 367static atomic_t sdeb_inject_pending;
4a0c6f43 368static atomic_t sdeb_mq_poll_count; /* bumped when mq_poll returns > 0 */
c4837394 369
fd32119b 370struct opcode_info_t {
b01f6f83
DG
371 u8 num_attached; /* 0 if this is it (i.e. a leaf); use 0xff */
372 /* for terminating element */
fd32119b
DG
373 u8 opcode; /* if num_attached > 0, preferred */
374 u16 sa; /* service action */
375 u32 flags; /* OR-ed set of SDEB_F_* */
376 int (*pfp)(struct scsi_cmnd *, struct sdebug_dev_info *);
377 const struct opcode_info_t *arrp; /* num_attached elements or NULL */
9a051019
DG
378 u8 len_mask[16]; /* len_mask[0]-->cdb_len, then mask for cdb */
379 /* 1 to min(cdb_len, 15); ignore cdb[15...] */
fd32119b
DG
380};
381
382/* SCSI opcodes (first byte of cdb) of interest mapped onto these indexes */
c2248fc9
DG
383enum sdeb_opcode_index {
384 SDEB_I_INVALID_OPCODE = 0,
385 SDEB_I_INQUIRY = 1,
386 SDEB_I_REPORT_LUNS = 2,
387 SDEB_I_REQUEST_SENSE = 3,
388 SDEB_I_TEST_UNIT_READY = 4,
389 SDEB_I_MODE_SENSE = 5, /* 6, 10 */
390 SDEB_I_MODE_SELECT = 6, /* 6, 10 */
391 SDEB_I_LOG_SENSE = 7,
392 SDEB_I_READ_CAPACITY = 8, /* 10; 16 is in SA_IN(16) */
393 SDEB_I_READ = 9, /* 6, 10, 12, 16 */
394 SDEB_I_WRITE = 10, /* 6, 10, 12, 16 */
395 SDEB_I_START_STOP = 11,
46f64e70
DG
396 SDEB_I_SERV_ACT_IN_16 = 12, /* add ...SERV_ACT_IN_12 if needed */
397 SDEB_I_SERV_ACT_OUT_16 = 13, /* add ...SERV_ACT_OUT_12 if needed */
c2248fc9
DG
398 SDEB_I_MAINT_IN = 14,
399 SDEB_I_MAINT_OUT = 15,
c3e2fe92 400 SDEB_I_VERIFY = 16, /* VERIFY(10), VERIFY(16) */
481b5e5c 401 SDEB_I_VARIABLE_LEN = 17, /* READ(32), WRITE(32), WR_SCAT(32) */
c2248fc9
DG
402 SDEB_I_RESERVE = 18, /* 6, 10 */
403 SDEB_I_RELEASE = 19, /* 6, 10 */
404 SDEB_I_ALLOW_REMOVAL = 20, /* PREVENT ALLOW MEDIUM REMOVAL */
405 SDEB_I_REZERO_UNIT = 21, /* REWIND in SSC */
406 SDEB_I_ATA_PT = 22, /* 12, 16 */
407 SDEB_I_SEND_DIAG = 23,
408 SDEB_I_UNMAP = 24,
c208556a
BVA
409 SDEB_I_WRITE_BUFFER = 25,
410 SDEB_I_WRITE_SAME = 26, /* 10, 16 */
411 SDEB_I_SYNC_CACHE = 27, /* 10, 16 */
412 SDEB_I_COMP_WRITE = 28,
ed9f3e25 413 SDEB_I_PRE_FETCH = 29, /* 10, 16 */
f0d1cf93
DG
414 SDEB_I_ZONE_OUT = 30, /* 0x94+SA; includes no data xfer */
415 SDEB_I_ZONE_IN = 31, /* 0x95+SA; all have data-in */
416 SDEB_I_LAST_ELEM_P1 = 32, /* keep this last (previous + 1) */
c2248fc9
DG
417};
418
c4837394 419
c2248fc9
DG
420static const unsigned char opcode_ind_arr[256] = {
421/* 0x0; 0x0->0x1f: 6 byte cdbs */
422 SDEB_I_TEST_UNIT_READY, SDEB_I_REZERO_UNIT, 0, SDEB_I_REQUEST_SENSE,
423 0, 0, 0, 0,
424 SDEB_I_READ, 0, SDEB_I_WRITE, 0, 0, 0, 0, 0,
425 0, 0, SDEB_I_INQUIRY, 0, 0, SDEB_I_MODE_SELECT, SDEB_I_RESERVE,
426 SDEB_I_RELEASE,
427 0, 0, SDEB_I_MODE_SENSE, SDEB_I_START_STOP, 0, SDEB_I_SEND_DIAG,
428 SDEB_I_ALLOW_REMOVAL, 0,
429/* 0x20; 0x20->0x3f: 10 byte cdbs */
430 0, 0, 0, 0, 0, SDEB_I_READ_CAPACITY, 0, 0,
431 SDEB_I_READ, 0, SDEB_I_WRITE, 0, 0, 0, 0, SDEB_I_VERIFY,
ed9f3e25 432 0, 0, 0, 0, SDEB_I_PRE_FETCH, SDEB_I_SYNC_CACHE, 0, 0,
c2248fc9
DG
433 0, 0, 0, SDEB_I_WRITE_BUFFER, 0, 0, 0, 0,
434/* 0x40; 0x40->0x5f: 10 byte cdbs */
435 0, SDEB_I_WRITE_SAME, SDEB_I_UNMAP, 0, 0, 0, 0, 0,
436 0, 0, 0, 0, 0, SDEB_I_LOG_SENSE, 0, 0,
c208556a 437 0, 0, 0, 0, 0, SDEB_I_MODE_SELECT, SDEB_I_RESERVE,
c2248fc9
DG
438 SDEB_I_RELEASE,
439 0, 0, SDEB_I_MODE_SENSE, 0, 0, 0, 0, 0,
fd32119b 440/* 0x60; 0x60->0x7d are reserved, 0x7e is "extended cdb" */
c2248fc9
DG
441 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
442 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
443 0, SDEB_I_VARIABLE_LEN,
444/* 0x80; 0x80->0x9f: 16 byte cdbs */
445 0, 0, 0, 0, 0, SDEB_I_ATA_PT, 0, 0,
c3e2fe92
DG
446 SDEB_I_READ, SDEB_I_COMP_WRITE, SDEB_I_WRITE, 0,
447 0, 0, 0, SDEB_I_VERIFY,
f0d1cf93
DG
448 SDEB_I_PRE_FETCH, SDEB_I_SYNC_CACHE, 0, SDEB_I_WRITE_SAME,
449 SDEB_I_ZONE_OUT, SDEB_I_ZONE_IN, 0, 0,
46f64e70 450 0, 0, 0, 0, 0, 0, SDEB_I_SERV_ACT_IN_16, SDEB_I_SERV_ACT_OUT_16,
c2248fc9
DG
451/* 0xa0; 0xa0->0xbf: 12 byte cdbs */
452 SDEB_I_REPORT_LUNS, SDEB_I_ATA_PT, 0, SDEB_I_MAINT_IN,
453 SDEB_I_MAINT_OUT, 0, 0, 0,
46f64e70
DG
454 SDEB_I_READ, 0 /* SDEB_I_SERV_ACT_OUT_12 */, SDEB_I_WRITE,
455 0 /* SDEB_I_SERV_ACT_IN_12 */, 0, 0, 0, 0,
c2248fc9
DG
456 0, 0, 0, 0, 0, 0, 0, 0,
457 0, 0, 0, 0, 0, 0, 0, 0,
458/* 0xc0; 0xc0->0xff: vendor specific */
459 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
460 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
461 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
462 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
463};
464
80c49563
DG
465/*
466 * The following "response" functions return the SCSI mid-level's 4 byte
467 * tuple-in-an-int. To handle commands with an IMMED bit, for a faster
468 * command completion, they can mask their return value with
469 * SDEG_RES_IMMED_MASK .
470 */
471#define SDEG_RES_IMMED_MASK 0x40000000
472
c2248fc9
DG
473static int resp_inquiry(struct scsi_cmnd *, struct sdebug_dev_info *);
474static int resp_report_luns(struct scsi_cmnd *, struct sdebug_dev_info *);
475static int resp_requests(struct scsi_cmnd *, struct sdebug_dev_info *);
476static int resp_mode_sense(struct scsi_cmnd *, struct sdebug_dev_info *);
477static int resp_mode_select(struct scsi_cmnd *, struct sdebug_dev_info *);
478static int resp_log_sense(struct scsi_cmnd *, struct sdebug_dev_info *);
479static int resp_readcap(struct scsi_cmnd *, struct sdebug_dev_info *);
480static int resp_read_dt0(struct scsi_cmnd *, struct sdebug_dev_info *);
481static int resp_write_dt0(struct scsi_cmnd *, struct sdebug_dev_info *);
481b5e5c 482static int resp_write_scat(struct scsi_cmnd *, struct sdebug_dev_info *);
c2248fc9
DG
483static int resp_start_stop(struct scsi_cmnd *, struct sdebug_dev_info *);
484static int resp_readcap16(struct scsi_cmnd *, struct sdebug_dev_info *);
485static int resp_get_lba_status(struct scsi_cmnd *, struct sdebug_dev_info *);
486static int resp_report_tgtpgs(struct scsi_cmnd *, struct sdebug_dev_info *);
487static int resp_unmap(struct scsi_cmnd *, struct sdebug_dev_info *);
38d5c833
DG
488static int resp_rsup_opcodes(struct scsi_cmnd *, struct sdebug_dev_info *);
489static int resp_rsup_tmfs(struct scsi_cmnd *, struct sdebug_dev_info *);
c3e2fe92 490static int resp_verify(struct scsi_cmnd *, struct sdebug_dev_info *);
c2248fc9
DG
491static int resp_write_same_10(struct scsi_cmnd *, struct sdebug_dev_info *);
492static int resp_write_same_16(struct scsi_cmnd *, struct sdebug_dev_info *);
38d5c833 493static int resp_comp_write(struct scsi_cmnd *, struct sdebug_dev_info *);
acafd0b9 494static int resp_write_buffer(struct scsi_cmnd *, struct sdebug_dev_info *);
80c49563 495static int resp_sync_cache(struct scsi_cmnd *, struct sdebug_dev_info *);
ed9f3e25 496static int resp_pre_fetch(struct scsi_cmnd *, struct sdebug_dev_info *);
f0d1cf93
DG
497static int resp_report_zones(struct scsi_cmnd *, struct sdebug_dev_info *);
498static int resp_open_zone(struct scsi_cmnd *, struct sdebug_dev_info *);
499static int resp_close_zone(struct scsi_cmnd *, struct sdebug_dev_info *);
500static int resp_finish_zone(struct scsi_cmnd *, struct sdebug_dev_info *);
501static int resp_rwp_zone(struct scsi_cmnd *, struct sdebug_dev_info *);
c2248fc9 502
87c715dc
DG
503static int sdebug_do_add_host(bool mk_new_store);
504static int sdebug_add_host_helper(int per_host_idx);
505static void sdebug_do_remove_host(bool the_end);
506static int sdebug_add_store(void);
507static void sdebug_erase_store(int idx, struct sdeb_store_info *sip);
508static void sdebug_erase_all_stores(bool apart_from_first);
509
46f64e70
DG
510/*
511 * The following are overflow arrays for cdbs that "hit" the same index in
512 * the opcode_info_arr array. The most time sensitive (or commonly used) cdb
513 * should be placed in opcode_info_arr[], the others should be placed here.
514 */
515static const struct opcode_info_t msense_iarr[] = {
c2248fc9
DG
516 {0, 0x1a, 0, F_D_IN, NULL, NULL,
517 {6, 0xe8, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
518};
519
46f64e70 520static const struct opcode_info_t mselect_iarr[] = {
c2248fc9
DG
521 {0, 0x15, 0, F_D_OUT, NULL, NULL,
522 {6, 0xf1, 0, 0, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
523};
524
46f64e70
DG
525static const struct opcode_info_t read_iarr[] = {
526 {0, 0x28, 0, F_D_IN | FF_MEDIA_IO, resp_read_dt0, NULL,/* READ(10) */
b7e24581 527 {10, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7, 0, 0,
c2248fc9 528 0, 0, 0, 0} },
46f64e70 529 {0, 0x8, 0, F_D_IN | FF_MEDIA_IO, resp_read_dt0, NULL, /* READ(6) */
c2248fc9 530 {6, 0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
46f64e70 531 {0, 0xa8, 0, F_D_IN | FF_MEDIA_IO, resp_read_dt0, NULL,/* READ(12) */
b7e24581 532 {12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf,
c2248fc9
DG
533 0xc7, 0, 0, 0, 0} },
534};
535
46f64e70
DG
536static const struct opcode_info_t write_iarr[] = {
537 {0, 0x2a, 0, F_D_OUT | FF_MEDIA_IO, resp_write_dt0, /* WRITE(10) */
538 NULL, {10, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7,
539 0, 0, 0, 0, 0, 0} },
540 {0, 0xa, 0, F_D_OUT | FF_MEDIA_IO, resp_write_dt0, /* WRITE(6) */
541 NULL, {6, 0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0,
542 0, 0, 0} },
543 {0, 0xaa, 0, F_D_OUT | FF_MEDIA_IO, resp_write_dt0, /* WRITE(12) */
544 NULL, {12, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
545 0xbf, 0xc7, 0, 0, 0, 0} },
c2248fc9
DG
546};
547
c3e2fe92
DG
548static const struct opcode_info_t verify_iarr[] = {
549 {0, 0x2f, 0, F_D_OUT_MAYBE | FF_MEDIA_IO, resp_verify,/* VERIFY(10) */
550 NULL, {10, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xc7,
551 0, 0, 0, 0, 0, 0} },
552};
553
46f64e70 554static const struct opcode_info_t sa_in_16_iarr[] = {
c2248fc9
DG
555 {0, 0x9e, 0x12, F_SA_LOW | F_D_IN, resp_get_lba_status, NULL,
556 {16, 0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
46f64e70 557 0xff, 0xff, 0xff, 0, 0xc7} }, /* GET LBA STATUS(16) */
c2248fc9
DG
558};
559
46f64e70
DG
560static const struct opcode_info_t vl_iarr[] = { /* VARIABLE LENGTH */
561 {0, 0x7f, 0xb, F_SA_HIGH | F_D_OUT | FF_MEDIA_IO, resp_write_dt0,
b7e24581 562 NULL, {32, 0xc7, 0, 0, 0, 0, 0x3f, 0x18, 0x0, 0xb, 0xfa,
c2248fc9 563 0, 0xff, 0xff, 0xff, 0xff} }, /* WRITE(32) */
481b5e5c
DG
564 {0, 0x7f, 0x11, F_SA_HIGH | F_D_OUT | FF_MEDIA_IO, resp_write_scat,
565 NULL, {32, 0xc7, 0, 0, 0, 0, 0x3f, 0x18, 0x0, 0x11, 0xf8,
566 0, 0xff, 0xff, 0x0, 0x0} }, /* WRITE SCATTERED(32) */
c2248fc9
DG
567};
568
46f64e70 569static const struct opcode_info_t maint_in_iarr[] = { /* MAINT IN */
38d5c833 570 {0, 0xa3, 0xc, F_SA_LOW | F_D_IN, resp_rsup_opcodes, NULL,
c2248fc9 571 {12, 0xc, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0,
46f64e70 572 0xc7, 0, 0, 0, 0} }, /* REPORT SUPPORTED OPERATION CODES */
38d5c833 573 {0, 0xa3, 0xd, F_SA_LOW | F_D_IN, resp_rsup_tmfs, NULL,
c2248fc9 574 {12, 0xd, 0x80, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0xc7, 0, 0,
46f64e70 575 0, 0} }, /* REPORTED SUPPORTED TASK MANAGEMENT FUNCTIONS */
c2248fc9
DG
576};
577
46f64e70
DG
578static const struct opcode_info_t write_same_iarr[] = {
579 {0, 0x93, 0, F_D_OUT_MAYBE | FF_MEDIA_IO, resp_write_same_16, NULL,
c2248fc9 580 {16, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
46f64e70 581 0xff, 0xff, 0xff, 0x3f, 0xc7} }, /* WRITE SAME(16) */
c2248fc9
DG
582};
583
46f64e70
DG
584static const struct opcode_info_t reserve_iarr[] = {
585 {0, 0x16, 0, F_D_OUT, NULL, NULL, /* RESERVE(6) */
c2248fc9
DG
586 {6, 0x1f, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
587};
588
46f64e70
DG
589static const struct opcode_info_t release_iarr[] = {
590 {0, 0x17, 0, F_D_OUT, NULL, NULL, /* RELEASE(6) */
c2248fc9
DG
591 {6, 0x1f, 0xff, 0, 0, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
592};
593
80c49563 594static const struct opcode_info_t sync_cache_iarr[] = {
4f2c8bf6 595 {0, 0x91, 0, F_SYNC_DELAY | F_M_ACCESS, resp_sync_cache, NULL,
80c49563
DG
596 {16, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
597 0xff, 0xff, 0xff, 0xff, 0x3f, 0xc7} }, /* SYNC_CACHE (16) */
598};
599
ed9f3e25 600static const struct opcode_info_t pre_fetch_iarr[] = {
b6ff8ca7 601 {0, 0x90, 0, F_SYNC_DELAY | FF_MEDIA_IO, resp_pre_fetch, NULL,
ed9f3e25
DG
602 {16, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
603 0xff, 0xff, 0xff, 0xff, 0x3f, 0xc7} }, /* PRE-FETCH (16) */
604};
605
f0d1cf93 606static const struct opcode_info_t zone_out_iarr[] = { /* ZONE OUT(16) */
b6ff8ca7 607 {0, 0x94, 0x1, F_SA_LOW | F_M_ACCESS, resp_close_zone, NULL,
f0d1cf93
DG
608 {16, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
609 0xff, 0, 0, 0xff, 0xff, 0x1, 0xc7} }, /* CLOSE ZONE */
b6ff8ca7 610 {0, 0x94, 0x2, F_SA_LOW | F_M_ACCESS, resp_finish_zone, NULL,
f0d1cf93
DG
611 {16, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
612 0xff, 0, 0, 0xff, 0xff, 0x1, 0xc7} }, /* FINISH ZONE */
b6ff8ca7 613 {0, 0x94, 0x4, F_SA_LOW | F_M_ACCESS, resp_rwp_zone, NULL,
f0d1cf93
DG
614 {16, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
615 0xff, 0, 0, 0xff, 0xff, 0x1, 0xc7} }, /* RESET WRITE POINTER */
616};
617
618static const struct opcode_info_t zone_in_iarr[] = { /* ZONE IN(16) */
b6ff8ca7 619 {0, 0x95, 0x6, F_SA_LOW | F_D_IN | F_M_ACCESS, NULL, NULL,
f0d1cf93
DG
620 {16, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
621 0xff, 0xff, 0xff, 0xff, 0x3f, 0xc7} }, /* REPORT ZONES */
622};
623
c2248fc9
DG
624
625/* This array is accessed via SDEB_I_* values. Make sure all are mapped,
626 * plus the terminating elements for logic that scans this table such as
627 * REPORT SUPPORTED OPERATION CODES. */
ed9f3e25 628static const struct opcode_info_t opcode_info_arr[SDEB_I_LAST_ELEM_P1 + 1] = {
c2248fc9 629/* 0 */
46f64e70 630 {0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL, /* unknown opcodes */
c2248fc9 631 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
46f64e70 632 {0, 0x12, 0, FF_RESPOND | F_D_IN, resp_inquiry, NULL, /* INQUIRY */
c2248fc9
DG
633 {6, 0xe3, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
634 {0, 0xa0, 0, FF_RESPOND | F_D_IN, resp_report_luns, NULL,
635 {12, 0xe3, 0xff, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0xc7, 0, 0,
46f64e70 636 0, 0} }, /* REPORT LUNS */
c2248fc9
DG
637 {0, 0x3, 0, FF_RESPOND | F_D_IN, resp_requests, NULL,
638 {6, 0xe1, 0, 0, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
639 {0, 0x0, 0, F_M_ACCESS | F_RL_WLUN_OK, NULL, NULL,/* TEST UNIT READY */
640 {6, 0, 0, 0, 0, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
46f64e70
DG
641/* 5 */
642 {ARRAY_SIZE(msense_iarr), 0x5a, 0, F_D_IN, /* MODE SENSE(10) */
643 resp_mode_sense, msense_iarr, {10, 0xf8, 0xff, 0xff, 0, 0, 0,
644 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0} },
645 {ARRAY_SIZE(mselect_iarr), 0x55, 0, F_D_OUT, /* MODE SELECT(10) */
646 resp_mode_select, mselect_iarr, {10, 0xf1, 0, 0, 0, 0, 0, 0xff,
647 0xff, 0xc7, 0, 0, 0, 0, 0, 0} },
648 {0, 0x4d, 0, F_D_IN, resp_log_sense, NULL, /* LOG SENSE */
c2248fc9
DG
649 {10, 0xe3, 0xff, 0xff, 0, 0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0,
650 0, 0, 0} },
46f64e70 651 {0, 0x25, 0, F_D_IN, resp_readcap, NULL, /* READ CAPACITY(10) */
c2248fc9
DG
652 {10, 0xe1, 0xff, 0xff, 0xff, 0xff, 0, 0, 0x1, 0xc7, 0, 0, 0, 0,
653 0, 0} },
46f64e70
DG
654 {ARRAY_SIZE(read_iarr), 0x88, 0, F_D_IN | FF_MEDIA_IO, /* READ(16) */
655 resp_read_dt0, read_iarr, {16, 0xfe, 0xff, 0xff, 0xff, 0xff,
656 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7} },
c2248fc9 657/* 10 */
46f64e70
DG
658 {ARRAY_SIZE(write_iarr), 0x8a, 0, F_D_OUT | FF_MEDIA_IO,
659 resp_write_dt0, write_iarr, /* WRITE(16) */
660 {16, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
80c49563 661 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7} },
4f2c8bf6 662 {0, 0x1b, 0, F_SSU_DELAY, resp_start_stop, NULL,/* START STOP UNIT */
c2248fc9 663 {6, 0x1, 0, 0xf, 0xf7, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
46f64e70
DG
664 {ARRAY_SIZE(sa_in_16_iarr), 0x9e, 0x10, F_SA_LOW | F_D_IN,
665 resp_readcap16, sa_in_16_iarr, /* SA_IN(16), READ CAPACITY(16) */
666 {16, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
667 0xff, 0xff, 0xff, 0xff, 0x1, 0xc7} },
481b5e5c
DG
668 {0, 0x9f, 0x12, F_SA_LOW | F_D_OUT | FF_MEDIA_IO, resp_write_scat,
669 NULL, {16, 0x12, 0xf9, 0x0, 0xff, 0xff, 0, 0, 0xff, 0xff, 0xff,
670 0xff, 0xff, 0xff, 0xff, 0xc7} }, /* SA_OUT(16), WRITE SCAT(16) */
46f64e70
DG
671 {ARRAY_SIZE(maint_in_iarr), 0xa3, 0xa, F_SA_LOW | F_D_IN,
672 resp_report_tgtpgs, /* MAINT IN, REPORT TARGET PORT GROUPS */
673 maint_in_iarr, {12, 0xea, 0, 0, 0, 0, 0xff, 0xff, 0xff,
674 0xff, 0, 0xc7, 0, 0, 0, 0} },
675/* 15 */
c2248fc9
DG
676 {0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL, /* MAINT OUT */
677 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
c3e2fe92
DG
678 {ARRAY_SIZE(verify_iarr), 0x8f, 0,
679 F_D_OUT_MAYBE | FF_MEDIA_IO, resp_verify, /* VERIFY(16) */
680 verify_iarr, {16, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
681 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xc7} },
46f64e70
DG
682 {ARRAY_SIZE(vl_iarr), 0x7f, 0x9, F_SA_HIGH | F_D_IN | FF_MEDIA_IO,
683 resp_read_dt0, vl_iarr, /* VARIABLE LENGTH, READ(32) */
684 {32, 0xc7, 0, 0, 0, 0, 0x3f, 0x18, 0x0, 0x9, 0xfe, 0, 0xff, 0xff,
685 0xff, 0xff} },
686 {ARRAY_SIZE(reserve_iarr), 0x56, 0, F_D_OUT,
687 NULL, reserve_iarr, /* RESERVE(10) <no response function> */
c2248fc9
DG
688 {10, 0xff, 0xff, 0xff, 0, 0, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0,
689 0} },
46f64e70
DG
690 {ARRAY_SIZE(release_iarr), 0x57, 0, F_D_OUT,
691 NULL, release_iarr, /* RELEASE(10) <no response function> */
c2248fc9
DG
692 {10, 0x13, 0xff, 0xff, 0, 0, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0,
693 0} },
694/* 20 */
f7f9f26b
DG
695 {0, 0x1e, 0, 0, NULL, NULL, /* ALLOW REMOVAL */
696 {6, 0, 0, 0, 0x3, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
c2248fc9
DG
697 {0, 0x1, 0, 0, resp_start_stop, NULL, /* REWIND ?? */
698 {6, 0x1, 0, 0, 0, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
699 {0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL, /* ATA_PT */
700 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
701 {0, 0x1d, F_D_OUT, 0, NULL, NULL, /* SEND DIAGNOSTIC */
702 {6, 0xf7, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
46f64e70 703 {0, 0x42, 0, F_D_OUT | FF_MEDIA_IO, resp_unmap, NULL, /* UNMAP */
b7e24581 704 {10, 0x1, 0, 0, 0, 0, 0x3f, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0} },
46f64e70 705/* 25 */
acafd0b9
EM
706 {0, 0x3b, 0, F_D_OUT_MAYBE, resp_write_buffer, NULL,
707 {10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0,
708 0, 0, 0, 0} }, /* WRITE_BUFFER */
46f64e70
DG
709 {ARRAY_SIZE(write_same_iarr), 0x41, 0, F_D_OUT_MAYBE | FF_MEDIA_IO,
710 resp_write_same_10, write_same_iarr, /* WRITE SAME(10) */
711 {10, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7, 0,
712 0, 0, 0, 0, 0} },
4f2c8bf6 713 {ARRAY_SIZE(sync_cache_iarr), 0x35, 0, F_SYNC_DELAY | F_M_ACCESS,
80c49563 714 resp_sync_cache, sync_cache_iarr,
b7e24581 715 {10, 0x7, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7, 0, 0,
80c49563 716 0, 0, 0, 0} }, /* SYNC_CACHE (10) */
46f64e70 717 {0, 0x89, 0, F_D_OUT | FF_MEDIA_IO, resp_comp_write, NULL,
c2248fc9 718 {16, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0,
b7e24581 719 0, 0xff, 0x3f, 0xc7} }, /* COMPARE AND WRITE */
b6ff8ca7 720 {ARRAY_SIZE(pre_fetch_iarr), 0x34, 0, F_SYNC_DELAY | FF_MEDIA_IO,
ed9f3e25
DG
721 resp_pre_fetch, pre_fetch_iarr,
722 {10, 0x2, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7, 0, 0,
723 0, 0, 0, 0} }, /* PRE-FETCH (10) */
c2248fc9 724
ed9f3e25 725/* 30 */
b6ff8ca7 726 {ARRAY_SIZE(zone_out_iarr), 0x94, 0x3, F_SA_LOW | F_M_ACCESS,
f0d1cf93
DG
727 resp_open_zone, zone_out_iarr, /* ZONE_OUT(16), OPEN ZONE) */
728 {16, 0x3 /* SA */, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
729 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0x1, 0xc7} },
b6ff8ca7 730 {ARRAY_SIZE(zone_in_iarr), 0x95, 0x0, F_SA_LOW | F_M_ACCESS,
f0d1cf93
DG
731 resp_report_zones, zone_in_iarr, /* ZONE_IN(16), REPORT ZONES) */
732 {16, 0x0 /* SA */, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
733 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xc7} },
734/* sentinel */
c2248fc9
DG
735 {0xff, 0, 0, 0, NULL, NULL, /* terminating element */
736 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
737};
738
f19fe8f3 739static int sdebug_num_hosts;
87c715dc 740static int sdebug_add_host = DEF_NUM_HOST; /* in sysfs this is relative */
773642d9 741static int sdebug_ato = DEF_ATO;
9b760fd8 742static int sdebug_cdb_len = DEF_CDB_LEN;
c2206098 743static int sdebug_jdelay = DEF_JDELAY; /* if > 0 then unit is jiffies */
9267e0eb 744static int sdebug_dev_size_mb = DEF_DEV_SIZE_PRE_INIT;
773642d9
DG
745static int sdebug_dif = DEF_DIF;
746static int sdebug_dix = DEF_DIX;
747static int sdebug_dsense = DEF_D_SENSE;
748static int sdebug_every_nth = DEF_EVERY_NTH;
749static int sdebug_fake_rw = DEF_FAKE_RW;
750static unsigned int sdebug_guard = DEF_GUARD;
c10fa55f 751static int sdebug_host_max_queue; /* per host */
773642d9
DG
752static int sdebug_lowest_aligned = DEF_LOWEST_ALIGNED;
753static int sdebug_max_luns = DEF_MAX_LUNS;
c4837394 754static int sdebug_max_queue = SDEBUG_CANQUEUE; /* per submit queue */
d9da891a
LO
755static unsigned int sdebug_medium_error_start = OPT_MEDIUM_ERR_ADDR;
756static int sdebug_medium_error_count = OPT_MEDIUM_ERR_NUM;
cbf67842 757static atomic_t retired_max_queue; /* if > 0 then was prior max_queue */
c2206098 758static int sdebug_ndelay = DEF_NDELAY; /* if > 0 then unit is nanoseconds */
773642d9
DG
759static int sdebug_no_lun_0 = DEF_NO_LUN_0;
760static int sdebug_no_uld;
761static int sdebug_num_parts = DEF_NUM_PARTS;
762static int sdebug_num_tgts = DEF_NUM_TGTS; /* targets per host */
763static int sdebug_opt_blks = DEF_OPT_BLKS;
764static int sdebug_opts = DEF_OPTS;
765static int sdebug_physblk_exp = DEF_PHYSBLK_EXP;
86e6828a 766static int sdebug_opt_xferlen_exp = DEF_OPT_XFERLEN_EXP;
b01f6f83 767static int sdebug_ptype = DEF_PTYPE; /* SCSI peripheral device type */
773642d9
DG
768static int sdebug_scsi_level = DEF_SCSI_LEVEL;
769static int sdebug_sector_size = DEF_SECTOR_SIZE;
fc13638a 770static int sdeb_tur_ms_to_ready = DEF_TUR_MS_TO_READY;
773642d9
DG
771static int sdebug_virtual_gb = DEF_VIRTUAL_GB;
772static int sdebug_vpd_use_hostno = DEF_VPD_USE_HOSTNO;
773static unsigned int sdebug_lbpu = DEF_LBPU;
774static unsigned int sdebug_lbpws = DEF_LBPWS;
775static unsigned int sdebug_lbpws10 = DEF_LBPWS10;
776static unsigned int sdebug_lbprz = DEF_LBPRZ;
777static unsigned int sdebug_unmap_alignment = DEF_UNMAP_ALIGNMENT;
778static unsigned int sdebug_unmap_granularity = DEF_UNMAP_GRANULARITY;
779static unsigned int sdebug_unmap_max_blocks = DEF_UNMAP_MAX_BLOCKS;
780static unsigned int sdebug_unmap_max_desc = DEF_UNMAP_MAX_DESC;
781static unsigned int sdebug_write_same_length = DEF_WRITESAME_LENGTH;
09ba24c1 782static int sdebug_uuid_ctl = DEF_UUID_CTL;
0c4bc91d 783static bool sdebug_random = DEF_RANDOM;
87c715dc 784static bool sdebug_per_host_store = DEF_PER_HOST_STORE;
773642d9
DG
785static bool sdebug_removable = DEF_REMOVABLE;
786static bool sdebug_clustering;
787static bool sdebug_host_lock = DEF_HOST_LOCK;
788static bool sdebug_strict = DEF_STRICT;
817fd66b 789static bool sdebug_any_injecting_opt;
7109f370 790static bool sdebug_no_rwlock;
773642d9 791static bool sdebug_verbose;
f46eb0e9 792static bool have_dif_prot;
4f2c8bf6 793static bool write_since_sync;
c4837394 794static bool sdebug_statistics = DEF_STATISTICS;
9447b6ce 795static bool sdebug_wp;
9267e0eb
DG
796/* Following enum: 0: no zbc, def; 1: host aware; 2: host managed */
797static enum blk_zoned_model sdeb_zbc_model = BLK_ZONED_NONE;
798static char *sdeb_zbc_model_s;
1da177e4 799
ad0c7775
DG
800enum sam_lun_addr_method {SAM_LUN_AM_PERIPHERAL = 0x0,
801 SAM_LUN_AM_FLAT = 0x1,
802 SAM_LUN_AM_LOGICAL_UNIT = 0x2,
803 SAM_LUN_AM_EXTENDED = 0x3};
804static enum sam_lun_addr_method sdebug_lun_am = SAM_LUN_AM_PERIPHERAL;
805static int sdebug_lun_am_i = (int)SAM_LUN_AM_PERIPHERAL;
806
c65b1445 807static unsigned int sdebug_store_sectors;
1da177e4
LT
808static sector_t sdebug_capacity; /* in sectors */
809
810/* old BIOS stuff, kernel may get rid of them but some mode sense pages
811 may still need them */
812static int sdebug_heads; /* heads per disk */
813static int sdebug_cylinders_per; /* cylinders per surface */
814static int sdebug_sectors_per; /* sectors per cylinder */
815
1da177e4
LT
816static LIST_HEAD(sdebug_host_list);
817static DEFINE_SPINLOCK(sdebug_host_list_lock);
818
87c715dc
DG
819static struct xarray per_store_arr;
820static struct xarray *per_store_ap = &per_store_arr;
821static int sdeb_first_idx = -1; /* invalid index ==> none created */
822static int sdeb_most_recent_idx = -1;
823static DEFINE_RWLOCK(sdeb_fake_rw_lck); /* need a RW lock when fake_rw=1 */
1da177e4 824
44d92694 825static unsigned long map_size;
cbf67842
DG
826static int num_aborts;
827static int num_dev_resets;
828static int num_target_resets;
829static int num_bus_resets;
830static int num_host_resets;
c6a44287
MP
831static int dix_writes;
832static int dix_reads;
833static int dif_errors;
1da177e4 834
f0d1cf93 835/* ZBC global data */
64e14ece 836static bool sdeb_zbc_in_use; /* true for host-aware and host-managed disks */
4a5fc1c6 837static int sdeb_zbc_zone_cap_mb;
98e0a689 838static int sdeb_zbc_zone_size_mb;
380603a5 839static int sdeb_zbc_max_open = DEF_ZBC_MAX_OPEN_ZONES;
aa8fecf9 840static int sdeb_zbc_nr_conv = DEF_ZBC_NR_CONV_ZONES;
f0d1cf93 841
c4837394 842static int submit_queues = DEF_SUBMIT_QUEUES; /* > 1 for multi-queue (mq) */
c4b57d89 843static int poll_queues; /* iouring iopoll interface.*/
c4837394 844static struct sdebug_queue *sdebug_q_arr; /* ptr to array of submit queues */
fd32119b 845
1da177e4 846static DEFINE_RWLOCK(atomic_rw);
87c715dc
DG
847static DEFINE_RWLOCK(atomic_rw2);
848
849static rwlock_t *ramdisk_lck_a[2];
1da177e4 850
cbf67842
DG
851static char sdebug_proc_name[] = MY_NAME;
852static const char *my_name = MY_NAME;
1da177e4 853
1da177e4
LT
854static struct bus_type pseudo_lld_bus;
855
856static struct device_driver sdebug_driverfs_driver = {
857 .name = sdebug_proc_name,
858 .bus = &pseudo_lld_bus,
1da177e4
LT
859};
860
861static const int check_condition_result =
464a00c9 862 SAM_STAT_CHECK_CONDITION;
1da177e4 863
c6a44287 864static const int illegal_condition_result =
464a00c9 865 (DID_ABORT << 16) | SAM_STAT_CHECK_CONDITION;
c6a44287 866
cbf67842 867static const int device_qfull_result =
7d5a129b 868 (DID_ABORT << 16) | SAM_STAT_TASK_SET_FULL;
cbf67842 869
ed9f3e25
DG
870static const int condition_met_result = SAM_STAT_CONDITION_MET;
871
fd32119b 872
760f3b03
DG
873/* Only do the extra work involved in logical block provisioning if one or
874 * more of the lbpu, lbpws or lbpws10 parameters are given and we are doing
875 * real reads and writes (i.e. not skipping them for speed).
876 */
877static inline bool scsi_debug_lbp(void)
fd32119b
DG
878{
879 return 0 == sdebug_fake_rw &&
880 (sdebug_lbpu || sdebug_lbpws || sdebug_lbpws10);
881}
c65b1445 882
87c715dc
DG
883static void *lba2fake_store(struct sdeb_store_info *sip,
884 unsigned long long lba)
14faa944 885{
87c715dc 886 struct sdeb_store_info *lsip = sip;
14faa944 887
87c715dc
DG
888 lba = do_div(lba, sdebug_store_sectors);
889 if (!sip || !sip->storep) {
890 WARN_ON_ONCE(true);
891 lsip = xa_load(per_store_ap, 0); /* should never be NULL */
892 }
893 return lsip->storep + lba * sdebug_sector_size;
14faa944
AM
894}
895
87c715dc
DG
896static struct t10_pi_tuple *dif_store(struct sdeb_store_info *sip,
897 sector_t sector)
14faa944 898{
49413112 899 sector = sector_div(sector, sdebug_store_sectors);
14faa944 900
87c715dc 901 return sip->dif_storep + sector;
14faa944
AM
902}
903
8dea0d02
FT
904static void sdebug_max_tgts_luns(void)
905{
906 struct sdebug_host_info *sdbg_host;
907 struct Scsi_Host *hpnt;
908
909 spin_lock(&sdebug_host_list_lock);
910 list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
911 hpnt = sdbg_host->shost;
912 if ((hpnt->this_id >= 0) &&
773642d9
DG
913 (sdebug_num_tgts > hpnt->this_id))
914 hpnt->max_id = sdebug_num_tgts + 1;
8dea0d02 915 else
773642d9
DG
916 hpnt->max_id = sdebug_num_tgts;
917 /* sdebug_max_luns; */
f2d3fd29 918 hpnt->max_lun = SCSI_W_LUN_REPORT_LUNS + 1;
8dea0d02
FT
919 }
920 spin_unlock(&sdebug_host_list_lock);
921}
922
22017ed2
DG
923enum sdeb_cmd_data {SDEB_IN_DATA = 0, SDEB_IN_CDB = 1};
924
925/* Set in_bit to -1 to indicate no bit position of invalid field */
fd32119b
DG
926static void mk_sense_invalid_fld(struct scsi_cmnd *scp,
927 enum sdeb_cmd_data c_d,
928 int in_byte, int in_bit)
22017ed2
DG
929{
930 unsigned char *sbuff;
931 u8 sks[4];
932 int sl, asc;
933
934 sbuff = scp->sense_buffer;
935 if (!sbuff) {
936 sdev_printk(KERN_ERR, scp->device,
937 "%s: sense_buffer is NULL\n", __func__);
938 return;
939 }
940 asc = c_d ? INVALID_FIELD_IN_CDB : INVALID_FIELD_IN_PARAM_LIST;
941 memset(sbuff, 0, SCSI_SENSE_BUFFERSIZE);
f2b1e9c6 942 scsi_build_sense(scp, sdebug_dsense, ILLEGAL_REQUEST, asc, 0);
22017ed2
DG
943 memset(sks, 0, sizeof(sks));
944 sks[0] = 0x80;
945 if (c_d)
946 sks[0] |= 0x40;
947 if (in_bit >= 0) {
948 sks[0] |= 0x8;
949 sks[0] |= 0x7 & in_bit;
950 }
951 put_unaligned_be16(in_byte, sks + 1);
773642d9 952 if (sdebug_dsense) {
22017ed2
DG
953 sl = sbuff[7] + 8;
954 sbuff[7] = sl;
955 sbuff[sl] = 0x2;
956 sbuff[sl + 1] = 0x6;
957 memcpy(sbuff + sl + 4, sks, 3);
958 } else
959 memcpy(sbuff + 15, sks, 3);
773642d9 960 if (sdebug_verbose)
22017ed2
DG
961 sdev_printk(KERN_INFO, scp->device, "%s: [sense_key,asc,ascq"
962 "]: [0x5,0x%x,0x0] %c byte=%d, bit=%d\n",
963 my_name, asc, c_d ? 'C' : 'D', in_byte, in_bit);
964}
965
cbf67842 966static void mk_sense_buffer(struct scsi_cmnd *scp, int key, int asc, int asq)
8dea0d02 967{
f2b1e9c6 968 if (!scp->sense_buffer) {
cbf67842
DG
969 sdev_printk(KERN_ERR, scp->device,
970 "%s: sense_buffer is NULL\n", __func__);
971 return;
972 }
f2b1e9c6 973 memset(scp->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
8dea0d02 974
f2b1e9c6 975 scsi_build_sense(scp, sdebug_dsense, key, asc, asq);
8dea0d02 976
773642d9 977 if (sdebug_verbose)
cbf67842
DG
978 sdev_printk(KERN_INFO, scp->device,
979 "%s: [sense_key,asc,ascq]: [0x%x,0x%x,0x%x]\n",
980 my_name, key, asc, asq);
8dea0d02 981}
1da177e4 982
fd32119b 983static void mk_sense_invalid_opcode(struct scsi_cmnd *scp)
22017ed2
DG
984{
985 mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_OPCODE, 0);
986}
987
6f4e626f
NC
988static int scsi_debug_ioctl(struct scsi_device *dev, unsigned int cmd,
989 void __user *arg)
1da177e4 990{
773642d9 991 if (sdebug_verbose) {
cbf67842
DG
992 if (0x1261 == cmd)
993 sdev_printk(KERN_INFO, dev,
994 "%s: BLKFLSBUF [0x1261]\n", __func__);
995 else if (0x5331 == cmd)
996 sdev_printk(KERN_INFO, dev,
997 "%s: CDROM_GET_CAPABILITY [0x5331]\n",
998 __func__);
999 else
1000 sdev_printk(KERN_INFO, dev, "%s: cmd=0x%x\n",
1001 __func__, cmd);
1da177e4
LT
1002 }
1003 return -EINVAL;
1004 /* return -ENOTTY; // correct return but upsets fdisk */
1005}
1006
9b760fd8
DG
1007static void config_cdb_len(struct scsi_device *sdev)
1008{
1009 switch (sdebug_cdb_len) {
1010 case 6: /* suggest 6 byte READ, WRITE and MODE SENSE/SELECT */
1011 sdev->use_10_for_rw = false;
1012 sdev->use_16_for_rw = false;
1013 sdev->use_10_for_ms = false;
1014 break;
1015 case 10: /* suggest 10 byte RWs and 6 byte MODE SENSE/SELECT */
1016 sdev->use_10_for_rw = true;
1017 sdev->use_16_for_rw = false;
1018 sdev->use_10_for_ms = false;
1019 break;
1020 case 12: /* suggest 10 byte RWs and 10 byte MODE SENSE/SELECT */
1021 sdev->use_10_for_rw = true;
1022 sdev->use_16_for_rw = false;
1023 sdev->use_10_for_ms = true;
1024 break;
1025 case 16:
1026 sdev->use_10_for_rw = false;
1027 sdev->use_16_for_rw = true;
1028 sdev->use_10_for_ms = true;
1029 break;
1030 case 32: /* No knobs to suggest this so same as 16 for now */
1031 sdev->use_10_for_rw = false;
1032 sdev->use_16_for_rw = true;
1033 sdev->use_10_for_ms = true;
1034 break;
1035 default:
1036 pr_warn("unexpected cdb_len=%d, force to 10\n",
1037 sdebug_cdb_len);
1038 sdev->use_10_for_rw = true;
1039 sdev->use_16_for_rw = false;
1040 sdev->use_10_for_ms = false;
1041 sdebug_cdb_len = 10;
1042 break;
1043 }
1044}
1045
1046static void all_config_cdb_len(void)
1047{
1048 struct sdebug_host_info *sdbg_host;
1049 struct Scsi_Host *shost;
1050 struct scsi_device *sdev;
1051
1052 spin_lock(&sdebug_host_list_lock);
1053 list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
1054 shost = sdbg_host->shost;
1055 shost_for_each_device(sdev, shost) {
1056 config_cdb_len(sdev);
1057 }
1058 }
1059 spin_unlock(&sdebug_host_list_lock);
1060}
1061
19c8ead7
EM
1062static void clear_luns_changed_on_target(struct sdebug_dev_info *devip)
1063{
1064 struct sdebug_host_info *sdhp;
1065 struct sdebug_dev_info *dp;
1066
1067 spin_lock(&sdebug_host_list_lock);
1068 list_for_each_entry(sdhp, &sdebug_host_list, host_list) {
1069 list_for_each_entry(dp, &sdhp->dev_info_list, dev_list) {
1070 if ((devip->sdbg_host == dp->sdbg_host) &&
1071 (devip->target == dp->target))
1072 clear_bit(SDEBUG_UA_LUNS_CHANGED, dp->uas_bm);
1073 }
1074 }
1075 spin_unlock(&sdebug_host_list_lock);
1076}
1077
f46eb0e9 1078static int make_ua(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
1da177e4 1079{
cbf67842 1080 int k;
cbf67842
DG
1081
1082 k = find_first_bit(devip->uas_bm, SDEBUG_NUM_UAS);
1083 if (k != SDEBUG_NUM_UAS) {
1084 const char *cp = NULL;
1085
1086 switch (k) {
1087 case SDEBUG_UA_POR:
f46eb0e9
DG
1088 mk_sense_buffer(scp, UNIT_ATTENTION, UA_RESET_ASC,
1089 POWER_ON_RESET_ASCQ);
773642d9 1090 if (sdebug_verbose)
cbf67842
DG
1091 cp = "power on reset";
1092 break;
500d0d24
DG
1093 case SDEBUG_UA_POOCCUR:
1094 mk_sense_buffer(scp, UNIT_ATTENTION, UA_RESET_ASC,
1095 POWER_ON_OCCURRED_ASCQ);
1096 if (sdebug_verbose)
1097 cp = "power on occurred";
1098 break;
cbf67842 1099 case SDEBUG_UA_BUS_RESET:
f46eb0e9
DG
1100 mk_sense_buffer(scp, UNIT_ATTENTION, UA_RESET_ASC,
1101 BUS_RESET_ASCQ);
773642d9 1102 if (sdebug_verbose)
cbf67842
DG
1103 cp = "bus reset";
1104 break;
1105 case SDEBUG_UA_MODE_CHANGED:
f46eb0e9
DG
1106 mk_sense_buffer(scp, UNIT_ATTENTION, UA_CHANGED_ASC,
1107 MODE_CHANGED_ASCQ);
773642d9 1108 if (sdebug_verbose)
cbf67842
DG
1109 cp = "mode parameters changed";
1110 break;
0d01c5df 1111 case SDEBUG_UA_CAPACITY_CHANGED:
f46eb0e9
DG
1112 mk_sense_buffer(scp, UNIT_ATTENTION, UA_CHANGED_ASC,
1113 CAPACITY_CHANGED_ASCQ);
773642d9 1114 if (sdebug_verbose)
0d01c5df 1115 cp = "capacity data changed";
f49accf1 1116 break;
acafd0b9 1117 case SDEBUG_UA_MICROCODE_CHANGED:
f46eb0e9 1118 mk_sense_buffer(scp, UNIT_ATTENTION,
b01f6f83
DG
1119 TARGET_CHANGED_ASC,
1120 MICROCODE_CHANGED_ASCQ);
773642d9 1121 if (sdebug_verbose)
acafd0b9
EM
1122 cp = "microcode has been changed";
1123 break;
1124 case SDEBUG_UA_MICROCODE_CHANGED_WO_RESET:
f46eb0e9 1125 mk_sense_buffer(scp, UNIT_ATTENTION,
acafd0b9
EM
1126 TARGET_CHANGED_ASC,
1127 MICROCODE_CHANGED_WO_RESET_ASCQ);
773642d9 1128 if (sdebug_verbose)
acafd0b9
EM
1129 cp = "microcode has been changed without reset";
1130 break;
19c8ead7
EM
1131 case SDEBUG_UA_LUNS_CHANGED:
1132 /*
1133 * SPC-3 behavior is to report a UNIT ATTENTION with
1134 * ASC/ASCQ REPORTED LUNS DATA HAS CHANGED on every LUN
1135 * on the target, until a REPORT LUNS command is
1136 * received. SPC-4 behavior is to report it only once.
773642d9 1137 * NOTE: sdebug_scsi_level does not use the same
19c8ead7
EM
1138 * values as struct scsi_device->scsi_level.
1139 */
773642d9 1140 if (sdebug_scsi_level >= 6) /* SPC-4 and above */
19c8ead7 1141 clear_luns_changed_on_target(devip);
f46eb0e9 1142 mk_sense_buffer(scp, UNIT_ATTENTION,
19c8ead7
EM
1143 TARGET_CHANGED_ASC,
1144 LUNS_CHANGED_ASCQ);
773642d9 1145 if (sdebug_verbose)
19c8ead7
EM
1146 cp = "reported luns data has changed";
1147 break;
cbf67842 1148 default:
773642d9
DG
1149 pr_warn("unexpected unit attention code=%d\n", k);
1150 if (sdebug_verbose)
cbf67842
DG
1151 cp = "unknown";
1152 break;
1153 }
1154 clear_bit(k, devip->uas_bm);
773642d9 1155 if (sdebug_verbose)
f46eb0e9 1156 sdev_printk(KERN_INFO, scp->device,
cbf67842
DG
1157 "%s reports: Unit attention: %s\n",
1158 my_name, cp);
1da177e4
LT
1159 return check_condition_result;
1160 }
1161 return 0;
1162}
1163
fb0cc8d1 1164/* Build SCSI "data-in" buffer. Returns 0 if ok else (DID_ERROR << 16). */
21a61829 1165static int fill_from_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
1da177e4
LT
1166 int arr_len)
1167{
21a61829 1168 int act_len;
ae3d56d8 1169 struct scsi_data_buffer *sdb = &scp->sdb;
1da177e4 1170
072d0bb3 1171 if (!sdb->length)
1da177e4 1172 return 0;
ae3d56d8 1173 if (scp->sc_data_direction != DMA_FROM_DEVICE)
773642d9 1174 return DID_ERROR << 16;
21a61829
FT
1175
1176 act_len = sg_copy_from_buffer(sdb->table.sgl, sdb->table.nents,
1177 arr, arr_len);
42d387be 1178 scsi_set_resid(scp, scsi_bufflen(scp) - act_len);
21a61829 1179
1da177e4
LT
1180 return 0;
1181}
1182
fb0cc8d1
DG
1183/* Partial build of SCSI "data-in" buffer. Returns 0 if ok else
1184 * (DID_ERROR << 16). Can write to offset in data-in buffer. If multiple
1185 * calls, not required to write in ascending offset order. Assumes resid
1186 * set to scsi_bufflen() prior to any calls.
1187 */
1188static int p_fill_from_dev_buffer(struct scsi_cmnd *scp, const void *arr,
1189 int arr_len, unsigned int off_dst)
1190{
9237f04e 1191 unsigned int act_len, n;
ae3d56d8 1192 struct scsi_data_buffer *sdb = &scp->sdb;
fb0cc8d1
DG
1193 off_t skip = off_dst;
1194
1195 if (sdb->length <= off_dst)
1196 return 0;
ae3d56d8 1197 if (scp->sc_data_direction != DMA_FROM_DEVICE)
fb0cc8d1
DG
1198 return DID_ERROR << 16;
1199
1200 act_len = sg_pcopy_from_buffer(sdb->table.sgl, sdb->table.nents,
1201 arr, arr_len, skip);
1202 pr_debug("%s: off_dst=%u, scsi_bufflen=%u, act_len=%u, resid=%d\n",
42d387be
BVA
1203 __func__, off_dst, scsi_bufflen(scp), act_len,
1204 scsi_get_resid(scp));
9237f04e 1205 n = scsi_bufflen(scp) - (off_dst + act_len);
36e07d7e 1206 scsi_set_resid(scp, min_t(u32, scsi_get_resid(scp), n));
fb0cc8d1
DG
1207 return 0;
1208}
1209
1210/* Fetches from SCSI "data-out" buffer. Returns number of bytes fetched into
1211 * 'arr' or -1 if error.
1212 */
21a61829
FT
1213static int fetch_to_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
1214 int arr_len)
1da177e4 1215{
21a61829 1216 if (!scsi_bufflen(scp))
1da177e4 1217 return 0;
ae3d56d8 1218 if (scp->sc_data_direction != DMA_TO_DEVICE)
1da177e4 1219 return -1;
21a61829
FT
1220
1221 return scsi_sg_copy_to_buffer(scp, arr, arr_len);
1da177e4
LT
1222}
1223
1224
e5203cf0
HR
1225static char sdebug_inq_vendor_id[9] = "Linux ";
1226static char sdebug_inq_product_id[17] = "scsi_debug ";
9b760fd8 1227static char sdebug_inq_product_rev[5] = SDEBUG_VERSION;
1b37bd60
DG
1228/* Use some locally assigned NAAs for SAS addresses. */
1229static const u64 naa3_comp_a = 0x3222222000000000ULL;
1230static const u64 naa3_comp_b = 0x3333333000000000ULL;
1231static const u64 naa3_comp_c = 0x3111111000000000ULL;
1da177e4 1232
cbf67842 1233/* Device identification VPD page. Returns number of bytes placed in arr */
760f3b03
DG
1234static int inquiry_vpd_83(unsigned char *arr, int port_group_id,
1235 int target_dev_id, int dev_id_num,
09ba24c1 1236 const char *dev_id_str, int dev_id_str_len,
bf476433 1237 const uuid_t *lu_name)
1da177e4 1238{
c65b1445
DG
1239 int num, port_a;
1240 char b[32];
1da177e4 1241
c65b1445 1242 port_a = target_dev_id + 1;
1da177e4
LT
1243 /* T10 vendor identifier field format (faked) */
1244 arr[0] = 0x2; /* ASCII */
1245 arr[1] = 0x1;
1246 arr[2] = 0x0;
e5203cf0
HR
1247 memcpy(&arr[4], sdebug_inq_vendor_id, 8);
1248 memcpy(&arr[12], sdebug_inq_product_id, 16);
1da177e4
LT
1249 memcpy(&arr[28], dev_id_str, dev_id_str_len);
1250 num = 8 + 16 + dev_id_str_len;
1251 arr[3] = num;
1252 num += 4;
c65b1445 1253 if (dev_id_num >= 0) {
09ba24c1
DG
1254 if (sdebug_uuid_ctl) {
1255 /* Locally assigned UUID */
1256 arr[num++] = 0x1; /* binary (not necessarily sas) */
1257 arr[num++] = 0xa; /* PIV=0, lu, naa */
1258 arr[num++] = 0x0;
1259 arr[num++] = 0x12;
1260 arr[num++] = 0x10; /* uuid type=1, locally assigned */
1261 arr[num++] = 0x0;
1262 memcpy(arr + num, lu_name, 16);
1263 num += 16;
1264 } else {
1b37bd60 1265 /* NAA-3, Logical unit identifier (binary) */
09ba24c1
DG
1266 arr[num++] = 0x1; /* binary (not necessarily sas) */
1267 arr[num++] = 0x3; /* PIV=0, lu, naa */
1268 arr[num++] = 0x0;
1269 arr[num++] = 0x8;
1b37bd60 1270 put_unaligned_be64(naa3_comp_b + dev_id_num, arr + num);
09ba24c1
DG
1271 num += 8;
1272 }
c65b1445
DG
1273 /* Target relative port number */
1274 arr[num++] = 0x61; /* proto=sas, binary */
1275 arr[num++] = 0x94; /* PIV=1, target port, rel port */
1276 arr[num++] = 0x0; /* reserved */
1277 arr[num++] = 0x4; /* length */
1278 arr[num++] = 0x0; /* reserved */
1279 arr[num++] = 0x0; /* reserved */
1280 arr[num++] = 0x0;
1281 arr[num++] = 0x1; /* relative port A */
1282 }
1b37bd60 1283 /* NAA-3, Target port identifier */
c65b1445
DG
1284 arr[num++] = 0x61; /* proto=sas, binary */
1285 arr[num++] = 0x93; /* piv=1, target port, naa */
1286 arr[num++] = 0x0;
1287 arr[num++] = 0x8;
1b37bd60 1288 put_unaligned_be64(naa3_comp_a + port_a, arr + num);
773642d9 1289 num += 8;
1b37bd60 1290 /* NAA-3, Target port group identifier */
5a09e398
HR
1291 arr[num++] = 0x61; /* proto=sas, binary */
1292 arr[num++] = 0x95; /* piv=1, target port group id */
1293 arr[num++] = 0x0;
1294 arr[num++] = 0x4;
1295 arr[num++] = 0;
1296 arr[num++] = 0;
773642d9
DG
1297 put_unaligned_be16(port_group_id, arr + num);
1298 num += 2;
1b37bd60 1299 /* NAA-3, Target device identifier */
c65b1445
DG
1300 arr[num++] = 0x61; /* proto=sas, binary */
1301 arr[num++] = 0xa3; /* piv=1, target device, naa */
1302 arr[num++] = 0x0;
1303 arr[num++] = 0x8;
1b37bd60 1304 put_unaligned_be64(naa3_comp_a + target_dev_id, arr + num);
773642d9 1305 num += 8;
c65b1445
DG
1306 /* SCSI name string: Target device identifier */
1307 arr[num++] = 0x63; /* proto=sas, UTF-8 */
1308 arr[num++] = 0xa8; /* piv=1, target device, SCSI name string */
1309 arr[num++] = 0x0;
1310 arr[num++] = 24;
1b37bd60 1311 memcpy(arr + num, "naa.32222220", 12);
c65b1445
DG
1312 num += 12;
1313 snprintf(b, sizeof(b), "%08X", target_dev_id);
1314 memcpy(arr + num, b, 8);
1315 num += 8;
1316 memset(arr + num, 0, 4);
1317 num += 4;
1318 return num;
1319}
1320
c65b1445
DG
1321static unsigned char vpd84_data[] = {
1322/* from 4th byte */ 0x22,0x22,0x22,0x0,0xbb,0x0,
1323 0x22,0x22,0x22,0x0,0xbb,0x1,
1324 0x22,0x22,0x22,0x0,0xbb,0x2,
1325};
1326
cbf67842 1327/* Software interface identification VPD page */
760f3b03 1328static int inquiry_vpd_84(unsigned char *arr)
c65b1445
DG
1329{
1330 memcpy(arr, vpd84_data, sizeof(vpd84_data));
1331 return sizeof(vpd84_data);
1332}
1333
cbf67842 1334/* Management network addresses VPD page */
760f3b03 1335static int inquiry_vpd_85(unsigned char *arr)
c65b1445
DG
1336{
1337 int num = 0;
91d4c752
JP
1338 const char *na1 = "https://www.kernel.org/config";
1339 const char *na2 = "http://www.kernel.org/log";
c65b1445
DG
1340 int plen, olen;
1341
1342 arr[num++] = 0x1; /* lu, storage config */
1343 arr[num++] = 0x0; /* reserved */
1344 arr[num++] = 0x0;
1345 olen = strlen(na1);
1346 plen = olen + 1;
1347 if (plen % 4)
1348 plen = ((plen / 4) + 1) * 4;
1349 arr[num++] = plen; /* length, null termianted, padded */
1350 memcpy(arr + num, na1, olen);
1351 memset(arr + num + olen, 0, plen - olen);
1352 num += plen;
1353
1354 arr[num++] = 0x4; /* lu, logging */
1355 arr[num++] = 0x0; /* reserved */
1356 arr[num++] = 0x0;
1357 olen = strlen(na2);
1358 plen = olen + 1;
1359 if (plen % 4)
1360 plen = ((plen / 4) + 1) * 4;
1361 arr[num++] = plen; /* length, null terminated, padded */
1362 memcpy(arr + num, na2, olen);
1363 memset(arr + num + olen, 0, plen - olen);
1364 num += plen;
1365
1366 return num;
1367}
1368
1369/* SCSI ports VPD page */
760f3b03 1370static int inquiry_vpd_88(unsigned char *arr, int target_dev_id)
c65b1445
DG
1371{
1372 int num = 0;
1373 int port_a, port_b;
1374
1375 port_a = target_dev_id + 1;
1376 port_b = port_a + 1;
1377 arr[num++] = 0x0; /* reserved */
1378 arr[num++] = 0x0; /* reserved */
1379 arr[num++] = 0x0;
1380 arr[num++] = 0x1; /* relative port 1 (primary) */
1381 memset(arr + num, 0, 6);
1382 num += 6;
1383 arr[num++] = 0x0;
1384 arr[num++] = 12; /* length tp descriptor */
1385 /* naa-5 target port identifier (A) */
1386 arr[num++] = 0x61; /* proto=sas, binary */
1387 arr[num++] = 0x93; /* PIV=1, target port, NAA */
1388 arr[num++] = 0x0; /* reserved */
1389 arr[num++] = 0x8; /* length */
1b37bd60 1390 put_unaligned_be64(naa3_comp_a + port_a, arr + num);
773642d9 1391 num += 8;
c65b1445
DG
1392 arr[num++] = 0x0; /* reserved */
1393 arr[num++] = 0x0; /* reserved */
1394 arr[num++] = 0x0;
1395 arr[num++] = 0x2; /* relative port 2 (secondary) */
1396 memset(arr + num, 0, 6);
1397 num += 6;
1398 arr[num++] = 0x0;
1399 arr[num++] = 12; /* length tp descriptor */
1400 /* naa-5 target port identifier (B) */
1401 arr[num++] = 0x61; /* proto=sas, binary */
1402 arr[num++] = 0x93; /* PIV=1, target port, NAA */
1403 arr[num++] = 0x0; /* reserved */
1404 arr[num++] = 0x8; /* length */
1b37bd60 1405 put_unaligned_be64(naa3_comp_a + port_b, arr + num);
773642d9 1406 num += 8;
c65b1445
DG
1407
1408 return num;
1409}
1410
1411
1412static unsigned char vpd89_data[] = {
1413/* from 4th byte */ 0,0,0,0,
1414'l','i','n','u','x',' ',' ',' ',
1415'S','A','T',' ','s','c','s','i','_','d','e','b','u','g',' ',' ',
1416'1','2','3','4',
14170x34,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
14180xec,0,0,0,
14190x5a,0xc,0xff,0x3f,0x37,0xc8,0x10,0,0,0,0,0,0x3f,0,0,0,
14200,0,0,0,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x20,0x20,0x20,0x20,
14210x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0,0,0,0x40,0x4,0,0x2e,0x33,
14220x38,0x31,0x20,0x20,0x20,0x20,0x54,0x53,0x38,0x33,0x30,0x30,0x33,0x31,
14230x53,0x41,
14240x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
14250x20,0x20,
14260x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
14270x10,0x80,
14280,0,0,0x2f,0,0,0,0x2,0,0x2,0x7,0,0xff,0xff,0x1,0,
14290x3f,0,0xc1,0xff,0x3e,0,0x10,0x1,0xb0,0xf8,0x50,0x9,0,0,0x7,0,
14300x3,0,0x78,0,0x78,0,0xf0,0,0x78,0,0,0,0,0,0,0,
14310,0,0,0,0,0,0,0,0x2,0,0,0,0,0,0,0,
14320x7e,0,0x1b,0,0x6b,0x34,0x1,0x7d,0x3,0x40,0x69,0x34,0x1,0x3c,0x3,0x40,
14330x7f,0x40,0,0,0,0,0xfe,0xfe,0,0,0,0,0,0xfe,0,0,
14340,0,0,0,0,0,0,0,0xb0,0xf8,0x50,0x9,0,0,0,0,
14350,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14370,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14380x1,0,0xb0,0xf8,0x50,0x9,0xb0,0xf8,0x50,0x9,0x20,0x20,0x2,0,0xb6,0x42,
14390,0x80,0x8a,0,0x6,0x3c,0xa,0x3c,0xff,0xff,0xc6,0x7,0,0x1,0,0x8,
14400xf0,0xf,0,0x10,0x2,0,0x30,0,0,0,0,0,0,0,0x6,0xfe,
14410,0,0x2,0,0x50,0,0x8a,0,0x4f,0x95,0,0,0x21,0,0xb,0,
14420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14430,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14440,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14450,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14460,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14470,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14490,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14510,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14520,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14530,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa5,0x51,
1454};
1455
cbf67842 1456/* ATA Information VPD page */
760f3b03 1457static int inquiry_vpd_89(unsigned char *arr)
c65b1445
DG
1458{
1459 memcpy(arr, vpd89_data, sizeof(vpd89_data));
1460 return sizeof(vpd89_data);
1461}
1462
1463
1464static unsigned char vpdb0_data[] = {
1e49f785
DG
1465 /* from 4th byte */ 0,0,0,4, 0,0,0x4,0, 0,0,0,64,
1466 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1467 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1468 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
c65b1445
DG
1469};
1470
cbf67842 1471/* Block limits VPD page (SBC-3) */
760f3b03 1472static int inquiry_vpd_b0(unsigned char *arr)
c65b1445 1473{
ea61fca5
MP
1474 unsigned int gran;
1475
c65b1445 1476 memcpy(arr, vpdb0_data, sizeof(vpdb0_data));
e308b3d1
MP
1477
1478 /* Optimal transfer length granularity */
86e6828a
LH
1479 if (sdebug_opt_xferlen_exp != 0 &&
1480 sdebug_physblk_exp < sdebug_opt_xferlen_exp)
1481 gran = 1 << sdebug_opt_xferlen_exp;
1482 else
1483 gran = 1 << sdebug_physblk_exp;
773642d9 1484 put_unaligned_be16(gran, arr + 2);
e308b3d1
MP
1485
1486 /* Maximum Transfer Length */
773642d9
DG
1487 if (sdebug_store_sectors > 0x400)
1488 put_unaligned_be32(sdebug_store_sectors, arr + 4);
44d92694 1489
e308b3d1 1490 /* Optimal Transfer Length */
773642d9 1491 put_unaligned_be32(sdebug_opt_blks, &arr[8]);
e308b3d1 1492
773642d9 1493 if (sdebug_lbpu) {
e308b3d1 1494 /* Maximum Unmap LBA Count */
773642d9 1495 put_unaligned_be32(sdebug_unmap_max_blocks, &arr[16]);
e308b3d1
MP
1496
1497 /* Maximum Unmap Block Descriptor Count */
773642d9 1498 put_unaligned_be32(sdebug_unmap_max_desc, &arr[20]);
44d92694
MP
1499 }
1500
e308b3d1 1501 /* Unmap Granularity Alignment */
773642d9
DG
1502 if (sdebug_unmap_alignment) {
1503 put_unaligned_be32(sdebug_unmap_alignment, &arr[28]);
44d92694
MP
1504 arr[28] |= 0x80; /* UGAVALID */
1505 }
1506
e308b3d1 1507 /* Optimal Unmap Granularity */
773642d9 1508 put_unaligned_be32(sdebug_unmap_granularity, &arr[24]);
6014759c 1509
5b94e232 1510 /* Maximum WRITE SAME Length */
773642d9 1511 put_unaligned_be64(sdebug_write_same_length, &arr[32]);
5b94e232
MP
1512
1513 return 0x3c; /* Mandatory page length for Logical Block Provisioning */
44d92694 1514
c65b1445 1515 return sizeof(vpdb0_data);
1da177e4
LT
1516}
1517
1e49f785 1518/* Block device characteristics VPD page (SBC-3) */
64e14ece 1519static int inquiry_vpd_b1(struct sdebug_dev_info *devip, unsigned char *arr)
eac6e8e4
MW
1520{
1521 memset(arr, 0, 0x3c);
1522 arr[0] = 0;
1e49f785
DG
1523 arr[1] = 1; /* non rotating medium (e.g. solid state) */
1524 arr[2] = 0;
1525 arr[3] = 5; /* less than 1.8" */
64e14ece
DLM
1526 if (devip->zmodel == BLK_ZONED_HA)
1527 arr[4] = 1 << 4; /* zoned field = 01b */
eac6e8e4
MW
1528
1529 return 0x3c;
1530}
1da177e4 1531
760f3b03
DG
1532/* Logical block provisioning VPD page (SBC-4) */
1533static int inquiry_vpd_b2(unsigned char *arr)
6014759c 1534{
3f0bc3b3 1535 memset(arr, 0, 0x4);
6014759c 1536 arr[0] = 0; /* threshold exponent */
773642d9 1537 if (sdebug_lbpu)
6014759c 1538 arr[1] = 1 << 7;
773642d9 1539 if (sdebug_lbpws)
6014759c 1540 arr[1] |= 1 << 6;
773642d9 1541 if (sdebug_lbpws10)
5b94e232 1542 arr[1] |= 1 << 5;
760f3b03
DG
1543 if (sdebug_lbprz && scsi_debug_lbp())
1544 arr[1] |= (sdebug_lbprz & 0x7) << 2; /* sbc4r07 and later */
1545 /* anc_sup=0; dp=0 (no provisioning group descriptor) */
1546 /* minimum_percentage=0; provisioning_type=0 (unknown) */
1547 /* threshold_percentage=0 */
3f0bc3b3 1548 return 0x4;
6014759c
MP
1549}
1550
d36da305 1551/* Zoned block device characteristics VPD page (ZBC mandatory) */
f0d1cf93 1552static int inquiry_vpd_b6(struct sdebug_dev_info *devip, unsigned char *arr)
d36da305
DG
1553{
1554 memset(arr, 0, 0x3c);
1555 arr[0] = 0x1; /* set URSWRZ (unrestricted read in seq. wr req zone) */
1556 /*
1557 * Set Optimal number of open sequential write preferred zones and
1558 * Optimal number of non-sequentially written sequential write
f0d1cf93
DG
1559 * preferred zones fields to 'not reported' (0xffffffff). Leave other
1560 * fields set to zero, apart from Max. number of open swrz_s field.
d36da305
DG
1561 */
1562 put_unaligned_be32(0xffffffff, &arr[4]);
1563 put_unaligned_be32(0xffffffff, &arr[8]);
64e14ece 1564 if (sdeb_zbc_model == BLK_ZONED_HM && devip->max_open)
f0d1cf93
DG
1565 put_unaligned_be32(devip->max_open, &arr[12]);
1566 else
1567 put_unaligned_be32(0xffffffff, &arr[12]);
4a5fc1c6
DLM
1568 if (devip->zcap < devip->zsize) {
1569 arr[19] = ZBC_CONSTANT_ZONE_START_OFFSET;
1570 put_unaligned_be64(devip->zsize, &arr[20]);
1571 } else {
1572 arr[19] = 0;
1573 }
d36da305
DG
1574 return 0x3c;
1575}
1576
1da177e4 1577#define SDEBUG_LONG_INQ_SZ 96
c65b1445 1578#define SDEBUG_MAX_INQ_ARR_SZ 584
1da177e4 1579
c2248fc9 1580static int resp_inquiry(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
1da177e4
LT
1581{
1582 unsigned char pq_pdt;
91d4c752 1583 unsigned char *arr;
01123ef4 1584 unsigned char *cmd = scp->cmnd;
36e07d7e
GK
1585 u32 alloc_len, n;
1586 int ret;
d36da305 1587 bool have_wlun, is_disk, is_zbc, is_disk_zbc;
1da177e4 1588
773642d9 1589 alloc_len = get_unaligned_be16(cmd + 3);
6f3cbf55
DG
1590 arr = kzalloc(SDEBUG_MAX_INQ_ARR_SZ, GFP_ATOMIC);
1591 if (! arr)
1592 return DID_REQUEUE << 16;
760f3b03 1593 is_disk = (sdebug_ptype == TYPE_DISK);
64e14ece 1594 is_zbc = (devip->zmodel != BLK_ZONED_NONE);
d36da305 1595 is_disk_zbc = (is_disk || is_zbc);
b01f6f83 1596 have_wlun = scsi_is_wlun(scp->device->lun);
c2248fc9 1597 if (have_wlun)
b01f6f83
DG
1598 pq_pdt = TYPE_WLUN; /* present, wlun */
1599 else if (sdebug_no_lun_0 && (devip->lun == SDEBUG_LUN_0_VAL))
1600 pq_pdt = 0x7f; /* not present, PQ=3, PDT=0x1f */
c65b1445 1601 else
773642d9 1602 pq_pdt = (sdebug_ptype & 0x1f);
1da177e4
LT
1603 arr[0] = pq_pdt;
1604 if (0x2 & cmd[1]) { /* CMDDT bit set */
22017ed2 1605 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 1);
5a09e398 1606 kfree(arr);
1da177e4
LT
1607 return check_condition_result;
1608 } else if (0x1 & cmd[1]) { /* EVPD bit set */
36e07d7e
GK
1609 int lu_id_num, port_group_id, target_dev_id;
1610 u32 len;
c65b1445
DG
1611 char lu_id_str[6];
1612 int host_no = devip->sdbg_host->shost->host_no;
1da177e4 1613
5a09e398
HR
1614 port_group_id = (((host_no + 1) & 0x7f) << 8) +
1615 (devip->channel & 0x7f);
b01f6f83 1616 if (sdebug_vpd_use_hostno == 0)
23183910 1617 host_no = 0;
c2248fc9 1618 lu_id_num = have_wlun ? -1 : (((host_no + 1) * 2000) +
c65b1445
DG
1619 (devip->target * 1000) + devip->lun);
1620 target_dev_id = ((host_no + 1) * 2000) +
1621 (devip->target * 1000) - 3;
1622 len = scnprintf(lu_id_str, 6, "%d", lu_id_num);
1da177e4 1623 if (0 == cmd[2]) { /* supported vital product data pages */
c65b1445
DG
1624 arr[1] = cmd[2]; /*sanity */
1625 n = 4;
1626 arr[n++] = 0x0; /* this page */
1627 arr[n++] = 0x80; /* unit serial number */
1628 arr[n++] = 0x83; /* device identification */
1629 arr[n++] = 0x84; /* software interface ident. */
1630 arr[n++] = 0x85; /* management network addresses */
1631 arr[n++] = 0x86; /* extended inquiry */
1632 arr[n++] = 0x87; /* mode page policy */
1633 arr[n++] = 0x88; /* SCSI ports */
d36da305 1634 if (is_disk_zbc) { /* SBC or ZBC */
760f3b03
DG
1635 arr[n++] = 0x89; /* ATA information */
1636 arr[n++] = 0xb0; /* Block limits */
1637 arr[n++] = 0xb1; /* Block characteristics */
d36da305
DG
1638 if (is_disk)
1639 arr[n++] = 0xb2; /* LB Provisioning */
64e14ece 1640 if (is_zbc)
d36da305 1641 arr[n++] = 0xb6; /* ZB dev. char. */
760f3b03 1642 }
c65b1445 1643 arr[3] = n - 4; /* number of supported VPD pages */
1da177e4 1644 } else if (0x80 == cmd[2]) { /* unit serial number */
c65b1445 1645 arr[1] = cmd[2]; /*sanity */
1da177e4 1646 arr[3] = len;
c65b1445 1647 memcpy(&arr[4], lu_id_str, len);
1da177e4 1648 } else if (0x83 == cmd[2]) { /* device identification */
c65b1445 1649 arr[1] = cmd[2]; /*sanity */
760f3b03
DG
1650 arr[3] = inquiry_vpd_83(&arr[4], port_group_id,
1651 target_dev_id, lu_id_num,
09ba24c1
DG
1652 lu_id_str, len,
1653 &devip->lu_name);
c65b1445
DG
1654 } else if (0x84 == cmd[2]) { /* Software interface ident. */
1655 arr[1] = cmd[2]; /*sanity */
760f3b03 1656 arr[3] = inquiry_vpd_84(&arr[4]);
c65b1445
DG
1657 } else if (0x85 == cmd[2]) { /* Management network addresses */
1658 arr[1] = cmd[2]; /*sanity */
760f3b03 1659 arr[3] = inquiry_vpd_85(&arr[4]);
c65b1445
DG
1660 } else if (0x86 == cmd[2]) { /* extended inquiry */
1661 arr[1] = cmd[2]; /*sanity */
1662 arr[3] = 0x3c; /* number of following entries */
8475c811 1663 if (sdebug_dif == T10_PI_TYPE3_PROTECTION)
c6a44287 1664 arr[4] = 0x4; /* SPT: GRD_CHK:1 */
760f3b03 1665 else if (have_dif_prot)
c6a44287
MP
1666 arr[4] = 0x5; /* SPT: GRD_CHK:1, REF_CHK:1 */
1667 else
1668 arr[4] = 0x0; /* no protection stuff */
c65b1445
DG
1669 arr[5] = 0x7; /* head of q, ordered + simple q's */
1670 } else if (0x87 == cmd[2]) { /* mode page policy */
1671 arr[1] = cmd[2]; /*sanity */
1672 arr[3] = 0x8; /* number of following entries */
1673 arr[4] = 0x2; /* disconnect-reconnect mp */
1674 arr[6] = 0x80; /* mlus, shared */
1675 arr[8] = 0x18; /* protocol specific lu */
1676 arr[10] = 0x82; /* mlus, per initiator port */
1677 } else if (0x88 == cmd[2]) { /* SCSI Ports */
1678 arr[1] = cmd[2]; /*sanity */
760f3b03 1679 arr[3] = inquiry_vpd_88(&arr[4], target_dev_id);
d36da305 1680 } else if (is_disk_zbc && 0x89 == cmd[2]) { /* ATA info */
c65b1445 1681 arr[1] = cmd[2]; /*sanity */
760f3b03 1682 n = inquiry_vpd_89(&arr[4]);
773642d9 1683 put_unaligned_be16(n, arr + 2);
d36da305 1684 } else if (is_disk_zbc && 0xb0 == cmd[2]) { /* Block limits */
c65b1445 1685 arr[1] = cmd[2]; /*sanity */
760f3b03 1686 arr[3] = inquiry_vpd_b0(&arr[4]);
d36da305 1687 } else if (is_disk_zbc && 0xb1 == cmd[2]) { /* Block char. */
eac6e8e4 1688 arr[1] = cmd[2]; /*sanity */
64e14ece 1689 arr[3] = inquiry_vpd_b1(devip, &arr[4]);
760f3b03 1690 } else if (is_disk && 0xb2 == cmd[2]) { /* LB Prov. */
6014759c 1691 arr[1] = cmd[2]; /*sanity */
760f3b03 1692 arr[3] = inquiry_vpd_b2(&arr[4]);
d36da305
DG
1693 } else if (is_zbc && cmd[2] == 0xb6) { /* ZB dev. charact. */
1694 arr[1] = cmd[2]; /*sanity */
f0d1cf93 1695 arr[3] = inquiry_vpd_b6(devip, &arr[4]);
1da177e4 1696 } else {
22017ed2 1697 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, -1);
5a09e398 1698 kfree(arr);
1da177e4
LT
1699 return check_condition_result;
1700 }
36e07d7e 1701 len = min_t(u32, get_unaligned_be16(arr + 2) + 4, alloc_len);
5a09e398 1702 ret = fill_from_dev_buffer(scp, arr,
36e07d7e 1703 min_t(u32, len, SDEBUG_MAX_INQ_ARR_SZ));
5a09e398
HR
1704 kfree(arr);
1705 return ret;
1da177e4
LT
1706 }
1707 /* drops through here for a standard inquiry */
773642d9
DG
1708 arr[1] = sdebug_removable ? 0x80 : 0; /* Removable disk */
1709 arr[2] = sdebug_scsi_level;
1da177e4
LT
1710 arr[3] = 2; /* response_data_format==2 */
1711 arr[4] = SDEBUG_LONG_INQ_SZ - 5;
f46eb0e9 1712 arr[5] = (int)have_dif_prot; /* PROTECT bit */
b01f6f83 1713 if (sdebug_vpd_use_hostno == 0)
70bdf202 1714 arr[5] |= 0x10; /* claim: implicit TPGS */
c65b1445 1715 arr[6] = 0x10; /* claim: MultiP */
1da177e4 1716 /* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */
c65b1445 1717 arr[7] = 0xa; /* claim: LINKED + CMDQUE */
e5203cf0
HR
1718 memcpy(&arr[8], sdebug_inq_vendor_id, 8);
1719 memcpy(&arr[16], sdebug_inq_product_id, 16);
1720 memcpy(&arr[32], sdebug_inq_product_rev, 4);
9b760fd8
DG
1721 /* Use Vendor Specific area to place driver date in ASCII hex */
1722 memcpy(&arr[36], sdebug_version_date, 8);
1da177e4 1723 /* version descriptors (2 bytes each) follow */
760f3b03
DG
1724 put_unaligned_be16(0xc0, arr + 58); /* SAM-6 no version claimed */
1725 put_unaligned_be16(0x5c0, arr + 60); /* SPC-5 no version claimed */
c65b1445 1726 n = 62;
760f3b03
DG
1727 if (is_disk) { /* SBC-4 no version claimed */
1728 put_unaligned_be16(0x600, arr + n);
1729 n += 2;
1730 } else if (sdebug_ptype == TYPE_TAPE) { /* SSC-4 rev 3 */
1731 put_unaligned_be16(0x525, arr + n);
1732 n += 2;
d36da305
DG
1733 } else if (is_zbc) { /* ZBC BSR INCITS 536 revision 05 */
1734 put_unaligned_be16(0x624, arr + n);
1735 n += 2;
1da177e4 1736 }
760f3b03 1737 put_unaligned_be16(0x2100, arr + n); /* SPL-4 no version claimed */
5a09e398 1738 ret = fill_from_dev_buffer(scp, arr,
36e07d7e 1739 min_t(u32, alloc_len, SDEBUG_LONG_INQ_SZ));
5a09e398
HR
1740 kfree(arr);
1741 return ret;
1da177e4
LT
1742}
1743
84905d34 1744/* See resp_iec_m_pg() for how this data is manipulated */
fd32119b
DG
1745static unsigned char iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
1746 0, 0, 0x0, 0x0};
1747
91d4c752
JP
1748static int resp_requests(struct scsi_cmnd *scp,
1749 struct sdebug_dev_info *devip)
1da177e4 1750{
01123ef4 1751 unsigned char *cmd = scp->cmnd;
84905d34
DG
1752 unsigned char arr[SCSI_SENSE_BUFFERSIZE]; /* assume >= 18 bytes */
1753 bool dsense = !!(cmd[1] & 1);
36e07d7e
GK
1754 u32 alloc_len = cmd[4];
1755 u32 len = 18;
84905d34 1756 int stopped_state = atomic_read(&devip->stopped);
1da177e4 1757
c65b1445 1758 memset(arr, 0, sizeof(arr));
84905d34
DG
1759 if (stopped_state > 0) { /* some "pollable" data [spc6r02: 5.12.2] */
1760 if (dsense) {
1761 arr[0] = 0x72;
1762 arr[1] = NOT_READY;
1763 arr[2] = LOGICAL_UNIT_NOT_READY;
1764 arr[3] = (stopped_state == 2) ? 0x1 : 0x2;
1765 len = 8;
1766 } else {
1767 arr[0] = 0x70;
1768 arr[2] = NOT_READY; /* NO_SENSE in sense_key */
1769 arr[7] = 0xa; /* 18 byte sense buffer */
1770 arr[12] = LOGICAL_UNIT_NOT_READY;
1771 arr[13] = (stopped_state == 2) ? 0x1 : 0x2;
1772 }
1773 } else if ((iec_m_pg[2] & 0x4) && (6 == (iec_m_pg[3] & 0xf))) {
1774 /* Information exceptions control mode page: TEST=1, MRIE=6 */
c2248fc9 1775 if (dsense) {
c65b1445
DG
1776 arr[0] = 0x72;
1777 arr[1] = 0x0; /* NO_SENSE in sense_key */
1778 arr[2] = THRESHOLD_EXCEEDED;
84905d34 1779 arr[3] = 0xff; /* Failure prediction(false) */
c2248fc9 1780 len = 8;
c65b1445
DG
1781 } else {
1782 arr[0] = 0x70;
1783 arr[2] = 0x0; /* NO_SENSE in sense_key */
1784 arr[7] = 0xa; /* 18 byte sense buffer */
1785 arr[12] = THRESHOLD_EXCEEDED;
84905d34 1786 arr[13] = 0xff; /* Failure prediction(false) */
c65b1445 1787 }
84905d34
DG
1788 } else { /* nothing to report */
1789 if (dsense) {
c65b1445 1790 len = 8;
84905d34
DG
1791 memset(arr, 0, len);
1792 arr[0] = 0x72;
c2248fc9 1793 } else {
84905d34 1794 memset(arr, 0, len);
c2248fc9 1795 arr[0] = 0x70;
c2248fc9 1796 arr[7] = 0xa;
c65b1445
DG
1797 }
1798 }
36e07d7e 1799 return fill_from_dev_buffer(scp, arr, min_t(u32, len, alloc_len));
1da177e4
LT
1800}
1801
fc13638a 1802static int resp_start_stop(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
c65b1445 1803{
01123ef4 1804 unsigned char *cmd = scp->cmnd;
fc13638a 1805 int power_cond, want_stop, stopped_state;
4f2c8bf6 1806 bool changing;
c65b1445 1807
c65b1445
DG
1808 power_cond = (cmd[4] & 0xf0) >> 4;
1809 if (power_cond) {
22017ed2 1810 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 4, 7);
c65b1445
DG
1811 return check_condition_result;
1812 }
fc13638a
DG
1813 want_stop = !(cmd[4] & 1);
1814 stopped_state = atomic_read(&devip->stopped);
1815 if (stopped_state == 2) {
1816 ktime_t now_ts = ktime_get_boottime();
1817
1818 if (ktime_to_ns(now_ts) > ktime_to_ns(devip->create_ts)) {
1819 u64 diff_ns = ktime_to_ns(ktime_sub(now_ts, devip->create_ts));
1820
1821 if (diff_ns >= ((u64)sdeb_tur_ms_to_ready * 1000000)) {
1822 /* tur_ms_to_ready timer extinguished */
1823 atomic_set(&devip->stopped, 0);
1824 stopped_state = 0;
1825 }
1826 }
1827 if (stopped_state == 2) {
1828 if (want_stop) {
1829 stopped_state = 1; /* dummy up success */
1830 } else { /* Disallow tur_ms_to_ready delay to be overridden */
1831 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 4, 0 /* START bit */);
1832 return check_condition_result;
1833 }
1834 }
1835 }
1836 changing = (stopped_state != want_stop);
1837 if (changing)
1838 atomic_xchg(&devip->stopped, want_stop);
1839 if (!changing || (cmd[1] & 0x1)) /* state unchanged or IMMED bit set in cdb */
4f2c8bf6
DG
1840 return SDEG_RES_IMMED_MASK;
1841 else
1842 return 0;
c65b1445
DG
1843}
1844
28898873
FT
1845static sector_t get_sdebug_capacity(void)
1846{
773642d9
DG
1847 static const unsigned int gibibyte = 1073741824;
1848
1849 if (sdebug_virtual_gb > 0)
1850 return (sector_t)sdebug_virtual_gb *
1851 (gibibyte / sdebug_sector_size);
28898873
FT
1852 else
1853 return sdebug_store_sectors;
1854}
1855
1da177e4 1856#define SDEBUG_READCAP_ARR_SZ 8
91d4c752
JP
1857static int resp_readcap(struct scsi_cmnd *scp,
1858 struct sdebug_dev_info *devip)
1da177e4
LT
1859{
1860 unsigned char arr[SDEBUG_READCAP_ARR_SZ];
c65b1445 1861 unsigned int capac;
1da177e4 1862
c65b1445 1863 /* following just in case virtual_gb changed */
28898873 1864 sdebug_capacity = get_sdebug_capacity();
1da177e4 1865 memset(arr, 0, SDEBUG_READCAP_ARR_SZ);
c65b1445
DG
1866 if (sdebug_capacity < 0xffffffff) {
1867 capac = (unsigned int)sdebug_capacity - 1;
773642d9
DG
1868 put_unaligned_be32(capac, arr + 0);
1869 } else
1870 put_unaligned_be32(0xffffffff, arr + 0);
1871 put_unaligned_be16(sdebug_sector_size, arr + 6);
1da177e4
LT
1872 return fill_from_dev_buffer(scp, arr, SDEBUG_READCAP_ARR_SZ);
1873}
1874
c65b1445 1875#define SDEBUG_READCAP16_ARR_SZ 32
91d4c752
JP
1876static int resp_readcap16(struct scsi_cmnd *scp,
1877 struct sdebug_dev_info *devip)
c65b1445 1878{
01123ef4 1879 unsigned char *cmd = scp->cmnd;
c65b1445 1880 unsigned char arr[SDEBUG_READCAP16_ARR_SZ];
4e3ace00 1881 u32 alloc_len;
c65b1445 1882
773642d9 1883 alloc_len = get_unaligned_be32(cmd + 10);
c65b1445 1884 /* following just in case virtual_gb changed */
28898873 1885 sdebug_capacity = get_sdebug_capacity();
c65b1445 1886 memset(arr, 0, SDEBUG_READCAP16_ARR_SZ);
773642d9
DG
1887 put_unaligned_be64((u64)(sdebug_capacity - 1), arr + 0);
1888 put_unaligned_be32(sdebug_sector_size, arr + 8);
1889 arr[13] = sdebug_physblk_exp & 0xf;
1890 arr[14] = (sdebug_lowest_aligned >> 8) & 0x3f;
44d92694 1891
be1dd78d 1892 if (scsi_debug_lbp()) {
5b94e232 1893 arr[14] |= 0x80; /* LBPME */
760f3b03
DG
1894 /* from sbc4r07, this LBPRZ field is 1 bit, but the LBPRZ in
1895 * the LB Provisioning VPD page is 3 bits. Note that lbprz=2
1896 * in the wider field maps to 0 in this field.
1897 */
1898 if (sdebug_lbprz & 1) /* precisely what the draft requires */
1899 arr[14] |= 0x40;
be1dd78d 1900 }
44d92694 1901
773642d9 1902 arr[15] = sdebug_lowest_aligned & 0xff;
c6a44287 1903
760f3b03 1904 if (have_dif_prot) {
773642d9 1905 arr[12] = (sdebug_dif - 1) << 1; /* P_TYPE */
c6a44287
MP
1906 arr[12] |= 1; /* PROT_EN */
1907 }
1908
c65b1445 1909 return fill_from_dev_buffer(scp, arr,
4e3ace00 1910 min_t(u32, alloc_len, SDEBUG_READCAP16_ARR_SZ));
c65b1445
DG
1911}
1912
5a09e398
HR
1913#define SDEBUG_MAX_TGTPGS_ARR_SZ 1412
1914
91d4c752
JP
1915static int resp_report_tgtpgs(struct scsi_cmnd *scp,
1916 struct sdebug_dev_info *devip)
5a09e398 1917{
01123ef4 1918 unsigned char *cmd = scp->cmnd;
91d4c752 1919 unsigned char *arr;
5a09e398 1920 int host_no = devip->sdbg_host->shost->host_no;
5a09e398 1921 int port_group_a, port_group_b, port_a, port_b;
f347c268
YB
1922 u32 alen, n, rlen;
1923 int ret;
5a09e398 1924
773642d9 1925 alen = get_unaligned_be32(cmd + 6);
6f3cbf55
DG
1926 arr = kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ, GFP_ATOMIC);
1927 if (! arr)
1928 return DID_REQUEUE << 16;
5a09e398
HR
1929 /*
1930 * EVPD page 0x88 states we have two ports, one
1931 * real and a fake port with no device connected.
1932 * So we create two port groups with one port each
1933 * and set the group with port B to unavailable.
1934 */
1935 port_a = 0x1; /* relative port A */
1936 port_b = 0x2; /* relative port B */
1937 port_group_a = (((host_no + 1) & 0x7f) << 8) +
773642d9 1938 (devip->channel & 0x7f);
5a09e398 1939 port_group_b = (((host_no + 1) & 0x7f) << 8) +
773642d9 1940 (devip->channel & 0x7f) + 0x80;
5a09e398
HR
1941
1942 /*
1943 * The asymmetric access state is cycled according to the host_id.
1944 */
1945 n = 4;
b01f6f83 1946 if (sdebug_vpd_use_hostno == 0) {
773642d9
DG
1947 arr[n++] = host_no % 3; /* Asymm access state */
1948 arr[n++] = 0x0F; /* claim: all states are supported */
5a09e398 1949 } else {
773642d9
DG
1950 arr[n++] = 0x0; /* Active/Optimized path */
1951 arr[n++] = 0x01; /* only support active/optimized paths */
5a09e398 1952 }
773642d9
DG
1953 put_unaligned_be16(port_group_a, arr + n);
1954 n += 2;
5a09e398
HR
1955 arr[n++] = 0; /* Reserved */
1956 arr[n++] = 0; /* Status code */
1957 arr[n++] = 0; /* Vendor unique */
1958 arr[n++] = 0x1; /* One port per group */
1959 arr[n++] = 0; /* Reserved */
1960 arr[n++] = 0; /* Reserved */
773642d9
DG
1961 put_unaligned_be16(port_a, arr + n);
1962 n += 2;
5a09e398
HR
1963 arr[n++] = 3; /* Port unavailable */
1964 arr[n++] = 0x08; /* claim: only unavailalbe paths are supported */
773642d9
DG
1965 put_unaligned_be16(port_group_b, arr + n);
1966 n += 2;
5a09e398
HR
1967 arr[n++] = 0; /* Reserved */
1968 arr[n++] = 0; /* Status code */
1969 arr[n++] = 0; /* Vendor unique */
1970 arr[n++] = 0x1; /* One port per group */
1971 arr[n++] = 0; /* Reserved */
1972 arr[n++] = 0; /* Reserved */
773642d9
DG
1973 put_unaligned_be16(port_b, arr + n);
1974 n += 2;
5a09e398
HR
1975
1976 rlen = n - 4;
773642d9 1977 put_unaligned_be32(rlen, arr + 0);
5a09e398
HR
1978
1979 /*
1980 * Return the smallest value of either
1981 * - The allocated length
1982 * - The constructed command length
1983 * - The maximum array size
1984 */
f347c268 1985 rlen = min(alen, n);
5a09e398 1986 ret = fill_from_dev_buffer(scp, arr,
f347c268 1987 min_t(u32, rlen, SDEBUG_MAX_TGTPGS_ARR_SZ));
5a09e398
HR
1988 kfree(arr);
1989 return ret;
1990}
1991
fd32119b
DG
1992static int resp_rsup_opcodes(struct scsi_cmnd *scp,
1993 struct sdebug_dev_info *devip)
38d5c833
DG
1994{
1995 bool rctd;
1996 u8 reporting_opts, req_opcode, sdeb_i, supp;
1997 u16 req_sa, u;
1998 u32 alloc_len, a_len;
1999 int k, offset, len, errsts, count, bump, na;
2000 const struct opcode_info_t *oip;
2001 const struct opcode_info_t *r_oip;
2002 u8 *arr;
2003 u8 *cmd = scp->cmnd;
2004
2005 rctd = !!(cmd[2] & 0x80);
2006 reporting_opts = cmd[2] & 0x7;
2007 req_opcode = cmd[3];
2008 req_sa = get_unaligned_be16(cmd + 4);
2009 alloc_len = get_unaligned_be32(cmd + 6);
6d310dfb 2010 if (alloc_len < 4 || alloc_len > 0xffff) {
38d5c833
DG
2011 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 6, -1);
2012 return check_condition_result;
2013 }
2014 if (alloc_len > 8192)
2015 a_len = 8192;
2016 else
2017 a_len = alloc_len;
99531e60 2018 arr = kzalloc((a_len < 256) ? 320 : a_len + 64, GFP_ATOMIC);
38d5c833
DG
2019 if (NULL == arr) {
2020 mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
2021 INSUFF_RES_ASCQ);
2022 return check_condition_result;
2023 }
2024 switch (reporting_opts) {
2025 case 0: /* all commands */
2026 /* count number of commands */
2027 for (count = 0, oip = opcode_info_arr;
2028 oip->num_attached != 0xff; ++oip) {
2029 if (F_INV_OP & oip->flags)
2030 continue;
2031 count += (oip->num_attached + 1);
2032 }
2033 bump = rctd ? 20 : 8;
2034 put_unaligned_be32(count * bump, arr);
2035 for (offset = 4, oip = opcode_info_arr;
2036 oip->num_attached != 0xff && offset < a_len; ++oip) {
2037 if (F_INV_OP & oip->flags)
2038 continue;
2039 na = oip->num_attached;
2040 arr[offset] = oip->opcode;
2041 put_unaligned_be16(oip->sa, arr + offset + 2);
2042 if (rctd)
2043 arr[offset + 5] |= 0x2;
2044 if (FF_SA & oip->flags)
2045 arr[offset + 5] |= 0x1;
2046 put_unaligned_be16(oip->len_mask[0], arr + offset + 6);
2047 if (rctd)
2048 put_unaligned_be16(0xa, arr + offset + 8);
2049 r_oip = oip;
2050 for (k = 0, oip = oip->arrp; k < na; ++k, ++oip) {
2051 if (F_INV_OP & oip->flags)
2052 continue;
2053 offset += bump;
2054 arr[offset] = oip->opcode;
2055 put_unaligned_be16(oip->sa, arr + offset + 2);
2056 if (rctd)
2057 arr[offset + 5] |= 0x2;
2058 if (FF_SA & oip->flags)
2059 arr[offset + 5] |= 0x1;
2060 put_unaligned_be16(oip->len_mask[0],
2061 arr + offset + 6);
2062 if (rctd)
2063 put_unaligned_be16(0xa,
2064 arr + offset + 8);
2065 }
2066 oip = r_oip;
2067 offset += bump;
2068 }
2069 break;
2070 case 1: /* one command: opcode only */
2071 case 2: /* one command: opcode plus service action */
2072 case 3: /* one command: if sa==0 then opcode only else opcode+sa */
2073 sdeb_i = opcode_ind_arr[req_opcode];
2074 oip = &opcode_info_arr[sdeb_i];
2075 if (F_INV_OP & oip->flags) {
2076 supp = 1;
2077 offset = 4;
2078 } else {
2079 if (1 == reporting_opts) {
2080 if (FF_SA & oip->flags) {
2081 mk_sense_invalid_fld(scp, SDEB_IN_CDB,
2082 2, 2);
2083 kfree(arr);
2084 return check_condition_result;
2085 }
2086 req_sa = 0;
2087 } else if (2 == reporting_opts &&
2088 0 == (FF_SA & oip->flags)) {
2089 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 4, -1);
2090 kfree(arr); /* point at requested sa */
2091 return check_condition_result;
2092 }
2093 if (0 == (FF_SA & oip->flags) &&
2094 req_opcode == oip->opcode)
2095 supp = 3;
2096 else if (0 == (FF_SA & oip->flags)) {
2097 na = oip->num_attached;
2098 for (k = 0, oip = oip->arrp; k < na;
2099 ++k, ++oip) {
2100 if (req_opcode == oip->opcode)
2101 break;
2102 }
2103 supp = (k >= na) ? 1 : 3;
2104 } else if (req_sa != oip->sa) {
2105 na = oip->num_attached;
2106 for (k = 0, oip = oip->arrp; k < na;
2107 ++k, ++oip) {
2108 if (req_sa == oip->sa)
2109 break;
2110 }
2111 supp = (k >= na) ? 1 : 3;
2112 } else
2113 supp = 3;
2114 if (3 == supp) {
2115 u = oip->len_mask[0];
2116 put_unaligned_be16(u, arr + 2);
2117 arr[4] = oip->opcode;
2118 for (k = 1; k < u; ++k)
2119 arr[4 + k] = (k < 16) ?
2120 oip->len_mask[k] : 0xff;
2121 offset = 4 + u;
2122 } else
2123 offset = 4;
2124 }
2125 arr[1] = (rctd ? 0x80 : 0) | supp;
2126 if (rctd) {
2127 put_unaligned_be16(0xa, arr + offset);
2128 offset += 12;
2129 }
2130 break;
2131 default:
2132 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 2);
2133 kfree(arr);
2134 return check_condition_result;
2135 }
2136 offset = (offset < a_len) ? offset : a_len;
2137 len = (offset < alloc_len) ? offset : alloc_len;
2138 errsts = fill_from_dev_buffer(scp, arr, len);
2139 kfree(arr);
2140 return errsts;
2141}
2142
fd32119b
DG
2143static int resp_rsup_tmfs(struct scsi_cmnd *scp,
2144 struct sdebug_dev_info *devip)
38d5c833
DG
2145{
2146 bool repd;
2147 u32 alloc_len, len;
2148 u8 arr[16];
2149 u8 *cmd = scp->cmnd;
2150
2151 memset(arr, 0, sizeof(arr));
2152 repd = !!(cmd[2] & 0x80);
2153 alloc_len = get_unaligned_be32(cmd + 6);
2154 if (alloc_len < 4) {
2155 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 6, -1);
2156 return check_condition_result;
2157 }
2158 arr[0] = 0xc8; /* ATS | ATSS | LURS */
2159 arr[1] = 0x1; /* ITNRS */
2160 if (repd) {
2161 arr[3] = 0xc;
2162 len = 16;
2163 } else
2164 len = 4;
2165
2166 len = (len < alloc_len) ? len : alloc_len;
2167 return fill_from_dev_buffer(scp, arr, len);
2168}
2169
1da177e4
LT
2170/* <<Following mode page info copied from ST318451LW>> */
2171
91d4c752 2172static int resp_err_recov_pg(unsigned char *p, int pcontrol, int target)
1da177e4
LT
2173{ /* Read-Write Error Recovery page for mode_sense */
2174 unsigned char err_recov_pg[] = {0x1, 0xa, 0xc0, 11, 240, 0, 0, 0,
2175 5, 0, 0xff, 0xff};
2176
2177 memcpy(p, err_recov_pg, sizeof(err_recov_pg));
2178 if (1 == pcontrol)
2179 memset(p + 2, 0, sizeof(err_recov_pg) - 2);
2180 return sizeof(err_recov_pg);
2181}
2182
91d4c752 2183static int resp_disconnect_pg(unsigned char *p, int pcontrol, int target)
1da177e4
LT
2184{ /* Disconnect-Reconnect page for mode_sense */
2185 unsigned char disconnect_pg[] = {0x2, 0xe, 128, 128, 0, 10, 0, 0,
2186 0, 0, 0, 0, 0, 0, 0, 0};
2187
2188 memcpy(p, disconnect_pg, sizeof(disconnect_pg));
2189 if (1 == pcontrol)
2190 memset(p + 2, 0, sizeof(disconnect_pg) - 2);
2191 return sizeof(disconnect_pg);
2192}
2193
91d4c752 2194static int resp_format_pg(unsigned char *p, int pcontrol, int target)
1da177e4 2195{ /* Format device page for mode_sense */
597136ab
MP
2196 unsigned char format_pg[] = {0x3, 0x16, 0, 0, 0, 0, 0, 0,
2197 0, 0, 0, 0, 0, 0, 0, 0,
2198 0, 0, 0, 0, 0x40, 0, 0, 0};
2199
2200 memcpy(p, format_pg, sizeof(format_pg));
773642d9
DG
2201 put_unaligned_be16(sdebug_sectors_per, p + 10);
2202 put_unaligned_be16(sdebug_sector_size, p + 12);
2203 if (sdebug_removable)
597136ab
MP
2204 p[20] |= 0x20; /* should agree with INQUIRY */
2205 if (1 == pcontrol)
2206 memset(p + 2, 0, sizeof(format_pg) - 2);
2207 return sizeof(format_pg);
1da177e4
LT
2208}
2209
fd32119b
DG
2210static unsigned char caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
2211 0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0,
2212 0, 0, 0, 0};
2213
91d4c752 2214static int resp_caching_pg(unsigned char *p, int pcontrol, int target)
1da177e4 2215{ /* Caching page for mode_sense */
cbf67842
DG
2216 unsigned char ch_caching_pg[] = {/* 0x8, 18, */ 0x4, 0, 0, 0, 0, 0,
2217 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
2218 unsigned char d_caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
1da177e4
LT
2219 0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0, 0, 0, 0, 0};
2220
773642d9 2221 if (SDEBUG_OPT_N_WCE & sdebug_opts)
cbf67842 2222 caching_pg[2] &= ~0x4; /* set WCE=0 (default WCE=1) */
1da177e4
LT
2223 memcpy(p, caching_pg, sizeof(caching_pg));
2224 if (1 == pcontrol)
cbf67842
DG
2225 memcpy(p + 2, ch_caching_pg, sizeof(ch_caching_pg));
2226 else if (2 == pcontrol)
2227 memcpy(p, d_caching_pg, sizeof(d_caching_pg));
1da177e4
LT
2228 return sizeof(caching_pg);
2229}
2230
fd32119b
DG
2231static unsigned char ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
2232 0, 0, 0x2, 0x4b};
2233
91d4c752 2234static int resp_ctrl_m_pg(unsigned char *p, int pcontrol, int target)
1da177e4 2235{ /* Control mode page for mode_sense */
c65b1445 2236 unsigned char ch_ctrl_m_pg[] = {/* 0xa, 10, */ 0x6, 0, 0, 0, 0, 0,
9a051019 2237 0, 0, 0, 0};
c65b1445 2238 unsigned char d_ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
1da177e4
LT
2239 0, 0, 0x2, 0x4b};
2240
773642d9 2241 if (sdebug_dsense)
1da177e4 2242 ctrl_m_pg[2] |= 0x4;
c65b1445
DG
2243 else
2244 ctrl_m_pg[2] &= ~0x4;
c6a44287 2245
773642d9 2246 if (sdebug_ato)
c6a44287
MP
2247 ctrl_m_pg[5] |= 0x80; /* ATO=1 */
2248
1da177e4
LT
2249 memcpy(p, ctrl_m_pg, sizeof(ctrl_m_pg));
2250 if (1 == pcontrol)
c65b1445
DG
2251 memcpy(p + 2, ch_ctrl_m_pg, sizeof(ch_ctrl_m_pg));
2252 else if (2 == pcontrol)
2253 memcpy(p, d_ctrl_m_pg, sizeof(d_ctrl_m_pg));
1da177e4
LT
2254 return sizeof(ctrl_m_pg);
2255}
2256
c65b1445 2257
91d4c752 2258static int resp_iec_m_pg(unsigned char *p, int pcontrol, int target)
1da177e4 2259{ /* Informational Exceptions control mode page for mode_sense */
c65b1445
DG
2260 unsigned char ch_iec_m_pg[] = {/* 0x1c, 0xa, */ 0x4, 0xf, 0, 0, 0, 0,
2261 0, 0, 0x0, 0x0};
2262 unsigned char d_iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
2263 0, 0, 0x0, 0x0};
2264
1da177e4
LT
2265 memcpy(p, iec_m_pg, sizeof(iec_m_pg));
2266 if (1 == pcontrol)
c65b1445
DG
2267 memcpy(p + 2, ch_iec_m_pg, sizeof(ch_iec_m_pg));
2268 else if (2 == pcontrol)
2269 memcpy(p, d_iec_m_pg, sizeof(d_iec_m_pg));
1da177e4
LT
2270 return sizeof(iec_m_pg);
2271}
2272
91d4c752 2273static int resp_sas_sf_m_pg(unsigned char *p, int pcontrol, int target)
c65b1445
DG
2274{ /* SAS SSP mode page - short format for mode_sense */
2275 unsigned char sas_sf_m_pg[] = {0x19, 0x6,
2276 0x6, 0x0, 0x7, 0xd0, 0x0, 0x0};
2277
2278 memcpy(p, sas_sf_m_pg, sizeof(sas_sf_m_pg));
2279 if (1 == pcontrol)
2280 memset(p + 2, 0, sizeof(sas_sf_m_pg) - 2);
2281 return sizeof(sas_sf_m_pg);
2282}
2283
2284
91d4c752 2285static int resp_sas_pcd_m_spg(unsigned char *p, int pcontrol, int target,
c65b1445
DG
2286 int target_dev_id)
2287{ /* SAS phy control and discover mode page for mode_sense */
2288 unsigned char sas_pcd_m_pg[] = {0x59, 0x1, 0, 0x64, 0, 0x6, 0, 2,
2289 0, 0, 0, 0, 0x10, 0x9, 0x8, 0x0,
773642d9
DG
2290 0, 0, 0, 0, 0, 0, 0, 0, /* insert SAS addr */
2291 0, 0, 0, 0, 0, 0, 0, 0, /* insert SAS addr */
c65b1445
DG
2292 0x2, 0, 0, 0, 0, 0, 0, 0,
2293 0x88, 0x99, 0, 0, 0, 0, 0, 0,
2294 0, 0, 0, 0, 0, 0, 0, 0,
2295 0, 1, 0, 0, 0x10, 0x9, 0x8, 0x0,
773642d9
DG
2296 0, 0, 0, 0, 0, 0, 0, 0, /* insert SAS addr */
2297 0, 0, 0, 0, 0, 0, 0, 0, /* insert SAS addr */
c65b1445
DG
2298 0x3, 0, 0, 0, 0, 0, 0, 0,
2299 0x88, 0x99, 0, 0, 0, 0, 0, 0,
2300 0, 0, 0, 0, 0, 0, 0, 0,
2301 };
2302 int port_a, port_b;
2303
1b37bd60
DG
2304 put_unaligned_be64(naa3_comp_a, sas_pcd_m_pg + 16);
2305 put_unaligned_be64(naa3_comp_c + 1, sas_pcd_m_pg + 24);
2306 put_unaligned_be64(naa3_comp_a, sas_pcd_m_pg + 64);
2307 put_unaligned_be64(naa3_comp_c + 1, sas_pcd_m_pg + 72);
c65b1445
DG
2308 port_a = target_dev_id + 1;
2309 port_b = port_a + 1;
2310 memcpy(p, sas_pcd_m_pg, sizeof(sas_pcd_m_pg));
773642d9
DG
2311 put_unaligned_be32(port_a, p + 20);
2312 put_unaligned_be32(port_b, p + 48 + 20);
c65b1445
DG
2313 if (1 == pcontrol)
2314 memset(p + 4, 0, sizeof(sas_pcd_m_pg) - 4);
2315 return sizeof(sas_pcd_m_pg);
2316}
2317
91d4c752 2318static int resp_sas_sha_m_spg(unsigned char *p, int pcontrol)
c65b1445
DG
2319{ /* SAS SSP shared protocol specific port mode subpage */
2320 unsigned char sas_sha_m_pg[] = {0x59, 0x2, 0, 0xc, 0, 0x6, 0x10, 0,
2321 0, 0, 0, 0, 0, 0, 0, 0,
2322 };
2323
2324 memcpy(p, sas_sha_m_pg, sizeof(sas_sha_m_pg));
2325 if (1 == pcontrol)
2326 memset(p + 4, 0, sizeof(sas_sha_m_pg) - 4);
2327 return sizeof(sas_sha_m_pg);
2328}
2329
1da177e4
LT
2330#define SDEBUG_MAX_MSENSE_SZ 256
2331
fd32119b
DG
2332static int resp_mode_sense(struct scsi_cmnd *scp,
2333 struct sdebug_dev_info *devip)
1da177e4 2334{
23183910 2335 int pcontrol, pcode, subpcode, bd_len;
1da177e4 2336 unsigned char dev_spec;
36e07d7e
GK
2337 u32 alloc_len, offset, len;
2338 int target_dev_id;
c2248fc9 2339 int target = scp->device->id;
91d4c752 2340 unsigned char *ap;
1da177e4 2341 unsigned char arr[SDEBUG_MAX_MSENSE_SZ];
01123ef4 2342 unsigned char *cmd = scp->cmnd;
d36da305 2343 bool dbd, llbaa, msense_6, is_disk, is_zbc, bad_pcode;
1da177e4 2344
760f3b03 2345 dbd = !!(cmd[1] & 0x8); /* disable block descriptors */
1da177e4
LT
2346 pcontrol = (cmd[2] & 0xc0) >> 6;
2347 pcode = cmd[2] & 0x3f;
2348 subpcode = cmd[3];
2349 msense_6 = (MODE_SENSE == cmd[0]);
760f3b03
DG
2350 llbaa = msense_6 ? false : !!(cmd[1] & 0x10);
2351 is_disk = (sdebug_ptype == TYPE_DISK);
64e14ece 2352 is_zbc = (devip->zmodel != BLK_ZONED_NONE);
d36da305 2353 if ((is_disk || is_zbc) && !dbd)
23183910
DG
2354 bd_len = llbaa ? 16 : 8;
2355 else
2356 bd_len = 0;
773642d9 2357 alloc_len = msense_6 ? cmd[4] : get_unaligned_be16(cmd + 7);
1da177e4
LT
2358 memset(arr, 0, SDEBUG_MAX_MSENSE_SZ);
2359 if (0x3 == pcontrol) { /* Saving values not supported */
cbf67842 2360 mk_sense_buffer(scp, ILLEGAL_REQUEST, SAVING_PARAMS_UNSUP, 0);
1da177e4
LT
2361 return check_condition_result;
2362 }
c65b1445
DG
2363 target_dev_id = ((devip->sdbg_host->shost->host_no + 1) * 2000) +
2364 (devip->target * 1000) - 3;
d36da305
DG
2365 /* for disks+zbc set DPOFUA bit and clear write protect (WP) bit */
2366 if (is_disk || is_zbc) {
b01f6f83 2367 dev_spec = 0x10; /* =0x90 if WP=1 implies read-only */
9447b6ce
MP
2368 if (sdebug_wp)
2369 dev_spec |= 0x80;
2370 } else
23183910 2371 dev_spec = 0x0;
1da177e4
LT
2372 if (msense_6) {
2373 arr[2] = dev_spec;
23183910 2374 arr[3] = bd_len;
1da177e4
LT
2375 offset = 4;
2376 } else {
2377 arr[3] = dev_spec;
23183910
DG
2378 if (16 == bd_len)
2379 arr[4] = 0x1; /* set LONGLBA bit */
2380 arr[7] = bd_len; /* assume 255 or less */
1da177e4
LT
2381 offset = 8;
2382 }
2383 ap = arr + offset;
28898873
FT
2384 if ((bd_len > 0) && (!sdebug_capacity))
2385 sdebug_capacity = get_sdebug_capacity();
2386
23183910 2387 if (8 == bd_len) {
773642d9
DG
2388 if (sdebug_capacity > 0xfffffffe)
2389 put_unaligned_be32(0xffffffff, ap + 0);
2390 else
2391 put_unaligned_be32(sdebug_capacity, ap + 0);
2392 put_unaligned_be16(sdebug_sector_size, ap + 6);
23183910
DG
2393 offset += bd_len;
2394 ap = arr + offset;
2395 } else if (16 == bd_len) {
773642d9
DG
2396 put_unaligned_be64((u64)sdebug_capacity, ap + 0);
2397 put_unaligned_be32(sdebug_sector_size, ap + 12);
23183910
DG
2398 offset += bd_len;
2399 ap = arr + offset;
2400 }
1da177e4 2401
c65b1445
DG
2402 if ((subpcode > 0x0) && (subpcode < 0xff) && (0x19 != pcode)) {
2403 /* TODO: Control Extension page */
22017ed2 2404 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
1da177e4
LT
2405 return check_condition_result;
2406 }
760f3b03
DG
2407 bad_pcode = false;
2408
1da177e4
LT
2409 switch (pcode) {
2410 case 0x1: /* Read-Write error recovery page, direct access */
2411 len = resp_err_recov_pg(ap, pcontrol, target);
2412 offset += len;
2413 break;
2414 case 0x2: /* Disconnect-Reconnect page, all devices */
2415 len = resp_disconnect_pg(ap, pcontrol, target);
2416 offset += len;
2417 break;
9a051019 2418 case 0x3: /* Format device page, direct access */
760f3b03
DG
2419 if (is_disk) {
2420 len = resp_format_pg(ap, pcontrol, target);
2421 offset += len;
2422 } else
2423 bad_pcode = true;
9a051019 2424 break;
1da177e4 2425 case 0x8: /* Caching page, direct access */
d36da305 2426 if (is_disk || is_zbc) {
760f3b03
DG
2427 len = resp_caching_pg(ap, pcontrol, target);
2428 offset += len;
2429 } else
2430 bad_pcode = true;
1da177e4
LT
2431 break;
2432 case 0xa: /* Control Mode page, all devices */
2433 len = resp_ctrl_m_pg(ap, pcontrol, target);
2434 offset += len;
2435 break;
c65b1445
DG
2436 case 0x19: /* if spc==1 then sas phy, control+discover */
2437 if ((subpcode > 0x2) && (subpcode < 0xff)) {
22017ed2 2438 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
c65b1445 2439 return check_condition_result;
9a051019 2440 }
c65b1445
DG
2441 len = 0;
2442 if ((0x0 == subpcode) || (0xff == subpcode))
2443 len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
2444 if ((0x1 == subpcode) || (0xff == subpcode))
2445 len += resp_sas_pcd_m_spg(ap + len, pcontrol, target,
2446 target_dev_id);
2447 if ((0x2 == subpcode) || (0xff == subpcode))
2448 len += resp_sas_sha_m_spg(ap + len, pcontrol);
2449 offset += len;
2450 break;
1da177e4
LT
2451 case 0x1c: /* Informational Exceptions Mode page, all devices */
2452 len = resp_iec_m_pg(ap, pcontrol, target);
2453 offset += len;
2454 break;
2455 case 0x3f: /* Read all Mode pages */
c65b1445
DG
2456 if ((0 == subpcode) || (0xff == subpcode)) {
2457 len = resp_err_recov_pg(ap, pcontrol, target);
2458 len += resp_disconnect_pg(ap + len, pcontrol, target);
760f3b03
DG
2459 if (is_disk) {
2460 len += resp_format_pg(ap + len, pcontrol,
2461 target);
2462 len += resp_caching_pg(ap + len, pcontrol,
2463 target);
d36da305
DG
2464 } else if (is_zbc) {
2465 len += resp_caching_pg(ap + len, pcontrol,
2466 target);
760f3b03 2467 }
c65b1445
DG
2468 len += resp_ctrl_m_pg(ap + len, pcontrol, target);
2469 len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
2470 if (0xff == subpcode) {
2471 len += resp_sas_pcd_m_spg(ap + len, pcontrol,
2472 target, target_dev_id);
2473 len += resp_sas_sha_m_spg(ap + len, pcontrol);
2474 }
2475 len += resp_iec_m_pg(ap + len, pcontrol, target);
760f3b03 2476 offset += len;
c65b1445 2477 } else {
22017ed2 2478 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
c65b1445 2479 return check_condition_result;
9a051019 2480 }
1da177e4
LT
2481 break;
2482 default:
760f3b03
DG
2483 bad_pcode = true;
2484 break;
2485 }
2486 if (bad_pcode) {
22017ed2 2487 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 5);
1da177e4
LT
2488 return check_condition_result;
2489 }
2490 if (msense_6)
2491 arr[0] = offset - 1;
773642d9
DG
2492 else
2493 put_unaligned_be16((offset - 2), arr + 0);
36e07d7e 2494 return fill_from_dev_buffer(scp, arr, min_t(u32, alloc_len, offset));
1da177e4
LT
2495}
2496
c65b1445
DG
2497#define SDEBUG_MAX_MSELECT_SZ 512
2498
fd32119b
DG
2499static int resp_mode_select(struct scsi_cmnd *scp,
2500 struct sdebug_dev_info *devip)
c65b1445
DG
2501{
2502 int pf, sp, ps, md_len, bd_len, off, spf, pg_len;
c2248fc9 2503 int param_len, res, mpage;
c65b1445 2504 unsigned char arr[SDEBUG_MAX_MSELECT_SZ];
01123ef4 2505 unsigned char *cmd = scp->cmnd;
c2248fc9 2506 int mselect6 = (MODE_SELECT == cmd[0]);
c65b1445 2507
c65b1445
DG
2508 memset(arr, 0, sizeof(arr));
2509 pf = cmd[1] & 0x10;
2510 sp = cmd[1] & 0x1;
773642d9 2511 param_len = mselect6 ? cmd[4] : get_unaligned_be16(cmd + 7);
c65b1445 2512 if ((0 == pf) || sp || (param_len > SDEBUG_MAX_MSELECT_SZ)) {
22017ed2 2513 mk_sense_invalid_fld(scp, SDEB_IN_CDB, mselect6 ? 4 : 7, -1);
c65b1445
DG
2514 return check_condition_result;
2515 }
9a051019
DG
2516 res = fetch_to_dev_buffer(scp, arr, param_len);
2517 if (-1 == res)
773642d9
DG
2518 return DID_ERROR << 16;
2519 else if (sdebug_verbose && (res < param_len))
cbf67842
DG
2520 sdev_printk(KERN_INFO, scp->device,
2521 "%s: cdb indicated=%d, IO sent=%d bytes\n",
2522 __func__, param_len, res);
773642d9
DG
2523 md_len = mselect6 ? (arr[0] + 1) : (get_unaligned_be16(arr + 0) + 2);
2524 bd_len = mselect6 ? arr[3] : get_unaligned_be16(arr + 6);
e0a2c28d
GK
2525 off = bd_len + (mselect6 ? 4 : 8);
2526 if (md_len > 2 || off >= res) {
22017ed2 2527 mk_sense_invalid_fld(scp, SDEB_IN_DATA, 0, -1);
c65b1445
DG
2528 return check_condition_result;
2529 }
c65b1445
DG
2530 mpage = arr[off] & 0x3f;
2531 ps = !!(arr[off] & 0x80);
2532 if (ps) {
22017ed2 2533 mk_sense_invalid_fld(scp, SDEB_IN_DATA, off, 7);
c65b1445
DG
2534 return check_condition_result;
2535 }
2536 spf = !!(arr[off] & 0x40);
773642d9 2537 pg_len = spf ? (get_unaligned_be16(arr + off + 2) + 4) :
c65b1445
DG
2538 (arr[off + 1] + 2);
2539 if ((pg_len + off) > param_len) {
cbf67842 2540 mk_sense_buffer(scp, ILLEGAL_REQUEST,
c65b1445
DG
2541 PARAMETER_LIST_LENGTH_ERR, 0);
2542 return check_condition_result;
2543 }
2544 switch (mpage) {
cbf67842
DG
2545 case 0x8: /* Caching Mode page */
2546 if (caching_pg[1] == arr[off + 1]) {
2547 memcpy(caching_pg + 2, arr + off + 2,
2548 sizeof(caching_pg) - 2);
2549 goto set_mode_changed_ua;
2550 }
2551 break;
c65b1445
DG
2552 case 0xa: /* Control Mode page */
2553 if (ctrl_m_pg[1] == arr[off + 1]) {
2554 memcpy(ctrl_m_pg + 2, arr + off + 2,
2555 sizeof(ctrl_m_pg) - 2);
9447b6ce
MP
2556 if (ctrl_m_pg[4] & 0x8)
2557 sdebug_wp = true;
2558 else
2559 sdebug_wp = false;
773642d9 2560 sdebug_dsense = !!(ctrl_m_pg[2] & 0x4);
cbf67842 2561 goto set_mode_changed_ua;
c65b1445
DG
2562 }
2563 break;
2564 case 0x1c: /* Informational Exceptions Mode page */
2565 if (iec_m_pg[1] == arr[off + 1]) {
2566 memcpy(iec_m_pg + 2, arr + off + 2,
2567 sizeof(iec_m_pg) - 2);
cbf67842 2568 goto set_mode_changed_ua;
c65b1445
DG
2569 }
2570 break;
2571 default:
2572 break;
2573 }
22017ed2 2574 mk_sense_invalid_fld(scp, SDEB_IN_DATA, off, 5);
c65b1445 2575 return check_condition_result;
cbf67842
DG
2576set_mode_changed_ua:
2577 set_bit(SDEBUG_UA_MODE_CHANGED, devip->uas_bm);
2578 return 0;
c65b1445
DG
2579}
2580
91d4c752 2581static int resp_temp_l_pg(unsigned char *arr)
c65b1445
DG
2582{
2583 unsigned char temp_l_pg[] = {0x0, 0x0, 0x3, 0x2, 0x0, 38,
2584 0x0, 0x1, 0x3, 0x2, 0x0, 65,
2585 };
2586
9a051019
DG
2587 memcpy(arr, temp_l_pg, sizeof(temp_l_pg));
2588 return sizeof(temp_l_pg);
c65b1445
DG
2589}
2590
91d4c752 2591static int resp_ie_l_pg(unsigned char *arr)
c65b1445
DG
2592{
2593 unsigned char ie_l_pg[] = {0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 38,
2594 };
2595
9a051019 2596 memcpy(arr, ie_l_pg, sizeof(ie_l_pg));
c65b1445
DG
2597 if (iec_m_pg[2] & 0x4) { /* TEST bit set */
2598 arr[4] = THRESHOLD_EXCEEDED;
2599 arr[5] = 0xff;
2600 }
9a051019 2601 return sizeof(ie_l_pg);
c65b1445
DG
2602}
2603
0790797a
DG
2604static int resp_env_rep_l_spg(unsigned char *arr)
2605{
2606 unsigned char env_rep_l_spg[] = {0x0, 0x0, 0x23, 0x8,
2607 0x0, 40, 72, 0xff, 45, 18, 0, 0,
2608 0x1, 0x0, 0x23, 0x8,
2609 0x0, 55, 72, 35, 55, 45, 0, 0,
2610 };
2611
2612 memcpy(arr, env_rep_l_spg, sizeof(env_rep_l_spg));
2613 return sizeof(env_rep_l_spg);
2614}
2615
c65b1445
DG
2616#define SDEBUG_MAX_LSENSE_SZ 512
2617
9a051019
DG
2618static int resp_log_sense(struct scsi_cmnd *scp,
2619 struct sdebug_dev_info *devip)
c65b1445 2620{
36e07d7e
GK
2621 int ppc, sp, pcode, subpcode;
2622 u32 alloc_len, len, n;
c65b1445 2623 unsigned char arr[SDEBUG_MAX_LSENSE_SZ];
01123ef4 2624 unsigned char *cmd = scp->cmnd;
c65b1445 2625
c65b1445
DG
2626 memset(arr, 0, sizeof(arr));
2627 ppc = cmd[1] & 0x2;
2628 sp = cmd[1] & 0x1;
2629 if (ppc || sp) {
22017ed2 2630 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, ppc ? 1 : 0);
c65b1445
DG
2631 return check_condition_result;
2632 }
c65b1445 2633 pcode = cmd[2] & 0x3f;
23183910 2634 subpcode = cmd[3] & 0xff;
773642d9 2635 alloc_len = get_unaligned_be16(cmd + 7);
c65b1445 2636 arr[0] = pcode;
23183910
DG
2637 if (0 == subpcode) {
2638 switch (pcode) {
2639 case 0x0: /* Supported log pages log page */
2640 n = 4;
2641 arr[n++] = 0x0; /* this page */
2642 arr[n++] = 0xd; /* Temperature */
2643 arr[n++] = 0x2f; /* Informational exceptions */
2644 arr[3] = n - 4;
2645 break;
2646 case 0xd: /* Temperature log page */
2647 arr[3] = resp_temp_l_pg(arr + 4);
2648 break;
2649 case 0x2f: /* Informational exceptions log page */
2650 arr[3] = resp_ie_l_pg(arr + 4);
2651 break;
2652 default:
22017ed2 2653 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 5);
23183910
DG
2654 return check_condition_result;
2655 }
2656 } else if (0xff == subpcode) {
2657 arr[0] |= 0x40;
2658 arr[1] = subpcode;
2659 switch (pcode) {
2660 case 0x0: /* Supported log pages and subpages log page */
2661 n = 4;
2662 arr[n++] = 0x0;
2663 arr[n++] = 0x0; /* 0,0 page */
2664 arr[n++] = 0x0;
2665 arr[n++] = 0xff; /* this page */
2666 arr[n++] = 0xd;
2667 arr[n++] = 0x0; /* Temperature */
0790797a
DG
2668 arr[n++] = 0xd;
2669 arr[n++] = 0x1; /* Environment reporting */
2670 arr[n++] = 0xd;
2671 arr[n++] = 0xff; /* all 0xd subpages */
23183910
DG
2672 arr[n++] = 0x2f;
2673 arr[n++] = 0x0; /* Informational exceptions */
0790797a
DG
2674 arr[n++] = 0x2f;
2675 arr[n++] = 0xff; /* all 0x2f subpages */
23183910
DG
2676 arr[3] = n - 4;
2677 break;
2678 case 0xd: /* Temperature subpages */
2679 n = 4;
2680 arr[n++] = 0xd;
2681 arr[n++] = 0x0; /* Temperature */
0790797a
DG
2682 arr[n++] = 0xd;
2683 arr[n++] = 0x1; /* Environment reporting */
2684 arr[n++] = 0xd;
2685 arr[n++] = 0xff; /* these subpages */
23183910
DG
2686 arr[3] = n - 4;
2687 break;
2688 case 0x2f: /* Informational exceptions subpages */
2689 n = 4;
2690 arr[n++] = 0x2f;
2691 arr[n++] = 0x0; /* Informational exceptions */
0790797a
DG
2692 arr[n++] = 0x2f;
2693 arr[n++] = 0xff; /* these subpages */
23183910
DG
2694 arr[3] = n - 4;
2695 break;
2696 default:
22017ed2 2697 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 5);
23183910
DG
2698 return check_condition_result;
2699 }
0790797a
DG
2700 } else if (subpcode > 0) {
2701 arr[0] |= 0x40;
2702 arr[1] = subpcode;
2703 if (pcode == 0xd && subpcode == 1)
2704 arr[3] = resp_env_rep_l_spg(arr + 4);
2705 else {
2706 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 5);
2707 return check_condition_result;
2708 }
23183910 2709 } else {
22017ed2 2710 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
c65b1445
DG
2711 return check_condition_result;
2712 }
36e07d7e 2713 len = min_t(u32, get_unaligned_be16(arr + 2) + 4, alloc_len);
c65b1445 2714 return fill_from_dev_buffer(scp, arr,
36e07d7e 2715 min_t(u32, len, SDEBUG_MAX_INQ_ARR_SZ));
c65b1445
DG
2716}
2717
f0d1cf93
DG
2718static inline bool sdebug_dev_is_zoned(struct sdebug_dev_info *devip)
2719{
2720 return devip->nr_zones != 0;
2721}
2722
2723static struct sdeb_zone_state *zbc_zone(struct sdebug_dev_info *devip,
2724 unsigned long long lba)
2725{
4a5fc1c6
DLM
2726 u32 zno = lba >> devip->zsize_shift;
2727 struct sdeb_zone_state *zsp;
2728
2729 if (devip->zcap == devip->zsize || zno < devip->nr_conv_zones)
2730 return &devip->zstate[zno];
2731
2732 /*
2733 * If the zone capacity is less than the zone size, adjust for gap
2734 * zones.
2735 */
2736 zno = 2 * zno - devip->nr_conv_zones;
2737 WARN_ONCE(zno >= devip->nr_zones, "%u > %u\n", zno, devip->nr_zones);
2738 zsp = &devip->zstate[zno];
2739 if (lba >= zsp->z_start + zsp->z_size)
2740 zsp++;
2741 WARN_ON_ONCE(lba >= zsp->z_start + zsp->z_size);
2742 return zsp;
f0d1cf93
DG
2743}
2744
2745static inline bool zbc_zone_is_conv(struct sdeb_zone_state *zsp)
2746{
35dbe2b9 2747 return zsp->z_type == ZBC_ZTYPE_CNV;
f0d1cf93
DG
2748}
2749
4a5fc1c6
DLM
2750static inline bool zbc_zone_is_gap(struct sdeb_zone_state *zsp)
2751{
2752 return zsp->z_type == ZBC_ZTYPE_GAP;
2753}
2754
2755static inline bool zbc_zone_is_seq(struct sdeb_zone_state *zsp)
2756{
2757 return !zbc_zone_is_conv(zsp) && !zbc_zone_is_gap(zsp);
2758}
2759
f0d1cf93
DG
2760static void zbc_close_zone(struct sdebug_dev_info *devip,
2761 struct sdeb_zone_state *zsp)
2762{
2763 enum sdebug_z_cond zc;
2764
4a5fc1c6 2765 if (!zbc_zone_is_seq(zsp))
f0d1cf93
DG
2766 return;
2767
2768 zc = zsp->z_cond;
2769 if (!(zc == ZC2_IMPLICIT_OPEN || zc == ZC3_EXPLICIT_OPEN))
2770 return;
2771
2772 if (zc == ZC2_IMPLICIT_OPEN)
2773 devip->nr_imp_open--;
2774 else
2775 devip->nr_exp_open--;
2776
2777 if (zsp->z_wp == zsp->z_start) {
2778 zsp->z_cond = ZC1_EMPTY;
2779 } else {
2780 zsp->z_cond = ZC4_CLOSED;
2781 devip->nr_closed++;
2782 }
2783}
2784
2785static void zbc_close_imp_open_zone(struct sdebug_dev_info *devip)
2786{
2787 struct sdeb_zone_state *zsp = &devip->zstate[0];
2788 unsigned int i;
2789
2790 for (i = 0; i < devip->nr_zones; i++, zsp++) {
2791 if (zsp->z_cond == ZC2_IMPLICIT_OPEN) {
2792 zbc_close_zone(devip, zsp);
2793 return;
2794 }
2795 }
2796}
2797
2798static void zbc_open_zone(struct sdebug_dev_info *devip,
2799 struct sdeb_zone_state *zsp, bool explicit)
2800{
2801 enum sdebug_z_cond zc;
2802
4a5fc1c6 2803 if (!zbc_zone_is_seq(zsp))
f0d1cf93
DG
2804 return;
2805
2806 zc = zsp->z_cond;
2807 if ((explicit && zc == ZC3_EXPLICIT_OPEN) ||
2808 (!explicit && zc == ZC2_IMPLICIT_OPEN))
2809 return;
2810
2811 /* Close an implicit open zone if necessary */
2812 if (explicit && zsp->z_cond == ZC2_IMPLICIT_OPEN)
2813 zbc_close_zone(devip, zsp);
2814 else if (devip->max_open &&
2815 devip->nr_imp_open + devip->nr_exp_open >= devip->max_open)
2816 zbc_close_imp_open_zone(devip);
2817
2818 if (zsp->z_cond == ZC4_CLOSED)
2819 devip->nr_closed--;
2820 if (explicit) {
2821 zsp->z_cond = ZC3_EXPLICIT_OPEN;
2822 devip->nr_exp_open++;
2823 } else {
2824 zsp->z_cond = ZC2_IMPLICIT_OPEN;
2825 devip->nr_imp_open++;
2826 }
2827}
2828
566d3c57
DLM
2829static inline void zbc_set_zone_full(struct sdebug_dev_info *devip,
2830 struct sdeb_zone_state *zsp)
2831{
2832 switch (zsp->z_cond) {
2833 case ZC2_IMPLICIT_OPEN:
2834 devip->nr_imp_open--;
2835 break;
2836 case ZC3_EXPLICIT_OPEN:
2837 devip->nr_exp_open--;
2838 break;
2839 default:
2840 WARN_ONCE(true, "Invalid zone %llu condition %x\n",
2841 zsp->z_start, zsp->z_cond);
2842 break;
2843 }
2844 zsp->z_cond = ZC5_FULL;
2845}
2846
f0d1cf93
DG
2847static void zbc_inc_wp(struct sdebug_dev_info *devip,
2848 unsigned long long lba, unsigned int num)
2849{
2850 struct sdeb_zone_state *zsp = zbc_zone(devip, lba);
64e14ece 2851 unsigned long long n, end, zend = zsp->z_start + zsp->z_size;
f0d1cf93 2852
4a5fc1c6 2853 if (!zbc_zone_is_seq(zsp))
f0d1cf93
DG
2854 return;
2855
35dbe2b9 2856 if (zsp->z_type == ZBC_ZTYPE_SWR) {
64e14ece
DLM
2857 zsp->z_wp += num;
2858 if (zsp->z_wp >= zend)
566d3c57 2859 zbc_set_zone_full(devip, zsp);
64e14ece
DLM
2860 return;
2861 }
2862
2863 while (num) {
2864 if (lba != zsp->z_wp)
2865 zsp->z_non_seq_resource = true;
2866
2867 end = lba + num;
2868 if (end >= zend) {
2869 n = zend - lba;
2870 zsp->z_wp = zend;
2871 } else if (end > zsp->z_wp) {
2872 n = num;
2873 zsp->z_wp = end;
2874 } else {
2875 n = num;
2876 }
2877 if (zsp->z_wp >= zend)
566d3c57 2878 zbc_set_zone_full(devip, zsp);
64e14ece
DLM
2879
2880 num -= n;
2881 lba += n;
2882 if (num) {
2883 zsp++;
2884 zend = zsp->z_start + zsp->z_size;
2885 }
2886 }
f0d1cf93
DG
2887}
2888
2889static int check_zbc_access_params(struct scsi_cmnd *scp,
2890 unsigned long long lba, unsigned int num, bool write)
2891{
2892 struct scsi_device *sdp = scp->device;
2893 struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata;
2894 struct sdeb_zone_state *zsp = zbc_zone(devip, lba);
2895 struct sdeb_zone_state *zsp_end = zbc_zone(devip, lba + num - 1);
2896
2897 if (!write) {
64e14ece
DLM
2898 if (devip->zmodel == BLK_ZONED_HA)
2899 return 0;
2900 /* For host-managed, reads cannot cross zone types boundaries */
4a5fc1c6 2901 if (zsp->z_type != zsp_end->z_type) {
f0d1cf93
DG
2902 mk_sense_buffer(scp, ILLEGAL_REQUEST,
2903 LBA_OUT_OF_RANGE,
2904 READ_INVDATA_ASCQ);
2905 return check_condition_result;
2906 }
2907 return 0;
2908 }
2909
4a5fc1c6
DLM
2910 /* Writing into a gap zone is not allowed */
2911 if (zbc_zone_is_gap(zsp)) {
2912 mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE,
2913 ATTEMPT_ACCESS_GAP);
2914 return check_condition_result;
2915 }
2916
f0d1cf93
DG
2917 /* No restrictions for writes within conventional zones */
2918 if (zbc_zone_is_conv(zsp)) {
2919 if (!zbc_zone_is_conv(zsp_end)) {
2920 mk_sense_buffer(scp, ILLEGAL_REQUEST,
2921 LBA_OUT_OF_RANGE,
2922 WRITE_BOUNDARY_ASCQ);
2923 return check_condition_result;
2924 }
2925 return 0;
2926 }
2927
35dbe2b9 2928 if (zsp->z_type == ZBC_ZTYPE_SWR) {
64e14ece
DLM
2929 /* Writes cannot cross sequential zone boundaries */
2930 if (zsp_end != zsp) {
2931 mk_sense_buffer(scp, ILLEGAL_REQUEST,
2932 LBA_OUT_OF_RANGE,
2933 WRITE_BOUNDARY_ASCQ);
2934 return check_condition_result;
2935 }
2936 /* Cannot write full zones */
2937 if (zsp->z_cond == ZC5_FULL) {
2938 mk_sense_buffer(scp, ILLEGAL_REQUEST,
2939 INVALID_FIELD_IN_CDB, 0);
2940 return check_condition_result;
2941 }
2942 /* Writes must be aligned to the zone WP */
2943 if (lba != zsp->z_wp) {
2944 mk_sense_buffer(scp, ILLEGAL_REQUEST,
2945 LBA_OUT_OF_RANGE,
2946 UNALIGNED_WRITE_ASCQ);
2947 return check_condition_result;
2948 }
f0d1cf93
DG
2949 }
2950
2951 /* Handle implicit open of closed and empty zones */
2952 if (zsp->z_cond == ZC1_EMPTY || zsp->z_cond == ZC4_CLOSED) {
2953 if (devip->max_open &&
2954 devip->nr_exp_open >= devip->max_open) {
2955 mk_sense_buffer(scp, DATA_PROTECT,
2956 INSUFF_RES_ASC,
2957 INSUFF_ZONE_ASCQ);
2958 return check_condition_result;
2959 }
2960 zbc_open_zone(devip, zsp, false);
2961 }
2962
2963 return 0;
2964}
2965
2966static inline int check_device_access_params
2967 (struct scsi_cmnd *scp, unsigned long long lba,
2968 unsigned int num, bool write)
1da177e4 2969{
f0d1cf93
DG
2970 struct scsi_device *sdp = scp->device;
2971 struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata;
2972
c65b1445 2973 if (lba + num > sdebug_capacity) {
22017ed2 2974 mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
1da177e4
LT
2975 return check_condition_result;
2976 }
c65b1445
DG
2977 /* transfer length excessive (tie in to block limits VPD page) */
2978 if (num > sdebug_store_sectors) {
22017ed2 2979 /* needs work to find which cdb byte 'num' comes from */
cbf67842 2980 mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
c65b1445
DG
2981 return check_condition_result;
2982 }
9447b6ce
MP
2983 if (write && unlikely(sdebug_wp)) {
2984 mk_sense_buffer(scp, DATA_PROTECT, WRITE_PROTECTED, 0x2);
2985 return check_condition_result;
2986 }
f0d1cf93
DG
2987 if (sdebug_dev_is_zoned(devip))
2988 return check_zbc_access_params(scp, lba, num, write);
2989
19789100
FT
2990 return 0;
2991}
2992
b6ff8ca7
DG
2993/*
2994 * Note: if BUG_ON() fires it usually indicates a problem with the parser
2995 * tables. Perhaps a missing F_FAKE_RW or FF_MEDIA_IO flag. Response functions
2996 * that access any of the "stores" in struct sdeb_store_info should call this
2997 * function with bug_if_fake_rw set to true.
2998 */
2999static inline struct sdeb_store_info *devip2sip(struct sdebug_dev_info *devip,
3000 bool bug_if_fake_rw)
87c715dc 3001{
b6ff8ca7
DG
3002 if (sdebug_fake_rw) {
3003 BUG_ON(bug_if_fake_rw); /* See note above */
3004 return NULL;
3005 }
3006 return xa_load(per_store_ap, devip->sdbg_host->si_idx);
87c715dc
DG
3007}
3008
a4517511 3009/* Returns number of bytes copied or -1 if error. */
87c715dc
DG
3010static int do_device_access(struct sdeb_store_info *sip, struct scsi_cmnd *scp,
3011 u32 sg_skip, u64 lba, u32 num, bool do_write)
19789100
FT
3012{
3013 int ret;
c2248fc9 3014 u64 block, rest = 0;
a4517511 3015 enum dma_data_direction dir;
87c715dc
DG
3016 struct scsi_data_buffer *sdb = &scp->sdb;
3017 u8 *fsp;
a4517511 3018
c2248fc9 3019 if (do_write) {
a4517511 3020 dir = DMA_TO_DEVICE;
4f2c8bf6 3021 write_since_sync = true;
a4517511 3022 } else {
a4517511 3023 dir = DMA_FROM_DEVICE;
a4517511 3024 }
19789100 3025
87c715dc 3026 if (!sdb->length || !sip)
a4517511 3027 return 0;
87c715dc 3028 if (scp->sc_data_direction != dir)
a4517511 3029 return -1;
87c715dc 3030 fsp = sip->storep;
19789100
FT
3031
3032 block = do_div(lba, sdebug_store_sectors);
3033 if (block + num > sdebug_store_sectors)
3034 rest = block + num - sdebug_store_sectors;
3035
386ecb12 3036 ret = sg_copy_buffer(sdb->table.sgl, sdb->table.nents,
87c715dc 3037 fsp + (block * sdebug_sector_size),
0a7e69c7 3038 (num - rest) * sdebug_sector_size, sg_skip, do_write);
773642d9 3039 if (ret != (num - rest) * sdebug_sector_size)
a4517511
AM
3040 return ret;
3041
3042 if (rest) {
386ecb12 3043 ret += sg_copy_buffer(sdb->table.sgl, sdb->table.nents,
87c715dc 3044 fsp, rest * sdebug_sector_size,
0a7e69c7
DG
3045 sg_skip + ((num - rest) * sdebug_sector_size),
3046 do_write);
a4517511 3047 }
19789100
FT
3048
3049 return ret;
3050}
3051
87c715dc
DG
3052/* Returns number of bytes copied or -1 if error. */
3053static int do_dout_fetch(struct scsi_cmnd *scp, u32 num, u8 *doutp)
3054{
3055 struct scsi_data_buffer *sdb = &scp->sdb;
3056
3057 if (!sdb->length)
3058 return 0;
3059 if (scp->sc_data_direction != DMA_TO_DEVICE)
3060 return -1;
3061 return sg_copy_buffer(sdb->table.sgl, sdb->table.nents, doutp,
3062 num * sdebug_sector_size, 0, true);
3063}
3064
3065/* If sip->storep+lba compares equal to arr(num), then copy top half of
3066 * arr into sip->storep+lba and return true. If comparison fails then
38d5c833 3067 * return false. */
87c715dc 3068static bool comp_write_worker(struct sdeb_store_info *sip, u64 lba, u32 num,
c3e2fe92 3069 const u8 *arr, bool compare_only)
38d5c833
DG
3070{
3071 bool res;
3072 u64 block, rest = 0;
3073 u32 store_blks = sdebug_store_sectors;
773642d9 3074 u32 lb_size = sdebug_sector_size;
87c715dc 3075 u8 *fsp = sip->storep;
38d5c833
DG
3076
3077 block = do_div(lba, store_blks);
3078 if (block + num > store_blks)
3079 rest = block + num - store_blks;
3080
87c715dc 3081 res = !memcmp(fsp + (block * lb_size), arr, (num - rest) * lb_size);
38d5c833
DG
3082 if (!res)
3083 return res;
3084 if (rest)
87c715dc 3085 res = memcmp(fsp, arr + ((num - rest) * lb_size),
38d5c833
DG
3086 rest * lb_size);
3087 if (!res)
3088 return res;
c3e2fe92
DG
3089 if (compare_only)
3090 return true;
38d5c833 3091 arr += num * lb_size;
87c715dc 3092 memcpy(fsp + (block * lb_size), arr, (num - rest) * lb_size);
38d5c833 3093 if (rest)
87c715dc 3094 memcpy(fsp, arr + ((num - rest) * lb_size), rest * lb_size);
38d5c833
DG
3095 return res;
3096}
3097
51d648af 3098static __be16 dif_compute_csum(const void *buf, int len)
beb40ea4 3099{
51d648af 3100 __be16 csum;
beb40ea4 3101
773642d9 3102 if (sdebug_guard)
51d648af
AM
3103 csum = (__force __be16)ip_compute_csum(buf, len);
3104 else
beb40ea4 3105 csum = cpu_to_be16(crc_t10dif(buf, len));
51d648af 3106
beb40ea4
AM
3107 return csum;
3108}
3109
6ebf105c 3110static int dif_verify(struct t10_pi_tuple *sdt, const void *data,
beb40ea4
AM
3111 sector_t sector, u32 ei_lba)
3112{
773642d9 3113 __be16 csum = dif_compute_csum(data, sdebug_sector_size);
beb40ea4
AM
3114
3115 if (sdt->guard_tag != csum) {
c1287970 3116 pr_err("GUARD check failed on sector %lu rcvd 0x%04x, data 0x%04x\n",
beb40ea4
AM
3117 (unsigned long)sector,
3118 be16_to_cpu(sdt->guard_tag),
3119 be16_to_cpu(csum));
3120 return 0x01;
3121 }
8475c811 3122 if (sdebug_dif == T10_PI_TYPE1_PROTECTION &&
beb40ea4 3123 be32_to_cpu(sdt->ref_tag) != (sector & 0xffffffff)) {
c1287970
TW
3124 pr_err("REF check failed on sector %lu\n",
3125 (unsigned long)sector);
beb40ea4
AM
3126 return 0x03;
3127 }
8475c811 3128 if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
beb40ea4 3129 be32_to_cpu(sdt->ref_tag) != ei_lba) {
c1287970
TW
3130 pr_err("REF check failed on sector %lu\n",
3131 (unsigned long)sector);
beb40ea4
AM
3132 return 0x03;
3133 }
3134 return 0;
3135}
3136
87c715dc 3137static void dif_copy_prot(struct scsi_cmnd *scp, sector_t sector,
65f72f2a 3138 unsigned int sectors, bool read)
c6a44287 3139{
be4e11be 3140 size_t resid;
c6a44287 3141 void *paddr;
87c715dc 3142 struct sdeb_store_info *sip = devip2sip((struct sdebug_dev_info *)
b6ff8ca7 3143 scp->device->hostdata, true);
87c715dc 3144 struct t10_pi_tuple *dif_storep = sip->dif_storep;
14faa944 3145 const void *dif_store_end = dif_storep + sdebug_store_sectors;
be4e11be 3146 struct sg_mapping_iter miter;
c6a44287 3147
e18d8bea
AM
3148 /* Bytes of protection data to copy into sgl */
3149 resid = sectors * sizeof(*dif_storep);
c6a44287 3150
87c715dc
DG
3151 sg_miter_start(&miter, scsi_prot_sglist(scp),
3152 scsi_prot_sg_count(scp), SG_MITER_ATOMIC |
3153 (read ? SG_MITER_TO_SG : SG_MITER_FROM_SG));
be4e11be
AM
3154
3155 while (sg_miter_next(&miter) && resid > 0) {
87c715dc
DG
3156 size_t len = min_t(size_t, miter.length, resid);
3157 void *start = dif_store(sip, sector);
be4e11be 3158 size_t rest = 0;
14faa944
AM
3159
3160 if (dif_store_end < start + len)
3161 rest = start + len - dif_store_end;
c6a44287 3162
be4e11be 3163 paddr = miter.addr;
14faa944 3164
65f72f2a
AM
3165 if (read)
3166 memcpy(paddr, start, len - rest);
3167 else
3168 memcpy(start, paddr, len - rest);
3169
3170 if (rest) {
3171 if (read)
3172 memcpy(paddr + len - rest, dif_storep, rest);
3173 else
3174 memcpy(dif_storep, paddr + len - rest, rest);
3175 }
c6a44287 3176
e18d8bea 3177 sector += len / sizeof(*dif_storep);
c6a44287 3178 resid -= len;
c6a44287 3179 }
be4e11be 3180 sg_miter_stop(&miter);
bb8c063c
AM
3181}
3182
87c715dc 3183static int prot_verify_read(struct scsi_cmnd *scp, sector_t start_sec,
bb8c063c
AM
3184 unsigned int sectors, u32 ei_lba)
3185{
f7be6772 3186 int ret = 0;
bb8c063c 3187 unsigned int i;
bb8c063c 3188 sector_t sector;
87c715dc 3189 struct sdeb_store_info *sip = devip2sip((struct sdebug_dev_info *)
b6ff8ca7 3190 scp->device->hostdata, true);
87c715dc 3191 struct t10_pi_tuple *sdt;
bb8c063c 3192
c45eabec 3193 for (i = 0; i < sectors; i++, ei_lba++) {
bb8c063c 3194 sector = start_sec + i;
87c715dc 3195 sdt = dif_store(sip, sector);
bb8c063c 3196
51d648af 3197 if (sdt->app_tag == cpu_to_be16(0xffff))
bb8c063c
AM
3198 continue;
3199
f7be6772
MP
3200 /*
3201 * Because scsi_debug acts as both initiator and
3202 * target we proceed to verify the PI even if
3203 * RDPROTECT=3. This is done so the "initiator" knows
3204 * which type of error to return. Otherwise we would
3205 * have to iterate over the PI twice.
3206 */
3207 if (scp->cmnd[1] >> 5) { /* RDPROTECT */
3208 ret = dif_verify(sdt, lba2fake_store(sip, sector),
3209 sector, ei_lba);
3210 if (ret) {
3211 dif_errors++;
3212 break;
3213 }
bb8c063c 3214 }
bb8c063c 3215 }
c6a44287 3216
87c715dc 3217 dif_copy_prot(scp, start_sec, sectors, true);
c6a44287
MP
3218 dix_reads++;
3219
f7be6772 3220 return ret;
c6a44287
MP
3221}
3222
7109f370
DG
3223static inline void
3224sdeb_read_lock(struct sdeb_store_info *sip)
3225{
e9c47801
DLM
3226 if (sdebug_no_rwlock) {
3227 if (sip)
3228 __acquire(&sip->macc_lck);
3229 else
3230 __acquire(&sdeb_fake_rw_lck);
3231 } else {
3232 if (sip)
3233 read_lock(&sip->macc_lck);
3234 else
3235 read_lock(&sdeb_fake_rw_lck);
3236 }
7109f370
DG
3237}
3238
3239static inline void
3240sdeb_read_unlock(struct sdeb_store_info *sip)
3241{
e9c47801
DLM
3242 if (sdebug_no_rwlock) {
3243 if (sip)
3244 __release(&sip->macc_lck);
3245 else
3246 __release(&sdeb_fake_rw_lck);
3247 } else {
3248 if (sip)
3249 read_unlock(&sip->macc_lck);
3250 else
3251 read_unlock(&sdeb_fake_rw_lck);
3252 }
7109f370
DG
3253}
3254
3255static inline void
3256sdeb_write_lock(struct sdeb_store_info *sip)
3257{
e9c47801
DLM
3258 if (sdebug_no_rwlock) {
3259 if (sip)
3260 __acquire(&sip->macc_lck);
3261 else
3262 __acquire(&sdeb_fake_rw_lck);
3263 } else {
3264 if (sip)
3265 write_lock(&sip->macc_lck);
3266 else
3267 write_lock(&sdeb_fake_rw_lck);
3268 }
7109f370
DG
3269}
3270
3271static inline void
3272sdeb_write_unlock(struct sdeb_store_info *sip)
3273{
e9c47801
DLM
3274 if (sdebug_no_rwlock) {
3275 if (sip)
3276 __release(&sip->macc_lck);
3277 else
3278 __release(&sdeb_fake_rw_lck);
3279 } else {
3280 if (sip)
3281 write_unlock(&sip->macc_lck);
3282 else
3283 write_unlock(&sdeb_fake_rw_lck);
3284 }
7109f370
DG
3285}
3286
fd32119b 3287static int resp_read_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
19789100 3288{
87c715dc 3289 bool check_prot;
c2248fc9
DG
3290 u32 num;
3291 u32 ei_lba;
19789100 3292 int ret;
87c715dc 3293 u64 lba;
b6ff8ca7 3294 struct sdeb_store_info *sip = devip2sip(devip, true);
87c715dc 3295 u8 *cmd = scp->cmnd;
19789100 3296
c2248fc9
DG
3297 switch (cmd[0]) {
3298 case READ_16:
3299 ei_lba = 0;
3300 lba = get_unaligned_be64(cmd + 2);
3301 num = get_unaligned_be32(cmd + 10);
3302 check_prot = true;
3303 break;
3304 case READ_10:
3305 ei_lba = 0;
3306 lba = get_unaligned_be32(cmd + 2);
3307 num = get_unaligned_be16(cmd + 7);
3308 check_prot = true;
3309 break;
3310 case READ_6:
3311 ei_lba = 0;
3312 lba = (u32)cmd[3] | (u32)cmd[2] << 8 |
3313 (u32)(cmd[1] & 0x1f) << 16;
3314 num = (0 == cmd[4]) ? 256 : cmd[4];
3315 check_prot = true;
3316 break;
3317 case READ_12:
3318 ei_lba = 0;
3319 lba = get_unaligned_be32(cmd + 2);
3320 num = get_unaligned_be32(cmd + 6);
3321 check_prot = true;
3322 break;
3323 case XDWRITEREAD_10:
3324 ei_lba = 0;
3325 lba = get_unaligned_be32(cmd + 2);
3326 num = get_unaligned_be16(cmd + 7);
3327 check_prot = false;
3328 break;
3329 default: /* assume READ(32) */
3330 lba = get_unaligned_be64(cmd + 12);
3331 ei_lba = get_unaligned_be32(cmd + 20);
3332 num = get_unaligned_be32(cmd + 28);
3333 check_prot = false;
3334 break;
3335 }
f46eb0e9 3336 if (unlikely(have_dif_prot && check_prot)) {
8475c811 3337 if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
c2248fc9
DG
3338 (cmd[1] & 0xe0)) {
3339 mk_sense_invalid_opcode(scp);
3340 return check_condition_result;
3341 }
8475c811
CH
3342 if ((sdebug_dif == T10_PI_TYPE1_PROTECTION ||
3343 sdebug_dif == T10_PI_TYPE3_PROTECTION) &&
c2248fc9
DG
3344 (cmd[1] & 0xe0) == 0)
3345 sdev_printk(KERN_ERR, scp->device, "Unprotected RD "
3346 "to DIF device\n");
3347 }
3a90a63d
DG
3348 if (unlikely((sdebug_opts & SDEBUG_OPT_SHORT_TRANSFER) &&
3349 atomic_read(&sdeb_inject_pending))) {
3350 num /= 2;
3351 atomic_set(&sdeb_inject_pending, 0);
3352 }
c2248fc9 3353
9447b6ce
MP
3354 ret = check_device_access_params(scp, lba, num, false);
3355 if (ret)
3356 return ret;
f46eb0e9 3357 if (unlikely((SDEBUG_OPT_MEDIUM_ERR & sdebug_opts) &&
d9da891a
LO
3358 (lba <= (sdebug_medium_error_start + sdebug_medium_error_count - 1)) &&
3359 ((lba + num) > sdebug_medium_error_start))) {
c65b1445 3360 /* claim unrecoverable read error */
c2248fc9 3361 mk_sense_buffer(scp, MEDIUM_ERROR, UNRECOVERED_READ_ERR, 0);
c65b1445 3362 /* set info field and valid bit for fixed descriptor */
c2248fc9
DG
3363 if (0x70 == (scp->sense_buffer[0] & 0x7f)) {
3364 scp->sense_buffer[0] |= 0x80; /* Valid bit */
32f7ef73
DG
3365 ret = (lba < OPT_MEDIUM_ERR_ADDR)
3366 ? OPT_MEDIUM_ERR_ADDR : (int)lba;
c2248fc9 3367 put_unaligned_be32(ret, scp->sense_buffer + 3);
c65b1445 3368 }
c2248fc9 3369 scsi_set_resid(scp, scsi_bufflen(scp));
1da177e4
LT
3370 return check_condition_result;
3371 }
c6a44287 3372
7109f370 3373 sdeb_read_lock(sip);
6c78cc06 3374
c6a44287 3375 /* DIX + T10 DIF */
f46eb0e9 3376 if (unlikely(sdebug_dix && scsi_prot_sg_count(scp))) {
f7be6772
MP
3377 switch (prot_verify_read(scp, lba, num, ei_lba)) {
3378 case 1: /* Guard tag error */
3379 if (cmd[1] >> 5 != 3) { /* RDPROTECT != 3 */
7109f370 3380 sdeb_read_unlock(sip);
f7be6772
MP
3381 mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 1);
3382 return check_condition_result;
3383 } else if (scp->prot_flags & SCSI_PROT_GUARD_CHECK) {
7109f370 3384 sdeb_read_unlock(sip);
f7be6772
MP
3385 mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 1);
3386 return illegal_condition_result;
3387 }
3388 break;
3389 case 3: /* Reference tag error */
3390 if (cmd[1] >> 5 != 3) { /* RDPROTECT != 3 */
7109f370 3391 sdeb_read_unlock(sip);
f7be6772
MP
3392 mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 3);
3393 return check_condition_result;
3394 } else if (scp->prot_flags & SCSI_PROT_REF_CHECK) {
7109f370 3395 sdeb_read_unlock(sip);
f7be6772
MP
3396 mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 3);
3397 return illegal_condition_result;
3398 }
3399 break;
c6a44287
MP
3400 }
3401 }
3402
87c715dc 3403 ret = do_device_access(sip, scp, 0, lba, num, false);
7109f370 3404 sdeb_read_unlock(sip);
f46eb0e9 3405 if (unlikely(ret == -1))
a4517511
AM
3406 return DID_ERROR << 16;
3407
42d387be 3408 scsi_set_resid(scp, scsi_bufflen(scp) - ret);
a4517511 3409
3a90a63d
DG
3410 if (unlikely((sdebug_opts & SDEBUG_OPT_RECOV_DIF_DIX) &&
3411 atomic_read(&sdeb_inject_pending))) {
3412 if (sdebug_opts & SDEBUG_OPT_RECOVERED_ERR) {
3413 mk_sense_buffer(scp, RECOVERED_ERROR, THRESHOLD_EXCEEDED, 0);
3414 atomic_set(&sdeb_inject_pending, 0);
c2248fc9 3415 return check_condition_result;
3a90a63d 3416 } else if (sdebug_opts & SDEBUG_OPT_DIF_ERR) {
c2248fc9
DG
3417 /* Logical block guard check failed */
3418 mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 1);
3a90a63d 3419 atomic_set(&sdeb_inject_pending, 0);
c2248fc9 3420 return illegal_condition_result;
3a90a63d 3421 } else if (SDEBUG_OPT_DIX_ERR & sdebug_opts) {
c2248fc9 3422 mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 1);
3a90a63d 3423 atomic_set(&sdeb_inject_pending, 0);
c2248fc9
DG
3424 return illegal_condition_result;
3425 }
3426 }
a4517511 3427 return 0;
1da177e4
LT
3428}
3429
c6a44287 3430static int prot_verify_write(struct scsi_cmnd *SCpnt, sector_t start_sec,
395cef03 3431 unsigned int sectors, u32 ei_lba)
c6a44287 3432{
be4e11be 3433 int ret;
6ebf105c 3434 struct t10_pi_tuple *sdt;
be4e11be 3435 void *daddr;
65f72f2a 3436 sector_t sector = start_sec;
c6a44287 3437 int ppage_offset;
be4e11be
AM
3438 int dpage_offset;
3439 struct sg_mapping_iter diter;
3440 struct sg_mapping_iter piter;
c6a44287 3441
c6a44287
MP
3442 BUG_ON(scsi_sg_count(SCpnt) == 0);
3443 BUG_ON(scsi_prot_sg_count(SCpnt) == 0);
3444
be4e11be
AM
3445 sg_miter_start(&piter, scsi_prot_sglist(SCpnt),
3446 scsi_prot_sg_count(SCpnt),
3447 SG_MITER_ATOMIC | SG_MITER_FROM_SG);
3448 sg_miter_start(&diter, scsi_sglist(SCpnt), scsi_sg_count(SCpnt),
3449 SG_MITER_ATOMIC | SG_MITER_FROM_SG);
3450
3451 /* For each protection page */
3452 while (sg_miter_next(&piter)) {
3453 dpage_offset = 0;
3454 if (WARN_ON(!sg_miter_next(&diter))) {
3455 ret = 0x01;
3456 goto out;
3457 }
c6a44287 3458
be4e11be 3459 for (ppage_offset = 0; ppage_offset < piter.length;
6ebf105c 3460 ppage_offset += sizeof(struct t10_pi_tuple)) {
c6a44287 3461 /* If we're at the end of the current
be4e11be 3462 * data page advance to the next one
c6a44287 3463 */
be4e11be
AM
3464 if (dpage_offset >= diter.length) {
3465 if (WARN_ON(!sg_miter_next(&diter))) {
3466 ret = 0x01;
3467 goto out;
3468 }
3469 dpage_offset = 0;
c6a44287
MP
3470 }
3471
be4e11be
AM
3472 sdt = piter.addr + ppage_offset;
3473 daddr = diter.addr + dpage_offset;
c6a44287 3474
f7be6772
MP
3475 if (SCpnt->cmnd[1] >> 5 != 3) { /* WRPROTECT */
3476 ret = dif_verify(sdt, daddr, sector, ei_lba);
3477 if (ret)
3478 goto out;
395cef03
MP
3479 }
3480
c6a44287 3481 sector++;
395cef03 3482 ei_lba++;
773642d9 3483 dpage_offset += sdebug_sector_size;
c6a44287 3484 }
be4e11be
AM
3485 diter.consumed = dpage_offset;
3486 sg_miter_stop(&diter);
c6a44287 3487 }
be4e11be 3488 sg_miter_stop(&piter);
c6a44287 3489
65f72f2a 3490 dif_copy_prot(SCpnt, start_sec, sectors, false);
c6a44287
MP
3491 dix_writes++;
3492
3493 return 0;
3494
3495out:
3496 dif_errors++;
be4e11be
AM
3497 sg_miter_stop(&diter);
3498 sg_miter_stop(&piter);
c6a44287
MP
3499 return ret;
3500}
3501
b90ebc3d
AM
3502static unsigned long lba_to_map_index(sector_t lba)
3503{
773642d9
DG
3504 if (sdebug_unmap_alignment)
3505 lba += sdebug_unmap_granularity - sdebug_unmap_alignment;
3506 sector_div(lba, sdebug_unmap_granularity);
b90ebc3d
AM
3507 return lba;
3508}
3509
3510static sector_t map_index_to_lba(unsigned long index)
44d92694 3511{
773642d9 3512 sector_t lba = index * sdebug_unmap_granularity;
a027b5b9 3513
773642d9
DG
3514 if (sdebug_unmap_alignment)
3515 lba -= sdebug_unmap_granularity - sdebug_unmap_alignment;
a027b5b9 3516 return lba;
b90ebc3d 3517}
44d92694 3518
87c715dc
DG
3519static unsigned int map_state(struct sdeb_store_info *sip, sector_t lba,
3520 unsigned int *num)
b90ebc3d
AM
3521{
3522 sector_t end;
3523 unsigned int mapped;
3524 unsigned long index;
3525 unsigned long next;
44d92694 3526
b90ebc3d 3527 index = lba_to_map_index(lba);
87c715dc 3528 mapped = test_bit(index, sip->map_storep);
44d92694
MP
3529
3530 if (mapped)
87c715dc 3531 next = find_next_zero_bit(sip->map_storep, map_size, index);
44d92694 3532 else
87c715dc 3533 next = find_next_bit(sip->map_storep, map_size, index);
44d92694 3534
b90ebc3d 3535 end = min_t(sector_t, sdebug_store_sectors, map_index_to_lba(next));
44d92694 3536 *num = end - lba;
44d92694
MP
3537 return mapped;
3538}
3539
87c715dc
DG
3540static void map_region(struct sdeb_store_info *sip, sector_t lba,
3541 unsigned int len)
44d92694 3542{
44d92694
MP
3543 sector_t end = lba + len;
3544
44d92694 3545 while (lba < end) {
b90ebc3d 3546 unsigned long index = lba_to_map_index(lba);
44d92694 3547
b90ebc3d 3548 if (index < map_size)
87c715dc 3549 set_bit(index, sip->map_storep);
44d92694 3550
b90ebc3d 3551 lba = map_index_to_lba(index + 1);
44d92694
MP
3552 }
3553}
3554
87c715dc
DG
3555static void unmap_region(struct sdeb_store_info *sip, sector_t lba,
3556 unsigned int len)
44d92694 3557{
44d92694 3558 sector_t end = lba + len;
87c715dc 3559 u8 *fsp = sip->storep;
44d92694 3560
44d92694 3561 while (lba < end) {
b90ebc3d 3562 unsigned long index = lba_to_map_index(lba);
44d92694 3563
b90ebc3d 3564 if (lba == map_index_to_lba(index) &&
773642d9 3565 lba + sdebug_unmap_granularity <= end &&
b90ebc3d 3566 index < map_size) {
87c715dc 3567 clear_bit(index, sip->map_storep);
760f3b03 3568 if (sdebug_lbprz) { /* for LBPRZ=2 return 0xff_s */
87c715dc 3569 memset(fsp + lba * sdebug_sector_size,
760f3b03 3570 (sdebug_lbprz & 1) ? 0 : 0xff,
773642d9
DG
3571 sdebug_sector_size *
3572 sdebug_unmap_granularity);
b90ebc3d 3573 }
87c715dc
DG
3574 if (sip->dif_storep) {
3575 memset(sip->dif_storep + lba, 0xff,
3576 sizeof(*sip->dif_storep) *
773642d9 3577 sdebug_unmap_granularity);
e9926b43 3578 }
be1dd78d 3579 }
b90ebc3d 3580 lba = map_index_to_lba(index + 1);
44d92694
MP
3581 }
3582}
3583
fd32119b 3584static int resp_write_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
1da177e4 3585{
87c715dc 3586 bool check_prot;
c2248fc9
DG
3587 u32 num;
3588 u32 ei_lba;
19789100 3589 int ret;
87c715dc 3590 u64 lba;
b6ff8ca7 3591 struct sdeb_store_info *sip = devip2sip(devip, true);
87c715dc 3592 u8 *cmd = scp->cmnd;
1da177e4 3593
c2248fc9
DG
3594 switch (cmd[0]) {
3595 case WRITE_16:
3596 ei_lba = 0;
3597 lba = get_unaligned_be64(cmd + 2);
3598 num = get_unaligned_be32(cmd + 10);
3599 check_prot = true;
3600 break;
3601 case WRITE_10:
3602 ei_lba = 0;
3603 lba = get_unaligned_be32(cmd + 2);
3604 num = get_unaligned_be16(cmd + 7);
3605 check_prot = true;
3606 break;
3607 case WRITE_6:
3608 ei_lba = 0;
3609 lba = (u32)cmd[3] | (u32)cmd[2] << 8 |
3610 (u32)(cmd[1] & 0x1f) << 16;
3611 num = (0 == cmd[4]) ? 256 : cmd[4];
3612 check_prot = true;
3613 break;
3614 case WRITE_12:
3615 ei_lba = 0;
3616 lba = get_unaligned_be32(cmd + 2);
3617 num = get_unaligned_be32(cmd + 6);
3618 check_prot = true;
3619 break;
3620 case 0x53: /* XDWRITEREAD(10) */
3621 ei_lba = 0;
3622 lba = get_unaligned_be32(cmd + 2);
3623 num = get_unaligned_be16(cmd + 7);
3624 check_prot = false;
3625 break;
3626 default: /* assume WRITE(32) */
3627 lba = get_unaligned_be64(cmd + 12);
3628 ei_lba = get_unaligned_be32(cmd + 20);
3629 num = get_unaligned_be32(cmd + 28);
3630 check_prot = false;
3631 break;
3632 }
f46eb0e9 3633 if (unlikely(have_dif_prot && check_prot)) {
8475c811 3634 if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
c2248fc9
DG
3635 (cmd[1] & 0xe0)) {
3636 mk_sense_invalid_opcode(scp);
3637 return check_condition_result;
3638 }
8475c811
CH
3639 if ((sdebug_dif == T10_PI_TYPE1_PROTECTION ||
3640 sdebug_dif == T10_PI_TYPE3_PROTECTION) &&
c2248fc9
DG
3641 (cmd[1] & 0xe0) == 0)
3642 sdev_printk(KERN_ERR, scp->device, "Unprotected WR "
3643 "to DIF device\n");
3644 }
f0d1cf93 3645
7109f370 3646 sdeb_write_lock(sip);
9447b6ce 3647 ret = check_device_access_params(scp, lba, num, true);
f0d1cf93 3648 if (ret) {
7109f370 3649 sdeb_write_unlock(sip);
9447b6ce 3650 return ret;
f0d1cf93 3651 }
6c78cc06 3652
c6a44287 3653 /* DIX + T10 DIF */
f46eb0e9 3654 if (unlikely(sdebug_dix && scsi_prot_sg_count(scp))) {
f7be6772
MP
3655 switch (prot_verify_write(scp, lba, num, ei_lba)) {
3656 case 1: /* Guard tag error */
3657 if (scp->prot_flags & SCSI_PROT_GUARD_CHECK) {
7109f370 3658 sdeb_write_unlock(sip);
f7be6772
MP
3659 mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 1);
3660 return illegal_condition_result;
3661 } else if (scp->cmnd[1] >> 5 != 3) { /* WRPROTECT != 3 */
7109f370 3662 sdeb_write_unlock(sip);
f7be6772
MP
3663 mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 1);
3664 return check_condition_result;
3665 }
3666 break;
3667 case 3: /* Reference tag error */
3668 if (scp->prot_flags & SCSI_PROT_REF_CHECK) {
7109f370 3669 sdeb_write_unlock(sip);
f7be6772
MP
3670 mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 3);
3671 return illegal_condition_result;
3672 } else if (scp->cmnd[1] >> 5 != 3) { /* WRPROTECT != 3 */
7109f370 3673 sdeb_write_unlock(sip);
f7be6772
MP
3674 mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 3);
3675 return check_condition_result;
3676 }
3677 break;
c6a44287
MP
3678 }
3679 }
3680
87c715dc 3681 ret = do_device_access(sip, scp, 0, lba, num, true);
f46eb0e9 3682 if (unlikely(scsi_debug_lbp()))
87c715dc 3683 map_region(sip, lba, num);
f0d1cf93
DG
3684 /* If ZBC zone then bump its write pointer */
3685 if (sdebug_dev_is_zoned(devip))
3686 zbc_inc_wp(devip, lba, num);
7109f370 3687 sdeb_write_unlock(sip);
f46eb0e9 3688 if (unlikely(-1 == ret))
773642d9 3689 return DID_ERROR << 16;
c4837394
DG
3690 else if (unlikely(sdebug_verbose &&
3691 (ret < (num * sdebug_sector_size))))
c2248fc9 3692 sdev_printk(KERN_INFO, scp->device,
cbf67842 3693 "%s: write: cdb indicated=%u, IO sent=%d bytes\n",
773642d9 3694 my_name, num * sdebug_sector_size, ret);
44d92694 3695
3a90a63d
DG
3696 if (unlikely((sdebug_opts & SDEBUG_OPT_RECOV_DIF_DIX) &&
3697 atomic_read(&sdeb_inject_pending))) {
3698 if (sdebug_opts & SDEBUG_OPT_RECOVERED_ERR) {
3699 mk_sense_buffer(scp, RECOVERED_ERROR, THRESHOLD_EXCEEDED, 0);
3700 atomic_set(&sdeb_inject_pending, 0);
3701 return check_condition_result;
3702 } else if (sdebug_opts & SDEBUG_OPT_DIF_ERR) {
3703 /* Logical block guard check failed */
3704 mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 1);
3705 atomic_set(&sdeb_inject_pending, 0);
3706 return illegal_condition_result;
3707 } else if (sdebug_opts & SDEBUG_OPT_DIX_ERR) {
3708 mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 1);
3709 atomic_set(&sdeb_inject_pending, 0);
3710 return illegal_condition_result;
c2248fc9
DG
3711 }
3712 }
44d92694
MP
3713 return 0;
3714}
3715
481b5e5c
DG
3716/*
3717 * T10 has only specified WRITE SCATTERED(16) and WRITE SCATTERED(32).
3718 * No READ GATHERED yet (requires bidi or long cdb holding gather list).
3719 */
3720static int resp_write_scat(struct scsi_cmnd *scp,
3721 struct sdebug_dev_info *devip)
3722{
3723 u8 *cmd = scp->cmnd;
3724 u8 *lrdp = NULL;
3725 u8 *up;
b6ff8ca7 3726 struct sdeb_store_info *sip = devip2sip(devip, true);
481b5e5c
DG
3727 u8 wrprotect;
3728 u16 lbdof, num_lrd, k;
3729 u32 num, num_by, bt_len, lbdof_blen, sg_off, cum_lb;
3730 u32 lb_size = sdebug_sector_size;
3731 u32 ei_lba;
3732 u64 lba;
481b5e5c
DG
3733 int ret, res;
3734 bool is_16;
3735 static const u32 lrd_size = 32; /* + parameter list header size */
3736
3737 if (cmd[0] == VARIABLE_LENGTH_CMD) {
3738 is_16 = false;
3739 wrprotect = (cmd[10] >> 5) & 0x7;
3740 lbdof = get_unaligned_be16(cmd + 12);
3741 num_lrd = get_unaligned_be16(cmd + 16);
3742 bt_len = get_unaligned_be32(cmd + 28);
3743 } else { /* that leaves WRITE SCATTERED(16) */
3744 is_16 = true;
3745 wrprotect = (cmd[2] >> 5) & 0x7;
3746 lbdof = get_unaligned_be16(cmd + 4);
3747 num_lrd = get_unaligned_be16(cmd + 8);
3748 bt_len = get_unaligned_be32(cmd + 10);
3749 if (unlikely(have_dif_prot)) {
3750 if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
3751 wrprotect) {
3752 mk_sense_invalid_opcode(scp);
3753 return illegal_condition_result;
3754 }
3755 if ((sdebug_dif == T10_PI_TYPE1_PROTECTION ||
3756 sdebug_dif == T10_PI_TYPE3_PROTECTION) &&
3757 wrprotect == 0)
3758 sdev_printk(KERN_ERR, scp->device,
3759 "Unprotected WR to DIF device\n");
3760 }
3761 }
3762 if ((num_lrd == 0) || (bt_len == 0))
3763 return 0; /* T10 says these do-nothings are not errors */
3764 if (lbdof == 0) {
3765 if (sdebug_verbose)
3766 sdev_printk(KERN_INFO, scp->device,
3767 "%s: %s: LB Data Offset field bad\n",
3768 my_name, __func__);
3769 mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
3770 return illegal_condition_result;
3771 }
3772 lbdof_blen = lbdof * lb_size;
3773 if ((lrd_size + (num_lrd * lrd_size)) > lbdof_blen) {
3774 if (sdebug_verbose)
3775 sdev_printk(KERN_INFO, scp->device,
3776 "%s: %s: LBA range descriptors don't fit\n",
3777 my_name, __func__);
3778 mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
3779 return illegal_condition_result;
3780 }
3781 lrdp = kzalloc(lbdof_blen, GFP_ATOMIC);
3782 if (lrdp == NULL)
3783 return SCSI_MLQUEUE_HOST_BUSY;
3784 if (sdebug_verbose)
3785 sdev_printk(KERN_INFO, scp->device,
3786 "%s: %s: Fetch header+scatter_list, lbdof_blen=%u\n",
3787 my_name, __func__, lbdof_blen);
3788 res = fetch_to_dev_buffer(scp, lrdp, lbdof_blen);
3789 if (res == -1) {
3790 ret = DID_ERROR << 16;
3791 goto err_out;
3792 }
3793
7109f370 3794 sdeb_write_lock(sip);
481b5e5c
DG
3795 sg_off = lbdof_blen;
3796 /* Spec says Buffer xfer Length field in number of LBs in dout */
3797 cum_lb = 0;
3798 for (k = 0, up = lrdp + lrd_size; k < num_lrd; ++k, up += lrd_size) {
3799 lba = get_unaligned_be64(up + 0);
3800 num = get_unaligned_be32(up + 8);
3801 if (sdebug_verbose)
3802 sdev_printk(KERN_INFO, scp->device,
3803 "%s: %s: k=%d LBA=0x%llx num=%u sg_off=%u\n",
3804 my_name, __func__, k, lba, num, sg_off);
3805 if (num == 0)
3806 continue;
9447b6ce 3807 ret = check_device_access_params(scp, lba, num, true);
481b5e5c
DG
3808 if (ret)
3809 goto err_out_unlock;
3810 num_by = num * lb_size;
3811 ei_lba = is_16 ? 0 : get_unaligned_be32(up + 12);
3812
3813 if ((cum_lb + num) > bt_len) {
3814 if (sdebug_verbose)
3815 sdev_printk(KERN_INFO, scp->device,
3816 "%s: %s: sum of blocks > data provided\n",
3817 my_name, __func__);
3818 mk_sense_buffer(scp, ILLEGAL_REQUEST, WRITE_ERROR_ASC,
3819 0);
3820 ret = illegal_condition_result;
3821 goto err_out_unlock;
3822 }
3823
3824 /* DIX + T10 DIF */
3825 if (unlikely(sdebug_dix && scsi_prot_sg_count(scp))) {
3826 int prot_ret = prot_verify_write(scp, lba, num,
3827 ei_lba);
3828
3829 if (prot_ret) {
3830 mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10,
3831 prot_ret);
3832 ret = illegal_condition_result;
3833 goto err_out_unlock;
3834 }
3835 }
3836
87c715dc 3837 ret = do_device_access(sip, scp, sg_off, lba, num, true);
f0d1cf93
DG
3838 /* If ZBC zone then bump its write pointer */
3839 if (sdebug_dev_is_zoned(devip))
3840 zbc_inc_wp(devip, lba, num);
481b5e5c 3841 if (unlikely(scsi_debug_lbp()))
87c715dc 3842 map_region(sip, lba, num);
481b5e5c
DG
3843 if (unlikely(-1 == ret)) {
3844 ret = DID_ERROR << 16;
3845 goto err_out_unlock;
3846 } else if (unlikely(sdebug_verbose && (ret < num_by)))
3847 sdev_printk(KERN_INFO, scp->device,
3848 "%s: write: cdb indicated=%u, IO sent=%d bytes\n",
3849 my_name, num_by, ret);
3850
3a90a63d
DG
3851 if (unlikely((sdebug_opts & SDEBUG_OPT_RECOV_DIF_DIX) &&
3852 atomic_read(&sdeb_inject_pending))) {
3853 if (sdebug_opts & SDEBUG_OPT_RECOVERED_ERR) {
3854 mk_sense_buffer(scp, RECOVERED_ERROR, THRESHOLD_EXCEEDED, 0);
3855 atomic_set(&sdeb_inject_pending, 0);
3856 ret = check_condition_result;
3857 goto err_out_unlock;
3858 } else if (sdebug_opts & SDEBUG_OPT_DIF_ERR) {
3859 /* Logical block guard check failed */
3860 mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 1);
3861 atomic_set(&sdeb_inject_pending, 0);
3862 ret = illegal_condition_result;
3863 goto err_out_unlock;
3864 } else if (sdebug_opts & SDEBUG_OPT_DIX_ERR) {
3865 mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 1);
3866 atomic_set(&sdeb_inject_pending, 0);
3867 ret = illegal_condition_result;
3868 goto err_out_unlock;
481b5e5c
DG
3869 }
3870 }
3871 sg_off += num_by;
3872 cum_lb += num;
3873 }
3874 ret = 0;
3875err_out_unlock:
7109f370 3876 sdeb_write_unlock(sip);
481b5e5c
DG
3877err_out:
3878 kfree(lrdp);
3879 return ret;
3880}
3881
fd32119b
DG
3882static int resp_write_same(struct scsi_cmnd *scp, u64 lba, u32 num,
3883 u32 ei_lba, bool unmap, bool ndob)
44d92694 3884{
f0d1cf93
DG
3885 struct scsi_device *sdp = scp->device;
3886 struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata;
44d92694 3887 unsigned long long i;
40d07b52 3888 u64 block, lbaa;
87c715dc
DG
3889 u32 lb_size = sdebug_sector_size;
3890 int ret;
3891 struct sdeb_store_info *sip = devip2sip((struct sdebug_dev_info *)
b6ff8ca7 3892 scp->device->hostdata, true);
40d07b52 3893 u8 *fs1p;
87c715dc 3894 u8 *fsp;
44d92694 3895
7109f370 3896 sdeb_write_lock(sip);
f0d1cf93 3897
9447b6ce 3898 ret = check_device_access_params(scp, lba, num, true);
f0d1cf93 3899 if (ret) {
7109f370 3900 sdeb_write_unlock(sip);
44d92694 3901 return ret;
f0d1cf93 3902 }
44d92694 3903
9ed8d3dc 3904 if (unmap && scsi_debug_lbp()) {
87c715dc 3905 unmap_region(sip, lba, num);
44d92694
MP
3906 goto out;
3907 }
40d07b52
DG
3908 lbaa = lba;
3909 block = do_div(lbaa, sdebug_store_sectors);
c2248fc9 3910 /* if ndob then zero 1 logical block, else fetch 1 logical block */
87c715dc
DG
3911 fsp = sip->storep;
3912 fs1p = fsp + (block * lb_size);
c2248fc9 3913 if (ndob) {
40d07b52 3914 memset(fs1p, 0, lb_size);
c2248fc9
DG
3915 ret = 0;
3916 } else
40d07b52 3917 ret = fetch_to_dev_buffer(scp, fs1p, lb_size);
44d92694
MP
3918
3919 if (-1 == ret) {
7109f370 3920 sdeb_write_unlock(sip);
773642d9 3921 return DID_ERROR << 16;
40d07b52 3922 } else if (sdebug_verbose && !ndob && (ret < lb_size))
c2248fc9 3923 sdev_printk(KERN_INFO, scp->device,
e33d7c56 3924 "%s: %s: lb size=%u, IO sent=%d bytes\n",
40d07b52 3925 my_name, "write same", lb_size, ret);
44d92694
MP
3926
3927 /* Copy first sector to remaining blocks */
40d07b52
DG
3928 for (i = 1 ; i < num ; i++) {
3929 lbaa = lba + i;
3930 block = do_div(lbaa, sdebug_store_sectors);
87c715dc 3931 memmove(fsp + (block * lb_size), fs1p, lb_size);
40d07b52 3932 }
9ed8d3dc 3933 if (scsi_debug_lbp())
87c715dc 3934 map_region(sip, lba, num);
f0d1cf93
DG
3935 /* If ZBC zone then bump its write pointer */
3936 if (sdebug_dev_is_zoned(devip))
3937 zbc_inc_wp(devip, lba, num);
44d92694 3938out:
7109f370 3939 sdeb_write_unlock(sip);
44d92694 3940
1da177e4
LT
3941 return 0;
3942}
3943
fd32119b
DG
3944static int resp_write_same_10(struct scsi_cmnd *scp,
3945 struct sdebug_dev_info *devip)
c2248fc9
DG
3946{
3947 u8 *cmd = scp->cmnd;
3948 u32 lba;
3949 u16 num;
3950 u32 ei_lba = 0;
3951 bool unmap = false;
3952
3953 if (cmd[1] & 0x8) {
773642d9 3954 if (sdebug_lbpws10 == 0) {
c2248fc9
DG
3955 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 3);
3956 return check_condition_result;
3957 } else
3958 unmap = true;
3959 }
3960 lba = get_unaligned_be32(cmd + 2);
3961 num = get_unaligned_be16(cmd + 7);
773642d9 3962 if (num > sdebug_write_same_length) {
c2248fc9
DG
3963 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 7, -1);
3964 return check_condition_result;
3965 }
3966 return resp_write_same(scp, lba, num, ei_lba, unmap, false);
3967}
3968
fd32119b
DG
3969static int resp_write_same_16(struct scsi_cmnd *scp,
3970 struct sdebug_dev_info *devip)
c2248fc9
DG
3971{
3972 u8 *cmd = scp->cmnd;
3973 u64 lba;
3974 u32 num;
3975 u32 ei_lba = 0;
3976 bool unmap = false;
3977 bool ndob = false;
3978
3979 if (cmd[1] & 0x8) { /* UNMAP */
773642d9 3980 if (sdebug_lbpws == 0) {
c2248fc9
DG
3981 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 3);
3982 return check_condition_result;
3983 } else
3984 unmap = true;
3985 }
3986 if (cmd[1] & 0x1) /* NDOB (no data-out buffer, assumes zeroes) */
3987 ndob = true;
3988 lba = get_unaligned_be64(cmd + 2);
3989 num = get_unaligned_be32(cmd + 10);
773642d9 3990 if (num > sdebug_write_same_length) {
c2248fc9
DG
3991 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 10, -1);
3992 return check_condition_result;
3993 }
3994 return resp_write_same(scp, lba, num, ei_lba, unmap, ndob);
3995}
3996
acafd0b9
EM
3997/* Note the mode field is in the same position as the (lower) service action
3998 * field. For the Report supported operation codes command, SPC-4 suggests
3999 * each mode of this command should be reported separately; for future. */
fd32119b
DG
4000static int resp_write_buffer(struct scsi_cmnd *scp,
4001 struct sdebug_dev_info *devip)
acafd0b9
EM
4002{
4003 u8 *cmd = scp->cmnd;
4004 struct scsi_device *sdp = scp->device;
4005 struct sdebug_dev_info *dp;
4006 u8 mode;
4007
4008 mode = cmd[1] & 0x1f;
4009 switch (mode) {
4010 case 0x4: /* download microcode (MC) and activate (ACT) */
4011 /* set UAs on this device only */
4012 set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
4013 set_bit(SDEBUG_UA_MICROCODE_CHANGED, devip->uas_bm);
4014 break;
4015 case 0x5: /* download MC, save and ACT */
4016 set_bit(SDEBUG_UA_MICROCODE_CHANGED_WO_RESET, devip->uas_bm);
4017 break;
4018 case 0x6: /* download MC with offsets and ACT */
4019 /* set UAs on most devices (LUs) in this target */
4020 list_for_each_entry(dp,
4021 &devip->sdbg_host->dev_info_list,
4022 dev_list)
4023 if (dp->target == sdp->id) {
4024 set_bit(SDEBUG_UA_BUS_RESET, dp->uas_bm);
4025 if (devip != dp)
4026 set_bit(SDEBUG_UA_MICROCODE_CHANGED,
4027 dp->uas_bm);
4028 }
4029 break;
4030 case 0x7: /* download MC with offsets, save, and ACT */
4031 /* set UA on all devices (LUs) in this target */
4032 list_for_each_entry(dp,
4033 &devip->sdbg_host->dev_info_list,
4034 dev_list)
4035 if (dp->target == sdp->id)
4036 set_bit(SDEBUG_UA_MICROCODE_CHANGED_WO_RESET,
4037 dp->uas_bm);
4038 break;
4039 default:
4040 /* do nothing for this command for other mode values */
4041 break;
4042 }
4043 return 0;
4044}
4045
fd32119b
DG
4046static int resp_comp_write(struct scsi_cmnd *scp,
4047 struct sdebug_dev_info *devip)
38d5c833
DG
4048{
4049 u8 *cmd = scp->cmnd;
4050 u8 *arr;
b6ff8ca7 4051 struct sdeb_store_info *sip = devip2sip(devip, true);
38d5c833
DG
4052 u64 lba;
4053 u32 dnum;
773642d9 4054 u32 lb_size = sdebug_sector_size;
38d5c833 4055 u8 num;
38d5c833 4056 int ret;
d467d31f 4057 int retval = 0;
38d5c833 4058
d467d31f 4059 lba = get_unaligned_be64(cmd + 2);
38d5c833
DG
4060 num = cmd[13]; /* 1 to a maximum of 255 logical blocks */
4061 if (0 == num)
4062 return 0; /* degenerate case, not an error */
8475c811 4063 if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
38d5c833
DG
4064 (cmd[1] & 0xe0)) {
4065 mk_sense_invalid_opcode(scp);
4066 return check_condition_result;
4067 }
8475c811
CH
4068 if ((sdebug_dif == T10_PI_TYPE1_PROTECTION ||
4069 sdebug_dif == T10_PI_TYPE3_PROTECTION) &&
38d5c833
DG
4070 (cmd[1] & 0xe0) == 0)
4071 sdev_printk(KERN_ERR, scp->device, "Unprotected WR "
4072 "to DIF device\n");
9447b6ce
MP
4073 ret = check_device_access_params(scp, lba, num, false);
4074 if (ret)
4075 return ret;
d467d31f 4076 dnum = 2 * num;
6396bb22 4077 arr = kcalloc(lb_size, dnum, GFP_ATOMIC);
d467d31f
DG
4078 if (NULL == arr) {
4079 mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
4080 INSUFF_RES_ASCQ);
4081 return check_condition_result;
4082 }
38d5c833 4083
7109f370 4084 sdeb_write_lock(sip);
38d5c833 4085
87c715dc 4086 ret = do_dout_fetch(scp, dnum, arr);
38d5c833 4087 if (ret == -1) {
d467d31f
DG
4088 retval = DID_ERROR << 16;
4089 goto cleanup;
773642d9 4090 } else if (sdebug_verbose && (ret < (dnum * lb_size)))
38d5c833
DG
4091 sdev_printk(KERN_INFO, scp->device, "%s: compare_write: cdb "
4092 "indicated=%u, IO sent=%d bytes\n", my_name,
4093 dnum * lb_size, ret);
c3e2fe92 4094 if (!comp_write_worker(sip, lba, num, arr, false)) {
38d5c833 4095 mk_sense_buffer(scp, MISCOMPARE, MISCOMPARE_VERIFY_ASC, 0);
d467d31f
DG
4096 retval = check_condition_result;
4097 goto cleanup;
38d5c833
DG
4098 }
4099 if (scsi_debug_lbp())
87c715dc 4100 map_region(sip, lba, num);
d467d31f 4101cleanup:
7109f370 4102 sdeb_write_unlock(sip);
d467d31f
DG
4103 kfree(arr);
4104 return retval;
38d5c833
DG
4105}
4106
44d92694
MP
4107struct unmap_block_desc {
4108 __be64 lba;
4109 __be32 blocks;
4110 __be32 __reserved;
4111};
4112
fd32119b 4113static int resp_unmap(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
44d92694
MP
4114{
4115 unsigned char *buf;
4116 struct unmap_block_desc *desc;
b6ff8ca7 4117 struct sdeb_store_info *sip = devip2sip(devip, true);
44d92694
MP
4118 unsigned int i, payload_len, descriptors;
4119 int ret;
44d92694 4120
c2248fc9
DG
4121 if (!scsi_debug_lbp())
4122 return 0; /* fib and say its done */
4123 payload_len = get_unaligned_be16(scp->cmnd + 7);
4124 BUG_ON(scsi_bufflen(scp) != payload_len);
44d92694
MP
4125
4126 descriptors = (payload_len - 8) / 16;
773642d9 4127 if (descriptors > sdebug_unmap_max_desc) {
c2248fc9
DG
4128 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 7, -1);
4129 return check_condition_result;
4130 }
44d92694 4131
b333a819 4132 buf = kzalloc(scsi_bufflen(scp), GFP_ATOMIC);
c2248fc9
DG
4133 if (!buf) {
4134 mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
4135 INSUFF_RES_ASCQ);
44d92694 4136 return check_condition_result;
c2248fc9 4137 }
44d92694 4138
c2248fc9 4139 scsi_sg_copy_to_buffer(scp, buf, scsi_bufflen(scp));
44d92694
MP
4140
4141 BUG_ON(get_unaligned_be16(&buf[0]) != payload_len - 2);
4142 BUG_ON(get_unaligned_be16(&buf[2]) != descriptors * 16);
4143
4144 desc = (void *)&buf[8];
4145
7109f370 4146 sdeb_write_lock(sip);
6c78cc06 4147
44d92694
MP
4148 for (i = 0 ; i < descriptors ; i++) {
4149 unsigned long long lba = get_unaligned_be64(&desc[i].lba);
4150 unsigned int num = get_unaligned_be32(&desc[i].blocks);
4151
9447b6ce 4152 ret = check_device_access_params(scp, lba, num, true);
44d92694
MP
4153 if (ret)
4154 goto out;
4155
87c715dc 4156 unmap_region(sip, lba, num);
44d92694
MP
4157 }
4158
4159 ret = 0;
4160
4161out:
7109f370 4162 sdeb_write_unlock(sip);
44d92694
MP
4163 kfree(buf);
4164
4165 return ret;
4166}
4167
4168#define SDEBUG_GET_LBA_STATUS_LEN 32
4169
fd32119b
DG
4170static int resp_get_lba_status(struct scsi_cmnd *scp,
4171 struct sdebug_dev_info *devip)
44d92694 4172{
c2248fc9
DG
4173 u8 *cmd = scp->cmnd;
4174 u64 lba;
4175 u32 alloc_len, mapped, num;
44d92694 4176 int ret;
87c715dc 4177 u8 arr[SDEBUG_GET_LBA_STATUS_LEN];
44d92694 4178
c2248fc9
DG
4179 lba = get_unaligned_be64(cmd + 2);
4180 alloc_len = get_unaligned_be32(cmd + 10);
44d92694
MP
4181
4182 if (alloc_len < 24)
4183 return 0;
4184
9447b6ce 4185 ret = check_device_access_params(scp, lba, 1, false);
44d92694
MP
4186 if (ret)
4187 return ret;
4188
b6ff8ca7
DG
4189 if (scsi_debug_lbp()) {
4190 struct sdeb_store_info *sip = devip2sip(devip, true);
4191
87c715dc 4192 mapped = map_state(sip, lba, &num);
b6ff8ca7 4193 } else {
c2248fc9
DG
4194 mapped = 1;
4195 /* following just in case virtual_gb changed */
4196 sdebug_capacity = get_sdebug_capacity();
4197 if (sdebug_capacity - lba <= 0xffffffff)
4198 num = sdebug_capacity - lba;
4199 else
4200 num = 0xffffffff;
4201 }
44d92694
MP
4202
4203 memset(arr, 0, SDEBUG_GET_LBA_STATUS_LEN);
c2248fc9
DG
4204 put_unaligned_be32(20, arr); /* Parameter Data Length */
4205 put_unaligned_be64(lba, arr + 8); /* LBA */
4206 put_unaligned_be32(num, arr + 16); /* Number of blocks */
4207 arr[20] = !mapped; /* prov_stat=0: mapped; 1: dealloc */
44d92694 4208
c2248fc9 4209 return fill_from_dev_buffer(scp, arr, SDEBUG_GET_LBA_STATUS_LEN);
44d92694
MP
4210}
4211
80c49563
DG
4212static int resp_sync_cache(struct scsi_cmnd *scp,
4213 struct sdebug_dev_info *devip)
4214{
4f2c8bf6 4215 int res = 0;
80c49563
DG
4216 u64 lba;
4217 u32 num_blocks;
4218 u8 *cmd = scp->cmnd;
4219
4220 if (cmd[0] == SYNCHRONIZE_CACHE) { /* 10 byte cdb */
4221 lba = get_unaligned_be32(cmd + 2);
4222 num_blocks = get_unaligned_be16(cmd + 7);
4223 } else { /* SYNCHRONIZE_CACHE(16) */
4224 lba = get_unaligned_be64(cmd + 2);
4225 num_blocks = get_unaligned_be32(cmd + 10);
4226 }
4227 if (lba + num_blocks > sdebug_capacity) {
4228 mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
4229 return check_condition_result;
4230 }
fc13638a 4231 if (!write_since_sync || (cmd[1] & 0x2))
4f2c8bf6
DG
4232 res = SDEG_RES_IMMED_MASK;
4233 else /* delay if write_since_sync and IMMED clear */
4234 write_since_sync = false;
4235 return res;
80c49563
DG
4236}
4237
ed9f3e25
DG
4238/*
4239 * Assuming the LBA+num_blocks is not out-of-range, this function will return
4240 * CONDITION MET if the specified blocks will/have fitted in the cache, and
4241 * a GOOD status otherwise. Model a disk with a big cache and yield
4242 * CONDITION MET. Actually tries to bring range in main memory into the
4243 * cache associated with the CPU(s).
4244 */
4245static int resp_pre_fetch(struct scsi_cmnd *scp,
4246 struct sdebug_dev_info *devip)
4247{
4248 int res = 0;
4249 u64 lba;
4250 u64 block, rest = 0;
4251 u32 nblks;
4252 u8 *cmd = scp->cmnd;
b6ff8ca7 4253 struct sdeb_store_info *sip = devip2sip(devip, true);
b6ff8ca7 4254 u8 *fsp = sip->storep;
ed9f3e25
DG
4255
4256 if (cmd[0] == PRE_FETCH) { /* 10 byte cdb */
4257 lba = get_unaligned_be32(cmd + 2);
4258 nblks = get_unaligned_be16(cmd + 7);
4259 } else { /* PRE-FETCH(16) */
4260 lba = get_unaligned_be64(cmd + 2);
4261 nblks = get_unaligned_be32(cmd + 10);
4262 }
4263 if (lba + nblks > sdebug_capacity) {
4264 mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
4265 return check_condition_result;
4266 }
4267 if (!fsp)
4268 goto fini;
4269 /* PRE-FETCH spec says nothing about LBP or PI so skip them */
4270 block = do_div(lba, sdebug_store_sectors);
4271 if (block + nblks > sdebug_store_sectors)
4272 rest = block + nblks - sdebug_store_sectors;
4273
4274 /* Try to bring the PRE-FETCH range into CPU's cache */
7109f370 4275 sdeb_read_lock(sip);
ed9f3e25
DG
4276 prefetch_range(fsp + (sdebug_sector_size * block),
4277 (nblks - rest) * sdebug_sector_size);
4278 if (rest)
4279 prefetch_range(fsp, rest * sdebug_sector_size);
7109f370 4280 sdeb_read_unlock(sip);
ed9f3e25
DG
4281fini:
4282 if (cmd[1] & 0x2)
4283 res = SDEG_RES_IMMED_MASK;
4284 return res | condition_met_result;
4285}
4286
fb0cc8d1
DG
4287#define RL_BUCKET_ELEMS 8
4288
8d039e22
DG
4289/* Even though each pseudo target has a REPORT LUNS "well known logical unit"
4290 * (W-LUN), the normal Linux scanning logic does not associate it with a
4291 * device (e.g. /dev/sg7). The following magic will make that association:
4292 * "cd /sys/class/scsi_host/host<n> ; echo '- - 49409' > scan"
4293 * where <n> is a host number. If there are multiple targets in a host then
4294 * the above will associate a W-LUN to each target. To only get a W-LUN
4295 * for target 2, then use "echo '- 2 49409' > scan" .
4296 */
4297static int resp_report_luns(struct scsi_cmnd *scp,
4298 struct sdebug_dev_info *devip)
1da177e4 4299{
8d039e22 4300 unsigned char *cmd = scp->cmnd;
1da177e4 4301 unsigned int alloc_len;
8d039e22 4302 unsigned char select_report;
22017ed2 4303 u64 lun;
8d039e22 4304 struct scsi_lun *lun_p;
fb0cc8d1 4305 u8 arr[RL_BUCKET_ELEMS * sizeof(struct scsi_lun)];
8d039e22
DG
4306 unsigned int lun_cnt; /* normal LUN count (max: 256) */
4307 unsigned int wlun_cnt; /* report luns W-LUN count */
4308 unsigned int tlun_cnt; /* total LUN count */
4309 unsigned int rlen; /* response length (in bytes) */
fb0cc8d1
DG
4310 int k, j, n, res;
4311 unsigned int off_rsp = 0;
4312 const int sz_lun = sizeof(struct scsi_lun);
1da177e4 4313
19c8ead7 4314 clear_luns_changed_on_target(devip);
8d039e22
DG
4315
4316 select_report = cmd[2];
4317 alloc_len = get_unaligned_be32(cmd + 6);
4318
4319 if (alloc_len < 4) {
4320 pr_err("alloc len too small %d\n", alloc_len);
4321 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 6, -1);
1da177e4
LT
4322 return check_condition_result;
4323 }
8d039e22
DG
4324
4325 switch (select_report) {
4326 case 0: /* all LUNs apart from W-LUNs */
4327 lun_cnt = sdebug_max_luns;
4328 wlun_cnt = 0;
4329 break;
4330 case 1: /* only W-LUNs */
c65b1445 4331 lun_cnt = 0;
8d039e22
DG
4332 wlun_cnt = 1;
4333 break;
4334 case 2: /* all LUNs */
4335 lun_cnt = sdebug_max_luns;
4336 wlun_cnt = 1;
4337 break;
4338 case 0x10: /* only administrative LUs */
4339 case 0x11: /* see SPC-5 */
4340 case 0x12: /* only subsiduary LUs owned by referenced LU */
4341 default:
4342 pr_debug("select report invalid %d\n", select_report);
4343 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, -1);
4344 return check_condition_result;
4345 }
4346
4347 if (sdebug_no_lun_0 && (lun_cnt > 0))
c65b1445 4348 --lun_cnt;
8d039e22
DG
4349
4350 tlun_cnt = lun_cnt + wlun_cnt;
fb0cc8d1
DG
4351 rlen = tlun_cnt * sz_lun; /* excluding 8 byte header */
4352 scsi_set_resid(scp, scsi_bufflen(scp));
8d039e22
DG
4353 pr_debug("select_report %d luns = %d wluns = %d no_lun0 %d\n",
4354 select_report, lun_cnt, wlun_cnt, sdebug_no_lun_0);
4355
fb0cc8d1 4356 /* loops rely on sizeof response header same as sizeof lun (both 8) */
8d039e22 4357 lun = sdebug_no_lun_0 ? 1 : 0;
fb0cc8d1
DG
4358 for (k = 0, j = 0, res = 0; true; ++k, j = 0) {
4359 memset(arr, 0, sizeof(arr));
4360 lun_p = (struct scsi_lun *)&arr[0];
4361 if (k == 0) {
4362 put_unaligned_be32(rlen, &arr[0]);
4363 ++lun_p;
4364 j = 1;
4365 }
4366 for ( ; j < RL_BUCKET_ELEMS; ++j, ++lun_p) {
4367 if ((k * RL_BUCKET_ELEMS) + j > lun_cnt)
4368 break;
4369 int_to_scsilun(lun++, lun_p);
ad0c7775
DG
4370 if (lun > 1 && sdebug_lun_am == SAM_LUN_AM_FLAT)
4371 lun_p->scsi_lun[0] |= 0x40;
fb0cc8d1
DG
4372 }
4373 if (j < RL_BUCKET_ELEMS)
4374 break;
4375 n = j * sz_lun;
4376 res = p_fill_from_dev_buffer(scp, arr, n, off_rsp);
4377 if (res)
4378 return res;
4379 off_rsp += n;
4380 }
4381 if (wlun_cnt) {
4382 int_to_scsilun(SCSI_W_LUN_REPORT_LUNS, lun_p);
4383 ++j;
4384 }
4385 if (j > 0)
4386 res = p_fill_from_dev_buffer(scp, arr, j * sz_lun, off_rsp);
8d039e22 4387 return res;
1da177e4
LT
4388}
4389
c3e2fe92
DG
4390static int resp_verify(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
4391{
4392 bool is_bytchk3 = false;
4393 u8 bytchk;
4394 int ret, j;
4395 u32 vnum, a_num, off;
4396 const u32 lb_size = sdebug_sector_size;
c3e2fe92
DG
4397 u64 lba;
4398 u8 *arr;
4399 u8 *cmd = scp->cmnd;
b6ff8ca7 4400 struct sdeb_store_info *sip = devip2sip(devip, true);
c3e2fe92
DG
4401
4402 bytchk = (cmd[1] >> 1) & 0x3;
4403 if (bytchk == 0) {
4404 return 0; /* always claim internal verify okay */
4405 } else if (bytchk == 2) {
4406 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 2);
4407 return check_condition_result;
4408 } else if (bytchk == 3) {
4409 is_bytchk3 = true; /* 1 block sent, compared repeatedly */
4410 }
4411 switch (cmd[0]) {
4412 case VERIFY_16:
4413 lba = get_unaligned_be64(cmd + 2);
4414 vnum = get_unaligned_be32(cmd + 10);
4415 break;
4416 case VERIFY: /* is VERIFY(10) */
4417 lba = get_unaligned_be32(cmd + 2);
4418 vnum = get_unaligned_be16(cmd + 7);
4419 break;
4420 default:
4421 mk_sense_invalid_opcode(scp);
4422 return check_condition_result;
4423 }
3344b58b
GK
4424 if (vnum == 0)
4425 return 0; /* not an error */
c3e2fe92
DG
4426 a_num = is_bytchk3 ? 1 : vnum;
4427 /* Treat following check like one for read (i.e. no write) access */
4428 ret = check_device_access_params(scp, lba, a_num, false);
4429 if (ret)
4430 return ret;
4431
4432 arr = kcalloc(lb_size, vnum, GFP_ATOMIC);
4433 if (!arr) {
4434 mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
4435 INSUFF_RES_ASCQ);
4436 return check_condition_result;
4437 }
4438 /* Not changing store, so only need read access */
7109f370 4439 sdeb_read_lock(sip);
c3e2fe92
DG
4440
4441 ret = do_dout_fetch(scp, a_num, arr);
4442 if (ret == -1) {
4443 ret = DID_ERROR << 16;
4444 goto cleanup;
4445 } else if (sdebug_verbose && (ret < (a_num * lb_size))) {
4446 sdev_printk(KERN_INFO, scp->device,
4447 "%s: %s: cdb indicated=%u, IO sent=%d bytes\n",
4448 my_name, __func__, a_num * lb_size, ret);
4449 }
4450 if (is_bytchk3) {
4451 for (j = 1, off = lb_size; j < vnum; ++j, off += lb_size)
4452 memcpy(arr + off, arr, lb_size);
4453 }
4454 ret = 0;
4455 if (!comp_write_worker(sip, lba, vnum, arr, true)) {
4456 mk_sense_buffer(scp, MISCOMPARE, MISCOMPARE_VERIFY_ASC, 0);
4457 ret = check_condition_result;
4458 goto cleanup;
4459 }
4460cleanup:
7109f370 4461 sdeb_read_unlock(sip);
c3e2fe92
DG
4462 kfree(arr);
4463 return ret;
4464}
4465
f0d1cf93
DG
4466#define RZONES_DESC_HD 64
4467
897284e8 4468/* Report zones depending on start LBA and reporting options */
f0d1cf93
DG
4469static int resp_report_zones(struct scsi_cmnd *scp,
4470 struct sdebug_dev_info *devip)
4471{
4a5fc1c6 4472 unsigned int rep_max_zones, nrz = 0;
f0d1cf93
DG
4473 int ret = 0;
4474 u32 alloc_len, rep_opts, rep_len;
4475 bool partial;
4476 u64 lba, zs_lba;
4477 u8 *arr = NULL, *desc;
4478 u8 *cmd = scp->cmnd;
4a5fc1c6 4479 struct sdeb_zone_state *zsp = NULL;
b6ff8ca7 4480 struct sdeb_store_info *sip = devip2sip(devip, false);
f0d1cf93
DG
4481
4482 if (!sdebug_dev_is_zoned(devip)) {
4483 mk_sense_invalid_opcode(scp);
4484 return check_condition_result;
4485 }
4486 zs_lba = get_unaligned_be64(cmd + 2);
4487 alloc_len = get_unaligned_be32(cmd + 10);
3344b58b
GK
4488 if (alloc_len == 0)
4489 return 0; /* not an error */
f0d1cf93
DG
4490 rep_opts = cmd[14] & 0x3f;
4491 partial = cmd[14] & 0x80;
4492
4493 if (zs_lba >= sdebug_capacity) {
4494 mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
4495 return check_condition_result;
4496 }
4497
4a5fc1c6 4498 rep_max_zones = (alloc_len - 64) >> ilog2(RZONES_DESC_HD);
f0d1cf93 4499
7db0e0c8 4500 arr = kzalloc(alloc_len, GFP_ATOMIC);
f0d1cf93
DG
4501 if (!arr) {
4502 mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
4503 INSUFF_RES_ASCQ);
4504 return check_condition_result;
4505 }
4506
7109f370 4507 sdeb_read_lock(sip);
f0d1cf93
DG
4508
4509 desc = arr + 64;
4a5fc1c6
DLM
4510 for (lba = zs_lba; lba < sdebug_capacity;
4511 lba = zsp->z_start + zsp->z_size) {
4512 if (WARN_ONCE(zbc_zone(devip, lba) == zsp, "lba = %llu\n", lba))
f0d1cf93
DG
4513 break;
4514 zsp = zbc_zone(devip, lba);
4515 switch (rep_opts) {
4516 case 0x00:
4517 /* All zones */
4518 break;
4519 case 0x01:
4520 /* Empty zones */
4521 if (zsp->z_cond != ZC1_EMPTY)
4522 continue;
4523 break;
4524 case 0x02:
4525 /* Implicit open zones */
4526 if (zsp->z_cond != ZC2_IMPLICIT_OPEN)
4527 continue;
4528 break;
4529 case 0x03:
4530 /* Explicit open zones */
4531 if (zsp->z_cond != ZC3_EXPLICIT_OPEN)
4532 continue;
4533 break;
4534 case 0x04:
4535 /* Closed zones */
4536 if (zsp->z_cond != ZC4_CLOSED)
4537 continue;
4538 break;
4539 case 0x05:
4540 /* Full zones */
4541 if (zsp->z_cond != ZC5_FULL)
4542 continue;
4543 break;
4544 case 0x06:
4545 case 0x07:
4546 case 0x10:
f0d1cf93 4547 /*
64e14ece
DLM
4548 * Read-only, offline, reset WP recommended are
4549 * not emulated: no zones to report;
f0d1cf93
DG
4550 */
4551 continue;
64e14ece
DLM
4552 case 0x11:
4553 /* non-seq-resource set */
4554 if (!zsp->z_non_seq_resource)
4555 continue;
4556 break;
4a5fc1c6
DLM
4557 case 0x3e:
4558 /* All zones except gap zones. */
4559 if (zbc_zone_is_gap(zsp))
4560 continue;
4561 break;
f0d1cf93
DG
4562 case 0x3f:
4563 /* Not write pointer (conventional) zones */
4a5fc1c6 4564 if (zbc_zone_is_seq(zsp))
f0d1cf93
DG
4565 continue;
4566 break;
4567 default:
4568 mk_sense_buffer(scp, ILLEGAL_REQUEST,
4569 INVALID_FIELD_IN_CDB, 0);
4570 ret = check_condition_result;
4571 goto fini;
4572 }
4573
4574 if (nrz < rep_max_zones) {
4575 /* Fill zone descriptor */
64e14ece 4576 desc[0] = zsp->z_type;
f0d1cf93 4577 desc[1] = zsp->z_cond << 4;
64e14ece
DLM
4578 if (zsp->z_non_seq_resource)
4579 desc[1] |= 1 << 1;
f0d1cf93
DG
4580 put_unaligned_be64((u64)zsp->z_size, desc + 8);
4581 put_unaligned_be64((u64)zsp->z_start, desc + 16);
4582 put_unaligned_be64((u64)zsp->z_wp, desc + 24);
4583 desc += 64;
4584 }
4585
4586 if (partial && nrz >= rep_max_zones)
4587 break;
4588
4589 nrz++;
4590 }
4591
4592 /* Report header */
4a5fc1c6 4593 /* Zone list length. */
f0d1cf93 4594 put_unaligned_be32(nrz * RZONES_DESC_HD, arr + 0);
4a5fc1c6 4595 /* Maximum LBA */
f0d1cf93 4596 put_unaligned_be64(sdebug_capacity - 1, arr + 8);
4a5fc1c6
DLM
4597 /* Zone starting LBA granularity. */
4598 if (devip->zcap < devip->zsize)
4599 put_unaligned_be64(devip->zsize, arr + 16);
f0d1cf93
DG
4600
4601 rep_len = (unsigned long)desc - (unsigned long)arr;
36e07d7e 4602 ret = fill_from_dev_buffer(scp, arr, min_t(u32, alloc_len, rep_len));
f0d1cf93
DG
4603
4604fini:
7109f370 4605 sdeb_read_unlock(sip);
f0d1cf93
DG
4606 kfree(arr);
4607 return ret;
4608}
4609
4610/* Logic transplanted from tcmu-runner, file_zbc.c */
4611static void zbc_open_all(struct sdebug_dev_info *devip)
4612{
4613 struct sdeb_zone_state *zsp = &devip->zstate[0];
4614 unsigned int i;
4615
4616 for (i = 0; i < devip->nr_zones; i++, zsp++) {
4617 if (zsp->z_cond == ZC4_CLOSED)
4618 zbc_open_zone(devip, &devip->zstate[i], true);
4619 }
4620}
4621
4622static int resp_open_zone(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
4623{
4624 int res = 0;
4625 u64 z_id;
4626 enum sdebug_z_cond zc;
4627 u8 *cmd = scp->cmnd;
4628 struct sdeb_zone_state *zsp;
4629 bool all = cmd[14] & 0x01;
b6ff8ca7 4630 struct sdeb_store_info *sip = devip2sip(devip, false);
f0d1cf93
DG
4631
4632 if (!sdebug_dev_is_zoned(devip)) {
4633 mk_sense_invalid_opcode(scp);
4634 return check_condition_result;
4635 }
4636
7109f370 4637 sdeb_write_lock(sip);
f0d1cf93
DG
4638
4639 if (all) {
4640 /* Check if all closed zones can be open */
4641 if (devip->max_open &&
4642 devip->nr_exp_open + devip->nr_closed > devip->max_open) {
4643 mk_sense_buffer(scp, DATA_PROTECT, INSUFF_RES_ASC,
4644 INSUFF_ZONE_ASCQ);
4645 res = check_condition_result;
4646 goto fini;
4647 }
4648 /* Open all closed zones */
4649 zbc_open_all(devip);
4650 goto fini;
4651 }
4652
4653 /* Open the specified zone */
4654 z_id = get_unaligned_be64(cmd + 2);
4655 if (z_id >= sdebug_capacity) {
4656 mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
4657 res = check_condition_result;
4658 goto fini;
4659 }
4660
4661 zsp = zbc_zone(devip, z_id);
4662 if (z_id != zsp->z_start) {
4663 mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4664 res = check_condition_result;
4665 goto fini;
4666 }
4667 if (zbc_zone_is_conv(zsp)) {
4668 mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4669 res = check_condition_result;
4670 goto fini;
4671 }
4672
4673 zc = zsp->z_cond;
4674 if (zc == ZC3_EXPLICIT_OPEN || zc == ZC5_FULL)
4675 goto fini;
4676
4677 if (devip->max_open && devip->nr_exp_open >= devip->max_open) {
4678 mk_sense_buffer(scp, DATA_PROTECT, INSUFF_RES_ASC,
4679 INSUFF_ZONE_ASCQ);
4680 res = check_condition_result;
4681 goto fini;
4682 }
4683
f0d1cf93
DG
4684 zbc_open_zone(devip, zsp, true);
4685fini:
7109f370 4686 sdeb_write_unlock(sip);
f0d1cf93
DG
4687 return res;
4688}
4689
4690static void zbc_close_all(struct sdebug_dev_info *devip)
4691{
4692 unsigned int i;
4693
4694 for (i = 0; i < devip->nr_zones; i++)
4695 zbc_close_zone(devip, &devip->zstate[i]);
4696}
4697
4698static int resp_close_zone(struct scsi_cmnd *scp,
4699 struct sdebug_dev_info *devip)
4700{
4701 int res = 0;
4702 u64 z_id;
4703 u8 *cmd = scp->cmnd;
4704 struct sdeb_zone_state *zsp;
4705 bool all = cmd[14] & 0x01;
b6ff8ca7 4706 struct sdeb_store_info *sip = devip2sip(devip, false);
f0d1cf93
DG
4707
4708 if (!sdebug_dev_is_zoned(devip)) {
4709 mk_sense_invalid_opcode(scp);
4710 return check_condition_result;
4711 }
4712
7109f370 4713 sdeb_write_lock(sip);
f0d1cf93
DG
4714
4715 if (all) {
4716 zbc_close_all(devip);
4717 goto fini;
4718 }
4719
4720 /* Close specified zone */
4721 z_id = get_unaligned_be64(cmd + 2);
4722 if (z_id >= sdebug_capacity) {
4723 mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
4724 res = check_condition_result;
4725 goto fini;
4726 }
4727
4728 zsp = zbc_zone(devip, z_id);
4729 if (z_id != zsp->z_start) {
4730 mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4731 res = check_condition_result;
4732 goto fini;
4733 }
4734 if (zbc_zone_is_conv(zsp)) {
4735 mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4736 res = check_condition_result;
4737 goto fini;
4738 }
4739
4740 zbc_close_zone(devip, zsp);
4741fini:
7109f370 4742 sdeb_write_unlock(sip);
f0d1cf93
DG
4743 return res;
4744}
4745
4746static void zbc_finish_zone(struct sdebug_dev_info *devip,
4747 struct sdeb_zone_state *zsp, bool empty)
4748{
4749 enum sdebug_z_cond zc = zsp->z_cond;
4750
4751 if (zc == ZC4_CLOSED || zc == ZC2_IMPLICIT_OPEN ||
4752 zc == ZC3_EXPLICIT_OPEN || (empty && zc == ZC1_EMPTY)) {
4753 if (zc == ZC2_IMPLICIT_OPEN || zc == ZC3_EXPLICIT_OPEN)
4754 zbc_close_zone(devip, zsp);
4755 if (zsp->z_cond == ZC4_CLOSED)
4756 devip->nr_closed--;
4757 zsp->z_wp = zsp->z_start + zsp->z_size;
4758 zsp->z_cond = ZC5_FULL;
4759 }
4760}
4761
4762static void zbc_finish_all(struct sdebug_dev_info *devip)
4763{
4764 unsigned int i;
4765
4766 for (i = 0; i < devip->nr_zones; i++)
4767 zbc_finish_zone(devip, &devip->zstate[i], false);
4768}
4769
4770static int resp_finish_zone(struct scsi_cmnd *scp,
4771 struct sdebug_dev_info *devip)
4772{
4773 struct sdeb_zone_state *zsp;
4774 int res = 0;
4775 u64 z_id;
4776 u8 *cmd = scp->cmnd;
4777 bool all = cmd[14] & 0x01;
b6ff8ca7 4778 struct sdeb_store_info *sip = devip2sip(devip, false);
f0d1cf93
DG
4779
4780 if (!sdebug_dev_is_zoned(devip)) {
4781 mk_sense_invalid_opcode(scp);
4782 return check_condition_result;
4783 }
4784
7109f370 4785 sdeb_write_lock(sip);
f0d1cf93
DG
4786
4787 if (all) {
4788 zbc_finish_all(devip);
4789 goto fini;
4790 }
4791
4792 /* Finish the specified zone */
4793 z_id = get_unaligned_be64(cmd + 2);
4794 if (z_id >= sdebug_capacity) {
4795 mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
4796 res = check_condition_result;
4797 goto fini;
4798 }
4799
4800 zsp = zbc_zone(devip, z_id);
4801 if (z_id != zsp->z_start) {
4802 mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4803 res = check_condition_result;
4804 goto fini;
4805 }
4806 if (zbc_zone_is_conv(zsp)) {
4807 mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4808 res = check_condition_result;
4809 goto fini;
4810 }
4811
4812 zbc_finish_zone(devip, zsp, true);
4813fini:
7109f370 4814 sdeb_write_unlock(sip);
f0d1cf93
DG
4815 return res;
4816}
4817
4818static void zbc_rwp_zone(struct sdebug_dev_info *devip,
4819 struct sdeb_zone_state *zsp)
4820{
4821 enum sdebug_z_cond zc;
2d62253e 4822 struct sdeb_store_info *sip = devip2sip(devip, false);
f0d1cf93 4823
4a5fc1c6 4824 if (!zbc_zone_is_seq(zsp))
f0d1cf93
DG
4825 return;
4826
4827 zc = zsp->z_cond;
4828 if (zc == ZC2_IMPLICIT_OPEN || zc == ZC3_EXPLICIT_OPEN)
4829 zbc_close_zone(devip, zsp);
4830
4831 if (zsp->z_cond == ZC4_CLOSED)
4832 devip->nr_closed--;
4833
2d62253e
SK
4834 if (zsp->z_wp > zsp->z_start)
4835 memset(sip->storep + zsp->z_start * sdebug_sector_size, 0,
4836 (zsp->z_wp - zsp->z_start) * sdebug_sector_size);
4837
64e14ece 4838 zsp->z_non_seq_resource = false;
f0d1cf93
DG
4839 zsp->z_wp = zsp->z_start;
4840 zsp->z_cond = ZC1_EMPTY;
4841}
4842
4843static void zbc_rwp_all(struct sdebug_dev_info *devip)
4844{
4845 unsigned int i;
4846
4847 for (i = 0; i < devip->nr_zones; i++)
4848 zbc_rwp_zone(devip, &devip->zstate[i]);
4849}
4850
4851static int resp_rwp_zone(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
4852{
4853 struct sdeb_zone_state *zsp;
4854 int res = 0;
4855 u64 z_id;
4856 u8 *cmd = scp->cmnd;
4857 bool all = cmd[14] & 0x01;
b6ff8ca7 4858 struct sdeb_store_info *sip = devip2sip(devip, false);
f0d1cf93
DG
4859
4860 if (!sdebug_dev_is_zoned(devip)) {
4861 mk_sense_invalid_opcode(scp);
4862 return check_condition_result;
4863 }
4864
7109f370 4865 sdeb_write_lock(sip);
f0d1cf93
DG
4866
4867 if (all) {
4868 zbc_rwp_all(devip);
4869 goto fini;
4870 }
4871
4872 z_id = get_unaligned_be64(cmd + 2);
4873 if (z_id >= sdebug_capacity) {
4874 mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
4875 res = check_condition_result;
4876 goto fini;
4877 }
4878
4879 zsp = zbc_zone(devip, z_id);
4880 if (z_id != zsp->z_start) {
4881 mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4882 res = check_condition_result;
4883 goto fini;
4884 }
4885 if (zbc_zone_is_conv(zsp)) {
4886 mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4887 res = check_condition_result;
4888 goto fini;
4889 }
4890
4891 zbc_rwp_zone(devip, zsp);
4892fini:
7109f370 4893 sdeb_write_unlock(sip);
f0d1cf93
DG
4894 return res;
4895}
4896
c4837394
DG
4897static struct sdebug_queue *get_queue(struct scsi_cmnd *cmnd)
4898{
c10fa55f 4899 u16 hwq;
a6e76e6f 4900 u32 tag = blk_mq_unique_tag(scsi_cmd_to_rq(cmnd));
c4837394 4901
f7c4cdc7 4902 hwq = blk_mq_unique_tag_to_hwq(tag);
c10fa55f 4903
f7c4cdc7
JG
4904 pr_debug("tag=%#x, hwq=%d\n", tag, hwq);
4905 if (WARN_ON_ONCE(hwq >= submit_queues))
4906 hwq = 0;
c10fa55f 4907
458df78b 4908 return sdebug_q_arr + hwq;
c4837394
DG
4909}
4910
c10fa55f
JG
4911static u32 get_tag(struct scsi_cmnd *cmnd)
4912{
a6e76e6f 4913 return blk_mq_unique_tag(scsi_cmd_to_rq(cmnd));
c10fa55f
JG
4914}
4915
c4837394 4916/* Queued (deferred) command completions converge here. */
fd32119b 4917static void sdebug_q_cmd_complete(struct sdebug_defer *sd_dp)
1da177e4 4918{
7382f9d8 4919 bool aborted = sd_dp->aborted;
c4837394 4920 int qc_idx;
cbf67842 4921 int retiring = 0;
1da177e4 4922 unsigned long iflags;
c4837394 4923 struct sdebug_queue *sqp;
cbf67842
DG
4924 struct sdebug_queued_cmd *sqcp;
4925 struct scsi_cmnd *scp;
4926 struct sdebug_dev_info *devip;
1da177e4 4927
7382f9d8
DG
4928 if (unlikely(aborted))
4929 sd_dp->aborted = false;
c4837394
DG
4930 qc_idx = sd_dp->qc_idx;
4931 sqp = sdebug_q_arr + sd_dp->sqa_idx;
4932 if (sdebug_statistics) {
4933 atomic_inc(&sdebug_completions);
4934 if (raw_smp_processor_id() != sd_dp->issuing_cpu)
4935 atomic_inc(&sdebug_miss_cpus);
4936 }
4937 if (unlikely((qc_idx < 0) || (qc_idx >= SDEBUG_CANQUEUE))) {
4938 pr_err("wild qc_idx=%d\n", qc_idx);
1da177e4
LT
4939 return;
4940 }
c4837394 4941 spin_lock_irqsave(&sqp->qc_lock, iflags);
d9d23a5a 4942 WRITE_ONCE(sd_dp->defer_t, SDEB_DEFER_NONE);
c4837394 4943 sqcp = &sqp->qc_arr[qc_idx];
cbf67842 4944 scp = sqcp->a_cmnd;
b01f6f83 4945 if (unlikely(scp == NULL)) {
c4837394 4946 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
c10fa55f
JG
4947 pr_err("scp is NULL, sqa_idx=%d, qc_idx=%d, hc_idx=%d\n",
4948 sd_dp->sqa_idx, qc_idx, sd_dp->hc_idx);
cbf67842
DG
4949 return;
4950 }
4951 devip = (struct sdebug_dev_info *)scp->device->hostdata;
f46eb0e9 4952 if (likely(devip))
cbf67842
DG
4953 atomic_dec(&devip->num_in_q);
4954 else
c1287970 4955 pr_err("devip=NULL\n");
f46eb0e9 4956 if (unlikely(atomic_read(&retired_max_queue) > 0))
cbf67842
DG
4957 retiring = 1;
4958
4959 sqcp->a_cmnd = NULL;
c4837394
DG
4960 if (unlikely(!test_and_clear_bit(qc_idx, sqp->in_use_bm))) {
4961 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
c1287970 4962 pr_err("Unexpected completion\n");
1da177e4
LT
4963 return;
4964 }
cbf67842
DG
4965
4966 if (unlikely(retiring)) { /* user has reduced max_queue */
4967 int k, retval;
4968
4969 retval = atomic_read(&retired_max_queue);
c4837394
DG
4970 if (qc_idx >= retval) {
4971 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
c1287970 4972 pr_err("index %d too large\n", retval);
cbf67842
DG
4973 return;
4974 }
c4837394 4975 k = find_last_bit(sqp->in_use_bm, retval);
773642d9 4976 if ((k < sdebug_max_queue) || (k == retval))
cbf67842
DG
4977 atomic_set(&retired_max_queue, 0);
4978 else
4979 atomic_set(&retired_max_queue, k + 1);
1da177e4 4980 }
c4837394 4981 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
7382f9d8
DG
4982 if (unlikely(aborted)) {
4983 if (sdebug_verbose)
4984 pr_info("bypassing scsi_done() due to aborted cmd\n");
4985 return;
4986 }
6c2c7d6a 4987 scsi_done(scp); /* callback to mid level */
1da177e4
LT
4988}
4989
cbf67842 4990/* When high resolution timer goes off this function is called. */
fd32119b 4991static enum hrtimer_restart sdebug_q_cmd_hrt_complete(struct hrtimer *timer)
cbf67842 4992{
a10bc12a
DG
4993 struct sdebug_defer *sd_dp = container_of(timer, struct sdebug_defer,
4994 hrt);
4995 sdebug_q_cmd_complete(sd_dp);
cbf67842
DG
4996 return HRTIMER_NORESTART;
4997}
1da177e4 4998
a10bc12a 4999/* When work queue schedules work, it calls this function. */
fd32119b 5000static void sdebug_q_cmd_wq_complete(struct work_struct *work)
a10bc12a
DG
5001{
5002 struct sdebug_defer *sd_dp = container_of(work, struct sdebug_defer,
5003 ew.work);
5004 sdebug_q_cmd_complete(sd_dp);
5005}
5006
09ba24c1 5007static bool got_shared_uuid;
bf476433 5008static uuid_t shared_uuid;
09ba24c1 5009
f0d1cf93
DG
5010static int sdebug_device_create_zones(struct sdebug_dev_info *devip)
5011{
5012 struct sdeb_zone_state *zsp;
5013 sector_t capacity = get_sdebug_capacity();
4a5fc1c6 5014 sector_t conv_capacity;
f0d1cf93
DG
5015 sector_t zstart = 0;
5016 unsigned int i;
5017
5018 /*
98e0a689
DLM
5019 * Set the zone size: if sdeb_zbc_zone_size_mb is not set, figure out
5020 * a zone size allowing for at least 4 zones on the device. Otherwise,
f0d1cf93
DG
5021 * use the specified zone size checking that at least 2 zones can be
5022 * created for the device.
5023 */
98e0a689 5024 if (!sdeb_zbc_zone_size_mb) {
f0d1cf93
DG
5025 devip->zsize = (DEF_ZBC_ZONE_SIZE_MB * SZ_1M)
5026 >> ilog2(sdebug_sector_size);
5027 while (capacity < devip->zsize << 2 && devip->zsize >= 2)
5028 devip->zsize >>= 1;
5029 if (devip->zsize < 2) {
5030 pr_err("Device capacity too small\n");
5031 return -EINVAL;
5032 }
5033 } else {
108e36f0
DLM
5034 if (!is_power_of_2(sdeb_zbc_zone_size_mb)) {
5035 pr_err("Zone size is not a power of 2\n");
5036 return -EINVAL;
5037 }
98e0a689 5038 devip->zsize = (sdeb_zbc_zone_size_mb * SZ_1M)
f0d1cf93
DG
5039 >> ilog2(sdebug_sector_size);
5040 if (devip->zsize >= capacity) {
5041 pr_err("Zone size too large for device capacity\n");
5042 return -EINVAL;
5043 }
5044 }
5045
108e36f0 5046 devip->zsize_shift = ilog2(devip->zsize);
f0d1cf93
DG
5047 devip->nr_zones = (capacity + devip->zsize - 1) >> devip->zsize_shift;
5048
4a5fc1c6
DLM
5049 if (sdeb_zbc_zone_cap_mb == 0) {
5050 devip->zcap = devip->zsize;
5051 } else {
5052 devip->zcap = (sdeb_zbc_zone_cap_mb * SZ_1M) >>
5053 ilog2(sdebug_sector_size);
5054 if (devip->zcap > devip->zsize) {
5055 pr_err("Zone capacity too large\n");
5056 return -EINVAL;
5057 }
5058 }
5059
5060 conv_capacity = (sector_t)sdeb_zbc_nr_conv << devip->zsize_shift;
5061 if (conv_capacity >= capacity) {
aa8fecf9
DLM
5062 pr_err("Number of conventional zones too large\n");
5063 return -EINVAL;
5064 }
5065 devip->nr_conv_zones = sdeb_zbc_nr_conv;
4a5fc1c6
DLM
5066 devip->nr_seq_zones = ALIGN(capacity - conv_capacity, devip->zsize) >>
5067 devip->zsize_shift;
5068 devip->nr_zones = devip->nr_conv_zones + devip->nr_seq_zones;
5069
5070 /* Add gap zones if zone capacity is smaller than the zone size */
5071 if (devip->zcap < devip->zsize)
5072 devip->nr_zones += devip->nr_seq_zones;
aa8fecf9 5073
64e14ece
DLM
5074 if (devip->zmodel == BLK_ZONED_HM) {
5075 /* zbc_max_open_zones can be 0, meaning "not reported" */
5076 if (sdeb_zbc_max_open >= devip->nr_zones - 1)
5077 devip->max_open = (devip->nr_zones - 1) / 2;
5078 else
5079 devip->max_open = sdeb_zbc_max_open;
5080 }
f0d1cf93
DG
5081
5082 devip->zstate = kcalloc(devip->nr_zones,
5083 sizeof(struct sdeb_zone_state), GFP_KERNEL);
5084 if (!devip->zstate)
5085 return -ENOMEM;
5086
5087 for (i = 0; i < devip->nr_zones; i++) {
5088 zsp = &devip->zstate[i];
5089
5090 zsp->z_start = zstart;
5091
aa8fecf9 5092 if (i < devip->nr_conv_zones) {
35dbe2b9 5093 zsp->z_type = ZBC_ZTYPE_CNV;
f0d1cf93
DG
5094 zsp->z_cond = ZBC_NOT_WRITE_POINTER;
5095 zsp->z_wp = (sector_t)-1;
4a5fc1c6
DLM
5096 zsp->z_size =
5097 min_t(u64, devip->zsize, capacity - zstart);
5098 } else if ((zstart & (devip->zsize - 1)) == 0) {
64e14ece 5099 if (devip->zmodel == BLK_ZONED_HM)
35dbe2b9 5100 zsp->z_type = ZBC_ZTYPE_SWR;
64e14ece 5101 else
35dbe2b9 5102 zsp->z_type = ZBC_ZTYPE_SWP;
f0d1cf93
DG
5103 zsp->z_cond = ZC1_EMPTY;
5104 zsp->z_wp = zsp->z_start;
4a5fc1c6
DLM
5105 zsp->z_size =
5106 min_t(u64, devip->zcap, capacity - zstart);
5107 } else {
5108 zsp->z_type = ZBC_ZTYPE_GAP;
5109 zsp->z_cond = ZBC_NOT_WRITE_POINTER;
5110 zsp->z_wp = (sector_t)-1;
5111 zsp->z_size = min_t(u64, devip->zsize - devip->zcap,
5112 capacity - zstart);
f0d1cf93
DG
5113 }
5114
4a5fc1c6 5115 WARN_ON_ONCE((int)zsp->z_size <= 0);
f0d1cf93
DG
5116 zstart += zsp->z_size;
5117 }
5118
5119 return 0;
5120}
5121
fd32119b
DG
5122static struct sdebug_dev_info *sdebug_device_create(
5123 struct sdebug_host_info *sdbg_host, gfp_t flags)
5cb2fc06
FT
5124{
5125 struct sdebug_dev_info *devip;
5126
5127 devip = kzalloc(sizeof(*devip), flags);
5128 if (devip) {
09ba24c1 5129 if (sdebug_uuid_ctl == 1)
bf476433 5130 uuid_gen(&devip->lu_name);
09ba24c1
DG
5131 else if (sdebug_uuid_ctl == 2) {
5132 if (got_shared_uuid)
5133 devip->lu_name = shared_uuid;
5134 else {
bf476433 5135 uuid_gen(&shared_uuid);
09ba24c1
DG
5136 got_shared_uuid = true;
5137 devip->lu_name = shared_uuid;
5138 }
5139 }
5cb2fc06 5140 devip->sdbg_host = sdbg_host;
f0d1cf93 5141 if (sdeb_zbc_in_use) {
64e14ece 5142 devip->zmodel = sdeb_zbc_model;
f0d1cf93
DG
5143 if (sdebug_device_create_zones(devip)) {
5144 kfree(devip);
5145 return NULL;
5146 }
64e14ece
DLM
5147 } else {
5148 devip->zmodel = BLK_ZONED_NONE;
f0d1cf93
DG
5149 }
5150 devip->sdbg_host = sdbg_host;
fc13638a
DG
5151 devip->create_ts = ktime_get_boottime();
5152 atomic_set(&devip->stopped, (sdeb_tur_ms_to_ready > 0 ? 2 : 0));
5cb2fc06
FT
5153 list_add_tail(&devip->dev_list, &sdbg_host->dev_info_list);
5154 }
5155 return devip;
5156}
5157
f46eb0e9 5158static struct sdebug_dev_info *find_build_dev_info(struct scsi_device *sdev)
1da177e4 5159{
f46eb0e9
DG
5160 struct sdebug_host_info *sdbg_host;
5161 struct sdebug_dev_info *open_devip = NULL;
5162 struct sdebug_dev_info *devip;
1da177e4 5163
d1e4c9c5
FT
5164 sdbg_host = *(struct sdebug_host_info **)shost_priv(sdev->host);
5165 if (!sdbg_host) {
c1287970 5166 pr_err("Host info NULL\n");
1da177e4 5167 return NULL;
9a051019 5168 }
ad0c7775 5169
1da177e4
LT
5170 list_for_each_entry(devip, &sdbg_host->dev_info_list, dev_list) {
5171 if ((devip->used) && (devip->channel == sdev->channel) &&
9a051019
DG
5172 (devip->target == sdev->id) &&
5173 (devip->lun == sdev->lun))
5174 return devip;
1da177e4
LT
5175 else {
5176 if ((!devip->used) && (!open_devip))
5177 open_devip = devip;
5178 }
5179 }
5cb2fc06
FT
5180 if (!open_devip) { /* try and make a new one */
5181 open_devip = sdebug_device_create(sdbg_host, GFP_ATOMIC);
5182 if (!open_devip) {
c1287970 5183 pr_err("out of memory at line %d\n", __LINE__);
1da177e4
LT
5184 return NULL;
5185 }
1da177e4 5186 }
a75869d1
FT
5187
5188 open_devip->channel = sdev->channel;
5189 open_devip->target = sdev->id;
5190 open_devip->lun = sdev->lun;
5191 open_devip->sdbg_host = sdbg_host;
cbf67842 5192 atomic_set(&open_devip->num_in_q, 0);
500d0d24 5193 set_bit(SDEBUG_UA_POOCCUR, open_devip->uas_bm);
c2248fc9 5194 open_devip->used = true;
a75869d1 5195 return open_devip;
1da177e4
LT
5196}
5197
8dea0d02 5198static int scsi_debug_slave_alloc(struct scsi_device *sdp)
1da177e4 5199{
773642d9 5200 if (sdebug_verbose)
c1287970 5201 pr_info("slave_alloc <%u %u %u %llu>\n",
8dea0d02 5202 sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
8dea0d02
FT
5203 return 0;
5204}
1da177e4 5205
8dea0d02
FT
5206static int scsi_debug_slave_configure(struct scsi_device *sdp)
5207{
f46eb0e9
DG
5208 struct sdebug_dev_info *devip =
5209 (struct sdebug_dev_info *)sdp->hostdata;
a34c4e98 5210
773642d9 5211 if (sdebug_verbose)
c1287970 5212 pr_info("slave_configure <%u %u %u %llu>\n",
8dea0d02 5213 sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
b01f6f83
DG
5214 if (sdp->host->max_cmd_len != SDEBUG_MAX_CMD_LEN)
5215 sdp->host->max_cmd_len = SDEBUG_MAX_CMD_LEN;
5216 if (devip == NULL) {
f46eb0e9 5217 devip = find_build_dev_info(sdp);
b01f6f83 5218 if (devip == NULL)
f46eb0e9
DG
5219 return 1; /* no resources, will be marked offline */
5220 }
c8b09f6f 5221 sdp->hostdata = devip;
773642d9 5222 if (sdebug_no_uld)
78d4e5a0 5223 sdp->no_uld_attach = 1;
9b760fd8 5224 config_cdb_len(sdp);
8dea0d02
FT
5225 return 0;
5226}
5227
5228static void scsi_debug_slave_destroy(struct scsi_device *sdp)
5229{
5230 struct sdebug_dev_info *devip =
5231 (struct sdebug_dev_info *)sdp->hostdata;
a34c4e98 5232
773642d9 5233 if (sdebug_verbose)
c1287970 5234 pr_info("slave_destroy <%u %u %u %llu>\n",
8dea0d02
FT
5235 sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
5236 if (devip) {
25985edc 5237 /* make this slot available for re-use */
c2248fc9 5238 devip->used = false;
8dea0d02
FT
5239 sdp->hostdata = NULL;
5240 }
5241}
5242
10bde980
DG
5243static void stop_qc_helper(struct sdebug_defer *sd_dp,
5244 enum sdeb_defer_type defer_t)
c4837394
DG
5245{
5246 if (!sd_dp)
5247 return;
10bde980 5248 if (defer_t == SDEB_DEFER_HRT)
c4837394 5249 hrtimer_cancel(&sd_dp->hrt);
10bde980 5250 else if (defer_t == SDEB_DEFER_WQ)
c4837394
DG
5251 cancel_work_sync(&sd_dp->ew.work);
5252}
5253
a10bc12a
DG
5254/* If @cmnd found deletes its timer or work queue and returns true; else
5255 returns false */
5256static bool stop_queued_cmnd(struct scsi_cmnd *cmnd)
8dea0d02
FT
5257{
5258 unsigned long iflags;
c4837394 5259 int j, k, qmax, r_qmax;
10bde980 5260 enum sdeb_defer_type l_defer_t;
c4837394 5261 struct sdebug_queue *sqp;
8dea0d02 5262 struct sdebug_queued_cmd *sqcp;
cbf67842 5263 struct sdebug_dev_info *devip;
a10bc12a 5264 struct sdebug_defer *sd_dp;
8dea0d02 5265
c4837394
DG
5266 for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
5267 spin_lock_irqsave(&sqp->qc_lock, iflags);
5268 qmax = sdebug_max_queue;
5269 r_qmax = atomic_read(&retired_max_queue);
5270 if (r_qmax > qmax)
5271 qmax = r_qmax;
5272 for (k = 0; k < qmax; ++k) {
5273 if (test_bit(k, sqp->in_use_bm)) {
5274 sqcp = &sqp->qc_arr[k];
5275 if (cmnd != sqcp->a_cmnd)
5276 continue;
5277 /* found */
5278 devip = (struct sdebug_dev_info *)
5279 cmnd->device->hostdata;
5280 if (devip)
5281 atomic_dec(&devip->num_in_q);
5282 sqcp->a_cmnd = NULL;
5283 sd_dp = sqcp->sd_dp;
10bde980 5284 if (sd_dp) {
d9d23a5a
DG
5285 l_defer_t = READ_ONCE(sd_dp->defer_t);
5286 WRITE_ONCE(sd_dp->defer_t, SDEB_DEFER_NONE);
10bde980
DG
5287 } else
5288 l_defer_t = SDEB_DEFER_NONE;
c4837394 5289 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
10bde980 5290 stop_qc_helper(sd_dp, l_defer_t);
c4837394
DG
5291 clear_bit(k, sqp->in_use_bm);
5292 return true;
cbf67842 5293 }
8dea0d02 5294 }
c4837394 5295 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
8dea0d02 5296 }
a10bc12a 5297 return false;
8dea0d02
FT
5298}
5299
a10bc12a 5300/* Deletes (stops) timers or work queues of all queued commands */
f19fe8f3 5301static void stop_all_queued(void)
8dea0d02
FT
5302{
5303 unsigned long iflags;
c4837394 5304 int j, k;
10bde980 5305 enum sdeb_defer_type l_defer_t;
c4837394 5306 struct sdebug_queue *sqp;
8dea0d02 5307 struct sdebug_queued_cmd *sqcp;
cbf67842 5308 struct sdebug_dev_info *devip;
a10bc12a 5309 struct sdebug_defer *sd_dp;
8dea0d02 5310
c4837394
DG
5311 for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
5312 spin_lock_irqsave(&sqp->qc_lock, iflags);
5313 for (k = 0; k < SDEBUG_CANQUEUE; ++k) {
5314 if (test_bit(k, sqp->in_use_bm)) {
5315 sqcp = &sqp->qc_arr[k];
f19fe8f3 5316 if (sqcp->a_cmnd == NULL)
c4837394
DG
5317 continue;
5318 devip = (struct sdebug_dev_info *)
5319 sqcp->a_cmnd->device->hostdata;
5320 if (devip)
5321 atomic_dec(&devip->num_in_q);
5322 sqcp->a_cmnd = NULL;
5323 sd_dp = sqcp->sd_dp;
10bde980 5324 if (sd_dp) {
d9d23a5a
DG
5325 l_defer_t = READ_ONCE(sd_dp->defer_t);
5326 WRITE_ONCE(sd_dp->defer_t, SDEB_DEFER_NONE);
10bde980
DG
5327 } else
5328 l_defer_t = SDEB_DEFER_NONE;
c4837394 5329 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
10bde980 5330 stop_qc_helper(sd_dp, l_defer_t);
c4837394
DG
5331 clear_bit(k, sqp->in_use_bm);
5332 spin_lock_irqsave(&sqp->qc_lock, iflags);
cbf67842 5333 }
8dea0d02 5334 }
c4837394 5335 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
8dea0d02 5336 }
1da177e4
LT
5337}
5338
cbf67842
DG
5339/* Free queued command memory on heap */
5340static void free_all_queued(void)
1da177e4 5341{
c4837394
DG
5342 int j, k;
5343 struct sdebug_queue *sqp;
cbf67842
DG
5344 struct sdebug_queued_cmd *sqcp;
5345
c4837394
DG
5346 for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
5347 for (k = 0; k < SDEBUG_CANQUEUE; ++k) {
5348 sqcp = &sqp->qc_arr[k];
5349 kfree(sqcp->sd_dp);
5350 sqcp->sd_dp = NULL;
5351 }
cbf67842 5352 }
1da177e4
LT
5353}
5354
cbf67842 5355static int scsi_debug_abort(struct scsi_cmnd *SCpnt)
1da177e4 5356{
a10bc12a
DG
5357 bool ok;
5358
cbf67842
DG
5359 ++num_aborts;
5360 if (SCpnt) {
a10bc12a
DG
5361 ok = stop_queued_cmnd(SCpnt);
5362 if (SCpnt->device && (SDEBUG_OPT_ALL_NOISE & sdebug_opts))
5363 sdev_printk(KERN_INFO, SCpnt->device,
5364 "%s: command%s found\n", __func__,
5365 ok ? "" : " not");
cbf67842
DG
5366 }
5367 return SUCCESS;
1da177e4
LT
5368}
5369
91d4c752 5370static int scsi_debug_device_reset(struct scsi_cmnd *SCpnt)
1da177e4 5371{
1da177e4 5372 ++num_dev_resets;
cbf67842
DG
5373 if (SCpnt && SCpnt->device) {
5374 struct scsi_device *sdp = SCpnt->device;
f46eb0e9
DG
5375 struct sdebug_dev_info *devip =
5376 (struct sdebug_dev_info *)sdp->hostdata;
cbf67842 5377
773642d9 5378 if (SDEBUG_OPT_ALL_NOISE & sdebug_opts)
cbf67842 5379 sdev_printk(KERN_INFO, sdp, "%s\n", __func__);
1da177e4 5380 if (devip)
cbf67842
DG
5381 set_bit(SDEBUG_UA_POR, devip->uas_bm);
5382 }
5383 return SUCCESS;
5384}
5385
5386static int scsi_debug_target_reset(struct scsi_cmnd *SCpnt)
5387{
5388 struct sdebug_host_info *sdbg_host;
5389 struct sdebug_dev_info *devip;
5390 struct scsi_device *sdp;
5391 struct Scsi_Host *hp;
5392 int k = 0;
5393
5394 ++num_target_resets;
5395 if (!SCpnt)
5396 goto lie;
5397 sdp = SCpnt->device;
5398 if (!sdp)
5399 goto lie;
773642d9 5400 if (SDEBUG_OPT_ALL_NOISE & sdebug_opts)
cbf67842
DG
5401 sdev_printk(KERN_INFO, sdp, "%s\n", __func__);
5402 hp = sdp->host;
5403 if (!hp)
5404 goto lie;
5405 sdbg_host = *(struct sdebug_host_info **)shost_priv(hp);
5406 if (sdbg_host) {
5407 list_for_each_entry(devip,
5408 &sdbg_host->dev_info_list,
5409 dev_list)
5410 if (devip->target == sdp->id) {
5411 set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
5412 ++k;
5413 }
1da177e4 5414 }
773642d9 5415 if (SDEBUG_OPT_RESET_NOISE & sdebug_opts)
cbf67842
DG
5416 sdev_printk(KERN_INFO, sdp,
5417 "%s: %d device(s) found in target\n", __func__, k);
5418lie:
1da177e4
LT
5419 return SUCCESS;
5420}
5421
91d4c752 5422static int scsi_debug_bus_reset(struct scsi_cmnd *SCpnt)
1da177e4
LT
5423{
5424 struct sdebug_host_info *sdbg_host;
cbf67842 5425 struct sdebug_dev_info *devip;
9a051019
DG
5426 struct scsi_device *sdp;
5427 struct Scsi_Host *hp;
cbf67842 5428 int k = 0;
1da177e4 5429
1da177e4 5430 ++num_bus_resets;
cbf67842
DG
5431 if (!(SCpnt && SCpnt->device))
5432 goto lie;
5433 sdp = SCpnt->device;
773642d9 5434 if (SDEBUG_OPT_ALL_NOISE & sdebug_opts)
cbf67842
DG
5435 sdev_printk(KERN_INFO, sdp, "%s\n", __func__);
5436 hp = sdp->host;
5437 if (hp) {
d1e4c9c5 5438 sdbg_host = *(struct sdebug_host_info **)shost_priv(hp);
1da177e4 5439 if (sdbg_host) {
cbf67842 5440 list_for_each_entry(devip,
9a051019 5441 &sdbg_host->dev_info_list,
cbf67842
DG
5442 dev_list) {
5443 set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
5444 ++k;
5445 }
1da177e4
LT
5446 }
5447 }
773642d9 5448 if (SDEBUG_OPT_RESET_NOISE & sdebug_opts)
cbf67842
DG
5449 sdev_printk(KERN_INFO, sdp,
5450 "%s: %d device(s) found in host\n", __func__, k);
5451lie:
1da177e4
LT
5452 return SUCCESS;
5453}
5454
91d4c752 5455static int scsi_debug_host_reset(struct scsi_cmnd *SCpnt)
1da177e4 5456{
91d4c752 5457 struct sdebug_host_info *sdbg_host;
cbf67842
DG
5458 struct sdebug_dev_info *devip;
5459 int k = 0;
1da177e4 5460
1da177e4 5461 ++num_host_resets;
773642d9 5462 if ((SCpnt->device) && (SDEBUG_OPT_ALL_NOISE & sdebug_opts))
cbf67842 5463 sdev_printk(KERN_INFO, SCpnt->device, "%s\n", __func__);
9a051019
DG
5464 spin_lock(&sdebug_host_list_lock);
5465 list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
cbf67842
DG
5466 list_for_each_entry(devip, &sdbg_host->dev_info_list,
5467 dev_list) {
5468 set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
5469 ++k;
5470 }
9a051019
DG
5471 }
5472 spin_unlock(&sdebug_host_list_lock);
f19fe8f3 5473 stop_all_queued();
773642d9 5474 if (SDEBUG_OPT_RESET_NOISE & sdebug_opts)
cbf67842
DG
5475 sdev_printk(KERN_INFO, SCpnt->device,
5476 "%s: %d device(s) found\n", __func__, k);
1da177e4
LT
5477 return SUCCESS;
5478}
5479
87c715dc 5480static void sdebug_build_parts(unsigned char *ramp, unsigned long store_size)
1da177e4 5481{
1442f76d 5482 struct msdos_partition *pp;
979e0dc3 5483 int starts[SDEBUG_MAX_PARTS + 2], max_part_secs;
1da177e4
LT
5484 int sectors_per_part, num_sectors, k;
5485 int heads_by_sects, start_sec, end_sec;
5486
5487 /* assume partition table already zeroed */
773642d9 5488 if ((sdebug_num_parts < 1) || (store_size < 1048576))
1da177e4 5489 return;
773642d9
DG
5490 if (sdebug_num_parts > SDEBUG_MAX_PARTS) {
5491 sdebug_num_parts = SDEBUG_MAX_PARTS;
c1287970 5492 pr_warn("reducing partitions to %d\n", SDEBUG_MAX_PARTS);
1da177e4 5493 }
8c657235 5494 num_sectors = (int)get_sdebug_capacity();
1da177e4 5495 sectors_per_part = (num_sectors - sdebug_sectors_per)
773642d9 5496 / sdebug_num_parts;
1da177e4 5497 heads_by_sects = sdebug_heads * sdebug_sectors_per;
9a051019 5498 starts[0] = sdebug_sectors_per;
979e0dc3
JP
5499 max_part_secs = sectors_per_part;
5500 for (k = 1; k < sdebug_num_parts; ++k) {
1da177e4
LT
5501 starts[k] = ((k * sectors_per_part) / heads_by_sects)
5502 * heads_by_sects;
979e0dc3
JP
5503 if (starts[k] - starts[k - 1] < max_part_secs)
5504 max_part_secs = starts[k] - starts[k - 1];
5505 }
773642d9
DG
5506 starts[sdebug_num_parts] = num_sectors;
5507 starts[sdebug_num_parts + 1] = 0;
1da177e4
LT
5508
5509 ramp[510] = 0x55; /* magic partition markings */
5510 ramp[511] = 0xAA;
1442f76d 5511 pp = (struct msdos_partition *)(ramp + 0x1be);
1da177e4
LT
5512 for (k = 0; starts[k + 1]; ++k, ++pp) {
5513 start_sec = starts[k];
979e0dc3 5514 end_sec = starts[k] + max_part_secs - 1;
1da177e4
LT
5515 pp->boot_ind = 0;
5516
5517 pp->cyl = start_sec / heads_by_sects;
5518 pp->head = (start_sec - (pp->cyl * heads_by_sects))
5519 / sdebug_sectors_per;
5520 pp->sector = (start_sec % sdebug_sectors_per) + 1;
5521
5522 pp->end_cyl = end_sec / heads_by_sects;
5523 pp->end_head = (end_sec - (pp->end_cyl * heads_by_sects))
5524 / sdebug_sectors_per;
5525 pp->end_sector = (end_sec % sdebug_sectors_per) + 1;
5526
150c3544
AM
5527 pp->start_sect = cpu_to_le32(start_sec);
5528 pp->nr_sects = cpu_to_le32(end_sec - start_sec + 1);
1da177e4
LT
5529 pp->sys_ind = 0x83; /* plain Linux partition */
5530 }
5531}
5532
f19fe8f3 5533static void block_unblock_all_queues(bool block)
c4837394
DG
5534{
5535 int j;
5536 struct sdebug_queue *sqp;
5537
5538 for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp)
f19fe8f3 5539 atomic_set(&sqp->blocked, (int)block);
c4837394
DG
5540}
5541
5542/* Adjust (by rounding down) the sdebug_cmnd_count so abs(every_nth)-1
5543 * commands will be processed normally before triggers occur.
5544 */
5545static void tweak_cmnd_count(void)
5546{
5547 int count, modulo;
5548
5549 modulo = abs(sdebug_every_nth);
5550 if (modulo < 2)
5551 return;
f19fe8f3 5552 block_unblock_all_queues(true);
c4837394
DG
5553 count = atomic_read(&sdebug_cmnd_count);
5554 atomic_set(&sdebug_cmnd_count, (count / modulo) * modulo);
f19fe8f3 5555 block_unblock_all_queues(false);
c4837394
DG
5556}
5557
5558static void clear_queue_stats(void)
5559{
5560 atomic_set(&sdebug_cmnd_count, 0);
5561 atomic_set(&sdebug_completions, 0);
5562 atomic_set(&sdebug_miss_cpus, 0);
5563 atomic_set(&sdebug_a_tsf, 0);
5564}
5565
3a90a63d 5566static bool inject_on_this_cmd(void)
c4837394 5567{
3a90a63d
DG
5568 if (sdebug_every_nth == 0)
5569 return false;
5570 return (atomic_read(&sdebug_cmnd_count) % abs(sdebug_every_nth)) == 0;
c4837394
DG
5571}
5572
a2aede97
DG
5573#define INCLUSIVE_TIMING_MAX_NS 1000000 /* 1 millisecond */
5574
c4837394
DG
5575/* Complete the processing of the thread that queued a SCSI command to this
5576 * driver. It either completes the command by calling cmnd_done() or
5577 * schedules a hr timer or work queue then returns 0. Returns
5578 * SCSI_MLQUEUE_HOST_BUSY if temporarily out of resources.
5579 */
fd32119b 5580static int schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip,
f66b8517 5581 int scsi_result,
f19fe8f3
BVA
5582 int (*pfp)(struct scsi_cmnd *,
5583 struct sdebug_dev_info *),
f66b8517 5584 int delta_jiff, int ndelay)
1da177e4 5585{
a2aede97 5586 bool new_sd_dp;
3a90a63d 5587 bool inject = false;
6ce913fe 5588 bool polled = scsi_cmd_to_rq(cmnd)->cmd_flags & REQ_POLLED;
3a90a63d 5589 int k, num_in_q, qdepth;
a2aede97
DG
5590 unsigned long iflags;
5591 u64 ns_from_boot = 0;
c4837394
DG
5592 struct sdebug_queue *sqp;
5593 struct sdebug_queued_cmd *sqcp;
299b6c07 5594 struct scsi_device *sdp;
a10bc12a 5595 struct sdebug_defer *sd_dp;
299b6c07 5596
b01f6f83
DG
5597 if (unlikely(devip == NULL)) {
5598 if (scsi_result == 0)
f46eb0e9
DG
5599 scsi_result = DID_NO_CONNECT << 16;
5600 goto respond_in_thread;
cbf67842 5601 }
299b6c07
TW
5602 sdp = cmnd->device;
5603
f19fe8f3 5604 if (delta_jiff == 0)
cd62b7da 5605 goto respond_in_thread;
1da177e4 5606
c4837394
DG
5607 sqp = get_queue(cmnd);
5608 spin_lock_irqsave(&sqp->qc_lock, iflags);
5609 if (unlikely(atomic_read(&sqp->blocked))) {
5610 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5611 return SCSI_MLQUEUE_HOST_BUSY;
5612 }
cbf67842
DG
5613 num_in_q = atomic_read(&devip->num_in_q);
5614 qdepth = cmnd->device->queue_depth;
f46eb0e9 5615 if (unlikely((qdepth > 0) && (num_in_q >= qdepth))) {
cd62b7da 5616 if (scsi_result) {
c4837394 5617 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
cd62b7da
DG
5618 goto respond_in_thread;
5619 } else
5620 scsi_result = device_qfull_result;
c4837394 5621 } else if (unlikely(sdebug_every_nth &&
f46eb0e9
DG
5622 (SDEBUG_OPT_RARE_TSF & sdebug_opts) &&
5623 (scsi_result == 0))) {
cbf67842
DG
5624 if ((num_in_q == (qdepth - 1)) &&
5625 (atomic_inc_return(&sdebug_a_tsf) >=
773642d9 5626 abs(sdebug_every_nth))) {
cbf67842 5627 atomic_set(&sdebug_a_tsf, 0);
3a90a63d 5628 inject = true;
cd62b7da 5629 scsi_result = device_qfull_result;
1da177e4
LT
5630 }
5631 }
1da177e4 5632
c4837394 5633 k = find_first_zero_bit(sqp->in_use_bm, sdebug_max_queue);
f46eb0e9 5634 if (unlikely(k >= sdebug_max_queue)) {
c4837394 5635 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
cd62b7da
DG
5636 if (scsi_result)
5637 goto respond_in_thread;
7d5a129b 5638 scsi_result = device_qfull_result;
773642d9 5639 if (SDEBUG_OPT_Q_NOISE & sdebug_opts)
7d5a129b
DG
5640 sdev_printk(KERN_INFO, sdp, "%s: max_queue=%d exceeded: TASK SET FULL\n",
5641 __func__, sdebug_max_queue);
5642 goto respond_in_thread;
cbf67842 5643 }
74595c04 5644 set_bit(k, sqp->in_use_bm);
cbf67842 5645 atomic_inc(&devip->num_in_q);
c4837394 5646 sqcp = &sqp->qc_arr[k];
cbf67842 5647 sqcp->a_cmnd = cmnd;
c4837394 5648 cmnd->host_scribble = (unsigned char *)sqcp;
a10bc12a 5649 sd_dp = sqcp->sd_dp;
c4837394 5650 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
c4b57d89 5651
74595c04 5652 if (!sd_dp) {
10bde980 5653 sd_dp = kzalloc(sizeof(*sd_dp), GFP_ATOMIC);
74595c04
DG
5654 if (!sd_dp) {
5655 atomic_dec(&devip->num_in_q);
5656 clear_bit(k, sqp->in_use_bm);
10bde980 5657 return SCSI_MLQUEUE_HOST_BUSY;
74595c04 5658 }
a2aede97
DG
5659 new_sd_dp = true;
5660 } else {
5661 new_sd_dp = false;
10bde980 5662 }
f66b8517 5663
c10fa55f
JG
5664 /* Set the hostwide tag */
5665 if (sdebug_host_max_queue)
5666 sd_dp->hc_idx = get_tag(cmnd);
5667
6ce913fe 5668 if (polled)
a2aede97
DG
5669 ns_from_boot = ktime_get_boottime_ns();
5670
5671 /* one of the resp_*() response functions is called here */
3a90a63d 5672 cmnd->result = pfp ? pfp(cmnd, devip) : 0;
f66b8517 5673 if (cmnd->result & SDEG_RES_IMMED_MASK) {
f66b8517
MW
5674 cmnd->result &= ~SDEG_RES_IMMED_MASK;
5675 delta_jiff = ndelay = 0;
5676 }
5677 if (cmnd->result == 0 && scsi_result != 0)
5678 cmnd->result = scsi_result;
3a90a63d
DG
5679 if (cmnd->result == 0 && unlikely(sdebug_opts & SDEBUG_OPT_TRANSPORT_ERR)) {
5680 if (atomic_read(&sdeb_inject_pending)) {
5681 mk_sense_buffer(cmnd, ABORTED_COMMAND, TRANSPORT_PROBLEM, ACK_NAK_TO);
5682 atomic_set(&sdeb_inject_pending, 0);
5683 cmnd->result = check_condition_result;
5684 }
5685 }
f66b8517
MW
5686
5687 if (unlikely(sdebug_verbose && cmnd->result))
5688 sdev_printk(KERN_INFO, sdp, "%s: non-zero result=0x%x\n",
5689 __func__, cmnd->result);
5690
10bde980 5691 if (delta_jiff > 0 || ndelay > 0) {
b333a819 5692 ktime_t kt;
cbf67842 5693
b333a819 5694 if (delta_jiff > 0) {
0c4bc91d
DG
5695 u64 ns = jiffies_to_nsecs(delta_jiff);
5696
5697 if (sdebug_random && ns < U32_MAX) {
5698 ns = prandom_u32_max((u32)ns);
5699 } else if (sdebug_random) {
5700 ns >>= 12; /* scale to 4 usec precision */
5701 if (ns < U32_MAX) /* over 4 hours max */
5702 ns = prandom_u32_max((u32)ns);
5703 ns <<= 12;
5704 }
5705 kt = ns_to_ktime(ns);
5706 } else { /* ndelay has a 4.2 second max */
5707 kt = sdebug_random ? prandom_u32_max((u32)ndelay) :
5708 (u32)ndelay;
a2aede97
DG
5709 if (ndelay < INCLUSIVE_TIMING_MAX_NS) {
5710 u64 d = ktime_get_boottime_ns() - ns_from_boot;
5711
5712 if (kt <= d) { /* elapsed duration >= kt */
223f91b4 5713 spin_lock_irqsave(&sqp->qc_lock, iflags);
a2aede97
DG
5714 sqcp->a_cmnd = NULL;
5715 atomic_dec(&devip->num_in_q);
5716 clear_bit(k, sqp->in_use_bm);
223f91b4 5717 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
a2aede97
DG
5718 if (new_sd_dp)
5719 kfree(sd_dp);
5720 /* call scsi_done() from this thread */
6c2c7d6a 5721 scsi_done(cmnd);
a2aede97
DG
5722 return 0;
5723 }
5724 /* otherwise reduce kt by elapsed time */
5725 kt -= d;
5726 }
0c4bc91d 5727 }
6ce913fe 5728 if (polled) {
771f712b 5729 sd_dp->cmpl_ts = ktime_add(ns_to_ktime(ns_from_boot), kt);
4a0c6f43
DG
5730 spin_lock_irqsave(&sqp->qc_lock, iflags);
5731 if (!sd_dp->init_poll) {
5732 sd_dp->init_poll = true;
5733 sqcp->sd_dp = sd_dp;
5734 sd_dp->sqa_idx = sqp - sdebug_q_arr;
5735 sd_dp->qc_idx = k;
5736 }
d9d23a5a 5737 WRITE_ONCE(sd_dp->defer_t, SDEB_DEFER_POLL);
4a0c6f43
DG
5738 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5739 } else {
5740 if (!sd_dp->init_hrt) {
5741 sd_dp->init_hrt = true;
5742 sqcp->sd_dp = sd_dp;
5743 hrtimer_init(&sd_dp->hrt, CLOCK_MONOTONIC,
5744 HRTIMER_MODE_REL_PINNED);
5745 sd_dp->hrt.function = sdebug_q_cmd_hrt_complete;
5746 sd_dp->sqa_idx = sqp - sdebug_q_arr;
5747 sd_dp->qc_idx = k;
5748 }
d9d23a5a 5749 WRITE_ONCE(sd_dp->defer_t, SDEB_DEFER_HRT);
4a0c6f43
DG
5750 /* schedule the invocation of scsi_done() for a later time */
5751 hrtimer_start(&sd_dp->hrt, kt, HRTIMER_MODE_REL_PINNED);
1da177e4 5752 }
c4837394
DG
5753 if (sdebug_statistics)
5754 sd_dp->issuing_cpu = raw_smp_processor_id();
c4837394 5755 } else { /* jdelay < 0, use work queue */
3a90a63d
DG
5756 if (unlikely((sdebug_opts & SDEBUG_OPT_CMD_ABORT) &&
5757 atomic_read(&sdeb_inject_pending)))
7382f9d8 5758 sd_dp->aborted = true;
6ce913fe 5759 if (polled) {
771f712b 5760 sd_dp->cmpl_ts = ns_to_ktime(ns_from_boot);
4a0c6f43
DG
5761 spin_lock_irqsave(&sqp->qc_lock, iflags);
5762 if (!sd_dp->init_poll) {
5763 sd_dp->init_poll = true;
5764 sqcp->sd_dp = sd_dp;
5765 sd_dp->sqa_idx = sqp - sdebug_q_arr;
5766 sd_dp->qc_idx = k;
5767 }
d9d23a5a 5768 WRITE_ONCE(sd_dp->defer_t, SDEB_DEFER_POLL);
4a0c6f43
DG
5769 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5770 } else {
5771 if (!sd_dp->init_wq) {
5772 sd_dp->init_wq = true;
5773 sqcp->sd_dp = sd_dp;
5774 sd_dp->sqa_idx = sqp - sdebug_q_arr;
5775 sd_dp->qc_idx = k;
5776 INIT_WORK(&sd_dp->ew.work, sdebug_q_cmd_wq_complete);
5777 }
d9d23a5a 5778 WRITE_ONCE(sd_dp->defer_t, SDEB_DEFER_WQ);
4a0c6f43
DG
5779 schedule_work(&sd_dp->ew.work);
5780 }
5781 if (sdebug_statistics)
5782 sd_dp->issuing_cpu = raw_smp_processor_id();
5783 if (unlikely(sd_dp->aborted)) {
a6e76e6f
BVA
5784 sdev_printk(KERN_INFO, sdp, "abort request tag %d\n",
5785 scsi_cmd_to_rq(cmnd)->tag);
5786 blk_abort_request(scsi_cmd_to_rq(cmnd));
3a90a63d 5787 atomic_set(&sdeb_inject_pending, 0);
4a0c6f43 5788 sd_dp->aborted = false;
7382f9d8 5789 }
1da177e4 5790 }
3a90a63d
DG
5791 if (unlikely((SDEBUG_OPT_Q_NOISE & sdebug_opts) && scsi_result == device_qfull_result))
5792 sdev_printk(KERN_INFO, sdp, "%s: num_in_q=%d +1, %s%s\n", __func__,
5793 num_in_q, (inject ? "<inject> " : ""), "status: TASK SET FULL");
cbf67842 5794 return 0;
cd62b7da
DG
5795
5796respond_in_thread: /* call back to mid-layer using invocation thread */
f66b8517
MW
5797 cmnd->result = pfp != NULL ? pfp(cmnd, devip) : 0;
5798 cmnd->result &= ~SDEG_RES_IMMED_MASK;
f19fe8f3 5799 if (cmnd->result == 0 && scsi_result != 0)
f66b8517 5800 cmnd->result = scsi_result;
6c2c7d6a 5801 scsi_done(cmnd);
cd62b7da 5802 return 0;
1da177e4 5803}
cbf67842 5804
23183910
DG
5805/* Note: The following macros create attribute files in the
5806 /sys/module/scsi_debug/parameters directory. Unfortunately this
5807 driver is unaware of a change and cannot trigger auxiliary actions
5808 as it can when the corresponding attribute in the
5809 /sys/bus/pseudo/drivers/scsi_debug directory is changed.
5810 */
773642d9
DG
5811module_param_named(add_host, sdebug_add_host, int, S_IRUGO | S_IWUSR);
5812module_param_named(ato, sdebug_ato, int, S_IRUGO);
9b760fd8 5813module_param_named(cdb_len, sdebug_cdb_len, int, 0644);
773642d9 5814module_param_named(clustering, sdebug_clustering, bool, S_IRUGO | S_IWUSR);
c2206098 5815module_param_named(delay, sdebug_jdelay, int, S_IRUGO | S_IWUSR);
773642d9
DG
5816module_param_named(dev_size_mb, sdebug_dev_size_mb, int, S_IRUGO);
5817module_param_named(dif, sdebug_dif, int, S_IRUGO);
5818module_param_named(dix, sdebug_dix, int, S_IRUGO);
5819module_param_named(dsense, sdebug_dsense, int, S_IRUGO | S_IWUSR);
5820module_param_named(every_nth, sdebug_every_nth, int, S_IRUGO | S_IWUSR);
5821module_param_named(fake_rw, sdebug_fake_rw, int, S_IRUGO | S_IWUSR);
5822module_param_named(guard, sdebug_guard, uint, S_IRUGO);
5823module_param_named(host_lock, sdebug_host_lock, bool, S_IRUGO | S_IWUSR);
c10fa55f 5824module_param_named(host_max_queue, sdebug_host_max_queue, int, S_IRUGO);
e5203cf0 5825module_param_string(inq_product, sdebug_inq_product_id,
5d807076 5826 sizeof(sdebug_inq_product_id), S_IRUGO | S_IWUSR);
e5203cf0 5827module_param_string(inq_rev, sdebug_inq_product_rev,
5d807076
DG
5828 sizeof(sdebug_inq_product_rev), S_IRUGO | S_IWUSR);
5829module_param_string(inq_vendor, sdebug_inq_vendor_id,
5830 sizeof(sdebug_inq_vendor_id), S_IRUGO | S_IWUSR);
5831module_param_named(lbprz, sdebug_lbprz, int, S_IRUGO);
773642d9
DG
5832module_param_named(lbpu, sdebug_lbpu, int, S_IRUGO);
5833module_param_named(lbpws, sdebug_lbpws, int, S_IRUGO);
5834module_param_named(lbpws10, sdebug_lbpws10, int, S_IRUGO);
773642d9 5835module_param_named(lowest_aligned, sdebug_lowest_aligned, int, S_IRUGO);
ad0c7775 5836module_param_named(lun_format, sdebug_lun_am_i, int, S_IRUGO | S_IWUSR);
773642d9
DG
5837module_param_named(max_luns, sdebug_max_luns, int, S_IRUGO | S_IWUSR);
5838module_param_named(max_queue, sdebug_max_queue, int, S_IRUGO | S_IWUSR);
5d807076
DG
5839module_param_named(medium_error_count, sdebug_medium_error_count, int,
5840 S_IRUGO | S_IWUSR);
5841module_param_named(medium_error_start, sdebug_medium_error_start, int,
5842 S_IRUGO | S_IWUSR);
773642d9
DG
5843module_param_named(ndelay, sdebug_ndelay, int, S_IRUGO | S_IWUSR);
5844module_param_named(no_lun_0, sdebug_no_lun_0, int, S_IRUGO | S_IWUSR);
7109f370 5845module_param_named(no_rwlock, sdebug_no_rwlock, bool, S_IRUGO | S_IWUSR);
773642d9
DG
5846module_param_named(no_uld, sdebug_no_uld, int, S_IRUGO);
5847module_param_named(num_parts, sdebug_num_parts, int, S_IRUGO);
5848module_param_named(num_tgts, sdebug_num_tgts, int, S_IRUGO | S_IWUSR);
5849module_param_named(opt_blks, sdebug_opt_blks, int, S_IRUGO);
5d807076 5850module_param_named(opt_xferlen_exp, sdebug_opt_xferlen_exp, int, S_IRUGO);
773642d9 5851module_param_named(opts, sdebug_opts, int, S_IRUGO | S_IWUSR);
87c715dc
DG
5852module_param_named(per_host_store, sdebug_per_host_store, bool,
5853 S_IRUGO | S_IWUSR);
773642d9
DG
5854module_param_named(physblk_exp, sdebug_physblk_exp, int, S_IRUGO);
5855module_param_named(ptype, sdebug_ptype, int, S_IRUGO | S_IWUSR);
0c4bc91d 5856module_param_named(random, sdebug_random, bool, S_IRUGO | S_IWUSR);
773642d9
DG
5857module_param_named(removable, sdebug_removable, bool, S_IRUGO | S_IWUSR);
5858module_param_named(scsi_level, sdebug_scsi_level, int, S_IRUGO);
5859module_param_named(sector_size, sdebug_sector_size, int, S_IRUGO);
c4837394 5860module_param_named(statistics, sdebug_statistics, bool, S_IRUGO | S_IWUSR);
773642d9 5861module_param_named(strict, sdebug_strict, bool, S_IRUGO | S_IWUSR);
c4837394 5862module_param_named(submit_queues, submit_queues, int, S_IRUGO);
c4b57d89 5863module_param_named(poll_queues, poll_queues, int, S_IRUGO);
fc13638a 5864module_param_named(tur_ms_to_ready, sdeb_tur_ms_to_ready, int, S_IRUGO);
773642d9
DG
5865module_param_named(unmap_alignment, sdebug_unmap_alignment, int, S_IRUGO);
5866module_param_named(unmap_granularity, sdebug_unmap_granularity, int, S_IRUGO);
5867module_param_named(unmap_max_blocks, sdebug_unmap_max_blocks, int, S_IRUGO);
5868module_param_named(unmap_max_desc, sdebug_unmap_max_desc, int, S_IRUGO);
09ba24c1 5869module_param_named(uuid_ctl, sdebug_uuid_ctl, int, S_IRUGO);
5d807076 5870module_param_named(virtual_gb, sdebug_virtual_gb, int, S_IRUGO | S_IWUSR);
773642d9 5871module_param_named(vpd_use_hostno, sdebug_vpd_use_hostno, int,
5b94e232 5872 S_IRUGO | S_IWUSR);
9447b6ce 5873module_param_named(wp, sdebug_wp, bool, S_IRUGO | S_IWUSR);
773642d9 5874module_param_named(write_same_length, sdebug_write_same_length, int,
5b94e232 5875 S_IRUGO | S_IWUSR);
9267e0eb 5876module_param_named(zbc, sdeb_zbc_model_s, charp, S_IRUGO);
4a5fc1c6 5877module_param_named(zone_cap_mb, sdeb_zbc_zone_cap_mb, int, S_IRUGO);
380603a5 5878module_param_named(zone_max_open, sdeb_zbc_max_open, int, S_IRUGO);
aa8fecf9 5879module_param_named(zone_nr_conv, sdeb_zbc_nr_conv, int, S_IRUGO);
98e0a689 5880module_param_named(zone_size_mb, sdeb_zbc_zone_size_mb, int, S_IRUGO);
1da177e4
LT
5881
5882MODULE_AUTHOR("Eric Youngdale + Douglas Gilbert");
5883MODULE_DESCRIPTION("SCSI debug adapter driver");
5884MODULE_LICENSE("GPL");
b01f6f83 5885MODULE_VERSION(SDEBUG_VERSION);
1da177e4 5886
5d807076 5887MODULE_PARM_DESC(add_host, "add n hosts, in sysfs if negative remove host(s) (def=1)");
5b94e232 5888MODULE_PARM_DESC(ato, "application tag ownership: 0=disk 1=host (def=1)");
9b760fd8 5889MODULE_PARM_DESC(cdb_len, "suggest CDB lengths to drivers (def=10)");
0759c666 5890MODULE_PARM_DESC(clustering, "when set enables larger transfers (def=0)");
cbf67842 5891MODULE_PARM_DESC(delay, "response delay (def=1 jiffy); 0:imm, -1,-2:tiny");
c2248fc9 5892MODULE_PARM_DESC(dev_size_mb, "size in MiB of ram shared by devs(def=8)");
5b94e232
MP
5893MODULE_PARM_DESC(dif, "data integrity field type: 0-3 (def=0)");
5894MODULE_PARM_DESC(dix, "data integrity extensions mask (def=0)");
c65b1445 5895MODULE_PARM_DESC(dsense, "use descriptor sense format(def=0 -> fixed)");
beb87c33 5896MODULE_PARM_DESC(every_nth, "timeout every nth command(def=0)");
23183910 5897MODULE_PARM_DESC(fake_rw, "fake reads/writes instead of copying (def=0)");
5b94e232 5898MODULE_PARM_DESC(guard, "protection checksum: 0=crc, 1=ip (def=0)");
185dd232 5899MODULE_PARM_DESC(host_lock, "host_lock is ignored (def=0)");
c10fa55f
JG
5900MODULE_PARM_DESC(host_max_queue,
5901 "host max # of queued cmds (0 to max(def) [max_queue fixed equal for !0])");
e5203cf0 5902MODULE_PARM_DESC(inq_product, "SCSI INQUIRY product string (def=\"scsi_debug\")");
9b760fd8
DG
5903MODULE_PARM_DESC(inq_rev, "SCSI INQUIRY revision string (def=\""
5904 SDEBUG_VERSION "\")");
5d807076
DG
5905MODULE_PARM_DESC(inq_vendor, "SCSI INQUIRY vendor string (def=\"Linux\")");
5906MODULE_PARM_DESC(lbprz,
5907 "on read unmapped LBs return 0 when 1 (def), return 0xff when 2");
5b94e232
MP
5908MODULE_PARM_DESC(lbpu, "enable LBP, support UNMAP command (def=0)");
5909MODULE_PARM_DESC(lbpws, "enable LBP, support WRITE SAME(16) with UNMAP bit (def=0)");
5910MODULE_PARM_DESC(lbpws10, "enable LBP, support WRITE SAME(10) with UNMAP bit (def=0)");
5911MODULE_PARM_DESC(lowest_aligned, "lowest aligned lba (def=0)");
ad0c7775 5912MODULE_PARM_DESC(lun_format, "LUN format: 0->peripheral (def); 1 --> flat address method");
fc09acb7 5913MODULE_PARM_DESC(max_luns, "number of LUNs per target to simulate(def=1)");
cbf67842 5914MODULE_PARM_DESC(max_queue, "max number of queued commands (1 to max(def))");
d9da891a 5915MODULE_PARM_DESC(medium_error_count, "count of sectors to return follow on MEDIUM error");
5d807076 5916MODULE_PARM_DESC(medium_error_start, "starting sector number to return MEDIUM error");
cbf67842 5917MODULE_PARM_DESC(ndelay, "response delay in nanoseconds (def=0 -> ignore)");
c65b1445 5918MODULE_PARM_DESC(no_lun_0, "no LU number 0 (def=0 -> have lun 0)");
7109f370 5919MODULE_PARM_DESC(no_rwlock, "don't protect user data reads+writes (def=0)");
78d4e5a0 5920MODULE_PARM_DESC(no_uld, "stop ULD (e.g. sd driver) attaching (def=0))");
1da177e4 5921MODULE_PARM_DESC(num_parts, "number of partitions(def=0)");
c65b1445 5922MODULE_PARM_DESC(num_tgts, "number of targets per host to simulate(def=1)");
32c5844a 5923MODULE_PARM_DESC(opt_blks, "optimal transfer length in blocks (def=1024)");
5d807076 5924MODULE_PARM_DESC(opt_xferlen_exp, "optimal transfer length granularity exponent (def=physblk_exp)");
6f3cbf55 5925MODULE_PARM_DESC(opts, "1->noise, 2->medium_err, 4->timeout, 8->recovered_err... (def=0)");
5d807076 5926MODULE_PARM_DESC(per_host_store, "If set, next positive add_host will get new store (def=0)");
5b94e232 5927MODULE_PARM_DESC(physblk_exp, "physical block exponent (def=0)");
fc09acb7 5928MODULE_PARM_DESC(poll_queues, "support for iouring iopoll queues (1 to max(submit_queues - 1))");
1da177e4 5929MODULE_PARM_DESC(ptype, "SCSI peripheral type(def=0[disk])");
0c4bc91d 5930MODULE_PARM_DESC(random, "If set, uniformly randomize command duration between 0 and delay_in_ns");
d986788b 5931MODULE_PARM_DESC(removable, "claim to have removable media (def=0)");
760f3b03 5932MODULE_PARM_DESC(scsi_level, "SCSI level to simulate(def=7[SPC-5])");
ea61fca5 5933MODULE_PARM_DESC(sector_size, "logical block size in bytes (def=512)");
c4837394 5934MODULE_PARM_DESC(statistics, "collect statistics on commands, queues (def=0)");
c2248fc9 5935MODULE_PARM_DESC(strict, "stricter checks: reserved field in cdb (def=0)");
c4837394 5936MODULE_PARM_DESC(submit_queues, "support for block multi-queue (def=1)");
fc13638a 5937MODULE_PARM_DESC(tur_ms_to_ready, "TEST UNIT READY millisecs before initial good status (def=0)");
5b94e232
MP
5938MODULE_PARM_DESC(unmap_alignment, "lowest aligned thin provisioning lba (def=0)");
5939MODULE_PARM_DESC(unmap_granularity, "thin provisioning granularity in blocks (def=1)");
6014759c
MP
5940MODULE_PARM_DESC(unmap_max_blocks, "max # of blocks can be unmapped in one cmd (def=0xffffffff)");
5941MODULE_PARM_DESC(unmap_max_desc, "max # of ranges that can be unmapped in one cmd (def=256)");
09ba24c1
DG
5942MODULE_PARM_DESC(uuid_ctl,
5943 "1->use uuid for lu name, 0->don't, 2->all use same (def=0)");
c2248fc9 5944MODULE_PARM_DESC(virtual_gb, "virtual gigabyte (GiB) size (def=0 -> use dev_size_mb)");
5b94e232 5945MODULE_PARM_DESC(vpd_use_hostno, "0 -> dev ids ignore hostno (def=1 -> unique dev ids)");
9447b6ce 5946MODULE_PARM_DESC(wp, "Write Protect (def=0)");
5b94e232 5947MODULE_PARM_DESC(write_same_length, "Maximum blocks per WRITE SAME cmd (def=0xffff)");
9267e0eb 5948MODULE_PARM_DESC(zbc, "'none' [0]; 'aware' [1]; 'managed' [2] (def=0). Can have 'host-' prefix");
4a5fc1c6 5949MODULE_PARM_DESC(zone_cap_mb, "Zone capacity in MiB (def=zone size)");
380603a5 5950MODULE_PARM_DESC(zone_max_open, "Maximum number of open zones; [0] for no limit (def=auto)");
aa8fecf9 5951MODULE_PARM_DESC(zone_nr_conv, "Number of conventional zones (def=1)");
98e0a689 5952MODULE_PARM_DESC(zone_size_mb, "Zone size in MiB (def=auto)");
1da177e4 5953
760f3b03
DG
5954#define SDEBUG_INFO_LEN 256
5955static char sdebug_info[SDEBUG_INFO_LEN];
1da177e4 5956
91d4c752 5957static const char *scsi_debug_info(struct Scsi_Host *shp)
1da177e4 5958{
c4837394
DG
5959 int k;
5960
760f3b03
DG
5961 k = scnprintf(sdebug_info, SDEBUG_INFO_LEN, "%s: version %s [%s]\n",
5962 my_name, SDEBUG_VERSION, sdebug_version_date);
5963 if (k >= (SDEBUG_INFO_LEN - 1))
c4837394 5964 return sdebug_info;
760f3b03
DG
5965 scnprintf(sdebug_info + k, SDEBUG_INFO_LEN - k,
5966 " dev_size_mb=%d, opts=0x%x, submit_queues=%d, %s=%d",
5967 sdebug_dev_size_mb, sdebug_opts, submit_queues,
5968 "statistics", (int)sdebug_statistics);
1da177e4
LT
5969 return sdebug_info;
5970}
5971
cbf67842 5972/* 'echo <val> > /proc/scsi/scsi_debug/<host_id>' writes to opts */
fd32119b
DG
5973static int scsi_debug_write_info(struct Scsi_Host *host, char *buffer,
5974 int length)
1da177e4 5975{
c8ed555a
AV
5976 char arr[16];
5977 int opts;
5978 int minLen = length > 15 ? 15 : length;
1da177e4 5979
c8ed555a
AV
5980 if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
5981 return -EACCES;
5982 memcpy(arr, buffer, minLen);
5983 arr[minLen] = '\0';
5984 if (1 != sscanf(arr, "%d", &opts))
5985 return -EINVAL;
773642d9
DG
5986 sdebug_opts = opts;
5987 sdebug_verbose = !!(SDEBUG_OPT_NOISE & opts);
5988 sdebug_any_injecting_opt = !!(SDEBUG_OPT_ALL_INJECTING & opts);
5989 if (sdebug_every_nth != 0)
c4837394 5990 tweak_cmnd_count();
c8ed555a
AV
5991 return length;
5992}
1da177e4 5993
cbf67842
DG
5994/* Output seen with 'cat /proc/scsi/scsi_debug/<host_id>'. It will be the
5995 * same for each scsi_debug host (if more than one). Some of the counters
5996 * output are not atomics so might be inaccurate in a busy system. */
c8ed555a
AV
5997static int scsi_debug_show_info(struct seq_file *m, struct Scsi_Host *host)
5998{
c4837394
DG
5999 int f, j, l;
6000 struct sdebug_queue *sqp;
87c715dc 6001 struct sdebug_host_info *sdhp;
c4837394
DG
6002
6003 seq_printf(m, "scsi_debug adapter driver, version %s [%s]\n",
6004 SDEBUG_VERSION, sdebug_version_date);
6005 seq_printf(m, "num_tgts=%d, %ssize=%d MB, opts=0x%x, every_nth=%d\n",
6006 sdebug_num_tgts, "shared (ram) ", sdebug_dev_size_mb,
6007 sdebug_opts, sdebug_every_nth);
6008 seq_printf(m, "delay=%d, ndelay=%d, max_luns=%d, sector_size=%d %s\n",
6009 sdebug_jdelay, sdebug_ndelay, sdebug_max_luns,
6010 sdebug_sector_size, "bytes");
6011 seq_printf(m, "cylinders=%d, heads=%d, sectors=%d, command aborts=%d\n",
6012 sdebug_cylinders_per, sdebug_heads, sdebug_sectors_per,
6013 num_aborts);
6014 seq_printf(m, "RESETs: device=%d, target=%d, bus=%d, host=%d\n",
6015 num_dev_resets, num_target_resets, num_bus_resets,
6016 num_host_resets);
6017 seq_printf(m, "dix_reads=%d, dix_writes=%d, dif_errors=%d\n",
6018 dix_reads, dix_writes, dif_errors);
458df78b
BVA
6019 seq_printf(m, "usec_in_jiffy=%lu, statistics=%d\n", TICK_NSEC / 1000,
6020 sdebug_statistics);
4a0c6f43 6021 seq_printf(m, "cmnd_count=%d, completions=%d, %s=%d, a_tsf=%d, mq_polls=%d\n",
c4837394
DG
6022 atomic_read(&sdebug_cmnd_count),
6023 atomic_read(&sdebug_completions),
6024 "miss_cpus", atomic_read(&sdebug_miss_cpus),
4a0c6f43
DG
6025 atomic_read(&sdebug_a_tsf),
6026 atomic_read(&sdeb_mq_poll_count));
c4837394
DG
6027
6028 seq_printf(m, "submit_queues=%d\n", submit_queues);
6029 for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
6030 seq_printf(m, " queue %d:\n", j);
6031 f = find_first_bit(sqp->in_use_bm, sdebug_max_queue);
6032 if (f != sdebug_max_queue) {
6033 l = find_last_bit(sqp->in_use_bm, sdebug_max_queue);
6034 seq_printf(m, " in_use_bm BUSY: %s: %d,%d\n",
6035 "first,last bits", f, l);
6036 }
cbf67842 6037 }
87c715dc
DG
6038
6039 seq_printf(m, "this host_no=%d\n", host->host_no);
6040 if (!xa_empty(per_store_ap)) {
6041 bool niu;
6042 int idx;
6043 unsigned long l_idx;
6044 struct sdeb_store_info *sip;
6045
6046 seq_puts(m, "\nhost list:\n");
6047 j = 0;
6048 list_for_each_entry(sdhp, &sdebug_host_list, host_list) {
6049 idx = sdhp->si_idx;
6050 seq_printf(m, " %d: host_no=%d, si_idx=%d\n", j,
6051 sdhp->shost->host_no, idx);
6052 ++j;
6053 }
6054 seq_printf(m, "\nper_store array [most_recent_idx=%d]:\n",
6055 sdeb_most_recent_idx);
6056 j = 0;
6057 xa_for_each(per_store_ap, l_idx, sip) {
6058 niu = xa_get_mark(per_store_ap, l_idx,
6059 SDEB_XA_NOT_IN_USE);
6060 idx = (int)l_idx;
6061 seq_printf(m, " %d: idx=%d%s\n", j, idx,
6062 (niu ? " not_in_use" : ""));
6063 ++j;
6064 }
6065 }
c8ed555a 6066 return 0;
1da177e4
LT
6067}
6068
82069379 6069static ssize_t delay_show(struct device_driver *ddp, char *buf)
1da177e4 6070{
c2206098 6071 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_jdelay);
1da177e4 6072}
c4837394
DG
6073/* Returns -EBUSY if jdelay is being changed and commands are queued. The unit
6074 * of delay is jiffies.
6075 */
82069379
AM
6076static ssize_t delay_store(struct device_driver *ddp, const char *buf,
6077 size_t count)
1da177e4 6078{
c2206098 6079 int jdelay, res;
cbf67842 6080
b01f6f83 6081 if (count > 0 && sscanf(buf, "%d", &jdelay) == 1) {
cbf67842 6082 res = count;
c2206098 6083 if (sdebug_jdelay != jdelay) {
c4837394
DG
6084 int j, k;
6085 struct sdebug_queue *sqp;
6086
f19fe8f3 6087 block_unblock_all_queues(true);
c4837394
DG
6088 for (j = 0, sqp = sdebug_q_arr; j < submit_queues;
6089 ++j, ++sqp) {
6090 k = find_first_bit(sqp->in_use_bm,
6091 sdebug_max_queue);
6092 if (k != sdebug_max_queue) {
6093 res = -EBUSY; /* queued commands */
6094 break;
6095 }
6096 }
6097 if (res > 0) {
c2206098 6098 sdebug_jdelay = jdelay;
773642d9 6099 sdebug_ndelay = 0;
cbf67842 6100 }
f19fe8f3 6101 block_unblock_all_queues(false);
1da177e4 6102 }
cbf67842 6103 return res;
1da177e4
LT
6104 }
6105 return -EINVAL;
6106}
82069379 6107static DRIVER_ATTR_RW(delay);
1da177e4 6108
cbf67842
DG
6109static ssize_t ndelay_show(struct device_driver *ddp, char *buf)
6110{
773642d9 6111 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_ndelay);
cbf67842
DG
6112}
6113/* Returns -EBUSY if ndelay is being changed and commands are queued */
c2206098 6114/* If > 0 and accepted then sdebug_jdelay is set to JDELAY_OVERRIDDEN */
cbf67842 6115static ssize_t ndelay_store(struct device_driver *ddp, const char *buf,
fd32119b 6116 size_t count)
cbf67842 6117{
c4837394 6118 int ndelay, res;
cbf67842
DG
6119
6120 if ((count > 0) && (1 == sscanf(buf, "%d", &ndelay)) &&
c4837394 6121 (ndelay >= 0) && (ndelay < (1000 * 1000 * 1000))) {
cbf67842 6122 res = count;
773642d9 6123 if (sdebug_ndelay != ndelay) {
c4837394
DG
6124 int j, k;
6125 struct sdebug_queue *sqp;
6126
f19fe8f3 6127 block_unblock_all_queues(true);
c4837394
DG
6128 for (j = 0, sqp = sdebug_q_arr; j < submit_queues;
6129 ++j, ++sqp) {
6130 k = find_first_bit(sqp->in_use_bm,
6131 sdebug_max_queue);
6132 if (k != sdebug_max_queue) {
6133 res = -EBUSY; /* queued commands */
6134 break;
6135 }
6136 }
6137 if (res > 0) {
773642d9 6138 sdebug_ndelay = ndelay;
c2206098
DG
6139 sdebug_jdelay = ndelay ? JDELAY_OVERRIDDEN
6140 : DEF_JDELAY;
cbf67842 6141 }
f19fe8f3 6142 block_unblock_all_queues(false);
cbf67842
DG
6143 }
6144 return res;
6145 }
6146 return -EINVAL;
6147}
6148static DRIVER_ATTR_RW(ndelay);
6149
82069379 6150static ssize_t opts_show(struct device_driver *ddp, char *buf)
1da177e4 6151{
773642d9 6152 return scnprintf(buf, PAGE_SIZE, "0x%x\n", sdebug_opts);
1da177e4
LT
6153}
6154
82069379
AM
6155static ssize_t opts_store(struct device_driver *ddp, const char *buf,
6156 size_t count)
1da177e4 6157{
9a051019 6158 int opts;
1da177e4
LT
6159 char work[20];
6160
9a051019
DG
6161 if (sscanf(buf, "%10s", work) == 1) {
6162 if (strncasecmp(work, "0x", 2) == 0) {
6163 if (kstrtoint(work + 2, 16, &opts) == 0)
1da177e4
LT
6164 goto opts_done;
6165 } else {
9a051019 6166 if (kstrtoint(work, 10, &opts) == 0)
1da177e4
LT
6167 goto opts_done;
6168 }
6169 }
6170 return -EINVAL;
6171opts_done:
773642d9
DG
6172 sdebug_opts = opts;
6173 sdebug_verbose = !!(SDEBUG_OPT_NOISE & opts);
6174 sdebug_any_injecting_opt = !!(SDEBUG_OPT_ALL_INJECTING & opts);
c4837394 6175 tweak_cmnd_count();
1da177e4
LT
6176 return count;
6177}
82069379 6178static DRIVER_ATTR_RW(opts);
1da177e4 6179
82069379 6180static ssize_t ptype_show(struct device_driver *ddp, char *buf)
1da177e4 6181{
773642d9 6182 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_ptype);
1da177e4 6183}
82069379
AM
6184static ssize_t ptype_store(struct device_driver *ddp, const char *buf,
6185 size_t count)
1da177e4 6186{
9a051019 6187 int n;
1da177e4 6188
f0d1cf93
DG
6189 /* Cannot change from or to TYPE_ZBC with sysfs */
6190 if (sdebug_ptype == TYPE_ZBC)
6191 return -EINVAL;
6192
1da177e4 6193 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
f0d1cf93
DG
6194 if (n == TYPE_ZBC)
6195 return -EINVAL;
773642d9 6196 sdebug_ptype = n;
1da177e4
LT
6197 return count;
6198 }
6199 return -EINVAL;
6200}
82069379 6201static DRIVER_ATTR_RW(ptype);
1da177e4 6202
82069379 6203static ssize_t dsense_show(struct device_driver *ddp, char *buf)
1da177e4 6204{
773642d9 6205 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dsense);
1da177e4 6206}
82069379
AM
6207static ssize_t dsense_store(struct device_driver *ddp, const char *buf,
6208 size_t count)
1da177e4 6209{
9a051019 6210 int n;
1da177e4
LT
6211
6212 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
773642d9 6213 sdebug_dsense = n;
1da177e4
LT
6214 return count;
6215 }
6216 return -EINVAL;
6217}
82069379 6218static DRIVER_ATTR_RW(dsense);
1da177e4 6219
82069379 6220static ssize_t fake_rw_show(struct device_driver *ddp, char *buf)
23183910 6221{
773642d9 6222 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_fake_rw);
23183910 6223}
82069379
AM
6224static ssize_t fake_rw_store(struct device_driver *ddp, const char *buf,
6225 size_t count)
23183910 6226{
87c715dc 6227 int n, idx;
23183910
DG
6228
6229 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
87c715dc
DG
6230 bool want_store = (n == 0);
6231 struct sdebug_host_info *sdhp;
6232
cbf67842 6233 n = (n > 0);
773642d9 6234 sdebug_fake_rw = (sdebug_fake_rw > 0);
87c715dc
DG
6235 if (sdebug_fake_rw == n)
6236 return count; /* not transitioning so do nothing */
6237
6238 if (want_store) { /* 1 --> 0 transition, set up store */
6239 if (sdeb_first_idx < 0) {
6240 idx = sdebug_add_store();
6241 if (idx < 0)
6242 return idx;
6243 } else {
6244 idx = sdeb_first_idx;
6245 xa_clear_mark(per_store_ap, idx,
6246 SDEB_XA_NOT_IN_USE);
6247 }
6248 /* make all hosts use same store */
6249 list_for_each_entry(sdhp, &sdebug_host_list,
6250 host_list) {
6251 if (sdhp->si_idx != idx) {
6252 xa_set_mark(per_store_ap, sdhp->si_idx,
6253 SDEB_XA_NOT_IN_USE);
6254 sdhp->si_idx = idx;
cbf67842 6255 }
cbf67842 6256 }
87c715dc
DG
6257 sdeb_most_recent_idx = idx;
6258 } else { /* 0 --> 1 transition is trigger for shrink */
6259 sdebug_erase_all_stores(true /* apart from first */);
cbf67842 6260 }
87c715dc 6261 sdebug_fake_rw = n;
23183910
DG
6262 return count;
6263 }
6264 return -EINVAL;
6265}
82069379 6266static DRIVER_ATTR_RW(fake_rw);
23183910 6267
82069379 6268static ssize_t no_lun_0_show(struct device_driver *ddp, char *buf)
c65b1445 6269{
773642d9 6270 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_no_lun_0);
c65b1445 6271}
82069379
AM
6272static ssize_t no_lun_0_store(struct device_driver *ddp, const char *buf,
6273 size_t count)
c65b1445 6274{
9a051019 6275 int n;
c65b1445
DG
6276
6277 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
773642d9 6278 sdebug_no_lun_0 = n;
c65b1445
DG
6279 return count;
6280 }
6281 return -EINVAL;
6282}
82069379 6283static DRIVER_ATTR_RW(no_lun_0);
c65b1445 6284
82069379 6285static ssize_t num_tgts_show(struct device_driver *ddp, char *buf)
1da177e4 6286{
773642d9 6287 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_num_tgts);
1da177e4 6288}
82069379
AM
6289static ssize_t num_tgts_store(struct device_driver *ddp, const char *buf,
6290 size_t count)
1da177e4 6291{
9a051019 6292 int n;
1da177e4
LT
6293
6294 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
773642d9 6295 sdebug_num_tgts = n;
1da177e4
LT
6296 sdebug_max_tgts_luns();
6297 return count;
6298 }
6299 return -EINVAL;
6300}
82069379 6301static DRIVER_ATTR_RW(num_tgts);
1da177e4 6302
82069379 6303static ssize_t dev_size_mb_show(struct device_driver *ddp, char *buf)
1da177e4 6304{
773642d9 6305 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dev_size_mb);
1da177e4 6306}
82069379 6307static DRIVER_ATTR_RO(dev_size_mb);
1da177e4 6308
87c715dc
DG
6309static ssize_t per_host_store_show(struct device_driver *ddp, char *buf)
6310{
6311 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_per_host_store);
6312}
6313
6314static ssize_t per_host_store_store(struct device_driver *ddp, const char *buf,
6315 size_t count)
6316{
6317 bool v;
6318
6319 if (kstrtobool(buf, &v))
6320 return -EINVAL;
6321
6322 sdebug_per_host_store = v;
6323 return count;
6324}
6325static DRIVER_ATTR_RW(per_host_store);
6326
82069379 6327static ssize_t num_parts_show(struct device_driver *ddp, char *buf)
1da177e4 6328{
773642d9 6329 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_num_parts);
1da177e4 6330}
82069379 6331static DRIVER_ATTR_RO(num_parts);
1da177e4 6332
82069379 6333static ssize_t every_nth_show(struct device_driver *ddp, char *buf)
1da177e4 6334{
773642d9 6335 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_every_nth);
1da177e4 6336}
82069379
AM
6337static ssize_t every_nth_store(struct device_driver *ddp, const char *buf,
6338 size_t count)
1da177e4 6339{
9a051019 6340 int nth;
3a90a63d 6341 char work[20];
1da177e4 6342
3a90a63d
DG
6343 if (sscanf(buf, "%10s", work) == 1) {
6344 if (strncasecmp(work, "0x", 2) == 0) {
6345 if (kstrtoint(work + 2, 16, &nth) == 0)
6346 goto every_nth_done;
6347 } else {
6348 if (kstrtoint(work, 10, &nth) == 0)
6349 goto every_nth_done;
c4837394 6350 }
1da177e4
LT
6351 }
6352 return -EINVAL;
3a90a63d
DG
6353
6354every_nth_done:
6355 sdebug_every_nth = nth;
6356 if (nth && !sdebug_statistics) {
6357 pr_info("every_nth needs statistics=1, set it\n");
6358 sdebug_statistics = true;
6359 }
6360 tweak_cmnd_count();
6361 return count;
1da177e4 6362}
82069379 6363static DRIVER_ATTR_RW(every_nth);
1da177e4 6364
ad0c7775
DG
6365static ssize_t lun_format_show(struct device_driver *ddp, char *buf)
6366{
6367 return scnprintf(buf, PAGE_SIZE, "%d\n", (int)sdebug_lun_am);
6368}
6369static ssize_t lun_format_store(struct device_driver *ddp, const char *buf,
6370 size_t count)
6371{
6372 int n;
6373 bool changed;
6374
6375 if (kstrtoint(buf, 0, &n))
6376 return -EINVAL;
6377 if (n >= 0) {
6378 if (n > (int)SAM_LUN_AM_FLAT) {
6379 pr_warn("only LUN address methods 0 and 1 are supported\n");
6380 return -EINVAL;
6381 }
6382 changed = ((int)sdebug_lun_am != n);
6383 sdebug_lun_am = n;
6384 if (changed && sdebug_scsi_level >= 5) { /* >= SPC-3 */
6385 struct sdebug_host_info *sdhp;
6386 struct sdebug_dev_info *dp;
6387
6388 spin_lock(&sdebug_host_list_lock);
6389 list_for_each_entry(sdhp, &sdebug_host_list, host_list) {
6390 list_for_each_entry(dp, &sdhp->dev_info_list, dev_list) {
6391 set_bit(SDEBUG_UA_LUNS_CHANGED, dp->uas_bm);
6392 }
6393 }
6394 spin_unlock(&sdebug_host_list_lock);
6395 }
6396 return count;
6397 }
6398 return -EINVAL;
6399}
6400static DRIVER_ATTR_RW(lun_format);
6401
82069379 6402static ssize_t max_luns_show(struct device_driver *ddp, char *buf)
1da177e4 6403{
773642d9 6404 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_max_luns);
1da177e4 6405}
82069379
AM
6406static ssize_t max_luns_store(struct device_driver *ddp, const char *buf,
6407 size_t count)
1da177e4 6408{
9a051019 6409 int n;
19c8ead7 6410 bool changed;
1da177e4
LT
6411
6412 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
8d039e22
DG
6413 if (n > 256) {
6414 pr_warn("max_luns can be no more than 256\n");
6415 return -EINVAL;
6416 }
773642d9
DG
6417 changed = (sdebug_max_luns != n);
6418 sdebug_max_luns = n;
1da177e4 6419 sdebug_max_tgts_luns();
773642d9 6420 if (changed && (sdebug_scsi_level >= 5)) { /* >= SPC-3 */
19c8ead7
EM
6421 struct sdebug_host_info *sdhp;
6422 struct sdebug_dev_info *dp;
6423
6424 spin_lock(&sdebug_host_list_lock);
6425 list_for_each_entry(sdhp, &sdebug_host_list,
6426 host_list) {
6427 list_for_each_entry(dp, &sdhp->dev_info_list,
6428 dev_list) {
6429 set_bit(SDEBUG_UA_LUNS_CHANGED,
6430 dp->uas_bm);
6431 }
6432 }
6433 spin_unlock(&sdebug_host_list_lock);
6434 }
1da177e4
LT
6435 return count;
6436 }
6437 return -EINVAL;
6438}
82069379 6439static DRIVER_ATTR_RW(max_luns);
1da177e4 6440
82069379 6441static ssize_t max_queue_show(struct device_driver *ddp, char *buf)
78d4e5a0 6442{
773642d9 6443 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_max_queue);
78d4e5a0 6444}
cbf67842
DG
6445/* N.B. max_queue can be changed while there are queued commands. In flight
6446 * commands beyond the new max_queue will be completed. */
82069379
AM
6447static ssize_t max_queue_store(struct device_driver *ddp, const char *buf,
6448 size_t count)
78d4e5a0 6449{
c4837394
DG
6450 int j, n, k, a;
6451 struct sdebug_queue *sqp;
78d4e5a0
DG
6452
6453 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n > 0) &&
c10fa55f
JG
6454 (n <= SDEBUG_CANQUEUE) &&
6455 (sdebug_host_max_queue == 0)) {
f19fe8f3 6456 block_unblock_all_queues(true);
c4837394
DG
6457 k = 0;
6458 for (j = 0, sqp = sdebug_q_arr; j < submit_queues;
6459 ++j, ++sqp) {
6460 a = find_last_bit(sqp->in_use_bm, SDEBUG_CANQUEUE);
6461 if (a > k)
6462 k = a;
6463 }
773642d9 6464 sdebug_max_queue = n;
c4837394 6465 if (k == SDEBUG_CANQUEUE)
cbf67842
DG
6466 atomic_set(&retired_max_queue, 0);
6467 else if (k >= n)
6468 atomic_set(&retired_max_queue, k + 1);
6469 else
6470 atomic_set(&retired_max_queue, 0);
f19fe8f3 6471 block_unblock_all_queues(false);
78d4e5a0
DG
6472 return count;
6473 }
6474 return -EINVAL;
6475}
82069379 6476static DRIVER_ATTR_RW(max_queue);
78d4e5a0 6477
c10fa55f
JG
6478static ssize_t host_max_queue_show(struct device_driver *ddp, char *buf)
6479{
6480 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_host_max_queue);
6481}
6482
7109f370
DG
6483static ssize_t no_rwlock_show(struct device_driver *ddp, char *buf)
6484{
6485 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_no_rwlock);
6486}
6487
6488static ssize_t no_rwlock_store(struct device_driver *ddp, const char *buf, size_t count)
6489{
6490 bool v;
6491
6492 if (kstrtobool(buf, &v))
6493 return -EINVAL;
6494
6495 sdebug_no_rwlock = v;
6496 return count;
6497}
6498static DRIVER_ATTR_RW(no_rwlock);
6499
c10fa55f
JG
6500/*
6501 * Since this is used for .can_queue, and we get the hc_idx tag from the bitmap
6502 * in range [0, sdebug_host_max_queue), we can't change it.
6503 */
6504static DRIVER_ATTR_RO(host_max_queue);
6505
82069379 6506static ssize_t no_uld_show(struct device_driver *ddp, char *buf)
78d4e5a0 6507{
773642d9 6508 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_no_uld);
78d4e5a0 6509}
82069379 6510static DRIVER_ATTR_RO(no_uld);
78d4e5a0 6511
82069379 6512static ssize_t scsi_level_show(struct device_driver *ddp, char *buf)
1da177e4 6513{
773642d9 6514 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_scsi_level);
1da177e4 6515}
82069379 6516static DRIVER_ATTR_RO(scsi_level);
1da177e4 6517
82069379 6518static ssize_t virtual_gb_show(struct device_driver *ddp, char *buf)
c65b1445 6519{
773642d9 6520 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_virtual_gb);
c65b1445 6521}
82069379
AM
6522static ssize_t virtual_gb_store(struct device_driver *ddp, const char *buf,
6523 size_t count)
c65b1445 6524{
9a051019 6525 int n;
0d01c5df 6526 bool changed;
c65b1445 6527
f0d1cf93
DG
6528 /* Ignore capacity change for ZBC drives for now */
6529 if (sdeb_zbc_in_use)
6530 return -ENOTSUPP;
6531
c65b1445 6532 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
773642d9
DG
6533 changed = (sdebug_virtual_gb != n);
6534 sdebug_virtual_gb = n;
28898873 6535 sdebug_capacity = get_sdebug_capacity();
0d01c5df
DG
6536 if (changed) {
6537 struct sdebug_host_info *sdhp;
6538 struct sdebug_dev_info *dp;
6539
4bc6b634 6540 spin_lock(&sdebug_host_list_lock);
0d01c5df
DG
6541 list_for_each_entry(sdhp, &sdebug_host_list,
6542 host_list) {
6543 list_for_each_entry(dp, &sdhp->dev_info_list,
6544 dev_list) {
6545 set_bit(SDEBUG_UA_CAPACITY_CHANGED,
6546 dp->uas_bm);
6547 }
6548 }
4bc6b634 6549 spin_unlock(&sdebug_host_list_lock);
0d01c5df 6550 }
c65b1445
DG
6551 return count;
6552 }
6553 return -EINVAL;
6554}
82069379 6555static DRIVER_ATTR_RW(virtual_gb);
c65b1445 6556
82069379 6557static ssize_t add_host_show(struct device_driver *ddp, char *buf)
1da177e4 6558{
87c715dc 6559 /* absolute number of hosts currently active is what is shown */
f19fe8f3 6560 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_num_hosts);
1da177e4
LT
6561}
6562
82069379
AM
6563static ssize_t add_host_store(struct device_driver *ddp, const char *buf,
6564 size_t count)
1da177e4 6565{
f19fe8f3
BVA
6566 bool found;
6567 unsigned long idx;
6568 struct sdeb_store_info *sip;
6569 bool want_phs = (sdebug_fake_rw == 0) && sdebug_per_host_store;
f3df41cf 6570 int delta_hosts;
1da177e4 6571
f19fe8f3 6572 if (sscanf(buf, "%d", &delta_hosts) != 1)
1da177e4 6573 return -EINVAL;
1da177e4 6574 if (delta_hosts > 0) {
1da177e4 6575 do {
f19fe8f3
BVA
6576 found = false;
6577 if (want_phs) {
6578 xa_for_each_marked(per_store_ap, idx, sip,
6579 SDEB_XA_NOT_IN_USE) {
6580 sdeb_most_recent_idx = (int)idx;
6581 found = true;
6582 break;
6583 }
6584 if (found) /* re-use case */
6585 sdebug_add_host_helper((int)idx);
6586 else
6587 sdebug_do_add_host(true);
6588 } else {
6589 sdebug_do_add_host(false);
2aad3cd8 6590 }
f19fe8f3
BVA
6591 } while (--delta_hosts);
6592 } else if (delta_hosts < 0) {
6593 do {
87c715dc 6594 sdebug_do_remove_host(false);
1da177e4
LT
6595 } while (++delta_hosts);
6596 }
6597 return count;
6598}
82069379 6599static DRIVER_ATTR_RW(add_host);
1da177e4 6600
82069379 6601static ssize_t vpd_use_hostno_show(struct device_driver *ddp, char *buf)
23183910 6602{
773642d9 6603 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_vpd_use_hostno);
23183910 6604}
82069379
AM
6605static ssize_t vpd_use_hostno_store(struct device_driver *ddp, const char *buf,
6606 size_t count)
23183910
DG
6607{
6608 int n;
6609
6610 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
773642d9 6611 sdebug_vpd_use_hostno = n;
23183910
DG
6612 return count;
6613 }
6614 return -EINVAL;
6615}
82069379 6616static DRIVER_ATTR_RW(vpd_use_hostno);
23183910 6617
c4837394
DG
6618static ssize_t statistics_show(struct device_driver *ddp, char *buf)
6619{
6620 return scnprintf(buf, PAGE_SIZE, "%d\n", (int)sdebug_statistics);
6621}
6622static ssize_t statistics_store(struct device_driver *ddp, const char *buf,
6623 size_t count)
6624{
6625 int n;
6626
6627 if ((count > 0) && (sscanf(buf, "%d", &n) == 1) && (n >= 0)) {
6628 if (n > 0)
6629 sdebug_statistics = true;
6630 else {
6631 clear_queue_stats();
6632 sdebug_statistics = false;
6633 }
6634 return count;
6635 }
6636 return -EINVAL;
6637}
6638static DRIVER_ATTR_RW(statistics);
6639
82069379 6640static ssize_t sector_size_show(struct device_driver *ddp, char *buf)
597136ab 6641{
773642d9 6642 return scnprintf(buf, PAGE_SIZE, "%u\n", sdebug_sector_size);
597136ab 6643}
82069379 6644static DRIVER_ATTR_RO(sector_size);
597136ab 6645
c4837394
DG
6646static ssize_t submit_queues_show(struct device_driver *ddp, char *buf)
6647{
6648 return scnprintf(buf, PAGE_SIZE, "%d\n", submit_queues);
6649}
6650static DRIVER_ATTR_RO(submit_queues);
6651
82069379 6652static ssize_t dix_show(struct device_driver *ddp, char *buf)
c6a44287 6653{
773642d9 6654 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dix);
c6a44287 6655}
82069379 6656static DRIVER_ATTR_RO(dix);
c6a44287 6657
82069379 6658static ssize_t dif_show(struct device_driver *ddp, char *buf)
c6a44287 6659{
773642d9 6660 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dif);
c6a44287 6661}
82069379 6662static DRIVER_ATTR_RO(dif);
c6a44287 6663
82069379 6664static ssize_t guard_show(struct device_driver *ddp, char *buf)
c6a44287 6665{
773642d9 6666 return scnprintf(buf, PAGE_SIZE, "%u\n", sdebug_guard);
c6a44287 6667}
82069379 6668static DRIVER_ATTR_RO(guard);
c6a44287 6669
82069379 6670static ssize_t ato_show(struct device_driver *ddp, char *buf)
c6a44287 6671{
773642d9 6672 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_ato);
c6a44287 6673}
82069379 6674static DRIVER_ATTR_RO(ato);
c6a44287 6675
82069379 6676static ssize_t map_show(struct device_driver *ddp, char *buf)
44d92694 6677{
87c715dc 6678 ssize_t count = 0;
44d92694 6679
5b94e232 6680 if (!scsi_debug_lbp())
44d92694
MP
6681 return scnprintf(buf, PAGE_SIZE, "0-%u\n",
6682 sdebug_store_sectors);
6683
87c715dc
DG
6684 if (sdebug_fake_rw == 0 && !xa_empty(per_store_ap)) {
6685 struct sdeb_store_info *sip = xa_load(per_store_ap, 0);
6686
6687 if (sip)
6688 count = scnprintf(buf, PAGE_SIZE - 1, "%*pbl",
6689 (int)map_size, sip->map_storep);
6690 }
44d92694 6691 buf[count++] = '\n';
c7badc90 6692 buf[count] = '\0';
44d92694
MP
6693
6694 return count;
6695}
82069379 6696static DRIVER_ATTR_RO(map);
44d92694 6697
0c4bc91d
DG
6698static ssize_t random_show(struct device_driver *ddp, char *buf)
6699{
6700 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_random);
6701}
6702
6703static ssize_t random_store(struct device_driver *ddp, const char *buf,
6704 size_t count)
6705{
6706 bool v;
6707
6708 if (kstrtobool(buf, &v))
6709 return -EINVAL;
6710
6711 sdebug_random = v;
6712 return count;
6713}
6714static DRIVER_ATTR_RW(random);
6715
82069379 6716static ssize_t removable_show(struct device_driver *ddp, char *buf)
d986788b 6717{
773642d9 6718 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_removable ? 1 : 0);
d986788b 6719}
82069379
AM
6720static ssize_t removable_store(struct device_driver *ddp, const char *buf,
6721 size_t count)
d986788b
MP
6722{
6723 int n;
6724
6725 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
773642d9 6726 sdebug_removable = (n > 0);
d986788b
MP
6727 return count;
6728 }
6729 return -EINVAL;
6730}
82069379 6731static DRIVER_ATTR_RW(removable);
d986788b 6732
cbf67842
DG
6733static ssize_t host_lock_show(struct device_driver *ddp, char *buf)
6734{
773642d9 6735 return scnprintf(buf, PAGE_SIZE, "%d\n", !!sdebug_host_lock);
cbf67842 6736}
185dd232 6737/* N.B. sdebug_host_lock does nothing, kept for backward compatibility */
cbf67842
DG
6738static ssize_t host_lock_store(struct device_driver *ddp, const char *buf,
6739 size_t count)
6740{
185dd232 6741 int n;
cbf67842
DG
6742
6743 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
185dd232
DG
6744 sdebug_host_lock = (n > 0);
6745 return count;
cbf67842
DG
6746 }
6747 return -EINVAL;
6748}
6749static DRIVER_ATTR_RW(host_lock);
6750
c2248fc9
DG
6751static ssize_t strict_show(struct device_driver *ddp, char *buf)
6752{
773642d9 6753 return scnprintf(buf, PAGE_SIZE, "%d\n", !!sdebug_strict);
c2248fc9
DG
6754}
6755static ssize_t strict_store(struct device_driver *ddp, const char *buf,
6756 size_t count)
6757{
6758 int n;
6759
6760 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
773642d9 6761 sdebug_strict = (n > 0);
c2248fc9
DG
6762 return count;
6763 }
6764 return -EINVAL;
6765}
6766static DRIVER_ATTR_RW(strict);
6767
09ba24c1
DG
6768static ssize_t uuid_ctl_show(struct device_driver *ddp, char *buf)
6769{
6770 return scnprintf(buf, PAGE_SIZE, "%d\n", !!sdebug_uuid_ctl);
6771}
6772static DRIVER_ATTR_RO(uuid_ctl);
6773
9b760fd8
DG
6774static ssize_t cdb_len_show(struct device_driver *ddp, char *buf)
6775{
6776 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_cdb_len);
6777}
6778static ssize_t cdb_len_store(struct device_driver *ddp, const char *buf,
6779 size_t count)
6780{
6781 int ret, n;
6782
6783 ret = kstrtoint(buf, 0, &n);
6784 if (ret)
6785 return ret;
6786 sdebug_cdb_len = n;
6787 all_config_cdb_len();
6788 return count;
6789}
6790static DRIVER_ATTR_RW(cdb_len);
6791
9267e0eb
DG
6792static const char * const zbc_model_strs_a[] = {
6793 [BLK_ZONED_NONE] = "none",
6794 [BLK_ZONED_HA] = "host-aware",
6795 [BLK_ZONED_HM] = "host-managed",
6796};
6797
6798static const char * const zbc_model_strs_b[] = {
6799 [BLK_ZONED_NONE] = "no",
6800 [BLK_ZONED_HA] = "aware",
6801 [BLK_ZONED_HM] = "managed",
6802};
6803
6804static const char * const zbc_model_strs_c[] = {
6805 [BLK_ZONED_NONE] = "0",
6806 [BLK_ZONED_HA] = "1",
6807 [BLK_ZONED_HM] = "2",
6808};
6809
6810static int sdeb_zbc_model_str(const char *cp)
6811{
6812 int res = sysfs_match_string(zbc_model_strs_a, cp);
6813
6814 if (res < 0) {
6815 res = sysfs_match_string(zbc_model_strs_b, cp);
6816 if (res < 0) {
6817 res = sysfs_match_string(zbc_model_strs_c, cp);
47742bde 6818 if (res < 0)
9267e0eb
DG
6819 return -EINVAL;
6820 }
6821 }
6822 return res;
6823}
6824
6825static ssize_t zbc_show(struct device_driver *ddp, char *buf)
6826{
6827 return scnprintf(buf, PAGE_SIZE, "%s\n",
6828 zbc_model_strs_a[sdeb_zbc_model]);
6829}
6830static DRIVER_ATTR_RO(zbc);
cbf67842 6831
fc13638a
DG
6832static ssize_t tur_ms_to_ready_show(struct device_driver *ddp, char *buf)
6833{
6834 return scnprintf(buf, PAGE_SIZE, "%d\n", sdeb_tur_ms_to_ready);
6835}
6836static DRIVER_ATTR_RO(tur_ms_to_ready);
6837
82069379 6838/* Note: The following array creates attribute files in the
23183910
DG
6839 /sys/bus/pseudo/drivers/scsi_debug directory. The advantage of these
6840 files (over those found in the /sys/module/scsi_debug/parameters
6841 directory) is that auxiliary actions can be triggered when an attribute
87c715dc 6842 is changed. For example see: add_host_store() above.
23183910 6843 */
6ecaff7f 6844
82069379
AM
6845static struct attribute *sdebug_drv_attrs[] = {
6846 &driver_attr_delay.attr,
6847 &driver_attr_opts.attr,
6848 &driver_attr_ptype.attr,
6849 &driver_attr_dsense.attr,
6850 &driver_attr_fake_rw.attr,
c10fa55f 6851 &driver_attr_host_max_queue.attr,
82069379
AM
6852 &driver_attr_no_lun_0.attr,
6853 &driver_attr_num_tgts.attr,
6854 &driver_attr_dev_size_mb.attr,
6855 &driver_attr_num_parts.attr,
6856 &driver_attr_every_nth.attr,
ad0c7775 6857 &driver_attr_lun_format.attr,
82069379
AM
6858 &driver_attr_max_luns.attr,
6859 &driver_attr_max_queue.attr,
7109f370 6860 &driver_attr_no_rwlock.attr,
82069379
AM
6861 &driver_attr_no_uld.attr,
6862 &driver_attr_scsi_level.attr,
6863 &driver_attr_virtual_gb.attr,
6864 &driver_attr_add_host.attr,
87c715dc 6865 &driver_attr_per_host_store.attr,
82069379
AM
6866 &driver_attr_vpd_use_hostno.attr,
6867 &driver_attr_sector_size.attr,
c4837394
DG
6868 &driver_attr_statistics.attr,
6869 &driver_attr_submit_queues.attr,
82069379
AM
6870 &driver_attr_dix.attr,
6871 &driver_attr_dif.attr,
6872 &driver_attr_guard.attr,
6873 &driver_attr_ato.attr,
6874 &driver_attr_map.attr,
0c4bc91d 6875 &driver_attr_random.attr,
82069379 6876 &driver_attr_removable.attr,
cbf67842
DG
6877 &driver_attr_host_lock.attr,
6878 &driver_attr_ndelay.attr,
c2248fc9 6879 &driver_attr_strict.attr,
09ba24c1 6880 &driver_attr_uuid_ctl.attr,
9b760fd8 6881 &driver_attr_cdb_len.attr,
fc13638a 6882 &driver_attr_tur_ms_to_ready.attr,
9267e0eb 6883 &driver_attr_zbc.attr,
82069379
AM
6884 NULL,
6885};
6886ATTRIBUTE_GROUPS(sdebug_drv);
1da177e4 6887
11ddceca 6888static struct device *pseudo_primary;
8dea0d02 6889
1da177e4
LT
6890static int __init scsi_debug_init(void)
6891{
87c715dc 6892 bool want_store = (sdebug_fake_rw == 0);
5f2578e5 6893 unsigned long sz;
87c715dc
DG
6894 int k, ret, hosts_to_add;
6895 int idx = -1;
1da177e4 6896
87c715dc
DG
6897 ramdisk_lck_a[0] = &atomic_rw;
6898 ramdisk_lck_a[1] = &atomic_rw2;
cbf67842
DG
6899 atomic_set(&retired_max_queue, 0);
6900
773642d9 6901 if (sdebug_ndelay >= 1000 * 1000 * 1000) {
c1287970 6902 pr_warn("ndelay must be less than 1 second, ignored\n");
773642d9
DG
6903 sdebug_ndelay = 0;
6904 } else if (sdebug_ndelay > 0)
c2206098 6905 sdebug_jdelay = JDELAY_OVERRIDDEN;
cbf67842 6906
773642d9 6907 switch (sdebug_sector_size) {
597136ab
MP
6908 case 512:
6909 case 1024:
6910 case 2048:
6911 case 4096:
6912 break;
6913 default:
773642d9 6914 pr_err("invalid sector_size %d\n", sdebug_sector_size);
597136ab
MP
6915 return -EINVAL;
6916 }
6917
773642d9 6918 switch (sdebug_dif) {
8475c811 6919 case T10_PI_TYPE0_PROTECTION:
f46eb0e9 6920 break;
8475c811
CH
6921 case T10_PI_TYPE1_PROTECTION:
6922 case T10_PI_TYPE2_PROTECTION:
6923 case T10_PI_TYPE3_PROTECTION:
f46eb0e9 6924 have_dif_prot = true;
c6a44287
MP
6925 break;
6926
6927 default:
c1287970 6928 pr_err("dif must be 0, 1, 2 or 3\n");
c6a44287
MP
6929 return -EINVAL;
6930 }
6931
aa5334c4
ML
6932 if (sdebug_num_tgts < 0) {
6933 pr_err("num_tgts must be >= 0\n");
6934 return -EINVAL;
6935 }
6936
773642d9 6937 if (sdebug_guard > 1) {
c1287970 6938 pr_err("guard must be 0 or 1\n");
c6a44287
MP
6939 return -EINVAL;
6940 }
6941
773642d9 6942 if (sdebug_ato > 1) {
c1287970 6943 pr_err("ato must be 0 or 1\n");
c6a44287
MP
6944 return -EINVAL;
6945 }
6946
773642d9
DG
6947 if (sdebug_physblk_exp > 15) {
6948 pr_err("invalid physblk_exp %u\n", sdebug_physblk_exp);
ea61fca5
MP
6949 return -EINVAL;
6950 }
ad0c7775
DG
6951
6952 sdebug_lun_am = sdebug_lun_am_i;
6953 if (sdebug_lun_am > SAM_LUN_AM_FLAT) {
6954 pr_warn("Invalid LUN format %u, using default\n", (int)sdebug_lun_am);
6955 sdebug_lun_am = SAM_LUN_AM_PERIPHERAL;
6956 }
6957
8d039e22 6958 if (sdebug_max_luns > 256) {
ad0c7775
DG
6959 if (sdebug_max_luns > 16384) {
6960 pr_warn("max_luns can be no more than 16384, use default\n");
6961 sdebug_max_luns = DEF_MAX_LUNS;
6962 }
6963 sdebug_lun_am = SAM_LUN_AM_FLAT;
8d039e22 6964 }
ea61fca5 6965
773642d9
DG
6966 if (sdebug_lowest_aligned > 0x3fff) {
6967 pr_err("lowest_aligned too big: %u\n", sdebug_lowest_aligned);
ea61fca5
MP
6968 return -EINVAL;
6969 }
6970
c4837394
DG
6971 if (submit_queues < 1) {
6972 pr_err("submit_queues must be 1 or more\n");
6973 return -EINVAL;
6974 }
c87bf24c
JG
6975
6976 if ((sdebug_max_queue > SDEBUG_CANQUEUE) || (sdebug_max_queue < 1)) {
6977 pr_err("max_queue must be in range [1, %d]\n", SDEBUG_CANQUEUE);
6978 return -EINVAL;
6979 }
6980
c10fa55f
JG
6981 if ((sdebug_host_max_queue > SDEBUG_CANQUEUE) ||
6982 (sdebug_host_max_queue < 0)) {
6983 pr_err("host_max_queue must be in range [0 %d]\n",
6984 SDEBUG_CANQUEUE);
6985 return -EINVAL;
6986 }
6987
6988 if (sdebug_host_max_queue &&
6989 (sdebug_max_queue != sdebug_host_max_queue)) {
6990 sdebug_max_queue = sdebug_host_max_queue;
6991 pr_warn("fixing max submit queue depth to host max queue depth, %d\n",
6992 sdebug_max_queue);
6993 }
6994
c4837394
DG
6995 sdebug_q_arr = kcalloc(submit_queues, sizeof(struct sdebug_queue),
6996 GFP_KERNEL);
6997 if (sdebug_q_arr == NULL)
6998 return -ENOMEM;
6999 for (k = 0; k < submit_queues; ++k)
7000 spin_lock_init(&sdebug_q_arr[k].qc_lock);
7001
f0d1cf93 7002 /*
9267e0eb
DG
7003 * check for host managed zoned block device specified with
7004 * ptype=0x14 or zbc=XXX.
f0d1cf93 7005 */
9267e0eb
DG
7006 if (sdebug_ptype == TYPE_ZBC) {
7007 sdeb_zbc_model = BLK_ZONED_HM;
7008 } else if (sdeb_zbc_model_s && *sdeb_zbc_model_s) {
7009 k = sdeb_zbc_model_str(sdeb_zbc_model_s);
7010 if (k < 0) {
7011 ret = k;
3b01d7ea 7012 goto free_q_arr;
9267e0eb
DG
7013 }
7014 sdeb_zbc_model = k;
7015 switch (sdeb_zbc_model) {
7016 case BLK_ZONED_NONE:
64e14ece 7017 case BLK_ZONED_HA:
9267e0eb
DG
7018 sdebug_ptype = TYPE_DISK;
7019 break;
7020 case BLK_ZONED_HM:
7021 sdebug_ptype = TYPE_ZBC;
7022 break;
9267e0eb
DG
7023 default:
7024 pr_err("Invalid ZBC model\n");
3b01d7ea
DL
7025 ret = -EINVAL;
7026 goto free_q_arr;
9267e0eb
DG
7027 }
7028 }
7029 if (sdeb_zbc_model != BLK_ZONED_NONE) {
f0d1cf93 7030 sdeb_zbc_in_use = true;
9267e0eb
DG
7031 if (sdebug_dev_size_mb == DEF_DEV_SIZE_PRE_INIT)
7032 sdebug_dev_size_mb = DEF_ZBC_DEV_SIZE_MB;
7033 }
f0d1cf93 7034
9267e0eb
DG
7035 if (sdebug_dev_size_mb == DEF_DEV_SIZE_PRE_INIT)
7036 sdebug_dev_size_mb = DEF_DEV_SIZE_MB;
773642d9
DG
7037 if (sdebug_dev_size_mb < 1)
7038 sdebug_dev_size_mb = 1; /* force minimum 1 MB ramdisk */
7039 sz = (unsigned long)sdebug_dev_size_mb * 1048576;
7040 sdebug_store_sectors = sz / sdebug_sector_size;
28898873 7041 sdebug_capacity = get_sdebug_capacity();
1da177e4
LT
7042
7043 /* play around with geometry, don't waste too much on track 0 */
7044 sdebug_heads = 8;
7045 sdebug_sectors_per = 32;
773642d9 7046 if (sdebug_dev_size_mb >= 256)
1da177e4 7047 sdebug_heads = 64;
773642d9 7048 else if (sdebug_dev_size_mb >= 16)
fa785f0a 7049 sdebug_heads = 32;
1da177e4
LT
7050 sdebug_cylinders_per = (unsigned long)sdebug_capacity /
7051 (sdebug_sectors_per * sdebug_heads);
7052 if (sdebug_cylinders_per >= 1024) {
7053 /* other LLDs do this; implies >= 1GB ram disk ... */
7054 sdebug_heads = 255;
7055 sdebug_sectors_per = 63;
7056 sdebug_cylinders_per = (unsigned long)sdebug_capacity /
7057 (sdebug_sectors_per * sdebug_heads);
7058 }
5b94e232 7059 if (scsi_debug_lbp()) {
773642d9
DG
7060 sdebug_unmap_max_blocks =
7061 clamp(sdebug_unmap_max_blocks, 0U, 0xffffffffU);
6014759c 7062
773642d9
DG
7063 sdebug_unmap_max_desc =
7064 clamp(sdebug_unmap_max_desc, 0U, 256U);
6014759c 7065
773642d9
DG
7066 sdebug_unmap_granularity =
7067 clamp(sdebug_unmap_granularity, 1U, 0xffffffffU);
6014759c 7068
773642d9
DG
7069 if (sdebug_unmap_alignment &&
7070 sdebug_unmap_granularity <=
7071 sdebug_unmap_alignment) {
c1287970 7072 pr_err("ERR: unmap_granularity <= unmap_alignment\n");
c4837394 7073 ret = -EINVAL;
87c715dc 7074 goto free_q_arr;
44d92694 7075 }
87c715dc
DG
7076 }
7077 xa_init_flags(per_store_ap, XA_FLAGS_ALLOC | XA_FLAGS_LOCK_IRQ);
7078 if (want_store) {
7079 idx = sdebug_add_store();
7080 if (idx < 0) {
7081 ret = idx;
7082 goto free_q_arr;
44d92694 7083 }
44d92694
MP
7084 }
7085
9b906779
NB
7086 pseudo_primary = root_device_register("pseudo_0");
7087 if (IS_ERR(pseudo_primary)) {
c1287970 7088 pr_warn("root_device_register() error\n");
9b906779 7089 ret = PTR_ERR(pseudo_primary);
6ecaff7f
RD
7090 goto free_vm;
7091 }
7092 ret = bus_register(&pseudo_lld_bus);
7093 if (ret < 0) {
c1287970 7094 pr_warn("bus_register error: %d\n", ret);
6ecaff7f
RD
7095 goto dev_unreg;
7096 }
7097 ret = driver_register(&sdebug_driverfs_driver);
7098 if (ret < 0) {
c1287970 7099 pr_warn("driver_register error: %d\n", ret);
6ecaff7f
RD
7100 goto bus_unreg;
7101 }
1da177e4 7102
87c715dc 7103 hosts_to_add = sdebug_add_host;
773642d9 7104 sdebug_add_host = 0;
1da177e4 7105
87c715dc
DG
7106 for (k = 0; k < hosts_to_add; k++) {
7107 if (want_store && k == 0) {
7108 ret = sdebug_add_host_helper(idx);
7109 if (ret < 0) {
7110 pr_err("add_host_helper k=%d, error=%d\n",
7111 k, -ret);
7112 break;
7113 }
7114 } else {
7115 ret = sdebug_do_add_host(want_store &&
7116 sdebug_per_host_store);
7117 if (ret < 0) {
7118 pr_err("add_host k=%d error=%d\n", k, -ret);
7119 break;
7120 }
9a051019
DG
7121 }
7122 }
773642d9 7123 if (sdebug_verbose)
f19fe8f3 7124 pr_info("built %d host(s)\n", sdebug_num_hosts);
c1287970 7125
1da177e4 7126 return 0;
6ecaff7f 7127
6ecaff7f
RD
7128bus_unreg:
7129 bus_unregister(&pseudo_lld_bus);
7130dev_unreg:
9b906779 7131 root_device_unregister(pseudo_primary);
6ecaff7f 7132free_vm:
87c715dc 7133 sdebug_erase_store(idx, NULL);
c4837394
DG
7134free_q_arr:
7135 kfree(sdebug_q_arr);
6ecaff7f 7136 return ret;
1da177e4
LT
7137}
7138
7139static void __exit scsi_debug_exit(void)
7140{
f19fe8f3 7141 int k = sdebug_num_hosts;
1da177e4 7142
f19fe8f3
BVA
7143 stop_all_queued();
7144 for (; k; k--)
87c715dc 7145 sdebug_do_remove_host(true);
52ab9768 7146 free_all_queued();
1da177e4
LT
7147 driver_unregister(&sdebug_driverfs_driver);
7148 bus_unregister(&pseudo_lld_bus);
9b906779 7149 root_device_unregister(pseudo_primary);
1da177e4 7150
87c715dc
DG
7151 sdebug_erase_all_stores(false);
7152 xa_destroy(per_store_ap);
f852c596 7153 kfree(sdebug_q_arr);
1da177e4
LT
7154}
7155
7156device_initcall(scsi_debug_init);
7157module_exit(scsi_debug_exit);
7158
91d4c752 7159static void sdebug_release_adapter(struct device *dev)
1da177e4 7160{
9a051019 7161 struct sdebug_host_info *sdbg_host;
1da177e4
LT
7162
7163 sdbg_host = to_sdebug_host(dev);
9a051019 7164 kfree(sdbg_host);
1da177e4
LT
7165}
7166
87c715dc
DG
7167/* idx must be valid, if sip is NULL then it will be obtained using idx */
7168static void sdebug_erase_store(int idx, struct sdeb_store_info *sip)
1da177e4 7169{
87c715dc
DG
7170 if (idx < 0)
7171 return;
7172 if (!sip) {
7173 if (xa_empty(per_store_ap))
7174 return;
7175 sip = xa_load(per_store_ap, idx);
7176 if (!sip)
7177 return;
7178 }
7179 vfree(sip->map_storep);
7180 vfree(sip->dif_storep);
7181 vfree(sip->storep);
7182 xa_erase(per_store_ap, idx);
7183 kfree(sip);
7184}
7185
7186/* Assume apart_from_first==false only in shutdown case. */
7187static void sdebug_erase_all_stores(bool apart_from_first)
7188{
7189 unsigned long idx;
7190 struct sdeb_store_info *sip = NULL;
7191
7192 xa_for_each(per_store_ap, idx, sip) {
7193 if (apart_from_first)
7194 apart_from_first = false;
7195 else
7196 sdebug_erase_store(idx, sip);
7197 }
7198 if (apart_from_first)
7199 sdeb_most_recent_idx = sdeb_first_idx;
7200}
7201
7202/*
7203 * Returns store xarray new element index (idx) if >=0 else negated errno.
7204 * Limit the number of stores to 65536.
7205 */
7206static int sdebug_add_store(void)
7207{
7208 int res;
7209 u32 n_idx;
7210 unsigned long iflags;
7211 unsigned long sz = (unsigned long)sdebug_dev_size_mb * 1048576;
7212 struct sdeb_store_info *sip = NULL;
7213 struct xa_limit xal = { .max = 1 << 16, .min = 0 };
7214
7215 sip = kzalloc(sizeof(*sip), GFP_KERNEL);
7216 if (!sip)
7217 return -ENOMEM;
7218
7219 xa_lock_irqsave(per_store_ap, iflags);
7220 res = __xa_alloc(per_store_ap, &n_idx, sip, xal, GFP_ATOMIC);
7221 if (unlikely(res < 0)) {
7222 xa_unlock_irqrestore(per_store_ap, iflags);
7223 kfree(sip);
7224 pr_warn("%s: xa_alloc() errno=%d\n", __func__, -res);
7225 return res;
7226 }
7227 sdeb_most_recent_idx = n_idx;
7228 if (sdeb_first_idx < 0)
7229 sdeb_first_idx = n_idx;
7230 xa_unlock_irqrestore(per_store_ap, iflags);
7231
7232 res = -ENOMEM;
7233 sip->storep = vzalloc(sz);
7234 if (!sip->storep) {
7235 pr_err("user data oom\n");
7236 goto err;
7237 }
7238 if (sdebug_num_parts > 0)
7239 sdebug_build_parts(sip->storep, sz);
7240
7241 /* DIF/DIX: what T10 calls Protection Information (PI) */
7242 if (sdebug_dix) {
7243 int dif_size;
7244
7245 dif_size = sdebug_store_sectors * sizeof(struct t10_pi_tuple);
7246 sip->dif_storep = vmalloc(dif_size);
7247
7248 pr_info("dif_storep %u bytes @ %pK\n", dif_size,
7249 sip->dif_storep);
7250
7251 if (!sip->dif_storep) {
7252 pr_err("DIX oom\n");
7253 goto err;
7254 }
7255 memset(sip->dif_storep, 0xff, dif_size);
7256 }
7257 /* Logical Block Provisioning */
7258 if (scsi_debug_lbp()) {
7259 map_size = lba_to_map_index(sdebug_store_sectors - 1) + 1;
7260 sip->map_storep = vmalloc(array_size(sizeof(long),
7261 BITS_TO_LONGS(map_size)));
7262
7263 pr_info("%lu provisioning blocks\n", map_size);
7264
7265 if (!sip->map_storep) {
7266 pr_err("LBP map oom\n");
7267 goto err;
7268 }
7269
7270 bitmap_zero(sip->map_storep, map_size);
7271
7272 /* Map first 1KB for partition table */
7273 if (sdebug_num_parts)
7274 map_region(sip, 0, 2);
7275 }
7276
7277 rwlock_init(&sip->macc_lck);
7278 return (int)n_idx;
7279err:
7280 sdebug_erase_store((int)n_idx, sip);
7281 pr_warn("%s: failed, errno=%d\n", __func__, -res);
7282 return res;
7283}
7284
7285static int sdebug_add_host_helper(int per_host_idx)
7286{
7287 int k, devs_per_host, idx;
7288 int error = -ENOMEM;
9a051019 7289 struct sdebug_host_info *sdbg_host;
8b40228f 7290 struct sdebug_dev_info *sdbg_devinfo, *tmp;
1da177e4 7291
9a051019 7292 sdbg_host = kzalloc(sizeof(*sdbg_host), GFP_KERNEL);
87c715dc 7293 if (!sdbg_host)
9a051019 7294 return -ENOMEM;
87c715dc
DG
7295 idx = (per_host_idx < 0) ? sdeb_first_idx : per_host_idx;
7296 if (xa_get_mark(per_store_ap, idx, SDEB_XA_NOT_IN_USE))
7297 xa_clear_mark(per_store_ap, idx, SDEB_XA_NOT_IN_USE);
7298 sdbg_host->si_idx = idx;
1da177e4 7299
9a051019 7300 INIT_LIST_HEAD(&sdbg_host->dev_info_list);
1da177e4 7301
773642d9 7302 devs_per_host = sdebug_num_tgts * sdebug_max_luns;
9a051019 7303 for (k = 0; k < devs_per_host; k++) {
5cb2fc06 7304 sdbg_devinfo = sdebug_device_create(sdbg_host, GFP_KERNEL);
87c715dc 7305 if (!sdbg_devinfo)
1da177e4 7306 goto clean;
9a051019 7307 }
1da177e4 7308
9a051019
DG
7309 spin_lock(&sdebug_host_list_lock);
7310 list_add_tail(&sdbg_host->host_list, &sdebug_host_list);
7311 spin_unlock(&sdebug_host_list_lock);
1da177e4 7312
9a051019
DG
7313 sdbg_host->dev.bus = &pseudo_lld_bus;
7314 sdbg_host->dev.parent = pseudo_primary;
7315 sdbg_host->dev.release = &sdebug_release_adapter;
f19fe8f3 7316 dev_set_name(&sdbg_host->dev, "adapter%d", sdebug_num_hosts);
1da177e4 7317
9a051019 7318 error = device_register(&sdbg_host->dev);
9a051019 7319 if (error)
1da177e4
LT
7320 goto clean;
7321
f19fe8f3 7322 ++sdebug_num_hosts;
87c715dc 7323 return 0;
1da177e4
LT
7324
7325clean:
8b40228f
FT
7326 list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
7327 dev_list) {
1da177e4 7328 list_del(&sdbg_devinfo->dev_list);
f0d1cf93 7329 kfree(sdbg_devinfo->zstate);
1da177e4
LT
7330 kfree(sdbg_devinfo);
7331 }
1da177e4 7332 kfree(sdbg_host);
87c715dc 7333 pr_warn("%s: failed, errno=%d\n", __func__, -error);
9a051019 7334 return error;
1da177e4
LT
7335}
7336
87c715dc 7337static int sdebug_do_add_host(bool mk_new_store)
1da177e4 7338{
87c715dc
DG
7339 int ph_idx = sdeb_most_recent_idx;
7340
7341 if (mk_new_store) {
7342 ph_idx = sdebug_add_store();
7343 if (ph_idx < 0)
7344 return ph_idx;
7345 }
7346 return sdebug_add_host_helper(ph_idx);
7347}
7348
7349static void sdebug_do_remove_host(bool the_end)
7350{
7351 int idx = -1;
9a051019 7352 struct sdebug_host_info *sdbg_host = NULL;
87c715dc 7353 struct sdebug_host_info *sdbg_host2;
1da177e4 7354
9a051019
DG
7355 spin_lock(&sdebug_host_list_lock);
7356 if (!list_empty(&sdebug_host_list)) {
7357 sdbg_host = list_entry(sdebug_host_list.prev,
7358 struct sdebug_host_info, host_list);
87c715dc 7359 idx = sdbg_host->si_idx;
1da177e4 7360 }
87c715dc
DG
7361 if (!the_end && idx >= 0) {
7362 bool unique = true;
7363
7364 list_for_each_entry(sdbg_host2, &sdebug_host_list, host_list) {
7365 if (sdbg_host2 == sdbg_host)
7366 continue;
7367 if (idx == sdbg_host2->si_idx) {
7368 unique = false;
7369 break;
7370 }
7371 }
7372 if (unique) {
7373 xa_set_mark(per_store_ap, idx, SDEB_XA_NOT_IN_USE);
7374 if (idx == sdeb_most_recent_idx)
7375 --sdeb_most_recent_idx;
7376 }
7377 }
7378 if (sdbg_host)
7379 list_del(&sdbg_host->host_list);
9a051019 7380 spin_unlock(&sdebug_host_list_lock);
1da177e4
LT
7381
7382 if (!sdbg_host)
7383 return;
7384
773642d9 7385 device_unregister(&sdbg_host->dev);
f19fe8f3 7386 --sdebug_num_hosts;
1da177e4
LT
7387}
7388
fd32119b 7389static int sdebug_change_qdepth(struct scsi_device *sdev, int qdepth)
cbf67842
DG
7390{
7391 int num_in_q = 0;
cbf67842
DG
7392 struct sdebug_dev_info *devip;
7393
f19fe8f3 7394 block_unblock_all_queues(true);
cbf67842
DG
7395 devip = (struct sdebug_dev_info *)sdev->hostdata;
7396 if (NULL == devip) {
f19fe8f3 7397 block_unblock_all_queues(false);
cbf67842
DG
7398 return -ENODEV;
7399 }
7400 num_in_q = atomic_read(&devip->num_in_q);
c40ecc12 7401
fc09acb7
DG
7402 if (qdepth > SDEBUG_CANQUEUE) {
7403 qdepth = SDEBUG_CANQUEUE;
7404 pr_warn("%s: requested qdepth [%d] exceeds canqueue [%d], trim\n", __func__,
7405 qdepth, SDEBUG_CANQUEUE);
7406 }
c40ecc12
CH
7407 if (qdepth < 1)
7408 qdepth = 1;
fc09acb7
DG
7409 if (qdepth != sdev->queue_depth)
7410 scsi_change_queue_depth(sdev, qdepth);
c40ecc12 7411
773642d9 7412 if (SDEBUG_OPT_Q_NOISE & sdebug_opts) {
c4837394 7413 sdev_printk(KERN_INFO, sdev, "%s: qdepth=%d, num_in_q=%d\n",
c40ecc12 7414 __func__, qdepth, num_in_q);
cbf67842 7415 }
f19fe8f3 7416 block_unblock_all_queues(false);
cbf67842
DG
7417 return sdev->queue_depth;
7418}
7419
c4837394 7420static bool fake_timeout(struct scsi_cmnd *scp)
817fd66b 7421{
c4837394 7422 if (0 == (atomic_read(&sdebug_cmnd_count) % abs(sdebug_every_nth))) {
773642d9
DG
7423 if (sdebug_every_nth < -1)
7424 sdebug_every_nth = -1;
7425 if (SDEBUG_OPT_TIMEOUT & sdebug_opts)
c4837394 7426 return true; /* ignore command causing timeout */
773642d9 7427 else if (SDEBUG_OPT_MAC_TIMEOUT & sdebug_opts &&
817fd66b 7428 scsi_medium_access_command(scp))
c4837394 7429 return true; /* time out reads and writes */
817fd66b 7430 }
c4837394 7431 return false;
817fd66b
DG
7432}
7433
fc13638a
DG
7434/* Response to TUR or media access command when device stopped */
7435static int resp_not_ready(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
7436{
7437 int stopped_state;
7438 u64 diff_ns = 0;
7439 ktime_t now_ts = ktime_get_boottime();
7440 struct scsi_device *sdp = scp->device;
7441
7442 stopped_state = atomic_read(&devip->stopped);
7443 if (stopped_state == 2) {
7444 if (ktime_to_ns(now_ts) > ktime_to_ns(devip->create_ts)) {
7445 diff_ns = ktime_to_ns(ktime_sub(now_ts, devip->create_ts));
7446 if (diff_ns >= ((u64)sdeb_tur_ms_to_ready * 1000000)) {
7447 /* tur_ms_to_ready timer extinguished */
7448 atomic_set(&devip->stopped, 0);
7449 return 0;
7450 }
7451 }
7452 mk_sense_buffer(scp, NOT_READY, LOGICAL_UNIT_NOT_READY, 0x1);
7453 if (sdebug_verbose)
7454 sdev_printk(KERN_INFO, sdp,
7455 "%s: Not ready: in process of becoming ready\n", my_name);
7456 if (scp->cmnd[0] == TEST_UNIT_READY) {
7457 u64 tur_nanosecs_to_ready = (u64)sdeb_tur_ms_to_ready * 1000000;
7458
7459 if (diff_ns <= tur_nanosecs_to_ready)
7460 diff_ns = tur_nanosecs_to_ready - diff_ns;
7461 else
7462 diff_ns = tur_nanosecs_to_ready;
7463 /* As per 20-061r2 approved for spc6 by T10 on 20200716 */
7464 do_div(diff_ns, 1000000); /* diff_ns becomes milliseconds */
7465 scsi_set_sense_information(scp->sense_buffer, SCSI_SENSE_BUFFERSIZE,
7466 diff_ns);
7467 return check_condition_result;
7468 }
7469 }
7470 mk_sense_buffer(scp, NOT_READY, LOGICAL_UNIT_NOT_READY, 0x2);
7471 if (sdebug_verbose)
7472 sdev_printk(KERN_INFO, sdp, "%s: Not ready: initializing command required\n",
7473 my_name);
7474 return check_condition_result;
7475}
7476
a4e1d0b7 7477static void sdebug_map_queues(struct Scsi_Host *shost)
c4b57d89
KD
7478{
7479 int i, qoff;
7480
7481 if (shost->nr_hw_queues == 1)
a4e1d0b7 7482 return;
c4b57d89
KD
7483
7484 for (i = 0, qoff = 0; i < HCTX_MAX_TYPES; i++) {
7485 struct blk_mq_queue_map *map = &shost->tag_set.map[i];
7486
7487 map->nr_queues = 0;
7488
7489 if (i == HCTX_TYPE_DEFAULT)
7490 map->nr_queues = submit_queues - poll_queues;
7491 else if (i == HCTX_TYPE_POLL)
7492 map->nr_queues = poll_queues;
7493
7494 if (!map->nr_queues) {
7495 BUG_ON(i == HCTX_TYPE_DEFAULT);
7496 continue;
7497 }
7498
7499 map->queue_offset = qoff;
7500 blk_mq_map_queues(map);
7501
7502 qoff += map->nr_queues;
7503 }
c4b57d89
KD
7504}
7505
7506static int sdebug_blk_mq_poll(struct Scsi_Host *shost, unsigned int queue_num)
7507{
4a0c6f43
DG
7508 bool first;
7509 bool retiring = false;
7510 int num_entries = 0;
7511 unsigned int qc_idx = 0;
c4b57d89 7512 unsigned long iflags;
4a0c6f43 7513 ktime_t kt_from_boot = ktime_get_boottime();
c4b57d89
KD
7514 struct sdebug_queue *sqp;
7515 struct sdebug_queued_cmd *sqcp;
7516 struct scsi_cmnd *scp;
7517 struct sdebug_dev_info *devip;
4a0c6f43 7518 struct sdebug_defer *sd_dp;
c4b57d89
KD
7519
7520 sqp = sdebug_q_arr + queue_num;
7521
4a0c6f43 7522 spin_lock_irqsave(&sqp->qc_lock, iflags);
c4b57d89 7523
6a0d0ae3
DLM
7524 qc_idx = find_first_bit(sqp->in_use_bm, sdebug_max_queue);
7525 if (qc_idx >= sdebug_max_queue)
7526 goto unlock;
7527
4a0c6f43
DG
7528 for (first = true; first || qc_idx + 1 < sdebug_max_queue; ) {
7529 if (first) {
4a0c6f43 7530 first = false;
b05d4e48
DG
7531 if (!test_bit(qc_idx, sqp->in_use_bm))
7532 continue;
4a0c6f43
DG
7533 } else {
7534 qc_idx = find_next_bit(sqp->in_use_bm, sdebug_max_queue, qc_idx + 1);
7535 }
b05d4e48 7536 if (qc_idx >= sdebug_max_queue)
4a0c6f43 7537 break;
c4b57d89
KD
7538
7539 sqcp = &sqp->qc_arr[qc_idx];
4a0c6f43
DG
7540 sd_dp = sqcp->sd_dp;
7541 if (unlikely(!sd_dp))
7542 continue;
c4b57d89
KD
7543 scp = sqcp->a_cmnd;
7544 if (unlikely(scp == NULL)) {
4a0c6f43 7545 pr_err("scp is NULL, queue_num=%d, qc_idx=%u from %s\n",
c4b57d89 7546 queue_num, qc_idx, __func__);
4a0c6f43 7547 break;
c4b57d89 7548 }
d9d23a5a 7549 if (READ_ONCE(sd_dp->defer_t) == SDEB_DEFER_POLL) {
4a0c6f43
DG
7550 if (kt_from_boot < sd_dp->cmpl_ts)
7551 continue;
7552
6ce913fe 7553 } else /* ignoring non REQ_POLLED requests */
4a0c6f43 7554 continue;
c4b57d89
KD
7555 devip = (struct sdebug_dev_info *)scp->device->hostdata;
7556 if (likely(devip))
7557 atomic_dec(&devip->num_in_q);
7558 else
7559 pr_err("devip=NULL from %s\n", __func__);
7560 if (unlikely(atomic_read(&retired_max_queue) > 0))
4a0c6f43 7561 retiring = true;
c4b57d89
KD
7562
7563 sqcp->a_cmnd = NULL;
7564 if (unlikely(!test_and_clear_bit(qc_idx, sqp->in_use_bm))) {
4a0c6f43 7565 pr_err("Unexpected completion sqp %p queue_num=%d qc_idx=%u from %s\n",
c4b57d89 7566 sqp, queue_num, qc_idx, __func__);
4a0c6f43 7567 break;
c4b57d89 7568 }
c4b57d89
KD
7569 if (unlikely(retiring)) { /* user has reduced max_queue */
7570 int k, retval;
7571
7572 retval = atomic_read(&retired_max_queue);
7573 if (qc_idx >= retval) {
7574 pr_err("index %d too large\n", retval);
4a0c6f43 7575 break;
c4b57d89
KD
7576 }
7577 k = find_last_bit(sqp->in_use_bm, retval);
7578 if ((k < sdebug_max_queue) || (k == retval))
7579 atomic_set(&retired_max_queue, 0);
7580 else
7581 atomic_set(&retired_max_queue, k + 1);
7582 }
d9d23a5a 7583 WRITE_ONCE(sd_dp->defer_t, SDEB_DEFER_NONE);
c4b57d89 7584 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
6c2c7d6a 7585 scsi_done(scp); /* callback to mid level */
c4b57d89 7586 num_entries++;
3fd07aec 7587 spin_lock_irqsave(&sqp->qc_lock, iflags);
b05d4e48 7588 if (find_first_bit(sqp->in_use_bm, sdebug_max_queue) >= sdebug_max_queue)
3fd07aec 7589 break;
4a0c6f43 7590 }
3fd07aec 7591
6a0d0ae3 7592unlock:
c4b57d89 7593 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
3fd07aec 7594
4a0c6f43
DG
7595 if (num_entries > 0)
7596 atomic_add(num_entries, &sdeb_mq_poll_count);
c4b57d89
KD
7597 return num_entries;
7598}
7599
fd32119b
DG
7600static int scsi_debug_queuecommand(struct Scsi_Host *shost,
7601 struct scsi_cmnd *scp)
c2248fc9
DG
7602{
7603 u8 sdeb_i;
7604 struct scsi_device *sdp = scp->device;
7605 const struct opcode_info_t *oip;
7606 const struct opcode_info_t *r_oip;
7607 struct sdebug_dev_info *devip;
7608 u8 *cmd = scp->cmnd;
7609 int (*r_pfp)(struct scsi_cmnd *, struct sdebug_dev_info *);
f66b8517 7610 int (*pfp)(struct scsi_cmnd *, struct sdebug_dev_info *) = NULL;
c2248fc9
DG
7611 int k, na;
7612 int errsts = 0;
ad0c7775 7613 u64 lun_index = sdp->lun & 0x3FFF;
c2248fc9
DG
7614 u32 flags;
7615 u16 sa;
7616 u8 opcode = cmd[0];
7617 bool has_wlun_rl;
3a90a63d 7618 bool inject_now;
c2248fc9
DG
7619
7620 scsi_set_resid(scp, 0);
3a90a63d 7621 if (sdebug_statistics) {
c4837394 7622 atomic_inc(&sdebug_cmnd_count);
3a90a63d
DG
7623 inject_now = inject_on_this_cmd();
7624 } else {
7625 inject_now = false;
7626 }
f46eb0e9
DG
7627 if (unlikely(sdebug_verbose &&
7628 !(SDEBUG_OPT_NO_CDB_NOISE & sdebug_opts))) {
c2248fc9
DG
7629 char b[120];
7630 int n, len, sb;
7631
7632 len = scp->cmd_len;
7633 sb = (int)sizeof(b);
7634 if (len > 32)
7635 strcpy(b, "too long, over 32 bytes");
7636 else {
7637 for (k = 0, n = 0; k < len && n < sb; ++k)
7638 n += scnprintf(b + n, sb - n, "%02x ",
7639 (u32)cmd[k]);
7640 }
458df78b 7641 sdev_printk(KERN_INFO, sdp, "%s: tag=%#x, cmd %s\n", my_name,
a6e76e6f 7642 blk_mq_unique_tag(scsi_cmd_to_rq(scp)), b);
c2248fc9 7643 }
3a90a63d 7644 if (unlikely(inject_now && (sdebug_opts & SDEBUG_OPT_HOST_BUSY)))
7ee6d1b4 7645 return SCSI_MLQUEUE_HOST_BUSY;
34d55434 7646 has_wlun_rl = (sdp->lun == SCSI_W_LUN_REPORT_LUNS);
ad0c7775 7647 if (unlikely(lun_index >= sdebug_max_luns && !has_wlun_rl))
f46eb0e9 7648 goto err_out;
c2248fc9
DG
7649
7650 sdeb_i = opcode_ind_arr[opcode]; /* fully mapped */
7651 oip = &opcode_info_arr[sdeb_i]; /* safe if table consistent */
7652 devip = (struct sdebug_dev_info *)sdp->hostdata;
f46eb0e9
DG
7653 if (unlikely(!devip)) {
7654 devip = find_build_dev_info(sdp);
c2248fc9 7655 if (NULL == devip)
f46eb0e9 7656 goto err_out;
c2248fc9 7657 }
3a90a63d
DG
7658 if (unlikely(inject_now && !atomic_read(&sdeb_inject_pending)))
7659 atomic_set(&sdeb_inject_pending, 1);
7660
c2248fc9
DG
7661 na = oip->num_attached;
7662 r_pfp = oip->pfp;
7663 if (na) { /* multiple commands with this opcode */
7664 r_oip = oip;
7665 if (FF_SA & r_oip->flags) {
7666 if (F_SA_LOW & oip->flags)
7667 sa = 0x1f & cmd[1];
7668 else
7669 sa = get_unaligned_be16(cmd + 8);
7670 for (k = 0; k <= na; oip = r_oip->arrp + k++) {
7671 if (opcode == oip->opcode && sa == oip->sa)
7672 break;
7673 }
7674 } else { /* since no service action only check opcode */
7675 for (k = 0; k <= na; oip = r_oip->arrp + k++) {
7676 if (opcode == oip->opcode)
7677 break;
7678 }
7679 }
7680 if (k > na) {
7681 if (F_SA_LOW & r_oip->flags)
7682 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 4);
7683 else if (F_SA_HIGH & r_oip->flags)
7684 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 8, 7);
7685 else
7686 mk_sense_invalid_opcode(scp);
7687 goto check_cond;
7688 }
7689 } /* else (when na==0) we assume the oip is a match */
7690 flags = oip->flags;
f46eb0e9 7691 if (unlikely(F_INV_OP & flags)) {
c2248fc9
DG
7692 mk_sense_invalid_opcode(scp);
7693 goto check_cond;
7694 }
f46eb0e9 7695 if (unlikely(has_wlun_rl && !(F_RL_WLUN_OK & flags))) {
773642d9
DG
7696 if (sdebug_verbose)
7697 sdev_printk(KERN_INFO, sdp, "%s: Opcode 0x%x not%s\n",
7698 my_name, opcode, " supported for wlun");
c2248fc9
DG
7699 mk_sense_invalid_opcode(scp);
7700 goto check_cond;
7701 }
f46eb0e9 7702 if (unlikely(sdebug_strict)) { /* check cdb against mask */
c2248fc9
DG
7703 u8 rem;
7704 int j;
7705
7706 for (k = 1; k < oip->len_mask[0] && k < 16; ++k) {
7707 rem = ~oip->len_mask[k] & cmd[k];
7708 if (rem) {
7709 for (j = 7; j >= 0; --j, rem <<= 1) {
7710 if (0x80 & rem)
7711 break;
7712 }
7713 mk_sense_invalid_fld(scp, SDEB_IN_CDB, k, j);
7714 goto check_cond;
7715 }
7716 }
7717 }
f46eb0e9 7718 if (unlikely(!(F_SKIP_UA & flags) &&
b01f6f83
DG
7719 find_first_bit(devip->uas_bm,
7720 SDEBUG_NUM_UAS) != SDEBUG_NUM_UAS)) {
f46eb0e9 7721 errsts = make_ua(scp, devip);
c2248fc9
DG
7722 if (errsts)
7723 goto check_cond;
7724 }
fc13638a
DG
7725 if (unlikely(((F_M_ACCESS & flags) || scp->cmnd[0] == TEST_UNIT_READY) &&
7726 atomic_read(&devip->stopped))) {
7727 errsts = resp_not_ready(scp, devip);
7728 if (errsts)
7729 goto fini;
c2248fc9 7730 }
773642d9 7731 if (sdebug_fake_rw && (F_FAKE_RW & flags))
c2248fc9 7732 goto fini;
f46eb0e9 7733 if (unlikely(sdebug_every_nth)) {
c4837394 7734 if (fake_timeout(scp))
c2248fc9
DG
7735 return 0; /* ignore command: make trouble */
7736 }
f46eb0e9 7737 if (likely(oip->pfp))
f66b8517
MW
7738 pfp = oip->pfp; /* calls a resp_* function */
7739 else
7740 pfp = r_pfp; /* if leaf function ptr NULL, try the root's */
c2248fc9
DG
7741
7742fini:
67da413f 7743 if (F_DELAY_OVERR & flags) /* cmds like INQUIRY respond asap */
f66b8517 7744 return schedule_resp(scp, devip, errsts, pfp, 0, 0);
75aa3209
DG
7745 else if ((flags & F_LONG_DELAY) && (sdebug_jdelay > 0 ||
7746 sdebug_ndelay > 10000)) {
80c49563 7747 /*
75aa3209
DG
7748 * Skip long delays if ndelay <= 10 microseconds. Otherwise
7749 * for Start Stop Unit (SSU) want at least 1 second delay and
7750 * if sdebug_jdelay>1 want a long delay of that many seconds.
7751 * For Synchronize Cache want 1/20 of SSU's delay.
80c49563
DG
7752 */
7753 int jdelay = (sdebug_jdelay < 2) ? 1 : sdebug_jdelay;
4f2c8bf6 7754 int denom = (flags & F_SYNC_DELAY) ? 20 : 1;
80c49563 7755
4f2c8bf6 7756 jdelay = mult_frac(USER_HZ * jdelay, HZ, denom * USER_HZ);
f66b8517 7757 return schedule_resp(scp, devip, errsts, pfp, jdelay, 0);
80c49563 7758 } else
f66b8517 7759 return schedule_resp(scp, devip, errsts, pfp, sdebug_jdelay,
10bde980 7760 sdebug_ndelay);
c2248fc9 7761check_cond:
f66b8517 7762 return schedule_resp(scp, devip, check_condition_result, NULL, 0, 0);
f46eb0e9 7763err_out:
f66b8517 7764 return schedule_resp(scp, NULL, DID_NO_CONNECT << 16, NULL, 0, 0);
c2248fc9
DG
7765}
7766
9e603ca0 7767static struct scsi_host_template sdebug_driver_template = {
c8ed555a
AV
7768 .show_info = scsi_debug_show_info,
7769 .write_info = scsi_debug_write_info,
9e603ca0
FT
7770 .proc_name = sdebug_proc_name,
7771 .name = "SCSI DEBUG",
7772 .info = scsi_debug_info,
7773 .slave_alloc = scsi_debug_slave_alloc,
7774 .slave_configure = scsi_debug_slave_configure,
7775 .slave_destroy = scsi_debug_slave_destroy,
7776 .ioctl = scsi_debug_ioctl,
185dd232 7777 .queuecommand = scsi_debug_queuecommand,
cbf67842 7778 .change_queue_depth = sdebug_change_qdepth,
c4b57d89
KD
7779 .map_queues = sdebug_map_queues,
7780 .mq_poll = sdebug_blk_mq_poll,
9e603ca0 7781 .eh_abort_handler = scsi_debug_abort,
9e603ca0 7782 .eh_device_reset_handler = scsi_debug_device_reset,
cbf67842
DG
7783 .eh_target_reset_handler = scsi_debug_target_reset,
7784 .eh_bus_reset_handler = scsi_debug_bus_reset,
9e603ca0 7785 .eh_host_reset_handler = scsi_debug_host_reset,
c4837394 7786 .can_queue = SDEBUG_CANQUEUE,
9e603ca0 7787 .this_id = 7,
65e8617f 7788 .sg_tablesize = SG_MAX_SEGMENTS,
cbf67842 7789 .cmd_per_lun = DEF_CMD_PER_LUN,
6bb5e6e7 7790 .max_sectors = -1U,
50c2e910 7791 .max_segment_size = -1U,
9e603ca0 7792 .module = THIS_MODULE,
c40ecc12 7793 .track_queue_depth = 1,
9e603ca0
FT
7794};
7795
91d4c752 7796static int sdebug_driver_probe(struct device *dev)
1da177e4 7797{
22017ed2
DG
7798 int error = 0;
7799 struct sdebug_host_info *sdbg_host;
7800 struct Scsi_Host *hpnt;
f46eb0e9 7801 int hprot;
1da177e4
LT
7802
7803 sdbg_host = to_sdebug_host(dev);
7804
f7c4cdc7 7805 sdebug_driver_template.can_queue = sdebug_max_queue;
fc09acb7 7806 sdebug_driver_template.cmd_per_lun = sdebug_max_queue;
2a3d4eb8 7807 if (!sdebug_clustering)
4af14d11
CH
7808 sdebug_driver_template.dma_boundary = PAGE_SIZE - 1;
7809
78d4e5a0
DG
7810 hpnt = scsi_host_alloc(&sdebug_driver_template, sizeof(sdbg_host));
7811 if (NULL == hpnt) {
c1287970 7812 pr_err("scsi_host_alloc failed\n");
78d4e5a0 7813 error = -ENODEV;
1da177e4 7814 return error;
78d4e5a0 7815 }
c4837394 7816 if (submit_queues > nr_cpu_ids) {
9b130ad5 7817 pr_warn("%s: trim submit_queues (was %d) to nr_cpu_ids=%u\n",
c4837394
DG
7818 my_name, submit_queues, nr_cpu_ids);
7819 submit_queues = nr_cpu_ids;
7820 }
c10fa55f
JG
7821 /*
7822 * Decide whether to tell scsi subsystem that we want mq. The
f7c4cdc7 7823 * following should give the same answer for each host.
c10fa55f 7824 */
f7c4cdc7
JG
7825 hpnt->nr_hw_queues = submit_queues;
7826 if (sdebug_host_max_queue)
7827 hpnt->host_tagset = 1;
1da177e4 7828
c4b57d89
KD
7829 /* poll queues are possible for nr_hw_queues > 1 */
7830 if (hpnt->nr_hw_queues == 1 || (poll_queues < 1)) {
7831 pr_warn("%s: trim poll_queues to 0. poll_q/nr_hw = (%d/%d)\n",
7832 my_name, poll_queues, hpnt->nr_hw_queues);
7833 poll_queues = 0;
7834 }
7835
7836 /*
7837 * Poll queues don't need interrupts, but we need at least one I/O queue
7838 * left over for non-polled I/O.
7839 * If condition not met, trim poll_queues to 1 (just for simplicity).
7840 */
7841 if (poll_queues >= submit_queues) {
fc09acb7
DG
7842 if (submit_queues < 3)
7843 pr_warn("%s: trim poll_queues to 1\n", my_name);
7844 else
7845 pr_warn("%s: trim poll_queues to 1. Perhaps try poll_queues=%d\n",
7846 my_name, submit_queues - 1);
c4b57d89
KD
7847 poll_queues = 1;
7848 }
7849 if (poll_queues)
7850 hpnt->nr_maps = 3;
7851
9a051019 7852 sdbg_host->shost = hpnt;
1da177e4 7853 *((struct sdebug_host_info **)hpnt->hostdata) = sdbg_host;
773642d9
DG
7854 if ((hpnt->this_id >= 0) && (sdebug_num_tgts > hpnt->this_id))
7855 hpnt->max_id = sdebug_num_tgts + 1;
1da177e4 7856 else
773642d9
DG
7857 hpnt->max_id = sdebug_num_tgts;
7858 /* = sdebug_max_luns; */
f2d3fd29 7859 hpnt->max_lun = SCSI_W_LUN_REPORT_LUNS + 1;
1da177e4 7860
f46eb0e9 7861 hprot = 0;
c6a44287 7862
773642d9 7863 switch (sdebug_dif) {
c6a44287 7864
8475c811 7865 case T10_PI_TYPE1_PROTECTION:
f46eb0e9 7866 hprot = SHOST_DIF_TYPE1_PROTECTION;
773642d9 7867 if (sdebug_dix)
f46eb0e9 7868 hprot |= SHOST_DIX_TYPE1_PROTECTION;
c6a44287
MP
7869 break;
7870
8475c811 7871 case T10_PI_TYPE2_PROTECTION:
f46eb0e9 7872 hprot = SHOST_DIF_TYPE2_PROTECTION;
773642d9 7873 if (sdebug_dix)
f46eb0e9 7874 hprot |= SHOST_DIX_TYPE2_PROTECTION;
c6a44287
MP
7875 break;
7876
8475c811 7877 case T10_PI_TYPE3_PROTECTION:
f46eb0e9 7878 hprot = SHOST_DIF_TYPE3_PROTECTION;
773642d9 7879 if (sdebug_dix)
f46eb0e9 7880 hprot |= SHOST_DIX_TYPE3_PROTECTION;
c6a44287
MP
7881 break;
7882
7883 default:
773642d9 7884 if (sdebug_dix)
f46eb0e9 7885 hprot |= SHOST_DIX_TYPE0_PROTECTION;
c6a44287
MP
7886 break;
7887 }
7888
f46eb0e9 7889 scsi_host_set_prot(hpnt, hprot);
c6a44287 7890
f46eb0e9
DG
7891 if (have_dif_prot || sdebug_dix)
7892 pr_info("host protection%s%s%s%s%s%s%s\n",
7893 (hprot & SHOST_DIF_TYPE1_PROTECTION) ? " DIF1" : "",
7894 (hprot & SHOST_DIF_TYPE2_PROTECTION) ? " DIF2" : "",
7895 (hprot & SHOST_DIF_TYPE3_PROTECTION) ? " DIF3" : "",
7896 (hprot & SHOST_DIX_TYPE0_PROTECTION) ? " DIX0" : "",
7897 (hprot & SHOST_DIX_TYPE1_PROTECTION) ? " DIX1" : "",
7898 (hprot & SHOST_DIX_TYPE2_PROTECTION) ? " DIX2" : "",
7899 (hprot & SHOST_DIX_TYPE3_PROTECTION) ? " DIX3" : "");
c6a44287 7900
773642d9 7901 if (sdebug_guard == 1)
c6a44287
MP
7902 scsi_host_set_guard(hpnt, SHOST_DIX_GUARD_IP);
7903 else
7904 scsi_host_set_guard(hpnt, SHOST_DIX_GUARD_CRC);
7905
773642d9
DG
7906 sdebug_verbose = !!(SDEBUG_OPT_NOISE & sdebug_opts);
7907 sdebug_any_injecting_opt = !!(SDEBUG_OPT_ALL_INJECTING & sdebug_opts);
c4837394
DG
7908 if (sdebug_every_nth) /* need stats counters for every_nth */
7909 sdebug_statistics = true;
9a051019
DG
7910 error = scsi_add_host(hpnt, &sdbg_host->dev);
7911 if (error) {
c1287970 7912 pr_err("scsi_add_host failed\n");
9a051019 7913 error = -ENODEV;
1da177e4 7914 scsi_host_put(hpnt);
87c715dc 7915 } else {
1da177e4 7916 scsi_scan_host(hpnt);
87c715dc 7917 }
1da177e4 7918
cbf67842 7919 return error;
1da177e4
LT
7920}
7921
fc7a6209 7922static void sdebug_driver_remove(struct device *dev)
1da177e4 7923{
9a051019 7924 struct sdebug_host_info *sdbg_host;
8b40228f 7925 struct sdebug_dev_info *sdbg_devinfo, *tmp;
1da177e4
LT
7926
7927 sdbg_host = to_sdebug_host(dev);
7928
9a051019 7929 scsi_remove_host(sdbg_host->shost);
1da177e4 7930
8b40228f
FT
7931 list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
7932 dev_list) {
9a051019 7933 list_del(&sdbg_devinfo->dev_list);
f0d1cf93 7934 kfree(sdbg_devinfo->zstate);
9a051019
DG
7935 kfree(sdbg_devinfo);
7936 }
1da177e4 7937
9a051019 7938 scsi_host_put(sdbg_host->shost);
1da177e4
LT
7939}
7940
8dea0d02
FT
7941static int pseudo_lld_bus_match(struct device *dev,
7942 struct device_driver *dev_driver)
1da177e4 7943{
8dea0d02 7944 return 1;
1da177e4 7945}
8dea0d02
FT
7946
7947static struct bus_type pseudo_lld_bus = {
7948 .name = "pseudo",
7949 .match = pseudo_lld_bus_match,
7950 .probe = sdebug_driver_probe,
7951 .remove = sdebug_driver_remove,
82069379 7952 .drv_groups = sdebug_drv_groups,
8dea0d02 7953};