linux/drivers/scsi/scsi_error.c
<<
>>
Prefs
   1/*
   2 *  scsi_error.c Copyright (C) 1997 Eric Youngdale
   3 *
   4 *  SCSI error/timeout handling
   5 *      Initial versions: Eric Youngdale.  Based upon conversations with
   6 *                        Leonard Zubkoff and David Miller at Linux Expo, 
   7 *                        ideas originating from all over the place.
   8 *
   9 *      Restructured scsi_unjam_host and associated functions.
  10 *      September 04, 2002 Mike Anderson (andmike@us.ibm.com)
  11 *
  12 *      Forward port of Russell King's (rmk@arm.linux.org.uk) changes and
  13 *      minor  cleanups.
  14 *      September 30, 2002 Mike Anderson (andmike@us.ibm.com)
  15 */
  16
  17#include <linux/module.h>
  18#include <linux/sched.h>
  19#include <linux/timer.h>
  20#include <linux/string.h>
  21#include <linux/kernel.h>
  22#include <linux/freezer.h>
  23#include <linux/kthread.h>
  24#include <linux/interrupt.h>
  25#include <linux/blkdev.h>
  26#include <linux/delay.h>
  27
  28#include <scsi/scsi.h>
  29#include <scsi/scsi_cmnd.h>
  30#include <scsi/scsi_dbg.h>
  31#include <scsi/scsi_device.h>
  32#include <scsi/scsi_eh.h>
  33#include <scsi/scsi_transport.h>
  34#include <scsi/scsi_host.h>
  35#include <scsi/scsi_ioctl.h>
  36
  37#include "scsi_priv.h"
  38#include "scsi_logging.h"
  39#include "scsi_transport_api.h"
  40
  41#define SENSE_TIMEOUT           (10*HZ)
  42
  43/*
  44 * These should *probably* be handled by the host itself.
  45 * Since it is allowed to sleep, it probably should.
  46 */
  47#define BUS_RESET_SETTLE_TIME   (10)
  48#define HOST_RESET_SETTLE_TIME  (10)
  49
  50/* called with shost->host_lock held */
  51void scsi_eh_wakeup(struct Scsi_Host *shost)
  52{
  53        if (shost->host_busy == shost->host_failed) {
  54                wake_up_process(shost->ehandler);
  55                SCSI_LOG_ERROR_RECOVERY(5,
  56                                printk("Waking error handler thread\n"));
  57        }
  58}
  59
  60/**
  61 * scsi_schedule_eh - schedule EH for SCSI host
  62 * @shost:      SCSI host to invoke error handling on.
  63 *
  64 * Schedule SCSI EH without scmd.
  65 */
  66void scsi_schedule_eh(struct Scsi_Host *shost)
  67{
  68        unsigned long flags;
  69
  70        spin_lock_irqsave(shost->host_lock, flags);
  71
  72        if (scsi_host_set_state(shost, SHOST_RECOVERY) == 0 ||
  73            scsi_host_set_state(shost, SHOST_CANCEL_RECOVERY) == 0) {
  74                shost->host_eh_scheduled++;
  75                scsi_eh_wakeup(shost);
  76        }
  77
  78        spin_unlock_irqrestore(shost->host_lock, flags);
  79}
  80EXPORT_SYMBOL_GPL(scsi_schedule_eh);
  81
  82/**
  83 * scsi_eh_scmd_add - add scsi cmd to error handling.
  84 * @scmd:       scmd to run eh on.
  85 * @eh_flag:    optional SCSI_EH flag.
  86 *
  87 * Return value:
  88 *      0 on failure.
  89 */
  90int scsi_eh_scmd_add(struct scsi_cmnd *scmd, int eh_flag)
  91{
  92        struct Scsi_Host *shost = scmd->device->host;
  93        unsigned long flags;
  94        int ret = 0;
  95
  96        if (!shost->ehandler)
  97                return 0;
  98
  99        spin_lock_irqsave(shost->host_lock, flags);
 100        if (scsi_host_set_state(shost, SHOST_RECOVERY))
 101                if (scsi_host_set_state(shost, SHOST_CANCEL_RECOVERY))
 102                        goto out_unlock;
 103
 104        ret = 1;
 105        scmd->eh_eflags |= eh_flag;
 106        list_add_tail(&scmd->eh_entry, &shost->eh_cmd_q);
 107        shost->host_failed++;
 108        scsi_eh_wakeup(shost);
 109 out_unlock:
 110        spin_unlock_irqrestore(shost->host_lock, flags);
 111        return ret;
 112}
 113
 114/**
 115 * scsi_times_out - Timeout function for normal scsi commands.
 116 * @req:        request that is timing out.
 117 *
 118 * Notes:
 119 *     We do not need to lock this.  There is the potential for a race
 120 *     only in that the normal completion handling might run, but if the
 121 *     normal completion function determines that the timer has already
 122 *     fired, then it mustn't do anything.
 123 */
 124enum blk_eh_timer_return scsi_times_out(struct request *req)
 125{
 126        struct scsi_cmnd *scmd = req->special;
 127        enum blk_eh_timer_return (*eh_timed_out)(struct scsi_cmnd *);
 128        enum blk_eh_timer_return rtn = BLK_EH_NOT_HANDLED;
 129
 130        scsi_log_completion(scmd, TIMEOUT_ERROR);
 131
 132        if (scmd->device->host->transportt->eh_timed_out)
 133                eh_timed_out = scmd->device->host->transportt->eh_timed_out;
 134        else if (scmd->device->host->hostt->eh_timed_out)
 135                eh_timed_out = scmd->device->host->hostt->eh_timed_out;
 136        else
 137                eh_timed_out = NULL;
 138
 139        if (eh_timed_out)
 140                rtn = eh_timed_out(scmd);
 141                switch (rtn) {
 142                case BLK_EH_NOT_HANDLED:
 143                        break;
 144                default:
 145                        return rtn;
 146                }
 147
 148        if (unlikely(!scsi_eh_scmd_add(scmd, SCSI_EH_CANCEL_CMD))) {
 149                scmd->result |= DID_TIME_OUT << 16;
 150                return BLK_EH_HANDLED;
 151        }
 152
 153        return BLK_EH_NOT_HANDLED;
 154}
 155
 156/**
 157 * scsi_block_when_processing_errors - Prevent cmds from being queued.
 158 * @sdev:       Device on which we are performing recovery.
 159 *
 160 * Description:
 161 *     We block until the host is out of error recovery, and then check to
 162 *     see whether the host or the device is offline.
 163 *
 164 * Return value:
 165 *     0 when dev was taken offline by error recovery. 1 OK to proceed.
 166 */
 167int scsi_block_when_processing_errors(struct scsi_device *sdev)
 168{
 169        int online;
 170
 171        wait_event(sdev->host->host_wait, !scsi_host_in_recovery(sdev->host));
 172
 173        online = scsi_device_online(sdev);
 174
 175        SCSI_LOG_ERROR_RECOVERY(5, printk("%s: rtn: %d\n", __func__,
 176                                          online));
 177
 178        return online;
 179}
 180EXPORT_SYMBOL(scsi_block_when_processing_errors);
 181
 182#ifdef CONFIG_SCSI_LOGGING
 183/**
 184 * scsi_eh_prt_fail_stats - Log info on failures.
 185 * @shost:      scsi host being recovered.
 186 * @work_q:     Queue of scsi cmds to process.
 187 */
 188static inline void scsi_eh_prt_fail_stats(struct Scsi_Host *shost,
 189                                          struct list_head *work_q)
 190{
 191        struct scsi_cmnd *scmd;
 192        struct scsi_device *sdev;
 193        int total_failures = 0;
 194        int cmd_failed = 0;
 195        int cmd_cancel = 0;
 196        int devices_failed = 0;
 197
 198        shost_for_each_device(sdev, shost) {
 199                list_for_each_entry(scmd, work_q, eh_entry) {
 200                        if (scmd->device == sdev) {
 201                                ++total_failures;
 202                                if (scmd->eh_eflags & SCSI_EH_CANCEL_CMD)
 203                                        ++cmd_cancel;
 204                                else 
 205                                        ++cmd_failed;
 206                        }
 207                }
 208
 209                if (cmd_cancel || cmd_failed) {
 210                        SCSI_LOG_ERROR_RECOVERY(3,
 211                                sdev_printk(KERN_INFO, sdev,
 212                                            "%s: cmds failed: %d, cancel: %d\n",
 213                                            __func__, cmd_failed,
 214                                            cmd_cancel));
 215                        cmd_cancel = 0;
 216                        cmd_failed = 0;
 217                        ++devices_failed;
 218                }
 219        }
 220
 221        SCSI_LOG_ERROR_RECOVERY(2, printk("Total of %d commands on %d"
 222                                          " devices require eh work\n",
 223                                  total_failures, devices_failed));
 224}
 225#endif
 226
 227/**
 228 * scsi_check_sense - Examine scsi cmd sense
 229 * @scmd:       Cmd to have sense checked.
 230 *
 231 * Return value:
 232 *      SUCCESS or FAILED or NEEDS_RETRY
 233 *
 234 * Notes:
 235 *      When a deferred error is detected the current command has
 236 *      not been executed and needs retrying.
 237 */
 238static int scsi_check_sense(struct scsi_cmnd *scmd)
 239{
 240        struct scsi_device *sdev = scmd->device;
 241        struct scsi_sense_hdr sshdr;
 242
 243        if (! scsi_command_normalize_sense(scmd, &sshdr))
 244                return FAILED;  /* no valid sense data */
 245
 246        if (scsi_sense_is_deferred(&sshdr))
 247                return NEEDS_RETRY;
 248
 249        if (sdev->scsi_dh_data && sdev->scsi_dh_data->scsi_dh &&
 250                        sdev->scsi_dh_data->scsi_dh->check_sense) {
 251                int rc;
 252
 253                rc = sdev->scsi_dh_data->scsi_dh->check_sense(sdev, &sshdr);
 254                if (rc != SCSI_RETURN_NOT_HANDLED)
 255                        return rc;
 256                /* handler does not care. Drop down to default handling */
 257        }
 258
 259        /*
 260         * Previous logic looked for FILEMARK, EOM or ILI which are
 261         * mainly associated with tapes and returned SUCCESS.
 262         */
 263        if (sshdr.response_code == 0x70) {
 264                /* fixed format */
 265                if (scmd->sense_buffer[2] & 0xe0)
 266                        return SUCCESS;
 267        } else {
 268                /*
 269                 * descriptor format: look for "stream commands sense data
 270                 * descriptor" (see SSC-3). Assume single sense data
 271                 * descriptor. Ignore ILI from SBC-2 READ LONG and WRITE LONG.
 272                 */
 273                if ((sshdr.additional_length > 3) &&
 274                    (scmd->sense_buffer[8] == 0x4) &&
 275                    (scmd->sense_buffer[11] & 0xe0))
 276                        return SUCCESS;
 277        }
 278
 279        switch (sshdr.sense_key) {
 280        case NO_SENSE:
 281                return SUCCESS;
 282        case RECOVERED_ERROR:
 283                return /* soft_error */ SUCCESS;
 284
 285        case ABORTED_COMMAND:
 286                if (sshdr.asc == 0x10) /* DIF */
 287                        return SUCCESS;
 288
 289                return NEEDS_RETRY;
 290        case NOT_READY:
 291        case UNIT_ATTENTION:
 292                /*
 293                 * if we are expecting a cc/ua because of a bus reset that we
 294                 * performed, treat this just as a retry.  otherwise this is
 295                 * information that we should pass up to the upper-level driver
 296                 * so that we can deal with it there.
 297                 */
 298                if (scmd->device->expecting_cc_ua) {
 299                        scmd->device->expecting_cc_ua = 0;
 300                        return NEEDS_RETRY;
 301                }
 302                /*
 303                 * if the device is in the process of becoming ready, we 
 304                 * should retry.
 305                 */
 306                if ((sshdr.asc == 0x04) && (sshdr.ascq == 0x01))
 307                        return NEEDS_RETRY;
 308                /*
 309                 * if the device is not started, we need to wake
 310                 * the error handler to start the motor
 311                 */
 312                if (scmd->device->allow_restart &&
 313                    (sshdr.asc == 0x04) && (sshdr.ascq == 0x02))
 314                        return FAILED;
 315                return SUCCESS;
 316
 317                /* these three are not supported */
 318        case COPY_ABORTED:
 319        case VOLUME_OVERFLOW:
 320        case MISCOMPARE:
 321                return SUCCESS;
 322
 323        case MEDIUM_ERROR:
 324                if (sshdr.asc == 0x11 || /* UNRECOVERED READ ERR */
 325                    sshdr.asc == 0x13 || /* AMNF DATA FIELD */
 326                    sshdr.asc == 0x14) { /* RECORD NOT FOUND */
 327                        return SUCCESS;
 328                }
 329                return NEEDS_RETRY;
 330
 331        case HARDWARE_ERROR:
 332                if (scmd->device->retry_hwerror)
 333                        return ADD_TO_MLQUEUE;
 334                else
 335                        return SUCCESS;
 336
 337        case ILLEGAL_REQUEST:
 338        case BLANK_CHECK:
 339        case DATA_PROTECT:
 340        default:
 341                return SUCCESS;
 342        }
 343}
 344
 345/**
 346 * scsi_eh_completed_normally - Disposition a eh cmd on return from LLD.
 347 * @scmd:       SCSI cmd to examine.
 348 *
 349 * Notes:
 350 *    This is *only* called when we are examining the status of commands
 351 *    queued during error recovery.  the main difference here is that we
 352 *    don't allow for the possibility of retries here, and we are a lot
 353 *    more restrictive about what we consider acceptable.
 354 */
 355static int scsi_eh_completed_normally(struct scsi_cmnd *scmd)
 356{
 357        /*
 358         * first check the host byte, to see if there is anything in there
 359         * that would indicate what we need to do.
 360         */
 361        if (host_byte(scmd->result) == DID_RESET) {
 362                /*
 363                 * rats.  we are already in the error handler, so we now
 364                 * get to try and figure out what to do next.  if the sense
 365                 * is valid, we have a pretty good idea of what to do.
 366                 * if not, we mark it as FAILED.
 367                 */
 368                return scsi_check_sense(scmd);
 369        }
 370        if (host_byte(scmd->result) != DID_OK)
 371                return FAILED;
 372
 373        /*
 374         * next, check the message byte.
 375         */
 376        if (msg_byte(scmd->result) != COMMAND_COMPLETE)
 377                return FAILED;
 378
 379        /*
 380         * now, check the status byte to see if this indicates
 381         * anything special.
 382         */
 383        switch (status_byte(scmd->result)) {
 384        case GOOD:
 385        case COMMAND_TERMINATED:
 386                return SUCCESS;
 387        case CHECK_CONDITION:
 388                return scsi_check_sense(scmd);
 389        case CONDITION_GOOD:
 390        case INTERMEDIATE_GOOD:
 391        case INTERMEDIATE_C_GOOD:
 392                /*
 393                 * who knows?  FIXME(eric)
 394                 */
 395                return SUCCESS;
 396        case BUSY:
 397        case QUEUE_FULL:
 398        case RESERVATION_CONFLICT:
 399        default:
 400                return FAILED;
 401        }
 402        return FAILED;
 403}
 404
 405/**
 406 * scsi_eh_done - Completion function for error handling.
 407 * @scmd:       Cmd that is done.
 408 */
 409static void scsi_eh_done(struct scsi_cmnd *scmd)
 410{
 411        struct completion     *eh_action;
 412
 413        SCSI_LOG_ERROR_RECOVERY(3,
 414                printk("%s scmd: %p result: %x\n",
 415                        __func__, scmd, scmd->result));
 416
 417        eh_action = scmd->device->host->eh_action;
 418        if (eh_action)
 419                complete(eh_action);
 420}
 421
 422/**
 423 * scsi_try_host_reset - ask host adapter to reset itself
 424 * @scmd:       SCSI cmd to send hsot reset.
 425 */
 426static int scsi_try_host_reset(struct scsi_cmnd *scmd)
 427{
 428        unsigned long flags;
 429        int rtn;
 430
 431        SCSI_LOG_ERROR_RECOVERY(3, printk("%s: Snd Host RST\n",
 432                                          __func__));
 433
 434        if (!scmd->device->host->hostt->eh_host_reset_handler)
 435                return FAILED;
 436
 437        rtn = scmd->device->host->hostt->eh_host_reset_handler(scmd);
 438
 439        if (rtn == SUCCESS) {
 440                if (!scmd->device->host->hostt->skip_settle_delay)
 441                        ssleep(HOST_RESET_SETTLE_TIME);
 442                spin_lock_irqsave(scmd->device->host->host_lock, flags);
 443                scsi_report_bus_reset(scmd->device->host,
 444                                      scmd_channel(scmd));
 445                spin_unlock_irqrestore(scmd->device->host->host_lock, flags);
 446        }
 447
 448        return rtn;
 449}
 450
 451/**
 452 * scsi_try_bus_reset - ask host to perform a bus reset
 453 * @scmd:       SCSI cmd to send bus reset.
 454 */
 455static int scsi_try_bus_reset(struct scsi_cmnd *scmd)
 456{
 457        unsigned long flags;
 458        int rtn;
 459
 460        SCSI_LOG_ERROR_RECOVERY(3, printk("%s: Snd Bus RST\n",
 461                                          __func__));
 462
 463        if (!scmd->device->host->hostt->eh_bus_reset_handler)
 464                return FAILED;
 465
 466        rtn = scmd->device->host->hostt->eh_bus_reset_handler(scmd);
 467
 468        if (rtn == SUCCESS) {
 469                if (!scmd->device->host->hostt->skip_settle_delay)
 470                        ssleep(BUS_RESET_SETTLE_TIME);
 471                spin_lock_irqsave(scmd->device->host->host_lock, flags);
 472                scsi_report_bus_reset(scmd->device->host,
 473                                      scmd_channel(scmd));
 474                spin_unlock_irqrestore(scmd->device->host->host_lock, flags);
 475        }
 476
 477        return rtn;
 478}
 479
 480static void __scsi_report_device_reset(struct scsi_device *sdev, void *data)
 481{
 482        sdev->was_reset = 1;
 483        sdev->expecting_cc_ua = 1;
 484}
 485
 486/**
 487 * scsi_try_target_reset - Ask host to perform a target reset
 488 * @scmd:       SCSI cmd used to send a target reset
 489 *
 490 * Notes:
 491 *    There is no timeout for this operation.  if this operation is
 492 *    unreliable for a given host, then the host itself needs to put a
 493 *    timer on it, and set the host back to a consistent state prior to
 494 *    returning.
 495 */
 496static int scsi_try_target_reset(struct scsi_cmnd *scmd)
 497{
 498        unsigned long flags;
 499        int rtn;
 500
 501        if (!scmd->device->host->hostt->eh_target_reset_handler)
 502                return FAILED;
 503
 504        rtn = scmd->device->host->hostt->eh_target_reset_handler(scmd);
 505        if (rtn == SUCCESS) {
 506                spin_lock_irqsave(scmd->device->host->host_lock, flags);
 507                __starget_for_each_device(scsi_target(scmd->device), NULL,
 508                                          __scsi_report_device_reset);
 509                spin_unlock_irqrestore(scmd->device->host->host_lock, flags);
 510        }
 511
 512        return rtn;
 513}
 514
 515/**
 516 * scsi_try_bus_device_reset - Ask host to perform a BDR on a dev
 517 * @scmd:       SCSI cmd used to send BDR
 518 *
 519 * Notes:
 520 *    There is no timeout for this operation.  if this operation is
 521 *    unreliable for a given host, then the host itself needs to put a
 522 *    timer on it, and set the host back to a consistent state prior to
 523 *    returning.
 524 */
 525static int scsi_try_bus_device_reset(struct scsi_cmnd *scmd)
 526{
 527        int rtn;
 528
 529        if (!scmd->device->host->hostt->eh_device_reset_handler)
 530                return FAILED;
 531
 532        rtn = scmd->device->host->hostt->eh_device_reset_handler(scmd);
 533        if (rtn == SUCCESS)
 534                __scsi_report_device_reset(scmd->device, NULL);
 535        return rtn;
 536}
 537
 538static int __scsi_try_to_abort_cmd(struct scsi_cmnd *scmd)
 539{
 540        if (!scmd->device->host->hostt->eh_abort_handler)
 541                return FAILED;
 542
 543        return scmd->device->host->hostt->eh_abort_handler(scmd);
 544}
 545
 546/**
 547 * scsi_try_to_abort_cmd - Ask host to abort a running command.
 548 * @scmd:       SCSI cmd to abort from Lower Level.
 549 *
 550 * Notes:
 551 *    This function will not return until the user's completion function
 552 *    has been called.  there is no timeout on this operation.  if the
 553 *    author of the low-level driver wishes this operation to be timed,
 554 *    they can provide this facility themselves.  helper functions in
 555 *    scsi_error.c can be supplied to make this easier to do.
 556 */
 557static int scsi_try_to_abort_cmd(struct scsi_cmnd *scmd)
 558{
 559        /*
 560         * scsi_done was called just after the command timed out and before
 561         * we had a chance to process it. (db)
 562         */
 563        if (scmd->serial_number == 0)
 564                return SUCCESS;
 565        return __scsi_try_to_abort_cmd(scmd);
 566}
 567
 568static void scsi_abort_eh_cmnd(struct scsi_cmnd *scmd)
 569{
 570        if (__scsi_try_to_abort_cmd(scmd) != SUCCESS)
 571                if (scsi_try_bus_device_reset(scmd) != SUCCESS)
 572                        if (scsi_try_target_reset(scmd) != SUCCESS)
 573                                if (scsi_try_bus_reset(scmd) != SUCCESS)
 574                                        scsi_try_host_reset(scmd);
 575}
 576
 577/**
 578 * scsi_eh_prep_cmnd  - Save a scsi command info as part of error recory
 579 * @scmd:       SCSI command structure to hijack
 580 * @ses:        structure to save restore information
 581 * @cmnd:       CDB to send. Can be NULL if no new cmnd is needed
 582 * @cmnd_size:  size in bytes of @cmnd (must be <= BLK_MAX_CDB)
 583 * @sense_bytes: size of sense data to copy. or 0 (if != 0 @cmnd is ignored)
 584 *
 585 * This function is used to save a scsi command information before re-execution
 586 * as part of the error recovery process.  If @sense_bytes is 0 the command
 587 * sent must be one that does not transfer any data.  If @sense_bytes != 0
 588 * @cmnd is ignored and this functions sets up a REQUEST_SENSE command
 589 * and cmnd buffers to read @sense_bytes into @scmd->sense_buffer.
 590 */
 591void scsi_eh_prep_cmnd(struct scsi_cmnd *scmd, struct scsi_eh_save *ses,
 592                        unsigned char *cmnd, int cmnd_size, unsigned sense_bytes)
 593{
 594        struct scsi_device *sdev = scmd->device;
 595
 596        /*
 597         * We need saved copies of a number of fields - this is because
 598         * error handling may need to overwrite these with different values
 599         * to run different commands, and once error handling is complete,
 600         * we will need to restore these values prior to running the actual
 601         * command.
 602         */
 603        ses->cmd_len = scmd->cmd_len;
 604        ses->cmnd = scmd->cmnd;
 605        ses->data_direction = scmd->sc_data_direction;
 606        ses->sdb = scmd->sdb;
 607        ses->next_rq = scmd->request->next_rq;
 608        ses->result = scmd->result;
 609        ses->underflow = scmd->underflow;
 610        ses->prot_op = scmd->prot_op;
 611
 612        scmd->prot_op = SCSI_PROT_NORMAL;
 613        scmd->cmnd = ses->eh_cmnd;
 614        memset(scmd->cmnd, 0, BLK_MAX_CDB);
 615        memset(&scmd->sdb, 0, sizeof(scmd->sdb));
 616        scmd->request->next_rq = NULL;
 617
 618        if (sense_bytes) {
 619                scmd->sdb.length = min_t(unsigned, SCSI_SENSE_BUFFERSIZE,
 620                                         sense_bytes);
 621                sg_init_one(&ses->sense_sgl, scmd->sense_buffer,
 622                            scmd->sdb.length);
 623                scmd->sdb.table.sgl = &ses->sense_sgl;
 624                scmd->sc_data_direction = DMA_FROM_DEVICE;
 625                scmd->sdb.table.nents = 1;
 626                scmd->cmnd[0] = REQUEST_SENSE;
 627                scmd->cmnd[4] = scmd->sdb.length;
 628                scmd->cmd_len = COMMAND_SIZE(scmd->cmnd[0]);
 629        } else {
 630                scmd->sc_data_direction = DMA_NONE;
 631                if (cmnd) {
 632                        BUG_ON(cmnd_size > BLK_MAX_CDB);
 633                        memcpy(scmd->cmnd, cmnd, cmnd_size);
 634                        scmd->cmd_len = COMMAND_SIZE(scmd->cmnd[0]);
 635                }
 636        }
 637
 638        scmd->underflow = 0;
 639
 640        if (sdev->scsi_level <= SCSI_2 && sdev->scsi_level != SCSI_UNKNOWN)
 641                scmd->cmnd[1] = (scmd->cmnd[1] & 0x1f) |
 642                        (sdev->lun << 5 & 0xe0);
 643
 644        /*
 645         * Zero the sense buffer.  The scsi spec mandates that any
 646         * untransferred sense data should be interpreted as being zero.
 647         */
 648        memset(scmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
 649}
 650EXPORT_SYMBOL(scsi_eh_prep_cmnd);
 651
 652/**
 653 * scsi_eh_restore_cmnd  - Restore a scsi command info as part of error recory
 654 * @scmd:       SCSI command structure to restore
 655 * @ses:        saved information from a coresponding call to scsi_prep_eh_cmnd
 656 *
 657 * Undo any damage done by above scsi_prep_eh_cmnd().
 658 */
 659void scsi_eh_restore_cmnd(struct scsi_cmnd* scmd, struct scsi_eh_save *ses)
 660{
 661        /*
 662         * Restore original data
 663         */
 664        scmd->cmd_len = ses->cmd_len;
 665        scmd->cmnd = ses->cmnd;
 666        scmd->sc_data_direction = ses->data_direction;
 667        scmd->sdb = ses->sdb;
 668        scmd->request->next_rq = ses->next_rq;
 669        scmd->result = ses->result;
 670        scmd->underflow = ses->underflow;
 671        scmd->prot_op = ses->prot_op;
 672}
 673EXPORT_SYMBOL(scsi_eh_restore_cmnd);
 674
 675/**
 676 * scsi_send_eh_cmnd  - submit a scsi command as part of error recory
 677 * @scmd:       SCSI command structure to hijack
 678 * @cmnd:       CDB to send
 679 * @cmnd_size:  size in bytes of @cmnd
 680 * @timeout:    timeout for this request
 681 * @sense_bytes: size of sense data to copy or 0
 682 *
 683 * This function is used to send a scsi command down to a target device
 684 * as part of the error recovery process. See also scsi_eh_prep_cmnd() above.
 685 *
 686 * Return value:
 687 *    SUCCESS or FAILED or NEEDS_RETRY
 688 */
 689static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, unsigned char *cmnd,
 690                             int cmnd_size, int timeout, unsigned sense_bytes)
 691{
 692        struct scsi_device *sdev = scmd->device;
 693        struct Scsi_Host *shost = sdev->host;
 694        DECLARE_COMPLETION_ONSTACK(done);
 695        unsigned long timeleft;
 696        unsigned long flags;
 697        struct scsi_eh_save ses;
 698        int rtn;
 699
 700        scsi_eh_prep_cmnd(scmd, &ses, cmnd, cmnd_size, sense_bytes);
 701        shost->eh_action = &done;
 702
 703        spin_lock_irqsave(shost->host_lock, flags);
 704        scsi_log_send(scmd);
 705        shost->hostt->queuecommand(scmd, scsi_eh_done);
 706        spin_unlock_irqrestore(shost->host_lock, flags);
 707
 708        timeleft = wait_for_completion_timeout(&done, timeout);
 709
 710        shost->eh_action = NULL;
 711
 712        scsi_log_completion(scmd, SUCCESS);
 713
 714        SCSI_LOG_ERROR_RECOVERY(3,
 715                printk("%s: scmd: %p, timeleft: %ld\n",
 716                        __func__, scmd, timeleft));
 717
 718        /*
 719         * If there is time left scsi_eh_done got called, and we will
 720         * examine the actual status codes to see whether the command
 721         * actually did complete normally, else tell the host to forget
 722         * about this command.
 723         */
 724        if (timeleft) {
 725                rtn = scsi_eh_completed_normally(scmd);
 726                SCSI_LOG_ERROR_RECOVERY(3,
 727                        printk("%s: scsi_eh_completed_normally %x\n",
 728                               __func__, rtn));
 729
 730                switch (rtn) {
 731                case SUCCESS:
 732                case NEEDS_RETRY:
 733                case FAILED:
 734                        break;
 735                default:
 736                        rtn = FAILED;
 737                        break;
 738                }
 739        } else {
 740                scsi_abort_eh_cmnd(scmd);
 741                rtn = FAILED;
 742        }
 743
 744        scsi_eh_restore_cmnd(scmd, &ses);
 745        return rtn;
 746}
 747
 748/**
 749 * scsi_request_sense - Request sense data from a particular target.
 750 * @scmd:       SCSI cmd for request sense.
 751 *
 752 * Notes:
 753 *    Some hosts automatically obtain this information, others require
 754 *    that we obtain it on our own. This function will *not* return until
 755 *    the command either times out, or it completes.
 756 */
 757static int scsi_request_sense(struct scsi_cmnd *scmd)
 758{
 759        return scsi_send_eh_cmnd(scmd, NULL, 0, SENSE_TIMEOUT, ~0);
 760}
 761
 762/**
 763 * scsi_eh_finish_cmd - Handle a cmd that eh is finished with.
 764 * @scmd:       Original SCSI cmd that eh has finished.
 765 * @done_q:     Queue for processed commands.
 766 *
 767 * Notes:
 768 *    We don't want to use the normal command completion while we are are
 769 *    still handling errors - it may cause other commands to be queued,
 770 *    and that would disturb what we are doing.  Thus we really want to
 771 *    keep a list of pending commands for final completion, and once we
 772 *    are ready to leave error handling we handle completion for real.
 773 */
 774void scsi_eh_finish_cmd(struct scsi_cmnd *scmd, struct list_head *done_q)
 775{
 776        scmd->device->host->host_failed--;
 777        scmd->eh_eflags = 0;
 778        list_move_tail(&scmd->eh_entry, done_q);
 779}
 780EXPORT_SYMBOL(scsi_eh_finish_cmd);
 781
 782/**
 783 * scsi_eh_get_sense - Get device sense data.
 784 * @work_q:     Queue of commands to process.
 785 * @done_q:     Queue of processed commands.
 786 *
 787 * Description:
 788 *    See if we need to request sense information.  if so, then get it
 789 *    now, so we have a better idea of what to do.  
 790 *
 791 * Notes:
 792 *    This has the unfortunate side effect that if a shost adapter does
 793 *    not automatically request sense information, we end up shutting
 794 *    it down before we request it.
 795 *
 796 *    All drivers should request sense information internally these days,
 797 *    so for now all I have to say is tough noogies if you end up in here.
 798 *
 799 *    XXX: Long term this code should go away, but that needs an audit of
 800 *         all LLDDs first.
 801 */
 802int scsi_eh_get_sense(struct list_head *work_q,
 803                      struct list_head *done_q)
 804{
 805        struct scsi_cmnd *scmd, *next;
 806        int rtn;
 807
 808        list_for_each_entry_safe(scmd, next, work_q, eh_entry) {
 809                if ((scmd->eh_eflags & SCSI_EH_CANCEL_CMD) ||
 810                    SCSI_SENSE_VALID(scmd))
 811                        continue;
 812
 813                SCSI_LOG_ERROR_RECOVERY(2, scmd_printk(KERN_INFO, scmd,
 814                                                  "%s: requesting sense\n",
 815                                                  current->comm));
 816                rtn = scsi_request_sense(scmd);
 817                if (rtn != SUCCESS)
 818                        continue;
 819
 820                SCSI_LOG_ERROR_RECOVERY(3, printk("sense requested for %p"
 821                                                  " result %x\n", scmd,
 822                                                  scmd->result));
 823                SCSI_LOG_ERROR_RECOVERY(3, scsi_print_sense("bh", scmd));
 824
 825                rtn = scsi_decide_disposition(scmd);
 826
 827                /*
 828                 * if the result was normal, then just pass it along to the
 829                 * upper level.
 830                 */
 831                if (rtn == SUCCESS)
 832                        /* we don't want this command reissued, just
 833                         * finished with the sense data, so set
 834                         * retries to the max allowed to ensure it
 835                         * won't get reissued */
 836                        scmd->retries = scmd->allowed;
 837                else if (rtn != NEEDS_RETRY)
 838                        continue;
 839
 840                scsi_eh_finish_cmd(scmd, done_q);
 841        }
 842
 843        return list_empty(work_q);
 844}
 845EXPORT_SYMBOL_GPL(scsi_eh_get_sense);
 846
 847/**
 848 * scsi_eh_tur - Send TUR to device.
 849 * @scmd:       &scsi_cmnd to send TUR
 850 *
 851 * Return value:
 852 *    0 - Device is ready. 1 - Device NOT ready.
 853 */
 854static int scsi_eh_tur(struct scsi_cmnd *scmd)
 855{
 856        static unsigned char tur_command[6] = {TEST_UNIT_READY, 0, 0, 0, 0, 0};
 857        int retry_cnt = 1, rtn;
 858
 859retry_tur:
 860        rtn = scsi_send_eh_cmnd(scmd, tur_command, 6, SENSE_TIMEOUT, 0);
 861
 862        SCSI_LOG_ERROR_RECOVERY(3, printk("%s: scmd %p rtn %x\n",
 863                __func__, scmd, rtn));
 864
 865        switch (rtn) {
 866        case NEEDS_RETRY:
 867                if (retry_cnt--)
 868                        goto retry_tur;
 869                /*FALLTHRU*/
 870        case SUCCESS:
 871                return 0;
 872        default:
 873                return 1;
 874        }
 875}
 876
 877/**
 878 * scsi_eh_abort_cmds - abort pending commands.
 879 * @work_q:     &list_head for pending commands.
 880 * @done_q:     &list_head for processed commands.
 881 *
 882 * Decription:
 883 *    Try and see whether or not it makes sense to try and abort the
 884 *    running command.  This only works out to be the case if we have one
 885 *    command that has timed out.  If the command simply failed, it makes
 886 *    no sense to try and abort the command, since as far as the shost
 887 *    adapter is concerned, it isn't running.
 888 */
 889static int scsi_eh_abort_cmds(struct list_head *work_q,
 890                              struct list_head *done_q)
 891{
 892        struct scsi_cmnd *scmd, *next;
 893        int rtn;
 894
 895        list_for_each_entry_safe(scmd, next, work_q, eh_entry) {
 896                if (!(scmd->eh_eflags & SCSI_EH_CANCEL_CMD))
 897                        continue;
 898                SCSI_LOG_ERROR_RECOVERY(3, printk("%s: aborting cmd:"
 899                                                  "0x%p\n", current->comm,
 900                                                  scmd));
 901                rtn = scsi_try_to_abort_cmd(scmd);
 902                if (rtn == SUCCESS) {
 903                        scmd->eh_eflags &= ~SCSI_EH_CANCEL_CMD;
 904                        if (!scsi_device_online(scmd->device) ||
 905                            !scsi_eh_tur(scmd)) {
 906                                scsi_eh_finish_cmd(scmd, done_q);
 907                        }
 908                                
 909                } else
 910                        SCSI_LOG_ERROR_RECOVERY(3, printk("%s: aborting"
 911                                                          " cmd failed:"
 912                                                          "0x%p\n",
 913                                                          current->comm,
 914                                                          scmd));
 915        }
 916
 917        return list_empty(work_q);
 918}
 919
 920/**
 921 * scsi_eh_try_stu - Send START_UNIT to device.
 922 * @scmd:       &scsi_cmnd to send START_UNIT
 923 *
 924 * Return value:
 925 *    0 - Device is ready. 1 - Device NOT ready.
 926 */
 927static int scsi_eh_try_stu(struct scsi_cmnd *scmd)
 928{
 929        static unsigned char stu_command[6] = {START_STOP, 0, 0, 0, 1, 0};
 930
 931        if (scmd->device->allow_restart) {
 932                int i, rtn = NEEDS_RETRY;
 933
 934                for (i = 0; rtn == NEEDS_RETRY && i < 2; i++)
 935                        rtn = scsi_send_eh_cmnd(scmd, stu_command, 6, scmd->device->request_queue->rq_timeout, 0);
 936
 937                if (rtn == SUCCESS)
 938                        return 0;
 939        }
 940
 941        return 1;
 942}
 943
 944 /**
 945 * scsi_eh_stu - send START_UNIT if needed
 946 * @shost:      &scsi host being recovered.
 947 * @work_q:     &list_head for pending commands.
 948 * @done_q:     &list_head for processed commands.
 949 *
 950 * Notes:
 951 *    If commands are failing due to not ready, initializing command required,
 952 *      try revalidating the device, which will end up sending a start unit. 
 953 */
 954static int scsi_eh_stu(struct Scsi_Host *shost,
 955                              struct list_head *work_q,
 956                              struct list_head *done_q)
 957{
 958        struct scsi_cmnd *scmd, *stu_scmd, *next;
 959        struct scsi_device *sdev;
 960
 961        shost_for_each_device(sdev, shost) {
 962                stu_scmd = NULL;
 963                list_for_each_entry(scmd, work_q, eh_entry)
 964                        if (scmd->device == sdev && SCSI_SENSE_VALID(scmd) &&
 965                            scsi_check_sense(scmd) == FAILED ) {
 966                                stu_scmd = scmd;
 967                                break;
 968                        }
 969
 970                if (!stu_scmd)
 971                        continue;
 972
 973                SCSI_LOG_ERROR_RECOVERY(3, printk("%s: Sending START_UNIT to sdev:"
 974                                                  " 0x%p\n", current->comm, sdev));
 975
 976                if (!scsi_eh_try_stu(stu_scmd)) {
 977                        if (!scsi_device_online(sdev) ||
 978                            !scsi_eh_tur(stu_scmd)) {
 979                                list_for_each_entry_safe(scmd, next,
 980                                                          work_q, eh_entry) {
 981                                        if (scmd->device == sdev)
 982                                                scsi_eh_finish_cmd(scmd, done_q);
 983                                }
 984                        }
 985                } else {
 986                        SCSI_LOG_ERROR_RECOVERY(3,
 987                                                printk("%s: START_UNIT failed to sdev:"
 988                                                       " 0x%p\n", current->comm, sdev));
 989                }
 990        }
 991
 992        return list_empty(work_q);
 993}
 994
 995
 996/**
 997 * scsi_eh_bus_device_reset - send bdr if needed
 998 * @shost:      scsi host being recovered.
 999 * @work_q:     &list_head for pending commands.
1000 * @done_q:     &list_head for processed commands.
1001 *
1002 * Notes:
1003 *    Try a bus device reset.  Still, look to see whether we have multiple
1004 *    devices that are jammed or not - if we have multiple devices, it
1005 *    makes no sense to try bus_device_reset - we really would need to try
1006 *    a bus_reset instead. 
1007 */
1008static int scsi_eh_bus_device_reset(struct Scsi_Host *shost,
1009                                    struct list_head *work_q,
1010                                    struct list_head *done_q)
1011{
1012        struct scsi_cmnd *scmd, *bdr_scmd, *next;
1013        struct scsi_device *sdev;
1014        int rtn;
1015
1016        shost_for_each_device(sdev, shost) {
1017                bdr_scmd = NULL;
1018                list_for_each_entry(scmd, work_q, eh_entry)
1019                        if (scmd->device == sdev) {
1020                                bdr_scmd = scmd;
1021                                break;
1022                        }
1023
1024                if (!bdr_scmd)
1025                        continue;
1026
1027                SCSI_LOG_ERROR_RECOVERY(3, printk("%s: Sending BDR sdev:"
1028                                                  " 0x%p\n", current->comm,
1029                                                  sdev));
1030                rtn = scsi_try_bus_device_reset(bdr_scmd);
1031                if (rtn == SUCCESS) {
1032                        if (!scsi_device_online(sdev) ||
1033                            !scsi_eh_tur(bdr_scmd)) {
1034                                list_for_each_entry_safe(scmd, next,
1035                                                         work_q, eh_entry) {
1036                                        if (scmd->device == sdev)
1037                                                scsi_eh_finish_cmd(scmd,
1038                                                                   done_q);
1039                                }
1040                        }
1041                } else {
1042                        SCSI_LOG_ERROR_RECOVERY(3, printk("%s: BDR"
1043                                                          " failed sdev:"
1044                                                          "0x%p\n",
1045                                                          current->comm,
1046                                                           sdev));
1047                }
1048        }
1049
1050        return list_empty(work_q);
1051}
1052
1053/**
1054 * scsi_eh_target_reset - send target reset if needed
1055 * @shost:      scsi host being recovered.
1056 * @work_q:     &list_head for pending commands.
1057 * @done_q:     &list_head for processed commands.
1058 *
1059 * Notes:
1060 *    Try a target reset.
1061 */
1062static int scsi_eh_target_reset(struct Scsi_Host *shost,
1063                                struct list_head *work_q,
1064                                struct list_head *done_q)
1065{
1066        struct scsi_cmnd *scmd, *tgtr_scmd, *next;
1067        unsigned int id = 0;
1068        int rtn;
1069
1070        do {
1071                tgtr_scmd = NULL;
1072                list_for_each_entry(scmd, work_q, eh_entry) {
1073                        if (id == scmd_id(scmd)) {
1074                                tgtr_scmd = scmd;
1075                                break;
1076                        }
1077                }
1078                if (!tgtr_scmd) {
1079                        /* not one exactly equal; find the next highest */
1080                        list_for_each_entry(scmd, work_q, eh_entry) {
1081                                if (scmd_id(scmd) > id &&
1082                                    (!tgtr_scmd ||
1083                                     scmd_id(tgtr_scmd) > scmd_id(scmd)))
1084                                                tgtr_scmd = scmd;
1085                        }
1086                }
1087                if (!tgtr_scmd)
1088                        /* no more commands, that's it */
1089                        break;
1090
1091                SCSI_LOG_ERROR_RECOVERY(3, printk("%s: Sending target reset "
1092                                                  "to target %d\n",
1093                                                  current->comm, id));
1094                rtn = scsi_try_target_reset(tgtr_scmd);
1095                if (rtn == SUCCESS) {
1096                        list_for_each_entry_safe(scmd, next, work_q, eh_entry) {
1097                                if (id == scmd_id(scmd))
1098                                        if (!scsi_device_online(scmd->device) ||
1099                                            !scsi_eh_tur(tgtr_scmd))
1100                                                scsi_eh_finish_cmd(scmd,
1101                                                                   done_q);
1102                        }
1103                } else
1104                        SCSI_LOG_ERROR_RECOVERY(3, printk("%s: Target reset"
1105                                                          " failed target: "
1106                                                          "%d\n",
1107                                                          current->comm, id));
1108                id++;
1109        } while(id != 0);
1110
1111        return list_empty(work_q);
1112}
1113
1114/**
1115 * scsi_eh_bus_reset - send a bus reset 
1116 * @shost:      &scsi host being recovered.
1117 * @work_q:     &list_head for pending commands.
1118 * @done_q:     &list_head for processed commands.
1119 */
1120static int scsi_eh_bus_reset(struct Scsi_Host *shost,
1121                             struct list_head *work_q,
1122                             struct list_head *done_q)
1123{
1124        struct scsi_cmnd *scmd, *chan_scmd, *next;
1125        unsigned int channel;
1126        int rtn;
1127
1128        /*
1129         * we really want to loop over the various channels, and do this on
1130         * a channel by channel basis.  we should also check to see if any
1131         * of the failed commands are on soft_reset devices, and if so, skip
1132         * the reset.  
1133         */
1134
1135        for (channel = 0; channel <= shost->max_channel; channel++) {
1136                chan_scmd = NULL;
1137                list_for_each_entry(scmd, work_q, eh_entry) {
1138                        if (channel == scmd_channel(scmd)) {
1139                                chan_scmd = scmd;
1140                                break;
1141                                /*
1142                                 * FIXME add back in some support for
1143                                 * soft_reset devices.
1144                                 */
1145                        }
1146                }
1147
1148                if (!chan_scmd)
1149                        continue;
1150                SCSI_LOG_ERROR_RECOVERY(3, printk("%s: Sending BRST chan:"
1151                                                  " %d\n", current->comm,
1152                                                  channel));
1153                rtn = scsi_try_bus_reset(chan_scmd);
1154                if (rtn == SUCCESS) {
1155                        list_for_each_entry_safe(scmd, next, work_q, eh_entry) {
1156                                if (channel == scmd_channel(scmd))
1157                                        if (!scsi_device_online(scmd->device) ||
1158                                            !scsi_eh_tur(scmd))
1159                                                scsi_eh_finish_cmd(scmd,
1160                                                                   done_q);
1161                        }
1162                } else {
1163                        SCSI_LOG_ERROR_RECOVERY(3, printk("%s: BRST"
1164                                                          " failed chan: %d\n",
1165                                                          current->comm,
1166                                                          channel));
1167                }
1168        }
1169        return list_empty(work_q);
1170}
1171
1172/**
1173 * scsi_eh_host_reset - send a host reset 
1174 * @work_q:     list_head for processed commands.
1175 * @done_q:     list_head for processed commands.
1176 */
1177static int scsi_eh_host_reset(struct list_head *work_q,
1178                              struct list_head *done_q)
1179{
1180        struct scsi_cmnd *scmd, *next;
1181        int rtn;
1182
1183        if (!list_empty(work_q)) {
1184                scmd = list_entry(work_q->next,
1185                                  struct scsi_cmnd, eh_entry);
1186
1187                SCSI_LOG_ERROR_RECOVERY(3, printk("%s: Sending HRST\n"
1188                                                  , current->comm));
1189
1190                rtn = scsi_try_host_reset(scmd);
1191                if (rtn == SUCCESS) {
1192                        list_for_each_entry_safe(scmd, next, work_q, eh_entry) {
1193                                if (!scsi_device_online(scmd->device) ||
1194                                    (!scsi_eh_try_stu(scmd) && !scsi_eh_tur(scmd)) ||
1195                                    !scsi_eh_tur(scmd))
1196                                        scsi_eh_finish_cmd(scmd, done_q);
1197                        }
1198                } else {
1199                        SCSI_LOG_ERROR_RECOVERY(3, printk("%s: HRST"
1200                                                          " failed\n",
1201                                                          current->comm));
1202                }
1203        }
1204        return list_empty(work_q);
1205}
1206
1207/**
1208 * scsi_eh_offline_sdevs - offline scsi devices that fail to recover
1209 * @work_q:     list_head for processed commands.
1210 * @done_q:     list_head for processed commands.
1211 */
1212static void scsi_eh_offline_sdevs(struct list_head *work_q,
1213                                  struct list_head *done_q)
1214{
1215        struct scsi_cmnd *scmd, *next;
1216
1217        list_for_each_entry_safe(scmd, next, work_q, eh_entry) {
1218                sdev_printk(KERN_INFO, scmd->device, "Device offlined - "
1219                            "not ready after error recovery\n");
1220                scsi_device_set_state(scmd->device, SDEV_OFFLINE);
1221                if (scmd->eh_eflags & SCSI_EH_CANCEL_CMD) {
1222                        /*
1223                         * FIXME: Handle lost cmds.
1224                         */
1225                }
1226                scsi_eh_finish_cmd(scmd, done_q);
1227        }
1228        return;
1229}
1230
1231/**
1232 * scsi_noretry_cmd - determinte if command should be failed fast
1233 * @scmd:       SCSI cmd to examine.
1234 */
1235int scsi_noretry_cmd(struct scsi_cmnd *scmd)
1236{
1237        switch (host_byte(scmd->result)) {
1238        case DID_OK:
1239                break;
1240        case DID_BUS_BUSY:
1241                return blk_failfast_transport(scmd->request);
1242        case DID_PARITY:
1243                return blk_failfast_dev(scmd->request);
1244        case DID_ERROR:
1245                if (msg_byte(scmd->result) == COMMAND_COMPLETE &&
1246                    status_byte(scmd->result) == RESERVATION_CONFLICT)
1247                        return 0;
1248                /* fall through */
1249        case DID_SOFT_ERROR:
1250                return blk_failfast_driver(scmd->request);
1251        }
1252
1253        switch (status_byte(scmd->result)) {
1254        case CHECK_CONDITION:
1255                /*
1256                 * assume caller has checked sense and determinted
1257                 * the check condition was retryable.
1258                 */
1259                return blk_failfast_dev(scmd->request);
1260        }
1261
1262        return 0;
1263}
1264
1265/**
1266 * scsi_decide_disposition - Disposition a cmd on return from LLD.
1267 * @scmd:       SCSI cmd to examine.
1268 *
1269 * Notes:
1270 *    This is *only* called when we are examining the status after sending
1271 *    out the actual data command.  any commands that are queued for error
1272 *    recovery (e.g. test_unit_ready) do *not* come through here.
1273 *
1274 *    When this routine returns failed, it means the error handler thread
1275 *    is woken.  In cases where the error code indicates an error that
1276 *    doesn't require the error handler read (i.e. we don't need to
1277 *    abort/reset), this function should return SUCCESS.
1278 */
1279int scsi_decide_disposition(struct scsi_cmnd *scmd)
1280{
1281        int rtn;
1282
1283        /*
1284         * if the device is offline, then we clearly just pass the result back
1285         * up to the top level.
1286         */
1287        if (!scsi_device_online(scmd->device)) {
1288                SCSI_LOG_ERROR_RECOVERY(5, printk("%s: device offline - report"
1289                                                  " as SUCCESS\n",
1290                                                  __func__));
1291                return SUCCESS;
1292        }
1293
1294        /*
1295         * first check the host byte, to see if there is anything in there
1296         * that would indicate what we need to do.
1297         */
1298        switch (host_byte(scmd->result)) {
1299        case DID_PASSTHROUGH:
1300                /*
1301                 * no matter what, pass this through to the upper layer.
1302                 * nuke this special code so that it looks like we are saying
1303                 * did_ok.
1304                 */
1305                scmd->result &= 0xff00ffff;
1306                return SUCCESS;
1307        case DID_OK:
1308                /*
1309                 * looks good.  drop through, and check the next byte.
1310                 */
1311                break;
1312        case DID_NO_CONNECT:
1313        case DID_BAD_TARGET:
1314        case DID_ABORT:
1315                /*
1316                 * note - this means that we just report the status back
1317                 * to the top level driver, not that we actually think
1318                 * that it indicates SUCCESS.
1319                 */
1320                return SUCCESS;
1321                /*
1322                 * when the low level driver returns did_soft_error,
1323                 * it is responsible for keeping an internal retry counter 
1324                 * in order to avoid endless loops (db)
1325                 *
1326                 * actually this is a bug in this function here.  we should
1327                 * be mindful of the maximum number of retries specified
1328                 * and not get stuck in a loop.
1329                 */
1330        case DID_SOFT_ERROR:
1331                goto maybe_retry;
1332        case DID_IMM_RETRY:
1333                return NEEDS_RETRY;
1334
1335        case DID_REQUEUE:
1336                return ADD_TO_MLQUEUE;
1337        case DID_TRANSPORT_DISRUPTED:
1338                /*
1339                 * LLD/transport was disrupted during processing of the IO.
1340                 * The transport class is now blocked/blocking,
1341                 * and the transport will decide what to do with the IO
1342                 * based on its timers and recovery capablilities if
1343                 * there are enough retries.
1344                 */
1345                goto maybe_retry;
1346        case DID_TRANSPORT_FAILFAST:
1347                /*
1348                 * The transport decided to failfast the IO (most likely
1349                 * the fast io fail tmo fired), so send IO directly upwards.
1350                 */
1351                return SUCCESS;
1352        case DID_ERROR:
1353                if (msg_byte(scmd->result) == COMMAND_COMPLETE &&
1354                    status_byte(scmd->result) == RESERVATION_CONFLICT)
1355                        /*
1356                         * execute reservation conflict processing code
1357                         * lower down
1358                         */
1359                        break;
1360                /* fallthrough */
1361
1362        case DID_BUS_BUSY:
1363        case DID_PARITY:
1364                goto maybe_retry;
1365        case DID_TIME_OUT:
1366                /*
1367                 * when we scan the bus, we get timeout messages for
1368                 * these commands if there is no device available.
1369                 * other hosts report did_no_connect for the same thing.
1370                 */
1371                if ((scmd->cmnd[0] == TEST_UNIT_READY ||
1372                     scmd->cmnd[0] == INQUIRY)) {
1373                        return SUCCESS;
1374                } else {
1375                        return FAILED;
1376                }
1377        case DID_RESET:
1378                return SUCCESS;
1379        default:
1380                return FAILED;
1381        }
1382
1383        /*
1384         * next, check the message byte.
1385         */
1386        if (msg_byte(scmd->result) != COMMAND_COMPLETE)
1387                return FAILED;
1388
1389        /*
1390         * check the status byte to see if this indicates anything special.
1391         */
1392        switch (status_byte(scmd->result)) {
1393        case QUEUE_FULL:
1394                /*
1395                 * the case of trying to send too many commands to a
1396                 * tagged queueing device.
1397                 */
1398        case BUSY:
1399                /*
1400                 * device can't talk to us at the moment.  Should only
1401                 * occur (SAM-3) when the task queue is empty, so will cause
1402                 * the empty queue handling to trigger a stall in the
1403                 * device.
1404                 */
1405                return ADD_TO_MLQUEUE;
1406        case GOOD:
1407        case COMMAND_TERMINATED:
1408        case TASK_ABORTED:
1409                return SUCCESS;
1410        case CHECK_CONDITION:
1411                rtn = scsi_check_sense(scmd);
1412                if (rtn == NEEDS_RETRY)
1413                        goto maybe_retry;
1414                /* if rtn == FAILED, we have no sense information;
1415                 * returning FAILED will wake the error handler thread
1416                 * to collect the sense and redo the decide
1417                 * disposition */
1418                return rtn;
1419        case CONDITION_GOOD:
1420        case INTERMEDIATE_GOOD:
1421        case INTERMEDIATE_C_GOOD:
1422        case ACA_ACTIVE:
1423                /*
1424                 * who knows?  FIXME(eric)
1425                 */
1426                return SUCCESS;
1427
1428        case RESERVATION_CONFLICT:
1429                sdev_printk(KERN_INFO, scmd->device,
1430                            "reservation conflict\n");
1431                return SUCCESS; /* causes immediate i/o error */
1432        default:
1433                return FAILED;
1434        }
1435        return FAILED;
1436
1437      maybe_retry:
1438
1439        /* we requeue for retry because the error was retryable, and
1440         * the request was not marked fast fail.  Note that above,
1441         * even if the request is marked fast fail, we still requeue
1442         * for queue congestion conditions (QUEUE_FULL or BUSY) */
1443        if ((++scmd->retries) <= scmd->allowed
1444            && !scsi_noretry_cmd(scmd)) {
1445                return NEEDS_RETRY;
1446        } else {
1447                /*
1448                 * no more retries - report this one back to upper level.
1449                 */
1450                return SUCCESS;
1451        }
1452}
1453
1454/**
1455 * scsi_eh_lock_door - Prevent medium removal for the specified device
1456 * @sdev:       SCSI device to prevent medium removal
1457 *
1458 * Locking:
1459 *      We must be called from process context; scsi_allocate_request()
1460 *      may sleep.
1461 *
1462 * Notes:
1463 *      We queue up an asynchronous "ALLOW MEDIUM REMOVAL" request on the
1464 *      head of the devices request queue, and continue.
1465 *
1466 * Bugs:
1467 *      scsi_allocate_request() may sleep waiting for existing requests to
1468 *      be processed.  However, since we haven't kicked off any request
1469 *      processing for this host, this may deadlock.
1470 *
1471 *      If scsi_allocate_request() fails for what ever reason, we
1472 *      completely forget to lock the door.
1473 */
1474static void scsi_eh_lock_door(struct scsi_device *sdev)
1475{
1476        unsigned char cmnd[MAX_COMMAND_SIZE];
1477
1478        cmnd[0] = ALLOW_MEDIUM_REMOVAL;
1479        cmnd[1] = 0;
1480        cmnd[2] = 0;
1481        cmnd[3] = 0;
1482        cmnd[4] = SCSI_REMOVAL_PREVENT;
1483        cmnd[5] = 0;
1484
1485        scsi_execute_async(sdev, cmnd, 6, DMA_NONE, NULL, 0, 0, 10 * HZ,
1486                           5, NULL, NULL, GFP_KERNEL);
1487}
1488
1489
1490/**
1491 * scsi_restart_operations - restart io operations to the specified host.
1492 * @shost:      Host we are restarting.
1493 *
1494 * Notes:
1495 *    When we entered the error handler, we blocked all further i/o to
1496 *    this device.  we need to 'reverse' this process.
1497 */
1498static void scsi_restart_operations(struct Scsi_Host *shost)
1499{
1500        struct scsi_device *sdev;
1501        unsigned long flags;
1502
1503        /*
1504         * If the door was locked, we need to insert a door lock request
1505         * onto the head of the SCSI request queue for the device.  There
1506         * is no point trying to lock the door of an off-line device.
1507         */
1508        shost_for_each_device(sdev, shost) {
1509                if (scsi_device_online(sdev) && sdev->locked)
1510                        scsi_eh_lock_door(sdev);
1511        }
1512
1513        /*
1514         * next free up anything directly waiting upon the host.  this
1515         * will be requests for character device operations, and also for
1516         * ioctls to queued block devices.
1517         */
1518        SCSI_LOG_ERROR_RECOVERY(3, printk("%s: waking up host to restart\n",
1519                                          __func__));
1520
1521        spin_lock_irqsave(shost->host_lock, flags);
1522        if (scsi_host_set_state(shost, SHOST_RUNNING))
1523                if (scsi_host_set_state(shost, SHOST_CANCEL))
1524                        BUG_ON(scsi_host_set_state(shost, SHOST_DEL));
1525        spin_unlock_irqrestore(shost->host_lock, flags);
1526
1527        wake_up(&shost->host_wait);
1528
1529        /*
1530         * finally we need to re-initiate requests that may be pending.  we will
1531         * have had everything blocked while error handling is taking place, and
1532         * now that error recovery is done, we will need to ensure that these
1533         * requests are started.
1534         */
1535        scsi_run_host_queues(shost);
1536}
1537
1538/**
1539 * scsi_eh_ready_devs - check device ready state and recover if not.
1540 * @shost:      host to be recovered.
1541 * @work_q:     &list_head for pending commands.
1542 * @done_q:     &list_head for processed commands.
1543 */
1544void scsi_eh_ready_devs(struct Scsi_Host *shost,
1545                        struct list_head *work_q,
1546                        struct list_head *done_q)
1547{
1548        if (!scsi_eh_stu(shost, work_q, done_q))
1549                if (!scsi_eh_bus_device_reset(shost, work_q, done_q))
1550                        if (!scsi_eh_target_reset(shost, work_q, done_q))
1551                                if (!scsi_eh_bus_reset(shost, work_q, done_q))
1552                                        if (!scsi_eh_host_reset(work_q, done_q))
1553                                                scsi_eh_offline_sdevs(work_q,
1554                                                                      done_q);
1555}
1556EXPORT_SYMBOL_GPL(scsi_eh_ready_devs);
1557
1558/**
1559 * scsi_eh_flush_done_q - finish processed commands or retry them.
1560 * @done_q:     list_head of processed commands.
1561 */
1562void scsi_eh_flush_done_q(struct list_head *done_q)
1563{
1564        struct scsi_cmnd *scmd, *next;
1565
1566        list_for_each_entry_safe(scmd, next, done_q, eh_entry) {
1567                list_del_init(&scmd->eh_entry);
1568                if (scsi_device_online(scmd->device) &&
1569                    !scsi_noretry_cmd(scmd) &&
1570                    (++scmd->retries <= scmd->allowed)) {
1571                        SCSI_LOG_ERROR_RECOVERY(3, printk("%s: flush"
1572                                                          " retry cmd: %p\n",
1573                                                          current->comm,
1574                                                          scmd));
1575                                scsi_queue_insert(scmd, SCSI_MLQUEUE_EH_RETRY);
1576                } else {
1577                        /*
1578                         * If just we got sense for the device (called
1579                         * scsi_eh_get_sense), scmd->result is already
1580                         * set, do not set DRIVER_TIMEOUT.
1581                         */
1582                        if (!scmd->result)
1583                                scmd->result |= (DRIVER_TIMEOUT << 24);
1584                        SCSI_LOG_ERROR_RECOVERY(3, printk("%s: flush finish"
1585                                                        " cmd: %p\n",
1586                                                        current->comm, scmd));
1587                        scsi_finish_command(scmd);
1588                }
1589        }
1590}
1591EXPORT_SYMBOL(scsi_eh_flush_done_q);
1592
1593/**
1594 * scsi_unjam_host - Attempt to fix a host which has a cmd that failed.
1595 * @shost:      Host to unjam.
1596 *
1597 * Notes:
1598 *    When we come in here, we *know* that all commands on the bus have
1599 *    either completed, failed or timed out.  we also know that no further
1600 *    commands are being sent to the host, so things are relatively quiet
1601 *    and we have freedom to fiddle with things as we wish.
1602 *
1603 *    This is only the *default* implementation.  it is possible for
1604 *    individual drivers to supply their own version of this function, and
1605 *    if the maintainer wishes to do this, it is strongly suggested that
1606 *    this function be taken as a template and modified.  this function
1607 *    was designed to correctly handle problems for about 95% of the
1608 *    different cases out there, and it should always provide at least a
1609 *    reasonable amount of error recovery.
1610 *
1611 *    Any command marked 'failed' or 'timeout' must eventually have
1612 *    scsi_finish_cmd() called for it.  we do all of the retry stuff
1613 *    here, so when we restart the host after we return it should have an
1614 *    empty queue.
1615 */
1616static void scsi_unjam_host(struct Scsi_Host *shost)
1617{
1618        unsigned long flags;
1619        LIST_HEAD(eh_work_q);
1620        LIST_HEAD(eh_done_q);
1621
1622        spin_lock_irqsave(shost->host_lock, flags);
1623        list_splice_init(&shost->eh_cmd_q, &eh_work_q);
1624        spin_unlock_irqrestore(shost->host_lock, flags);
1625
1626        SCSI_LOG_ERROR_RECOVERY(1, scsi_eh_prt_fail_stats(shost, &eh_work_q));
1627
1628        if (!scsi_eh_get_sense(&eh_work_q, &eh_done_q))
1629                if (!scsi_eh_abort_cmds(&eh_work_q, &eh_done_q))
1630                        scsi_eh_ready_devs(shost, &eh_work_q, &eh_done_q);
1631
1632        scsi_eh_flush_done_q(&eh_done_q);
1633}
1634
1635/**
1636 * scsi_error_handler - SCSI error handler thread
1637 * @data:       Host for which we are running.
1638 *
1639 * Notes:
1640 *    This is the main error handling loop.  This is run as a kernel thread
1641 *    for every SCSI host and handles all error handling activity.
1642 */
1643int scsi_error_handler(void *data)
1644{
1645        struct Scsi_Host *shost = data;
1646
1647        /*
1648         * We use TASK_INTERRUPTIBLE so that the thread is not
1649         * counted against the load average as a running process.
1650         * We never actually get interrupted because kthread_run
1651         * disables singal delivery for the created thread.
1652         */
1653        set_current_state(TASK_INTERRUPTIBLE);
1654        while (!kthread_should_stop()) {
1655                if ((shost->host_failed == 0 && shost->host_eh_scheduled == 0) ||
1656                    shost->host_failed != shost->host_busy) {
1657                        SCSI_LOG_ERROR_RECOVERY(1,
1658                                printk("Error handler scsi_eh_%d sleeping\n",
1659                                        shost->host_no));
1660                        schedule();
1661                        set_current_state(TASK_INTERRUPTIBLE);
1662                        continue;
1663                }
1664
1665                __set_current_state(TASK_RUNNING);
1666                SCSI_LOG_ERROR_RECOVERY(1,
1667                        printk("Error handler scsi_eh_%d waking up\n",
1668                                shost->host_no));
1669
1670                /*
1671                 * We have a host that is failing for some reason.  Figure out
1672                 * what we need to do to get it up and online again (if we can).
1673                 * If we fail, we end up taking the thing offline.
1674                 */
1675                if (shost->transportt->eh_strategy_handler)
1676                        shost->transportt->eh_strategy_handler(shost);
1677                else
1678                        scsi_unjam_host(shost);
1679
1680                /*
1681                 * Note - if the above fails completely, the action is to take
1682                 * individual devices offline and flush the queue of any
1683                 * outstanding requests that may have been pending.  When we
1684                 * restart, we restart any I/O to any other devices on the bus
1685                 * which are still online.
1686                 */
1687                scsi_restart_operations(shost);
1688                set_current_state(TASK_INTERRUPTIBLE);
1689        }
1690        __set_current_state(TASK_RUNNING);
1691
1692        SCSI_LOG_ERROR_RECOVERY(1,
1693                printk("Error handler scsi_eh_%d exiting\n", shost->host_no));
1694        shost->ehandler = NULL;
1695        return 0;
1696}
1697
1698/*
1699 * Function:    scsi_report_bus_reset()
1700 *
1701 * Purpose:     Utility function used by low-level drivers to report that
1702 *              they have observed a bus reset on the bus being handled.
1703 *
1704 * Arguments:   shost       - Host in question
1705 *              channel     - channel on which reset was observed.
1706 *
1707 * Returns:     Nothing
1708 *
1709 * Lock status: Host lock must be held.
1710 *
1711 * Notes:       This only needs to be called if the reset is one which
1712 *              originates from an unknown location.  Resets originated
1713 *              by the mid-level itself don't need to call this, but there
1714 *              should be no harm.
1715 *
1716 *              The main purpose of this is to make sure that a CHECK_CONDITION
1717 *              is properly treated.
1718 */
1719void scsi_report_bus_reset(struct Scsi_Host *shost, int channel)
1720{
1721        struct scsi_device *sdev;
1722
1723        __shost_for_each_device(sdev, shost) {
1724                if (channel == sdev_channel(sdev))
1725                        __scsi_report_device_reset(sdev, NULL);
1726        }
1727}
1728EXPORT_SYMBOL(scsi_report_bus_reset);
1729
1730/*
1731 * Function:    scsi_report_device_reset()
1732 *
1733 * Purpose:     Utility function used by low-level drivers to report that
1734 *              they have observed a device reset on the device being handled.
1735 *
1736 * Arguments:   shost       - Host in question
1737 *              channel     - channel on which reset was observed
1738 *              target      - target on which reset was observed
1739 *
1740 * Returns:     Nothing
1741 *
1742 * Lock status: Host lock must be held
1743 *
1744 * Notes:       This only needs to be called if the reset is one which
1745 *              originates from an unknown location.  Resets originated
1746 *              by the mid-level itself don't need to call this, but there
1747 *              should be no harm.
1748 *
1749 *              The main purpose of this is to make sure that a CHECK_CONDITION
1750 *              is properly treated.
1751 */
1752void scsi_report_device_reset(struct Scsi_Host *shost, int channel, int target)
1753{
1754        struct scsi_device *sdev;
1755
1756        __shost_for_each_device(sdev, shost) {
1757                if (channel == sdev_channel(sdev) &&
1758                    target == sdev_id(sdev))
1759                        __scsi_report_device_reset(sdev, NULL);
1760        }
1761}
1762EXPORT_SYMBOL(scsi_report_device_reset);
1763
1764static void
1765scsi_reset_provider_done_command(struct scsi_cmnd *scmd)
1766{
1767}
1768
1769/*
1770 * Function:    scsi_reset_provider
1771 *
1772 * Purpose:     Send requested reset to a bus or device at any phase.
1773 *
1774 * Arguments:   device  - device to send reset to
1775 *              flag - reset type (see scsi.h)
1776 *
1777 * Returns:     SUCCESS/FAILURE.
1778 *
1779 * Notes:       This is used by the SCSI Generic driver to provide
1780 *              Bus/Device reset capability.
1781 */
1782int
1783scsi_reset_provider(struct scsi_device *dev, int flag)
1784{
1785        struct scsi_cmnd *scmd = scsi_get_command(dev, GFP_KERNEL);
1786        struct Scsi_Host *shost = dev->host;
1787        struct request req;
1788        unsigned long flags;
1789        int rtn;
1790
1791        blk_rq_init(NULL, &req);
1792        scmd->request = &req;
1793
1794        scmd->cmnd = req.cmd;
1795
1796        scmd->scsi_done         = scsi_reset_provider_done_command;
1797        memset(&scmd->sdb, 0, sizeof(scmd->sdb));
1798
1799        scmd->cmd_len                   = 0;
1800
1801        scmd->sc_data_direction         = DMA_BIDIRECTIONAL;
1802
1803        spin_lock_irqsave(shost->host_lock, flags);
1804        shost->tmf_in_progress = 1;
1805        spin_unlock_irqrestore(shost->host_lock, flags);
1806
1807        switch (flag) {
1808        case SCSI_TRY_RESET_DEVICE:
1809                rtn = scsi_try_bus_device_reset(scmd);
1810                if (rtn == SUCCESS)
1811                        break;
1812                /* FALLTHROUGH */
1813        case SCSI_TRY_RESET_TARGET:
1814                rtn = scsi_try_target_reset(scmd);
1815                if (rtn == SUCCESS)
1816                        break;
1817                /* FALLTHROUGH */
1818        case SCSI_TRY_RESET_BUS:
1819                rtn = scsi_try_bus_reset(scmd);
1820                if (rtn == SUCCESS)
1821                        break;
1822                /* FALLTHROUGH */
1823        case SCSI_TRY_RESET_HOST:
1824                rtn = scsi_try_host_reset(scmd);
1825                break;
1826        default:
1827                rtn = FAILED;
1828        }
1829
1830        spin_lock_irqsave(shost->host_lock, flags);
1831        shost->tmf_in_progress = 0;
1832        spin_unlock_irqrestore(shost->host_lock, flags);
1833
1834        /*
1835         * be sure to wake up anyone who was sleeping or had their queue
1836         * suspended while we performed the TMF.
1837         */
1838        SCSI_LOG_ERROR_RECOVERY(3,
1839                printk("%s: waking up host to restart after TMF\n",
1840                __func__));
1841
1842        wake_up(&shost->host_wait);
1843
1844        scsi_run_host_queues(shost);
1845
1846        scsi_next_command(scmd);
1847        return rtn;
1848}
1849EXPORT_SYMBOL(scsi_reset_provider);
1850
1851/**
1852 * scsi_normalize_sense - normalize main elements from either fixed or
1853 *                      descriptor sense data format into a common format.
1854 *
1855 * @sense_buffer:       byte array containing sense data returned by device
1856 * @sb_len:             number of valid bytes in sense_buffer
1857 * @sshdr:              pointer to instance of structure that common
1858 *                      elements are written to.
1859 *
1860 * Notes:
1861 *      The "main elements" from sense data are: response_code, sense_key,
1862 *      asc, ascq and additional_length (only for descriptor format).
1863 *
1864 *      Typically this function can be called after a device has
1865 *      responded to a SCSI command with the CHECK_CONDITION status.
1866 *
1867 * Return value:
1868 *      1 if valid sense data information found, else 0;
1869 */
1870int scsi_normalize_sense(const u8 *sense_buffer, int sb_len,
1871                         struct scsi_sense_hdr *sshdr)
1872{
1873        if (!sense_buffer || !sb_len)
1874                return 0;
1875
1876        memset(sshdr, 0, sizeof(struct scsi_sense_hdr));
1877
1878        sshdr->response_code = (sense_buffer[0] & 0x7f);
1879
1880        if (!scsi_sense_valid(sshdr))
1881                return 0;
1882
1883        if (sshdr->response_code >= 0x72) {
1884                /*
1885                 * descriptor format
1886                 */
1887                if (sb_len > 1)
1888                        sshdr->sense_key = (sense_buffer[1] & 0xf);
1889                if (sb_len > 2)
1890                        sshdr->asc = sense_buffer[2];
1891                if (sb_len > 3)
1892                        sshdr->ascq = sense_buffer[3];
1893                if (sb_len > 7)
1894                        sshdr->additional_length = sense_buffer[7];
1895        } else {
1896                /* 
1897                 * fixed format
1898                 */
1899                if (sb_len > 2)
1900                        sshdr->sense_key = (sense_buffer[2] & 0xf);
1901                if (sb_len > 7) {
1902                        sb_len = (sb_len < (sense_buffer[7] + 8)) ?
1903                                         sb_len : (sense_buffer[7] + 8);
1904                        if (sb_len > 12)
1905                                sshdr->asc = sense_buffer[12];
1906                        if (sb_len > 13)
1907                                sshdr->ascq = sense_buffer[13];
1908                }
1909        }
1910
1911        return 1;
1912}
1913EXPORT_SYMBOL(scsi_normalize_sense);
1914
1915int scsi_command_normalize_sense(struct scsi_cmnd *cmd,
1916                                 struct scsi_sense_hdr *sshdr)
1917{
1918        return scsi_normalize_sense(cmd->sense_buffer,
1919                        SCSI_SENSE_BUFFERSIZE, sshdr);
1920}
1921EXPORT_SYMBOL(scsi_command_normalize_sense);
1922
1923/**
1924 * scsi_sense_desc_find - search for a given descriptor type in descriptor sense data format.
1925 * @sense_buffer:       byte array of descriptor format sense data
1926 * @sb_len:             number of valid bytes in sense_buffer
1927 * @desc_type:          value of descriptor type to find
1928 *                      (e.g. 0 -> information)
1929 *
1930 * Notes:
1931 *      only valid when sense data is in descriptor format
1932 *
1933 * Return value:
1934 *      pointer to start of (first) descriptor if found else NULL
1935 */
1936const u8 * scsi_sense_desc_find(const u8 * sense_buffer, int sb_len,
1937                                int desc_type)
1938{
1939        int add_sen_len, add_len, desc_len, k;
1940        const u8 * descp;
1941
1942        if ((sb_len < 8) || (0 == (add_sen_len = sense_buffer[7])))
1943                return NULL;
1944        if ((sense_buffer[0] < 0x72) || (sense_buffer[0] > 0x73))
1945                return NULL;
1946        add_sen_len = (add_sen_len < (sb_len - 8)) ?
1947                        add_sen_len : (sb_len - 8);
1948        descp = &sense_buffer[8];
1949        for (desc_len = 0, k = 0; k < add_sen_len; k += desc_len) {
1950                descp += desc_len;
1951                add_len = (k < (add_sen_len - 1)) ? descp[1]: -1;
1952                desc_len = add_len + 2;
1953                if (descp[0] == desc_type)
1954                        return descp;
1955                if (add_len < 0) // short descriptor ??
1956                        break;
1957        }
1958        return NULL;
1959}
1960EXPORT_SYMBOL(scsi_sense_desc_find);
1961
1962/**
1963 * scsi_get_sense_info_fld - get information field from sense data (either fixed or descriptor format)
1964 * @sense_buffer:       byte array of sense data
1965 * @sb_len:             number of valid bytes in sense_buffer
1966 * @info_out:           pointer to 64 integer where 8 or 4 byte information
1967 *                      field will be placed if found.
1968 *
1969 * Return value:
1970 *      1 if information field found, 0 if not found.
1971 */
1972int scsi_get_sense_info_fld(const u8 * sense_buffer, int sb_len,
1973                            u64 * info_out)
1974{
1975        int j;
1976        const u8 * ucp;
1977        u64 ull;
1978
1979        if (sb_len < 7)
1980                return 0;
1981        switch (sense_buffer[0] & 0x7f) {
1982        case 0x70:
1983        case 0x71:
1984                if (sense_buffer[0] & 0x80) {
1985                        *info_out = (sense_buffer[3] << 24) +
1986                                    (sense_buffer[4] << 16) +
1987                                    (sense_buffer[5] << 8) + sense_buffer[6];
1988                        return 1;
1989                } else
1990                        return 0;
1991        case 0x72:
1992        case 0x73:
1993                ucp = scsi_sense_desc_find(sense_buffer, sb_len,
1994                                           0 /* info desc */);
1995                if (ucp && (0xa == ucp[1])) {
1996                        ull = 0;
1997                        for (j = 0; j < 8; ++j) {
1998                                if (j > 0)
1999                                        ull <<= 8;
2000                                ull |= ucp[4 + j];
2001                        }
2002                        *info_out = ull;
2003                        return 1;
2004                } else
2005                        return 0;
2006        default:
2007                return 0;
2008        }
2009}
2010EXPORT_SYMBOL(scsi_get_sense_info_fld);
2011
2012/**
2013 * scsi_build_sense_buffer - build sense data in a buffer
2014 * @desc:       Sense format (non zero == descriptor format,
2015 *              0 == fixed format)
2016 * @buf:        Where to build sense data
2017 * @key:        Sense key
2018 * @asc:        Additional sense code
2019 * @ascq:       Additional sense code qualifier
2020 *
2021 **/
2022void scsi_build_sense_buffer(int desc, u8 *buf, u8 key, u8 asc, u8 ascq)
2023{
2024        if (desc) {
2025                buf[0] = 0x72;  /* descriptor, current */
2026                buf[1] = key;
2027                buf[2] = asc;
2028                buf[3] = ascq;
2029                buf[7] = 0;
2030        } else {
2031                buf[0] = 0x70;  /* fixed, current */
2032                buf[2] = key;
2033                buf[7] = 0xa;
2034                buf[12] = asc;
2035                buf[13] = ascq;
2036        }
2037}
2038EXPORT_SYMBOL(scsi_build_sense_buffer);
2039
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.