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