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://www.torque.net/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/sched.h>
  32#include <linux/errno.h>
  33#include <linux/timer.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/smp_lock.h>
  41#include <linux/vmalloc.h>
  42#include <linux/moduleparam.h>
  43
  44#include <linux/blkdev.h>
  45#include "scsi.h"
  46#include <scsi/scsi_host.h>
  47#include <scsi/scsicam.h>
  48
  49#include <linux/stat.h>
  50
  51#include "scsi_logging.h"
  52#include "scsi_debug.h"
  53
  54#define SCSI_DEBUG_VERSION "1.80"
  55static const char * scsi_debug_version_date = "20061018";
  56
  57/* Additional Sense Code (ASC) used */
  58#define NO_ADDITIONAL_SENSE 0x0
  59#define LOGICAL_UNIT_NOT_READY 0x4
  60#define UNRECOVERED_READ_ERR 0x11
  61#define PARAMETER_LIST_LENGTH_ERR 0x1a
  62#define INVALID_OPCODE 0x20
  63#define ADDR_OUT_OF_RANGE 0x21
  64#define INVALID_FIELD_IN_CDB 0x24
  65#define INVALID_FIELD_IN_PARAM_LIST 0x26
  66#define POWERON_RESET 0x29
  67#define SAVING_PARAMS_UNSUP 0x39
  68#define THRESHOLD_EXCEEDED 0x5d
  69#define LOW_POWER_COND_ON 0x5e
  70
  71#define SDEBUG_TAGGED_QUEUING 0 /* 0 | MSG_SIMPLE_TAG | MSG_ORDERED_TAG */
  72
  73/* Default values for driver parameters */
  74#define DEF_NUM_HOST   1
  75#define DEF_NUM_TGTS   1
  76#define DEF_MAX_LUNS   1
  77/* With these defaults, this driver will make 1 host with 1 target
  78 * (id 0) containing 1 logical unit (lun 0). That is 1 device.
  79 */
  80#define DEF_DELAY   1
  81#define DEF_DEV_SIZE_MB   8
  82#define DEF_EVERY_NTH   0
  83#define DEF_NUM_PARTS   0
  84#define DEF_OPTS   0
  85#define DEF_SCSI_LEVEL   5    /* INQUIRY, byte2 [5->SPC-3] */
  86#define DEF_PTYPE   0
  87#define DEF_D_SENSE   0
  88#define DEF_NO_LUN_0   0
  89#define DEF_VIRTUAL_GB   0
  90#define DEF_FAKE_RW     0
  91#define DEF_VPD_USE_HOSTNO 1
  92
  93/* bit mask values for scsi_debug_opts */
  94#define SCSI_DEBUG_OPT_NOISE   1
  95#define SCSI_DEBUG_OPT_MEDIUM_ERR   2
  96#define SCSI_DEBUG_OPT_TIMEOUT   4
  97#define SCSI_DEBUG_OPT_RECOVERED_ERR   8
  98/* When "every_nth" > 0 then modulo "every_nth" commands:
  99 *   - a no response is simulated if SCSI_DEBUG_OPT_TIMEOUT is set
 100 *   - a RECOVERED_ERROR is simulated on successful read and write
 101 *     commands if SCSI_DEBUG_OPT_RECOVERED_ERR is set.
 102 *
 103 * When "every_nth" < 0 then after "- every_nth" commands:
 104 *   - a no response is simulated if SCSI_DEBUG_OPT_TIMEOUT is set
 105 *   - a RECOVERED_ERROR is simulated on successful read and write
 106 *     commands if SCSI_DEBUG_OPT_RECOVERED_ERR is set.
 107 * This will continue until some other action occurs (e.g. the user
 108 * writing a new value (other than -1 or 1) to every_nth via sysfs).
 109 */
 110
 111/* when 1==SCSI_DEBUG_OPT_MEDIUM_ERR, a medium error is simulated at this
 112 * sector on read commands: */
 113#define OPT_MEDIUM_ERR_ADDR   0x1234 /* that's sector 4660 in decimal */
 114
 115/* If REPORT LUNS has luns >= 256 it can choose "flat space" (value 1)
 116 * or "peripheral device" addressing (value 0) */
 117#define SAM2_LUN_ADDRESS_METHOD 0
 118#define SAM2_WLUN_REPORT_LUNS 0xc101
 119
 120static int scsi_debug_add_host = DEF_NUM_HOST;
 121static int scsi_debug_delay = DEF_DELAY;
 122static int scsi_debug_dev_size_mb = DEF_DEV_SIZE_MB;
 123static int scsi_debug_every_nth = DEF_EVERY_NTH;
 124static int scsi_debug_max_luns = DEF_MAX_LUNS;
 125static int scsi_debug_num_parts = DEF_NUM_PARTS;
 126static int scsi_debug_num_tgts = DEF_NUM_TGTS; /* targets per host */
 127static int scsi_debug_opts = DEF_OPTS;
 128static int scsi_debug_scsi_level = DEF_SCSI_LEVEL;
 129static int scsi_debug_ptype = DEF_PTYPE; /* SCSI peripheral type (0==disk) */
 130static int scsi_debug_dsense = DEF_D_SENSE;
 131static int scsi_debug_no_lun_0 = DEF_NO_LUN_0;
 132static int scsi_debug_virtual_gb = DEF_VIRTUAL_GB;
 133static int scsi_debug_fake_rw = DEF_FAKE_RW;
 134static int scsi_debug_vpd_use_hostno = DEF_VPD_USE_HOSTNO;
 135
 136static int scsi_debug_cmnd_count = 0;
 137
 138#define DEV_READONLY(TGT)      (0)
 139#define DEV_REMOVEABLE(TGT)    (0)
 140
 141static unsigned int sdebug_store_size;  /* in bytes */
 142static unsigned int sdebug_store_sectors;
 143static sector_t sdebug_capacity;        /* in sectors */
 144
 145/* old BIOS stuff, kernel may get rid of them but some mode sense pages
 146   may still need them */
 147static int sdebug_heads;                /* heads per disk */
 148static int sdebug_cylinders_per;        /* cylinders per surface */
 149static int sdebug_sectors_per;          /* sectors per cylinder */
 150
 151/* default sector size is 512 bytes, 2**9 bytes */
 152#define POW2_SECT_SIZE 9
 153#define SECT_SIZE (1 << POW2_SECT_SIZE)
 154#define SECT_SIZE_PER(TGT) SECT_SIZE
 155
 156#define SDEBUG_MAX_PARTS 4
 157
 158#define SDEBUG_SENSE_LEN 32
 159
 160struct sdebug_dev_info {
 161        struct list_head dev_list;
 162        unsigned char sense_buff[SDEBUG_SENSE_LEN];     /* weak nexus */
 163        unsigned int channel;
 164        unsigned int target;
 165        unsigned int lun;
 166        struct sdebug_host_info *sdbg_host;
 167        unsigned int wlun;
 168        char reset;
 169        char stopped;
 170        char used;
 171};
 172
 173struct sdebug_host_info {
 174        struct list_head host_list;
 175        struct Scsi_Host *shost;
 176        struct device dev;
 177        struct list_head dev_info_list;
 178};
 179
 180#define to_sdebug_host(d)       \
 181        container_of(d, struct sdebug_host_info, dev)
 182
 183static LIST_HEAD(sdebug_host_list);
 184static DEFINE_SPINLOCK(sdebug_host_list_lock);
 185
 186typedef void (* done_funct_t) (struct scsi_cmnd *);
 187
 188struct sdebug_queued_cmd {
 189        int in_use;
 190        struct timer_list cmnd_timer;
 191        done_funct_t done_funct;
 192        struct scsi_cmnd * a_cmnd;
 193        int scsi_result;
 194};
 195static struct sdebug_queued_cmd queued_arr[SCSI_DEBUG_CANQUEUE];
 196
 197static struct scsi_host_template sdebug_driver_template = {
 198        .proc_info =            scsi_debug_proc_info,
 199        .name =                 "SCSI DEBUG",
 200        .info =                 scsi_debug_info,
 201        .slave_alloc =          scsi_debug_slave_alloc,
 202        .slave_configure =      scsi_debug_slave_configure,
 203        .slave_destroy =        scsi_debug_slave_destroy,
 204        .ioctl =                scsi_debug_ioctl,
 205        .queuecommand =         scsi_debug_queuecommand,
 206        .eh_abort_handler =     scsi_debug_abort,
 207        .eh_bus_reset_handler = scsi_debug_bus_reset,
 208        .eh_device_reset_handler = scsi_debug_device_reset,
 209        .eh_host_reset_handler = scsi_debug_host_reset,
 210        .bios_param =           scsi_debug_biosparam,
 211        .can_queue =            SCSI_DEBUG_CANQUEUE,
 212        .this_id =              7,
 213        .sg_tablesize =         256,
 214        .cmd_per_lun =          16,
 215        .max_sectors =          0xffff,
 216        .unchecked_isa_dma =    0,
 217        .use_clustering =       ENABLE_CLUSTERING,
 218        .module =               THIS_MODULE,
 219};
 220
 221static unsigned char * fake_storep;     /* ramdisk storage */
 222
 223static int num_aborts = 0;
 224static int num_dev_resets = 0;
 225static int num_bus_resets = 0;
 226static int num_host_resets = 0;
 227
 228static DEFINE_SPINLOCK(queued_arr_lock);
 229static DEFINE_RWLOCK(atomic_rw);
 230
 231static char sdebug_proc_name[] = "scsi_debug";
 232
 233static int sdebug_driver_probe(struct device *);
 234static int sdebug_driver_remove(struct device *);
 235static struct bus_type pseudo_lld_bus;
 236
 237static struct device_driver sdebug_driverfs_driver = {
 238        .name           = sdebug_proc_name,
 239        .bus            = &pseudo_lld_bus,
 240};
 241
 242static const int check_condition_result =
 243                (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
 244
 245static unsigned char ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
 246                                    0, 0, 0x2, 0x4b};
 247static unsigned char iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
 248                                   0, 0, 0x0, 0x0};
 249
 250/* function declarations */
 251static int resp_inquiry(struct scsi_cmnd * SCpnt, int target,
 252                        struct sdebug_dev_info * devip);
 253static int resp_requests(struct scsi_cmnd * SCpnt,
 254                         struct sdebug_dev_info * devip);
 255static int resp_start_stop(struct scsi_cmnd * scp,
 256                           struct sdebug_dev_info * devip);
 257static int resp_report_tgtpgs(struct scsi_cmnd * scp,
 258                              struct sdebug_dev_info * devip);
 259static int resp_readcap(struct scsi_cmnd * SCpnt,
 260                        struct sdebug_dev_info * devip);
 261static int resp_readcap16(struct scsi_cmnd * SCpnt,
 262                          struct sdebug_dev_info * devip);
 263static int resp_mode_sense(struct scsi_cmnd * scp, int target,
 264                           struct sdebug_dev_info * devip);
 265static int resp_mode_select(struct scsi_cmnd * scp, int mselect6,
 266                            struct sdebug_dev_info * devip);
 267static int resp_log_sense(struct scsi_cmnd * scp,
 268                          struct sdebug_dev_info * devip);
 269static int resp_read(struct scsi_cmnd * SCpnt, unsigned long long lba,
 270                     unsigned int num, struct sdebug_dev_info * devip);
 271static int resp_write(struct scsi_cmnd * SCpnt, unsigned long long lba,
 272                      unsigned int num, struct sdebug_dev_info * devip);
 273static int resp_report_luns(struct scsi_cmnd * SCpnt,
 274                            struct sdebug_dev_info * devip);
 275static int fill_from_dev_buffer(struct scsi_cmnd * scp, unsigned char * arr,
 276                                int arr_len);
 277static int fetch_to_dev_buffer(struct scsi_cmnd * scp, unsigned char * arr,
 278                               int max_arr_len);
 279static void timer_intr_handler(unsigned long);
 280static struct sdebug_dev_info * devInfoReg(struct scsi_device * sdev);
 281static void mk_sense_buffer(struct sdebug_dev_info * devip, int key,
 282                            int asc, int asq);
 283static int check_readiness(struct scsi_cmnd * SCpnt, int reset_only,
 284                           struct sdebug_dev_info * devip);
 285static int schedule_resp(struct scsi_cmnd * cmnd,
 286                         struct sdebug_dev_info * devip,
 287                         done_funct_t done, int scsi_result, int delta_jiff);
 288static void __init sdebug_build_parts(unsigned char * ramp);
 289static void __init init_all_queued(void);
 290static void stop_all_queued(void);
 291static int stop_queued_cmnd(struct scsi_cmnd * cmnd);
 292static int inquiry_evpd_83(unsigned char * arr, int port_group_id,
 293                           int target_dev_id, int dev_id_num,
 294                           const char * dev_id_str, int dev_id_str_len);
 295static int inquiry_evpd_88(unsigned char * arr, int target_dev_id);
 296static int do_create_driverfs_files(void);
 297static void do_remove_driverfs_files(void);
 298
 299static int sdebug_add_adapter(void);
 300static void sdebug_remove_adapter(void);
 301static void sdebug_max_tgts_luns(void);
 302
 303static struct device pseudo_primary;
 304static struct bus_type pseudo_lld_bus;
 305
 306
 307static
 308int scsi_debug_queuecommand(struct scsi_cmnd * SCpnt, done_funct_t done)
 309{
 310        unsigned char *cmd = (unsigned char *) SCpnt->cmnd;
 311        int len, k, j;
 312        unsigned int num;
 313        unsigned long long lba;
 314        int errsts = 0;
 315        int target = SCpnt->device->id;
 316        struct sdebug_dev_info * devip = NULL;
 317        int inj_recovered = 0;
 318        int delay_override = 0;
 319
 320        if (done == NULL)
 321                return 0;       /* assume mid level reprocessing command */
 322
 323        SCpnt->resid = 0;
 324        if ((SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) && cmd) {
 325                printk(KERN_INFO "scsi_debug: cmd ");
 326                for (k = 0, len = SCpnt->cmd_len; k < len; ++k)
 327                        printk("%02x ", (int)cmd[k]);
 328                printk("\n");
 329        }
 330        if(target == sdebug_driver_template.this_id) {
 331                printk(KERN_INFO "scsi_debug: initiator's id used as "
 332                       "target!\n");
 333                return schedule_resp(SCpnt, NULL, done,
 334                                     DID_NO_CONNECT << 16, 0);
 335        }
 336
 337        if ((SCpnt->device->lun >= scsi_debug_max_luns) &&
 338            (SCpnt->device->lun != SAM2_WLUN_REPORT_LUNS))
 339                return schedule_resp(SCpnt, NULL, done,
 340                                     DID_NO_CONNECT << 16, 0);
 341        devip = devInfoReg(SCpnt->device);
 342        if (NULL == devip)
 343                return schedule_resp(SCpnt, NULL, done,
 344                                     DID_NO_CONNECT << 16, 0);
 345
 346        if ((scsi_debug_every_nth != 0) &&
 347            (++scsi_debug_cmnd_count >= abs(scsi_debug_every_nth))) {
 348                scsi_debug_cmnd_count = 0;
 349                if (scsi_debug_every_nth < -1)
 350                        scsi_debug_every_nth = -1;
 351                if (SCSI_DEBUG_OPT_TIMEOUT & scsi_debug_opts)
 352                        return 0; /* ignore command causing timeout */
 353                else if (SCSI_DEBUG_OPT_RECOVERED_ERR & scsi_debug_opts)
 354                        inj_recovered = 1; /* to reads and writes below */
 355        }
 356
 357        if (devip->wlun) {
 358                switch (*cmd) {
 359                case INQUIRY:
 360                case REQUEST_SENSE:
 361                case TEST_UNIT_READY:
 362                case REPORT_LUNS:
 363                        break;  /* only allowable wlun commands */
 364                default:
 365                        if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
 366                                printk(KERN_INFO "scsi_debug: Opcode: 0x%x "
 367                                       "not supported for wlun\n", *cmd);
 368                        mk_sense_buffer(devip, ILLEGAL_REQUEST,
 369                                        INVALID_OPCODE, 0);
 370                        errsts = check_condition_result;
 371                        return schedule_resp(SCpnt, devip, done, errsts,
 372                                             0);
 373                }
 374        }
 375
 376        switch (*cmd) {
 377        case INQUIRY:     /* mandatory, ignore unit attention */
 378                delay_override = 1;
 379                errsts = resp_inquiry(SCpnt, target, devip);
 380                break;
 381        case REQUEST_SENSE:     /* mandatory, ignore unit attention */
 382                delay_override = 1;
 383                errsts = resp_requests(SCpnt, devip);
 384                break;
 385        case REZERO_UNIT:       /* actually this is REWIND for SSC */
 386        case START_STOP:
 387                errsts = resp_start_stop(SCpnt, devip);
 388                break;
 389        case ALLOW_MEDIUM_REMOVAL:
 390                if ((errsts = check_readiness(SCpnt, 1, devip)))
 391                        break;
 392                if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
 393                        printk(KERN_INFO "scsi_debug: Medium removal %s\n",
 394                                cmd[4] ? "inhibited" : "enabled");
 395                break;
 396        case SEND_DIAGNOSTIC:     /* mandatory */
 397                errsts = check_readiness(SCpnt, 1, devip);
 398                break;
 399        case TEST_UNIT_READY:     /* mandatory */
 400                delay_override = 1;
 401                errsts = check_readiness(SCpnt, 0, devip);
 402                break;
 403        case RESERVE:
 404                errsts = check_readiness(SCpnt, 1, devip);
 405                break;
 406        case RESERVE_10:
 407                errsts = check_readiness(SCpnt, 1, devip);
 408                break;
 409        case RELEASE:
 410                errsts = check_readiness(SCpnt, 1, devip);
 411                break;
 412        case RELEASE_10:
 413                errsts = check_readiness(SCpnt, 1, devip);
 414                break;
 415        case READ_CAPACITY:
 416                errsts = resp_readcap(SCpnt, devip);
 417                break;
 418        case SERVICE_ACTION_IN:
 419                if (SAI_READ_CAPACITY_16 != cmd[1]) {
 420                        mk_sense_buffer(devip, ILLEGAL_REQUEST,
 421                                        INVALID_OPCODE, 0);
 422                        errsts = check_condition_result;
 423                        break;
 424                }
 425                errsts = resp_readcap16(SCpnt, devip);
 426                break;
 427        case MAINTENANCE_IN:
 428                if (MI_REPORT_TARGET_PGS != cmd[1]) {
 429                        mk_sense_buffer(devip, ILLEGAL_REQUEST,
 430                                        INVALID_OPCODE, 0);
 431                        errsts = check_condition_result;
 432                        break;
 433                }
 434                errsts = resp_report_tgtpgs(SCpnt, devip);
 435                break;
 436        case READ_16:
 437        case READ_12:
 438        case READ_10:
 439        case READ_6:
 440                if ((errsts = check_readiness(SCpnt, 0, devip)))
 441                        break;
 442                if (scsi_debug_fake_rw)
 443                        break;
 444                if ((*cmd) == READ_16) {
 445                        for (lba = 0, j = 0; j < 8; ++j) {
 446                                if (j > 0)
 447                                        lba <<= 8;
 448                                lba += cmd[2 + j];
 449                        }
 450                        num = cmd[13] + (cmd[12] << 8) +
 451                                (cmd[11] << 16) + (cmd[10] << 24);
 452                } else if ((*cmd) == READ_12) {
 453                        lba = cmd[5] + (cmd[4] << 8) +
 454                                (cmd[3] << 16) + (cmd[2] << 24);
 455                        num = cmd[9] + (cmd[8] << 8) +
 456                                (cmd[7] << 16) + (cmd[6] << 24);
 457                } else if ((*cmd) == READ_10) {
 458                        lba = cmd[5] + (cmd[4] << 8) +
 459                                (cmd[3] << 16) + (cmd[2] << 24);
 460                        num = cmd[8] + (cmd[7] << 8);
 461                } else {        /* READ (6) */
 462                        lba = cmd[3] + (cmd[2] << 8) +
 463                                ((cmd[1] & 0x1f) << 16);
 464                        num = (0 == cmd[4]) ? 256 : cmd[4];
 465                }
 466                errsts = resp_read(SCpnt, lba, num, devip);
 467                if (inj_recovered && (0 == errsts)) {
 468                        mk_sense_buffer(devip, RECOVERED_ERROR,
 469                                        THRESHOLD_EXCEEDED, 0);
 470                        errsts = check_condition_result;
 471                }
 472                break;
 473        case REPORT_LUNS:       /* mandatory, ignore unit attention */
 474                delay_override = 1;
 475                errsts = resp_report_luns(SCpnt, devip);
 476                break;
 477        case VERIFY:            /* 10 byte SBC-2 command */
 478                errsts = check_readiness(SCpnt, 0, devip);
 479                break;
 480        case WRITE_16:
 481        case WRITE_12:
 482        case WRITE_10:
 483        case WRITE_6:
 484                if ((errsts = check_readiness(SCpnt, 0, devip)))
 485                        break;
 486                if (scsi_debug_fake_rw)
 487                        break;
 488                if ((*cmd) == WRITE_16) {
 489                        for (lba = 0, j = 0; j < 8; ++j) {
 490                                if (j > 0)
 491                                        lba <<= 8;
 492                                lba += cmd[2 + j];
 493                        }
 494                        num = cmd[13] + (cmd[12] << 8) +
 495                                (cmd[11] << 16) + (cmd[10] << 24);
 496                } else if ((*cmd) == WRITE_12) {
 497                        lba = cmd[5] + (cmd[4] << 8) +
 498                                (cmd[3] << 16) + (cmd[2] << 24);
 499                        num = cmd[9] + (cmd[8] << 8) +
 500                                (cmd[7] << 16) + (cmd[6] << 24);
 501                } else if ((*cmd) == WRITE_10) {
 502                        lba = cmd[5] + (cmd[4] << 8) +
 503                                (cmd[3] << 16) + (cmd[2] << 24);
 504                        num = cmd[8] + (cmd[7] << 8);
 505                } else {        /* WRITE (6) */
 506                        lba = cmd[3] + (cmd[2] << 8) +
 507                                ((cmd[1] & 0x1f) << 16);
 508                        num = (0 == cmd[4]) ? 256 : cmd[4];
 509                }
 510                errsts = resp_write(SCpnt, lba, num, devip);
 511                if (inj_recovered && (0 == errsts)) {
 512                        mk_sense_buffer(devip, RECOVERED_ERROR,
 513                                        THRESHOLD_EXCEEDED, 0);
 514                        errsts = check_condition_result;
 515                }
 516                break;
 517        case MODE_SENSE:
 518        case MODE_SENSE_10:
 519                errsts = resp_mode_sense(SCpnt, target, devip);
 520                break;
 521        case MODE_SELECT:
 522                errsts = resp_mode_select(SCpnt, 1, devip);
 523                break;
 524        case MODE_SELECT_10:
 525                errsts = resp_mode_select(SCpnt, 0, devip);
 526                break;
 527        case LOG_SENSE:
 528                errsts = resp_log_sense(SCpnt, devip);
 529                break;
 530        case SYNCHRONIZE_CACHE:
 531                delay_override = 1;
 532                errsts = check_readiness(SCpnt, 0, devip);
 533                break;
 534        default:
 535                if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
 536                        printk(KERN_INFO "scsi_debug: Opcode: 0x%x not "
 537                               "supported\n", *cmd);
 538                if ((errsts = check_readiness(SCpnt, 1, devip)))
 539                        break;  /* Unit attention takes precedence */
 540                mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_OPCODE, 0);
 541                errsts = check_condition_result;
 542                break;
 543        }
 544        return schedule_resp(SCpnt, devip, done, errsts,
 545                             (delay_override ? 0 : scsi_debug_delay));
 546}
 547
 548static int scsi_debug_ioctl(struct scsi_device *dev, int cmd, void __user *arg)
 549{
 550        if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) {
 551                printk(KERN_INFO "scsi_debug: ioctl: cmd=0x%x\n", cmd);
 552        }
 553        return -EINVAL;
 554        /* return -ENOTTY; // correct return but upsets fdisk */
 555}
 556
 557static int check_readiness(struct scsi_cmnd * SCpnt, int reset_only,
 558                           struct sdebug_dev_info * devip)
 559{
 560        if (devip->reset) {
 561                if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
 562                        printk(KERN_INFO "scsi_debug: Reporting Unit "
 563                               "attention: power on reset\n");
 564                devip->reset = 0;
 565                mk_sense_buffer(devip, UNIT_ATTENTION, POWERON_RESET, 0);
 566                return check_condition_result;
 567        }
 568        if ((0 == reset_only) && devip->stopped) {
 569                if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
 570                        printk(KERN_INFO "scsi_debug: Reporting Not "
 571                               "ready: initializing command required\n");
 572                mk_sense_buffer(devip, NOT_READY, LOGICAL_UNIT_NOT_READY,
 573                                0x2);
 574                return check_condition_result;
 575        }
 576        return 0;
 577}
 578
 579/* Returns 0 if ok else (DID_ERROR << 16). Sets scp->resid . */
 580static int fill_from_dev_buffer(struct scsi_cmnd * scp, unsigned char * arr,
 581                                int arr_len)
 582{
 583        int k, req_len, act_len, len, active;
 584        void * kaddr;
 585        void * kaddr_off;
 586        struct scatterlist * sgpnt;
 587
 588        if (0 == scp->request_bufflen)
 589                return 0;
 590        if (NULL == scp->request_buffer)
 591                return (DID_ERROR << 16);
 592        if (! ((scp->sc_data_direction == DMA_BIDIRECTIONAL) ||
 593              (scp->sc_data_direction == DMA_FROM_DEVICE)))
 594                return (DID_ERROR << 16);
 595        if (0 == scp->use_sg) {
 596                req_len = scp->request_bufflen;
 597                act_len = (req_len < arr_len) ? req_len : arr_len;
 598                memcpy(scp->request_buffer, arr, act_len);
 599                if (scp->resid)
 600                        scp->resid -= act_len;
 601                else
 602                        scp->resid = req_len - act_len;
 603                return 0;
 604        }
 605        sgpnt = (struct scatterlist *)scp->request_buffer;
 606        active = 1;
 607        for (k = 0, req_len = 0, act_len = 0; k < scp->use_sg; ++k, ++sgpnt) {
 608                if (active) {
 609                        kaddr = (unsigned char *)
 610                                kmap_atomic(sgpnt->page, KM_USER0);
 611                        if (NULL == kaddr)
 612                                return (DID_ERROR << 16);
 613                        kaddr_off = (unsigned char *)kaddr + sgpnt->offset;
 614                        len = sgpnt->length;
 615                        if ((req_len + len) > arr_len) {
 616                                active = 0;
 617                                len = arr_len - req_len;
 618                        }
 619                        memcpy(kaddr_off, arr + req_len, len);
 620                        kunmap_atomic(kaddr, KM_USER0);
 621                        act_len += len;
 622                }
 623                req_len += sgpnt->length;
 624        }
 625        if (scp->resid)
 626                scp->resid -= act_len;
 627        else
 628                scp->resid = req_len - act_len;
 629        return 0;
 630}
 631
 632/* Returns number of bytes fetched into 'arr' or -1 if error. */
 633static int fetch_to_dev_buffer(struct scsi_cmnd * scp, unsigned char * arr,
 634                               int max_arr_len)
 635{
 636        int k, req_len, len, fin;
 637        void * kaddr;
 638        void * kaddr_off;
 639        struct scatterlist * sgpnt;
 640
 641        if (0 == scp->request_bufflen)
 642                return 0;
 643        if (NULL == scp->request_buffer)
 644                return -1;
 645        if (! ((scp->sc_data_direction == DMA_BIDIRECTIONAL) ||
 646              (scp->sc_data_direction == DMA_TO_DEVICE)))
 647                return -1;
 648        if (0 == scp->use_sg) {
 649                req_len = scp->request_bufflen;
 650                len = (req_len < max_arr_len) ? req_len : max_arr_len;
 651                memcpy(arr, scp->request_buffer, len);
 652                return len;
 653        }
 654        sgpnt = (struct scatterlist *)scp->request_buffer;
 655        for (k = 0, req_len = 0, fin = 0; k < scp->use_sg; ++k, ++sgpnt) {
 656                kaddr = (unsigned char *)kmap_atomic(sgpnt->page, KM_USER0);
 657                if (NULL == kaddr)
 658                        return -1;
 659                kaddr_off = (unsigned char *)kaddr + sgpnt->offset;
 660                len = sgpnt->length;
 661                if ((req_len + len) > max_arr_len) {
 662                        len = max_arr_len - req_len;
 663                        fin = 1;
 664                }
 665                memcpy(arr + req_len, kaddr_off, len);
 666                kunmap_atomic(kaddr, KM_USER0);
 667                if (fin)
 668                        return req_len + len;
 669                req_len += sgpnt->length;
 670        }
 671        return req_len;
 672}
 673
 674
 675static const char * inq_vendor_id = "Linux   ";
 676static const char * inq_product_id = "scsi_debug      ";
 677static const char * inq_product_rev = "0004";
 678
 679static int inquiry_evpd_83(unsigned char * arr, int port_group_id,
 680                           int target_dev_id, int dev_id_num,
 681                           const char * dev_id_str,
 682                           int dev_id_str_len)
 683{
 684        int num, port_a;
 685        char b[32];
 686
 687        port_a = target_dev_id + 1;
 688        /* T10 vendor identifier field format (faked) */
 689        arr[0] = 0x2;   /* ASCII */
 690        arr[1] = 0x1;
 691        arr[2] = 0x0;
 692        memcpy(&arr[4], inq_vendor_id, 8);
 693        memcpy(&arr[12], inq_product_id, 16);
 694        memcpy(&arr[28], dev_id_str, dev_id_str_len);
 695        num = 8 + 16 + dev_id_str_len;
 696        arr[3] = num;
 697        num += 4;
 698        if (dev_id_num >= 0) {
 699                /* NAA-5, Logical unit identifier (binary) */
 700                arr[num++] = 0x1;       /* binary (not necessarily sas) */
 701                arr[num++] = 0x3;       /* PIV=0, lu, naa */
 702                arr[num++] = 0x0;
 703                arr[num++] = 0x8;
 704                arr[num++] = 0x53;  /* naa-5 ieee company id=0x333333 (fake) */
 705                arr[num++] = 0x33;
 706                arr[num++] = 0x33;
 707                arr[num++] = 0x30;
 708                arr[num++] = (dev_id_num >> 24);
 709                arr[num++] = (dev_id_num >> 16) & 0xff;
 710                arr[num++] = (dev_id_num >> 8) & 0xff;
 711                arr[num++] = dev_id_num & 0xff;
 712                /* Target relative port number */
 713                arr[num++] = 0x61;      /* proto=sas, binary */
 714                arr[num++] = 0x94;      /* PIV=1, target port, rel port */
 715                arr[num++] = 0x0;       /* reserved */
 716                arr[num++] = 0x4;       /* length */
 717                arr[num++] = 0x0;       /* reserved */
 718                arr[num++] = 0x0;       /* reserved */
 719                arr[num++] = 0x0;
 720                arr[num++] = 0x1;       /* relative port A */
 721        }
 722        /* NAA-5, Target port identifier */
 723        arr[num++] = 0x61;      /* proto=sas, binary */
 724        arr[num++] = 0x93;      /* piv=1, target port, naa */
 725        arr[num++] = 0x0;
 726        arr[num++] = 0x8;
 727        arr[num++] = 0x52;      /* naa-5, company id=0x222222 (fake) */
 728        arr[num++] = 0x22;
 729        arr[num++] = 0x22;
 730        arr[num++] = 0x20;
 731        arr[num++] = (port_a >> 24);
 732        arr[num++] = (port_a >> 16) & 0xff;
 733        arr[num++] = (port_a >> 8) & 0xff;
 734        arr[num++] = port_a & 0xff;
 735        /* NAA-5, Target port group identifier */
 736        arr[num++] = 0x61;      /* proto=sas, binary */
 737        arr[num++] = 0x95;      /* piv=1, target port group id */
 738        arr[num++] = 0x0;
 739        arr[num++] = 0x4;
 740        arr[num++] = 0;
 741        arr[num++] = 0;
 742        arr[num++] = (port_group_id >> 8) & 0xff;
 743        arr[num++] = port_group_id & 0xff;
 744        /* NAA-5, Target device identifier */
 745        arr[num++] = 0x61;      /* proto=sas, binary */
 746        arr[num++] = 0xa3;      /* piv=1, target device, naa */
 747        arr[num++] = 0x0;
 748        arr[num++] = 0x8;
 749        arr[num++] = 0x52;      /* naa-5, company id=0x222222 (fake) */
 750        arr[num++] = 0x22;
 751        arr[num++] = 0x22;
 752        arr[num++] = 0x20;
 753        arr[num++] = (target_dev_id >> 24);
 754        arr[num++] = (target_dev_id >> 16) & 0xff;
 755        arr[num++] = (target_dev_id >> 8) & 0xff;
 756        arr[num++] = target_dev_id & 0xff;
 757        /* SCSI name string: Target device identifier */
 758        arr[num++] = 0x63;      /* proto=sas, UTF-8 */
 759        arr[num++] = 0xa8;      /* piv=1, target device, SCSI name string */
 760        arr[num++] = 0x0;
 761        arr[num++] = 24;
 762        memcpy(arr + num, "naa.52222220", 12);
 763        num += 12;
 764        snprintf(b, sizeof(b), "%08X", target_dev_id);
 765        memcpy(arr + num, b, 8);
 766        num += 8;
 767        memset(arr + num, 0, 4);
 768        num += 4;
 769        return num;
 770}
 771
 772
 773static unsigned char vpd84_data[] = {
 774/* from 4th byte */ 0x22,0x22,0x22,0x0,0xbb,0x0,
 775    0x22,0x22,0x22,0x0,0xbb,0x1,
 776    0x22,0x22,0x22,0x0,0xbb,0x2,
 777};
 778
 779static int inquiry_evpd_84(unsigned char * arr)
 780{
 781        memcpy(arr, vpd84_data, sizeof(vpd84_data));
 782        return sizeof(vpd84_data);
 783}
 784
 785static int inquiry_evpd_85(unsigned char * arr)
 786{
 787        int num = 0;
 788        const char * na1 = "https://www.kernel.org/config";
 789        const char * na2 = "http://www.kernel.org/log";
 790        int plen, olen;
 791
 792        arr[num++] = 0x1;       /* lu, storage config */
 793        arr[num++] = 0x0;       /* reserved */
 794        arr[num++] = 0x0;
 795        olen = strlen(na1);
 796        plen = olen + 1;
 797        if (plen % 4)
 798                plen = ((plen / 4) + 1) * 4;
 799        arr[num++] = plen;      /* length, null termianted, padded */
 800        memcpy(arr + num, na1, olen);
 801        memset(arr + num + olen, 0, plen - olen);
 802        num += plen;
 803
 804        arr[num++] = 0x4;       /* lu, logging */
 805        arr[num++] = 0x0;       /* reserved */
 806        arr[num++] = 0x0;
 807        olen = strlen(na2);
 808        plen = olen + 1;
 809        if (plen % 4)
 810                plen = ((plen / 4) + 1) * 4;
 811        arr[num++] = plen;      /* length, null terminated, padded */
 812        memcpy(arr + num, na2, olen);
 813        memset(arr + num + olen, 0, plen - olen);
 814        num += plen;
 815
 816        return num;
 817}
 818
 819/* SCSI ports VPD page */
 820static int inquiry_evpd_88(unsigned char * arr, int target_dev_id)
 821{
 822        int num = 0;
 823        int port_a, port_b;
 824
 825        port_a = target_dev_id + 1;
 826        port_b = port_a + 1;
 827        arr[num++] = 0x0;       /* reserved */
 828        arr[num++] = 0x0;       /* reserved */
 829        arr[num++] = 0x0;
 830        arr[num++] = 0x1;       /* relative port 1 (primary) */
 831        memset(arr + num, 0, 6);
 832        num += 6;
 833        arr[num++] = 0x0;
 834        arr[num++] = 12;        /* length tp descriptor */
 835        /* naa-5 target port identifier (A) */
 836        arr[num++] = 0x61;      /* proto=sas, binary */
 837        arr[num++] = 0x93;      /* PIV=1, target port, NAA */
 838        arr[num++] = 0x0;       /* reserved */
 839        arr[num++] = 0x8;       /* length */
 840        arr[num++] = 0x52;      /* NAA-5, company_id=0x222222 (fake) */
 841        arr[num++] = 0x22;
 842        arr[num++] = 0x22;
 843        arr[num++] = 0x20;
 844        arr[num++] = (port_a >> 24);
 845        arr[num++] = (port_a >> 16) & 0xff;
 846        arr[num++] = (port_a >> 8) & 0xff;
 847        arr[num++] = port_a & 0xff;
 848
 849        arr[num++] = 0x0;       /* reserved */
 850        arr[num++] = 0x0;       /* reserved */
 851        arr[num++] = 0x0;
 852        arr[num++] = 0x2;       /* relative port 2 (secondary) */
 853        memset(arr + num, 0, 6);
 854        num += 6;
 855        arr[num++] = 0x0;
 856        arr[num++] = 12;        /* length tp descriptor */
 857        /* naa-5 target port identifier (B) */
 858        arr[num++] = 0x61;      /* proto=sas, binary */
 859        arr[num++] = 0x93;      /* PIV=1, target port, NAA */
 860        arr[num++] = 0x0;       /* reserved */
 861        arr[num++] = 0x8;       /* length */
 862        arr[num++] = 0x52;      /* NAA-5, company_id=0x222222 (fake) */
 863        arr[num++] = 0x22;
 864        arr[num++] = 0x22;
 865        arr[num++] = 0x20;
 866        arr[num++] = (port_b >> 24);
 867        arr[num++] = (port_b >> 16) & 0xff;
 868        arr[num++] = (port_b >> 8) & 0xff;
 869        arr[num++] = port_b & 0xff;
 870
 871        return num;
 872}
 873
 874
 875static unsigned char vpd89_data[] = {
 876/* from 4th byte */ 0,0,0,0,
 877'l','i','n','u','x',' ',' ',' ',
 878'S','A','T',' ','s','c','s','i','_','d','e','b','u','g',' ',' ',
 879'1','2','3','4',
 8800x34,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
 8810xec,0,0,0,
 8820x5a,0xc,0xff,0x3f,0x37,0xc8,0x10,0,0,0,0,0,0x3f,0,0,0,
 8830,0,0,0,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x20,0x20,0x20,0x20,
 8840x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0,0,0,0x40,0x4,0,0x2e,0x33,
 8850x38,0x31,0x20,0x20,0x20,0x20,0x54,0x53,0x38,0x33,0x30,0x30,0x33,0x31,
 8860x53,0x41,
 8870x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
 8880x20,0x20,
 8890x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
 8900x10,0x80,
 8910,0,0,0x2f,0,0,0,0x2,0,0x2,0x7,0,0xff,0xff,0x1,0,
 8920x3f,0,0xc1,0xff,0x3e,0,0x10,0x1,0xb0,0xf8,0x50,0x9,0,0,0x7,0,
 8930x3,0,0x78,0,0x78,0,0xf0,0,0x78,0,0,0,0,0,0,0,
 8940,0,0,0,0,0,0,0,0x2,0,0,0,0,0,0,0,
 8950x7e,0,0x1b,0,0x6b,0x34,0x1,0x7d,0x3,0x40,0x69,0x34,0x1,0x3c,0x3,0x40,
 8960x7f,0x40,0,0,0,0,0xfe,0xfe,0,0,0,0,0,0xfe,0,0,
 8970,0,0,0,0,0,0,0,0xb0,0xf8,0x50,0x9,0,0,0,0,
 8980,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 8990,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 9000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 9010x1,0,0xb0,0xf8,0x50,0x9,0xb0,0xf8,0x50,0x9,0x20,0x20,0x2,0,0xb6,0x42,
 9020,0x80,0x8a,0,0x6,0x3c,0xa,0x3c,0xff,0xff,0xc6,0x7,0,0x1,0,0x8,
 9030xf0,0xf,0,0x10,0x2,0,0x30,0,0,0,0,0,0,0,0x6,0xfe,
 9040,0,0x2,0,0x50,0,0x8a,0,0x4f,0x95,0,0,0x21,0,0xb,0,
 9050,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 9060,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 9070,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 9080,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 9090,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 9100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 9110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 9120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 9130,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 9140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 9150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 9160,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa5,0x51,
 917};
 918
 919static int inquiry_evpd_89(unsigned char * arr)
 920{
 921        memcpy(arr, vpd89_data, sizeof(vpd89_data));
 922        return sizeof(vpd89_data);
 923}
 924
 925
 926static unsigned char vpdb0_data[] = {
 927        /* from 4th byte */ 0,0,0,4,
 928        0,0,0x4,0,
 929        0,0,0,64,
 930};
 931
 932static int inquiry_evpd_b0(unsigned char * arr)
 933{
 934        memcpy(arr, vpdb0_data, sizeof(vpdb0_data));
 935        if (sdebug_store_sectors > 0x400) {
 936                arr[4] = (sdebug_store_sectors >> 24) & 0xff;
 937                arr[5] = (sdebug_store_sectors >> 16) & 0xff;
 938                arr[6] = (sdebug_store_sectors >> 8) & 0xff;
 939                arr[7] = sdebug_store_sectors & 0xff;
 940        }
 941        return sizeof(vpdb0_data);
 942}
 943
 944
 945#define SDEBUG_LONG_INQ_SZ 96
 946#define SDEBUG_MAX_INQ_ARR_SZ 584
 947
 948static int resp_inquiry(struct scsi_cmnd * scp, int target,
 949                        struct sdebug_dev_info * devip)
 950{
 951        unsigned char pq_pdt;
 952        unsigned char * arr;
 953        unsigned char *cmd = (unsigned char *)scp->cmnd;
 954        int alloc_len, n, ret;
 955
 956        alloc_len = (cmd[3] << 8) + cmd[4];
 957        arr = kzalloc(SDEBUG_MAX_INQ_ARR_SZ, GFP_KERNEL);
 958        if (devip->wlun)
 959                pq_pdt = 0x1e;  /* present, wlun */
 960        else if (scsi_debug_no_lun_0 && (0 == devip->lun))
 961                pq_pdt = 0x7f;  /* not present, no device type */
 962        else
 963                pq_pdt = (scsi_debug_ptype & 0x1f);
 964        arr[0] = pq_pdt;
 965        if (0x2 & cmd[1]) {  /* CMDDT bit set */
 966                mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
 967                                0);
 968                kfree(arr);
 969                return check_condition_result;
 970        } else if (0x1 & cmd[1]) {  /* EVPD bit set */
 971                int lu_id_num, port_group_id, target_dev_id, len;
 972                char lu_id_str[6];
 973                int host_no = devip->sdbg_host->shost->host_no;
 974                
 975                port_group_id = (((host_no + 1) & 0x7f) << 8) +
 976                    (devip->channel & 0x7f);
 977                if (0 == scsi_debug_vpd_use_hostno)
 978                        host_no = 0;
 979                lu_id_num = devip->wlun ? -1 : (((host_no + 1) * 2000) +
 980                            (devip->target * 1000) + devip->lun);
 981                target_dev_id = ((host_no + 1) * 2000) +
 982                                 (devip->target * 1000) - 3;
 983                len = scnprintf(lu_id_str, 6, "%d", lu_id_num);
 984                if (0 == cmd[2]) { /* supported vital product data pages */
 985                        arr[1] = cmd[2];        /*sanity */
 986                        n = 4;
 987                        arr[n++] = 0x0;   /* this page */
 988                        arr[n++] = 0x80;  /* unit serial number */
 989                        arr[n++] = 0x83;  /* device identification */
 990                        arr[n++] = 0x84;  /* software interface ident. */
 991                        arr[n++] = 0x85;  /* management network addresses */
 992                        arr[n++] = 0x86;  /* extended inquiry */
 993                        arr[n++] = 0x87;  /* mode page policy */
 994                        arr[n++] = 0x88;  /* SCSI ports */
 995                        arr[n++] = 0x89;  /* ATA information */
 996                        arr[n++] = 0xb0;  /* Block limits (SBC) */
 997                        arr[3] = n - 4;   /* number of supported VPD pages */
 998                } else if (0x80 == cmd[2]) { /* unit serial number */
 999                        arr[1] = cmd[2];        /*sanity */
1000                        arr[3] = len;
1001                        memcpy(&arr[4], lu_id_str, len);
1002                } else if (0x83 == cmd[2]) { /* device identification */
1003                        arr[1] = cmd[2];        /*sanity */
1004                        arr[3] = inquiry_evpd_83(&arr[4], port_group_id,
1005                                                 target_dev_id, lu_id_num,
1006                                                 lu_id_str, len);
1007                } else if (0x84 == cmd[2]) { /* Software interface ident. */
1008                        arr[1] = cmd[2];        /*sanity */
1009                        arr[3] = inquiry_evpd_84(&arr[4]);
1010                } else if (0x85 == cmd[2]) { /* Management network addresses */
1011                        arr[1] = cmd[2];        /*sanity */
1012                        arr[3] = inquiry_evpd_85(&arr[4]);
1013                } else if (0x86 == cmd[2]) { /* extended inquiry */
1014                        arr[1] = cmd[2];        /*sanity */
1015                        arr[3] = 0x3c;  /* number of following entries */
1016                        arr[4] = 0x0;   /* no protection stuff */
1017                        arr[5] = 0x7;   /* head of q, ordered + simple q's */
1018                } else if (0x87 == cmd[2]) { /* mode page policy */
1019                        arr[1] = cmd[2];        /*sanity */
1020                        arr[3] = 0x8;   /* number of following entries */
1021                        arr[4] = 0x2;   /* disconnect-reconnect mp */
1022                        arr[6] = 0x80;  /* mlus, shared */
1023                        arr[8] = 0x18;   /* protocol specific lu */
1024                        arr[10] = 0x82;  /* mlus, per initiator port */
1025                } else if (0x88 == cmd[2]) { /* SCSI Ports */
1026                        arr[1] = cmd[2];        /*sanity */
1027                        arr[3] = inquiry_evpd_88(&arr[4], target_dev_id);
1028                } else if (0x89 == cmd[2]) { /* ATA information */
1029                        arr[1] = cmd[2];        /*sanity */
1030                        n = inquiry_evpd_89(&arr[4]);
1031                        arr[2] = (n >> 8);
1032                        arr[3] = (n & 0xff);
1033                } else if (0xb0 == cmd[2]) { /* Block limits (SBC) */
1034                        arr[1] = cmd[2];        /*sanity */
1035                        arr[3] = inquiry_evpd_b0(&arr[4]);
1036                } else {
1037                        /* Illegal request, invalid field in cdb */
1038                        mk_sense_buffer(devip, ILLEGAL_REQUEST,
1039                                        INVALID_FIELD_IN_CDB, 0);
1040                        kfree(arr);
1041                        return check_condition_result;
1042                }
1043                len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len);
1044                ret = fill_from_dev_buffer(scp, arr,
1045                            min(len, SDEBUG_MAX_INQ_ARR_SZ));
1046                kfree(arr);
1047                return ret;
1048        }
1049        /* drops through here for a standard inquiry */
1050        arr[1] = DEV_REMOVEABLE(target) ? 0x80 : 0;     /* Removable disk */
1051        arr[2] = scsi_debug_scsi_level;
1052        arr[3] = 2;    /* response_data_format==2 */
1053        arr[4] = SDEBUG_LONG_INQ_SZ - 5;
1054        if (0 == scsi_debug_vpd_use_hostno)
1055                arr[5] = 0x10; /* claim: implicit TGPS */
1056        arr[6] = 0x10; /* claim: MultiP */
1057        /* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */
1058        arr[7] = 0xa; /* claim: LINKED + CMDQUE */
1059        memcpy(&arr[8], inq_vendor_id, 8);
1060        memcpy(&arr[16], inq_product_id, 16);
1061        memcpy(&arr[32], inq_product_rev, 4);
1062        /* version descriptors (2 bytes each) follow */
1063        arr[58] = 0x0; arr[59] = 0x77; /* SAM-3 ANSI */
1064        arr[60] = 0x3; arr[61] = 0x14;  /* SPC-3 ANSI */
1065        n = 62;
1066        if (scsi_debug_ptype == 0) {
1067                arr[n++] = 0x3; arr[n++] = 0x3d; /* SBC-2 ANSI */
1068        } else if (scsi_debug_ptype == 1) {
1069                arr[n++] = 0x3; arr[n++] = 0x60; /* SSC-2 no version */
1070        }
1071        arr[n++] = 0xc; arr[n++] = 0xf;  /* SAS-1.1 rev 10 */
1072        ret = fill_from_dev_buffer(scp, arr,
1073                            min(alloc_len, SDEBUG_LONG_INQ_SZ));
1074        kfree(arr);
1075        return ret;
1076}
1077
1078static int resp_requests(struct scsi_cmnd * scp,
1079                         struct sdebug_dev_info * devip)
1080{
1081        unsigned char * sbuff;
1082        unsigned char *cmd = (unsigned char *)scp->cmnd;
1083        unsigned char arr[SDEBUG_SENSE_LEN];
1084        int want_dsense;
1085        int len = 18;
1086
1087        memset(arr, 0, sizeof(arr));
1088        if (devip->reset == 1)
1089                mk_sense_buffer(devip, 0, NO_ADDITIONAL_SENSE, 0);
1090        want_dsense = !!(cmd[1] & 1) || scsi_debug_dsense;
1091        sbuff = devip->sense_buff;
1092        if ((iec_m_pg[2] & 0x4) && (6 == (iec_m_pg[3] & 0xf))) {
1093                if (want_dsense) {
1094                        arr[0] = 0x72;
1095                        arr[1] = 0x0;           /* NO_SENSE in sense_key */
1096                        arr[2] = THRESHOLD_EXCEEDED;
1097                        arr[3] = 0xff;          /* TEST set and MRIE==6 */
1098                } else {
1099                        arr[0] = 0x70;
1100                        arr[2] = 0x0;           /* NO_SENSE in sense_key */
1101                        arr[7] = 0xa;           /* 18 byte sense buffer */
1102                        arr[12] = THRESHOLD_EXCEEDED;
1103                        arr[13] = 0xff;         /* TEST set and MRIE==6 */
1104                }
1105        } else {
1106                memcpy(arr, sbuff, SDEBUG_SENSE_LEN);
1107                if ((cmd[1] & 1) && (! scsi_debug_dsense)) {
1108                        /* DESC bit set and sense_buff in fixed format */
1109                        memset(arr, 0, sizeof(arr));
1110                        arr[0] = 0x72;
1111                        arr[1] = sbuff[2];     /* sense key */
1112                        arr[2] = sbuff[12];    /* asc */
1113                        arr[3] = sbuff[13];    /* ascq */
1114                        len = 8;
1115                }
1116        }
1117        mk_sense_buffer(devip, 0, NO_ADDITIONAL_SENSE, 0);
1118        return fill_from_dev_buffer(scp, arr, len);
1119}
1120
1121static int resp_start_stop(struct scsi_cmnd * scp,
1122                           struct sdebug_dev_info * devip)
1123{
1124        unsigned char *cmd = (unsigned char *)scp->cmnd;
1125        int power_cond, errsts, start;
1126
1127        if ((errsts = check_readiness(scp, 1, devip)))
1128                return errsts;
1129        power_cond = (cmd[4] & 0xf0) >> 4;
1130        if (power_cond) {
1131                mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1132                                0);
1133                return check_condition_result;
1134        }
1135        start = cmd[4] & 1;
1136        if (start == devip->stopped)
1137                devip->stopped = !start;
1138        return 0;
1139}
1140
1141#define SDEBUG_READCAP_ARR_SZ 8
1142static int resp_readcap(struct scsi_cmnd * scp,
1143                        struct sdebug_dev_info * devip)
1144{
1145        unsigned char arr[SDEBUG_READCAP_ARR_SZ];
1146        unsigned int capac;
1147        int errsts;
1148
1149        if ((errsts = check_readiness(scp, 1, devip)))
1150                return errsts;
1151        /* following just in case virtual_gb changed */
1152        if (scsi_debug_virtual_gb > 0) {
1153                sdebug_capacity = 2048 * 1024;
1154                sdebug_capacity *= scsi_debug_virtual_gb;
1155        } else
1156                sdebug_capacity = sdebug_store_sectors;
1157        memset(arr, 0, SDEBUG_READCAP_ARR_SZ);
1158        if (sdebug_capacity < 0xffffffff) {
1159                capac = (unsigned int)sdebug_capacity - 1;
1160                arr[0] = (capac >> 24);
1161                arr[1] = (capac >> 16) & 0xff;
1162                arr[2] = (capac >> 8) & 0xff;
1163                arr[3] = capac & 0xff;
1164        } else {
1165                arr[0] = 0xff;
1166                arr[1] = 0xff;
1167                arr[2] = 0xff;
1168                arr[3] = 0xff;
1169        }
1170        arr[6] = (SECT_SIZE_PER(target) >> 8) & 0xff;
1171        arr[7] = SECT_SIZE_PER(target) & 0xff;
1172        return fill_from_dev_buffer(scp, arr, SDEBUG_READCAP_ARR_SZ);
1173}
1174
1175#define SDEBUG_READCAP16_ARR_SZ 32
1176static int resp_readcap16(struct scsi_cmnd * scp,
1177                          struct sdebug_dev_info * devip)
1178{
1179        unsigned char *cmd = (unsigned char *)scp->cmnd;
1180        unsigned char arr[SDEBUG_READCAP16_ARR_SZ];
1181        unsigned long long capac;
1182        int errsts, k, alloc_len;
1183
1184        if ((errsts = check_readiness(scp, 1, devip)))
1185                return errsts;
1186        alloc_len = ((cmd[10] << 24) + (cmd[11] << 16) + (cmd[12] << 8)
1187                     + cmd[13]);
1188        /* following just in case virtual_gb changed */
1189        if (scsi_debug_virtual_gb > 0) {
1190                sdebug_capacity = 2048 * 1024;
1191                sdebug_capacity *= scsi_debug_virtual_gb;
1192        } else
1193                sdebug_capacity = sdebug_store_sectors;
1194        memset(arr, 0, SDEBUG_READCAP16_ARR_SZ);
1195        capac = sdebug_capacity - 1;
1196        for (k = 0; k < 8; ++k, capac >>= 8)
1197                arr[7 - k] = capac & 0xff;
1198        arr[8] = (SECT_SIZE_PER(target) >> 24) & 0xff;
1199        arr[9] = (SECT_SIZE_PER(target) >> 16) & 0xff;
1200        arr[10] = (SECT_SIZE_PER(target) >> 8) & 0xff;
1201        arr[11] = SECT_SIZE_PER(target) & 0xff;
1202        return fill_from_dev_buffer(scp, arr,
1203                                    min(alloc_len, SDEBUG_READCAP16_ARR_SZ));
1204}
1205
1206#define SDEBUG_MAX_TGTPGS_ARR_SZ 1412
1207
1208static int resp_report_tgtpgs(struct scsi_cmnd * scp,
1209                              struct sdebug_dev_info * devip)
1210{
1211        unsigned char *cmd = (unsigned char *)scp->cmnd;
1212        unsigned char * arr;
1213        int host_no = devip->sdbg_host->shost->host_no;
1214        int n, ret, alen, rlen;
1215        int port_group_a, port_group_b, port_a, port_b;
1216
1217        alen = ((cmd[6] << 24) + (cmd[7] << 16) + (cmd[8] << 8)
1218                + cmd[9]);
1219
1220        arr = kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ, GFP_KERNEL);
1221        /*
1222         * EVPD page 0x88 states we have two ports, one
1223         * real and a fake port with no device connected.
1224         * So we create two port groups with one port each
1225         * and set the group with port B to unavailable.
1226         */
1227        port_a = 0x1; /* relative port A */
1228        port_b = 0x2; /* relative port B */
1229        port_group_a = (((host_no + 1) & 0x7f) << 8) +
1230            (devip->channel & 0x7f);
1231        port_group_b = (((host_no + 1) & 0x7f) << 8) +
1232            (devip->channel & 0x7f) + 0x80;
1233
1234        /*
1235         * The asymmetric access state is cycled according to the host_id.
1236         */
1237        n = 4;
1238        if (0 == scsi_debug_vpd_use_hostno) {
1239            arr[n++] = host_no % 3; /* Asymm access state */
1240            arr[n++] = 0x0F; /* claim: all states are supported */
1241        } else {
1242            arr[n++] = 0x0; /* Active/Optimized path */
1243            arr[n++] = 0x01; /* claim: only support active/optimized paths */
1244        }
1245        arr[n++] = (port_group_a >> 8) & 0xff;
1246        arr[n++] = port_group_a & 0xff;
1247        arr[n++] = 0;    /* Reserved */
1248        arr[n++] = 0;    /* Status code */
1249        arr[n++] = 0;    /* Vendor unique */
1250        arr[n++] = 0x1;  /* One port per group */
1251        arr[n++] = 0;    /* Reserved */
1252        arr[n++] = 0;    /* Reserved */
1253        arr[n++] = (port_a >> 8) & 0xff;
1254        arr[n++] = port_a & 0xff;
1255        arr[n++] = 3;    /* Port unavailable */
1256        arr[n++] = 0x08; /* claim: only unavailalbe paths are supported */
1257        arr[n++] = (port_group_b >> 8) & 0xff;
1258        arr[n++] = port_group_b & 0xff;
1259        arr[n++] = 0;    /* Reserved */
1260        arr[n++] = 0;    /* Status code */
1261        arr[n++] = 0;    /* Vendor unique */
1262        arr[n++] = 0x1;  /* One port per group */
1263        arr[n++] = 0;    /* Reserved */
1264        arr[n++] = 0;    /* Reserved */
1265        arr[n++] = (port_b >> 8) & 0xff;
1266        arr[n++] = port_b & 0xff;
1267
1268        rlen = n - 4;
1269        arr[0] = (rlen >> 24) & 0xff;
1270        arr[1] = (rlen >> 16) & 0xff;
1271        arr[2] = (rlen >> 8) & 0xff;
1272        arr[3] = rlen & 0xff;
1273
1274        /*
1275         * Return the smallest value of either
1276         * - The allocated length
1277         * - The constructed command length
1278         * - The maximum array size
1279         */
1280        rlen = min(alen,n);
1281        ret = fill_from_dev_buffer(scp, arr,
1282                                   min(rlen, SDEBUG_MAX_TGTPGS_ARR_SZ));
1283        kfree(arr);
1284        return ret;
1285}
1286
1287/* <<Following mode page info copied from ST318451LW>> */
1288
1289static int resp_err_recov_pg(unsigned char * p, int pcontrol, int target)
1290{       /* Read-Write Error Recovery page for mode_sense */
1291        unsigned char err_recov_pg[] = {0x1, 0xa, 0xc0, 11, 240, 0, 0, 0,
1292                                        5, 0, 0xff, 0xff};
1293
1294        memcpy(p, err_recov_pg, sizeof(err_recov_pg));
1295        if (1 == pcontrol)
1296                memset(p + 2, 0, sizeof(err_recov_pg) - 2);
1297        return sizeof(err_recov_pg);
1298}
1299
1300static int resp_disconnect_pg(unsigned char * p, int pcontrol, int target)
1301{       /* Disconnect-Reconnect page for mode_sense */
1302        unsigned char disconnect_pg[] = {0x2, 0xe, 128, 128, 0, 10, 0, 0,
1303                                         0, 0, 0, 0, 0, 0, 0, 0};
1304
1305        memcpy(p, disconnect_pg, sizeof(disconnect_pg));
1306        if (1 == pcontrol)
1307                memset(p + 2, 0, sizeof(disconnect_pg) - 2);
1308        return sizeof(disconnect_pg);
1309}
1310
1311static int resp_format_pg(unsigned char * p, int pcontrol, int target)
1312{       /* Format device page for mode_sense */
1313        unsigned char format_pg[] = {0x3, 0x16, 0, 0, 0, 0, 0, 0,
1314                                     0, 0, 0, 0, 0, 0, 0, 0,
1315                                     0, 0, 0, 0, 0x40, 0, 0, 0};
1316
1317        memcpy(p, format_pg, sizeof(format_pg));
1318        p[10] = (sdebug_sectors_per >> 8) & 0xff;
1319        p[11] = sdebug_sectors_per & 0xff;
1320        p[12] = (SECT_SIZE >> 8) & 0xff;
1321        p[13] = SECT_SIZE & 0xff;
1322        if (DEV_REMOVEABLE(target))
1323                p[20] |= 0x20; /* should agree with INQUIRY */
1324        if (1 == pcontrol)
1325                memset(p + 2, 0, sizeof(format_pg) - 2);
1326        return sizeof(format_pg);
1327}
1328
1329static int resp_caching_pg(unsigned char * p, int pcontrol, int target)
1330{       /* Caching page for mode_sense */
1331        unsigned char caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
1332                0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0,     0, 0, 0, 0};
1333
1334        memcpy(p, caching_pg, sizeof(caching_pg));
1335        if (1 == pcontrol)
1336                memset(p + 2, 0, sizeof(caching_pg) - 2);
1337        return sizeof(caching_pg);
1338}
1339
1340static int resp_ctrl_m_pg(unsigned char * p, int pcontrol, int target)
1341{       /* Control mode page for mode_sense */
1342        unsigned char ch_ctrl_m_pg[] = {/* 0xa, 10, */ 0x6, 0, 0, 0, 0, 0,
1343                                        0, 0, 0, 0};
1344        unsigned char d_ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
1345                                     0, 0, 0x2, 0x4b};
1346
1347        if (scsi_debug_dsense)
1348                ctrl_m_pg[2] |= 0x4;
1349        else
1350                ctrl_m_pg[2] &= ~0x4;
1351        memcpy(p, ctrl_m_pg, sizeof(ctrl_m_pg));
1352        if (1 == pcontrol)
1353                memcpy(p + 2, ch_ctrl_m_pg, sizeof(ch_ctrl_m_pg));
1354        else if (2 == pcontrol)
1355                memcpy(p, d_ctrl_m_pg, sizeof(d_ctrl_m_pg));
1356        return sizeof(ctrl_m_pg);
1357}
1358
1359
1360static int resp_iec_m_pg(unsigned char * p, int pcontrol, int target)
1361{       /* Informational Exceptions control mode page for mode_sense */
1362        unsigned char ch_iec_m_pg[] = {/* 0x1c, 0xa, */ 0x4, 0xf, 0, 0, 0, 0,
1363                                       0, 0, 0x0, 0x0};
1364        unsigned char d_iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
1365                                      0, 0, 0x0, 0x0};
1366
1367        memcpy(p, iec_m_pg, sizeof(iec_m_pg));
1368        if (1 == pcontrol)
1369                memcpy(p + 2, ch_iec_m_pg, sizeof(ch_iec_m_pg));
1370        else if (2 == pcontrol)
1371                memcpy(p, d_iec_m_pg, sizeof(d_iec_m_pg));
1372        return sizeof(iec_m_pg);
1373}
1374
1375static int resp_sas_sf_m_pg(unsigned char * p, int pcontrol, int target)
1376{       /* SAS SSP mode page - short format for mode_sense */
1377        unsigned char sas_sf_m_pg[] = {0x19, 0x6,
1378                0x6, 0x0, 0x7, 0xd0, 0x0, 0x0};
1379
1380        memcpy(p, sas_sf_m_pg, sizeof(sas_sf_m_pg));
1381        if (1 == pcontrol)
1382                memset(p + 2, 0, sizeof(sas_sf_m_pg) - 2);
1383        return sizeof(sas_sf_m_pg);
1384}
1385
1386
1387static int resp_sas_pcd_m_spg(unsigned char * p, int pcontrol, int target,
1388                              int target_dev_id)
1389{       /* SAS phy control and discover mode page for mode_sense */
1390        unsigned char sas_pcd_m_pg[] = {0x59, 0x1, 0, 0x64, 0, 0x6, 0, 2,
1391                    0, 0, 0, 0, 0x10, 0x9, 0x8, 0x0,
1392                    0x52, 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0,
1393                    0x51, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x1,
1394                    0x2, 0, 0, 0, 0, 0, 0, 0,
1395                    0x88, 0x99, 0, 0, 0, 0, 0, 0,
1396                    0, 0, 0, 0, 0, 0, 0, 0,
1397                    0, 1, 0, 0, 0x10, 0x9, 0x8, 0x0,
1398                    0x52, 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0,
1399                    0x51, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x1,
1400                    0x3, 0, 0, 0, 0, 0, 0, 0,
1401                    0x88, 0x99, 0, 0, 0, 0, 0, 0,
1402                    0, 0, 0, 0, 0, 0, 0, 0,
1403                };
1404        int port_a, port_b;
1405
1406        port_a = target_dev_id + 1;
1407        port_b = port_a + 1;
1408        memcpy(p, sas_pcd_m_pg, sizeof(sas_pcd_m_pg));
1409        p[20] = (port_a >> 24);
1410        p[21] = (port_a >> 16) & 0xff;
1411        p[22] = (port_a >> 8) & 0xff;
1412        p[23] = port_a & 0xff;
1413        p[48 + 20] = (port_b >> 24);
1414        p[48 + 21] = (port_b >> 16) & 0xff;
1415        p[48 + 22] = (port_b >> 8) & 0xff;
1416        p[48 + 23] = port_b & 0xff;
1417        if (1 == pcontrol)
1418                memset(p + 4, 0, sizeof(sas_pcd_m_pg) - 4);
1419        return sizeof(sas_pcd_m_pg);
1420}
1421
1422static int resp_sas_sha_m_spg(unsigned char * p, int pcontrol)
1423{       /* SAS SSP shared protocol specific port mode subpage */
1424        unsigned char sas_sha_m_pg[] = {0x59, 0x2, 0, 0xc, 0, 0x6, 0x10, 0,
1425                    0, 0, 0, 0, 0, 0, 0, 0,
1426                };
1427
1428        memcpy(p, sas_sha_m_pg, sizeof(sas_sha_m_pg));
1429        if (1 == pcontrol)
1430                memset(p + 4, 0, sizeof(sas_sha_m_pg) - 4);
1431        return sizeof(sas_sha_m_pg);
1432}
1433
1434#define SDEBUG_MAX_MSENSE_SZ 256
1435
1436static int resp_mode_sense(struct scsi_cmnd * scp, int target,
1437                           struct sdebug_dev_info * devip)
1438{
1439        unsigned char dbd, llbaa;
1440        int pcontrol, pcode, subpcode, bd_len;
1441        unsigned char dev_spec;
1442        int k, alloc_len, msense_6, offset, len, errsts, target_dev_id;
1443        unsigned char * ap;
1444        unsigned char arr[SDEBUG_MAX_MSENSE_SZ];
1445        unsigned char *cmd = (unsigned char *)scp->cmnd;
1446
1447        if ((errsts = check_readiness(scp, 1, devip)))
1448                return errsts;
1449        dbd = !!(cmd[1] & 0x8);
1450        pcontrol = (cmd[2] & 0xc0) >> 6;
1451        pcode = cmd[2] & 0x3f;
1452        subpcode = cmd[3];
1453        msense_6 = (MODE_SENSE == cmd[0]);
1454        llbaa = msense_6 ? 0 : !!(cmd[1] & 0x10);
1455        if ((0 == scsi_debug_ptype) && (0 == dbd))
1456                bd_len = llbaa ? 16 : 8;
1457        else
1458                bd_len = 0;
1459        alloc_len = msense_6 ? cmd[4] : ((cmd[7] << 8) | cmd[8]);
1460        memset(arr, 0, SDEBUG_MAX_MSENSE_SZ);
1461        if (0x3 == pcontrol) {  /* Saving values not supported */
1462                mk_sense_buffer(devip, ILLEGAL_REQUEST, SAVING_PARAMS_UNSUP,
1463                                0);
1464                return check_condition_result;
1465        }
1466        target_dev_id = ((devip->sdbg_host->shost->host_no + 1) * 2000) +
1467                        (devip->target * 1000) - 3;
1468        /* set DPOFUA bit for disks */
1469        if (0 == scsi_debug_ptype)
1470                dev_spec = (DEV_READONLY(target) ? 0x80 : 0x0) | 0x10;
1471        else
1472                dev_spec = 0x0;
1473        if (msense_6) {
1474                arr[2] = dev_spec;
1475                arr[3] = bd_len;
1476                offset = 4;
1477        } else {
1478                arr[3] = dev_spec;
1479                if (16 == bd_len)
1480                        arr[4] = 0x1;   /* set LONGLBA bit */
1481                arr[7] = bd_len;        /* assume 255 or less */
1482                offset = 8;
1483        }
1484        ap = arr + offset;
1485        if ((bd_len > 0) && (0 == sdebug_capacity)) {
1486                if (scsi_debug_virtual_gb > 0) {
1487                        sdebug_capacity = 2048 * 1024;
1488                        sdebug_capacity *= scsi_debug_virtual_gb;
1489                } else
1490                        sdebug_capacity = sdebug_store_sectors;
1491        }
1492        if (8 == bd_len) {
1493                if (sdebug_capacity > 0xfffffffe) {
1494                        ap[0] = 0xff;
1495                        ap[1] = 0xff;
1496                        ap[2] = 0xff;
1497                        ap[3] = 0xff;
1498                } else {
1499                        ap[0] = (sdebug_capacity >> 24) & 0xff;
1500                        ap[1] = (sdebug_capacity >> 16) & 0xff;
1501                        ap[2] = (sdebug_capacity >> 8) & 0xff;
1502                        ap[3] = sdebug_capacity & 0xff;
1503                }
1504                ap[6] = (SECT_SIZE_PER(target) >> 8) & 0xff;
1505                ap[7] = SECT_SIZE_PER(target) & 0xff;
1506                offset += bd_len;
1507                ap = arr + offset;
1508        } else if (16 == bd_len) {
1509                unsigned long long capac = sdebug_capacity;
1510
1511                for (k = 0; k < 8; ++k, capac >>= 8)
1512                        ap[7 - k] = capac & 0xff;
1513                ap[12] = (SECT_SIZE_PER(target) >> 24) & 0xff;
1514                ap[13] = (SECT_SIZE_PER(target) >> 16) & 0xff;
1515                ap[14] = (SECT_SIZE_PER(target) >> 8) & 0xff;
1516                ap[15] = SECT_SIZE_PER(target) & 0xff;
1517                offset += bd_len;
1518                ap = arr + offset;
1519        }
1520
1521        if ((subpcode > 0x0) && (subpcode < 0xff) && (0x19 != pcode)) {
1522                /* TODO: Control Extension page */
1523                mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1524                                0);
1525                return check_condition_result;
1526        }
1527        switch (pcode) {
1528        case 0x1:       /* Read-Write error recovery page, direct access */
1529                len = resp_err_recov_pg(ap, pcontrol, target);
1530                offset += len;
1531                break;
1532        case 0x2:       /* Disconnect-Reconnect page, all devices */
1533                len = resp_disconnect_pg(ap, pcontrol, target);
1534                offset += len;
1535                break;
1536        case 0x3:       /* Format device page, direct access */
1537                len = resp_format_pg(ap, pcontrol, target);
1538                offset += len;
1539                break;
1540        case 0x8:       /* Caching page, direct access */
1541                len = resp_caching_pg(ap, pcontrol, target);
1542                offset += len;
1543                break;
1544        case 0xa:       /* Control Mode page, all devices */
1545                len = resp_ctrl_m_pg(ap, pcontrol, target);
1546                offset += len;
1547                break;
1548        case 0x19:      /* if spc==1 then sas phy, control+discover */
1549                if ((subpcode > 0x2) && (subpcode < 0xff)) {
1550                        mk_sense_buffer(devip, ILLEGAL_REQUEST,
1551                                        INVALID_FIELD_IN_CDB, 0);
1552                        return check_condition_result;
1553                }
1554                len = 0;
1555                if ((0x0 == subpcode) || (0xff == subpcode))
1556                        len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
1557                if ((0x1 == subpcode) || (0xff == subpcode))
1558                        len += resp_sas_pcd_m_spg(ap + len, pcontrol, target,
1559                                                  target_dev_id);
1560                if ((0x2 == subpcode) || (0xff == subpcode))
1561                        len += resp_sas_sha_m_spg(ap + len, pcontrol);
1562                offset += len;
1563                break;
1564        case 0x1c:      /* Informational Exceptions Mode page, all devices */
1565                len = resp_iec_m_pg(ap, pcontrol, target);
1566                offset += len;
1567                break;
1568        case 0x3f:      /* Read all Mode pages */
1569                if ((0 == subpcode) || (0xff == subpcode)) {
1570                        len = resp_err_recov_pg(ap, pcontrol, target);
1571                        len += resp_disconnect_pg(ap + len, pcontrol, target);
1572                        len += resp_format_pg(ap + len, pcontrol, target);
1573                        len += resp_caching_pg(ap + len, pcontrol, target);
1574                        len += resp_ctrl_m_pg(ap + len, pcontrol, target);
1575                        len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
1576                        if (0xff == subpcode) {
1577                                len += resp_sas_pcd_m_spg(ap + len, pcontrol,
1578                                                  target, target_dev_id);
1579                                len += resp_sas_sha_m_spg(ap + len, pcontrol);
1580                        }
1581                        len += resp_iec_m_pg(ap + len, pcontrol, target);
1582                } else {
1583                        mk_sense_buffer(devip, ILLEGAL_REQUEST,
1584                                        INVALID_FIELD_IN_CDB, 0);
1585                        return check_condition_result;
1586                }
1587                offset += len;
1588                break;
1589        default:
1590                mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1591                                0);
1592                return check_condition_result;
1593        }
1594        if (msense_6)
1595                arr[0] = offset - 1;
1596        else {
1597                arr[0] = ((offset - 2) >> 8) & 0xff;
1598                arr[1] = (offset - 2) & 0xff;
1599        }
1600        return fill_from_dev_buffer(scp, arr, min(alloc_len, offset));
1601}
1602
1603#define SDEBUG_MAX_MSELECT_SZ 512
1604
1605static int resp_mode_select(struct scsi_cmnd * scp, int mselect6,
1606                            struct sdebug_dev_info * devip)
1607{
1608        int pf, sp, ps, md_len, bd_len, off, spf, pg_len;
1609        int param_len, res, errsts, mpage;
1610        unsigned char arr[SDEBUG_MAX_MSELECT_SZ];
1611        unsigned char *cmd = (unsigned char *)scp->cmnd;
1612
1613        if ((errsts = check_readiness(scp, 1, devip)))
1614                return errsts;
1615        memset(arr, 0, sizeof(arr));
1616        pf = cmd[1] & 0x10;
1617        sp = cmd[1] & 0x1;
1618        param_len = mselect6 ? cmd[4] : ((cmd[7] << 8) + cmd[8]);
1619        if ((0 == pf) || sp || (param_len > SDEBUG_MAX_MSELECT_SZ)) {
1620                mk_sense_buffer(devip, ILLEGAL_REQUEST,
1621                                INVALID_FIELD_IN_CDB, 0);
1622                return check_condition_result;
1623        }
1624        res = fetch_to_dev_buffer(scp, arr, param_len);
1625        if (-1 == res)
1626                return (DID_ERROR << 16);
1627        else if ((res < param_len) &&
1628                 (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
1629                printk(KERN_INFO "scsi_debug: mode_select: cdb indicated=%d, "
1630                       " IO sent=%d bytes\n", param_len, res);
1631        md_len = mselect6 ? (arr[0] + 1) : ((arr[0] << 8) + arr[1] + 2);
1632        bd_len = mselect6 ? arr[3] : ((arr[6] << 8) + arr[7]);
1633        if (md_len > 2) {
1634                mk_sense_buffer(devip, ILLEGAL_REQUEST,
1635                                INVALID_FIELD_IN_PARAM_LIST, 0);
1636                return check_condition_result;
1637        }
1638        off = bd_len + (mselect6 ? 4 : 8);
1639        mpage = arr[off] & 0x3f;
1640        ps = !!(arr[off] & 0x80);
1641        if (ps) {
1642                mk_sense_buffer(devip, ILLEGAL_REQUEST,
1643                                INVALID_FIELD_IN_PARAM_LIST, 0);
1644                return check_condition_result;
1645        }
1646        spf = !!(arr[off] & 0x40);
1647        pg_len = spf ? ((arr[off + 2] << 8) + arr[off + 3] + 4) :
1648                       (arr[off + 1] + 2);
1649        if ((pg_len + off) > param_len) {
1650                mk_sense_buffer(devip, ILLEGAL_REQUEST,
1651                                PARAMETER_LIST_LENGTH_ERR, 0);
1652                return check_condition_result;
1653        }
1654        switch (mpage) {
1655        case 0xa:      /* Control Mode page */
1656                if (ctrl_m_pg[1] == arr[off + 1]) {
1657                        memcpy(ctrl_m_pg + 2, arr + off + 2,
1658                               sizeof(ctrl_m_pg) - 2);
1659                        scsi_debug_dsense = !!(ctrl_m_pg[2] & 0x4);
1660                        return 0;
1661                }
1662                break;
1663        case 0x1c:      /* Informational Exceptions Mode page */
1664                if (iec_m_pg[1] == arr[off + 1]) {
1665                        memcpy(iec_m_pg + 2, arr + off + 2,
1666                               sizeof(iec_m_pg) - 2);
1667                        return 0;
1668                }
1669                break;
1670        default:
1671                break;
1672        }
1673        mk_sense_buffer(devip, ILLEGAL_REQUEST,
1674                        INVALID_FIELD_IN_PARAM_LIST, 0);
1675        return check_condition_result;
1676}
1677
1678static int resp_temp_l_pg(unsigned char * arr)
1679{
1680        unsigned char temp_l_pg[] = {0x0, 0x0, 0x3, 0x2, 0x0, 38,
1681                                     0x0, 0x1, 0x3, 0x2, 0x0, 65,
1682                };
1683
1684        memcpy(arr, temp_l_pg, sizeof(temp_l_pg));
1685        return sizeof(temp_l_pg);
1686}
1687
1688static int resp_ie_l_pg(unsigned char * arr)
1689{
1690        unsigned char ie_l_pg[] = {0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 38,
1691                };
1692
1693        memcpy(arr, ie_l_pg, sizeof(ie_l_pg));
1694        if (iec_m_pg[2] & 0x4) {        /* TEST bit set */
1695                arr[4] = THRESHOLD_EXCEEDED;
1696                arr[5] = 0xff;
1697        }
1698        return sizeof(ie_l_pg);
1699}
1700
1701#define SDEBUG_MAX_LSENSE_SZ 512
1702
1703static int resp_log_sense(struct scsi_cmnd * scp,
1704                          struct sdebug_dev_info * devip)
1705{
1706        int ppc, sp, pcontrol, pcode, subpcode, alloc_len, errsts, len, n;
1707        unsigned char arr[SDEBUG_MAX_LSENSE_SZ];
1708        unsigned char *cmd = (unsigned char *)scp->cmnd;
1709
1710        if ((errsts = check_readiness(scp, 1, devip)))
1711                return errsts;
1712        memset(arr, 0, sizeof(arr));
1713        ppc = cmd[1] & 0x2;
1714        sp = cmd[1] & 0x1;
1715        if (ppc || sp) {
1716                mk_sense_buffer(devip, ILLEGAL_REQUEST,
1717                                INVALID_FIELD_IN_CDB, 0);
1718                return check_condition_result;
1719        }
1720        pcontrol = (cmd[2] & 0xc0) >> 6;
1721        pcode = cmd[2] & 0x3f;
1722        subpcode = cmd[3] & 0xff;
1723        alloc_len = (cmd[7] << 8) + cmd[8];
1724        arr[0] = pcode;
1725        if (0 == subpcode) {
1726                switch (pcode) {
1727                case 0x0:       /* Supported log pages log page */
1728                        n = 4;
1729                        arr[n++] = 0x0;         /* this page */
1730                        arr[n++] = 0xd;         /* Temperature */
1731                        arr[n++] = 0x2f;        /* Informational exceptions */
1732                        arr[3] = n - 4;
1733                        break;
1734                case 0xd:       /* Temperature log page */
1735                        arr[3] = resp_temp_l_pg(arr + 4);
1736                        break;
1737                case 0x2f:      /* Informational exceptions log page */
1738                        arr[3] = resp_ie_l_pg(arr + 4);
1739                        break;
1740                default:
1741                        mk_sense_buffer(devip, ILLEGAL_REQUEST,
1742                                        INVALID_FIELD_IN_CDB, 0);
1743                        return check_condition_result;
1744                }
1745        } else if (0xff == subpcode) {
1746                arr[0] |= 0x40;
1747                arr[1] = subpcode;
1748                switch (pcode) {
1749                case 0x0:       /* Supported log pages and subpages log page */
1750                        n = 4;
1751                        arr[n++] = 0x0;
1752                        arr[n++] = 0x0;         /* 0,0 page */
1753                        arr[n++] = 0x0;
1754                        arr[n++] = 0xff;        /* this page */
1755                        arr[n++] = 0xd;
1756                        arr[n++] = 0x0;         /* Temperature */
1757                        arr[n++] = 0x2f;
1758                        arr[n++] = 0x0; /* Informational exceptions */
1759                        arr[3] = n - 4;
1760                        break;
1761                case 0xd:       /* Temperature subpages */
1762                        n = 4;
1763                        arr[n++] = 0xd;
1764                        arr[n++] = 0x0;         /* Temperature */
1765                        arr[3] = n - 4;
1766                        break;
1767                case 0x2f:      /* Informational exceptions subpages */
1768                        n = 4;
1769                        arr[n++] = 0x2f;
1770                        arr[n++] = 0x0;         /* Informational exceptions */
1771                        arr[3] = n - 4;
1772                        break;
1773                default:
1774                        mk_sense_buffer(devip, ILLEGAL_REQUEST,
1775                                        INVALID_FIELD_IN_CDB, 0);
1776                        return check_condition_result;
1777                }
1778        } else {
1779                mk_sense_buffer(devip, ILLEGAL_REQUEST,
1780                                INVALID_FIELD_IN_CDB, 0);
1781                return check_condition_result;
1782        }
1783        len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len);
1784        return fill_from_dev_buffer(scp, arr,
1785                    min(len, SDEBUG_MAX_INQ_ARR_SZ));
1786}
1787
1788static int resp_read(struct scsi_cmnd * SCpnt, unsigned long long lba,
1789                     unsigned int num, struct sdebug_dev_info * devip)
1790{
1791        unsigned long iflags;
1792        unsigned int block, from_bottom;
1793        unsigned long long u;
1794        int ret;
1795
1796        if (lba + num > sdebug_capacity) {
1797                mk_sense_buffer(devip, ILLEGAL_REQUEST, ADDR_OUT_OF_RANGE,
1798                                0);
1799                return check_condition_result;
1800        }
1801        /* transfer length excessive (tie in to block limits VPD page) */
1802        if (num > sdebug_store_sectors) {
1803                mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1804                                0);
1805                return check_condition_result;
1806        }
1807        if ((SCSI_DEBUG_OPT_MEDIUM_ERR & scsi_debug_opts) &&
1808            (lba <= OPT_MEDIUM_ERR_ADDR) &&
1809            ((lba + num) > OPT_MEDIUM_ERR_ADDR)) {
1810                /* claim unrecoverable read error */
1811                mk_sense_buffer(devip, MEDIUM_ERROR, UNRECOVERED_READ_ERR,
1812                                0);
1813                /* set info field and valid bit for fixed descriptor */
1814                if (0x70 == (devip->sense_buff[0] & 0x7f)) {
1815                        devip->sense_buff[0] |= 0x80;   /* Valid bit */
1816                        ret = OPT_MEDIUM_ERR_ADDR;
1817                        devip->sense_buff[3] = (ret >> 24) & 0xff;
1818                        devip->sense_buff[4] = (ret >> 16) & 0xff;
1819                        devip->sense_buff[5] = (ret >> 8) & 0xff;
1820                        devip->sense_buff[6] = ret & 0xff;
1821                }
1822                return check_condition_result;
1823        }
1824        read_lock_irqsave(&atomic_rw, iflags);
1825        if ((lba + num) <= sdebug_store_sectors)
1826                ret = fill_from_dev_buffer(SCpnt,
1827                                           fake_storep + (lba * SECT_SIZE),
1828                                           num * SECT_SIZE);
1829        else {
1830                /* modulo when one arg is 64 bits needs do_div() */
1831                u = lba;
1832                block = do_div(u, sdebug_store_sectors);
1833                from_bottom = 0;
1834                if ((block + num) > sdebug_store_sectors)
1835                        from_bottom = (block + num) - sdebug_store_sectors;
1836                ret = fill_from_dev_buffer(SCpnt,
1837                                           fake_storep + (block * SECT_SIZE),
1838                                           (num - from_bottom) * SECT_SIZE);
1839                if ((0 == ret) && (from_bottom > 0))
1840                        ret = fill_from_dev_buffer(SCpnt, fake_storep,
1841                                                   from_bottom * SECT_SIZE);
1842        }
1843        read_unlock_irqrestore(&atomic_rw, iflags);
1844        return ret;
1845}
1846
1847static int resp_write(struct scsi_cmnd * SCpnt, unsigned long long lba,
1848                      unsigned int num, struct sdebug_dev_info * devip)
1849{
1850        unsigned long iflags;
1851        unsigned int block, to_bottom;
1852        unsigned long long u;
1853        int res;
1854
1855        if (lba + num > sdebug_capacity) {
1856                mk_sense_buffer(devip, ILLEGAL_REQUEST, ADDR_OUT_OF_RANGE,
1857                                0);
1858                return check_condition_result;
1859        }
1860        /* transfer length excessive (tie in to block limits VPD page) */
1861        if (num > sdebug_store_sectors) {
1862                mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1863                                0);
1864                return check_condition_result;
1865        }
1866
1867        write_lock_irqsave(&atomic_rw, iflags);
1868        if ((lba + num) <= sdebug_store_sectors)
1869                res = fetch_to_dev_buffer(SCpnt,
1870                                          fake_storep + (lba * SECT_SIZE),
1871                                          num * SECT_SIZE);
1872        else {
1873                /* modulo when one arg is 64 bits needs do_div() */
1874                u = lba;
1875                block = do_div(u, sdebug_store_sectors);
1876                to_bottom = 0;
1877                if ((block + num) > sdebug_store_sectors)
1878                        to_bottom = (block + num) - sdebug_store_sectors;
1879                res = fetch_to_dev_buffer(SCpnt,
1880                                          fake_storep + (block * SECT_SIZE),
1881                                          (num - to_bottom) * SECT_SIZE);
1882                if ((0 == res) && (to_bottom > 0))
1883                        res = fetch_to_dev_buffer(SCpnt, fake_storep,
1884                                                  to_bottom * SECT_SIZE);
1885        }
1886        write_unlock_irqrestore(&atomic_rw, iflags);
1887        if (-1 == res)
1888                return (DID_ERROR << 16);
1889        else if ((res < (num * SECT_SIZE)) &&
1890                 (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
1891                printk(KERN_INFO "scsi_debug: write: cdb indicated=%u, "
1892                       " IO sent=%d bytes\n", num * SECT_SIZE, res);
1893        return 0;
1894}
1895
1896#define SDEBUG_RLUN_ARR_SZ 256
1897
1898static int resp_report_luns(struct scsi_cmnd * scp,
1899                            struct sdebug_dev_info * devip)
1900{
1901        unsigned int alloc_len;
1902        int lun_cnt, i, upper, num, n, wlun, lun;
1903        unsigned char *cmd = (unsigned char *)scp->cmnd;
1904        int select_report = (int)cmd[2];
1905        struct scsi_lun *one_lun;
1906        unsigned char arr[SDEBUG_RLUN_ARR_SZ];
1907        unsigned char * max_addr;
1908
1909        alloc_len = cmd[9] + (cmd[8] << 8) + (cmd[7] << 16) + (cmd[6] << 24);
1910        if ((alloc_len < 4) || (select_report > 2)) {
1911                mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1912                                0);
1913                return check_condition_result;
1914        }
1915        /* can produce response with up to 16k luns (lun 0 to lun 16383) */
1916        memset(arr, 0, SDEBUG_RLUN_ARR_SZ);
1917        lun_cnt = scsi_debug_max_luns;
1918        if (1 == select_report)
1919                lun_cnt = 0;
1920        else if (scsi_debug_no_lun_0 && (lun_cnt > 0))
1921                --lun_cnt;
1922        wlun = (select_report > 0) ? 1 : 0;
1923        num = lun_cnt + wlun;
1924        arr[2] = ((sizeof(struct scsi_lun) * num) >> 8) & 0xff;
1925        arr[3] = (sizeof(struct scsi_lun) * num) & 0xff;
1926        n = min((int)((SDEBUG_RLUN_ARR_SZ - 8) /
1927                            sizeof(struct scsi_lun)), num);
1928        if (n < num) {
1929                wlun = 0;
1930                lun_cnt = n;
1931        }
1932        one_lun = (struct scsi_lun *) &arr[8];
1933        max_addr = arr + SDEBUG_RLUN_ARR_SZ;
1934        for (i = 0, lun = (scsi_debug_no_lun_0 ? 1 : 0);
1935             ((i < lun_cnt) && ((unsigned char *)(one_lun + i) < max_addr));
1936             i++, lun++) {
1937                upper = (lun >> 8) & 0x3f;
1938                if (upper)
1939                        one_lun[i].scsi_lun[0] =
1940                            (upper | (SAM2_LUN_ADDRESS_METHOD << 6));
1941                one_lun[i].scsi_lun[1] = lun & 0xff;
1942        }
1943        if (wlun) {
1944                one_lun[i].scsi_lun[0] = (SAM2_WLUN_REPORT_LUNS >> 8) & 0xff;
1945                one_lun[i].scsi_lun[1] = SAM2_WLUN_REPORT_LUNS & 0xff;
1946                i++;
1947        }
1948        alloc_len = (unsigned char *)(one_lun + i) - arr;
1949        return fill_from_dev_buffer(scp, arr,
1950                                    min((int)alloc_len, SDEBUG_RLUN_ARR_SZ));
1951}
1952
1953/* When timer goes off this function is called. */
1954static void timer_intr_handler(unsigned long indx)
1955{
1956        struct sdebug_queued_cmd * sqcp;
1957        unsigned long iflags;
1958
1959        if (indx >= SCSI_DEBUG_CANQUEUE) {
1960                printk(KERN_ERR "scsi_debug:timer_intr_handler: indx too "
1961                       "large\n");
1962                return;
1963        }
1964        spin_lock_irqsave(&queued_arr_lock, iflags);
1965        sqcp = &queued_arr[(int)indx];
1966        if (! sqcp->in_use) {
1967                printk(KERN_ERR "scsi_debug:timer_intr_handler: Unexpected "
1968                       "interrupt\n");
1969                spin_unlock_irqrestore(&queued_arr_lock, iflags);
1970                return;
1971        }
1972        sqcp->in_use = 0;
1973        if (sqcp->done_funct) {
1974                sqcp->a_cmnd->result = sqcp->scsi_result;
1975                sqcp->done_funct(sqcp->a_cmnd); /* callback to mid level */
1976        }
1977        sqcp->done_funct = NULL;
1978        spin_unlock_irqrestore(&queued_arr_lock, iflags);
1979}
1980
1981static int scsi_debug_slave_alloc(struct scsi_device * sdp)
1982{
1983        if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1984                printk(KERN_INFO "scsi_debug: slave_alloc <%u %u %u %u>\n",
1985                       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
1986        return 0;
1987}
1988
1989static int scsi_debug_slave_configure(struct scsi_device * sdp)
1990{
1991        struct sdebug_dev_info * devip;
1992
1993        if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1994                printk(KERN_INFO "scsi_debug: slave_configure <%u %u %u %u>\n",
1995                       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
1996        if (sdp->host->max_cmd_len != SCSI_DEBUG_MAX_CMD_LEN)
1997                sdp->host->max_cmd_len = SCSI_DEBUG_MAX_CMD_LEN;
1998        devip = devInfoReg(sdp);
1999        sdp->hostdata = devip;
2000        if (sdp->host->cmd_per_lun)
2001                scsi_adjust_queue_depth(sdp, SDEBUG_TAGGED_QUEUING,
2002                                        sdp->host->cmd_per_lun);
2003        blk_queue_max_segment_size(sdp->request_queue, 256 * 1024);
2004        return 0;
2005}
2006
2007static void scsi_debug_slave_destroy(struct scsi_device * sdp)
2008{
2009        struct sdebug_dev_info * devip =
2010                                (struct sdebug_dev_info *)sdp->hostdata;
2011
2012        if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2013                printk(KERN_INFO "scsi_debug: slave_destroy <%u %u %u %u>\n",
2014                       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
2015        if (devip) {
2016                /* make this slot avaliable for re-use */
2017                devip->used = 0;
2018                sdp->hostdata = NULL;
2019        }
2020}
2021
2022static struct sdebug_dev_info * devInfoReg(struct scsi_device * sdev)
2023{
2024        struct sdebug_host_info * sdbg_host;
2025        struct sdebug_dev_info * open_devip = NULL;
2026        struct sdebug_dev_info * devip =
2027                        (struct sdebug_dev_info *)sdev->hostdata;
2028
2029        if (devip)
2030                return devip;
2031        sdbg_host = *(struct sdebug_host_info **) sdev->host->hostdata;
2032        if(! sdbg_host) {
2033                printk(KERN_ERR "Host info NULL\n");
2034                return NULL;
2035        }
2036        list_for_each_entry(devip, &sdbg_host->dev_info_list, dev_list) {
2037                if ((devip->used) && (devip->channel == sdev->channel) &&
2038                    (devip->target == sdev->id) &&
2039                    (devip->lun == sdev->lun))
2040                        return devip;
2041                else {
2042                        if ((!devip->used) && (!open_devip))
2043                                open_devip = devip;
2044                }
2045        }
2046        if (NULL == open_devip) { /* try and make a new one */
2047                open_devip = kzalloc(sizeof(*open_devip),GFP_KERNEL);
2048                if (NULL == open_devip) {
2049                        printk(KERN_ERR "%s: out of memory at line %d\n",
2050                                __FUNCTION__, __LINE__);
2051                        return NULL;
2052                }
2053                open_devip->sdbg_host = sdbg_host;
2054                list_add_tail(&open_devip->dev_list,
2055                &sdbg_host->dev_info_list);
2056        }
2057        if (open_devip) {
2058                open_devip->channel = sdev->channel;
2059                open_devip->target = sdev->id;
2060                open_devip->lun = sdev->lun;
2061                open_devip->sdbg_host = sdbg_host;
2062                open_devip->reset = 1;
2063                open_devip->used = 1;
2064                memset(open_devip->sense_buff, 0, SDEBUG_SENSE_LEN);
2065                if (scsi_debug_dsense)
2066                        open_devip->sense_buff[0] = 0x72;
2067                else {
2068                        open_devip->sense_buff[0] = 0x70;
2069                        open_devip->sense_buff[7] = 0xa;
2070                }
2071                if (sdev->lun == SAM2_WLUN_REPORT_LUNS)
2072                        open_devip->wlun = SAM2_WLUN_REPORT_LUNS & 0xff;
2073                return open_devip;
2074        }
2075        return NULL;
2076}
2077
2078static void mk_sense_buffer(struct sdebug_dev_info * devip, int key,
2079                            int asc, int asq)
2080{
2081        unsigned char * sbuff;
2082
2083        sbuff = devip->sense_buff;
2084        memset(sbuff, 0, SDEBUG_SENSE_LEN);
2085        if (scsi_debug_dsense) {
2086                sbuff[0] = 0x72;  /* descriptor, current */
2087                sbuff[1] = key;
2088                sbuff[2] = asc;
2089                sbuff[3] = asq;
2090        } else {
2091                sbuff[0] = 0x70;  /* fixed, current */
2092                sbuff[2] = key;
2093                sbuff[7] = 0xa;   /* implies 18 byte sense buffer */
2094                sbuff[12] = asc;
2095                sbuff[13] = asq;
2096        }
2097        if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2098                printk(KERN_INFO "scsi_debug:    [sense_key,asc,ascq]: "
2099                      "[0x%x,0x%x,0x%x]\n", key, asc, asq);
2100}
2101
2102static int scsi_debug_abort(struct scsi_cmnd * SCpnt)
2103{
2104        if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2105                printk(KERN_INFO "scsi_debug: abort\n");
2106        ++num_aborts;
2107        stop_queued_cmnd(SCpnt);
2108        return SUCCESS;
2109}
2110
2111static int scsi_debug_biosparam(struct scsi_device *sdev,
2112                struct block_device * bdev, sector_t capacity, int *info)
2113{
2114        int res;
2115        unsigned char *buf;
2116
2117        if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2118                printk(KERN_INFO "scsi_debug: biosparam\n");
2119        buf = scsi_bios_ptable(bdev);
2120        if (buf) {
2121                res = scsi_partsize(buf, capacity,
2122                                    &info[2], &info[0], &info[1]);
2123                kfree(buf);
2124                if (! res)
2125                        return res;
2126        }
2127        info[0] = sdebug_heads;
2128        info[1] = sdebug_sectors_per;
2129        info[2] = sdebug_cylinders_per;
2130        return 0;
2131}
2132
2133static int scsi_debug_device_reset(struct scsi_cmnd * SCpnt)
2134{
2135        struct sdebug_dev_info * devip;
2136
2137        if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2138                printk(KERN_INFO "scsi_debug: device_reset\n");
2139        ++num_dev_resets;
2140        if (SCpnt) {
2141                devip = devInfoReg(SCpnt->device);
2142                if (devip)
2143                        devip->reset = 1;
2144        }
2145        return SUCCESS;
2146}
2147
2148static int scsi_debug_bus_reset(struct scsi_cmnd * SCpnt)
2149{
2150        struct sdebug_host_info *sdbg_host;
2151        struct sdebug_dev_info * dev_info;
2152        struct scsi_device * sdp;
2153        struct Scsi_Host * hp;
2154
2155        if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2156                printk(KERN_INFO "scsi_debug: bus_reset\n");
2157        ++num_bus_resets;
2158        if (SCpnt && ((sdp = SCpnt->device)) && ((hp = sdp->host))) {
2159                sdbg_host = *(struct sdebug_host_info **) hp->hostdata;
2160                if (sdbg_host) {
2161                        list_for_each_entry(dev_info,
2162                                            &sdbg_host->dev_info_list,
2163                                            dev_list)
2164                                dev_info->reset = 1;
2165                }
2166        }
2167        return SUCCESS;
2168}
2169
2170static int scsi_debug_host_reset(struct scsi_cmnd * SCpnt)
2171{
2172        struct sdebug_host_info * sdbg_host;
2173        struct sdebug_dev_info * dev_info;
2174
2175        if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2176                printk(KERN_INFO "scsi_debug: host_reset\n");
2177        ++num_host_resets;
2178        spin_lock(&sdebug_host_list_lock);
2179        list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
2180                list_for_each_entry(dev_info, &sdbg_host->dev_info_list,
2181                                    dev_list)
2182                        dev_info->reset = 1;
2183        }
2184        spin_unlock(&sdebug_host_list_lock);
2185        stop_all_queued();
2186        return SUCCESS;
2187}
2188
2189/* Returns 1 if found 'cmnd' and deleted its timer. else returns 0 */
2190static int stop_queued_cmnd(struct scsi_cmnd * cmnd)
2191{
2192        unsigned long iflags;
2193        int k;
2194        struct sdebug_queued_cmd * sqcp;
2195
2196        spin_lock_irqsave(&queued_arr_lock, iflags);
2197        for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
2198                sqcp = &queued_arr[k];
2199                if (sqcp->in_use && (cmnd == sqcp->a_cmnd)) {
2200                        del_timer_sync(&sqcp->cmnd_timer);
2201                        sqcp->in_use = 0;
2202                        sqcp->a_cmnd = NULL;
2203                        break;
2204                }
2205        }
2206        spin_unlock_irqrestore(&queued_arr_lock, iflags);
2207        return (k < SCSI_DEBUG_CANQUEUE) ? 1 : 0;
2208}
2209
2210/* Deletes (stops) timers of all queued commands */
2211static void stop_all_queued(void)
2212{
2213        unsigned long iflags;
2214        int k;
2215        struct sdebug_queued_cmd * sqcp;
2216
2217        spin_lock_irqsave(&queued_arr_lock, iflags);
2218        for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
2219                sqcp = &queued_arr[k];
2220                if (sqcp->in_use && sqcp->a_cmnd) {
2221                        del_timer_sync(&sqcp->cmnd_timer);
2222                        sqcp->in_use = 0;
2223                        sqcp->a_cmnd = NULL;
2224                }
2225        }
2226        spin_unlock_irqrestore(&queued_arr_lock, iflags);
2227}
2228
2229/* Initializes timers in queued array */
2230static void __init init_all_queued(void)
2231{
2232        unsigned long iflags;
2233        int k;
2234        struct sdebug_queued_cmd * sqcp;
2235
2236        spin_lock_irqsave(&queued_arr_lock, iflags);
2237        for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
2238                sqcp = &queued_arr[k];
2239                init_timer(&sqcp->cmnd_timer);
2240                sqcp->in_use = 0;
2241                sqcp->a_cmnd = NULL;
2242        }
2243        spin_unlock_irqrestore(&queued_arr_lock, iflags);
2244}
2245
2246static void __init sdebug_build_parts(unsigned char * ramp)
2247{
2248        struct partition * pp;
2249        int starts[SDEBUG_MAX_PARTS + 2];
2250        int sectors_per_part, num_sectors, k;
2251        int heads_by_sects, start_sec, end_sec;
2252
2253        /* assume partition table already zeroed */
2254        if ((scsi_debug_num_parts < 1) || (sdebug_store_size < 1048576))
2255                return;
2256        if (scsi_debug_num_parts > SDEBUG_MAX_PARTS) {
2257                scsi_debug_num_parts = SDEBUG_MAX_PARTS;
2258                printk(KERN_WARNING "scsi_debug:build_parts: reducing "
2259                                    "partitions to %d\n", SDEBUG_MAX_PARTS);
2260        }
2261        num_sectors = (int)sdebug_store_sectors;
2262        sectors_per_part = (num_sectors - sdebug_sectors_per)
2263                           / scsi_debug_num_parts;
2264        heads_by_sects = sdebug_heads * sdebug_sectors_per;
2265        starts[0] = sdebug_sectors_per;
2266        for (k = 1; k < scsi_debug_num_parts; ++k)
2267                starts[k] = ((k * sectors_per_part) / heads_by_sects)
2268                            * heads_by_sects;
2269        starts[scsi_debug_num_parts] = num_sectors;
2270        starts[scsi_debug_num_parts + 1] = 0;
2271
2272        ramp[510] = 0x55;       /* magic partition markings */
2273        ramp[511] = 0xAA;
2274        pp = (struct partition *)(ramp + 0x1be);
2275        for (k = 0; starts[k + 1]; ++k, ++pp) {
2276                start_sec = starts[k];
2277                end_sec = starts[k + 1] - 1;
2278                pp->boot_ind = 0;
2279
2280                pp->cyl = start_sec / heads_by_sects;
2281                pp->head = (start_sec - (pp->cyl * heads_by_sects))
2282                           / sdebug_sectors_per;
2283                pp->sector = (start_sec % sdebug_sectors_per) + 1;
2284
2285                pp->end_cyl = end_sec / heads_by_sects;
2286                pp->end_head = (end_sec - (pp->end_cyl * heads_by_sects))
2287                               / sdebug_sectors_per;
2288                pp->end_sector = (end_sec % sdebug_sectors_per) + 1;
2289
2290                pp->start_sect = start_sec;
2291                pp->nr_sects = end_sec - start_sec + 1;
2292                pp->sys_ind = 0x83;     /* plain Linux partition */
2293        }
2294}
2295
2296static int schedule_resp(struct scsi_cmnd * cmnd,
2297                         struct sdebug_dev_info * devip,
2298                         done_funct_t done, int scsi_result, int delta_jiff)
2299{
2300        if ((SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) && cmnd) {
2301                if (scsi_result) {
2302                        struct scsi_device * sdp = cmnd->device;
2303
2304                        printk(KERN_INFO "scsi_debug:    <%u %u %u %u> "
2305                               "non-zero result=0x%x\n", sdp->host->host_no,
2306                               sdp->channel, sdp->id, sdp->lun, scsi_result);
2307                }
2308        }
2309        if (cmnd && devip) {
2310                /* simulate autosense by this driver */
2311                if (SAM_STAT_CHECK_CONDITION == (scsi_result & 0xff))
2312                        memcpy(cmnd->sense_buffer, devip->sense_buff,
2313                               (SCSI_SENSE_BUFFERSIZE > SDEBUG_SENSE_LEN) ?
2314                               SDEBUG_SENSE_LEN : SCSI_SENSE_BUFFERSIZE);
2315        }
2316        if (delta_jiff <= 0) {
2317                if (cmnd)
2318                        cmnd->result = scsi_result;
2319                if (done)
2320                        done(cmnd);
2321                return 0;
2322        } else {
2323                unsigned long iflags;
2324                int k;
2325                struct sdebug_queued_cmd * sqcp = NULL;
2326
2327                spin_lock_irqsave(&queued_arr_lock, iflags);
2328                for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
2329                        sqcp = &queued_arr[k];
2330                        if (! sqcp->in_use)
2331                                break;
2332                }
2333                if (k >= SCSI_DEBUG_CANQUEUE) {
2334                        spin_unlock_irqrestore(&queued_arr_lock, iflags);
2335                        printk(KERN_WARNING "scsi_debug: can_queue exceeded\n");
2336                        return 1;       /* report busy to mid level */
2337                }
2338                sqcp->in_use = 1;
2339                sqcp->a_cmnd = cmnd;
2340                sqcp->scsi_result = scsi_result;
2341                sqcp->done_funct = done;
2342                sqcp->cmnd_timer.function = timer_intr_handler;
2343                sqcp->cmnd_timer.data = k;
2344                sqcp->cmnd_timer.expires = jiffies + delta_jiff;
2345                add_timer(&sqcp->cmnd_timer);
2346                spin_unlock_irqrestore(&queued_arr_lock, iflags);
2347                if (cmnd)
2348                        cmnd->result = 0;
2349                return 0;
2350        }
2351}
2352
2353/* Note: The following macros create attribute files in the
2354   /sys/module/scsi_debug/parameters directory. Unfortunately this
2355   driver is unaware of a change and cannot trigger auxiliary actions
2356   as it can when the corresponding attribute in the
2357   /sys/bus/pseudo/drivers/scsi_debug directory is changed.
2358 */
2359module_param_named(add_host, scsi_debug_add_host, int, S_IRUGO | S_IWUSR);
2360module_param_named(delay, scsi_debug_delay, int, S_IRUGO | S_IWUSR);
2361module_param_named(dev_size_mb, scsi_debug_dev_size_mb, int, S_IRUGO);
2362module_param_named(dsense, scsi_debug_dsense, int, S_IRUGO | S_IWUSR);
2363module_param_named(every_nth, scsi_debug_every_nth, int, S_IRUGO | S_IWUSR);
2364module_param_named(fake_rw, scsi_debug_fake_rw, int, S_IRUGO | S_IWUSR);
2365module_param_named(max_luns, scsi_debug_max_luns, int, S_IRUGO | S_IWUSR);
2366module_param_named(no_lun_0, scsi_debug_no_lun_0, int, S_IRUGO | S_IWUSR);
2367module_param_named(num_parts, scsi_debug_num_parts, int, S_IRUGO);
2368module_param_named(num_tgts, scsi_debug_num_tgts, int, S_IRUGO | S_IWUSR);
2369module_param_named(opts, scsi_debug_opts, int, S_IRUGO | S_IWUSR);
2370module_param_named(ptype, scsi_debug_ptype, int, S_IRUGO | S_IWUSR);
2371module_param_named(scsi_level, scsi_debug_scsi_level, int, S_IRUGO);
2372module_param_named(virtual_gb, scsi_debug_virtual_gb, int, S_IRUGO | S_IWUSR);
2373module_param_named(vpd_use_hostno, scsi_debug_vpd_use_hostno, int,
2374                   S_IRUGO | S_IWUSR);
2375
2376MODULE_AUTHOR("Eric Youngdale + Douglas Gilbert");
2377MODULE_DESCRIPTION("SCSI debug adapter driver");
2378MODULE_LICENSE("GPL");
2379MODULE_VERSION(SCSI_DEBUG_VERSION);
2380
2381MODULE_PARM_DESC(add_host, "0..127 hosts allowed(def=1)");
2382MODULE_PARM_DESC(delay, "# of jiffies to delay response(def=1)");
2383MODULE_PARM_DESC(dev_size_mb, "size in MB of ram shared by devs(def=8)");
2384MODULE_PARM_DESC(dsense, "use descriptor sense format(def=0 -> fixed)");
2385MODULE_PARM_DESC(every_nth, "timeout every nth command(def=100)");
2386MODULE_PARM_DESC(fake_rw, "fake reads/writes instead of copying (def=0)");
2387MODULE_PARM_DESC(max_luns, "number of LUNs per target to simulate(def=1)");
2388MODULE_PARM_DESC(no_lun_0, "no LU number 0 (def=0 -> have lun 0)");
2389MODULE_PARM_DESC(num_parts, "number of partitions(def=0)");
2390MODULE_PARM_DESC(num_tgts, "number of targets per host to simulate(def=1)");
2391MODULE_PARM_DESC(opts, "1->noise, 2->medium_error, 4->... (def=0)");
2392MODULE_PARM_DESC(ptype, "SCSI peripheral type(def=0[disk])");
2393MODULE_PARM_DESC(scsi_level, "SCSI level to simulate(def=5[SPC-3])");
2394MODULE_PARM_DESC(virtual_gb, "virtual gigabyte size (def=0 -> use dev_size_mb)");
2395MODULE_PARM_DESC(vpd_use_hostno, "0 -> dev ids ignore hostno (def=1 -> unique dev ids)");
2396
2397
2398static char sdebug_info[256];
2399
2400static const char * scsi_debug_info(struct Scsi_Host * shp)
2401{
2402        sprintf(sdebug_info, "scsi_debug, version %s [%s], "
2403                "dev_size_mb=%d, opts=0x%x", SCSI_DEBUG_VERSION,
2404                scsi_debug_version_date, scsi_debug_dev_size_mb,
2405                scsi_debug_opts);
2406        return sdebug_info;
2407}
2408
2409/* scsi_debug_proc_info
2410 * Used if the driver currently has no own support for /proc/scsi
2411 */
2412static int scsi_debug_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset,
2413                                int length, int inout)
2414{
2415        int len, pos, begin;
2416        int orig_length;
2417
2418        orig_length = length;
2419
2420        if (inout == 1) {
2421                char arr[16];
2422                int minLen = length > 15 ? 15 : length;
2423
2424                if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
2425                        return -EACCES;
2426                memcpy(arr, buffer, minLen);
2427                arr[minLen] = '\0';
2428                if (1 != sscanf(arr, "%d", &pos))
2429                        return -EINVAL;
2430                scsi_debug_opts = pos;
2431                if (scsi_debug_every_nth != 0)
2432                        scsi_debug_cmnd_count = 0;
2433                return length;
2434        }
2435        begin = 0;
2436        pos = len = sprintf(buffer, "scsi_debug adapter driver, version "
2437            "%s [%s]\n"
2438            "num_tgts=%d, shared (ram) size=%d MB, opts=0x%x, "
2439            "every_nth=%d(curr:%d)\n"
2440            "delay=%d, max_luns=%d, scsi_level=%d\n"
2441            "sector_size=%d bytes, cylinders=%d, heads=%d, sectors=%d\n"
2442            "number of aborts=%d, device_reset=%d, bus_resets=%d, "
2443            "host_resets=%d\n",
2444            SCSI_DEBUG_VERSION, scsi_debug_version_date, scsi_debug_num_tgts,
2445            scsi_debug_dev_size_mb, scsi_debug_opts, scsi_debug_every_nth,
2446            scsi_debug_cmnd_count, scsi_debug_delay,
2447            scsi_debug_max_luns, scsi_debug_scsi_level,
2448            SECT_SIZE, sdebug_cylinders_per, sdebug_heads, sdebug_sectors_per,
2449            num_aborts, num_dev_resets, num_bus_resets, num_host_resets);
2450        if (pos < offset) {
2451                len = 0;
2452                begin = pos;
2453        }
2454        *start = buffer + (offset - begin);     /* Start of wanted data */
2455        len -= (offset - begin);
2456        if (len > length)
2457                len = length;
2458        return len;
2459}
2460
2461static ssize_t sdebug_delay_show(struct device_driver * ddp, char * buf)
2462{
2463        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_delay);
2464}
2465
2466static ssize_t sdebug_delay_store(struct device_driver * ddp,
2467                                  const char * buf, size_t count)
2468{
2469        int delay;
2470        char work[20];
2471
2472        if (1 == sscanf(buf, "%10s", work)) {
2473                if ((1 == sscanf(work, "%d", &delay)) && (delay >= 0)) {
2474                        scsi_debug_delay = delay;
2475                        return count;
2476                }
2477        }
2478        return -EINVAL;
2479}
2480DRIVER_ATTR(delay, S_IRUGO | S_IWUSR, sdebug_delay_show,
2481            sdebug_delay_store);
2482
2483static ssize_t sdebug_opts_show(struct device_driver * ddp, char * buf)
2484{
2485        return scnprintf(buf, PAGE_SIZE, "0x%x\n", scsi_debug_opts);
2486}
2487
2488static ssize_t sdebug_opts_store(struct device_driver * ddp,
2489                                 const char * buf, size_t count)
2490{
2491        int opts;
2492        char work[20];
2493
2494        if (1 == sscanf(buf, "%10s", work)) {
2495                if (0 == strnicmp(work,"0x", 2)) {
2496                        if (1 == sscanf(&work[2], "%x", &opts))
2497                                goto opts_done;
2498                } else {
2499                        if (1 == sscanf(work, "%d", &opts))
2500                                goto opts_done;
2501                }
2502        }
2503        return -EINVAL;
2504opts_done:
2505        scsi_debug_opts = opts;
2506        scsi_debug_cmnd_count = 0;
2507        return count;
2508}
2509DRIVER_ATTR(opts, S_IRUGO | S_IWUSR, sdebug_opts_show,
2510            sdebug_opts_store);
2511
2512static ssize_t sdebug_ptype_show(struct device_driver * ddp, char * buf)
2513{
2514        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_ptype);
2515}
2516static ssize_t sdebug_ptype_store(struct device_driver * ddp,
2517                                  const char * buf, size_t count)
2518{
2519        int n;
2520
2521        if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2522                scsi_debug_ptype = n;
2523                return count;
2524        }
2525        return -EINVAL;
2526}
2527DRIVER_ATTR(ptype, S_IRUGO | S_IWUSR, sdebug_ptype_show, sdebug_ptype_store);
2528
2529static ssize_t sdebug_dsense_show(struct device_driver * ddp, char * buf)
2530{
2531        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dsense);
2532}
2533static ssize_t sdebug_dsense_store(struct device_driver * ddp,
2534                                  const char * buf, size_t count)
2535{
2536        int n;
2537
2538        if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2539                scsi_debug_dsense = n;
2540                return count;
2541        }
2542        return -EINVAL;
2543}
2544DRIVER_ATTR(dsense, S_IRUGO | S_IWUSR, sdebug_dsense_show,
2545            sdebug_dsense_store);
2546
2547static ssize_t sdebug_fake_rw_show(struct device_driver * ddp, char * buf)
2548{
2549        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_fake_rw);
2550}
2551static ssize_t sdebug_fake_rw_store(struct device_driver * ddp,
2552                                    const char * buf, size_t count)
2553{
2554        int n;
2555
2556        if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2557                scsi_debug_fake_rw = n;
2558                return count;
2559        }
2560        return -EINVAL;
2561}
2562DRIVER_ATTR(fake_rw, S_IRUGO | S_IWUSR, sdebug_fake_rw_show,
2563            sdebug_fake_rw_store);
2564
2565static ssize_t sdebug_no_lun_0_show(struct device_driver * ddp, char * buf)
2566{
2567        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_no_lun_0);
2568}
2569static ssize_t sdebug_no_lun_0_store(struct device_driver * ddp,
2570                                     const char * buf, size_t count)
2571{
2572        int n;
2573
2574        if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2575                scsi_debug_no_lun_0 = n;
2576                return count;
2577        }
2578        return -EINVAL;
2579}
2580DRIVER_ATTR(no_lun_0, S_IRUGO | S_IWUSR, sdebug_no_lun_0_show,
2581            sdebug_no_lun_0_store);
2582
2583static ssize_t sdebug_num_tgts_show(struct device_driver * ddp, char * buf)
2584{
2585        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_num_tgts);
2586}
2587static ssize_t sdebug_num_tgts_store(struct device_driver * ddp,
2588                                     const char * buf, size_t count)
2589{
2590        int n;
2591
2592        if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2593                scsi_debug_num_tgts = n;
2594                sdebug_max_tgts_luns();
2595                return count;
2596        }
2597        return -EINVAL;
2598}
2599DRIVER_ATTR(num_tgts, S_IRUGO | S_IWUSR, sdebug_num_tgts_show,
2600            sdebug_num_tgts_store);
2601
2602static ssize_t sdebug_dev_size_mb_show(struct device_driver * ddp, char * buf)
2603{
2604        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dev_size_mb);
2605}
2606DRIVER_ATTR(dev_size_mb, S_IRUGO, sdebug_dev_size_mb_show, NULL);
2607
2608static ssize_t sdebug_num_parts_show(struct device_driver * ddp, char * buf)
2609{
2610        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_num_parts);
2611}
2612DRIVER_ATTR(num_parts, S_IRUGO, sdebug_num_parts_show, NULL);
2613
2614static ssize_t sdebug_every_nth_show(struct device_driver * ddp, char * buf)
2615{
2616        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_every_nth);
2617}
2618static ssize_t sdebug_every_nth_store(struct device_driver * ddp,
2619                                      const char * buf, size_t count)
2620{
2621        int nth;
2622
2623        if ((count > 0) && (1 == sscanf(buf, "%d", &nth))) {
2624                scsi_debug_every_nth = nth;
2625                scsi_debug_cmnd_count = 0;
2626                return count;
2627        }
2628        return -EINVAL;
2629}
2630DRIVER_ATTR(every_nth, S_IRUGO | S_IWUSR, sdebug_every_nth_show,
2631            sdebug_every_nth_store);
2632
2633static ssize_t sdebug_max_luns_show(struct device_driver * ddp, char * buf)
2634{
2635        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_max_luns);
2636}
2637static ssize_t sdebug_max_luns_store(struct device_driver * ddp,
2638                                     const char * buf, size_t count)
2639{
2640        int n;
2641
2642        if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2643                scsi_debug_max_luns = n;
2644                sdebug_max_tgts_luns();
2645                return count;
2646        }
2647        return -EINVAL;
2648}
2649DRIVER_ATTR(max_luns, S_IRUGO | S_IWUSR, sdebug_max_luns_show,
2650            sdebug_max_luns_store);
2651
2652static ssize_t sdebug_scsi_level_show(struct device_driver * ddp, char * buf)
2653{
2654        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_scsi_level);
2655}
2656DRIVER_ATTR(scsi_level, S_IRUGO, sdebug_scsi_level_show, NULL);
2657
2658static ssize_t sdebug_virtual_gb_show(struct device_driver * ddp, char * buf)
2659{
2660        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_virtual_gb);
2661}
2662static ssize_t sdebug_virtual_gb_store(struct device_driver * ddp,
2663                                       const char * buf, size_t count)
2664{
2665        int n;
2666
2667        if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2668                scsi_debug_virtual_gb = n;
2669                if (scsi_debug_virtual_gb > 0) {
2670                        sdebug_capacity = 2048 * 1024;
2671                        sdebug_capacity *= scsi_debug_virtual_gb;
2672                } else
2673                        sdebug_capacity = sdebug_store_sectors;
2674                return count;
2675        }
2676        return -EINVAL;
2677}
2678DRIVER_ATTR(virtual_gb, S_IRUGO | S_IWUSR, sdebug_virtual_gb_show,
2679            sdebug_virtual_gb_store);
2680
2681static ssize_t sdebug_add_host_show(struct device_driver * ddp, char * buf)
2682{
2683        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_add_host);
2684}
2685
2686static ssize_t sdebug_add_host_store(struct device_driver * ddp,
2687                                     const char * buf, size_t count)
2688{
2689        int delta_hosts;
2690        char work[20];
2691
2692        if (1 != sscanf(buf, "%10s", work))
2693                return -EINVAL;
2694        {       /* temporary hack around sscanf() problem with -ve nums */
2695                int neg = 0;
2696
2697                if ('-' == *work)
2698                        neg = 1;
2699                if (1 != sscanf(work + neg, "%d", &delta_hosts))
2700                        return -EINVAL;
2701                if (neg)
2702                        delta_hosts = -delta_hosts;
2703        }
2704        if (delta_hosts > 0) {
2705                do {
2706                        sdebug_add_adapter();
2707                } while (--delta_hosts);
2708        } else if (delta_hosts < 0) {
2709                do {
2710                        sdebug_remove_adapter();
2711                } while (++delta_hosts);
2712        }
2713        return count;
2714}
2715DRIVER_ATTR(add_host, S_IRUGO | S_IWUSR, sdebug_add_host_show, 
2716            sdebug_add_host_store);
2717
2718static ssize_t sdebug_vpd_use_hostno_show(struct device_driver * ddp,
2719                                          char * buf)
2720{
2721        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_vpd_use_hostno);
2722}
2723static ssize_t sdebug_vpd_use_hostno_store(struct device_driver * ddp,
2724                                           const char * buf, size_t count)
2725{
2726        int n;
2727
2728        if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2729                scsi_debug_vpd_use_hostno = n;
2730                return count;
2731        }
2732        return -EINVAL;
2733}
2734DRIVER_ATTR(vpd_use_hostno, S_IRUGO | S_IWUSR, sdebug_vpd_use_hostno_show,
2735            sdebug_vpd_use_hostno_store);
2736
2737/* Note: The following function creates attribute files in the
2738   /sys/bus/pseudo/drivers/scsi_debug directory. The advantage of these
2739   files (over those found in the /sys/module/scsi_debug/parameters
2740   directory) is that auxiliary actions can be triggered when an attribute
2741   is changed. For example see: sdebug_add_host_store() above.
2742 */
2743static int do_create_driverfs_files(void)
2744{
2745        int ret;
2746
2747        ret = driver_create_file(&sdebug_driverfs_driver, &driver_attr_add_host);
2748        ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_delay);
2749        ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dev_size_mb);
2750        ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dsense);
2751        ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_every_nth);
2752        ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_fake_rw);
2753        ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_max_luns);
2754        ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_no_lun_0);
2755        ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_num_parts);
2756        ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_num_tgts);
2757        ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_ptype);
2758        ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_opts);
2759        ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_scsi_level);
2760        ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_virtual_gb);
2761        ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_vpd_use_hostno);
2762        return ret;
2763}
2764
2765static void do_remove_driverfs_files(void)
2766{
2767        driver_remove_file(&sdebug_driverfs_driver, &driver_attr_vpd_use_hostno);
2768        driver_remove_file(&sdebug_driverfs_driver, &driver_attr_virtual_gb);
2769        driver_remove_file(&sdebug_driverfs_driver, &driver_attr_scsi_level);
2770        driver_remove_file(&sdebug_driverfs_driver, &driver_attr_opts);
2771        driver_remove_file(&sdebug_driverfs_driver, &driver_attr_ptype);
2772        driver_remove_file(&sdebug_driverfs_driver, &driver_attr_num_tgts);
2773        driver_remove_file(&sdebug_driverfs_driver, &driver_attr_num_parts);
2774        driver_remove_file(&sdebug_driverfs_driver, &driver_attr_no_lun_0);
2775        driver_remove_file(&sdebug_driverfs_driver, &driver_attr_max_luns);
2776        driver_remove_file(&sdebug_driverfs_driver, &driver_attr_fake_rw);
2777        driver_remove_file(&sdebug_driverfs_driver, &driver_attr_every_nth);
2778        driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dsense);
2779        driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dev_size_mb);
2780        driver_remove_file(&sdebug_driverfs_driver, &driver_attr_delay);
2781        driver_remove_file(&sdebug_driverfs_driver, &driver_attr_add_host);
2782}
2783
2784static int __init scsi_debug_init(void)
2785{
2786        unsigned int sz;
2787        int host_to_add;
2788        int k;
2789        int ret;
2790
2791        if (scsi_debug_dev_size_mb < 1)
2792                scsi_debug_dev_size_mb = 1;  /* force minimum 1 MB ramdisk */
2793        sdebug_store_size = (unsigned int)scsi_debug_dev_size_mb * 1048576;
2794        sdebug_store_sectors = sdebug_store_size / SECT_SIZE;
2795        if (scsi_debug_virtual_gb > 0) {
2796                sdebug_capacity = 2048 * 1024;
2797                sdebug_capacity *= scsi_debug_virtual_gb;
2798        } else
2799                sdebug_capacity = sdebug_store_sectors;
2800
2801        /* play around with geometry, don't waste too much on track 0 */
2802        sdebug_heads = 8;
2803        sdebug_sectors_per = 32;
2804        if (scsi_debug_dev_size_mb >= 16)
2805                sdebug_heads = 32;
2806        else if (scsi_debug_dev_size_mb >= 256)
2807                sdebug_heads = 64;
2808        sdebug_cylinders_per = (unsigned long)sdebug_capacity /
2809                               (sdebug_sectors_per * sdebug_heads);
2810        if (sdebug_cylinders_per >= 1024) {
2811                /* other LLDs do this; implies >= 1GB ram disk ... */
2812                sdebug_heads = 255;
2813                sdebug_sectors_per = 63;
2814                sdebug_cylinders_per = (unsigned long)sdebug_capacity /
2815                               (sdebug_sectors_per * sdebug_heads);
2816        }
2817
2818        sz = sdebug_store_size;
2819        fake_storep = vmalloc(sz);
2820        if (NULL == fake_storep) {
2821                printk(KERN_ERR "scsi_debug_init: out of memory, 1\n");
2822                return -ENOMEM;
2823        }
2824        memset(fake_storep, 0, sz);
2825        if (scsi_debug_num_parts > 0)
2826                sdebug_build_parts(fake_storep);
2827
2828        ret = device_register(&pseudo_primary);
2829        if (ret < 0) {
2830                printk(KERN_WARNING "scsi_debug: device_register error: %d\n",
2831                        ret);
2832                goto free_vm;
2833        }
2834        ret = bus_register(&pseudo_lld_bus);
2835        if (ret < 0) {
2836                printk(KERN_WARNING "scsi_debug: bus_register error: %d\n",
2837                        ret);
2838                goto dev_unreg;
2839        }
2840        ret = driver_register(&sdebug_driverfs_driver);
2841        if (ret < 0) {
2842                printk(KERN_WARNING "scsi_debug: driver_register error: %d\n",
2843                        ret);
2844                goto bus_unreg;
2845        }
2846        ret = do_create_driverfs_files();
2847        if (ret < 0) {
2848                printk(KERN_WARNING "scsi_debug: driver_create_file error: %d\n",
2849                        ret);
2850                goto del_files;
2851        }
2852
2853        init_all_queued();
2854
2855        sdebug_driver_template.proc_name = (char *)sdebug_proc_name;
2856
2857        host_to_add = scsi_debug_add_host;
2858        scsi_debug_add_host = 0;
2859
2860        for (k = 0; k < host_to_add; k++) {
2861                if (sdebug_add_adapter()) {
2862                        printk(KERN_ERR "scsi_debug_init: "
2863                               "sdebug_add_adapter failed k=%d\n", k);
2864                        break;
2865                }
2866        }
2867
2868        if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) {
2869                printk(KERN_INFO "scsi_debug_init: built %d host(s)\n",
2870                       scsi_debug_add_host);
2871        }
2872        return 0;
2873
2874del_files:
2875        do_remove_driverfs_files();
2876        driver_unregister(&sdebug_driverfs_driver);
2877bus_unreg:
2878        bus_unregister(&pseudo_lld_bus);
2879dev_unreg:
2880        device_unregister(&pseudo_primary);
2881free_vm:
2882        vfree(fake_storep);
2883
2884        return ret;
2885}
2886
2887static void __exit scsi_debug_exit(void)
2888{
2889        int k = scsi_debug_add_host;
2890
2891        stop_all_queued();
2892        for (; k; k--)
2893                sdebug_remove_adapter();
2894        do_remove_driverfs_files();
2895        driver_unregister(&sdebug_driverfs_driver);
2896        bus_unregister(&pseudo_lld_bus);
2897        device_unregister(&pseudo_primary);
2898
2899        vfree(fake_storep);
2900}
2901
2902device_initcall(scsi_debug_init);
2903module_exit(scsi_debug_exit);
2904
2905static void pseudo_0_release(struct device * dev)
2906{
2907        if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2908                printk(KERN_INFO "scsi_debug: pseudo_0_release() called\n");
2909}
2910
2911static struct device pseudo_primary = {
2912        .bus_id         = "pseudo_0",
2913        .release        = pseudo_0_release,
2914};
2915
2916static int pseudo_lld_bus_match(struct device *dev,
2917                          struct device_driver *dev_driver)
2918{
2919        return 1;
2920}
2921
2922static struct bus_type pseudo_lld_bus = {
2923        .name = "pseudo",
2924        .match = pseudo_lld_bus_match,
2925        .probe = sdebug_driver_probe,
2926        .remove = sdebug_driver_remove,
2927};
2928
2929static void sdebug_release_adapter(struct device * dev)
2930{
2931        struct sdebug_host_info *sdbg_host;
2932
2933        sdbg_host = to_sdebug_host(dev);
2934        kfree(sdbg_host);
2935}
2936
2937static int sdebug_add_adapter(void)
2938{
2939        int k, devs_per_host;
2940        int error = 0;
2941        struct sdebug_host_info *sdbg_host;
2942        struct sdebug_dev_info *sdbg_devinfo;
2943        struct list_head *lh, *lh_sf;
2944
2945        sdbg_host = kzalloc(sizeof(*sdbg_host),GFP_KERNEL);
2946
2947        if (NULL == sdbg_host) {
2948                printk(KERN_ERR "%s: out of memory at line %d\n",
2949                       __FUNCTION__, __LINE__);
2950                return -ENOMEM;
2951        }
2952
2953        INIT_LIST_HEAD(&sdbg_host->dev_info_list);
2954
2955        devs_per_host = scsi_debug_num_tgts * scsi_debug_max_luns;
2956        for (k = 0; k < devs_per_host; k++) {
2957                sdbg_devinfo = kzalloc(sizeof(*sdbg_devinfo),GFP_KERNEL);
2958                if (NULL == sdbg_devinfo) {
2959                        printk(KERN_ERR "%s: out of memory at line %d\n",
2960                               __FUNCTION__, __LINE__);
2961                        error = -ENOMEM;
2962                        goto clean;
2963                }
2964                sdbg_devinfo->sdbg_host = sdbg_host;
2965                list_add_tail(&sdbg_devinfo->dev_list,
2966                              &sdbg_host->dev_info_list);
2967        }
2968
2969        spin_lock(&sdebug_host_list_lock);
2970        list_add_tail(&sdbg_host->host_list, &sdebug_host_list);
2971        spin_unlock(&sdebug_host_list_lock);
2972
2973        sdbg_host->dev.bus = &pseudo_lld_bus;
2974        sdbg_host->dev.parent = &pseudo_primary;
2975        sdbg_host->dev.release = &sdebug_release_adapter;
2976        sprintf(sdbg_host->dev.bus_id, "adapter%d", scsi_debug_add_host);
2977
2978        error = device_register(&sdbg_host->dev);
2979
2980        if (error)
2981                goto clean;
2982
2983        ++scsi_debug_add_host;
2984        return error;
2985
2986clean:
2987        list_for_each_safe(lh, lh_sf, &sdbg_host->dev_info_list) {
2988                sdbg_devinfo = list_entry(lh, struct sdebug_dev_info,
2989                                          dev_list);
2990                list_del(&sdbg_devinfo->dev_list);
2991                kfree(sdbg_devinfo);
2992        }
2993
2994        kfree(sdbg_host);
2995        return error;
2996}
2997
2998static void sdebug_remove_adapter(void)
2999{
3000        struct sdebug_host_info * sdbg_host = NULL;
3001
3002        spin_lock(&sdebug_host_list_lock);
3003        if (!list_empty(&sdebug_host_list)) {
3004                sdbg_host = list_entry(sdebug_host_list.prev,
3005                                       struct sdebug_host_info, host_list);
3006                list_del(&sdbg_host->host_list);
3007        }
3008        spin_unlock(&sdebug_host_list_lock);
3009
3010        if (!sdbg_host)
3011                return;
3012
3013        device_unregister(&sdbg_host->dev);
3014        --scsi_debug_add_host;
3015}
3016
3017static int sdebug_driver_probe(struct device * dev)
3018{
3019        int error = 0;
3020        struct sdebug_host_info *sdbg_host;
3021        struct Scsi_Host *hpnt;
3022
3023        sdbg_host = to_sdebug_host(dev);
3024
3025        hpnt = scsi_host_alloc(&sdebug_driver_template, sizeof(sdbg_host));
3026        if (NULL == hpnt) {
3027                printk(KERN_ERR "%s: scsi_register failed\n", __FUNCTION__);
3028                error = -ENODEV;
3029                return error;
3030        }
3031
3032        sdbg_host->shost = hpnt;
3033        *((struct sdebug_host_info **)hpnt->hostdata) = sdbg_host;
3034        if ((hpnt->this_id >= 0) && (scsi_debug_num_tgts > hpnt->this_id))
3035                hpnt->max_id = scsi_debug_num_tgts + 1;
3036        else
3037                hpnt->max_id = scsi_debug_num_tgts;
3038        hpnt->max_lun = SAM2_WLUN_REPORT_LUNS;  /* = scsi_debug_max_luns; */
3039
3040        error = scsi_add_host(hpnt, &sdbg_host->dev);
3041        if (error) {
3042                printk(KERN_ERR "%s: scsi_add_host failed\n", __FUNCTION__);
3043                error = -ENODEV;
3044                scsi_host_put(hpnt);
3045        } else
3046                scsi_scan_host(hpnt);
3047
3048
3049        return error;
3050}
3051
3052static int sdebug_driver_remove(struct device * dev)
3053{
3054        struct list_head *lh, *lh_sf;
3055        struct sdebug_host_info *sdbg_host;
3056        struct sdebug_dev_info *sdbg_devinfo;
3057
3058        sdbg_host = to_sdebug_host(dev);
3059
3060        if (!sdbg_host) {
3061                printk(KERN_ERR "%s: Unable to locate host info\n",
3062                       __FUNCTION__);
3063                return -ENODEV;
3064        }
3065
3066        scsi_remove_host(sdbg_host->shost);
3067
3068        list_for_each_safe(lh, lh_sf, &sdbg_host->dev_info_list) {
3069                sdbg_devinfo = list_entry(lh, struct sdebug_dev_info,
3070                                          dev_list);
3071                list_del(&sdbg_devinfo->dev_list);
3072                kfree(sdbg_devinfo);
3073        }
3074
3075        scsi_host_put(sdbg_host->shost);
3076        return 0;
3077}
3078
3079static void sdebug_max_tgts_luns(void)
3080{
3081        struct sdebug_host_info * sdbg_host;
3082        struct Scsi_Host *hpnt;
3083
3084        spin_lock(&sdebug_host_list_lock);
3085        list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
3086                hpnt = sdbg_host->shost;
3087                if ((hpnt->this_id >= 0) &&
3088                    (scsi_debug_num_tgts > hpnt->this_id))
3089                        hpnt->max_id = scsi_debug_num_tgts + 1;
3090                else
3091                        hpnt->max_id = scsi_debug_num_tgts;
3092                hpnt->max_lun = SAM2_WLUN_REPORT_LUNS; /* scsi_debug_max_luns; */
3093        }
3094        spin_unlock(&sdebug_host_list_lock);
3095}
3096
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.