linux/drivers/scsi/scsi_debug.c
<<
>>
Prefs
   1/*
   2 * vvvvvvvvvvvvvvvvvvvvvvv Original vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
   3 *  Copyright (C) 1992  Eric Youngdale
   4 *  Simulate a host adapter with 2 disks attached.  Do a lot of checking
   5 *  to make sure that we are not getting blocks mixed up, and PANIC if
   6 *  anything out of the ordinary is seen.
   7 * ^^^^^^^^^^^^^^^^^^^^^^^ Original ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   8 *
   9 *  This version is more generic, simulating a variable number of disk
  10 *  (or disk like devices) sharing a common amount of RAM. To be more
  11 *  realistic, the simulated devices have the transport attributes of
  12 *  SAS disks.
  13 *
  14 *
  15 *  For documentation see http://sg.danny.cz/sg/sdebug26.html
  16 *
  17 *   D. Gilbert (dpg) work for Magneto-Optical device test [20010421]
  18 *   dpg: work for devfs large number of disks [20010809]
  19 *        forked for lk 2.5 series [20011216, 20020101]
  20 *        use vmalloc() more inquiry+mode_sense [20020302]
  21 *        add timers for delayed responses [20020721]
  22 *   Patrick Mansfield <patmans@us.ibm.com> max_luns+scsi_level [20021031]
  23 *   Mike Anderson <andmike@us.ibm.com> sysfs work [20021118]
  24 *   dpg: change style of boot options to "scsi_debug.num_tgts=2" and
  25 *        module options to "modprobe scsi_debug num_tgts=2" [20021221]
  26 */
  27
  28#include <linux/module.h>
  29
  30#include <linux/kernel.h>
  31#include <linux/errno.h>
  32#include <linux/timer.h>
  33#include <linux/slab.h>
  34#include <linux/types.h>
  35#include <linux/string.h>
  36#include <linux/genhd.h>
  37#include <linux/fs.h>
  38#include <linux/init.h>
  39#include <linux/proc_fs.h>
  40#include <linux/vmalloc.h>
  41#include <linux/moduleparam.h>
  42#include <linux/scatterlist.h>
  43#include <linux/blkdev.h>
  44#include <linux/crc-t10dif.h>
  45#include <linux/spinlock.h>
  46#include <linux/interrupt.h>
  47#include <linux/atomic.h>
  48#include <linux/hrtimer.h>
  49
  50#include <net/checksum.h>
  51
  52#include <asm/unaligned.h>
  53
  54#include <scsi/scsi.h>
  55#include <scsi/scsi_cmnd.h>
  56#include <scsi/scsi_device.h>
  57#include <scsi/scsi_host.h>
  58#include <scsi/scsicam.h>
  59#include <scsi/scsi_eh.h>
  60#include <scsi/scsi_tcq.h>
  61#include <scsi/scsi_dbg.h>
  62
  63#include "sd.h"
  64#include "scsi_logging.h"
  65
  66#define SCSI_DEBUG_VERSION "1.84"
  67static const char *scsi_debug_version_date = "20140706";
  68
  69#define MY_NAME "scsi_debug"
  70
  71/* Additional Sense Code (ASC) */
  72#define NO_ADDITIONAL_SENSE 0x0
  73#define LOGICAL_UNIT_NOT_READY 0x4
  74#define LOGICAL_UNIT_COMMUNICATION_FAILURE 0x8
  75#define UNRECOVERED_READ_ERR 0x11
  76#define PARAMETER_LIST_LENGTH_ERR 0x1a
  77#define INVALID_OPCODE 0x20
  78#define ADDR_OUT_OF_RANGE 0x21
  79#define INVALID_COMMAND_OPCODE 0x20
  80#define INVALID_FIELD_IN_CDB 0x24
  81#define INVALID_FIELD_IN_PARAM_LIST 0x26
  82#define UA_RESET_ASC 0x29
  83#define UA_CHANGED_ASC 0x2a
  84#define POWER_ON_RESET_ASCQ 0x0
  85#define BUS_RESET_ASCQ 0x2      /* scsi bus reset occurred */
  86#define MODE_CHANGED_ASCQ 0x1   /* mode parameters changed */
  87#define SAVING_PARAMS_UNSUP 0x39
  88#define TRANSPORT_PROBLEM 0x4b
  89#define THRESHOLD_EXCEEDED 0x5d
  90#define LOW_POWER_COND_ON 0x5e
  91
  92/* Additional Sense Code Qualifier (ASCQ) */
  93#define ACK_NAK_TO 0x3
  94
  95
  96/* Default values for driver parameters */
  97#define DEF_NUM_HOST   1
  98#define DEF_NUM_TGTS   1
  99#define DEF_MAX_LUNS   1
 100/* With these defaults, this driver will make 1 host with 1 target
 101 * (id 0) containing 1 logical unit (lun 0). That is 1 device.
 102 */
 103#define DEF_ATO 1
 104#define DEF_DELAY   1           /* if > 0 unit is a jiffy */
 105#define DEF_DEV_SIZE_MB   8
 106#define DEF_DIF 0
 107#define DEF_DIX 0
 108#define DEF_D_SENSE   0
 109#define DEF_EVERY_NTH   0
 110#define DEF_FAKE_RW     0
 111#define DEF_GUARD 0
 112#define DEF_HOST_LOCK 0
 113#define DEF_LBPU 0
 114#define DEF_LBPWS 0
 115#define DEF_LBPWS10 0
 116#define DEF_LBPRZ 1
 117#define DEF_LOWEST_ALIGNED 0
 118#define DEF_NDELAY   0          /* if > 0 unit is a nanosecond */
 119#define DEF_NO_LUN_0   0
 120#define DEF_NUM_PARTS   0
 121#define DEF_OPTS   0
 122#define DEF_OPT_BLKS 64
 123#define DEF_PHYSBLK_EXP 0
 124#define DEF_PTYPE   0
 125#define DEF_REMOVABLE false
 126#define DEF_SCSI_LEVEL   6    /* INQUIRY, byte2 [6->SPC-4] */
 127#define DEF_SECTOR_SIZE 512
 128#define DEF_TAGGED_QUEUING 0 /* 0 | MSG_SIMPLE_TAG | MSG_ORDERED_TAG */
 129#define DEF_UNMAP_ALIGNMENT 0
 130#define DEF_UNMAP_GRANULARITY 1
 131#define DEF_UNMAP_MAX_BLOCKS 0xFFFFFFFF
 132#define DEF_UNMAP_MAX_DESC 256
 133#define DEF_VIRTUAL_GB   0
 134#define DEF_VPD_USE_HOSTNO 1
 135#define DEF_WRITESAME_LENGTH 0xFFFF
 136#define DELAY_OVERRIDDEN -9999
 137
 138/* bit mask values for scsi_debug_opts */
 139#define SCSI_DEBUG_OPT_NOISE   1
 140#define SCSI_DEBUG_OPT_MEDIUM_ERR   2
 141#define SCSI_DEBUG_OPT_TIMEOUT   4
 142#define SCSI_DEBUG_OPT_RECOVERED_ERR   8
 143#define SCSI_DEBUG_OPT_TRANSPORT_ERR   16
 144#define SCSI_DEBUG_OPT_DIF_ERR   32
 145#define SCSI_DEBUG_OPT_DIX_ERR   64
 146#define SCSI_DEBUG_OPT_MAC_TIMEOUT  128
 147#define SCSI_DEBUG_OPT_SHORT_TRANSFER   0x100
 148#define SCSI_DEBUG_OPT_Q_NOISE  0x200
 149#define SCSI_DEBUG_OPT_ALL_TSF  0x400
 150#define SCSI_DEBUG_OPT_RARE_TSF 0x800
 151#define SCSI_DEBUG_OPT_N_WCE    0x1000
 152#define SCSI_DEBUG_OPT_RESET_NOISE 0x2000
 153#define SCSI_DEBUG_OPT_NO_CDB_NOISE 0x4000
 154#define SCSI_DEBUG_OPT_ALL_NOISE (0x1 | 0x200 | 0x2000)
 155/* When "every_nth" > 0 then modulo "every_nth" commands:
 156 *   - a no response is simulated if SCSI_DEBUG_OPT_TIMEOUT is set
 157 *   - a RECOVERED_ERROR is simulated on successful read and write
 158 *     commands if SCSI_DEBUG_OPT_RECOVERED_ERR is set.
 159 *   - a TRANSPORT_ERROR is simulated on successful read and write
 160 *     commands if SCSI_DEBUG_OPT_TRANSPORT_ERR is set.
 161 *
 162 * When "every_nth" < 0 then after "- every_nth" commands:
 163 *   - a no response is simulated if SCSI_DEBUG_OPT_TIMEOUT is set
 164 *   - a RECOVERED_ERROR is simulated on successful read and write
 165 *     commands if SCSI_DEBUG_OPT_RECOVERED_ERR is set.
 166 *   - a TRANSPORT_ERROR is simulated on successful read and write
 167 *     commands if SCSI_DEBUG_OPT_TRANSPORT_ERR is set.
 168 * This will continue until some other action occurs (e.g. the user
 169 * writing a new value (other than -1 or 1) to every_nth via sysfs).
 170 */
 171
 172/* As indicated in SAM-5 and SPC-4 Unit Attentions (UAs)are returned in
 173 * priority order. In the subset implemented here lower numbers have higher
 174 * priority. The UA numbers should be a sequence starting from 0 with
 175 * SDEBUG_NUM_UAS being 1 higher than the highest numbered UA. */
 176#define SDEBUG_UA_POR 0         /* Power on, reset, or bus device reset */
 177#define SDEBUG_UA_BUS_RESET 1
 178#define SDEBUG_UA_MODE_CHANGED 2
 179#define SDEBUG_NUM_UAS 3
 180
 181/* for check_readiness() */
 182#define UAS_ONLY 1
 183#define UAS_TUR 0
 184
 185/* when 1==SCSI_DEBUG_OPT_MEDIUM_ERR, a medium error is simulated at this
 186 * sector on read commands: */
 187#define OPT_MEDIUM_ERR_ADDR   0x1234 /* that's sector 4660 in decimal */
 188#define OPT_MEDIUM_ERR_NUM    10     /* number of consecutive medium errs */
 189
 190/* If REPORT LUNS has luns >= 256 it can choose "flat space" (value 1)
 191 * or "peripheral device" addressing (value 0) */
 192#define SAM2_LUN_ADDRESS_METHOD 0
 193#define SAM2_WLUN_REPORT_LUNS 0xc101
 194
 195/* SCSI_DEBUG_CANQUEUE is the maximum number of commands that can be queued
 196 * (for response) at one time. Can be reduced by max_queue option. Command
 197 * responses are not queued when delay=0 and ndelay=0. The per-device
 198 * DEF_CMD_PER_LUN can be changed via sysfs:
 199 * /sys/class/scsi_device/<h:c:t:l>/device/queue_depth but cannot exceed
 200 * SCSI_DEBUG_CANQUEUE. */
 201#define SCSI_DEBUG_CANQUEUE_WORDS  9    /* a WORD is bits in a long */
 202#define SCSI_DEBUG_CANQUEUE  (SCSI_DEBUG_CANQUEUE_WORDS * BITS_PER_LONG)
 203#define DEF_CMD_PER_LUN  255
 204
 205#if DEF_CMD_PER_LUN > SCSI_DEBUG_CANQUEUE
 206#warning "Expect DEF_CMD_PER_LUN <= SCSI_DEBUG_CANQUEUE"
 207#endif
 208
 209static int scsi_debug_add_host = DEF_NUM_HOST;
 210static int scsi_debug_ato = DEF_ATO;
 211static int scsi_debug_delay = DEF_DELAY;
 212static int scsi_debug_dev_size_mb = DEF_DEV_SIZE_MB;
 213static int scsi_debug_dif = DEF_DIF;
 214static int scsi_debug_dix = DEF_DIX;
 215static int scsi_debug_dsense = DEF_D_SENSE;
 216static int scsi_debug_every_nth = DEF_EVERY_NTH;
 217static int scsi_debug_fake_rw = DEF_FAKE_RW;
 218static unsigned int scsi_debug_guard = DEF_GUARD;
 219static int scsi_debug_lowest_aligned = DEF_LOWEST_ALIGNED;
 220static int scsi_debug_max_luns = DEF_MAX_LUNS;
 221static int scsi_debug_max_queue = SCSI_DEBUG_CANQUEUE;
 222static atomic_t retired_max_queue;      /* if > 0 then was prior max_queue */
 223static int scsi_debug_ndelay = DEF_NDELAY;
 224static int scsi_debug_no_lun_0 = DEF_NO_LUN_0;
 225static int scsi_debug_no_uld = 0;
 226static int scsi_debug_num_parts = DEF_NUM_PARTS;
 227static int scsi_debug_num_tgts = DEF_NUM_TGTS; /* targets per host */
 228static int scsi_debug_opt_blks = DEF_OPT_BLKS;
 229static int scsi_debug_opts = DEF_OPTS;
 230static int scsi_debug_physblk_exp = DEF_PHYSBLK_EXP;
 231static int scsi_debug_ptype = DEF_PTYPE; /* SCSI peripheral type (0==disk) */
 232static int scsi_debug_scsi_level = DEF_SCSI_LEVEL;
 233static int scsi_debug_sector_size = DEF_SECTOR_SIZE;
 234static int scsi_debug_virtual_gb = DEF_VIRTUAL_GB;
 235static int scsi_debug_vpd_use_hostno = DEF_VPD_USE_HOSTNO;
 236static unsigned int scsi_debug_lbpu = DEF_LBPU;
 237static unsigned int scsi_debug_lbpws = DEF_LBPWS;
 238static unsigned int scsi_debug_lbpws10 = DEF_LBPWS10;
 239static unsigned int scsi_debug_lbprz = DEF_LBPRZ;
 240static unsigned int scsi_debug_unmap_alignment = DEF_UNMAP_ALIGNMENT;
 241static unsigned int scsi_debug_unmap_granularity = DEF_UNMAP_GRANULARITY;
 242static unsigned int scsi_debug_unmap_max_blocks = DEF_UNMAP_MAX_BLOCKS;
 243static unsigned int scsi_debug_unmap_max_desc = DEF_UNMAP_MAX_DESC;
 244static unsigned int scsi_debug_write_same_length = DEF_WRITESAME_LENGTH;
 245static bool scsi_debug_removable = DEF_REMOVABLE;
 246static bool scsi_debug_clustering;
 247static bool scsi_debug_host_lock = DEF_HOST_LOCK;
 248
 249static atomic_t sdebug_cmnd_count;
 250static atomic_t sdebug_completions;
 251static atomic_t sdebug_a_tsf;           /* counter of 'almost' TSFs */
 252
 253#define DEV_READONLY(TGT)      (0)
 254
 255static unsigned int sdebug_store_sectors;
 256static sector_t sdebug_capacity;        /* in sectors */
 257
 258/* old BIOS stuff, kernel may get rid of them but some mode sense pages
 259   may still need them */
 260static int sdebug_heads;                /* heads per disk */
 261static int sdebug_cylinders_per;        /* cylinders per surface */
 262static int sdebug_sectors_per;          /* sectors per cylinder */
 263
 264#define SDEBUG_MAX_PARTS 4
 265
 266#define SCSI_DEBUG_MAX_CMD_LEN 32
 267
 268static unsigned int scsi_debug_lbp(void)
 269{
 270        return ((0 == scsi_debug_fake_rw) &&
 271                (scsi_debug_lbpu | scsi_debug_lbpws | scsi_debug_lbpws10));
 272}
 273
 274struct sdebug_dev_info {
 275        struct list_head dev_list;
 276        unsigned int channel;
 277        unsigned int target;
 278        u64 lun;
 279        struct sdebug_host_info *sdbg_host;
 280        u64 wlun;
 281        unsigned long uas_bm[1];
 282        atomic_t num_in_q;
 283        char stopped;
 284        char used;
 285};
 286
 287struct sdebug_host_info {
 288        struct list_head host_list;
 289        struct Scsi_Host *shost;
 290        struct device dev;
 291        struct list_head dev_info_list;
 292};
 293
 294#define to_sdebug_host(d)       \
 295        container_of(d, struct sdebug_host_info, dev)
 296
 297static LIST_HEAD(sdebug_host_list);
 298static DEFINE_SPINLOCK(sdebug_host_list_lock);
 299
 300
 301struct sdebug_hrtimer {         /* ... is derived from hrtimer */
 302        struct hrtimer hrt;     /* must be first element */
 303        int qa_indx;
 304};
 305
 306struct sdebug_queued_cmd {
 307        /* in_use flagged by a bit in queued_in_use_bm[] */
 308        struct timer_list *cmnd_timerp;
 309        struct tasklet_struct *tletp;
 310        struct sdebug_hrtimer *sd_hrtp;
 311        struct scsi_cmnd * a_cmnd;
 312};
 313static struct sdebug_queued_cmd queued_arr[SCSI_DEBUG_CANQUEUE];
 314static unsigned long queued_in_use_bm[SCSI_DEBUG_CANQUEUE_WORDS];
 315
 316
 317static unsigned char * fake_storep;     /* ramdisk storage */
 318static struct sd_dif_tuple *dif_storep; /* protection info */
 319static void *map_storep;                /* provisioning map */
 320
 321static unsigned long map_size;
 322static int num_aborts;
 323static int num_dev_resets;
 324static int num_target_resets;
 325static int num_bus_resets;
 326static int num_host_resets;
 327static int dix_writes;
 328static int dix_reads;
 329static int dif_errors;
 330
 331static DEFINE_SPINLOCK(queued_arr_lock);
 332static DEFINE_RWLOCK(atomic_rw);
 333
 334static char sdebug_proc_name[] = MY_NAME;
 335static const char *my_name = MY_NAME;
 336
 337static struct bus_type pseudo_lld_bus;
 338
 339static struct device_driver sdebug_driverfs_driver = {
 340        .name           = sdebug_proc_name,
 341        .bus            = &pseudo_lld_bus,
 342};
 343
 344static const int check_condition_result =
 345                (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
 346
 347static const int illegal_condition_result =
 348        (DRIVER_SENSE << 24) | (DID_ABORT << 16) | SAM_STAT_CHECK_CONDITION;
 349
 350static const int device_qfull_result =
 351        (DID_OK << 16) | (COMMAND_COMPLETE << 8) | SAM_STAT_TASK_SET_FULL;
 352
 353static unsigned char caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
 354                                     0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0,
 355                                     0, 0, 0, 0};
 356static unsigned char ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
 357                                    0, 0, 0x2, 0x4b};
 358static unsigned char iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
 359                                   0, 0, 0x0, 0x0};
 360
 361static void *fake_store(unsigned long long lba)
 362{
 363        lba = do_div(lba, sdebug_store_sectors);
 364
 365        return fake_storep + lba * scsi_debug_sector_size;
 366}
 367
 368static struct sd_dif_tuple *dif_store(sector_t sector)
 369{
 370        sector = do_div(sector, sdebug_store_sectors);
 371
 372        return dif_storep + sector;
 373}
 374
 375static int sdebug_add_adapter(void);
 376static void sdebug_remove_adapter(void);
 377
 378static void sdebug_max_tgts_luns(void)
 379{
 380        struct sdebug_host_info *sdbg_host;
 381        struct Scsi_Host *hpnt;
 382
 383        spin_lock(&sdebug_host_list_lock);
 384        list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
 385                hpnt = sdbg_host->shost;
 386                if ((hpnt->this_id >= 0) &&
 387                    (scsi_debug_num_tgts > hpnt->this_id))
 388                        hpnt->max_id = scsi_debug_num_tgts + 1;
 389                else
 390                        hpnt->max_id = scsi_debug_num_tgts;
 391                /* scsi_debug_max_luns; */
 392                hpnt->max_lun = SAM2_WLUN_REPORT_LUNS;
 393        }
 394        spin_unlock(&sdebug_host_list_lock);
 395}
 396
 397static void mk_sense_buffer(struct scsi_cmnd *scp, int key, int asc, int asq)
 398{
 399        unsigned char *sbuff;
 400
 401        sbuff = scp->sense_buffer;
 402        if (!sbuff) {
 403                sdev_printk(KERN_ERR, scp->device,
 404                            "%s: sense_buffer is NULL\n", __func__);
 405                return;
 406        }
 407        memset(sbuff, 0, SCSI_SENSE_BUFFERSIZE);
 408
 409        scsi_build_sense_buffer(scsi_debug_dsense, sbuff, key, asc, asq);
 410
 411        if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
 412                sdev_printk(KERN_INFO, scp->device,
 413                            "%s:  [sense_key,asc,ascq]: [0x%x,0x%x,0x%x]\n",
 414                            my_name, key, asc, asq);
 415}
 416
 417static void get_data_transfer_info(unsigned char *cmd,
 418                                   unsigned long long *lba, unsigned int *num,
 419                                   u32 *ei_lba)
 420{
 421        *ei_lba = 0;
 422
 423        switch (*cmd) {
 424        case VARIABLE_LENGTH_CMD:
 425                *lba = (u64)cmd[19] | (u64)cmd[18] << 8 |
 426                        (u64)cmd[17] << 16 | (u64)cmd[16] << 24 |
 427                        (u64)cmd[15] << 32 | (u64)cmd[14] << 40 |
 428                        (u64)cmd[13] << 48 | (u64)cmd[12] << 56;
 429
 430                *ei_lba = (u32)cmd[23] | (u32)cmd[22] << 8 |
 431                        (u32)cmd[21] << 16 | (u32)cmd[20] << 24;
 432
 433                *num = (u32)cmd[31] | (u32)cmd[30] << 8 | (u32)cmd[29] << 16 |
 434                        (u32)cmd[28] << 24;
 435                break;
 436
 437        case WRITE_SAME_16:
 438        case WRITE_16:
 439        case READ_16:
 440                *lba = (u64)cmd[9] | (u64)cmd[8] << 8 |
 441                        (u64)cmd[7] << 16 | (u64)cmd[6] << 24 |
 442                        (u64)cmd[5] << 32 | (u64)cmd[4] << 40 |
 443                        (u64)cmd[3] << 48 | (u64)cmd[2] << 56;
 444
 445                *num = (u32)cmd[13] | (u32)cmd[12] << 8 | (u32)cmd[11] << 16 |
 446                        (u32)cmd[10] << 24;
 447                break;
 448        case WRITE_12:
 449        case READ_12:
 450                *lba = (u32)cmd[5] | (u32)cmd[4] << 8 | (u32)cmd[3] << 16 |
 451                        (u32)cmd[2] << 24;
 452
 453                *num = (u32)cmd[9] | (u32)cmd[8] << 8 | (u32)cmd[7] << 16 |
 454                        (u32)cmd[6] << 24;
 455                break;
 456        case WRITE_SAME:
 457        case WRITE_10:
 458        case READ_10:
 459        case XDWRITEREAD_10:
 460                *lba = (u32)cmd[5] | (u32)cmd[4] << 8 | (u32)cmd[3] << 16 |
 461                        (u32)cmd[2] << 24;
 462
 463                *num = (u32)cmd[8] | (u32)cmd[7] << 8;
 464                break;
 465        case WRITE_6:
 466        case READ_6:
 467                *lba = (u32)cmd[3] | (u32)cmd[2] << 8 |
 468                        (u32)(cmd[1] & 0x1f) << 16;
 469                *num = (0 == cmd[4]) ? 256 : cmd[4];
 470                break;
 471        default:
 472                break;
 473        }
 474}
 475
 476static int scsi_debug_ioctl(struct scsi_device *dev, int cmd, void __user *arg)
 477{
 478        if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) {
 479                if (0x1261 == cmd)
 480                        sdev_printk(KERN_INFO, dev,
 481                                    "%s: BLKFLSBUF [0x1261]\n", __func__);
 482                else if (0x5331 == cmd)
 483                        sdev_printk(KERN_INFO, dev,
 484                                    "%s: CDROM_GET_CAPABILITY [0x5331]\n",
 485                                    __func__);
 486                else
 487                        sdev_printk(KERN_INFO, dev, "%s: cmd=0x%x\n",
 488                                    __func__, cmd);
 489        }
 490        return -EINVAL;
 491        /* return -ENOTTY; // correct return but upsets fdisk */
 492}
 493
 494static int check_readiness(struct scsi_cmnd *SCpnt, int uas_only,
 495                           struct sdebug_dev_info * devip)
 496{
 497        int k;
 498        bool debug = !!(SCSI_DEBUG_OPT_NOISE & scsi_debug_opts);
 499
 500        k = find_first_bit(devip->uas_bm, SDEBUG_NUM_UAS);
 501        if (k != SDEBUG_NUM_UAS) {
 502                const char *cp = NULL;
 503
 504                switch (k) {
 505                case SDEBUG_UA_POR:
 506                        mk_sense_buffer(SCpnt, UNIT_ATTENTION,
 507                                        UA_RESET_ASC, POWER_ON_RESET_ASCQ);
 508                        if (debug)
 509                                cp = "power on reset";
 510                        break;
 511                case SDEBUG_UA_BUS_RESET:
 512                        mk_sense_buffer(SCpnt, UNIT_ATTENTION,
 513                                        UA_RESET_ASC, BUS_RESET_ASCQ);
 514                        if (debug)
 515                                cp = "bus reset";
 516                        break;
 517                case SDEBUG_UA_MODE_CHANGED:
 518                        mk_sense_buffer(SCpnt, UNIT_ATTENTION,
 519                                        UA_CHANGED_ASC, MODE_CHANGED_ASCQ);
 520                        if (debug)
 521                                cp = "mode parameters changed";
 522                        break;
 523                default:
 524                        pr_warn("%s: unexpected unit attention code=%d\n",
 525                                __func__, k);
 526                        if (debug)
 527                                cp = "unknown";
 528                        break;
 529                }
 530                clear_bit(k, devip->uas_bm);
 531                if (debug)
 532                        sdev_printk(KERN_INFO, SCpnt->device,
 533                                   "%s reports: Unit attention: %s\n",
 534                                   my_name, cp);
 535                return check_condition_result;
 536        }
 537        if ((UAS_TUR == uas_only) && devip->stopped) {
 538                mk_sense_buffer(SCpnt, NOT_READY, LOGICAL_UNIT_NOT_READY,
 539                                0x2);
 540                if (debug)
 541                        sdev_printk(KERN_INFO, SCpnt->device,
 542                                    "%s reports: Not ready: %s\n", my_name,
 543                                    "initializing command required");
 544                return check_condition_result;
 545        }
 546        return 0;
 547}
 548
 549/* Returns 0 if ok else (DID_ERROR << 16). Sets scp->resid . */
 550static int fill_from_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
 551                                int arr_len)
 552{
 553        int act_len;
 554        struct scsi_data_buffer *sdb = scsi_in(scp);
 555
 556        if (!sdb->length)
 557                return 0;
 558        if (!(scsi_bidi_cmnd(scp) || scp->sc_data_direction == DMA_FROM_DEVICE))
 559                return (DID_ERROR << 16);
 560
 561        act_len = sg_copy_from_buffer(sdb->table.sgl, sdb->table.nents,
 562                                      arr, arr_len);
 563        sdb->resid = scsi_bufflen(scp) - act_len;
 564
 565        return 0;
 566}
 567
 568/* Returns number of bytes fetched into 'arr' or -1 if error. */
 569static int fetch_to_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
 570                               int arr_len)
 571{
 572        if (!scsi_bufflen(scp))
 573                return 0;
 574        if (!(scsi_bidi_cmnd(scp) || scp->sc_data_direction == DMA_TO_DEVICE))
 575                return -1;
 576
 577        return scsi_sg_copy_to_buffer(scp, arr, arr_len);
 578}
 579
 580
 581static const char * inq_vendor_id = "Linux   ";
 582static const char * inq_product_id = "scsi_debug      ";
 583static const char *inq_product_rev = "0184";    /* version less '.' */
 584
 585/* Device identification VPD page. Returns number of bytes placed in arr */
 586static int inquiry_evpd_83(unsigned char * arr, int port_group_id,
 587                           int target_dev_id, int dev_id_num,
 588                           const char * dev_id_str,
 589                           int dev_id_str_len)
 590{
 591        int num, port_a;
 592        char b[32];
 593
 594        port_a = target_dev_id + 1;
 595        /* T10 vendor identifier field format (faked) */
 596        arr[0] = 0x2;   /* ASCII */
 597        arr[1] = 0x1;
 598        arr[2] = 0x0;
 599        memcpy(&arr[4], inq_vendor_id, 8);
 600        memcpy(&arr[12], inq_product_id, 16);
 601        memcpy(&arr[28], dev_id_str, dev_id_str_len);
 602        num = 8 + 16 + dev_id_str_len;
 603        arr[3] = num;
 604        num += 4;
 605        if (dev_id_num >= 0) {
 606                /* NAA-5, Logical unit identifier (binary) */
 607                arr[num++] = 0x1;       /* binary (not necessarily sas) */
 608                arr[num++] = 0x3;       /* PIV=0, lu, naa */
 609                arr[num++] = 0x0;
 610                arr[num++] = 0x8;
 611                arr[num++] = 0x53;  /* naa-5 ieee company id=0x333333 (fake) */
 612                arr[num++] = 0x33;
 613                arr[num++] = 0x33;
 614                arr[num++] = 0x30;
 615                arr[num++] = (dev_id_num >> 24);
 616                arr[num++] = (dev_id_num >> 16) & 0xff;
 617                arr[num++] = (dev_id_num >> 8) & 0xff;
 618                arr[num++] = dev_id_num & 0xff;
 619                /* Target relative port number */
 620                arr[num++] = 0x61;      /* proto=sas, binary */
 621                arr[num++] = 0x94;      /* PIV=1, target port, rel port */
 622                arr[num++] = 0x0;       /* reserved */
 623                arr[num++] = 0x4;       /* length */
 624                arr[num++] = 0x0;       /* reserved */
 625                arr[num++] = 0x0;       /* reserved */
 626                arr[num++] = 0x0;
 627                arr[num++] = 0x1;       /* relative port A */
 628        }
 629        /* NAA-5, Target port identifier */
 630        arr[num++] = 0x61;      /* proto=sas, binary */
 631        arr[num++] = 0x93;      /* piv=1, target port, naa */
 632        arr[num++] = 0x0;
 633        arr[num++] = 0x8;
 634        arr[num++] = 0x52;      /* naa-5, company id=0x222222 (fake) */
 635        arr[num++] = 0x22;
 636        arr[num++] = 0x22;
 637        arr[num++] = 0x20;
 638        arr[num++] = (port_a >> 24);
 639        arr[num++] = (port_a >> 16) & 0xff;
 640        arr[num++] = (port_a >> 8) & 0xff;
 641        arr[num++] = port_a & 0xff;
 642        /* NAA-5, Target port group identifier */
 643        arr[num++] = 0x61;      /* proto=sas, binary */
 644        arr[num++] = 0x95;      /* piv=1, target port group id */
 645        arr[num++] = 0x0;
 646        arr[num++] = 0x4;
 647        arr[num++] = 0;
 648        arr[num++] = 0;
 649        arr[num++] = (port_group_id >> 8) & 0xff;
 650        arr[num++] = port_group_id & 0xff;
 651        /* NAA-5, Target device identifier */
 652        arr[num++] = 0x61;      /* proto=sas, binary */
 653        arr[num++] = 0xa3;      /* piv=1, target device, naa */
 654        arr[num++] = 0x0;
 655        arr[num++] = 0x8;
 656        arr[num++] = 0x52;      /* naa-5, company id=0x222222 (fake) */
 657        arr[num++] = 0x22;
 658        arr[num++] = 0x22;
 659        arr[num++] = 0x20;
 660        arr[num++] = (target_dev_id >> 24);
 661        arr[num++] = (target_dev_id >> 16) & 0xff;
 662        arr[num++] = (target_dev_id >> 8) & 0xff;
 663        arr[num++] = target_dev_id & 0xff;
 664        /* SCSI name string: Target device identifier */
 665        arr[num++] = 0x63;      /* proto=sas, UTF-8 */
 666        arr[num++] = 0xa8;      /* piv=1, target device, SCSI name string */
 667        arr[num++] = 0x0;
 668        arr[num++] = 24;
 669        memcpy(arr + num, "naa.52222220", 12);
 670        num += 12;
 671        snprintf(b, sizeof(b), "%08X", target_dev_id);
 672        memcpy(arr + num, b, 8);
 673        num += 8;
 674        memset(arr + num, 0, 4);
 675        num += 4;
 676        return num;
 677}
 678
 679
 680static unsigned char vpd84_data[] = {
 681/* from 4th byte */ 0x22,0x22,0x22,0x0,0xbb,0x0,
 682    0x22,0x22,0x22,0x0,0xbb,0x1,
 683    0x22,0x22,0x22,0x0,0xbb,0x2,
 684};
 685
 686/*  Software interface identification VPD page */
 687static int inquiry_evpd_84(unsigned char * arr)
 688{
 689        memcpy(arr, vpd84_data, sizeof(vpd84_data));
 690        return sizeof(vpd84_data);
 691}
 692
 693/* Management network addresses VPD page */
 694static int inquiry_evpd_85(unsigned char * arr)
 695{
 696        int num = 0;
 697        const char * na1 = "https://www.kernel.org/config";
 698        const char * na2 = "http://www.kernel.org/log";
 699        int plen, olen;
 700
 701        arr[num++] = 0x1;       /* lu, storage config */
 702        arr[num++] = 0x0;       /* reserved */
 703        arr[num++] = 0x0;
 704        olen = strlen(na1);
 705        plen = olen + 1;
 706        if (plen % 4)
 707                plen = ((plen / 4) + 1) * 4;
 708        arr[num++] = plen;      /* length, null termianted, padded */
 709        memcpy(arr + num, na1, olen);
 710        memset(arr + num + olen, 0, plen - olen);
 711        num += plen;
 712
 713        arr[num++] = 0x4;       /* lu, logging */
 714        arr[num++] = 0x0;       /* reserved */
 715        arr[num++] = 0x0;
 716        olen = strlen(na2);
 717        plen = olen + 1;
 718        if (plen % 4)
 719                plen = ((plen / 4) + 1) * 4;
 720        arr[num++] = plen;      /* length, null terminated, padded */
 721        memcpy(arr + num, na2, olen);
 722        memset(arr + num + olen, 0, plen - olen);
 723        num += plen;
 724
 725        return num;
 726}
 727
 728/* SCSI ports VPD page */
 729static int inquiry_evpd_88(unsigned char * arr, int target_dev_id)
 730{
 731        int num = 0;
 732        int port_a, port_b;
 733
 734        port_a = target_dev_id + 1;
 735        port_b = port_a + 1;
 736        arr[num++] = 0x0;       /* reserved */
 737        arr[num++] = 0x0;       /* reserved */
 738        arr[num++] = 0x0;
 739        arr[num++] = 0x1;       /* relative port 1 (primary) */
 740        memset(arr + num, 0, 6);
 741        num += 6;
 742        arr[num++] = 0x0;
 743        arr[num++] = 12;        /* length tp descriptor */
 744        /* naa-5 target port identifier (A) */
 745        arr[num++] = 0x61;      /* proto=sas, binary */
 746        arr[num++] = 0x93;      /* PIV=1, target port, NAA */
 747        arr[num++] = 0x0;       /* reserved */
 748        arr[num++] = 0x8;       /* length */
 749        arr[num++] = 0x52;      /* NAA-5, company_id=0x222222 (fake) */
 750        arr[num++] = 0x22;
 751        arr[num++] = 0x22;
 752        arr[num++] = 0x20;
 753        arr[num++] = (port_a >> 24);
 754        arr[num++] = (port_a >> 16) & 0xff;
 755        arr[num++] = (port_a >> 8) & 0xff;
 756        arr[num++] = port_a & 0xff;
 757
 758        arr[num++] = 0x0;       /* reserved */
 759        arr[num++] = 0x0;       /* reserved */
 760        arr[num++] = 0x0;
 761        arr[num++] = 0x2;       /* relative port 2 (secondary) */
 762        memset(arr + num, 0, 6);
 763        num += 6;
 764        arr[num++] = 0x0;
 765        arr[num++] = 12;        /* length tp descriptor */
 766        /* naa-5 target port identifier (B) */
 767        arr[num++] = 0x61;      /* proto=sas, binary */
 768        arr[num++] = 0x93;      /* PIV=1, target port, NAA */
 769        arr[num++] = 0x0;       /* reserved */
 770        arr[num++] = 0x8;       /* length */
 771        arr[num++] = 0x52;      /* NAA-5, company_id=0x222222 (fake) */
 772        arr[num++] = 0x22;
 773        arr[num++] = 0x22;
 774        arr[num++] = 0x20;
 775        arr[num++] = (port_b >> 24);
 776        arr[num++] = (port_b >> 16) & 0xff;
 777        arr[num++] = (port_b >> 8) & 0xff;
 778        arr[num++] = port_b & 0xff;
 779
 780        return num;
 781}
 782
 783
 784static unsigned char vpd89_data[] = {
 785/* from 4th byte */ 0,0,0,0,
 786'l','i','n','u','x',' ',' ',' ',
 787'S','A','T',' ','s','c','s','i','_','d','e','b','u','g',' ',' ',
 788'1','2','3','4',
 7890x34,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
 7900xec,0,0,0,
 7910x5a,0xc,0xff,0x3f,0x37,0xc8,0x10,0,0,0,0,0,0x3f,0,0,0,
 7920,0,0,0,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x20,0x20,0x20,0x20,
 7930x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0,0,0,0x40,0x4,0,0x2e,0x33,
 7940x38,0x31,0x20,0x20,0x20,0x20,0x54,0x53,0x38,0x33,0x30,0x30,0x33,0x31,
 7950x53,0x41,
 7960x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
 7970x20,0x20,
 7980x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
 7990x10,0x80,
 8000,0,0,0x2f,0,0,0,0x2,0,0x2,0x7,0,0xff,0xff,0x1,0,
 8010x3f,0,0xc1,0xff,0x3e,0,0x10,0x1,0xb0,0xf8,0x50,0x9,0,0,0x7,0,
 8020x3,0,0x78,0,0x78,0,0xf0,0,0x78,0,0,0,0,0,0,0,
 8030,0,0,0,0,0,0,0,0x2,0,0,0,0,0,0,0,
 8040x7e,0,0x1b,0,0x6b,0x34,0x1,0x7d,0x3,0x40,0x69,0x34,0x1,0x3c,0x3,0x40,
 8050x7f,0x40,0,0,0,0,0xfe,0xfe,0,0,0,0,0,0xfe,0,0,
 8060,0,0,0,0,0,0,0,0xb0,0xf8,0x50,0x9,0,0,0,0,
 8070,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 8080,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 8090,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 8100x1,0,0xb0,0xf8,0x50,0x9,0xb0,0xf8,0x50,0x9,0x20,0x20,0x2,0,0xb6,0x42,
 8110,0x80,0x8a,0,0x6,0x3c,0xa,0x3c,0xff,0xff,0xc6,0x7,0,0x1,0,0x8,
 8120xf0,0xf,0,0x10,0x2,0,0x30,0,0,0,0,0,0,0,0x6,0xfe,
 8130,0,0x2,0,0x50,0,0x8a,0,0x4f,0x95,0,0,0x21,0,0xb,0,
 8140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 8150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 8160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 8170,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 8180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 8190,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 8200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 8210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 8220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 8230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 8240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 8250,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa5,0x51,
 826};
 827
 828/* ATA Information VPD page */
 829static int inquiry_evpd_89(unsigned char * arr)
 830{
 831        memcpy(arr, vpd89_data, sizeof(vpd89_data));
 832        return sizeof(vpd89_data);
 833}
 834
 835
 836static unsigned char vpdb0_data[] = {
 837        /* from 4th byte */ 0,0,0,4, 0,0,0x4,0, 0,0,0,64,
 838        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 839        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 840        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 841};
 842
 843/* Block limits VPD page (SBC-3) */
 844static int inquiry_evpd_b0(unsigned char * arr)
 845{
 846        unsigned int gran;
 847
 848        memcpy(arr, vpdb0_data, sizeof(vpdb0_data));
 849
 850        /* Optimal transfer length granularity */
 851        gran = 1 << scsi_debug_physblk_exp;
 852        arr[2] = (gran >> 8) & 0xff;
 853        arr[3] = gran & 0xff;
 854
 855        /* Maximum Transfer Length */
 856        if (sdebug_store_sectors > 0x400) {
 857                arr[4] = (sdebug_store_sectors >> 24) & 0xff;
 858                arr[5] = (sdebug_store_sectors >> 16) & 0xff;
 859                arr[6] = (sdebug_store_sectors >> 8) & 0xff;
 860                arr[7] = sdebug_store_sectors & 0xff;
 861        }
 862
 863        /* Optimal Transfer Length */
 864        put_unaligned_be32(scsi_debug_opt_blks, &arr[8]);
 865
 866        if (scsi_debug_lbpu) {
 867                /* Maximum Unmap LBA Count */
 868                put_unaligned_be32(scsi_debug_unmap_max_blocks, &arr[16]);
 869
 870                /* Maximum Unmap Block Descriptor Count */
 871                put_unaligned_be32(scsi_debug_unmap_max_desc, &arr[20]);
 872        }
 873
 874        /* Unmap Granularity Alignment */
 875        if (scsi_debug_unmap_alignment) {
 876                put_unaligned_be32(scsi_debug_unmap_alignment, &arr[28]);
 877                arr[28] |= 0x80; /* UGAVALID */
 878        }
 879
 880        /* Optimal Unmap Granularity */
 881        put_unaligned_be32(scsi_debug_unmap_granularity, &arr[24]);
 882
 883        /* Maximum WRITE SAME Length */
 884        put_unaligned_be64(scsi_debug_write_same_length, &arr[32]);
 885
 886        return 0x3c; /* Mandatory page length for Logical Block Provisioning */
 887
 888        return sizeof(vpdb0_data);
 889}
 890
 891/* Block device characteristics VPD page (SBC-3) */
 892static int inquiry_evpd_b1(unsigned char *arr)
 893{
 894        memset(arr, 0, 0x3c);
 895        arr[0] = 0;
 896        arr[1] = 1;     /* non rotating medium (e.g. solid state) */
 897        arr[2] = 0;
 898        arr[3] = 5;     /* less than 1.8" */
 899
 900        return 0x3c;
 901}
 902
 903/* Logical block provisioning VPD page (SBC-3) */
 904static int inquiry_evpd_b2(unsigned char *arr)
 905{
 906        memset(arr, 0, 0x4);
 907        arr[0] = 0;                     /* threshold exponent */
 908
 909        if (scsi_debug_lbpu)
 910                arr[1] = 1 << 7;
 911
 912        if (scsi_debug_lbpws)
 913                arr[1] |= 1 << 6;
 914
 915        if (scsi_debug_lbpws10)
 916                arr[1] |= 1 << 5;
 917
 918        if (scsi_debug_lbprz)
 919                arr[1] |= 1 << 2;
 920
 921        return 0x4;
 922}
 923
 924#define SDEBUG_LONG_INQ_SZ 96
 925#define SDEBUG_MAX_INQ_ARR_SZ 584
 926
 927static int resp_inquiry(struct scsi_cmnd *scp, int target,
 928                        struct sdebug_dev_info * devip)
 929{
 930        unsigned char pq_pdt;
 931        unsigned char * arr;
 932        unsigned char *cmd = scp->cmnd;
 933        int alloc_len, n, ret;
 934
 935        alloc_len = (cmd[3] << 8) + cmd[4];
 936        arr = kzalloc(SDEBUG_MAX_INQ_ARR_SZ, GFP_ATOMIC);
 937        if (! arr)
 938                return DID_REQUEUE << 16;
 939        if (devip->wlun)
 940                pq_pdt = 0x1e;  /* present, wlun */
 941        else if (scsi_debug_no_lun_0 && (0 == devip->lun))
 942                pq_pdt = 0x7f;  /* not present, no device type */
 943        else
 944                pq_pdt = (scsi_debug_ptype & 0x1f);
 945        arr[0] = pq_pdt;
 946        if (0x2 & cmd[1]) {  /* CMDDT bit set */
 947                mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
 948                                0);
 949                kfree(arr);
 950                return check_condition_result;
 951        } else if (0x1 & cmd[1]) {  /* EVPD bit set */
 952                int lu_id_num, port_group_id, target_dev_id, len;
 953                char lu_id_str[6];
 954                int host_no = devip->sdbg_host->shost->host_no;
 955                
 956                port_group_id = (((host_no + 1) & 0x7f) << 8) +
 957                    (devip->channel & 0x7f);
 958                if (0 == scsi_debug_vpd_use_hostno)
 959                        host_no = 0;
 960                lu_id_num = devip->wlun ? -1 : (((host_no + 1) * 2000) +
 961                            (devip->target * 1000) + devip->lun);
 962                target_dev_id = ((host_no + 1) * 2000) +
 963                                 (devip->target * 1000) - 3;
 964                len = scnprintf(lu_id_str, 6, "%d", lu_id_num);
 965                if (0 == cmd[2]) { /* supported vital product data pages */
 966                        arr[1] = cmd[2];        /*sanity */
 967                        n = 4;
 968                        arr[n++] = 0x0;   /* this page */
 969                        arr[n++] = 0x80;  /* unit serial number */
 970                        arr[n++] = 0x83;  /* device identification */
 971                        arr[n++] = 0x84;  /* software interface ident. */
 972                        arr[n++] = 0x85;  /* management network addresses */
 973                        arr[n++] = 0x86;  /* extended inquiry */
 974                        arr[n++] = 0x87;  /* mode page policy */
 975                        arr[n++] = 0x88;  /* SCSI ports */
 976                        arr[n++] = 0x89;  /* ATA information */
 977                        arr[n++] = 0xb0;  /* Block limits (SBC) */
 978                        arr[n++] = 0xb1;  /* Block characteristics (SBC) */
 979                        if (scsi_debug_lbp()) /* Logical Block Prov. (SBC) */
 980                                arr[n++] = 0xb2;
 981                        arr[3] = n - 4;   /* number of supported VPD pages */
 982                } else if (0x80 == cmd[2]) { /* unit serial number */
 983                        arr[1] = cmd[2];        /*sanity */
 984                        arr[3] = len;
 985                        memcpy(&arr[4], lu_id_str, len);
 986                } else if (0x83 == cmd[2]) { /* device identification */
 987                        arr[1] = cmd[2];        /*sanity */
 988                        arr[3] = inquiry_evpd_83(&arr[4], port_group_id,
 989                                                 target_dev_id, lu_id_num,
 990                                                 lu_id_str, len);
 991                } else if (0x84 == cmd[2]) { /* Software interface ident. */
 992                        arr[1] = cmd[2];        /*sanity */
 993                        arr[3] = inquiry_evpd_84(&arr[4]);
 994                } else if (0x85 == cmd[2]) { /* Management network addresses */
 995                        arr[1] = cmd[2];        /*sanity */
 996                        arr[3] = inquiry_evpd_85(&arr[4]);
 997                } else if (0x86 == cmd[2]) { /* extended inquiry */
 998                        arr[1] = cmd[2];        /*sanity */
 999                        arr[3] = 0x3c;  /* number of following entries */
1000                        if (scsi_debug_dif == SD_DIF_TYPE3_PROTECTION)
1001                                arr[4] = 0x4;   /* SPT: GRD_CHK:1 */
1002                        else if (scsi_debug_dif)
1003                                arr[4] = 0x5;   /* SPT: GRD_CHK:1, REF_CHK:1 */
1004                        else
1005                                arr[4] = 0x0;   /* no protection stuff */
1006                        arr[5] = 0x7;   /* head of q, ordered + simple q's */
1007                } else if (0x87 == cmd[2]) { /* mode page policy */
1008                        arr[1] = cmd[2];        /*sanity */
1009                        arr[3] = 0x8;   /* number of following entries */
1010                        arr[4] = 0x2;   /* disconnect-reconnect mp */
1011                        arr[6] = 0x80;  /* mlus, shared */
1012                        arr[8] = 0x18;   /* protocol specific lu */
1013                        arr[10] = 0x82;  /* mlus, per initiator port */
1014                } else if (0x88 == cmd[2]) { /* SCSI Ports */
1015                        arr[1] = cmd[2];        /*sanity */
1016                        arr[3] = inquiry_evpd_88(&arr[4], target_dev_id);
1017                } else if (0x89 == cmd[2]) { /* ATA information */
1018                        arr[1] = cmd[2];        /*sanity */
1019                        n = inquiry_evpd_89(&arr[4]);
1020                        arr[2] = (n >> 8);
1021                        arr[3] = (n & 0xff);
1022                } else if (0xb0 == cmd[2]) { /* Block limits (SBC) */
1023                        arr[1] = cmd[2];        /*sanity */
1024                        arr[3] = inquiry_evpd_b0(&arr[4]);
1025                } else if (0xb1 == cmd[2]) { /* Block characteristics (SBC) */
1026                        arr[1] = cmd[2];        /*sanity */
1027                        arr[3] = inquiry_evpd_b1(&arr[4]);
1028                } else if (0xb2 == cmd[2]) { /* Logical Block Prov. (SBC) */
1029                        arr[1] = cmd[2];        /*sanity */
1030                        arr[3] = inquiry_evpd_b2(&arr[4]);
1031                } else {
1032                        /* Illegal request, invalid field in cdb */
1033                        mk_sense_buffer(scp, ILLEGAL_REQUEST,
1034                                        INVALID_FIELD_IN_CDB, 0);
1035                        kfree(arr);
1036                        return check_condition_result;
1037                }
1038                len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len);
1039                ret = fill_from_dev_buffer(scp, arr,
1040                            min(len, SDEBUG_MAX_INQ_ARR_SZ));
1041                kfree(arr);
1042                return ret;
1043        }
1044        /* drops through here for a standard inquiry */
1045        arr[1] = scsi_debug_removable ? 0x80 : 0;       /* Removable disk */
1046        arr[2] = scsi_debug_scsi_level;
1047        arr[3] = 2;    /* response_data_format==2 */
1048        arr[4] = SDEBUG_LONG_INQ_SZ - 5;
1049        arr[5] = scsi_debug_dif ? 1 : 0; /* PROTECT bit */
1050        if (0 == scsi_debug_vpd_use_hostno)
1051                arr[5] = 0x10; /* claim: implicit TGPS */
1052        arr[6] = 0x10; /* claim: MultiP */
1053        /* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */
1054        arr[7] = 0xa; /* claim: LINKED + CMDQUE */
1055        memcpy(&arr[8], inq_vendor_id, 8);
1056        memcpy(&arr[16], inq_product_id, 16);
1057        memcpy(&arr[32], inq_product_rev, 4);
1058        /* version descriptors (2 bytes each) follow */
1059        arr[58] = 0x0; arr[59] = 0xa2;  /* SAM-5 rev 4 */
1060        arr[60] = 0x4; arr[61] = 0x68;  /* SPC-4 rev 37 */
1061        n = 62;
1062        if (scsi_debug_ptype == 0) {
1063                arr[n++] = 0x4; arr[n++] = 0xc5; /* SBC-4 rev 36 */
1064        } else if (scsi_debug_ptype == 1) {
1065                arr[n++] = 0x5; arr[n++] = 0x25; /* SSC-4 rev 3 */
1066        }
1067        arr[n++] = 0x20; arr[n++] = 0xe6;  /* SPL-3 rev 7 */
1068        ret = fill_from_dev_buffer(scp, arr,
1069                            min(alloc_len, SDEBUG_LONG_INQ_SZ));
1070        kfree(arr);
1071        return ret;
1072}
1073
1074static int resp_requests(struct scsi_cmnd * scp,
1075                         struct sdebug_dev_info * devip)
1076{
1077        unsigned char * sbuff;
1078        unsigned char *cmd = scp->cmnd;
1079        unsigned char arr[SCSI_SENSE_BUFFERSIZE];
1080        int want_dsense;
1081        int len = 18;
1082
1083        memset(arr, 0, sizeof(arr));
1084        want_dsense = !!(cmd[1] & 1) || scsi_debug_dsense;
1085        sbuff = scp->sense_buffer;
1086        if ((iec_m_pg[2] & 0x4) && (6 == (iec_m_pg[3] & 0xf))) {
1087                if (want_dsense) {
1088                        arr[0] = 0x72;
1089                        arr[1] = 0x0;           /* NO_SENSE in sense_key */
1090                        arr[2] = THRESHOLD_EXCEEDED;
1091                        arr[3] = 0xff;          /* TEST set and MRIE==6 */
1092                } else {
1093                        arr[0] = 0x70;
1094                        arr[2] = 0x0;           /* NO_SENSE in sense_key */
1095                        arr[7] = 0xa;           /* 18 byte sense buffer */
1096                        arr[12] = THRESHOLD_EXCEEDED;
1097                        arr[13] = 0xff;         /* TEST set and MRIE==6 */
1098                }
1099        } else {
1100                memcpy(arr, sbuff, SCSI_SENSE_BUFFERSIZE);
1101                if ((cmd[1] & 1) && (! scsi_debug_dsense)) {
1102                        /* DESC bit set and sense_buff in fixed format */
1103                        memset(arr, 0, sizeof(arr));
1104                        arr[0] = 0x72;
1105                        arr[1] = sbuff[2];     /* sense key */
1106                        arr[2] = sbuff[12];    /* asc */
1107                        arr[3] = sbuff[13];    /* ascq */
1108                        len = 8;
1109                }
1110        }
1111        mk_sense_buffer(scp, 0, NO_ADDITIONAL_SENSE, 0);
1112        return fill_from_dev_buffer(scp, arr, len);
1113}
1114
1115static int resp_start_stop(struct scsi_cmnd * scp,
1116                           struct sdebug_dev_info * devip)
1117{
1118        unsigned char *cmd = scp->cmnd;
1119        int power_cond, errsts, start;
1120
1121        errsts = check_readiness(scp, UAS_ONLY, devip);
1122        if (errsts)
1123                return errsts;
1124        power_cond = (cmd[4] & 0xf0) >> 4;
1125        if (power_cond) {
1126                mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1127                                0);
1128                return check_condition_result;
1129        }
1130        start = cmd[4] & 1;
1131        if (start == devip->stopped)
1132                devip->stopped = !start;
1133        return 0;
1134}
1135
1136static sector_t get_sdebug_capacity(void)
1137{
1138        if (scsi_debug_virtual_gb > 0)
1139                return (sector_t)scsi_debug_virtual_gb *
1140                        (1073741824 / scsi_debug_sector_size);
1141        else
1142                return sdebug_store_sectors;
1143}
1144
1145#define SDEBUG_READCAP_ARR_SZ 8
1146static int resp_readcap(struct scsi_cmnd * scp,
1147                        struct sdebug_dev_info * devip)
1148{
1149        unsigned char arr[SDEBUG_READCAP_ARR_SZ];
1150        unsigned int capac;
1151        int errsts;
1152
1153        errsts = check_readiness(scp, UAS_ONLY, devip);
1154        if (errsts)
1155                return errsts;
1156        /* following just in case virtual_gb changed */
1157        sdebug_capacity = get_sdebug_capacity();
1158        memset(arr, 0, SDEBUG_READCAP_ARR_SZ);
1159        if (sdebug_capacity < 0xffffffff) {
1160                capac = (unsigned int)sdebug_capacity - 1;
1161                arr[0] = (capac >> 24);
1162                arr[1] = (capac >> 16) & 0xff;
1163                arr[2] = (capac >> 8) & 0xff;
1164                arr[3] = capac & 0xff;
1165        } else {
1166                arr[0] = 0xff;
1167                arr[1] = 0xff;
1168                arr[2] = 0xff;
1169                arr[3] = 0xff;
1170        }
1171        arr[6] = (scsi_debug_sector_size >> 8) & 0xff;
1172        arr[7] = scsi_debug_sector_size & 0xff;
1173        return fill_from_dev_buffer(scp, arr, SDEBUG_READCAP_ARR_SZ);
1174}
1175
1176#define SDEBUG_READCAP16_ARR_SZ 32
1177static int resp_readcap16(struct scsi_cmnd * scp,
1178                          struct sdebug_dev_info * devip)
1179{
1180        unsigned char *cmd = scp->cmnd;
1181        unsigned char arr[SDEBUG_READCAP16_ARR_SZ];
1182        unsigned long long capac;
1183        int errsts, k, alloc_len;
1184
1185        errsts = check_readiness(scp, UAS_ONLY, devip);
1186        if (errsts)
1187                return errsts;
1188        alloc_len = ((cmd[10] << 24) + (cmd[11] << 16) + (cmd[12] << 8)
1189                     + cmd[13]);
1190        /* following just in case virtual_gb changed */
1191        sdebug_capacity = get_sdebug_capacity();
1192        memset(arr, 0, SDEBUG_READCAP16_ARR_SZ);
1193        capac = sdebug_capacity - 1;
1194        for (k = 0; k < 8; ++k, capac >>= 8)
1195                arr[7 - k] = capac & 0xff;
1196        arr[8] = (scsi_debug_sector_size >> 24) & 0xff;
1197        arr[9] = (scsi_debug_sector_size >> 16) & 0xff;
1198        arr[10] = (scsi_debug_sector_size >> 8) & 0xff;
1199        arr[11] = scsi_debug_sector_size & 0xff;
1200        arr[13] = scsi_debug_physblk_exp & 0xf;
1201        arr[14] = (scsi_debug_lowest_aligned >> 8) & 0x3f;
1202
1203        if (scsi_debug_lbp()) {
1204                arr[14] |= 0x80; /* LBPME */
1205                if (scsi_debug_lbprz)
1206                        arr[14] |= 0x40; /* LBPRZ */
1207        }
1208
1209        arr[15] = scsi_debug_lowest_aligned & 0xff;
1210
1211        if (scsi_debug_dif) {
1212                arr[12] = (scsi_debug_dif - 1) << 1; /* P_TYPE */
1213                arr[12] |= 1; /* PROT_EN */
1214        }
1215
1216        return fill_from_dev_buffer(scp, arr,
1217                                    min(alloc_len, SDEBUG_READCAP16_ARR_SZ));
1218}
1219
1220#define SDEBUG_MAX_TGTPGS_ARR_SZ 1412
1221
1222static int resp_report_tgtpgs(struct scsi_cmnd * scp,
1223                              struct sdebug_dev_info * devip)
1224{
1225        unsigned char *cmd = scp->cmnd;
1226        unsigned char * arr;
1227        int host_no = devip->sdbg_host->shost->host_no;
1228        int n, ret, alen, rlen;
1229        int port_group_a, port_group_b, port_a, port_b;
1230
1231        alen = ((cmd[6] << 24) + (cmd[7] << 16) + (cmd[8] << 8)
1232                + cmd[9]);
1233
1234        arr = kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ, GFP_ATOMIC);
1235        if (! arr)
1236                return DID_REQUEUE << 16;
1237        /*
1238         * EVPD page 0x88 states we have two ports, one
1239         * real and a fake port with no device connected.
1240         * So we create two port groups with one port each
1241         * and set the group with port B to unavailable.
1242         */
1243        port_a = 0x1; /* relative port A */
1244        port_b = 0x2; /* relative port B */
1245        port_group_a = (((host_no + 1) & 0x7f) << 8) +
1246            (devip->channel & 0x7f);
1247        port_group_b = (((host_no + 1) & 0x7f) << 8) +
1248            (devip->channel & 0x7f) + 0x80;
1249
1250        /*
1251         * The asymmetric access state is cycled according to the host_id.
1252         */
1253        n = 4;
1254        if (0 == scsi_debug_vpd_use_hostno) {
1255            arr[n++] = host_no % 3; /* Asymm access state */
1256            arr[n++] = 0x0F; /* claim: all states are supported */
1257        } else {
1258            arr[n++] = 0x0; /* Active/Optimized path */
1259            arr[n++] = 0x01; /* claim: only support active/optimized paths */
1260        }
1261        arr[n++] = (port_group_a >> 8) & 0xff;
1262        arr[n++] = port_group_a & 0xff;
1263        arr[n++] = 0;    /* Reserved */
1264        arr[n++] = 0;    /* Status code */
1265        arr[n++] = 0;    /* Vendor unique */
1266        arr[n++] = 0x1;  /* One port per group */
1267        arr[n++] = 0;    /* Reserved */
1268        arr[n++] = 0;    /* Reserved */
1269        arr[n++] = (port_a >> 8) & 0xff;
1270        arr[n++] = port_a & 0xff;
1271        arr[n++] = 3;    /* Port unavailable */
1272        arr[n++] = 0x08; /* claim: only unavailalbe paths are supported */
1273        arr[n++] = (port_group_b >> 8) & 0xff;
1274        arr[n++] = port_group_b & 0xff;
1275        arr[n++] = 0;    /* Reserved */
1276        arr[n++] = 0;    /* Status code */
1277        arr[n++] = 0;    /* Vendor unique */
1278        arr[n++] = 0x1;  /* One port per group */
1279        arr[n++] = 0;    /* Reserved */
1280        arr[n++] = 0;    /* Reserved */
1281        arr[n++] = (port_b >> 8) & 0xff;
1282        arr[n++] = port_b & 0xff;
1283
1284        rlen = n - 4;
1285        arr[0] = (rlen >> 24) & 0xff;
1286        arr[1] = (rlen >> 16) & 0xff;
1287        arr[2] = (rlen >> 8) & 0xff;
1288        arr[3] = rlen & 0xff;
1289
1290        /*
1291         * Return the smallest value of either
1292         * - The allocated length
1293         * - The constructed command length
1294         * - The maximum array size
1295         */
1296        rlen = min(alen,n);
1297        ret = fill_from_dev_buffer(scp, arr,
1298                                   min(rlen, SDEBUG_MAX_TGTPGS_ARR_SZ));
1299        kfree(arr);
1300        return ret;
1301}
1302
1303/* <<Following mode page info copied from ST318451LW>> */
1304
1305static int resp_err_recov_pg(unsigned char * p, int pcontrol, int target)
1306{       /* Read-Write Error Recovery page for mode_sense */
1307        unsigned char err_recov_pg[] = {0x1, 0xa, 0xc0, 11, 240, 0, 0, 0,
1308                                        5, 0, 0xff, 0xff};
1309
1310        memcpy(p, err_recov_pg, sizeof(err_recov_pg));
1311        if (1 == pcontrol)
1312                memset(p + 2, 0, sizeof(err_recov_pg) - 2);
1313        return sizeof(err_recov_pg);
1314}
1315
1316static int resp_disconnect_pg(unsigned char * p, int pcontrol, int target)
1317{       /* Disconnect-Reconnect page for mode_sense */
1318        unsigned char disconnect_pg[] = {0x2, 0xe, 128, 128, 0, 10, 0, 0,
1319                                         0, 0, 0, 0, 0, 0, 0, 0};
1320
1321        memcpy(p, disconnect_pg, sizeof(disconnect_pg));
1322        if (1 == pcontrol)
1323                memset(p + 2, 0, sizeof(disconnect_pg) - 2);
1324        return sizeof(disconnect_pg);
1325}
1326
1327static int resp_format_pg(unsigned char * p, int pcontrol, int target)
1328{       /* Format device page for mode_sense */
1329        unsigned char format_pg[] = {0x3, 0x16, 0, 0, 0, 0, 0, 0,
1330                                     0, 0, 0, 0, 0, 0, 0, 0,
1331                                     0, 0, 0, 0, 0x40, 0, 0, 0};
1332
1333        memcpy(p, format_pg, sizeof(format_pg));
1334        p[10] = (sdebug_sectors_per >> 8) & 0xff;
1335        p[11] = sdebug_sectors_per & 0xff;
1336        p[12] = (scsi_debug_sector_size >> 8) & 0xff;
1337        p[13] = scsi_debug_sector_size & 0xff;
1338        if (scsi_debug_removable)
1339                p[20] |= 0x20; /* should agree with INQUIRY */
1340        if (1 == pcontrol)
1341                memset(p + 2, 0, sizeof(format_pg) - 2);
1342        return sizeof(format_pg);
1343}
1344
1345static int resp_caching_pg(unsigned char * p, int pcontrol, int target)
1346{       /* Caching page for mode_sense */
1347        unsigned char ch_caching_pg[] = {/* 0x8, 18, */ 0x4, 0, 0, 0, 0, 0,
1348                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1349        unsigned char d_caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
1350                0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0,     0, 0, 0, 0};
1351
1352        if (SCSI_DEBUG_OPT_N_WCE & scsi_debug_opts)
1353                caching_pg[2] &= ~0x4;  /* set WCE=0 (default WCE=1) */
1354        memcpy(p, caching_pg, sizeof(caching_pg));
1355        if (1 == pcontrol)
1356                memcpy(p + 2, ch_caching_pg, sizeof(ch_caching_pg));
1357        else if (2 == pcontrol)
1358                memcpy(p, d_caching_pg, sizeof(d_caching_pg));
1359        return sizeof(caching_pg);
1360}
1361
1362static int resp_ctrl_m_pg(unsigned char * p, int pcontrol, int target)
1363{       /* Control mode page for mode_sense */
1364        unsigned char ch_ctrl_m_pg[] = {/* 0xa, 10, */ 0x6, 0, 0, 0, 0, 0,
1365                                        0, 0, 0, 0};
1366        unsigned char d_ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
1367                                     0, 0, 0x2, 0x4b};
1368
1369        if (scsi_debug_dsense)
1370                ctrl_m_pg[2] |= 0x4;
1371        else
1372                ctrl_m_pg[2] &= ~0x4;
1373
1374        if (scsi_debug_ato)
1375                ctrl_m_pg[5] |= 0x80; /* ATO=1 */
1376
1377        memcpy(p, ctrl_m_pg, sizeof(ctrl_m_pg));
1378        if (1 == pcontrol)
1379                memcpy(p + 2, ch_ctrl_m_pg, sizeof(ch_ctrl_m_pg));
1380        else if (2 == pcontrol)
1381                memcpy(p, d_ctrl_m_pg, sizeof(d_ctrl_m_pg));
1382        return sizeof(ctrl_m_pg);
1383}
1384
1385
1386static int resp_iec_m_pg(unsigned char * p, int pcontrol, int target)
1387{       /* Informational Exceptions control mode page for mode_sense */
1388        unsigned char ch_iec_m_pg[] = {/* 0x1c, 0xa, */ 0x4, 0xf, 0, 0, 0, 0,
1389                                       0, 0, 0x0, 0x0};
1390        unsigned char d_iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
1391                                      0, 0, 0x0, 0x0};
1392
1393        memcpy(p, iec_m_pg, sizeof(iec_m_pg));
1394        if (1 == pcontrol)
1395                memcpy(p + 2, ch_iec_m_pg, sizeof(ch_iec_m_pg));
1396        else if (2 == pcontrol)
1397                memcpy(p, d_iec_m_pg, sizeof(d_iec_m_pg));
1398        return sizeof(iec_m_pg);
1399}
1400
1401static int resp_sas_sf_m_pg(unsigned char * p, int pcontrol, int target)
1402{       /* SAS SSP mode page - short format for mode_sense */
1403        unsigned char sas_sf_m_pg[] = {0x19, 0x6,
1404                0x6, 0x0, 0x7, 0xd0, 0x0, 0x0};
1405
1406        memcpy(p, sas_sf_m_pg, sizeof(sas_sf_m_pg));
1407        if (1 == pcontrol)
1408                memset(p + 2, 0, sizeof(sas_sf_m_pg) - 2);
1409        return sizeof(sas_sf_m_pg);
1410}
1411
1412
1413static int resp_sas_pcd_m_spg(unsigned char * p, int pcontrol, int target,
1414                              int target_dev_id)
1415{       /* SAS phy control and discover mode page for mode_sense */
1416        unsigned char sas_pcd_m_pg[] = {0x59, 0x1, 0, 0x64, 0, 0x6, 0, 2,
1417                    0, 0, 0, 0, 0x10, 0x9, 0x8, 0x0,
1418                    0x52, 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0,
1419                    0x51, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x1,
1420                    0x2, 0, 0, 0, 0, 0, 0, 0,
1421                    0x88, 0x99, 0, 0, 0, 0, 0, 0,
1422                    0, 0, 0, 0, 0, 0, 0, 0,
1423                    0, 1, 0, 0, 0x10, 0x9, 0x8, 0x0,
1424                    0x52, 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0,
1425                    0x51, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x1,
1426                    0x3, 0, 0, 0, 0, 0, 0, 0,
1427                    0x88, 0x99, 0, 0, 0, 0, 0, 0,
1428                    0, 0, 0, 0, 0, 0, 0, 0,
1429                };
1430        int port_a, port_b;
1431
1432        port_a = target_dev_id + 1;
1433        port_b = port_a + 1;
1434        memcpy(p, sas_pcd_m_pg, sizeof(sas_pcd_m_pg));
1435        p[20] = (port_a >> 24);
1436        p[21] = (port_a >> 16) & 0xff;
1437        p[22] = (port_a >> 8) & 0xff;
1438        p[23] = port_a & 0xff;
1439        p[48 + 20] = (port_b >> 24);
1440        p[48 + 21] = (port_b >> 16) & 0xff;
1441        p[48 + 22] = (port_b >> 8) & 0xff;
1442        p[48 + 23] = port_b & 0xff;
1443        if (1 == pcontrol)
1444                memset(p + 4, 0, sizeof(sas_pcd_m_pg) - 4);
1445        return sizeof(sas_pcd_m_pg);
1446}
1447
1448static int resp_sas_sha_m_spg(unsigned char * p, int pcontrol)
1449{       /* SAS SSP shared protocol specific port mode subpage */
1450        unsigned char sas_sha_m_pg[] = {0x59, 0x2, 0, 0xc, 0, 0x6, 0x10, 0,
1451                    0, 0, 0, 0, 0, 0, 0, 0,
1452                };
1453
1454        memcpy(p, sas_sha_m_pg, sizeof(sas_sha_m_pg));
1455        if (1 == pcontrol)
1456                memset(p + 4, 0, sizeof(sas_sha_m_pg) - 4);
1457        return sizeof(sas_sha_m_pg);
1458}
1459
1460#define SDEBUG_MAX_MSENSE_SZ 256
1461
1462static int resp_mode_sense(struct scsi_cmnd * scp, int target,
1463                           struct sdebug_dev_info * devip)
1464{
1465        unsigned char dbd, llbaa;
1466        int pcontrol, pcode, subpcode, bd_len;
1467        unsigned char dev_spec;
1468        int k, alloc_len, msense_6, offset, len, errsts, target_dev_id;
1469        unsigned char * ap;
1470        unsigned char arr[SDEBUG_MAX_MSENSE_SZ];
1471        unsigned char *cmd = scp->cmnd;
1472
1473        errsts = check_readiness(scp, UAS_ONLY, devip);
1474        if (errsts)
1475                return errsts;
1476        dbd = !!(cmd[1] & 0x8);
1477        pcontrol = (cmd[2] & 0xc0) >> 6;
1478        pcode = cmd[2] & 0x3f;
1479        subpcode = cmd[3];
1480        msense_6 = (MODE_SENSE == cmd[0]);
1481        llbaa = msense_6 ? 0 : !!(cmd[1] & 0x10);
1482        if ((0 == scsi_debug_ptype) && (0 == dbd))
1483                bd_len = llbaa ? 16 : 8;
1484        else
1485                bd_len = 0;
1486        alloc_len = msense_6 ? cmd[4] : ((cmd[7] << 8) | cmd[8]);
1487        memset(arr, 0, SDEBUG_MAX_MSENSE_SZ);
1488        if (0x3 == pcontrol) {  /* Saving values not supported */
1489                mk_sense_buffer(scp, ILLEGAL_REQUEST, SAVING_PARAMS_UNSUP, 0);
1490                return check_condition_result;
1491        }
1492        target_dev_id = ((devip->sdbg_host->shost->host_no + 1) * 2000) +
1493                        (devip->target * 1000) - 3;
1494        /* set DPOFUA bit for disks */
1495        if (0 == scsi_debug_ptype)
1496                dev_spec = (DEV_READONLY(target) ? 0x80 : 0x0) | 0x10;
1497        else
1498                dev_spec = 0x0;
1499        if (msense_6) {
1500                arr[2] = dev_spec;
1501                arr[3] = bd_len;
1502                offset = 4;
1503        } else {
1504                arr[3] = dev_spec;
1505                if (16 == bd_len)
1506                        arr[4] = 0x1;   /* set LONGLBA bit */
1507                arr[7] = bd_len;        /* assume 255 or less */
1508                offset = 8;
1509        }
1510        ap = arr + offset;
1511        if ((bd_len > 0) && (!sdebug_capacity))
1512                sdebug_capacity = get_sdebug_capacity();
1513
1514        if (8 == bd_len) {
1515                if (sdebug_capacity > 0xfffffffe) {
1516                        ap[0] = 0xff;
1517                        ap[1] = 0xff;
1518                        ap[2] = 0xff;
1519                        ap[3] = 0xff;
1520                } else {
1521                        ap[0] = (sdebug_capacity >> 24) & 0xff;
1522                        ap[1] = (sdebug_capacity >> 16) & 0xff;
1523                        ap[2] = (sdebug_capacity >> 8) & 0xff;
1524                        ap[3] = sdebug_capacity & 0xff;
1525                }
1526                ap[6] = (scsi_debug_sector_size >> 8) & 0xff;
1527                ap[7] = scsi_debug_sector_size & 0xff;
1528                offset += bd_len;
1529                ap = arr + offset;
1530        } else if (16 == bd_len) {
1531                unsigned long long capac = sdebug_capacity;
1532
1533                for (k = 0; k < 8; ++k, capac >>= 8)
1534                        ap[7 - k] = capac & 0xff;
1535                ap[12] = (scsi_debug_sector_size >> 24) & 0xff;
1536                ap[13] = (scsi_debug_sector_size >> 16) & 0xff;
1537                ap[14] = (scsi_debug_sector_size >> 8) & 0xff;
1538                ap[15] = scsi_debug_sector_size & 0xff;
1539                offset += bd_len;
1540                ap = arr + offset;
1541        }
1542
1543        if ((subpcode > 0x0) && (subpcode < 0xff) && (0x19 != pcode)) {
1544                /* TODO: Control Extension page */
1545                mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1546                                0);
1547                return check_condition_result;
1548        }
1549        switch (pcode) {
1550        case 0x1:       /* Read-Write error recovery page, direct access */
1551                len = resp_err_recov_pg(ap, pcontrol, target);
1552                offset += len;
1553                break;
1554        case 0x2:       /* Disconnect-Reconnect page, all devices */
1555                len = resp_disconnect_pg(ap, pcontrol, target);
1556                offset += len;
1557                break;
1558        case 0x3:       /* Format device page, direct access */
1559                len = resp_format_pg(ap, pcontrol, target);
1560                offset += len;
1561                break;
1562        case 0x8:       /* Caching page, direct access */
1563                len = resp_caching_pg(ap, pcontrol, target);
1564                offset += len;
1565                break;
1566        case 0xa:       /* Control Mode page, all devices */
1567                len = resp_ctrl_m_pg(ap, pcontrol, target);
1568                offset += len;
1569                break;
1570        case 0x19:      /* if spc==1 then sas phy, control+discover */
1571                if ((subpcode > 0x2) && (subpcode < 0xff)) {
1572                        mk_sense_buffer(scp, ILLEGAL_REQUEST,
1573                                        INVALID_FIELD_IN_CDB, 0);
1574                        return check_condition_result;
1575                }
1576                len = 0;
1577                if ((0x0 == subpcode) || (0xff == subpcode))
1578                        len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
1579                if ((0x1 == subpcode) || (0xff == subpcode))
1580                        len += resp_sas_pcd_m_spg(ap + len, pcontrol, target,
1581                                                  target_dev_id);
1582                if ((0x2 == subpcode) || (0xff == subpcode))
1583                        len += resp_sas_sha_m_spg(ap + len, pcontrol);
1584                offset += len;
1585                break;
1586        case 0x1c:      /* Informational Exceptions Mode page, all devices */
1587                len = resp_iec_m_pg(ap, pcontrol, target);
1588                offset += len;
1589                break;
1590        case 0x3f:      /* Read all Mode pages */
1591                if ((0 == subpcode) || (0xff == subpcode)) {
1592                        len = resp_err_recov_pg(ap, pcontrol, target);
1593                        len += resp_disconnect_pg(ap + len, pcontrol, target);
1594                        len += resp_format_pg(ap + len, pcontrol, target);
1595                        len += resp_caching_pg(ap + len, pcontrol, target);
1596                        len += resp_ctrl_m_pg(ap + len, pcontrol, target);
1597                        len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
1598                        if (0xff == subpcode) {
1599                                len += resp_sas_pcd_m_spg(ap + len, pcontrol,
1600                                                  target, target_dev_id);
1601                                len += resp_sas_sha_m_spg(ap + len, pcontrol);
1602                        }
1603                        len += resp_iec_m_pg(ap + len, pcontrol, target);
1604                } else {
1605                        mk_sense_buffer(scp, ILLEGAL_REQUEST,
1606                                        INVALID_FIELD_IN_CDB, 0);
1607                        return check_condition_result;
1608                }
1609                offset += len;
1610                break;
1611        default:
1612                mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1613                                0);
1614                return check_condition_result;
1615        }
1616        if (msense_6)
1617                arr[0] = offset - 1;
1618        else {
1619                arr[0] = ((offset - 2) >> 8) & 0xff;
1620                arr[1] = (offset - 2) & 0xff;
1621        }
1622        return fill_from_dev_buffer(scp, arr, min(alloc_len, offset));
1623}
1624
1625#define SDEBUG_MAX_MSELECT_SZ 512
1626
1627static int resp_mode_select(struct scsi_cmnd * scp, int mselect6,
1628                            struct sdebug_dev_info * devip)
1629{
1630        int pf, sp, ps, md_len, bd_len, off, spf, pg_len;
1631        int param_len, res, errsts, mpage;
1632        unsigned char arr[SDEBUG_MAX_MSELECT_SZ];
1633        unsigned char *cmd = scp->cmnd;
1634
1635        errsts = check_readiness(scp, UAS_ONLY, devip);
1636        if (errsts)
1637                return errsts;
1638        memset(arr, 0, sizeof(arr));
1639        pf = cmd[1] & 0x10;
1640        sp = cmd[1] & 0x1;
1641        param_len = mselect6 ? cmd[4] : ((cmd[7] << 8) + cmd[8]);
1642        if ((0 == pf) || sp || (param_len > SDEBUG_MAX_MSELECT_SZ)) {
1643                mk_sense_buffer(scp, ILLEGAL_REQUEST,
1644                                INVALID_FIELD_IN_CDB, 0);
1645                return check_condition_result;
1646        }
1647        res = fetch_to_dev_buffer(scp, arr, param_len);
1648        if (-1 == res)
1649                return (DID_ERROR << 16);
1650        else if ((res < param_len) &&
1651                 (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
1652                sdev_printk(KERN_INFO, scp->device,
1653                            "%s: cdb indicated=%d, IO sent=%d bytes\n",
1654                            __func__, param_len, res);
1655        md_len = mselect6 ? (arr[0] + 1) : ((arr[0] << 8) + arr[1] + 2);
1656        bd_len = mselect6 ? arr[3] : ((arr[6] << 8) + arr[7]);
1657        if (md_len > 2) {
1658                mk_sense_buffer(scp, ILLEGAL_REQUEST,
1659                                INVALID_FIELD_IN_PARAM_LIST, 0);
1660                return check_condition_result;
1661        }
1662        off = bd_len + (mselect6 ? 4 : 8);
1663        mpage = arr[off] & 0x3f;
1664        ps = !!(arr[off] & 0x80);
1665        if (ps) {
1666                mk_sense_buffer(scp, ILLEGAL_REQUEST,
1667                                INVALID_FIELD_IN_PARAM_LIST, 0);
1668                return check_condition_result;
1669        }
1670        spf = !!(arr[off] & 0x40);
1671        pg_len = spf ? ((arr[off + 2] << 8) + arr[off + 3] + 4) :
1672                       (arr[off + 1] + 2);
1673        if ((pg_len + off) > param_len) {
1674                mk_sense_buffer(scp, ILLEGAL_REQUEST,
1675                                PARAMETER_LIST_LENGTH_ERR, 0);
1676                return check_condition_result;
1677        }
1678        switch (mpage) {
1679        case 0x8:      /* Caching Mode page */
1680                if (caching_pg[1] == arr[off + 1]) {
1681                        memcpy(caching_pg + 2, arr + off + 2,
1682                               sizeof(caching_pg) - 2);
1683                        goto set_mode_changed_ua;
1684                }
1685                break;
1686        case 0xa:      /* Control Mode page */
1687                if (ctrl_m_pg[1] == arr[off + 1]) {
1688                        memcpy(ctrl_m_pg + 2, arr + off + 2,
1689                               sizeof(ctrl_m_pg) - 2);
1690                        scsi_debug_dsense = !!(ctrl_m_pg[2] & 0x4);
1691                        goto set_mode_changed_ua;
1692                }
1693                break;
1694        case 0x1c:      /* Informational Exceptions Mode page */
1695                if (iec_m_pg[1] == arr[off + 1]) {
1696                        memcpy(iec_m_pg + 2, arr + off + 2,
1697                               sizeof(iec_m_pg) - 2);
1698                        goto set_mode_changed_ua;
1699                }
1700                break;
1701        default:
1702                break;
1703        }
1704        mk_sense_buffer(scp, ILLEGAL_REQUEST,
1705                        INVALID_FIELD_IN_PARAM_LIST, 0);
1706        return check_condition_result;
1707set_mode_changed_ua:
1708        set_bit(SDEBUG_UA_MODE_CHANGED, devip->uas_bm);
1709        return 0;
1710}
1711
1712static int resp_temp_l_pg(unsigned char * arr)
1713{
1714        unsigned char temp_l_pg[] = {0x0, 0x0, 0x3, 0x2, 0x0, 38,
1715                                     0x0, 0x1, 0x3, 0x2, 0x0, 65,
1716                };
1717
1718        memcpy(arr, temp_l_pg, sizeof(temp_l_pg));
1719        return sizeof(temp_l_pg);
1720}
1721
1722static int resp_ie_l_pg(unsigned char * arr)
1723{
1724        unsigned char ie_l_pg[] = {0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 38,
1725                };
1726
1727        memcpy(arr, ie_l_pg, sizeof(ie_l_pg));
1728        if (iec_m_pg[2] & 0x4) {        /* TEST bit set */
1729                arr[4] = THRESHOLD_EXCEEDED;
1730                arr[5] = 0xff;
1731        }
1732        return sizeof(ie_l_pg);
1733}
1734
1735#define SDEBUG_MAX_LSENSE_SZ 512
1736
1737static int resp_log_sense(struct scsi_cmnd * scp,
1738                          struct sdebug_dev_info * devip)
1739{
1740        int ppc, sp, pcontrol, pcode, subpcode, alloc_len, errsts, len, n;
1741        unsigned char arr[SDEBUG_MAX_LSENSE_SZ];
1742        unsigned char *cmd = scp->cmnd;
1743
1744        errsts = check_readiness(scp, UAS_ONLY, devip);
1745        if (errsts)
1746                return errsts;
1747        memset(arr, 0, sizeof(arr));
1748        ppc = cmd[1] & 0x2;
1749        sp = cmd[1] & 0x1;
1750        if (ppc || sp) {
1751                mk_sense_buffer(scp, ILLEGAL_REQUEST,
1752                                INVALID_FIELD_IN_CDB, 0);
1753                return check_condition_result;
1754        }
1755        pcontrol = (cmd[2] & 0xc0) >> 6;
1756        pcode = cmd[2] & 0x3f;
1757        subpcode = cmd[3] & 0xff;
1758        alloc_len = (cmd[7] << 8) + cmd[8];
1759        arr[0] = pcode;
1760        if (0 == subpcode) {
1761                switch (pcode) {
1762                case 0x0:       /* Supported log pages log page */
1763                        n = 4;
1764                        arr[n++] = 0x0;         /* this page */
1765                        arr[n++] = 0xd;         /* Temperature */
1766                        arr[n++] = 0x2f;        /* Informational exceptions */
1767                        arr[3] = n - 4;
1768                        break;
1769                case 0xd:       /* Temperature log page */
1770                        arr[3] = resp_temp_l_pg(arr + 4);
1771                        break;
1772                case 0x2f:      /* Informational exceptions log page */
1773                        arr[3] = resp_ie_l_pg(arr + 4);
1774                        break;
1775                default:
1776                        mk_sense_buffer(scp, ILLEGAL_REQUEST,
1777                                        INVALID_FIELD_IN_CDB, 0);
1778                        return check_condition_result;
1779                }
1780        } else if (0xff == subpcode) {
1781                arr[0] |= 0x40;
1782                arr[1] = subpcode;
1783                switch (pcode) {
1784                case 0x0:       /* Supported log pages and subpages log page */
1785                        n = 4;
1786                        arr[n++] = 0x0;
1787                        arr[n++] = 0x0;         /* 0,0 page */
1788                        arr[n++] = 0x0;
1789                        arr[n++] = 0xff;        /* this page */
1790                        arr[n++] = 0xd;
1791                        arr[n++] = 0x0;         /* Temperature */
1792                        arr[n++] = 0x2f;
1793                        arr[n++] = 0x0; /* Informational exceptions */
1794                        arr[3] = n - 4;
1795                        break;
1796                case 0xd:       /* Temperature subpages */
1797                        n = 4;
1798                        arr[n++] = 0xd;
1799                        arr[n++] = 0x0;         /* Temperature */
1800                        arr[3] = n - 4;
1801                        break;
1802                case 0x2f:      /* Informational exceptions subpages */
1803                        n = 4;
1804                        arr[n++] = 0x2f;
1805                        arr[n++] = 0x0;         /* Informational exceptions */
1806                        arr[3] = n - 4;
1807                        break;
1808                default:
1809                        mk_sense_buffer(scp, ILLEGAL_REQUEST,
1810                                        INVALID_FIELD_IN_CDB, 0);
1811                        return check_condition_result;
1812                }
1813        } else {
1814                mk_sense_buffer(scp, ILLEGAL_REQUEST,
1815                                INVALID_FIELD_IN_CDB, 0);
1816                return check_condition_result;
1817        }
1818        len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len);
1819        return fill_from_dev_buffer(scp, arr,
1820                    min(len, SDEBUG_MAX_INQ_ARR_SZ));
1821}
1822
1823static int check_device_access_params(struct scsi_cmnd *scp,
1824                                      unsigned long long lba, unsigned int num)
1825{
1826        if (lba + num > sdebug_capacity) {
1827                mk_sense_buffer(scp, ILLEGAL_REQUEST, ADDR_OUT_OF_RANGE, 0);
1828                return check_condition_result;
1829        }
1830        /* transfer length excessive (tie in to block limits VPD page) */
1831        if (num > sdebug_store_sectors) {
1832                mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
1833                return check_condition_result;
1834        }
1835        return 0;
1836}
1837
1838/* Returns number of bytes copied or -1 if error. */
1839static int do_device_access(struct scsi_cmnd *scmd,
1840                            unsigned long long lba, unsigned int num, int write)
1841{
1842        int ret;
1843        unsigned long long block, rest = 0;
1844        struct scsi_data_buffer *sdb;
1845        enum dma_data_direction dir;
1846        size_t (*func)(struct scatterlist *, unsigned int, void *, size_t,
1847                       off_t);
1848
1849        if (write) {
1850                sdb = scsi_out(scmd);
1851                dir = DMA_TO_DEVICE;
1852                func = sg_pcopy_to_buffer;
1853        } else {
1854                sdb = scsi_in(scmd);
1855                dir = DMA_FROM_DEVICE;
1856                func = sg_pcopy_from_buffer;
1857        }
1858
1859        if (!sdb->length)
1860                return 0;
1861        if (!(scsi_bidi_cmnd(scmd) || scmd->sc_data_direction == dir))
1862                return -1;
1863
1864        block = do_div(lba, sdebug_store_sectors);
1865        if (block + num > sdebug_store_sectors)
1866                rest = block + num - sdebug_store_sectors;
1867
1868        ret = func(sdb->table.sgl, sdb->table.nents,
1869                   fake_storep + (block * scsi_debug_sector_size),
1870                   (num - rest) * scsi_debug_sector_size, 0);
1871        if (ret != (num - rest) * scsi_debug_sector_size)
1872                return ret;
1873
1874        if (rest) {
1875                ret += func(sdb->table.sgl, sdb->table.nents,
1876                            fake_storep, rest * scsi_debug_sector_size,
1877                            (num - rest) * scsi_debug_sector_size);
1878        }
1879
1880        return ret;
1881}
1882
1883static __be16 dif_compute_csum(const void *buf, int len)
1884{
1885        __be16 csum;
1886
1887        if (scsi_debug_guard)
1888                csum = (__force __be16)ip_compute_csum(buf, len);
1889        else
1890                csum = cpu_to_be16(crc_t10dif(buf, len));
1891
1892        return csum;
1893}
1894
1895static int dif_verify(struct sd_dif_tuple *sdt, const void *data,
1896                      sector_t sector, u32 ei_lba)
1897{
1898        __be16 csum = dif_compute_csum(data, scsi_debug_sector_size);
1899
1900        if (sdt->guard_tag != csum) {
1901                pr_err("%s: GUARD check failed on sector %lu rcvd 0x%04x, data 0x%04x\n",
1902                        __func__,
1903                        (unsigned long)sector,
1904                        be16_to_cpu(sdt->guard_tag),
1905                        be16_to_cpu(csum));
1906                return 0x01;
1907        }
1908        if (scsi_debug_dif == SD_DIF_TYPE1_PROTECTION &&
1909            be32_to_cpu(sdt->ref_tag) != (sector & 0xffffffff)) {
1910                pr_err("%s: REF check failed on sector %lu\n",
1911                        __func__, (unsigned long)sector);
1912                return 0x03;
1913        }
1914        if (scsi_debug_dif == SD_DIF_TYPE2_PROTECTION &&
1915            be32_to_cpu(sdt->ref_tag) != ei_lba) {
1916                pr_err("%s: REF check failed on sector %lu\n",
1917                        __func__, (unsigned long)sector);
1918                return 0x03;
1919        }
1920        return 0;
1921}
1922
1923static void dif_copy_prot(struct scsi_cmnd *SCpnt, sector_t sector,
1924                          unsigned int sectors, bool read)
1925{
1926        size_t resid;
1927        void *paddr;
1928        const void *dif_store_end = dif_storep + sdebug_store_sectors;
1929        struct sg_mapping_iter miter;
1930
1931        /* Bytes of protection data to copy into sgl */
1932        resid = sectors * sizeof(*dif_storep);
1933
1934        sg_miter_start(&miter, scsi_prot_sglist(SCpnt),
1935                        scsi_prot_sg_count(SCpnt), SG_MITER_ATOMIC |
1936                        (read ? SG_MITER_TO_SG : SG_MITER_FROM_SG));
1937
1938        while (sg_miter_next(&miter) && resid > 0) {
1939                size_t len = min(miter.length, resid);
1940                void *start = dif_store(sector);
1941                size_t rest = 0;
1942
1943                if (dif_store_end < start + len)
1944                        rest = start + len - dif_store_end;
1945
1946                paddr = miter.addr;
1947
1948                if (read)
1949                        memcpy(paddr, start, len - rest);
1950                else
1951                        memcpy(start, paddr, len - rest);
1952
1953                if (rest) {
1954                        if (read)
1955                                memcpy(paddr + len - rest, dif_storep, rest);
1956                        else
1957                                memcpy(dif_storep, paddr + len - rest, rest);
1958                }
1959
1960                sector += len / sizeof(*dif_storep);
1961                resid -= len;
1962        }
1963        sg_miter_stop(&miter);
1964}
1965
1966static int prot_verify_read(struct scsi_cmnd *SCpnt, sector_t start_sec,
1967                            unsigned int sectors, u32 ei_lba)
1968{
1969        unsigned int i;
1970        struct sd_dif_tuple *sdt;
1971        sector_t sector;
1972
1973        for (i = 0; i < sectors; i++, ei_lba++) {
1974                int ret;
1975
1976                sector = start_sec + i;
1977                sdt = dif_store(sector);
1978
1979                if (sdt->app_tag == cpu_to_be16(0xffff))
1980                        continue;
1981
1982                ret = dif_verify(sdt, fake_store(sector), sector, ei_lba);
1983                if (ret) {
1984                        dif_errors++;
1985                        return ret;
1986                }
1987        }
1988
1989        dif_copy_prot(SCpnt, start_sec, sectors, true);
1990        dix_reads++;
1991
1992        return 0;
1993}
1994
1995static int resp_read(struct scsi_cmnd *SCpnt, unsigned long long lba,
1996                     unsigned int num, u32 ei_lba)
1997{
1998        unsigned long iflags;
1999        int ret;
2000
2001        ret = check_device_access_params(SCpnt, lba, num);
2002        if (ret)
2003                return ret;
2004
2005        if ((SCSI_DEBUG_OPT_MEDIUM_ERR & scsi_debug_opts) &&
2006            (lba <= (OPT_MEDIUM_ERR_ADDR + OPT_MEDIUM_ERR_NUM - 1)) &&
2007            ((lba + num) > OPT_MEDIUM_ERR_ADDR)) {
2008                /* claim unrecoverable read error */
2009                mk_sense_buffer(SCpnt, MEDIUM_ERROR, UNRECOVERED_READ_ERR, 0);
2010                /* set info field and valid bit for fixed descriptor */
2011                if (0x70 == (SCpnt->sense_buffer[0] & 0x7f)) {
2012                        SCpnt->sense_buffer[0] |= 0x80; /* Valid bit */
2013                        ret = (lba < OPT_MEDIUM_ERR_ADDR)
2014                              ? OPT_MEDIUM_ERR_ADDR : (int)lba;
2015                        SCpnt->sense_buffer[3] = (ret >> 24) & 0xff;
2016                        SCpnt->sense_buffer[4] = (ret >> 16) & 0xff;
2017                        SCpnt->sense_buffer[5] = (ret >> 8) & 0xff;
2018                        SCpnt->sense_buffer[6] = ret & 0xff;
2019                }
2020                scsi_set_resid(SCpnt, scsi_bufflen(SCpnt));
2021                return check_condition_result;
2022        }
2023
2024        read_lock_irqsave(&atomic_rw, iflags);
2025
2026        /* DIX + T10 DIF */
2027        if (scsi_debug_dix && scsi_prot_sg_count(SCpnt)) {
2028                int prot_ret = prot_verify_read(SCpnt, lba, num, ei_lba);
2029
2030                if (prot_ret) {
2031                        read_unlock_irqrestore(&atomic_rw, iflags);
2032                        mk_sense_buffer(SCpnt, ABORTED_COMMAND, 0x10, prot_ret);
2033                        return illegal_condition_result;
2034                }
2035        }
2036
2037        ret = do_device_access(SCpnt, lba, num, 0);
2038        read_unlock_irqrestore(&atomic_rw, iflags);
2039        if (ret == -1)
2040                return DID_ERROR << 16;
2041
2042        scsi_in(SCpnt)->resid = scsi_bufflen(SCpnt) - ret;
2043
2044        return 0;
2045}
2046
2047void dump_sector(unsigned char *buf, int len)
2048{
2049        int i, j, n;
2050
2051        pr_err(">>> Sector Dump <<<\n");
2052        for (i = 0 ; i < len ; i += 16) {
2053                char b[128];
2054
2055                for (j = 0, n = 0; j < 16; j++) {
2056                        unsigned char c = buf[i+j];
2057
2058                        if (c >= 0x20 && c < 0x7e)
2059                                n += scnprintf(b + n, sizeof(b) - n,
2060                                               " %c ", buf[i+j]);
2061                        else
2062                                n += scnprintf(b + n, sizeof(b) - n,
2063                                               "%02x ", buf[i+j]);
2064                }
2065                pr_err("%04d: %s\n", i, b);
2066        }
2067}
2068
2069static int prot_verify_write(struct scsi_cmnd *SCpnt, sector_t start_sec,
2070                             unsigned int sectors, u32 ei_lba)
2071{
2072        int ret;
2073        struct sd_dif_tuple *sdt;
2074        void *daddr;
2075        sector_t sector = start_sec;
2076        int ppage_offset;
2077        int dpage_offset;
2078        struct sg_mapping_iter diter;
2079        struct sg_mapping_iter piter;
2080
2081        BUG_ON(scsi_sg_count(SCpnt) == 0);
2082        BUG_ON(scsi_prot_sg_count(SCpnt) == 0);
2083
2084        sg_miter_start(&piter, scsi_prot_sglist(SCpnt),
2085                        scsi_prot_sg_count(SCpnt),
2086                        SG_MITER_ATOMIC | SG_MITER_FROM_SG);
2087        sg_miter_start(&diter, scsi_sglist(SCpnt), scsi_sg_count(SCpnt),
2088                        SG_MITER_ATOMIC | SG_MITER_FROM_SG);
2089
2090        /* For each protection page */
2091        while (sg_miter_next(&piter)) {
2092                dpage_offset = 0;
2093                if (WARN_ON(!sg_miter_next(&diter))) {
2094                        ret = 0x01;
2095                        goto out;
2096                }
2097
2098                for (ppage_offset = 0; ppage_offset < piter.length;
2099                     ppage_offset += sizeof(struct sd_dif_tuple)) {
2100                        /* If we're at the end of the current
2101                         * data page advance to the next one
2102                         */
2103                        if (dpage_offset >= diter.length) {
2104                                if (WARN_ON(!sg_miter_next(&diter))) {
2105                                        ret = 0x01;
2106                                        goto out;
2107                                }
2108                                dpage_offset = 0;
2109                        }
2110
2111                        sdt = piter.addr + ppage_offset;
2112                        daddr = diter.addr + dpage_offset;
2113
2114                        ret = dif_verify(sdt, daddr, sector, ei_lba);
2115                        if (ret) {
2116                                dump_sector(daddr, scsi_debug_sector_size);
2117                                goto out;
2118                        }
2119
2120                        sector++;
2121                        ei_lba++;
2122                        dpage_offset += scsi_debug_sector_size;
2123                }
2124                diter.consumed = dpage_offset;
2125                sg_miter_stop(&diter);
2126        }
2127        sg_miter_stop(&piter);
2128
2129        dif_copy_prot(SCpnt, start_sec, sectors, false);
2130        dix_writes++;
2131
2132        return 0;
2133
2134out:
2135        dif_errors++;
2136        sg_miter_stop(&diter);
2137        sg_miter_stop(&piter);
2138        return ret;
2139}
2140
2141static unsigned long lba_to_map_index(sector_t lba)
2142{
2143        if (scsi_debug_unmap_alignment) {
2144                lba += scsi_debug_unmap_granularity -
2145                        scsi_debug_unmap_alignment;
2146        }
2147        do_div(lba, scsi_debug_unmap_granularity);
2148
2149        return lba;
2150}
2151
2152static sector_t map_index_to_lba(unsigned long index)
2153{
2154        sector_t lba = index * scsi_debug_unmap_granularity;
2155
2156        if (scsi_debug_unmap_alignment) {
2157                lba -= scsi_debug_unmap_granularity -
2158                        scsi_debug_unmap_alignment;
2159        }
2160
2161        return lba;
2162}
2163
2164static unsigned int map_state(sector_t lba, unsigned int *num)
2165{
2166        sector_t end;
2167        unsigned int mapped;
2168        unsigned long index;
2169        unsigned long next;
2170
2171        index = lba_to_map_index(lba);
2172        mapped = test_bit(index, map_storep);
2173
2174        if (mapped)
2175                next = find_next_zero_bit(map_storep, map_size, index);
2176        else
2177                next = find_next_bit(map_storep, map_size, index);
2178
2179        end = min_t(sector_t, sdebug_store_sectors,  map_index_to_lba(next));
2180        *num = end - lba;
2181
2182        return mapped;
2183}
2184
2185static void map_region(sector_t lba, unsigned int len)
2186{
2187        sector_t end = lba + len;
2188
2189        while (lba < end) {
2190                unsigned long index = lba_to_map_index(lba);
2191
2192                if (index < map_size)
2193                        set_bit(index, map_storep);
2194
2195                lba = map_index_to_lba(index + 1);
2196        }
2197}
2198
2199static void unmap_region(sector_t lba, unsigned int len)
2200{
2201        sector_t end = lba + len;
2202
2203        while (lba < end) {
2204                unsigned long index = lba_to_map_index(lba);
2205
2206                if (lba == map_index_to_lba(index) &&
2207                    lba + scsi_debug_unmap_granularity <= end &&
2208                    index < map_size) {
2209                        clear_bit(index, map_storep);
2210                        if (scsi_debug_lbprz) {
2211                                memset(fake_storep +
2212                                       lba * scsi_debug_sector_size, 0,
2213                                       scsi_debug_sector_size *
2214                                       scsi_debug_unmap_granularity);
2215                        }
2216                        if (dif_storep) {
2217                                memset(dif_storep + lba, 0xff,
2218                                       sizeof(*dif_storep) *
2219                                       scsi_debug_unmap_granularity);
2220                        }
2221                }
2222                lba = map_index_to_lba(index + 1);
2223        }
2224}
2225
2226static int resp_write(struct scsi_cmnd *SCpnt, unsigned long long lba,
2227                      unsigned int num, u32 ei_lba)
2228{
2229        unsigned long iflags;
2230        int ret;
2231
2232        ret = check_device_access_params(SCpnt, lba, num);
2233        if (ret)
2234                return ret;
2235
2236        write_lock_irqsave(&atomic_rw, iflags);
2237
2238        /* DIX + T10 DIF */
2239        if (scsi_debug_dix && scsi_prot_sg_count(SCpnt)) {
2240                int prot_ret = prot_verify_write(SCpnt, lba, num, ei_lba);
2241
2242                if (prot_ret) {
2243                        write_unlock_irqrestore(&atomic_rw, iflags);
2244                        mk_sense_buffer(SCpnt, ILLEGAL_REQUEST, 0x10,
2245                                        prot_ret);
2246                        return illegal_condition_result;
2247                }
2248        }
2249
2250        ret = do_device_access(SCpnt, lba, num, 1);
2251        if (scsi_debug_lbp())
2252                map_region(lba, num);
2253        write_unlock_irqrestore(&atomic_rw, iflags);
2254        if (-1 == ret)
2255                return (DID_ERROR << 16);
2256        else if ((ret < (num * scsi_debug_sector_size)) &&
2257                 (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
2258                sdev_printk(KERN_INFO, SCpnt->device,
2259                            "%s: write: cdb indicated=%u, IO sent=%d bytes\n",
2260                            my_name, num * scsi_debug_sector_size, ret);
2261
2262        return 0;
2263}
2264
2265static int resp_write_same(struct scsi_cmnd *scmd, unsigned long long lba,
2266                      unsigned int num, u32 ei_lba, unsigned int unmap)
2267{
2268        unsigned long iflags;
2269        unsigned long long i;
2270        int ret;
2271
2272        ret = check_device_access_params(scmd, lba, num);
2273        if (ret)
2274                return ret;
2275
2276        if (num > scsi_debug_write_same_length) {
2277                mk_sense_buffer(scmd, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
2278                                0);
2279                return check_condition_result;
2280        }
2281
2282        write_lock_irqsave(&atomic_rw, iflags);
2283
2284        if (unmap && scsi_debug_lbp()) {
2285                unmap_region(lba, num);
2286                goto out;
2287        }
2288
2289        /* Else fetch one logical block */
2290        ret = fetch_to_dev_buffer(scmd,
2291                                  fake_storep + (lba * scsi_debug_sector_size),
2292                                  scsi_debug_sector_size);
2293
2294        if (-1 == ret) {
2295                write_unlock_irqrestore(&atomic_rw, iflags);
2296                return (DID_ERROR << 16);
2297        } else if ((ret < (num * scsi_debug_sector_size)) &&
2298                 (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
2299                sdev_printk(KERN_INFO, scmd->device,
2300                            "%s: %s: cdb indicated=%u, IO sent=%d bytes\n",
2301                            my_name, "write same",
2302                            num * scsi_debug_sector_size, ret);
2303
2304        /* Copy first sector to remaining blocks */
2305        for (i = 1 ; i < num ; i++)
2306                memcpy(fake_storep + ((lba + i) * scsi_debug_sector_size),
2307                       fake_storep + (lba * scsi_debug_sector_size),
2308                       scsi_debug_sector_size);
2309
2310        if (scsi_debug_lbp())
2311                map_region(lba, num);
2312out:
2313        write_unlock_irqrestore(&atomic_rw, iflags);
2314
2315        return 0;
2316}
2317
2318struct unmap_block_desc {
2319        __be64  lba;
2320        __be32  blocks;
2321        __be32  __reserved;
2322};
2323
2324static int resp_unmap(struct scsi_cmnd * scmd, struct sdebug_dev_info * devip)
2325{
2326        unsigned char *buf;
2327        struct unmap_block_desc *desc;
2328        unsigned int i, payload_len, descriptors;
2329        int ret;
2330        unsigned long iflags;
2331
2332        ret = check_readiness(scmd, UAS_ONLY, devip);
2333        if (ret)
2334                return ret;
2335
2336        payload_len = get_unaligned_be16(&scmd->cmnd[7]);
2337        BUG_ON(scsi_bufflen(scmd) != payload_len);
2338
2339        descriptors = (payload_len - 8) / 16;
2340
2341        buf = kmalloc(scsi_bufflen(scmd), GFP_ATOMIC);
2342        if (!buf)
2343                return check_condition_result;
2344
2345        scsi_sg_copy_to_buffer(scmd, buf, scsi_bufflen(scmd));
2346
2347        BUG_ON(get_unaligned_be16(&buf[0]) != payload_len - 2);
2348        BUG_ON(get_unaligned_be16(&buf[2]) != descriptors * 16);
2349
2350        desc = (void *)&buf[8];
2351
2352        write_lock_irqsave(&atomic_rw, iflags);
2353
2354        for (i = 0 ; i < descriptors ; i++) {
2355                unsigned long long lba = get_unaligned_be64(&desc[i].lba);
2356                unsigned int num = get_unaligned_be32(&desc[i].blocks);
2357
2358                ret = check_device_access_params(scmd, lba, num);
2359                if (ret)
2360                        goto out;
2361
2362                unmap_region(lba, num);
2363        }
2364
2365        ret = 0;
2366
2367out:
2368        write_unlock_irqrestore(&atomic_rw, iflags);
2369        kfree(buf);
2370
2371        return ret;
2372}
2373
2374#define SDEBUG_GET_LBA_STATUS_LEN 32
2375
2376static int resp_get_lba_status(struct scsi_cmnd * scmd,
2377                               struct sdebug_dev_info * devip)
2378{
2379        unsigned long long lba;
2380        unsigned int alloc_len, mapped, num;
2381        unsigned char arr[SDEBUG_GET_LBA_STATUS_LEN];
2382        int ret;
2383
2384        ret = check_readiness(scmd, UAS_ONLY, devip);
2385        if (ret)
2386                return ret;
2387
2388        lba = get_unaligned_be64(&scmd->cmnd[2]);
2389        alloc_len = get_unaligned_be32(&scmd->cmnd[10]);
2390
2391        if (alloc_len < 24)
2392                return 0;
2393
2394        ret = check_device_access_params(scmd, lba, 1);
2395        if (ret)
2396                return ret;
2397
2398        mapped = map_state(lba, &num);
2399
2400        memset(arr, 0, SDEBUG_GET_LBA_STATUS_LEN);
2401        put_unaligned_be32(20, &arr[0]);        /* Parameter Data Length */
2402        put_unaligned_be64(lba, &arr[8]);       /* LBA */
2403        put_unaligned_be32(num, &arr[16]);      /* Number of blocks */
2404        arr[20] = !mapped;                      /* mapped = 0, unmapped = 1 */
2405
2406        return fill_from_dev_buffer(scmd, arr, SDEBUG_GET_LBA_STATUS_LEN);
2407}
2408
2409#define SDEBUG_RLUN_ARR_SZ 256
2410
2411static int resp_report_luns(struct scsi_cmnd * scp,
2412                            struct sdebug_dev_info * devip)
2413{
2414        unsigned int alloc_len;
2415        int lun_cnt, i, upper, num, n;
2416        u64 wlun, lun;
2417        unsigned char *cmd = scp->cmnd;
2418        int select_report = (int)cmd[2];
2419        struct scsi_lun *one_lun;
2420        unsigned char arr[SDEBUG_RLUN_ARR_SZ];
2421        unsigned char * max_addr;
2422
2423        alloc_len = cmd[9] + (cmd[8] << 8) + (cmd[7] << 16) + (cmd[6] << 24);
2424        if ((alloc_len < 4) || (select_report > 2)) {
2425                mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
2426                                0);
2427                return check_condition_result;
2428        }
2429        /* can produce response with up to 16k luns (lun 0 to lun 16383) */
2430        memset(arr, 0, SDEBUG_RLUN_ARR_SZ);
2431        lun_cnt = scsi_debug_max_luns;
2432        if (1 == select_report)
2433                lun_cnt = 0;
2434        else if (scsi_debug_no_lun_0 && (lun_cnt > 0))
2435                --lun_cnt;
2436        wlun = (select_report > 0) ? 1 : 0;
2437        num = lun_cnt + wlun;
2438        arr[2] = ((sizeof(struct scsi_lun) * num) >> 8) & 0xff;
2439        arr[3] = (sizeof(struct scsi_lun) * num) & 0xff;
2440        n = min((int)((SDEBUG_RLUN_ARR_SZ - 8) /
2441                            sizeof(struct scsi_lun)), num);
2442        if (n < num) {
2443                wlun = 0;
2444                lun_cnt = n;
2445        }
2446        one_lun = (struct scsi_lun *) &arr[8];
2447        max_addr = arr + SDEBUG_RLUN_ARR_SZ;
2448        for (i = 0, lun = (scsi_debug_no_lun_0 ? 1 : 0);
2449             ((i < lun_cnt) && ((unsigned char *)(one_lun + i) < max_addr));
2450             i++, lun++) {
2451                upper = (lun >> 8) & 0x3f;
2452                if (upper)
2453                        one_lun[i].scsi_lun[0] =
2454                            (upper | (SAM2_LUN_ADDRESS_METHOD << 6));
2455                one_lun[i].scsi_lun[1] = lun & 0xff;
2456        }
2457        if (wlun) {
2458                one_lun[i].scsi_lun[0] = (SAM2_WLUN_REPORT_LUNS >> 8) & 0xff;
2459                one_lun[i].scsi_lun[1] = SAM2_WLUN_REPORT_LUNS & 0xff;
2460                i++;
2461        }
2462        alloc_len = (unsigned char *)(one_lun + i) - arr;
2463        return fill_from_dev_buffer(scp, arr,
2464                                    min((int)alloc_len, SDEBUG_RLUN_ARR_SZ));
2465}
2466
2467static int resp_xdwriteread(struct scsi_cmnd *scp, unsigned long long lba,
2468                            unsigned int num, struct sdebug_dev_info *devip)
2469{
2470        int j;
2471        unsigned char *kaddr, *buf;
2472        unsigned int offset;
2473        struct scsi_data_buffer *sdb = scsi_in(scp);
2474        struct sg_mapping_iter miter;
2475
2476        /* better not to use temporary buffer. */
2477        buf = kmalloc(scsi_bufflen(scp), GFP_ATOMIC);
2478        if (!buf) {
2479                mk_sense_buffer(scp, NOT_READY,
2480                                LOGICAL_UNIT_COMMUNICATION_FAILURE, 0);
2481                return check_condition_result;
2482        }
2483
2484        scsi_sg_copy_to_buffer(scp, buf, scsi_bufflen(scp));
2485
2486        offset = 0;
2487        sg_miter_start(&miter, sdb->table.sgl, sdb->table.nents,
2488                        SG_MITER_ATOMIC | SG_MITER_TO_SG);
2489
2490        while (sg_miter_next(&miter)) {
2491                kaddr = miter.addr;
2492                for (j = 0; j < miter.length; j++)
2493                        *(kaddr + j) ^= *(buf + offset + j);
2494
2495                offset += miter.length;
2496        }
2497        sg_miter_stop(&miter);
2498        kfree(buf);
2499
2500        return 0;
2501}
2502
2503/* When timer or tasklet goes off this function is called. */
2504static void sdebug_q_cmd_complete(unsigned long indx)
2505{
2506        int qa_indx;
2507        int retiring = 0;
2508        unsigned long iflags;
2509        struct sdebug_queued_cmd *sqcp;
2510        struct scsi_cmnd *scp;
2511        struct sdebug_dev_info *devip;
2512
2513        atomic_inc(&sdebug_completions);
2514        qa_indx = indx;
2515        if ((qa_indx < 0) || (qa_indx >= SCSI_DEBUG_CANQUEUE)) {
2516                pr_err("%s: wild qa_indx=%d\n", __func__, qa_indx);
2517                return;
2518        }
2519        spin_lock_irqsave(&queued_arr_lock, iflags);
2520        sqcp = &queued_arr[qa_indx];
2521        scp = sqcp->a_cmnd;
2522        if (NULL == scp) {
2523                spin_unlock_irqrestore(&queued_arr_lock, iflags);
2524                pr_err("%s: scp is NULL\n", __func__);
2525                return;
2526        }
2527        devip = (struct sdebug_dev_info *)scp->device->hostdata;
2528        if (devip)
2529                atomic_dec(&devip->num_in_q);
2530        else
2531                pr_err("%s: devip=NULL\n", __func__);
2532        if (atomic_read(&retired_max_queue) > 0)
2533                retiring = 1;
2534
2535        sqcp->a_cmnd = NULL;
2536        if (!test_and_clear_bit(qa_indx, queued_in_use_bm)) {
2537                spin_unlock_irqrestore(&queued_arr_lock, iflags);
2538                pr_err("%s: Unexpected completion\n", __func__);
2539                return;
2540        }
2541
2542        if (unlikely(retiring)) {       /* user has reduced max_queue */
2543                int k, retval;
2544
2545                retval = atomic_read(&retired_max_queue);
2546                if (qa_indx >= retval) {
2547                        spin_unlock_irqrestore(&queued_arr_lock, iflags);
2548                        pr_err("%s: index %d too large\n", __func__, retval);
2549                        return;
2550                }
2551                k = find_last_bit(queued_in_use_bm, retval);
2552                if ((k < scsi_debug_max_queue) || (k == retval))
2553                        atomic_set(&retired_max_queue, 0);
2554                else
2555                        atomic_set(&retired_max_queue, k + 1);
2556        }
2557        spin_unlock_irqrestore(&queued_arr_lock, iflags);
2558        scp->scsi_done(scp); /* callback to mid level */
2559}
2560
2561/* When high resolution timer goes off this function is called. */
2562static enum hrtimer_restart
2563sdebug_q_cmd_hrt_complete(struct hrtimer *timer)
2564{
2565        int qa_indx;
2566        int retiring = 0;
2567        unsigned long iflags;
2568        struct sdebug_hrtimer *sd_hrtp = (struct sdebug_hrtimer *)timer;
2569        struct sdebug_queued_cmd *sqcp;
2570        struct scsi_cmnd *scp;
2571        struct sdebug_dev_info *devip;
2572
2573        atomic_inc(&sdebug_completions);
2574        qa_indx = sd_hrtp->qa_indx;
2575        if ((qa_indx < 0) || (qa_indx >= SCSI_DEBUG_CANQUEUE)) {
2576                pr_err("%s: wild qa_indx=%d\n", __func__, qa_indx);
2577                goto the_end;
2578        }
2579        spin_lock_irqsave(&queued_arr_lock, iflags);
2580        sqcp = &queued_arr[qa_indx];
2581        scp = sqcp->a_cmnd;
2582        if (NULL == scp) {
2583                spin_unlock_irqrestore(&queued_arr_lock, iflags);
2584                pr_err("%s: scp is NULL\n", __func__);
2585                goto the_end;
2586        }
2587        devip = (struct sdebug_dev_info *)scp->device->hostdata;
2588        if (devip)
2589                atomic_dec(&devip->num_in_q);
2590        else
2591                pr_err("%s: devip=NULL\n", __func__);
2592        if (atomic_read(&retired_max_queue) > 0)
2593                retiring = 1;
2594
2595        sqcp->a_cmnd = NULL;
2596        if (!test_and_clear_bit(qa_indx, queued_in_use_bm)) {
2597                spin_unlock_irqrestore(&queued_arr_lock, iflags);
2598                pr_err("%s: Unexpected completion\n", __func__);
2599                goto the_end;
2600        }
2601
2602        if (unlikely(retiring)) {       /* user has reduced max_queue */
2603                int k, retval;
2604
2605                retval = atomic_read(&retired_max_queue);
2606                if (qa_indx >= retval) {
2607                        spin_unlock_irqrestore(&queued_arr_lock, iflags);
2608                        pr_err("%s: index %d too large\n", __func__, retval);
2609                        goto the_end;
2610                }
2611                k = find_last_bit(queued_in_use_bm, retval);
2612                if ((k < scsi_debug_max_queue) || (k == retval))
2613                        atomic_set(&retired_max_queue, 0);
2614                else
2615                        atomic_set(&retired_max_queue, k + 1);
2616        }
2617        spin_unlock_irqrestore(&queued_arr_lock, iflags);
2618        scp->scsi_done(scp); /* callback to mid level */
2619the_end:
2620        return HRTIMER_NORESTART;
2621}
2622
2623static struct sdebug_dev_info *
2624sdebug_device_create(struct sdebug_host_info *sdbg_host, gfp_t flags)
2625{
2626        struct sdebug_dev_info *devip;
2627
2628        devip = kzalloc(sizeof(*devip), flags);
2629        if (devip) {
2630                devip->sdbg_host = sdbg_host;
2631                list_add_tail(&devip->dev_list, &sdbg_host->dev_info_list);
2632        }
2633        return devip;
2634}
2635
2636static struct sdebug_dev_info * devInfoReg(struct scsi_device * sdev)
2637{
2638        struct sdebug_host_info * sdbg_host;
2639        struct sdebug_dev_info * open_devip = NULL;
2640        struct sdebug_dev_info * devip =
2641                        (struct sdebug_dev_info *)sdev->hostdata;
2642
2643        if (devip)
2644                return devip;
2645        sdbg_host = *(struct sdebug_host_info **)shost_priv(sdev->host);
2646        if (!sdbg_host) {
2647                pr_err("%s: Host info NULL\n", __func__);
2648                return NULL;
2649        }
2650        list_for_each_entry(devip, &sdbg_host->dev_info_list, dev_list) {
2651                if ((devip->used) && (devip->channel == sdev->channel) &&
2652                    (devip->target == sdev->id) &&
2653                    (devip->lun == sdev->lun))
2654                        return devip;
2655                else {
2656                        if ((!devip->used) && (!open_devip))
2657                                open_devip = devip;
2658                }
2659        }
2660        if (!open_devip) { /* try and make a new one */
2661                open_devip = sdebug_device_create(sdbg_host, GFP_ATOMIC);
2662                if (!open_devip) {
2663                        printk(KERN_ERR "%s: out of memory at line %d\n",
2664                                __func__, __LINE__);
2665                        return NULL;
2666                }
2667        }
2668
2669        open_devip->channel = sdev->channel;
2670        open_devip->target = sdev->id;
2671        open_devip->lun = sdev->lun;
2672        open_devip->sdbg_host = sdbg_host;
2673        atomic_set(&open_devip->num_in_q, 0);
2674        set_bit(SDEBUG_UA_POR, open_devip->uas_bm);
2675        open_devip->used = 1;
2676        if (sdev->lun == SAM2_WLUN_REPORT_LUNS)
2677                open_devip->wlun = SAM2_WLUN_REPORT_LUNS & 0xff;
2678
2679        return open_devip;
2680}
2681
2682static int scsi_debug_slave_alloc(struct scsi_device *sdp)
2683{
2684        if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2685                printk(KERN_INFO "scsi_debug: slave_alloc <%u %u %u %llu>\n",
2686                       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
2687        queue_flag_set_unlocked(QUEUE_FLAG_BIDI, sdp->request_queue);
2688        return 0;
2689}
2690
2691static int scsi_debug_slave_configure(struct scsi_device *sdp)
2692{
2693        struct sdebug_dev_info *devip;
2694
2695        if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2696                printk(KERN_INFO "scsi_debug: slave_configure <%u %u %u %llu>\n",
2697                       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
2698        if (sdp->host->max_cmd_len != SCSI_DEBUG_MAX_CMD_LEN)
2699                sdp->host->max_cmd_len = SCSI_DEBUG_MAX_CMD_LEN;
2700        devip = devInfoReg(sdp);
2701        if (NULL == devip)
2702                return 1;       /* no resources, will be marked offline */
2703        sdp->hostdata = devip;
2704        sdp->tagged_supported = 1;
2705        if (sdp->host->cmd_per_lun)
2706                scsi_adjust_queue_depth(sdp, DEF_TAGGED_QUEUING,
2707                                        DEF_CMD_PER_LUN);
2708        blk_queue_max_segment_size(sdp->request_queue, -1U);
2709        if (scsi_debug_no_uld)
2710                sdp->no_uld_attach = 1;
2711        return 0;
2712}
2713
2714static void scsi_debug_slave_destroy(struct scsi_device *sdp)
2715{
2716        struct sdebug_dev_info *devip =
2717                (struct sdebug_dev_info *)sdp->hostdata;
2718
2719        if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2720                printk(KERN_INFO "scsi_debug: slave_destroy <%u %u %u %llu>\n",
2721                       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
2722        if (devip) {
2723                /* make this slot available for re-use */
2724                devip->used = 0;
2725                sdp->hostdata = NULL;
2726        }
2727}
2728
2729/* Returns 1 if cmnd found (deletes its timer or tasklet), else returns 0 */
2730static int stop_queued_cmnd(struct scsi_cmnd *cmnd)
2731{
2732        unsigned long iflags;
2733        int k, qmax, r_qmax;
2734        struct sdebug_queued_cmd *sqcp;
2735        struct sdebug_dev_info *devip;
2736
2737        spin_lock_irqsave(&queued_arr_lock, iflags);
2738        qmax = scsi_debug_max_queue;
2739        r_qmax = atomic_read(&retired_max_queue);
2740        if (r_qmax > qmax)
2741                qmax = r_qmax;
2742        for (k = 0; k < qmax; ++k) {
2743                if (test_bit(k, queued_in_use_bm)) {
2744                        sqcp = &queued_arr[k];
2745                        if (cmnd == sqcp->a_cmnd) {
2746                                devip = (struct sdebug_dev_info *)
2747                                        cmnd->device->hostdata;
2748                                if (devip)
2749                                        atomic_dec(&devip->num_in_q);
2750                                sqcp->a_cmnd = NULL;
2751                                spin_unlock_irqrestore(&queued_arr_lock,
2752                                                       iflags);
2753                                if (scsi_debug_ndelay > 0) {
2754                                        if (sqcp->sd_hrtp)
2755                                                hrtimer_cancel(
2756                                                        &sqcp->sd_hrtp->hrt);
2757                                } else if (scsi_debug_delay > 0) {
2758                                        if (sqcp->cmnd_timerp)
2759                                                del_timer_sync(
2760                                                        sqcp->cmnd_timerp);
2761                                } else if (scsi_debug_delay < 0) {
2762                                        if (sqcp->tletp)
2763                                                tasklet_kill(sqcp->tletp);
2764                                }
2765                                clear_bit(k, queued_in_use_bm);
2766                                return 1;
2767                        }
2768                }
2769        }
2770        spin_unlock_irqrestore(&queued_arr_lock, iflags);
2771        return 0;
2772}
2773
2774/* Deletes (stops) timers or tasklets of all queued commands */
2775static void stop_all_queued(void)
2776{
2777        unsigned long iflags;
2778        int k;
2779        struct sdebug_queued_cmd *sqcp;
2780        struct sdebug_dev_info *devip;
2781
2782        spin_lock_irqsave(&queued_arr_lock, iflags);
2783        for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
2784                if (test_bit(k, queued_in_use_bm)) {
2785                        sqcp = &queued_arr[k];
2786                        if (sqcp->a_cmnd) {
2787                                devip = (struct sdebug_dev_info *)
2788                                        sqcp->a_cmnd->device->hostdata;
2789                                if (devip)
2790                                        atomic_dec(&devip->num_in_q);
2791                                sqcp->a_cmnd = NULL;
2792                                spin_unlock_irqrestore(&queued_arr_lock,
2793                                                       iflags);
2794                                if (scsi_debug_ndelay > 0) {
2795                                        if (sqcp->sd_hrtp)
2796                                                hrtimer_cancel(
2797                                                        &sqcp->sd_hrtp->hrt);
2798                                } else if (scsi_debug_delay > 0) {
2799                                        if (sqcp->cmnd_timerp)
2800                                                del_timer_sync(
2801                                                        sqcp->cmnd_timerp);
2802                                } else if (scsi_debug_delay < 0) {
2803                                        if (sqcp->tletp)
2804                                                tasklet_kill(sqcp->tletp);
2805                                }
2806                                clear_bit(k, queued_in_use_bm);
2807                                spin_lock_irqsave(&queued_arr_lock, iflags);
2808                        }
2809                }
2810        }
2811        spin_unlock_irqrestore(&queued_arr_lock, iflags);
2812}
2813
2814/* Free queued command memory on heap */
2815static void free_all_queued(void)
2816{
2817        unsigned long iflags;
2818        int k;
2819        struct sdebug_queued_cmd *sqcp;
2820
2821        spin_lock_irqsave(&queued_arr_lock, iflags);
2822        for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
2823                sqcp = &queued_arr[k];
2824                kfree(sqcp->cmnd_timerp);
2825                sqcp->cmnd_timerp = NULL;
2826                kfree(sqcp->tletp);
2827                sqcp->tletp = NULL;
2828                kfree(sqcp->sd_hrtp);
2829                sqcp->sd_hrtp = NULL;
2830        }
2831        spin_unlock_irqrestore(&queued_arr_lock, iflags);
2832}
2833
2834static int scsi_debug_abort(struct scsi_cmnd *SCpnt)
2835{
2836        ++num_aborts;
2837        if (SCpnt) {
2838                if (SCpnt->device &&
2839                    (SCSI_DEBUG_OPT_ALL_NOISE & scsi_debug_opts))
2840                        sdev_printk(KERN_INFO, SCpnt->device, "%s\n",
2841                                    __func__);
2842                stop_queued_cmnd(SCpnt);
2843        }
2844        return SUCCESS;
2845}
2846
2847static int scsi_debug_device_reset(struct scsi_cmnd * SCpnt)
2848{
2849        struct sdebug_dev_info * devip;
2850
2851        ++num_dev_resets;
2852        if (SCpnt && SCpnt->device) {
2853                struct scsi_device *sdp = SCpnt->device;
2854
2855                if (SCSI_DEBUG_OPT_ALL_NOISE & scsi_debug_opts)
2856                        sdev_printk(KERN_INFO, sdp, "%s\n", __func__);
2857                devip = devInfoReg(sdp);
2858                if (devip)
2859                        set_bit(SDEBUG_UA_POR, devip->uas_bm);
2860        }
2861        return SUCCESS;
2862}
2863
2864static int scsi_debug_target_reset(struct scsi_cmnd *SCpnt)
2865{
2866        struct sdebug_host_info *sdbg_host;
2867        struct sdebug_dev_info *devip;
2868        struct scsi_device *sdp;
2869        struct Scsi_Host *hp;
2870        int k = 0;
2871
2872        ++num_target_resets;
2873        if (!SCpnt)
2874                goto lie;
2875        sdp = SCpnt->device;
2876        if (!sdp)
2877                goto lie;
2878        if (SCSI_DEBUG_OPT_ALL_NOISE & scsi_debug_opts)
2879                sdev_printk(KERN_INFO, sdp, "%s\n", __func__);
2880        hp = sdp->host;
2881        if (!hp)
2882                goto lie;
2883        sdbg_host = *(struct sdebug_host_info **)shost_priv(hp);
2884        if (sdbg_host) {
2885                list_for_each_entry(devip,
2886                                    &sdbg_host->dev_info_list,
2887                                    dev_list)
2888                        if (devip->target == sdp->id) {
2889                                set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
2890                                ++k;
2891                        }
2892        }
2893        if (SCSI_DEBUG_OPT_RESET_NOISE & scsi_debug_opts)
2894                sdev_printk(KERN_INFO, sdp,
2895                            "%s: %d device(s) found in target\n", __func__, k);
2896lie:
2897        return SUCCESS;
2898}
2899
2900static int scsi_debug_bus_reset(struct scsi_cmnd * SCpnt)
2901{
2902        struct sdebug_host_info *sdbg_host;
2903        struct sdebug_dev_info *devip;
2904        struct scsi_device * sdp;
2905        struct Scsi_Host * hp;
2906        int k = 0;
2907
2908        ++num_bus_resets;
2909        if (!(SCpnt && SCpnt->device))
2910                goto lie;
2911        sdp = SCpnt->device;
2912        if (SCSI_DEBUG_OPT_ALL_NOISE & scsi_debug_opts)
2913                sdev_printk(KERN_INFO, sdp, "%s\n", __func__);
2914        hp = sdp->host;
2915        if (hp) {
2916                sdbg_host = *(struct sdebug_host_info **)shost_priv(hp);
2917                if (sdbg_host) {
2918                        list_for_each_entry(devip,
2919                                            &sdbg_host->dev_info_list,
2920                                            dev_list) {
2921                                set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
2922                                ++k;
2923                        }
2924                }
2925        }
2926        if (SCSI_DEBUG_OPT_RESET_NOISE & scsi_debug_opts)
2927                sdev_printk(KERN_INFO, sdp,
2928                            "%s: %d device(s) found in host\n", __func__, k);
2929lie:
2930        return SUCCESS;
2931}
2932
2933static int scsi_debug_host_reset(struct scsi_cmnd * SCpnt)
2934{
2935        struct sdebug_host_info * sdbg_host;
2936        struct sdebug_dev_info *devip;
2937        int k = 0;
2938
2939        ++num_host_resets;
2940        if ((SCpnt->device) && (SCSI_DEBUG_OPT_ALL_NOISE & scsi_debug_opts))
2941                sdev_printk(KERN_INFO, SCpnt->device, "%s\n", __func__);
2942        spin_lock(&sdebug_host_list_lock);
2943        list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
2944                list_for_each_entry(devip, &sdbg_host->dev_info_list,
2945                                    dev_list) {
2946                        set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
2947                        ++k;
2948                }
2949        }
2950        spin_unlock(&sdebug_host_list_lock);
2951        stop_all_queued();
2952        if (SCSI_DEBUG_OPT_RESET_NOISE & scsi_debug_opts)
2953                sdev_printk(KERN_INFO, SCpnt->device,
2954                            "%s: %d device(s) found\n", __func__, k);
2955        return SUCCESS;
2956}
2957
2958static void __init sdebug_build_parts(unsigned char *ramp,
2959                                      unsigned long store_size)
2960{
2961        struct partition * pp;
2962        int starts[SDEBUG_MAX_PARTS + 2];
2963        int sectors_per_part, num_sectors, k;
2964        int heads_by_sects, start_sec, end_sec;
2965
2966        /* assume partition table already zeroed */
2967        if ((scsi_debug_num_parts < 1) || (store_size < 1048576))
2968                return;
2969        if (scsi_debug_num_parts > SDEBUG_MAX_PARTS) {
2970                scsi_debug_num_parts = SDEBUG_MAX_PARTS;
2971                pr_warn("%s: reducing partitions to %d\n", __func__,
2972                        SDEBUG_MAX_PARTS);
2973        }
2974        num_sectors = (int)sdebug_store_sectors;
2975        sectors_per_part = (num_sectors - sdebug_sectors_per)
2976                           / scsi_debug_num_parts;
2977        heads_by_sects = sdebug_heads * sdebug_sectors_per;
2978        starts[0] = sdebug_sectors_per;
2979        for (k = 1; k < scsi_debug_num_parts; ++k)
2980                starts[k] = ((k * sectors_per_part) / heads_by_sects)
2981                            * heads_by_sects;
2982        starts[scsi_debug_num_parts] = num_sectors;
2983        starts[scsi_debug_num_parts + 1] = 0;
2984
2985        ramp[510] = 0x55;       /* magic partition markings */
2986        ramp[511] = 0xAA;
2987        pp = (struct partition *)(ramp + 0x1be);
2988        for (k = 0; starts[k + 1]; ++k, ++pp) {
2989                start_sec = starts[k];
2990                end_sec = starts[k + 1] - 1;
2991                pp->boot_ind = 0;
2992
2993                pp->cyl = start_sec / heads_by_sects;
2994                pp->head = (start_sec - (pp->cyl * heads_by_sects))
2995                           / sdebug_sectors_per;
2996                pp->sector = (start_sec % sdebug_sectors_per) + 1;
2997
2998                pp->end_cyl = end_sec / heads_by_sects;
2999                pp->end_head = (end_sec - (pp->end_cyl * heads_by_sects))
3000                               / sdebug_sectors_per;
3001                pp->end_sector = (end_sec % sdebug_sectors_per) + 1;
3002
3003                pp->start_sect = cpu_to_le32(start_sec);
3004                pp->nr_sects = cpu_to_le32(end_sec - start_sec + 1);
3005                pp->sys_ind = 0x83;     /* plain Linux partition */
3006        }
3007}
3008
3009static int
3010schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip,
3011              int scsi_result, int delta_jiff)
3012{
3013        unsigned long iflags;
3014        int k, num_in_q, qdepth, inject;
3015        struct sdebug_queued_cmd *sqcp = NULL;
3016        struct scsi_device *sdp = cmnd->device;
3017
3018        if (NULL == cmnd || NULL == devip) {
3019                pr_warn("%s: called with NULL cmnd or devip pointer\n",
3020                        __func__);
3021                /* no particularly good error to report back */
3022                return SCSI_MLQUEUE_HOST_BUSY;
3023        }
3024        if ((scsi_result) && (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
3025                sdev_printk(KERN_INFO, sdp, "%s: non-zero result=0x%x\n",
3026                            __func__, scsi_result);
3027        if (delta_jiff == 0)
3028                goto respond_in_thread;
3029
3030        /* schedule the response at a later time if resources permit */
3031        spin_lock_irqsave(&queued_arr_lock, iflags);
3032        num_in_q = atomic_read(&devip->num_in_q);
3033        qdepth = cmnd->device->queue_depth;
3034        inject = 0;
3035        if ((qdepth > 0) && (num_in_q >= qdepth)) {
3036                if (scsi_result) {
3037                        spin_unlock_irqrestore(&queued_arr_lock, iflags);
3038                        goto respond_in_thread;
3039                } else
3040                        scsi_result = device_qfull_result;
3041        } else if ((scsi_debug_every_nth != 0) &&
3042                   (SCSI_DEBUG_OPT_RARE_TSF & scsi_debug_opts) &&
3043                   (scsi_result == 0)) {
3044                if ((num_in_q == (qdepth - 1)) &&
3045                    (atomic_inc_return(&sdebug_a_tsf) >=
3046                     abs(scsi_debug_every_nth))) {
3047                        atomic_set(&sdebug_a_tsf, 0);
3048                        inject = 1;
3049                        scsi_result = device_qfull_result;
3050                }
3051        }
3052
3053        k = find_first_zero_bit(queued_in_use_bm, scsi_debug_max_queue);
3054        if (k >= scsi_debug_max_queue) {
3055                spin_unlock_irqrestore(&queued_arr_lock, iflags);
3056                if (scsi_result)
3057                        goto respond_in_thread;
3058                else if (SCSI_DEBUG_OPT_ALL_TSF & scsi_debug_opts)
3059                        scsi_result = device_qfull_result;
3060                if (SCSI_DEBUG_OPT_Q_NOISE & scsi_debug_opts)
3061                        sdev_printk(KERN_INFO, sdp,
3062                                    "%s: max_queue=%d exceeded, %s\n",
3063                                    __func__, scsi_debug_max_queue,
3064                                    (scsi_result ?  "status: TASK SET FULL" :
3065                                                    "report: host busy"));
3066                if (scsi_result)
3067                        goto respond_in_thread;
3068                else
3069                        return SCSI_MLQUEUE_HOST_BUSY;
3070        }
3071        __set_bit(k, queued_in_use_bm);
3072        atomic_inc(&devip->num_in_q);
3073        sqcp = &queued_arr[k];
3074        sqcp->a_cmnd = cmnd;
3075        cmnd->result = scsi_result;
3076        spin_unlock_irqrestore(&queued_arr_lock, iflags);
3077        if (delta_jiff > 0) {
3078                if (NULL == sqcp->cmnd_timerp) {
3079                        sqcp->cmnd_timerp = kmalloc(sizeof(struct timer_list),
3080                                                    GFP_ATOMIC);
3081                        if (NULL == sqcp->cmnd_timerp)
3082                                return SCSI_MLQUEUE_HOST_BUSY;
3083                        init_timer(sqcp->cmnd_timerp);
3084                }
3085                sqcp->cmnd_timerp->function = sdebug_q_cmd_complete;
3086                sqcp->cmnd_timerp->data = k;
3087                sqcp->cmnd_timerp->expires = get_jiffies_64() + delta_jiff;
3088                add_timer(sqcp->cmnd_timerp);
3089        } else if (scsi_debug_ndelay > 0) {
3090                ktime_t kt = ktime_set(0, scsi_debug_ndelay);
3091                struct sdebug_hrtimer *sd_hp = sqcp->sd_hrtp;
3092
3093                if (NULL == sd_hp) {
3094                        sd_hp = kmalloc(sizeof(*sd_hp), GFP_ATOMIC);
3095                        if (NULL == sd_hp)
3096                                return SCSI_MLQUEUE_HOST_BUSY;
3097                        sqcp->sd_hrtp = sd_hp;
3098                        hrtimer_init(&sd_hp->hrt, CLOCK_MONOTONIC,
3099                                     HRTIMER_MODE_REL);
3100                        sd_hp->hrt.function = sdebug_q_cmd_hrt_complete;
3101                        sd_hp->qa_indx = k;
3102                }
3103                hrtimer_start(&sd_hp->hrt, kt, HRTIMER_MODE_REL);
3104        } else {        /* delay < 0 */
3105                if (NULL == sqcp->tletp) {
3106                        sqcp->tletp = kmalloc(sizeof(*sqcp->tletp),
3107                                              GFP_ATOMIC);
3108                        if (NULL == sqcp->tletp)
3109                                return SCSI_MLQUEUE_HOST_BUSY;
3110                        tasklet_init(sqcp->tletp,
3111                                     sdebug_q_cmd_complete, k);
3112                }
3113                if (-1 == delta_jiff)
3114                        tasklet_hi_schedule(sqcp->tletp);
3115                else
3116                        tasklet_schedule(sqcp->tletp);
3117        }
3118        if ((SCSI_DEBUG_OPT_Q_NOISE & scsi_debug_opts) &&
3119            (scsi_result == device_qfull_result))
3120                sdev_printk(KERN_INFO, sdp,
3121                            "%s: num_in_q=%d +1, %s%s\n", __func__,
3122                            num_in_q, (inject ? "<inject> " : ""),
3123                            "status: TASK SET FULL");
3124        return 0;
3125
3126respond_in_thread:      /* call back to mid-layer using invocation thread */
3127        cmnd->result = scsi_result;
3128        cmnd->scsi_done(cmnd);
3129        return 0;
3130}
3131
3132/* Note: The following macros create attribute files in the
3133   /sys/module/scsi_debug/parameters directory. Unfortunately this
3134   driver is unaware of a change and cannot trigger auxiliary actions
3135   as it can when the corresponding attribute in the
3136   /sys/bus/pseudo/drivers/scsi_debug directory is changed.
3137 */
3138module_param_named(add_host, scsi_debug_add_host, int, S_IRUGO | S_IWUSR);
3139module_param_named(ato, scsi_debug_ato, int, S_IRUGO);
3140module_param_named(clustering, scsi_debug_clustering, bool, S_IRUGO | S_IWUSR);
3141module_param_named(delay, scsi_debug_delay, int, S_IRUGO | S_IWUSR);
3142module_param_named(dev_size_mb, scsi_debug_dev_size_mb, int, S_IRUGO);
3143module_param_named(dif, scsi_debug_dif, int, S_IRUGO);
3144module_param_named(dix, scsi_debug_dix, int, S_IRUGO);
3145module_param_named(dsense, scsi_debug_dsense, int, S_IRUGO | S_IWUSR);
3146module_param_named(every_nth, scsi_debug_every_nth, int, S_IRUGO | S_IWUSR);
3147module_param_named(fake_rw, scsi_debug_fake_rw, int, S_IRUGO | S_IWUSR);
3148module_param_named(guard, scsi_debug_guard, uint, S_IRUGO);
3149module_param_named(host_lock, scsi_debug_host_lock, bool, S_IRUGO | S_IWUSR);
3150module_param_named(lbpu, scsi_debug_lbpu, int, S_IRUGO);
3151module_param_named(lbpws, scsi_debug_lbpws, int, S_IRUGO);
3152module_param_named(lbpws10, scsi_debug_lbpws10, int, S_IRUGO);
3153module_param_named(lbprz, scsi_debug_lbprz, int, S_IRUGO);
3154module_param_named(lowest_aligned, scsi_debug_lowest_aligned, int, S_IRUGO);
3155module_param_named(max_luns, scsi_debug_max_luns, int, S_IRUGO | S_IWUSR);
3156module_param_named(max_queue, scsi_debug_max_queue, int, S_IRUGO | S_IWUSR);
3157module_param_named(ndelay, scsi_debug_ndelay, int, S_IRUGO | S_IWUSR);
3158module_param_named(no_lun_0, scsi_debug_no_lun_0, int, S_IRUGO | S_IWUSR);
3159module_param_named(no_uld, scsi_debug_no_uld, int, S_IRUGO);
3160module_param_named(num_parts, scsi_debug_num_parts, int, S_IRUGO);
3161module_param_named(num_tgts, scsi_debug_num_tgts, int, S_IRUGO | S_IWUSR);
3162module_param_named(opt_blks, scsi_debug_opt_blks, int, S_IRUGO);
3163module_param_named(opts, scsi_debug_opts, int, S_IRUGO | S_IWUSR);
3164module_param_named(physblk_exp, scsi_debug_physblk_exp, int, S_IRUGO);
3165module_param_named(ptype, scsi_debug_ptype, int, S_IRUGO | S_IWUSR);
3166module_param_named(removable, scsi_debug_removable, bool, S_IRUGO | S_IWUSR);
3167module_param_named(scsi_level, scsi_debug_scsi_level, int, S_IRUGO);
3168module_param_named(sector_size, scsi_debug_sector_size, int, S_IRUGO);
3169module_param_named(unmap_alignment, scsi_debug_unmap_alignment, int, S_IRUGO);
3170module_param_named(unmap_granularity, scsi_debug_unmap_granularity, int, S_IRUGO);
3171module_param_named(unmap_max_blocks, scsi_debug_unmap_max_blocks, int, S_IRUGO);
3172module_param_named(unmap_max_desc, scsi_debug_unmap_max_desc, int, S_IRUGO);
3173module_param_named(virtual_gb, scsi_debug_virtual_gb, int, S_IRUGO | S_IWUSR);
3174module_param_named(vpd_use_hostno, scsi_debug_vpd_use_hostno, int,
3175                   S_IRUGO | S_IWUSR);
3176module_param_named(write_same_length, scsi_debug_write_same_length, int,
3177                   S_IRUGO | S_IWUSR);
3178
3179MODULE_AUTHOR("Eric Youngdale + Douglas Gilbert");
3180MODULE_DESCRIPTION("SCSI debug adapter driver");
3181MODULE_LICENSE("GPL");
3182MODULE_VERSION(SCSI_DEBUG_VERSION);
3183
3184MODULE_PARM_DESC(add_host, "0..127 hosts allowed(def=1)");
3185MODULE_PARM_DESC(ato, "application tag ownership: 0=disk 1=host (def=1)");
3186MODULE_PARM_DESC(clustering, "when set enables larger transfers (def=0)");
3187MODULE_PARM_DESC(delay, "response delay (def=1 jiffy); 0:imm, -1,-2:tiny");
3188MODULE_PARM_DESC(dev_size_mb, "size in MB of ram shared by devs(def=8)");
3189MODULE_PARM_DESC(dif, "data integrity field type: 0-3 (def=0)");
3190MODULE_PARM_DESC(dix, "data integrity extensions mask (def=0)");
3191MODULE_PARM_DESC(dsense, "use descriptor sense format(def=0 -> fixed)");
3192MODULE_PARM_DESC(every_nth, "timeout every nth command(def=0)");
3193MODULE_PARM_DESC(fake_rw, "fake reads/writes instead of copying (def=0)");
3194MODULE_PARM_DESC(guard, "protection checksum: 0=crc, 1=ip (def=0)");
3195MODULE_PARM_DESC(host_lock, "use host_lock around all commands (def=0)");
3196MODULE_PARM_DESC(lbpu, "enable LBP, support UNMAP command (def=0)");
3197MODULE_PARM_DESC(lbpws, "enable LBP, support WRITE SAME(16) with UNMAP bit (def=0)");
3198MODULE_PARM_DESC(lbpws10, "enable LBP, support WRITE SAME(10) with UNMAP bit (def=0)");
3199MODULE_PARM_DESC(lbprz, "unmapped blocks return 0 on read (def=1)");
3200MODULE_PARM_DESC(lowest_aligned, "lowest aligned lba (def=0)");
3201MODULE_PARM_DESC(max_luns, "number of LUNs per target to simulate(def=1)");
3202MODULE_PARM_DESC(max_queue, "max number of queued commands (1 to max(def))");
3203MODULE_PARM_DESC(ndelay, "response delay in nanoseconds (def=0 -> ignore)");
3204MODULE_PARM_DESC(no_lun_0, "no LU number 0 (def=0 -> have lun 0)");
3205MODULE_PARM_DESC(no_uld, "stop ULD (e.g. sd driver) attaching (def=0))");
3206MODULE_PARM_DESC(num_parts, "number of partitions(def=0)");
3207MODULE_PARM_DESC(num_tgts, "number of targets per host to simulate(def=1)");
3208MODULE_PARM_DESC(opt_blks, "optimal transfer length in block (def=64)");
3209MODULE_PARM_DESC(opts, "1->noise, 2->medium_err, 4->timeout, 8->recovered_err... (def=0)");
3210MODULE_PARM_DESC(physblk_exp, "physical block exponent (def=0)");
3211MODULE_PARM_DESC(ptype, "SCSI peripheral type(def=0[disk])");
3212MODULE_PARM_DESC(removable, "claim to have removable media (def=0)");
3213MODULE_PARM_DESC(scsi_level, "SCSI level to simulate(def=6[SPC-4])");
3214MODULE_PARM_DESC(sector_size, "logical block size in bytes (def=512)");
3215MODULE_PARM_DESC(unmap_alignment, "lowest aligned thin provisioning lba (def=0)");
3216MODULE_PARM_DESC(unmap_granularity, "thin provisioning granularity in blocks (def=1)");
3217MODULE_PARM_DESC(unmap_max_blocks, "max # of blocks can be unmapped in one cmd (def=0xffffffff)");
3218MODULE_PARM_DESC(unmap_max_desc, "max # of ranges that can be unmapped in one cmd (def=256)");
3219MODULE_PARM_DESC(virtual_gb, "virtual gigabyte size (def=0 -> use dev_size_mb)");
3220MODULE_PARM_DESC(vpd_use_hostno, "0 -> dev ids ignore hostno (def=1 -> unique dev ids)");
3221MODULE_PARM_DESC(write_same_length, "Maximum blocks per WRITE SAME cmd (def=0xffff)");
3222
3223static char sdebug_info[256];
3224
3225static const char * scsi_debug_info(struct Scsi_Host * shp)
3226{
3227        sprintf(sdebug_info, "scsi_debug, version %s [%s], "
3228                "dev_size_mb=%d, opts=0x%x", SCSI_DEBUG_VERSION,
3229                scsi_debug_version_date, scsi_debug_dev_size_mb,
3230                scsi_debug_opts);
3231        return sdebug_info;
3232}
3233
3234/* 'echo <val> > /proc/scsi/scsi_debug/<host_id>' writes to opts */
3235static int scsi_debug_write_info(struct Scsi_Host *host, char *buffer, int length)
3236{
3237        char arr[16];
3238        int opts;
3239        int minLen = length > 15 ? 15 : length;
3240
3241        if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
3242                return -EACCES;
3243        memcpy(arr, buffer, minLen);
3244        arr[minLen] = '\0';
3245        if (1 != sscanf(arr, "%d", &opts))
3246                return -EINVAL;
3247        scsi_debug_opts = opts;
3248        if (scsi_debug_every_nth != 0)
3249                atomic_set(&sdebug_cmnd_count, 0);
3250        return length;
3251}
3252
3253/* Output seen with 'cat /proc/scsi/scsi_debug/<host_id>'. It will be the
3254 * same for each scsi_debug host (if more than one). Some of the counters
3255 * output are not atomics so might be inaccurate in a busy system. */
3256static int scsi_debug_show_info(struct seq_file *m, struct Scsi_Host *host)
3257{
3258        int f, l;
3259        char b[32];
3260
3261        if (scsi_debug_every_nth > 0)
3262                snprintf(b, sizeof(b), " (curr:%d)",
3263                         ((SCSI_DEBUG_OPT_RARE_TSF & scsi_debug_opts) ?
3264                                atomic_read(&sdebug_a_tsf) :
3265                                atomic_read(&sdebug_cmnd_count)));
3266        else
3267                b[0] = '\0';
3268
3269        seq_printf(m, "scsi_debug adapter driver, version %s [%s]\n"
3270                "num_tgts=%d, shared (ram) size=%d MB, opts=0x%x, "
3271                "every_nth=%d%s\n"
3272                "delay=%d, ndelay=%d, max_luns=%d, q_completions=%d\n"
3273                "sector_size=%d bytes, cylinders=%d, heads=%d, sectors=%d\n"
3274                "command aborts=%d; RESETs: device=%d, target=%d, bus=%d, "
3275                "host=%d\ndix_reads=%d dix_writes=%d dif_errors=%d "
3276                "usec_in_jiffy=%lu\n",
3277                SCSI_DEBUG_VERSION, scsi_debug_version_date,
3278                scsi_debug_num_tgts, scsi_debug_dev_size_mb, scsi_debug_opts,
3279                scsi_debug_every_nth, b, scsi_debug_delay, scsi_debug_ndelay,
3280                scsi_debug_max_luns, atomic_read(&sdebug_completions),
3281                scsi_debug_sector_size, sdebug_cylinders_per, sdebug_heads,
3282                sdebug_sectors_per, num_aborts, num_dev_resets,
3283                num_target_resets, num_bus_resets, num_host_resets,
3284                dix_reads, dix_writes, dif_errors, TICK_NSEC / 1000);
3285
3286        f = find_first_bit(queued_in_use_bm, scsi_debug_max_queue);
3287        if (f != scsi_debug_max_queue) {
3288                l = find_last_bit(queued_in_use_bm, scsi_debug_max_queue);
3289                seq_printf(m, "   %s BUSY: first,last bits set: %d,%d\n",
3290                           "queued_in_use_bm", f, l);
3291        }
3292        return 0;
3293}
3294
3295static ssize_t delay_show(struct device_driver *ddp, char *buf)
3296{
3297        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_delay);
3298}
3299/* Returns -EBUSY if delay is being changed and commands are queued */
3300static ssize_t delay_store(struct device_driver *ddp, const char *buf,
3301                           size_t count)
3302{
3303        int delay, res;
3304
3305        if ((count > 0) && (1 == sscanf(buf, "%d", &delay))) {
3306                res = count;
3307                if (scsi_debug_delay != delay) {
3308                        unsigned long iflags;
3309                        int k;
3310
3311                        spin_lock_irqsave(&queued_arr_lock, iflags);
3312                        k = find_first_bit(queued_in_use_bm,
3313                                           scsi_debug_max_queue);
3314                        if (k != scsi_debug_max_queue)
3315                                res = -EBUSY;   /* have queued commands */
3316                        else {
3317                                scsi_debug_delay = delay;
3318                                scsi_debug_ndelay = 0;
3319                        }
3320                        spin_unlock_irqrestore(&queued_arr_lock, iflags);
3321                }
3322                return res;
3323        }
3324        return -EINVAL;
3325}
3326static DRIVER_ATTR_RW(delay);
3327
3328static ssize_t ndelay_show(struct device_driver *ddp, char *buf)
3329{
3330        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_ndelay);
3331}
3332/* Returns -EBUSY if ndelay is being changed and commands are queued */
3333/* If > 0 and accepted then scsi_debug_delay is set to DELAY_OVERRIDDEN */
3334static ssize_t ndelay_store(struct device_driver *ddp, const char *buf,
3335                           size_t count)
3336{
3337        unsigned long iflags;
3338        int ndelay, res, k;
3339
3340        if ((count > 0) && (1 == sscanf(buf, "%d", &ndelay)) &&
3341            (ndelay >= 0) && (ndelay < 1000000000)) {
3342                res = count;
3343                if (scsi_debug_ndelay != ndelay) {
3344                        spin_lock_irqsave(&queued_arr_lock, iflags);
3345                        k = find_first_bit(queued_in_use_bm,
3346                                           scsi_debug_max_queue);
3347                        if (k != scsi_debug_max_queue)
3348                                res = -EBUSY;   /* have queued commands */
3349                        else {
3350                                scsi_debug_ndelay = ndelay;
3351                                scsi_debug_delay = ndelay ? DELAY_OVERRIDDEN
3352                                                          : DEF_DELAY;
3353                        }
3354                        spin_unlock_irqrestore(&queued_arr_lock, iflags);
3355                }
3356                return res;
3357        }
3358        return -EINVAL;
3359}
3360static DRIVER_ATTR_RW(ndelay);
3361
3362static ssize_t opts_show(struct device_driver *ddp, char *buf)
3363{
3364        return scnprintf(buf, PAGE_SIZE, "0x%x\n", scsi_debug_opts);
3365}
3366
3367static ssize_t opts_store(struct device_driver *ddp, const char *buf,
3368                          size_t count)
3369{
3370        int opts;
3371        char work[20];
3372
3373        if (1 == sscanf(buf, "%10s", work)) {
3374                if (0 == strncasecmp(work,"0x", 2)) {
3375                        if (1 == sscanf(&work[2], "%x", &opts))
3376                                goto opts_done;
3377                } else {
3378                        if (1 == sscanf(work, "%d", &opts))
3379                                goto opts_done;
3380                }
3381        }
3382        return -EINVAL;
3383opts_done:
3384        scsi_debug_opts = opts;
3385        atomic_set(&sdebug_cmnd_count, 0);
3386        atomic_set(&sdebug_a_tsf, 0);
3387        return count;
3388}
3389static DRIVER_ATTR_RW(opts);
3390
3391static ssize_t ptype_show(struct device_driver *ddp, char *buf)
3392{
3393        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_ptype);
3394}
3395static ssize_t ptype_store(struct device_driver *ddp, const char *buf,
3396                           size_t count)
3397{
3398        int n;
3399
3400        if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
3401                scsi_debug_ptype = n;
3402                return count;
3403        }
3404        return -EINVAL;
3405}
3406static DRIVER_ATTR_RW(ptype);
3407
3408static ssize_t dsense_show(struct device_driver *ddp, char *buf)
3409{
3410        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dsense);
3411}
3412static ssize_t dsense_store(struct device_driver *ddp, const char *buf,
3413                            size_t count)
3414{
3415        int n;
3416
3417        if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
3418                scsi_debug_dsense = n;
3419                return count;
3420        }
3421        return -EINVAL;
3422}
3423static DRIVER_ATTR_RW(dsense);
3424
3425static ssize_t fake_rw_show(struct device_driver *ddp, char *buf)
3426{
3427        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_fake_rw);
3428}
3429static ssize_t fake_rw_store(struct device_driver *ddp, const char *buf,
3430                             size_t count)
3431{
3432        int n;
3433
3434        if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
3435                n = (n > 0);
3436                scsi_debug_fake_rw = (scsi_debug_fake_rw > 0);
3437                if (scsi_debug_fake_rw != n) {
3438                        if ((0 == n) && (NULL == fake_storep)) {
3439                                unsigned long sz =
3440                                        (unsigned long)scsi_debug_dev_size_mb *
3441                                        1048576;
3442
3443                                fake_storep = vmalloc(sz);
3444                                if (NULL == fake_storep) {
3445                                        pr_err("%s: out of memory, 9\n",
3446                                               __func__);
3447                                        return -ENOMEM;
3448                                }
3449                                memset(fake_storep, 0, sz);
3450                        }
3451                        scsi_debug_fake_rw = n;
3452                }
3453                return count;
3454        }
3455        return -EINVAL;
3456}
3457static DRIVER_ATTR_RW(fake_rw);
3458
3459static ssize_t no_lun_0_show(struct device_driver *ddp, char *buf)
3460{
3461        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_no_lun_0);
3462}
3463static ssize_t no_lun_0_store(struct device_driver *ddp, const char *buf,
3464                              size_t count)
3465{
3466        int n;
3467
3468        if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
3469                scsi_debug_no_lun_0 = n;
3470                return count;
3471        }
3472        return -EINVAL;
3473}
3474static DRIVER_ATTR_RW(no_lun_0);
3475
3476static ssize_t num_tgts_show(struct device_driver *ddp, char *buf)
3477{
3478        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_num_tgts);
3479}
3480static ssize_t num_tgts_store(struct device_driver *ddp, const char *buf,
3481                              size_t count)
3482{
3483        int n;
3484
3485        if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
3486                scsi_debug_num_tgts = n;
3487                sdebug_max_tgts_luns();
3488                return count;
3489        }
3490        return -EINVAL;
3491}
3492static DRIVER_ATTR_RW(num_tgts);
3493
3494static ssize_t dev_size_mb_show(struct device_driver *ddp, char *buf)
3495{
3496        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dev_size_mb);
3497}
3498static DRIVER_ATTR_RO(dev_size_mb);
3499
3500static ssize_t num_parts_show(struct device_driver *ddp, char *buf)
3501{
3502        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_num_parts);
3503}
3504static DRIVER_ATTR_RO(num_parts);
3505
3506static ssize_t every_nth_show(struct device_driver *ddp, char *buf)
3507{
3508        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_every_nth);
3509}
3510static ssize_t every_nth_store(struct device_driver *ddp, const char *buf,
3511                               size_t count)
3512{
3513        int nth;
3514
3515        if ((count > 0) && (1 == sscanf(buf, "%d", &nth))) {
3516                scsi_debug_every_nth = nth;
3517                atomic_set(&sdebug_cmnd_count, 0);
3518                return count;
3519        }
3520        return -EINVAL;
3521}
3522static DRIVER_ATTR_RW(every_nth);
3523
3524static ssize_t max_luns_show(struct device_driver *ddp, char *buf)
3525{
3526        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_max_luns);
3527}
3528static ssize_t max_luns_store(struct device_driver *ddp, const char *buf,
3529                              size_t count)
3530{
3531        int n;
3532
3533        if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
3534                scsi_debug_max_luns = n;
3535                sdebug_max_tgts_luns();
3536                return count;
3537        }
3538        return -EINVAL;
3539}
3540static DRIVER_ATTR_RW(max_luns);
3541
3542static ssize_t max_queue_show(struct device_driver *ddp, char *buf)
3543{
3544        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_max_queue);
3545}
3546/* N.B. max_queue can be changed while there are queued commands. In flight
3547 * commands beyond the new max_queue will be completed. */
3548static ssize_t max_queue_store(struct device_driver *ddp, const char *buf,
3549                               size_t count)
3550{
3551        unsigned long iflags;
3552        int n, k;
3553
3554        if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n > 0) &&
3555            (n <= SCSI_DEBUG_CANQUEUE)) {
3556                spin_lock_irqsave(&queued_arr_lock, iflags);
3557                k = find_last_bit(queued_in_use_bm, SCSI_DEBUG_CANQUEUE);
3558                scsi_debug_max_queue = n;
3559                if (SCSI_DEBUG_CANQUEUE == k)
3560                        atomic_set(&retired_max_queue, 0);
3561                else if (k >= n)
3562                        atomic_set(&retired_max_queue, k + 1);
3563                else
3564                        atomic_set(&retired_max_queue, 0);
3565                spin_unlock_irqrestore(&queued_arr_lock, iflags);
3566                return count;
3567        }
3568        return -EINVAL;
3569}
3570static DRIVER_ATTR_RW(max_queue);
3571
3572static ssize_t no_uld_show(struct device_driver *ddp, char *buf)
3573{
3574        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_no_uld);
3575}
3576static DRIVER_ATTR_RO(no_uld);
3577
3578static ssize_t scsi_level_show(struct device_driver *ddp, char *buf)
3579{
3580        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_scsi_level);
3581}
3582static DRIVER_ATTR_RO(scsi_level);
3583
3584static ssize_t virtual_gb_show(struct device_driver *ddp, char *buf)
3585{
3586        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_virtual_gb);
3587}
3588static ssize_t virtual_gb_store(struct device_driver *ddp, const char *buf,
3589                                size_t count)
3590{
3591        int n;
3592
3593        if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
3594                scsi_debug_virtual_gb = n;
3595
3596                sdebug_capacity = get_sdebug_capacity();
3597
3598                return count;
3599        }
3600        return -EINVAL;
3601}
3602static DRIVER_ATTR_RW(virtual_gb);
3603
3604static ssize_t add_host_show(struct device_driver *ddp, char *buf)
3605{
3606        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_add_host);
3607}
3608
3609static ssize_t add_host_store(struct device_driver *ddp, const char *buf,
3610                              size_t count)
3611{
3612        int delta_hosts;
3613
3614        if (sscanf(buf, "%d", &delta_hosts) != 1)
3615                return -EINVAL;
3616        if (delta_hosts > 0) {
3617                do {
3618                        sdebug_add_adapter();
3619                } while (--delta_hosts);
3620        } else if (delta_hosts < 0) {
3621                do {
3622                        sdebug_remove_adapter();
3623                } while (++delta_hosts);
3624        }
3625        return count;
3626}
3627static DRIVER_ATTR_RW(add_host);
3628
3629static ssize_t vpd_use_hostno_show(struct device_driver *ddp, char *buf)
3630{
3631        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_vpd_use_hostno);
3632}
3633static ssize_t vpd_use_hostno_store(struct device_driver *ddp, const char *buf,
3634                                    size_t count)
3635{
3636        int n;
3637
3638        if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
3639                scsi_debug_vpd_use_hostno = n;
3640                return count;
3641        }
3642        return -EINVAL;
3643}
3644static DRIVER_ATTR_RW(vpd_use_hostno);
3645
3646static ssize_t sector_size_show(struct device_driver *ddp, char *buf)
3647{
3648        return scnprintf(buf, PAGE_SIZE, "%u\n", scsi_debug_sector_size);
3649}
3650static DRIVER_ATTR_RO(sector_size);
3651
3652static ssize_t dix_show(struct device_driver *ddp, char *buf)
3653{
3654        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dix);
3655}
3656static DRIVER_ATTR_RO(dix);
3657
3658static ssize_t dif_show(struct device_driver *ddp, char *buf)
3659{
3660        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dif);
3661}
3662static DRIVER_ATTR_RO(dif);
3663
3664static ssize_t guard_show(struct device_driver *ddp, char *buf)
3665{
3666        return scnprintf(buf, PAGE_SIZE, "%u\n", scsi_debug_guard);
3667}
3668static DRIVER_ATTR_RO(guard);
3669
3670static ssize_t ato_show(struct device_driver *ddp, char *buf)
3671{
3672        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_ato);
3673}
3674static DRIVER_ATTR_RO(ato);
3675
3676static ssize_t map_show(struct device_driver *ddp, char *buf)
3677{
3678        ssize_t count;
3679
3680        if (!scsi_debug_lbp())
3681                return scnprintf(buf, PAGE_SIZE, "0-%u\n",
3682                                 sdebug_store_sectors);
3683
3684        count = bitmap_scnlistprintf(buf, PAGE_SIZE, map_storep, map_size);
3685
3686        buf[count++] = '\n';
3687        buf[count++] = 0;
3688
3689        return count;
3690}
3691static DRIVER_ATTR_RO(map);
3692
3693static ssize_t removable_show(struct device_driver *ddp, char *buf)
3694{
3695        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_removable ? 1 : 0);
3696}
3697static ssize_t removable_store(struct device_driver *ddp, const char *buf,
3698                               size_t count)
3699{
3700        int n;
3701
3702        if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
3703                scsi_debug_removable = (n > 0);
3704                return count;
3705        }
3706        return -EINVAL;
3707}
3708static DRIVER_ATTR_RW(removable);
3709
3710static ssize_t host_lock_show(struct device_driver *ddp, char *buf)
3711{
3712        return scnprintf(buf, PAGE_SIZE, "%d\n", !!scsi_debug_host_lock);
3713}
3714/* Returns -EBUSY if host_lock is being changed and commands are queued */
3715static ssize_t host_lock_store(struct device_driver *ddp, const char *buf,
3716                               size_t count)
3717{
3718        int n, res;
3719
3720        if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
3721                bool new_host_lock = (n > 0);
3722
3723                res = count;
3724                if (new_host_lock != scsi_debug_host_lock) {
3725                        unsigned long iflags;
3726                        int k;
3727
3728                        spin_lock_irqsave(&queued_arr_lock, iflags);
3729                        k = find_first_bit(queued_in_use_bm,
3730                                           scsi_debug_max_queue);
3731                        if (k != scsi_debug_max_queue)
3732                                res = -EBUSY;   /* have queued commands */
3733                        else
3734                                scsi_debug_host_lock = new_host_lock;
3735                        spin_unlock_irqrestore(&queued_arr_lock, iflags);
3736                }
3737                return res;
3738        }
3739        return -EINVAL;
3740}
3741static DRIVER_ATTR_RW(host_lock);
3742
3743
3744/* Note: The following array creates attribute files in the
3745   /sys/bus/pseudo/drivers/scsi_debug directory. The advantage of these
3746   files (over those found in the /sys/module/scsi_debug/parameters
3747   directory) is that auxiliary actions can be triggered when an attribute
3748   is changed. For example see: sdebug_add_host_store() above.
3749 */
3750
3751static struct attribute *sdebug_drv_attrs[] = {
3752        &driver_attr_delay.attr,
3753        &driver_attr_opts.attr,
3754        &driver_attr_ptype.attr,
3755        &driver_attr_dsense.attr,
3756        &driver_attr_fake_rw.attr,
3757        &driver_attr_no_lun_0.attr,
3758        &driver_attr_num_tgts.attr,
3759        &driver_attr_dev_size_mb.attr,
3760        &driver_attr_num_parts.attr,
3761        &driver_attr_every_nth.attr,
3762        &driver_attr_max_luns.attr,
3763        &driver_attr_max_queue.attr,
3764        &driver_attr_no_uld.attr,
3765        &driver_attr_scsi_level.attr,
3766        &driver_attr_virtual_gb.attr,
3767        &driver_attr_add_host.attr,
3768        &driver_attr_vpd_use_hostno.attr,
3769        &driver_attr_sector_size.attr,
3770        &driver_attr_dix.attr,
3771        &driver_attr_dif.attr,
3772        &driver_attr_guard.attr,
3773        &driver_attr_ato.attr,
3774        &driver_attr_map.attr,
3775        &driver_attr_removable.attr,
3776        &driver_attr_host_lock.attr,
3777        &driver_attr_ndelay.attr,
3778        NULL,
3779};
3780ATTRIBUTE_GROUPS(sdebug_drv);
3781
3782static struct device *pseudo_primary;
3783
3784static int __init scsi_debug_init(void)
3785{
3786        unsigned long sz;
3787        int host_to_add;
3788        int k;
3789        int ret;
3790
3791        atomic_set(&sdebug_cmnd_count, 0);
3792        atomic_set(&sdebug_completions, 0);
3793        atomic_set(&retired_max_queue, 0);
3794
3795        if (scsi_debug_ndelay >= 1000000000) {
3796                pr_warn("%s: ndelay must be less than 1 second, ignored\n",
3797                        __func__);
3798                scsi_debug_ndelay = 0;
3799        } else if (scsi_debug_ndelay > 0)
3800                scsi_debug_delay = DELAY_OVERRIDDEN;
3801
3802        switch (scsi_debug_sector_size) {
3803        case  512:
3804        case 1024:
3805        case 2048:
3806        case 4096:
3807                break;
3808        default:
3809                pr_err("%s: invalid sector_size %d\n", __func__,
3810                       scsi_debug_sector_size);
3811                return -EINVAL;
3812        }
3813
3814        switch (scsi_debug_dif) {
3815
3816        case SD_DIF_TYPE0_PROTECTION:
3817        case SD_DIF_TYPE1_PROTECTION:
3818        case SD_DIF_TYPE2_PROTECTION:
3819        case SD_DIF_TYPE3_PROTECTION:
3820                break;
3821
3822        default:
3823                pr_err("%s: dif must be 0, 1, 2 or 3\n", __func__);
3824                return -EINVAL;
3825        }
3826
3827        if (scsi_debug_guard > 1) {
3828                pr_err("%s: guard must be 0 or 1\n", __func__);
3829                return -EINVAL;
3830        }
3831
3832        if (scsi_debug_ato > 1) {
3833                pr_err("%s: ato must be 0 or 1\n", __func__);
3834                return -EINVAL;
3835        }
3836
3837        if (scsi_debug_physblk_exp > 15) {
3838                pr_err("%s: invalid physblk_exp %u\n", __func__,
3839                       scsi_debug_physblk_exp);
3840                return -EINVAL;
3841        }
3842
3843        if (scsi_debug_lowest_aligned > 0x3fff) {
3844                pr_err("%s: lowest_aligned too big: %u\n", __func__,
3845                       scsi_debug_lowest_aligned);
3846                return -EINVAL;
3847        }
3848
3849        if (scsi_debug_dev_size_mb < 1)
3850                scsi_debug_dev_size_mb = 1;  /* force minimum 1 MB ramdisk */
3851        sz = (unsigned long)scsi_debug_dev_size_mb * 1048576;
3852        sdebug_store_sectors = sz / scsi_debug_sector_size;
3853        sdebug_capacity = get_sdebug_capacity();
3854
3855        /* play around with geometry, don't waste too much on track 0 */
3856        sdebug_heads = 8;
3857        sdebug_sectors_per = 32;
3858        if (scsi_debug_dev_size_mb >= 16)
3859                sdebug_heads = 32;
3860        else if (scsi_debug_dev_size_mb >= 256)
3861                sdebug_heads = 64;
3862        sdebug_cylinders_per = (unsigned long)sdebug_capacity /
3863                               (sdebug_sectors_per * sdebug_heads);
3864        if (sdebug_cylinders_per >= 1024) {
3865                /* other LLDs do this; implies >= 1GB ram disk ... */
3866                sdebug_heads = 255;
3867                sdebug_sectors_per = 63;
3868                sdebug_cylinders_per = (unsigned long)sdebug_capacity /
3869                               (sdebug_sectors_per * sdebug_heads);
3870        }
3871
3872        if (0 == scsi_debug_fake_rw) {
3873                fake_storep = vmalloc(sz);
3874                if (NULL == fake_storep) {
3875                        pr_err("%s: out of memory, 1\n", __func__);
3876                        return -ENOMEM;
3877                }
3878                memset(fake_storep, 0, sz);
3879                if (scsi_debug_num_parts > 0)
3880                        sdebug_build_parts(fake_storep, sz);
3881        }
3882
3883        if (scsi_debug_dix) {
3884                int dif_size;
3885
3886                dif_size = sdebug_store_sectors * sizeof(struct sd_dif_tuple);
3887                dif_storep = vmalloc(dif_size);
3888
3889                pr_err("%s: dif_storep %u bytes @ %p\n", __func__, dif_size,
3890                        dif_storep);
3891
3892                if (dif_storep == NULL) {
3893                        pr_err("%s: out of mem. (DIX)\n", __func__);
3894                        ret = -ENOMEM;
3895                        goto free_vm;
3896                }
3897
3898                memset(dif_storep, 0xff, dif_size);
3899        }
3900
3901        /* Logical Block Provisioning */
3902        if (scsi_debug_lbp()) {
3903                scsi_debug_unmap_max_blocks =
3904                        clamp(scsi_debug_unmap_max_blocks, 0U, 0xffffffffU);
3905
3906                scsi_debug_unmap_max_desc =
3907                        clamp(scsi_debug_unmap_max_desc, 0U, 256U);
3908
3909                scsi_debug_unmap_granularity =
3910                        clamp(scsi_debug_unmap_granularity, 1U, 0xffffffffU);
3911
3912                if (scsi_debug_unmap_alignment &&
3913                    scsi_debug_unmap_granularity <=
3914                    scsi_debug_unmap_alignment) {
3915                        pr_err("%s: ERR: unmap_granularity <= unmap_alignment\n",
3916                               __func__);
3917                        return -EINVAL;
3918                }
3919
3920                map_size = lba_to_map_index(sdebug_store_sectors - 1) + 1;
3921                map_storep = vmalloc(BITS_TO_LONGS(map_size) * sizeof(long));
3922
3923                pr_info("%s: %lu provisioning blocks\n", __func__, map_size);
3924
3925                if (map_storep == NULL) {
3926                        pr_err("%s: out of mem. (MAP)\n", __func__);
3927                        ret = -ENOMEM;
3928                        goto free_vm;
3929                }
3930
3931                bitmap_zero(map_storep, map_size);
3932
3933                /* Map first 1KB for partition table */
3934                if (scsi_debug_num_parts)
3935                        map_region(0, 2);
3936        }
3937
3938        pseudo_primary = root_device_register("pseudo_0");
3939        if (IS_ERR(pseudo_primary)) {
3940                pr_warn("%s: root_device_register() error\n", __func__);
3941                ret = PTR_ERR(pseudo_primary);
3942                goto free_vm;
3943        }
3944        ret = bus_register(&pseudo_lld_bus);
3945        if (ret < 0) {
3946                pr_warn("%s: bus_register error: %d\n", __func__, ret);
3947                goto dev_unreg;
3948        }
3949        ret = driver_register(&sdebug_driverfs_driver);
3950        if (ret < 0) {
3951                pr_warn("%s: driver_register error: %d\n", __func__, ret);
3952                goto bus_unreg;
3953        }
3954
3955        host_to_add = scsi_debug_add_host;
3956        scsi_debug_add_host = 0;
3957
3958        for (k = 0; k < host_to_add; k++) {
3959                if (sdebug_add_adapter()) {
3960                        pr_err("%s: sdebug_add_adapter failed k=%d\n",
3961                                __func__, k);
3962                        break;
3963                }
3964        }
3965
3966        if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) {
3967                pr_info("%s: built %d host(s)\n", __func__,
3968                        scsi_debug_add_host);
3969        }
3970        return 0;
3971
3972bus_unreg:
3973        bus_unregister(&pseudo_lld_bus);
3974dev_unreg:
3975        root_device_unregister(pseudo_primary);
3976free_vm:
3977        if (map_storep)
3978                vfree(map_storep);
3979        if (dif_storep)
3980                vfree(dif_storep);
3981        vfree(fake_storep);
3982
3983        return ret;
3984}
3985
3986static void __exit scsi_debug_exit(void)
3987{
3988        int k = scsi_debug_add_host;
3989
3990        stop_all_queued();
3991        free_all_queued();
3992        for (; k; k--)
3993                sdebug_remove_adapter();
3994        driver_unregister(&sdebug_driverfs_driver);
3995        bus_unregister(&pseudo_lld_bus);
3996        root_device_unregister(pseudo_primary);
3997
3998        if (dif_storep)
3999                vfree(dif_storep);
4000
4001        vfree(fake_storep);
4002}
4003
4004device_initcall(scsi_debug_init);
4005module_exit(scsi_debug_exit);
4006
4007static void sdebug_release_adapter(struct device * dev)
4008{
4009        struct sdebug_host_info *sdbg_host;
4010
4011        sdbg_host = to_sdebug_host(dev);
4012        kfree(sdbg_host);
4013}
4014
4015static int sdebug_add_adapter(void)
4016{
4017        int k, devs_per_host;
4018        int error = 0;
4019        struct sdebug_host_info *sdbg_host;
4020        struct sdebug_dev_info *sdbg_devinfo, *tmp;
4021
4022        sdbg_host = kzalloc(sizeof(*sdbg_host),GFP_KERNEL);
4023        if (NULL == sdbg_host) {
4024                printk(KERN_ERR "%s: out of memory at line %d\n",
4025                       __func__, __LINE__);
4026                return -ENOMEM;
4027        }
4028
4029        INIT_LIST_HEAD(&sdbg_host->dev_info_list);
4030
4031        devs_per_host = scsi_debug_num_tgts * scsi_debug_max_luns;
4032        for (k = 0; k < devs_per_host; k++) {
4033                sdbg_devinfo = sdebug_device_create(sdbg_host, GFP_KERNEL);
4034                if (!sdbg_devinfo) {
4035                        printk(KERN_ERR "%s: out of memory at line %d\n",
4036                               __func__, __LINE__);
4037                        error = -ENOMEM;
4038                        goto clean;
4039                }
4040        }
4041
4042        spin_lock(&sdebug_host_list_lock);
4043        list_add_tail(&sdbg_host->host_list, &sdebug_host_list);
4044        spin_unlock(&sdebug_host_list_lock);
4045
4046        sdbg_host->dev.bus = &pseudo_lld_bus;
4047        sdbg_host->dev.parent = pseudo_primary;
4048        sdbg_host->dev.release = &sdebug_release_adapter;
4049        dev_set_name(&sdbg_host->dev, "adapter%d", scsi_debug_add_host);
4050
4051        error = device_register(&sdbg_host->dev);
4052
4053        if (error)
4054                goto clean;
4055
4056        ++scsi_debug_add_host;
4057        return error;
4058
4059clean:
4060        list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
4061                                 dev_list) {
4062                list_del(&sdbg_devinfo->dev_list);
4063                kfree(sdbg_devinfo);
4064        }
4065
4066        kfree(sdbg_host);
4067        return error;
4068}
4069
4070static void sdebug_remove_adapter(void)
4071{
4072        struct sdebug_host_info * sdbg_host = NULL;
4073
4074        spin_lock(&sdebug_host_list_lock);
4075        if (!list_empty(&sdebug_host_list)) {
4076                sdbg_host = list_entry(sdebug_host_list.prev,
4077                                       struct sdebug_host_info, host_list);
4078                list_del(&sdbg_host->host_list);
4079        }
4080        spin_unlock(&sdebug_host_list_lock);
4081
4082        if (!sdbg_host)
4083                return;
4084
4085        device_unregister(&sdbg_host->dev);
4086        --scsi_debug_add_host;
4087}
4088
4089static int
4090scsi_debug_queuecommand(struct scsi_cmnd *SCpnt)
4091{
4092        unsigned char *cmd = SCpnt->cmnd;
4093        int len, k;
4094        unsigned int num;
4095        unsigned long long lba;
4096        u32 ei_lba;
4097        int errsts = 0;
4098        int target = SCpnt->device->id;
4099        struct sdebug_dev_info *devip = NULL;
4100        int inj_recovered = 0;
4101        int inj_transport = 0;
4102        int inj_dif = 0;
4103        int inj_dix = 0;
4104        int inj_short = 0;
4105        int delay_override = 0;
4106        int unmap = 0;
4107
4108        scsi_set_resid(SCpnt, 0);
4109        if ((SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) &&
4110            !(SCSI_DEBUG_OPT_NO_CDB_NOISE & scsi_debug_opts)) {
4111                char b[120];
4112                int n;
4113
4114                len = SCpnt->cmd_len;
4115                if (len > 32)
4116                        strcpy(b, "too long, over 32 bytes");
4117                else {
4118                        for (k = 0, n = 0; k < len; ++k)
4119                                n += scnprintf(b + n, sizeof(b) - n, "%02x ",
4120                                               (unsigned int)cmd[k]);
4121                }
4122                sdev_printk(KERN_INFO, SCpnt->device, "%s: cmd %s\n", my_name,
4123                            b);
4124        }
4125
4126        if ((SCpnt->device->lun >= scsi_debug_max_luns) &&
4127            (SCpnt->device->lun != SAM2_WLUN_REPORT_LUNS))
4128                return schedule_resp(SCpnt, NULL, DID_NO_CONNECT << 16, 0);
4129        devip = devInfoReg(SCpnt->device);
4130        if (NULL == devip)
4131                return schedule_resp(SCpnt, NULL, DID_NO_CONNECT << 16, 0);
4132
4133        if ((scsi_debug_every_nth != 0) &&
4134            (atomic_inc_return(&sdebug_cmnd_count) >=
4135             abs(scsi_debug_every_nth))) {
4136                atomic_set(&sdebug_cmnd_count, 0);
4137                if (scsi_debug_every_nth < -1)
4138                        scsi_debug_every_nth = -1;
4139                if (SCSI_DEBUG_OPT_TIMEOUT & scsi_debug_opts)
4140                        return 0; /* ignore command causing timeout */
4141                else if (SCSI_DEBUG_OPT_MAC_TIMEOUT & scsi_debug_opts &&
4142                         scsi_medium_access_command(SCpnt))
4143                        return 0; /* time out reads and writes */
4144                else if (SCSI_DEBUG_OPT_RECOVERED_ERR & scsi_debug_opts)
4145                        inj_recovered = 1; /* to reads and writes below */
4146                else if (SCSI_DEBUG_OPT_TRANSPORT_ERR & scsi_debug_opts)
4147                        inj_transport = 1; /* to reads and writes below */
4148                else if (SCSI_DEBUG_OPT_DIF_ERR & scsi_debug_opts)
4149                        inj_dif = 1; /* to reads and writes below */
4150                else if (SCSI_DEBUG_OPT_DIX_ERR & scsi_debug_opts)
4151                        inj_dix = 1; /* to reads and writes below */
4152                else if (SCSI_DEBUG_OPT_SHORT_TRANSFER & scsi_debug_opts)
4153                        inj_short = 1;
4154        }
4155
4156        if (devip->wlun) {
4157                switch (*cmd) {
4158                case INQUIRY:
4159                case REQUEST_SENSE:
4160                case TEST_UNIT_READY:
4161                case REPORT_LUNS:
4162                        break;  /* only allowable wlun commands */
4163                default:
4164                        if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
4165                                printk(KERN_INFO "scsi_debug: Opcode: 0x%x "
4166                                       "not supported for wlun\n", *cmd);
4167                        mk_sense_buffer(SCpnt, ILLEGAL_REQUEST,
4168                                        INVALID_OPCODE, 0);
4169                        errsts = check_condition_result;
4170                        return schedule_resp(SCpnt, devip, errsts, 0);
4171                }
4172        }
4173
4174        switch (*cmd) {
4175        case INQUIRY:     /* mandatory, ignore unit attention */
4176                delay_override = 1;
4177                errsts = resp_inquiry(SCpnt, target, devip);
4178                break;
4179        case REQUEST_SENSE:     /* mandatory, ignore unit attention */
4180                delay_override = 1;
4181                errsts = resp_requests(SCpnt, devip);
4182                break;
4183        case REZERO_UNIT:       /* actually this is REWIND for SSC */
4184        case START_STOP:
4185                errsts = resp_start_stop(SCpnt, devip);
4186                break;
4187        case ALLOW_MEDIUM_REMOVAL:
4188                errsts = check_readiness(SCpnt, UAS_ONLY, devip);
4189                if (errsts)
4190                        break;
4191                if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
4192                        printk(KERN_INFO "scsi_debug: Medium removal %s\n",
4193                               cmd[4] ? "inhibited" : "enabled");
4194                break;
4195        case SEND_DIAGNOSTIC:     /* mandatory */
4196                errsts = check_readiness(SCpnt, UAS_ONLY, devip);
4197                break;
4198        case TEST_UNIT_READY:     /* mandatory */
4199                /* delay_override = 1; */
4200                errsts = check_readiness(SCpnt, UAS_TUR, devip);
4201                break;
4202        case RESERVE:
4203                errsts = check_readiness(SCpnt, UAS_ONLY, devip);
4204                break;
4205        case RESERVE_10:
4206                errsts = check_readiness(SCpnt, UAS_ONLY, devip);
4207                break;
4208        case RELEASE:
4209                errsts = check_readiness(SCpnt, UAS_ONLY, devip);
4210                break;
4211        case RELEASE_10:
4212                errsts = check_readiness(SCpnt, UAS_ONLY, devip);
4213                break;
4214        case READ_CAPACITY:
4215                errsts = resp_readcap(SCpnt, devip);
4216                break;
4217        case SERVICE_ACTION_IN:
4218                if (cmd[1] == SAI_READ_CAPACITY_16)
4219                        errsts = resp_readcap16(SCpnt, devip);
4220                else if (cmd[1] == SAI_GET_LBA_STATUS) {
4221
4222                        if (scsi_debug_lbp() == 0) {
4223                                mk_sense_buffer(SCpnt, ILLEGAL_REQUEST,
4224                                                INVALID_COMMAND_OPCODE, 0);
4225                                errsts = check_condition_result;
4226                        } else
4227                                errsts = resp_get_lba_status(SCpnt, devip);
4228                } else {
4229                        mk_sense_buffer(SCpnt, ILLEGAL_REQUEST,
4230                                        INVALID_OPCODE, 0);
4231                        errsts = check_condition_result;
4232                }
4233                break;
4234        case MAINTENANCE_IN:
4235                if (MI_REPORT_TARGET_PGS != cmd[1]) {
4236                        mk_sense_buffer(SCpnt, ILLEGAL_REQUEST,
4237                                        INVALID_OPCODE, 0);
4238                        errsts = check_condition_result;
4239                        break;
4240                }
4241                errsts = resp_report_tgtpgs(SCpnt, devip);
4242                break;
4243        case READ_16:
4244        case READ_12:
4245        case READ_10:
4246                /* READ{10,12,16} and DIF Type 2 are natural enemies */
4247                if (scsi_debug_dif == SD_DIF_TYPE2_PROTECTION &&
4248                    cmd[1] & 0xe0) {
4249                        mk_sense_buffer(SCpnt, ILLEGAL_REQUEST,
4250                                        INVALID_COMMAND_OPCODE, 0);
4251                        errsts = check_condition_result;
4252                        break;
4253                }
4254
4255                if ((scsi_debug_dif == SD_DIF_TYPE1_PROTECTION ||
4256                     scsi_debug_dif == SD_DIF_TYPE3_PROTECTION) &&
4257                    (cmd[1] & 0xe0) == 0)
4258                        printk(KERN_ERR "Unprotected RD/WR to DIF device\n");
4259
4260                /* fall through */
4261        case READ_6:
4262read:
4263                errsts = check_readiness(SCpnt, UAS_TUR, devip);
4264                if (errsts)
4265                        break;
4266                if (scsi_debug_fake_rw)
4267                        break;
4268                get_data_transfer_info(cmd, &lba, &num, &ei_lba);
4269
4270                if (inj_short)
4271                        num /= 2;
4272
4273                errsts = resp_read(SCpnt, lba, num, ei_lba);
4274                if (inj_recovered && (0 == errsts)) {
4275                        mk_sense_buffer(SCpnt, RECOVERED_ERROR,
4276                                        THRESHOLD_EXCEEDED, 0);
4277                        errsts = check_condition_result;
4278                } else if (inj_transport && (0 == errsts)) {
4279                        mk_sense_buffer(SCpnt, ABORTED_COMMAND,
4280                                        TRANSPORT_PROBLEM, ACK_NAK_TO);
4281                        errsts = check_condition_result;
4282                } else if (inj_dif && (0 == errsts)) {
4283                        /* Logical block guard check failed */
4284                        mk_sense_buffer(SCpnt, ABORTED_COMMAND, 0x10, 1);
4285                        errsts = illegal_condition_result;
4286                } else if (inj_dix && (0 == errsts)) {
4287                        mk_sense_buffer(SCpnt, ILLEGAL_REQUEST, 0x10, 1);
4288                        errsts = illegal_condition_result;
4289                }
4290                break;
4291        case REPORT_LUNS:       /* mandatory, ignore unit attention */
4292                delay_override = 1;
4293                errsts = resp_report_luns(SCpnt, devip);
4294                break;
4295        case VERIFY:            /* 10 byte SBC-2 command */
4296                errsts = check_readiness(SCpnt, UAS_TUR, devip);
4297                break;
4298        case WRITE_16:
4299        case WRITE_12:
4300        case WRITE_10:
4301                /* WRITE{10,12,16} and DIF Type 2 are natural enemies */
4302                if (scsi_debug_dif == SD_DIF_TYPE2_PROTECTION &&
4303                    cmd[1] & 0xe0) {
4304                        mk_sense_buffer(SCpnt, ILLEGAL_REQUEST,
4305                                        INVALID_COMMAND_OPCODE, 0);
4306                        errsts = check_condition_result;
4307                        break;
4308                }
4309
4310                if ((scsi_debug_dif == SD_DIF_TYPE1_PROTECTION ||
4311                     scsi_debug_dif == SD_DIF_TYPE3_PROTECTION) &&
4312                    (cmd[1] & 0xe0) == 0)
4313                        printk(KERN_ERR "Unprotected RD/WR to DIF device\n");
4314
4315                /* fall through */
4316        case WRITE_6:
4317write:
4318                errsts = check_readiness(SCpnt, UAS_TUR, devip);
4319                if (errsts)
4320                        break;
4321                if (scsi_debug_fake_rw)
4322                        break;
4323                get_data_transfer_info(cmd, &lba, &num, &ei_lba);
4324                errsts = resp_write(SCpnt, lba, num, ei_lba);
4325                if (inj_recovered && (0 == errsts)) {
4326                        mk_sense_buffer(SCpnt, RECOVERED_ERROR,
4327                                        THRESHOLD_EXCEEDED, 0);
4328                        errsts = check_condition_result;
4329                } else if (inj_dif && (0 == errsts)) {
4330                        mk_sense_buffer(SCpnt, ABORTED_COMMAND, 0x10, 1);
4331                        errsts = illegal_condition_result;
4332                } else if (inj_dix && (0 == errsts)) {
4333                        mk_sense_buffer(SCpnt, ILLEGAL_REQUEST, 0x10, 1);
4334                        errsts = illegal_condition_result;
4335                }
4336                break;
4337        case WRITE_SAME_16:
4338        case WRITE_SAME:
4339                if (cmd[1] & 0x8) {
4340                        if ((*cmd == WRITE_SAME_16 && scsi_debug_lbpws == 0) ||
4341                            (*cmd == WRITE_SAME && scsi_debug_lbpws10 == 0)) {
4342                                mk_sense_buffer(SCpnt, ILLEGAL_REQUEST,
4343                                                INVALID_FIELD_IN_CDB, 0);
4344                                errsts = check_condition_result;
4345                        } else
4346                                unmap = 1;
4347                }
4348                if (errsts)
4349                        break;
4350                errsts = check_readiness(SCpnt, UAS_TUR, devip);
4351                if (errsts)
4352                        break;
4353                if (scsi_debug_fake_rw)
4354                        break;
4355                get_data_transfer_info(cmd, &lba, &num, &ei_lba);
4356                errsts = resp_write_same(SCpnt, lba, num, ei_lba, unmap);
4357                break;
4358        case UNMAP:
4359                errsts = check_readiness(SCpnt, UAS_TUR, devip);
4360                if (errsts)
4361                        break;
4362                if (scsi_debug_fake_rw)
4363                        break;
4364
4365                if (scsi_debug_unmap_max_desc == 0 || scsi_debug_lbpu == 0) {
4366                        mk_sense_buffer(SCpnt, ILLEGAL_REQUEST,
4367                                        INVALID_COMMAND_OPCODE, 0);
4368                        errsts = check_condition_result;
4369                } else
4370                        errsts = resp_unmap(SCpnt, devip);
4371                break;
4372        case MODE_SENSE:
4373        case MODE_SENSE_10:
4374                errsts = resp_mode_sense(SCpnt, target, devip);
4375                break;
4376        case MODE_SELECT:
4377                errsts = resp_mode_select(SCpnt, 1, devip);
4378                break;
4379        case MODE_SELECT_10:
4380                errsts = resp_mode_select(SCpnt, 0, devip);
4381                break;
4382        case LOG_SENSE:
4383                errsts = resp_log_sense(SCpnt, devip);
4384                break;
4385        case SYNCHRONIZE_CACHE:
4386                delay_override = 1;
4387                errsts = check_readiness(SCpnt, UAS_TUR, devip);
4388                break;
4389        case WRITE_BUFFER:
4390                errsts = check_readiness(SCpnt, UAS_ONLY, devip);
4391                break;
4392        case XDWRITEREAD_10:
4393                if (!scsi_bidi_cmnd(SCpnt)) {
4394                        mk_sense_buffer(SCpnt, ILLEGAL_REQUEST,
4395                                        INVALID_FIELD_IN_CDB, 0);
4396                        errsts = check_condition_result;
4397                        break;
4398                }
4399
4400                errsts = check_readiness(SCpnt, UAS_TUR, devip);
4401                if (errsts)
4402                        break;
4403                if (scsi_debug_fake_rw)
4404                        break;
4405                get_data_transfer_info(cmd, &lba, &num, &ei_lba);
4406                errsts = resp_read(SCpnt, lba, num, ei_lba);
4407                if (errsts)
4408                        break;
4409                errsts = resp_write(SCpnt, lba, num, ei_lba);
4410                if (errsts)
4411                        break;
4412                errsts = resp_xdwriteread(SCpnt, lba, num, devip);
4413                break;
4414        case VARIABLE_LENGTH_CMD:
4415                if (scsi_debug_dif == SD_DIF_TYPE2_PROTECTION) {
4416
4417                        if ((cmd[10] & 0xe0) == 0)
4418                                printk(KERN_ERR
4419                                       "Unprotected RD/WR to DIF device\n");
4420
4421                        if (cmd[9] == READ_32) {
4422                                BUG_ON(SCpnt->cmd_len < 32);
4423                                goto read;
4424                        }
4425
4426                        if (cmd[9] == WRITE_32) {
4427                                BUG_ON(SCpnt->cmd_len < 32);
4428                                goto write;
4429                        }
4430                }
4431
4432                mk_sense_buffer(SCpnt, ILLEGAL_REQUEST,
4433                                INVALID_FIELD_IN_CDB, 0);
4434                errsts = check_condition_result;
4435                break;
4436        case 0x85:
4437                if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
4438                        sdev_printk(KERN_INFO, SCpnt->device,
4439                        "%s: ATA PASS-THROUGH(16) not supported\n", my_name);
4440                mk_sense_buffer(SCpnt, ILLEGAL_REQUEST,
4441                                INVALID_OPCODE, 0);
4442                errsts = check_condition_result;
4443                break;
4444        default:
4445                if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
4446                        sdev_printk(KERN_INFO, SCpnt->device,
4447                                    "%s: Opcode: 0x%x not supported\n",
4448                                    my_name, *cmd);
4449                errsts = check_readiness(SCpnt, UAS_ONLY, devip);
4450                if (errsts)
4451                        break;  /* Unit attention takes precedence */
4452                mk_sense_buffer(SCpnt, ILLEGAL_REQUEST, INVALID_OPCODE, 0);
4453                errsts = check_condition_result;
4454                break;
4455        }
4456        return schedule_resp(SCpnt, devip, errsts,
4457                             (delay_override ? 0 : scsi_debug_delay));
4458}
4459
4460static int
4461sdebug_queuecommand_lock_or_not(struct Scsi_Host *shost, struct scsi_cmnd *cmd)
4462{
4463        if (scsi_debug_host_lock) {
4464                unsigned long iflags;
4465                int rc;
4466
4467                spin_lock_irqsave(shost->host_lock, iflags);
4468                rc = scsi_debug_queuecommand(cmd);
4469                spin_unlock_irqrestore(shost->host_lock, iflags);
4470                return rc;
4471        } else
4472                return scsi_debug_queuecommand(cmd);
4473}
4474
4475static int
4476sdebug_change_qdepth(struct scsi_device *sdev, int qdepth, int reason)
4477{
4478        int num_in_q = 0;
4479        int bad = 0;
4480        unsigned long iflags;
4481        struct sdebug_dev_info *devip;
4482
4483        spin_lock_irqsave(&queued_arr_lock, iflags);
4484        devip = (struct sdebug_dev_info *)sdev->hostdata;
4485        if (NULL == devip) {
4486                spin_unlock_irqrestore(&queued_arr_lock, iflags);
4487                return  -ENODEV;
4488        }
4489        num_in_q = atomic_read(&devip->num_in_q);
4490        spin_unlock_irqrestore(&queued_arr_lock, iflags);
4491        if (reason == SCSI_QDEPTH_DEFAULT || reason == SCSI_QDEPTH_RAMP_UP) {
4492                if (qdepth < 1)
4493                        qdepth = 1;
4494                /* allow to exceed max host queued_arr elements for testing */
4495                if (qdepth > SCSI_DEBUG_CANQUEUE + 10)
4496                        qdepth = SCSI_DEBUG_CANQUEUE + 10;
4497                scsi_adjust_queue_depth(sdev, scsi_get_tag_type(sdev), qdepth);
4498        } else if (reason == SCSI_QDEPTH_QFULL)
4499                scsi_track_queue_full(sdev, qdepth);
4500        else
4501                bad = 1;
4502        if (bad)
4503                sdev_printk(KERN_WARNING, sdev,
4504                            "%s: unknown reason=0x%x\n", __func__, reason);
4505        if (SCSI_DEBUG_OPT_Q_NOISE & scsi_debug_opts) {
4506                if (SCSI_QDEPTH_QFULL == reason)
4507                        sdev_printk(KERN_INFO, sdev,
4508                            "%s: -> %d, num_in_q=%d, reason: queue full\n",
4509                                    __func__, qdepth, num_in_q);
4510                else {
4511                        const char *cp;
4512
4513                        switch (reason) {
4514                        case SCSI_QDEPTH_DEFAULT:
4515                                cp = "default (sysfs ?)";
4516                                break;
4517                        case SCSI_QDEPTH_RAMP_UP:
4518                                cp = "ramp up";
4519                                break;
4520                        default:
4521                                cp = "unknown";
4522                                break;
4523                        }
4524                        sdev_printk(KERN_INFO, sdev,
4525                                    "%s: qdepth=%d, num_in_q=%d, reason: %s\n",
4526                                    __func__, qdepth, num_in_q, cp);
4527                }
4528        }
4529        return sdev->queue_depth;
4530}
4531
4532static int
4533sdebug_change_qtype(struct scsi_device *sdev, int qtype)
4534{
4535        if (sdev->tagged_supported) {
4536                scsi_set_tag_type(sdev, qtype);
4537                if (qtype)
4538                        scsi_activate_tcq(sdev, sdev->queue_depth);
4539                else
4540                        scsi_deactivate_tcq(sdev, sdev->queue_depth);
4541        } else
4542                qtype = 0;
4543        if (SCSI_DEBUG_OPT_Q_NOISE & scsi_debug_opts) {
4544                const char *cp;
4545
4546                switch (qtype) {
4547                case 0:
4548                        cp = "untagged";
4549                        break;
4550                case MSG_SIMPLE_TAG:
4551                        cp = "simple tags";
4552                        break;
4553                case MSG_ORDERED_TAG:
4554                        cp = "ordered tags";
4555                        break;
4556                default:
4557                        cp = "unknown";
4558                        break;
4559                }
4560                sdev_printk(KERN_INFO, sdev, "%s: to %s\n", __func__, cp);
4561        }
4562        return qtype;
4563}
4564
4565static struct scsi_host_template sdebug_driver_template = {
4566        .show_info =            scsi_debug_show_info,
4567        .write_info =           scsi_debug_write_info,
4568        .proc_name =            sdebug_proc_name,
4569        .name =                 "SCSI DEBUG",
4570        .info =                 scsi_debug_info,
4571        .slave_alloc =          scsi_debug_slave_alloc,
4572        .slave_configure =      scsi_debug_slave_configure,
4573        .slave_destroy =        scsi_debug_slave_destroy,
4574        .ioctl =                scsi_debug_ioctl,
4575        .queuecommand =         sdebug_queuecommand_lock_or_not,
4576        .change_queue_depth =   sdebug_change_qdepth,
4577        .change_queue_type =    sdebug_change_qtype,
4578        .eh_abort_handler =     scsi_debug_abort,
4579        .eh_device_reset_handler = scsi_debug_device_reset,
4580        .eh_target_reset_handler = scsi_debug_target_reset,
4581        .eh_bus_reset_handler = scsi_debug_bus_reset,
4582        .eh_host_reset_handler = scsi_debug_host_reset,
4583        .can_queue =            SCSI_DEBUG_CANQUEUE,
4584        .this_id =              7,
4585        .sg_tablesize =         SCSI_MAX_SG_CHAIN_SEGMENTS,
4586        .cmd_per_lun =          DEF_CMD_PER_LUN,
4587        .max_sectors =          -1U,
4588        .use_clustering =       DISABLE_CLUSTERING,
4589        .module =               THIS_MODULE,
4590};
4591
4592static int sdebug_driver_probe(struct device * dev)
4593{
4594        int error = 0;
4595        struct sdebug_host_info *sdbg_host;
4596        struct Scsi_Host *hpnt;
4597        int host_prot;
4598
4599        sdbg_host = to_sdebug_host(dev);
4600
4601        sdebug_driver_template.can_queue = scsi_debug_max_queue;
4602        if (scsi_debug_clustering)
4603                sdebug_driver_template.use_clustering = ENABLE_CLUSTERING;
4604        hpnt = scsi_host_alloc(&sdebug_driver_template, sizeof(sdbg_host));
4605        if (NULL == hpnt) {
4606                printk(KERN_ERR "%s: scsi_register failed\n", __func__);
4607                error = -ENODEV;
4608                return error;
4609        }
4610
4611        sdbg_host->shost = hpnt;
4612        *((struct sdebug_host_info **)hpnt->hostdata) = sdbg_host;
4613        if ((hpnt->this_id >= 0) && (scsi_debug_num_tgts > hpnt->this_id))
4614                hpnt->max_id = scsi_debug_num_tgts + 1;
4615        else
4616                hpnt->max_id = scsi_debug_num_tgts;
4617        hpnt->max_lun = SAM2_WLUN_REPORT_LUNS;  /* = scsi_debug_max_luns; */
4618
4619        host_prot = 0;
4620
4621        switch (scsi_debug_dif) {
4622
4623        case SD_DIF_TYPE1_PROTECTION:
4624                host_prot = SHOST_DIF_TYPE1_PROTECTION;
4625                if (scsi_debug_dix)
4626                        host_prot |= SHOST_DIX_TYPE1_PROTECTION;
4627                break;
4628
4629        case SD_DIF_TYPE2_PROTECTION:
4630                host_prot = SHOST_DIF_TYPE2_PROTECTION;
4631                if (scsi_debug_dix)
4632                        host_prot |= SHOST_DIX_TYPE2_PROTECTION;
4633                break;
4634
4635        case SD_DIF_TYPE3_PROTECTION:
4636                host_prot = SHOST_DIF_TYPE3_PROTECTION;
4637                if (scsi_debug_dix)
4638                        host_prot |= SHOST_DIX_TYPE3_PROTECTION;
4639                break;
4640
4641        default:
4642                if (scsi_debug_dix)
4643                        host_prot |= SHOST_DIX_TYPE0_PROTECTION;
4644                break;
4645        }
4646
4647        scsi_host_set_prot(hpnt, host_prot);
4648
4649        printk(KERN_INFO "scsi_debug: host protection%s%s%s%s%s%s%s\n",
4650               (host_prot & SHOST_DIF_TYPE1_PROTECTION) ? " DIF1" : "",
4651               (host_prot & SHOST_DIF_TYPE2_PROTECTION) ? " DIF2" : "",
4652               (host_prot & SHOST_DIF_TYPE3_PROTECTION) ? " DIF3" : "",
4653               (host_prot & SHOST_DIX_TYPE0_PROTECTION) ? " DIX0" : "",
4654               (host_prot & SHOST_DIX_TYPE1_PROTECTION) ? " DIX1" : "",
4655               (host_prot & SHOST_DIX_TYPE2_PROTECTION) ? " DIX2" : "",
4656               (host_prot & SHOST_DIX_TYPE3_PROTECTION) ? " DIX3" : "");
4657
4658        if (scsi_debug_guard == 1)
4659                scsi_host_set_guard(hpnt, SHOST_DIX_GUARD_IP);
4660        else
4661                scsi_host_set_guard(hpnt, SHOST_DIX_GUARD_CRC);
4662
4663        error = scsi_add_host(hpnt, &sdbg_host->dev);
4664        if (error) {
4665                printk(KERN_ERR "%s: scsi_add_host failed\n", __func__);
4666                error = -ENODEV;
4667                scsi_host_put(hpnt);
4668        } else
4669                scsi_scan_host(hpnt);
4670
4671        return error;
4672}
4673
4674static int sdebug_driver_remove(struct device * dev)
4675{
4676        struct sdebug_host_info *sdbg_host;
4677        struct sdebug_dev_info *sdbg_devinfo, *tmp;
4678
4679        sdbg_host = to_sdebug_host(dev);
4680
4681        if (!sdbg_host) {
4682                printk(KERN_ERR "%s: Unable to locate host info\n",
4683                       __func__);
4684                return -ENODEV;
4685        }
4686
4687        scsi_remove_host(sdbg_host->shost);
4688
4689        list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
4690                                 dev_list) {
4691                list_del(&sdbg_devinfo->dev_list);
4692                kfree(sdbg_devinfo);
4693        }
4694
4695        scsi_host_put(sdbg_host->shost);
4696        return 0;
4697}
4698
4699static int pseudo_lld_bus_match(struct device *dev,
4700                                struct device_driver *dev_driver)
4701{
4702        return 1;
4703}
4704
4705static struct bus_type pseudo_lld_bus = {
4706        .name = "pseudo",
4707        .match = pseudo_lld_bus_match,
4708        .probe = sdebug_driver_probe,
4709        .remove = sdebug_driver_remove,
4710        .drv_groups = sdebug_drv_groups,
4711};
4712