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