linux/drivers/block/cciss_scsi.c
<<
>>
Prefs
   1/*
   2 *    Disk Array driver for HP Smart Array controllers, SCSI Tape module.
   3 *    (C) Copyright 2001, 2007 Hewlett-Packard Development Company, L.P.
   4 *
   5 *    This program is free software; you can redistribute it and/or modify
   6 *    it under the terms of the GNU General Public License as published by
   7 *    the Free Software Foundation; version 2 of the License.
   8 *
   9 *    This program is distributed in the hope that it will be useful,
  10 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 *    MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12 *    General Public License for more details.
  13 *
  14 *    You should have received a copy of the GNU General Public License
  15 *    along with this program; if not, write to the Free Software
  16 *    Foundation, Inc., 59 Temple Place, Suite 300, Boston, MA
  17 *    02111-1307, USA.
  18 *
  19 *    Questions/Comments/Bugfixes to iss_storagedev@hp.com
  20 *    
  21 *    Author: Stephen M. Cameron
  22 */
  23#ifdef CONFIG_CISS_SCSI_TAPE
  24
  25/* Here we have code to present the driver as a scsi driver 
  26   as it is simultaneously presented as a block driver.  The 
  27   reason for doing this is to allow access to SCSI tape drives
  28   through the array controller.  Note in particular, neither 
  29   physical nor logical disks are presented through the scsi layer. */
  30
  31#include <linux/timer.h>
  32#include <linux/completion.h>
  33#include <linux/slab.h>
  34#include <linux/string.h>
  35
  36#include <linux/atomic.h>
  37
  38#include <scsi/scsi_cmnd.h>
  39#include <scsi/scsi_device.h>
  40#include <scsi/scsi_host.h> 
  41
  42#include "cciss_scsi.h"
  43
  44#define CCISS_ABORT_MSG 0x00
  45#define CCISS_RESET_MSG 0x01
  46
  47static int fill_cmd(ctlr_info_t *h, CommandList_struct *c, __u8 cmd, void *buff,
  48        size_t size,
  49        __u8 page_code, unsigned char *scsi3addr,
  50        int cmd_type);
  51
  52static CommandList_struct *cmd_alloc(ctlr_info_t *h);
  53static CommandList_struct *cmd_special_alloc(ctlr_info_t *h);
  54static void cmd_free(ctlr_info_t *h, CommandList_struct *c);
  55static void cmd_special_free(ctlr_info_t *h, CommandList_struct *c);
  56
  57static int cciss_scsi_write_info(struct Scsi_Host *sh,
  58                char *buffer, /* data buffer */
  59                int length);       /* length of data in buffer */
  60static int cciss_scsi_show_info(struct seq_file *m,
  61                                struct Scsi_Host *sh);
  62
  63static int cciss_scsi_queue_command (struct Scsi_Host *h,
  64                                     struct scsi_cmnd *cmd);
  65static int cciss_eh_device_reset_handler(struct scsi_cmnd *);
  66static int cciss_eh_abort_handler(struct scsi_cmnd *);
  67
  68static struct cciss_scsi_hba_t ccissscsi[MAX_CTLR] = {
  69        { .name = "cciss0", .ndevices = 0 },
  70        { .name = "cciss1", .ndevices = 0 },
  71        { .name = "cciss2", .ndevices = 0 },
  72        { .name = "cciss3", .ndevices = 0 },
  73        { .name = "cciss4", .ndevices = 0 },
  74        { .name = "cciss5", .ndevices = 0 },
  75        { .name = "cciss6", .ndevices = 0 },
  76        { .name = "cciss7", .ndevices = 0 },
  77};
  78
  79static struct scsi_host_template cciss_driver_template = {
  80        .module                 = THIS_MODULE,
  81        .name                   = "cciss",
  82        .proc_name              = "cciss",
  83        .write_info             = cciss_scsi_write_info,
  84        .show_info              = cciss_scsi_show_info,
  85        .queuecommand           = cciss_scsi_queue_command,
  86        .this_id                = 7,
  87        .cmd_per_lun            = 1,
  88        .use_clustering         = DISABLE_CLUSTERING,
  89        /* Can't have eh_bus_reset_handler or eh_host_reset_handler for cciss */
  90        .eh_device_reset_handler= cciss_eh_device_reset_handler,
  91        .eh_abort_handler       = cciss_eh_abort_handler,
  92};
  93
  94#pragma pack(1)
  95
  96#define SCSI_PAD_32 8
  97#define SCSI_PAD_64 8
  98
  99struct cciss_scsi_cmd_stack_elem_t {
 100        CommandList_struct cmd;
 101        ErrorInfo_struct Err;
 102        __u32 busaddr;
 103        int cmdindex;
 104        u8 pad[IS_32_BIT * SCSI_PAD_32 + IS_64_BIT * SCSI_PAD_64];
 105};
 106
 107#pragma pack()
 108
 109#pragma pack(1)
 110struct cciss_scsi_cmd_stack_t {
 111        struct cciss_scsi_cmd_stack_elem_t *pool;
 112        struct cciss_scsi_cmd_stack_elem_t **elem;
 113        dma_addr_t cmd_pool_handle;
 114        int top;
 115        int nelems;
 116};
 117#pragma pack()
 118
 119struct cciss_scsi_adapter_data_t {
 120        struct Scsi_Host *scsi_host;
 121        struct cciss_scsi_cmd_stack_t cmd_stack;
 122        SGDescriptor_struct **cmd_sg_list;
 123        int registered;
 124        spinlock_t lock; // to protect ccissscsi[ctlr]; 
 125};
 126
 127#define CPQ_TAPE_LOCK(h, flags) spin_lock_irqsave( \
 128        &h->scsi_ctlr->lock, flags);
 129#define CPQ_TAPE_UNLOCK(h, flags) spin_unlock_irqrestore( \
 130        &h->scsi_ctlr->lock, flags);
 131
 132static CommandList_struct *
 133scsi_cmd_alloc(ctlr_info_t *h)
 134{
 135        /* assume only one process in here at a time, locking done by caller. */
 136        /* use h->lock */
 137        /* might be better to rewrite how we allocate scsi commands in a way that */
 138        /* needs no locking at all. */
 139
 140        /* take the top memory chunk off the stack and return it, if any. */
 141        struct cciss_scsi_cmd_stack_elem_t *c;
 142        struct cciss_scsi_adapter_data_t *sa;
 143        struct cciss_scsi_cmd_stack_t *stk;
 144        u64bit temp64;
 145
 146        sa = h->scsi_ctlr;
 147        stk = &sa->cmd_stack; 
 148
 149        if (stk->top < 0) 
 150                return NULL;
 151        c = stk->elem[stk->top];        
 152        /* memset(c, 0, sizeof(*c)); */
 153        memset(&c->cmd, 0, sizeof(c->cmd));
 154        memset(&c->Err, 0, sizeof(c->Err));
 155        /* set physical addr of cmd and addr of scsi parameters */
 156        c->cmd.busaddr = c->busaddr; 
 157        c->cmd.cmdindex = c->cmdindex;
 158        /* (__u32) (stk->cmd_pool_handle + 
 159                (sizeof(struct cciss_scsi_cmd_stack_elem_t)*stk->top)); */
 160
 161        temp64.val = (__u64) (c->busaddr + sizeof(CommandList_struct));
 162        /* (__u64) (stk->cmd_pool_handle + 
 163                (sizeof(struct cciss_scsi_cmd_stack_elem_t)*stk->top) +
 164                 sizeof(CommandList_struct)); */
 165        stk->top--;
 166        c->cmd.ErrDesc.Addr.lower = temp64.val32.lower;
 167        c->cmd.ErrDesc.Addr.upper = temp64.val32.upper;
 168        c->cmd.ErrDesc.Len = sizeof(ErrorInfo_struct);
 169        
 170        c->cmd.ctlr = h->ctlr;
 171        c->cmd.err_info = &c->Err;
 172
 173        return (CommandList_struct *) c;
 174}
 175
 176static void 
 177scsi_cmd_free(ctlr_info_t *h, CommandList_struct *c)
 178{
 179        /* assume only one process in here at a time, locking done by caller. */
 180        /* use h->lock */
 181        /* drop the free memory chunk on top of the stack. */
 182
 183        struct cciss_scsi_adapter_data_t *sa;
 184        struct cciss_scsi_cmd_stack_t *stk;
 185
 186        sa = h->scsi_ctlr;
 187        stk = &sa->cmd_stack; 
 188        stk->top++;
 189        if (stk->top >= stk->nelems) {
 190                dev_err(&h->pdev->dev,
 191                        "scsi_cmd_free called too many times.\n");
 192                BUG();
 193        }
 194        stk->elem[stk->top] = (struct cciss_scsi_cmd_stack_elem_t *) c;
 195}
 196
 197static int
 198scsi_cmd_stack_setup(ctlr_info_t *h, struct cciss_scsi_adapter_data_t *sa)
 199{
 200        int i;
 201        struct cciss_scsi_cmd_stack_t *stk;
 202        size_t size;
 203
 204        stk = &sa->cmd_stack;
 205        stk->nelems = cciss_tape_cmds + 2;
 206        sa->cmd_sg_list = cciss_allocate_sg_chain_blocks(h,
 207                h->chainsize, stk->nelems);
 208        if (!sa->cmd_sg_list && h->chainsize > 0)
 209                return -ENOMEM;
 210
 211        size = sizeof(struct cciss_scsi_cmd_stack_elem_t) * stk->nelems;
 212
 213        /* Check alignment, see cciss_cmd.h near CommandList_struct def. */
 214        BUILD_BUG_ON((sizeof(*stk->pool) % COMMANDLIST_ALIGNMENT) != 0);
 215        /* pci_alloc_consistent guarantees 32-bit DMA address will be used */
 216        stk->pool = (struct cciss_scsi_cmd_stack_elem_t *)
 217                pci_alloc_consistent(h->pdev, size, &stk->cmd_pool_handle);
 218
 219        if (stk->pool == NULL) {
 220                cciss_free_sg_chain_blocks(sa->cmd_sg_list, stk->nelems);
 221                sa->cmd_sg_list = NULL;
 222                return -ENOMEM;
 223        }
 224        stk->elem = kmalloc(sizeof(stk->elem[0]) * stk->nelems, GFP_KERNEL);
 225        if (!stk->elem) {
 226                pci_free_consistent(h->pdev, size, stk->pool,
 227                stk->cmd_pool_handle);
 228                return -1;
 229        }
 230        for (i = 0; i < stk->nelems; i++) {
 231                stk->elem[i] = &stk->pool[i];
 232                stk->elem[i]->busaddr = (__u32) (stk->cmd_pool_handle + 
 233                        (sizeof(struct cciss_scsi_cmd_stack_elem_t) * i));
 234                stk->elem[i]->cmdindex = i;
 235        }
 236        stk->top = stk->nelems-1;
 237        return 0;
 238}
 239
 240static void
 241scsi_cmd_stack_free(ctlr_info_t *h)
 242{
 243        struct cciss_scsi_adapter_data_t *sa;
 244        struct cciss_scsi_cmd_stack_t *stk;
 245        size_t size;
 246
 247        sa = h->scsi_ctlr;
 248        stk = &sa->cmd_stack; 
 249        if (stk->top != stk->nelems-1) {
 250                dev_warn(&h->pdev->dev,
 251                        "bug: %d scsi commands are still outstanding.\n",
 252                        stk->nelems - stk->top);
 253        }
 254        size = sizeof(struct cciss_scsi_cmd_stack_elem_t) * stk->nelems;
 255
 256        pci_free_consistent(h->pdev, size, stk->pool, stk->cmd_pool_handle);
 257        stk->pool = NULL;
 258        cciss_free_sg_chain_blocks(sa->cmd_sg_list, stk->nelems);
 259        kfree(stk->elem);
 260        stk->elem = NULL;
 261}
 262
 263#if 0
 264static int xmargin=8;
 265static int amargin=60;
 266
 267static void
 268print_bytes (unsigned char *c, int len, int hex, int ascii)
 269{
 270
 271        int i;
 272        unsigned char *x;
 273
 274        if (hex)
 275        {
 276                x = c;
 277                for (i=0;i<len;i++)
 278                {
 279                        if ((i % xmargin) == 0 && i>0) printk("\n");
 280                        if ((i % xmargin) == 0) printk("0x%04x:", i);
 281                        printk(" %02x", *x);
 282                        x++;
 283                }
 284                printk("\n");
 285        }
 286        if (ascii)
 287        {
 288                x = c;
 289                for (i=0;i<len;i++)
 290                {
 291                        if ((i % amargin) == 0 && i>0) printk("\n");
 292                        if ((i % amargin) == 0) printk("0x%04x:", i);
 293                        if (*x > 26 && *x < 128) printk("%c", *x);
 294                        else printk(".");
 295                        x++;
 296                }
 297                printk("\n");
 298        }
 299}
 300
 301static void
 302print_cmd(CommandList_struct *cp)
 303{
 304        printk("queue:%d\n", cp->Header.ReplyQueue);
 305        printk("sglist:%d\n", cp->Header.SGList);
 306        printk("sgtot:%d\n", cp->Header.SGTotal);
 307        printk("Tag:0x%08x/0x%08x\n", cp->Header.Tag.upper, 
 308                        cp->Header.Tag.lower);
 309        printk("LUN:0x%02x%02x%02x%02x%02x%02x%02x%02x\n",
 310                cp->Header.LUN.LunAddrBytes[0],
 311                cp->Header.LUN.LunAddrBytes[1],
 312                cp->Header.LUN.LunAddrBytes[2],
 313                cp->Header.LUN.LunAddrBytes[3],
 314                cp->Header.LUN.LunAddrBytes[4],
 315                cp->Header.LUN.LunAddrBytes[5],
 316                cp->Header.LUN.LunAddrBytes[6],
 317                cp->Header.LUN.LunAddrBytes[7]);
 318        printk("CDBLen:%d\n", cp->Request.CDBLen);
 319        printk("Type:%d\n",cp->Request.Type.Type);
 320        printk("Attr:%d\n",cp->Request.Type.Attribute);
 321        printk(" Dir:%d\n",cp->Request.Type.Direction);
 322        printk("Timeout:%d\n",cp->Request.Timeout);
 323        printk( "CDB: %02x %02x %02x %02x %02x %02x %02x %02x"
 324                " %02x %02x %02x %02x %02x %02x %02x %02x\n",
 325                cp->Request.CDB[0], cp->Request.CDB[1],
 326                cp->Request.CDB[2], cp->Request.CDB[3],
 327                cp->Request.CDB[4], cp->Request.CDB[5],
 328                cp->Request.CDB[6], cp->Request.CDB[7],
 329                cp->Request.CDB[8], cp->Request.CDB[9],
 330                cp->Request.CDB[10], cp->Request.CDB[11],
 331                cp->Request.CDB[12], cp->Request.CDB[13],
 332                cp->Request.CDB[14], cp->Request.CDB[15]),
 333        printk("edesc.Addr: 0x%08x/0%08x, Len  = %d\n", 
 334                cp->ErrDesc.Addr.upper, cp->ErrDesc.Addr.lower, 
 335                        cp->ErrDesc.Len);
 336        printk("sgs..........Errorinfo:\n");
 337        printk("scsistatus:%d\n", cp->err_info->ScsiStatus);
 338        printk("senselen:%d\n", cp->err_info->SenseLen);
 339        printk("cmd status:%d\n", cp->err_info->CommandStatus);
 340        printk("resid cnt:%d\n", cp->err_info->ResidualCnt);
 341        printk("offense size:%d\n", cp->err_info->MoreErrInfo.Invalid_Cmd.offense_size);
 342        printk("offense byte:%d\n", cp->err_info->MoreErrInfo.Invalid_Cmd.offense_num);
 343        printk("offense value:%d\n", cp->err_info->MoreErrInfo.Invalid_Cmd.offense_value);
 344                        
 345}
 346
 347#endif
 348
 349static int 
 350find_bus_target_lun(ctlr_info_t *h, int *bus, int *target, int *lun)
 351{
 352        /* finds an unused bus, target, lun for a new device */
 353        /* assumes h->scsi_ctlr->lock is held */
 354        int i, found=0;
 355        unsigned char target_taken[CCISS_MAX_SCSI_DEVS_PER_HBA];
 356
 357        memset(&target_taken[0], 0, CCISS_MAX_SCSI_DEVS_PER_HBA);
 358
 359        target_taken[SELF_SCSI_ID] = 1; 
 360        for (i = 0; i < ccissscsi[h->ctlr].ndevices; i++)
 361                target_taken[ccissscsi[h->ctlr].dev[i].target] = 1;
 362        
 363        for (i = 0; i < CCISS_MAX_SCSI_DEVS_PER_HBA; i++) {
 364                if (!target_taken[i]) {
 365                        *bus = 0; *target=i; *lun = 0; found=1;
 366                        break;
 367                }
 368        }
 369        return (!found);        
 370}
 371struct scsi2map {
 372        char scsi3addr[8];
 373        int bus, target, lun;
 374};
 375
 376static int 
 377cciss_scsi_add_entry(ctlr_info_t *h, int hostno,
 378                struct cciss_scsi_dev_t *device,
 379                struct scsi2map *added, int *nadded)
 380{
 381        /* assumes h->scsi_ctlr->lock is held */
 382        int n = ccissscsi[h->ctlr].ndevices;
 383        struct cciss_scsi_dev_t *sd;
 384        int i, bus, target, lun;
 385        unsigned char addr1[8], addr2[8];
 386
 387        if (n >= CCISS_MAX_SCSI_DEVS_PER_HBA) {
 388                dev_warn(&h->pdev->dev, "Too many devices, "
 389                        "some will be inaccessible.\n");
 390                return -1;
 391        }
 392
 393        bus = target = -1;
 394        lun = 0;
 395        /* Is this device a non-zero lun of a multi-lun device */
 396        /* byte 4 of the 8-byte LUN addr will contain the logical unit no. */
 397        if (device->scsi3addr[4] != 0) {
 398                /* Search through our list and find the device which */
 399                /* has the same 8 byte LUN address, excepting byte 4. */
 400                /* Assign the same bus and target for this new LUN. */
 401                /* Use the logical unit number from the firmware. */
 402                memcpy(addr1, device->scsi3addr, 8);
 403                addr1[4] = 0;
 404                for (i = 0; i < n; i++) {
 405                        sd = &ccissscsi[h->ctlr].dev[i];
 406                        memcpy(addr2, sd->scsi3addr, 8);
 407                        addr2[4] = 0;
 408                        /* differ only in byte 4? */
 409                        if (memcmp(addr1, addr2, 8) == 0) {
 410                                bus = sd->bus;
 411                                target = sd->target;
 412                                lun = device->scsi3addr[4];
 413                                break;
 414                        }
 415                }
 416        }
 417
 418        sd = &ccissscsi[h->ctlr].dev[n];
 419        if (lun == 0) {
 420                if (find_bus_target_lun(h,
 421                        &sd->bus, &sd->target, &sd->lun) != 0)
 422                        return -1;
 423        } else {
 424                sd->bus = bus;
 425                sd->target = target;
 426                sd->lun = lun;
 427        }
 428        added[*nadded].bus = sd->bus;
 429        added[*nadded].target = sd->target;
 430        added[*nadded].lun = sd->lun;
 431        (*nadded)++;
 432
 433        memcpy(sd->scsi3addr, device->scsi3addr, 8);
 434        memcpy(sd->vendor, device->vendor, sizeof(sd->vendor));
 435        memcpy(sd->revision, device->revision, sizeof(sd->revision));
 436        memcpy(sd->device_id, device->device_id, sizeof(sd->device_id));
 437        sd->devtype = device->devtype;
 438
 439        ccissscsi[h->ctlr].ndevices++;
 440
 441        /* initially, (before registering with scsi layer) we don't 
 442           know our hostno and we don't want to print anything first 
 443           time anyway (the scsi layer's inquiries will show that info) */
 444        if (hostno != -1)
 445                dev_info(&h->pdev->dev, "%s device c%db%dt%dl%d added.\n",
 446                        scsi_device_type(sd->devtype), hostno,
 447                        sd->bus, sd->target, sd->lun);
 448        return 0;
 449}
 450
 451static void
 452cciss_scsi_remove_entry(ctlr_info_t *h, int hostno, int entry,
 453        struct scsi2map *removed, int *nremoved)
 454{
 455        /* assumes h->ctlr]->scsi_ctlr->lock is held */
 456        int i;
 457        struct cciss_scsi_dev_t sd;
 458
 459        if (entry < 0 || entry >= CCISS_MAX_SCSI_DEVS_PER_HBA) return;
 460        sd = ccissscsi[h->ctlr].dev[entry];
 461        removed[*nremoved].bus    = sd.bus;
 462        removed[*nremoved].target = sd.target;
 463        removed[*nremoved].lun    = sd.lun;
 464        (*nremoved)++;
 465        for (i = entry; i < ccissscsi[h->ctlr].ndevices-1; i++)
 466                ccissscsi[h->ctlr].dev[i] = ccissscsi[h->ctlr].dev[i+1];
 467        ccissscsi[h->ctlr].ndevices--;
 468        dev_info(&h->pdev->dev, "%s device c%db%dt%dl%d removed.\n",
 469                scsi_device_type(sd.devtype), hostno,
 470                        sd.bus, sd.target, sd.lun);
 471}
 472
 473
 474#define SCSI3ADDR_EQ(a,b) ( \
 475        (a)[7] == (b)[7] && \
 476        (a)[6] == (b)[6] && \
 477        (a)[5] == (b)[5] && \
 478        (a)[4] == (b)[4] && \
 479        (a)[3] == (b)[3] && \
 480        (a)[2] == (b)[2] && \
 481        (a)[1] == (b)[1] && \
 482        (a)[0] == (b)[0])
 483
 484static void fixup_botched_add(ctlr_info_t *h, char *scsi3addr)
 485{
 486        /* called when scsi_add_device fails in order to re-adjust */
 487        /* ccissscsi[] to match the mid layer's view. */
 488        unsigned long flags;
 489        int i, j;
 490        CPQ_TAPE_LOCK(h, flags);
 491        for (i = 0; i < ccissscsi[h->ctlr].ndevices; i++) {
 492                if (memcmp(scsi3addr,
 493                                ccissscsi[h->ctlr].dev[i].scsi3addr, 8) == 0) {
 494                        for (j = i; j < ccissscsi[h->ctlr].ndevices-1; j++)
 495                                ccissscsi[h->ctlr].dev[j] =
 496                                        ccissscsi[h->ctlr].dev[j+1];
 497                        ccissscsi[h->ctlr].ndevices--;
 498                        break;
 499                }
 500        }
 501        CPQ_TAPE_UNLOCK(h, flags);
 502}
 503
 504static int device_is_the_same(struct cciss_scsi_dev_t *dev1,
 505        struct cciss_scsi_dev_t *dev2)
 506{
 507        return dev1->devtype == dev2->devtype &&
 508                memcmp(dev1->scsi3addr, dev2->scsi3addr,
 509                        sizeof(dev1->scsi3addr)) == 0 &&
 510                memcmp(dev1->device_id, dev2->device_id,
 511                        sizeof(dev1->device_id)) == 0 &&
 512                memcmp(dev1->vendor, dev2->vendor,
 513                        sizeof(dev1->vendor)) == 0 &&
 514                memcmp(dev1->model, dev2->model,
 515                        sizeof(dev1->model)) == 0 &&
 516                memcmp(dev1->revision, dev2->revision,
 517                        sizeof(dev1->revision)) == 0;
 518}
 519
 520static int
 521adjust_cciss_scsi_table(ctlr_info_t *h, int hostno,
 522        struct cciss_scsi_dev_t sd[], int nsds)
 523{
 524        /* sd contains scsi3 addresses and devtypes, but
 525           bus target and lun are not filled in.  This funciton
 526           takes what's in sd to be the current and adjusts
 527           ccissscsi[] to be in line with what's in sd. */ 
 528
 529        int i,j, found, changes=0;
 530        struct cciss_scsi_dev_t *csd;
 531        unsigned long flags;
 532        struct scsi2map *added, *removed;
 533        int nadded, nremoved;
 534        struct Scsi_Host *sh = NULL;
 535
 536        added = kzalloc(sizeof(*added) * CCISS_MAX_SCSI_DEVS_PER_HBA,
 537                        GFP_KERNEL);
 538        removed = kzalloc(sizeof(*removed) * CCISS_MAX_SCSI_DEVS_PER_HBA,
 539                        GFP_KERNEL);
 540
 541        if (!added || !removed) {
 542                dev_warn(&h->pdev->dev,
 543                        "Out of memory in adjust_cciss_scsi_table\n");
 544                goto free_and_out;
 545        }
 546
 547        CPQ_TAPE_LOCK(h, flags);
 548
 549        if (hostno != -1)  /* if it's not the first time... */
 550                sh = h->scsi_ctlr->scsi_host;
 551
 552        /* find any devices in ccissscsi[] that are not in 
 553           sd[] and remove them from ccissscsi[] */
 554
 555        i = 0;
 556        nremoved = 0;
 557        nadded = 0;
 558        while (i < ccissscsi[h->ctlr].ndevices) {
 559                csd = &ccissscsi[h->ctlr].dev[i];
 560                found=0;
 561                for (j=0;j<nsds;j++) {
 562                        if (SCSI3ADDR_EQ(sd[j].scsi3addr,
 563                                csd->scsi3addr)) {
 564                                if (device_is_the_same(&sd[j], csd))
 565                                        found=2;
 566                                else
 567                                        found=1;
 568                                break;
 569                        }
 570                }
 571
 572                if (found == 0) { /* device no longer present. */ 
 573                        changes++;
 574                        cciss_scsi_remove_entry(h, hostno, i,
 575                                removed, &nremoved);
 576                        /* remove ^^^, hence i not incremented */
 577                } else if (found == 1) { /* device is different in some way */
 578                        changes++;
 579                        dev_info(&h->pdev->dev,
 580                                "device c%db%dt%dl%d has changed.\n",
 581                                hostno, csd->bus, csd->target, csd->lun);
 582                        cciss_scsi_remove_entry(h, hostno, i,
 583                                removed, &nremoved);
 584                        /* remove ^^^, hence i not incremented */
 585                        if (cciss_scsi_add_entry(h, hostno, &sd[j],
 586                                added, &nadded) != 0)
 587                                /* we just removed one, so add can't fail. */
 588                                        BUG();
 589                        csd->devtype = sd[j].devtype;
 590                        memcpy(csd->device_id, sd[j].device_id,
 591                                sizeof(csd->device_id));
 592                        memcpy(csd->vendor, sd[j].vendor,
 593                                sizeof(csd->vendor));
 594                        memcpy(csd->model, sd[j].model,
 595                                sizeof(csd->model));
 596                        memcpy(csd->revision, sd[j].revision,
 597                                sizeof(csd->revision));
 598                } else          /* device is same as it ever was, */
 599                        i++;    /* so just move along. */
 600        }
 601
 602        /* Now, make sure every device listed in sd[] is also
 603           listed in ccissscsi[], adding them if they aren't found */
 604
 605        for (i=0;i<nsds;i++) {
 606                found=0;
 607                for (j = 0; j < ccissscsi[h->ctlr].ndevices; j++) {
 608                        csd = &ccissscsi[h->ctlr].dev[j];
 609                        if (SCSI3ADDR_EQ(sd[i].scsi3addr,
 610                                csd->scsi3addr)) {
 611                                if (device_is_the_same(&sd[i], csd))
 612                                        found=2;        /* found device */
 613                                else
 614                                        found=1;        /* found a bug. */
 615                                break;
 616                        }
 617                }
 618                if (!found) {
 619                        changes++;
 620                        if (cciss_scsi_add_entry(h, hostno, &sd[i],
 621                                added, &nadded) != 0)
 622                                break;
 623                } else if (found == 1) {
 624                        /* should never happen... */
 625                        changes++;
 626                        dev_warn(&h->pdev->dev,
 627                                "device unexpectedly changed\n");
 628                        /* but if it does happen, we just ignore that device */
 629                }
 630        }
 631        CPQ_TAPE_UNLOCK(h, flags);
 632
 633        /* Don't notify scsi mid layer of any changes the first time through */
 634        /* (or if there are no changes) scsi_scan_host will do it later the */
 635        /* first time through. */
 636        if (hostno == -1 || !changes)
 637                goto free_and_out;
 638
 639        /* Notify scsi mid layer of any removed devices */
 640        for (i = 0; i < nremoved; i++) {
 641                struct scsi_device *sdev =
 642                        scsi_device_lookup(sh, removed[i].bus,
 643                                removed[i].target, removed[i].lun);
 644                if (sdev != NULL) {
 645                        scsi_remove_device(sdev);
 646                        scsi_device_put(sdev);
 647                } else {
 648                        /* We don't expect to get here. */
 649                        /* future cmds to this device will get selection */
 650                        /* timeout as if the device was gone. */
 651                        dev_warn(&h->pdev->dev, "didn't find "
 652                                "c%db%dt%dl%d\n for removal.",
 653                                hostno, removed[i].bus,
 654                                removed[i].target, removed[i].lun);
 655                }
 656        }
 657
 658        /* Notify scsi mid layer of any added devices */
 659        for (i = 0; i < nadded; i++) {
 660                int rc;
 661                rc = scsi_add_device(sh, added[i].bus,
 662                        added[i].target, added[i].lun);
 663                if (rc == 0)
 664                        continue;
 665                dev_warn(&h->pdev->dev, "scsi_add_device "
 666                        "c%db%dt%dl%d failed, device not added.\n",
 667                        hostno, added[i].bus, added[i].target, added[i].lun);
 668                /* now we have to remove it from ccissscsi, */
 669                /* since it didn't get added to scsi mid layer */
 670                fixup_botched_add(h, added[i].scsi3addr);
 671        }
 672
 673free_and_out:
 674        kfree(added);
 675        kfree(removed);
 676        return 0;
 677}
 678
 679static int
 680lookup_scsi3addr(ctlr_info_t *h, int bus, int target, int lun, char *scsi3addr)
 681{
 682        int i;
 683        struct cciss_scsi_dev_t *sd;
 684        unsigned long flags;
 685
 686        CPQ_TAPE_LOCK(h, flags);
 687        for (i = 0; i < ccissscsi[h->ctlr].ndevices; i++) {
 688                sd = &ccissscsi[h->ctlr].dev[i];
 689                if (sd->bus == bus &&
 690                    sd->target == target &&
 691                    sd->lun == lun) {
 692                        memcpy(scsi3addr, &sd->scsi3addr[0], 8);
 693                        CPQ_TAPE_UNLOCK(h, flags);
 694                        return 0;
 695                }
 696        }
 697        CPQ_TAPE_UNLOCK(h, flags);
 698        return -1;
 699}
 700
 701static void 
 702cciss_scsi_setup(ctlr_info_t *h)
 703{
 704        struct cciss_scsi_adapter_data_t * shba;
 705
 706        ccissscsi[h->ctlr].ndevices = 0;
 707        shba = (struct cciss_scsi_adapter_data_t *)
 708                kmalloc(sizeof(*shba), GFP_KERNEL);     
 709        if (shba == NULL)
 710                return;
 711        shba->scsi_host = NULL;
 712        spin_lock_init(&shba->lock);
 713        shba->registered = 0;
 714        if (scsi_cmd_stack_setup(h, shba) != 0) {
 715                kfree(shba);
 716                shba = NULL;
 717        }
 718        h->scsi_ctlr = shba;
 719        return;
 720}
 721
 722static void complete_scsi_command(CommandList_struct *c, int timeout,
 723        __u32 tag)
 724{
 725        struct scsi_cmnd *cmd;
 726        ctlr_info_t *h;
 727        ErrorInfo_struct *ei;
 728
 729        ei = c->err_info;
 730
 731        /* First, see if it was a message rather than a command */
 732        if (c->Request.Type.Type == TYPE_MSG)  {
 733                c->cmd_type = CMD_MSG_DONE;
 734                return;
 735        }
 736
 737        cmd = (struct scsi_cmnd *) c->scsi_cmd;
 738        h = hba[c->ctlr];
 739
 740        scsi_dma_unmap(cmd);
 741        if (c->Header.SGTotal > h->max_cmd_sgentries)
 742                cciss_unmap_sg_chain_block(h, c);
 743
 744        cmd->result = (DID_OK << 16);           /* host byte */
 745        cmd->result |= (COMMAND_COMPLETE << 8); /* msg byte */
 746        /* cmd->result |= (GOOD < 1); */                /* status byte */
 747
 748        cmd->result |= (ei->ScsiStatus);
 749        /* printk("Scsistatus is 0x%02x\n", ei->ScsiStatus);  */
 750
 751        /* copy the sense data whether we need to or not. */
 752
 753        memcpy(cmd->sense_buffer, ei->SenseInfo, 
 754                ei->SenseLen > SCSI_SENSE_BUFFERSIZE ?
 755                        SCSI_SENSE_BUFFERSIZE : 
 756                        ei->SenseLen);
 757        scsi_set_resid(cmd, ei->ResidualCnt);
 758
 759        if(ei->CommandStatus != 0) 
 760        { /* an error has occurred */ 
 761                switch(ei->CommandStatus)
 762                {
 763                        case CMD_TARGET_STATUS:
 764                                /* Pass it up to the upper layers... */
 765                                if (!ei->ScsiStatus) {
 766                                        
 767        /* Ordinarily, this case should never happen, but there is a bug
 768           in some released firmware revisions that allows it to happen
 769           if, for example, a 4100 backplane loses power and the tape
 770           drive is in it.  We assume that it's a fatal error of some
 771           kind because we can't show that it wasn't. We will make it
 772           look like selection timeout since that is the most common
 773           reason for this to occur, and it's severe enough. */
 774
 775                                        cmd->result = DID_NO_CONNECT << 16;
 776                                }
 777                        break;
 778                        case CMD_DATA_UNDERRUN: /* let mid layer handle it. */
 779                        break;
 780                        case CMD_DATA_OVERRUN:
 781                                dev_warn(&h->pdev->dev, "%p has"
 782                                        " completed with data overrun "
 783                                        "reported\n", c);
 784                        break;
 785                        case CMD_INVALID: {
 786                                /* print_bytes(c, sizeof(*c), 1, 0);
 787                                print_cmd(c); */
 788     /* We get CMD_INVALID if you address a non-existent tape drive instead
 789        of a selection timeout (no response).  You will see this if you yank 
 790        out a tape drive, then try to access it. This is kind of a shame
 791        because it means that any other CMD_INVALID (e.g. driver bug) will
 792        get interpreted as a missing target. */
 793                                cmd->result = DID_NO_CONNECT << 16;
 794                                }
 795                        break;
 796                        case CMD_PROTOCOL_ERR:
 797                                cmd->result = DID_ERROR << 16;
 798                                dev_warn(&h->pdev->dev,
 799                                        "%p has protocol error\n", c);
 800                        break;
 801                        case CMD_HARDWARE_ERR:
 802                                cmd->result = DID_ERROR << 16;
 803                                dev_warn(&h->pdev->dev,
 804                                        "%p had hardware error\n", c);
 805                        break;
 806                        case CMD_CONNECTION_LOST:
 807                                cmd->result = DID_ERROR << 16;
 808                                dev_warn(&h->pdev->dev,
 809                                        "%p had connection lost\n", c);
 810                        break;
 811                        case CMD_ABORTED:
 812                                cmd->result = DID_ABORT << 16;
 813                                dev_warn(&h->pdev->dev, "%p was aborted\n", c);
 814                        break;
 815                        case CMD_ABORT_FAILED:
 816                                cmd->result = DID_ERROR << 16;
 817                                dev_warn(&h->pdev->dev,
 818                                        "%p reports abort failed\n", c);
 819                        break;
 820                        case CMD_UNSOLICITED_ABORT:
 821                                cmd->result = DID_ABORT << 16;
 822                                dev_warn(&h->pdev->dev, "%p aborted due to an "
 823                                        "unsolicited abort\n", c);
 824                        break;
 825                        case CMD_TIMEOUT:
 826                                cmd->result = DID_TIME_OUT << 16;
 827                                dev_warn(&h->pdev->dev, "%p timedout\n", c);
 828                        break;
 829                        case CMD_UNABORTABLE:
 830                                cmd->result = DID_ERROR << 16;
 831                                dev_warn(&h->pdev->dev, "c %p command "
 832                                        "unabortable\n", c);
 833                        break;
 834                        default:
 835                                cmd->result = DID_ERROR << 16;
 836                                dev_warn(&h->pdev->dev,
 837                                        "%p returned unknown status %x\n", c,
 838                                                ei->CommandStatus); 
 839                }
 840        }
 841        cmd->scsi_done(cmd);
 842        scsi_cmd_free(h, c);
 843}
 844
 845static int
 846cciss_scsi_detect(ctlr_info_t *h)
 847{
 848        struct Scsi_Host *sh;
 849        int error;
 850
 851        sh = scsi_host_alloc(&cciss_driver_template, sizeof(struct ctlr_info *));
 852        if (sh == NULL)
 853                goto fail;
 854        sh->io_port = 0;        // good enough?  FIXME, 
 855        sh->n_io_port = 0;      // I don't think we use these two...
 856        sh->this_id = SELF_SCSI_ID;  
 857        sh->can_queue = cciss_tape_cmds;
 858        sh->sg_tablesize = h->maxsgentries;
 859        sh->max_cmd_len = MAX_COMMAND_SIZE;
 860        sh->max_sectors = h->cciss_max_sectors;
 861
 862        ((struct cciss_scsi_adapter_data_t *) 
 863                h->scsi_ctlr)->scsi_host = sh;
 864        sh->hostdata[0] = (unsigned long) h;
 865        sh->irq = h->intr[SIMPLE_MODE_INT];
 866        sh->unique_id = sh->irq;
 867        error = scsi_add_host(sh, &h->pdev->dev);
 868        if (error)
 869                goto fail_host_put;
 870        scsi_scan_host(sh);
 871        return 1;
 872
 873 fail_host_put:
 874        scsi_host_put(sh);
 875 fail:
 876        return 0;
 877}
 878
 879static void
 880cciss_unmap_one(struct pci_dev *pdev,
 881                CommandList_struct *c,
 882                size_t buflen,
 883                int data_direction)
 884{
 885        u64bit addr64;
 886
 887        addr64.val32.lower = c->SG[0].Addr.lower;
 888        addr64.val32.upper = c->SG[0].Addr.upper;
 889        pci_unmap_single(pdev, (dma_addr_t) addr64.val, buflen, data_direction);
 890}
 891
 892static void
 893cciss_map_one(struct pci_dev *pdev,
 894                CommandList_struct *c,
 895                unsigned char *buf,
 896                size_t buflen,
 897                int data_direction)
 898{
 899        __u64 addr64;
 900
 901        addr64 = (__u64) pci_map_single(pdev, buf, buflen, data_direction);
 902        c->SG[0].Addr.lower =
 903          (__u32) (addr64 & (__u64) 0x00000000FFFFFFFF);
 904        c->SG[0].Addr.upper =
 905          (__u32) ((addr64 >> 32) & (__u64) 0x00000000FFFFFFFF);
 906        c->SG[0].Len = buflen;
 907        c->Header.SGList = (__u8) 1;   /* no. SGs contig in this cmd */
 908        c->Header.SGTotal = (__u16) 1; /* total sgs in this cmd list */
 909}
 910
 911static int
 912cciss_scsi_do_simple_cmd(ctlr_info_t *h,
 913                        CommandList_struct *c,
 914                        unsigned char *scsi3addr, 
 915                        unsigned char *cdb,
 916                        unsigned char cdblen,
 917                        unsigned char *buf, int bufsize,
 918                        int direction)
 919{
 920        DECLARE_COMPLETION_ONSTACK(wait);
 921
 922        c->cmd_type = CMD_IOCTL_PEND; /* treat this like an ioctl */
 923        c->scsi_cmd = NULL;
 924        c->Header.ReplyQueue = 0;  /* unused in simple mode */
 925        memcpy(&c->Header.LUN, scsi3addr, sizeof(c->Header.LUN));
 926        c->Header.Tag.lower = c->busaddr;  /* Use k. address of cmd as tag */
 927        // Fill in the request block...
 928
 929        /* printk("Using scsi3addr 0x%02x%0x2%0x2%0x2%0x2%0x2%0x2%0x2\n", 
 930                scsi3addr[0], scsi3addr[1], scsi3addr[2], scsi3addr[3],
 931                scsi3addr[4], scsi3addr[5], scsi3addr[6], scsi3addr[7]); */
 932
 933        memset(c->Request.CDB, 0, sizeof(c->Request.CDB));
 934        memcpy(c->Request.CDB, cdb, cdblen);
 935        c->Request.Timeout = 0;
 936        c->Request.CDBLen = cdblen;
 937        c->Request.Type.Type = TYPE_CMD;
 938        c->Request.Type.Attribute = ATTR_SIMPLE;
 939        c->Request.Type.Direction = direction;
 940
 941        /* Fill in the SG list and do dma mapping */
 942        cciss_map_one(h->pdev, c, (unsigned char *) buf,
 943                        bufsize, DMA_FROM_DEVICE); 
 944
 945        c->waiting = &wait;
 946        enqueue_cmd_and_start_io(h, c);
 947        wait_for_completion(&wait);
 948
 949        /* undo the dma mapping */
 950        cciss_unmap_one(h->pdev, c, bufsize, DMA_FROM_DEVICE);
 951        return(0);
 952}
 953
 954static void 
 955cciss_scsi_interpret_error(ctlr_info_t *h, CommandList_struct *c)
 956{
 957        ErrorInfo_struct *ei;
 958
 959        ei = c->err_info;
 960        switch(ei->CommandStatus)
 961        {
 962                case CMD_TARGET_STATUS:
 963                        dev_warn(&h->pdev->dev,
 964                                "cmd %p has completed with errors\n", c);
 965                        dev_warn(&h->pdev->dev,
 966                                "cmd %p has SCSI Status = %x\n",
 967                                c, ei->ScsiStatus);
 968                        if (ei->ScsiStatus == 0)
 969                                dev_warn(&h->pdev->dev,
 970                                "SCSI status is abnormally zero.  "
 971                                "(probably indicates selection timeout "
 972                                "reported incorrectly due to a known "
 973                                "firmware bug, circa July, 2001.)\n");
 974                break;
 975                case CMD_DATA_UNDERRUN: /* let mid layer handle it. */
 976                        dev_info(&h->pdev->dev, "UNDERRUN\n");
 977                break;
 978                case CMD_DATA_OVERRUN:
 979                        dev_warn(&h->pdev->dev, "%p has"
 980                                " completed with data overrun "
 981                                "reported\n", c);
 982                break;
 983                case CMD_INVALID: {
 984                        /* controller unfortunately reports SCSI passthru's */
 985                        /* to non-existent targets as invalid commands. */
 986                        dev_warn(&h->pdev->dev,
 987                                "%p is reported invalid (probably means "
 988                                "target device no longer present)\n", c);
 989                        /* print_bytes((unsigned char *) c, sizeof(*c), 1, 0);
 990                        print_cmd(c);  */
 991                        }
 992                break;
 993                case CMD_PROTOCOL_ERR:
 994                        dev_warn(&h->pdev->dev, "%p has protocol error\n", c);
 995                break;
 996                case CMD_HARDWARE_ERR:
 997                        /* cmd->result = DID_ERROR << 16; */
 998                        dev_warn(&h->pdev->dev, "%p had hardware error\n", c);
 999                break;
1000                case CMD_CONNECTION_LOST:
1001                        dev_warn(&h->pdev->dev, "%p had connection lost\n", c);
1002                break;
1003                case CMD_ABORTED:
1004                        dev_warn(&h->pdev->dev, "%p was aborted\n", c);
1005                break;
1006                case CMD_ABORT_FAILED:
1007                        dev_warn(&h->pdev->dev,
1008                                "%p reports abort failed\n", c);
1009                break;
1010                case CMD_UNSOLICITED_ABORT:
1011                        dev_warn(&h->pdev->dev,
1012                                "%p aborted due to an unsolicited abort\n", c);
1013                break;
1014                case CMD_TIMEOUT:
1015                        dev_warn(&h->pdev->dev, "%p timedout\n", c);
1016                break;
1017                case CMD_UNABORTABLE:
1018                        dev_warn(&h->pdev->dev,
1019                                "%p unabortable\n", c);
1020                break;
1021                default:
1022                        dev_warn(&h->pdev->dev,
1023                                "%p returned unknown status %x\n",
1024                                c, ei->CommandStatus);
1025        }
1026}
1027
1028static int
1029cciss_scsi_do_inquiry(ctlr_info_t *h, unsigned char *scsi3addr,
1030        unsigned char page, unsigned char *buf,
1031        unsigned char bufsize)
1032{
1033        int rc;
1034        CommandList_struct *c;
1035        char cdb[6];
1036        ErrorInfo_struct *ei;
1037        unsigned long flags;
1038
1039        spin_lock_irqsave(&h->lock, flags);
1040        c = scsi_cmd_alloc(h);
1041        spin_unlock_irqrestore(&h->lock, flags);
1042
1043        if (c == NULL) {                        /* trouble... */
1044                printk("cmd_alloc returned NULL!\n");
1045                return -1;
1046        }
1047
1048        ei = c->err_info;
1049
1050        cdb[0] = CISS_INQUIRY;
1051        cdb[1] = (page != 0);
1052        cdb[2] = page;
1053        cdb[3] = 0;
1054        cdb[4] = bufsize;
1055        cdb[5] = 0;
1056        rc = cciss_scsi_do_simple_cmd(h, c, scsi3addr, cdb,
1057                                6, buf, bufsize, XFER_READ);
1058
1059        if (rc != 0) return rc; /* something went wrong */
1060
1061        if (ei->CommandStatus != 0 && 
1062            ei->CommandStatus != CMD_DATA_UNDERRUN) {
1063                cciss_scsi_interpret_error(h, c);
1064                rc = -1;
1065        }
1066        spin_lock_irqsave(&h->lock, flags);
1067        scsi_cmd_free(h, c);
1068        spin_unlock_irqrestore(&h->lock, flags);
1069        return rc;      
1070}
1071
1072/* Get the device id from inquiry page 0x83 */
1073static int cciss_scsi_get_device_id(ctlr_info_t *h, unsigned char *scsi3addr,
1074        unsigned char *device_id, int buflen)
1075{
1076        int rc;
1077        unsigned char *buf;
1078
1079        if (buflen > 16)
1080                buflen = 16;
1081        buf = kzalloc(64, GFP_KERNEL);
1082        if (!buf)
1083                return -1;
1084        rc = cciss_scsi_do_inquiry(h, scsi3addr, 0x83, buf, 64);
1085        if (rc == 0)
1086                memcpy(device_id, &buf[8], buflen);
1087        kfree(buf);
1088        return rc != 0;
1089}
1090
1091static int
1092cciss_scsi_do_report_phys_luns(ctlr_info_t *h,
1093                ReportLunData_struct *buf, int bufsize)
1094{
1095        int rc;
1096        CommandList_struct *c;
1097        unsigned char cdb[12];
1098        unsigned char scsi3addr[8]; 
1099        ErrorInfo_struct *ei;
1100        unsigned long flags;
1101
1102        spin_lock_irqsave(&h->lock, flags);
1103        c = scsi_cmd_alloc(h);
1104        spin_unlock_irqrestore(&h->lock, flags);
1105        if (c == NULL) {                        /* trouble... */
1106                printk("cmd_alloc returned NULL!\n");
1107                return -1;
1108        }
1109
1110        memset(&scsi3addr[0], 0, 8); /* address the controller */
1111        cdb[0] = CISS_REPORT_PHYS;
1112        cdb[1] = 0;
1113        cdb[2] = 0;
1114        cdb[3] = 0;
1115        cdb[4] = 0;
1116        cdb[5] = 0;
1117        cdb[6] = (bufsize >> 24) & 0xFF;  //MSB
1118        cdb[7] = (bufsize >> 16) & 0xFF;
1119        cdb[8] = (bufsize >> 8) & 0xFF;
1120        cdb[9] = bufsize & 0xFF;
1121        cdb[10] = 0;
1122        cdb[11] = 0;
1123
1124        rc = cciss_scsi_do_simple_cmd(h, c, scsi3addr,
1125                                cdb, 12, 
1126                                (unsigned char *) buf, 
1127                                bufsize, XFER_READ);
1128
1129        if (rc != 0) return rc; /* something went wrong */
1130
1131        ei = c->err_info;
1132        if (ei->CommandStatus != 0 && 
1133            ei->CommandStatus != CMD_DATA_UNDERRUN) {
1134                cciss_scsi_interpret_error(h, c);
1135                rc = -1;
1136        }
1137        spin_lock_irqsave(&h->lock, flags);
1138        scsi_cmd_free(h, c);
1139        spin_unlock_irqrestore(&h->lock, flags);
1140        return rc;      
1141}
1142
1143static void
1144cciss_update_non_disk_devices(ctlr_info_t *h, int hostno)
1145{
1146        /* the idea here is we could get notified from /proc
1147           that some devices have changed, so we do a report 
1148           physical luns cmd, and adjust our list of devices 
1149           accordingly.  (We can't rely on the scsi-mid layer just
1150           doing inquiries, because the "busses" that the scsi 
1151           mid-layer probes are totally fabricated by this driver,
1152           so new devices wouldn't show up.
1153
1154           the scsi3addr's of devices won't change so long as the 
1155           adapter is not reset.  That means we can rescan and 
1156           tell which devices we already know about, vs. new 
1157           devices, vs.  disappearing devices.
1158
1159           Also, if you yank out a tape drive, then put in a disk
1160           in it's place, (say, a configured volume from another 
1161           array controller for instance)  _don't_ poke this driver 
1162           (so it thinks it's still a tape, but _do_ poke the scsi 
1163           mid layer, so it does an inquiry... the scsi mid layer 
1164           will see the physical disk.  This would be bad.  Need to
1165           think about how to prevent that.  One idea would be to 
1166           snoop all scsi responses and if an inquiry repsonse comes
1167           back that reports a disk, chuck it an return selection
1168           timeout instead and adjust our table...  Not sure i like
1169           that though.  
1170
1171         */
1172#define OBDR_TAPE_INQ_SIZE 49
1173#define OBDR_TAPE_SIG "$DR-10"
1174        ReportLunData_struct *ld_buff;
1175        unsigned char *inq_buff;
1176        unsigned char scsi3addr[8];
1177        __u32 num_luns=0;
1178        unsigned char *ch;
1179        struct cciss_scsi_dev_t *currentsd, *this_device;
1180        int ncurrent=0;
1181        int reportlunsize = sizeof(*ld_buff) + CISS_MAX_PHYS_LUN * 8;
1182        int i;
1183
1184        ld_buff = kzalloc(reportlunsize, GFP_KERNEL);
1185        inq_buff = kmalloc(OBDR_TAPE_INQ_SIZE, GFP_KERNEL);
1186        currentsd = kzalloc(sizeof(*currentsd) *
1187                        (CCISS_MAX_SCSI_DEVS_PER_HBA+1), GFP_KERNEL);
1188        if (ld_buff == NULL || inq_buff == NULL || currentsd == NULL) {
1189                printk(KERN_ERR "cciss: out of memory\n");
1190                goto out;
1191        }
1192        this_device = &currentsd[CCISS_MAX_SCSI_DEVS_PER_HBA];
1193        if (cciss_scsi_do_report_phys_luns(h, ld_buff, reportlunsize) == 0) {
1194                ch = &ld_buff->LUNListLength[0];
1195                num_luns = ((ch[0]<<24) | (ch[1]<<16) | (ch[2]<<8) | ch[3]) / 8;
1196                if (num_luns > CISS_MAX_PHYS_LUN) {
1197                        printk(KERN_WARNING 
1198                                "cciss: Maximum physical LUNs (%d) exceeded.  "
1199                                "%d LUNs ignored.\n", CISS_MAX_PHYS_LUN, 
1200                                num_luns - CISS_MAX_PHYS_LUN);
1201                        num_luns = CISS_MAX_PHYS_LUN;
1202                }
1203        }
1204        else {
1205                printk(KERN_ERR  "cciss: Report physical LUNs failed.\n");
1206                goto out;
1207        }
1208
1209
1210        /* adjust our table of devices */       
1211        for (i = 0; i < num_luns; i++) {
1212                /* for each physical lun, do an inquiry */
1213                if (ld_buff->LUN[i][3] & 0xC0) continue;
1214                memset(inq_buff, 0, OBDR_TAPE_INQ_SIZE);
1215                memcpy(&scsi3addr[0], &ld_buff->LUN[i][0], 8);
1216
1217                if (cciss_scsi_do_inquiry(h, scsi3addr, 0, inq_buff,
1218                        (unsigned char) OBDR_TAPE_INQ_SIZE) != 0)
1219                        /* Inquiry failed (msg printed already) */
1220                        continue; /* so we will skip this device. */
1221
1222                this_device->devtype = (inq_buff[0] & 0x1f);
1223                this_device->bus = -1;
1224                this_device->target = -1;
1225                this_device->lun = -1;
1226                memcpy(this_device->scsi3addr, scsi3addr, 8);
1227                memcpy(this_device->vendor, &inq_buff[8],
1228                        sizeof(this_device->vendor));
1229                memcpy(this_device->model, &inq_buff[16],
1230                        sizeof(this_device->model));
1231                memcpy(this_device->revision, &inq_buff[32],
1232                        sizeof(this_device->revision));
1233                memset(this_device->device_id, 0,
1234                        sizeof(this_device->device_id));
1235                cciss_scsi_get_device_id(h, scsi3addr,
1236                        this_device->device_id, sizeof(this_device->device_id));
1237
1238                switch (this_device->devtype)
1239                {
1240                  case 0x05: /* CD-ROM */ {
1241
1242                        /* We don't *really* support actual CD-ROM devices,
1243                         * just this "One Button Disaster Recovery" tape drive
1244                         * which temporarily pretends to be a CD-ROM drive.
1245                         * So we check that the device is really an OBDR tape
1246                         * device by checking for "$DR-10" in bytes 43-48 of
1247                         * the inquiry data.
1248                         */
1249                                char obdr_sig[7];
1250
1251                                strncpy(obdr_sig, &inq_buff[43], 6);
1252                                obdr_sig[6] = '\0';
1253                                if (strncmp(obdr_sig, OBDR_TAPE_SIG, 6) != 0)
1254                                        /* Not OBDR device, ignore it. */
1255                                        break;
1256                        }
1257                        /* fall through . . . */
1258                  case 0x01: /* sequential access, (tape) */
1259                  case 0x08: /* medium changer */
1260                        if (ncurrent >= CCISS_MAX_SCSI_DEVS_PER_HBA) {
1261                                printk(KERN_INFO "cciss%d: %s ignored, "
1262                                        "too many devices.\n", h->ctlr,
1263                                        scsi_device_type(this_device->devtype));
1264                                break;
1265                        }
1266                        currentsd[ncurrent] = *this_device;
1267                        ncurrent++;
1268                        break;
1269                  default: 
1270                        break;
1271                }
1272        }
1273
1274        adjust_cciss_scsi_table(h, hostno, currentsd, ncurrent);
1275out:
1276        kfree(inq_buff);
1277        kfree(ld_buff);
1278        kfree(currentsd);
1279        return;
1280}
1281
1282static int
1283is_keyword(char *ptr, int len, char *verb)  // Thanks to ncr53c8xx.c
1284{
1285        int verb_len = strlen(verb);
1286        if (len >= verb_len && !memcmp(verb,ptr,verb_len))
1287                return verb_len;
1288        else
1289                return 0;
1290}
1291
1292static int
1293cciss_scsi_user_command(ctlr_info_t *h, int hostno, char *buffer, int length)
1294{
1295        int arg_len;
1296
1297        if ((arg_len = is_keyword(buffer, length, "rescan")) != 0)
1298                cciss_update_non_disk_devices(h, hostno);
1299        else
1300                return -EINVAL;
1301        return length;
1302}
1303
1304static int
1305cciss_scsi_write_info(struct Scsi_Host *sh,
1306                char *buffer, /* data buffer */
1307                int length)        /* length of data in buffer */
1308{
1309        ctlr_info_t *h = (ctlr_info_t *) sh->hostdata[0];
1310        if (h == NULL)  /* This really shouldn't ever happen. */
1311                return -EINVAL;
1312
1313        return cciss_scsi_user_command(h, sh->host_no,
1314                        buffer, length);        
1315} 
1316
1317static int
1318cciss_scsi_show_info(struct seq_file *m, struct Scsi_Host *sh)
1319{
1320
1321        ctlr_info_t *h = (ctlr_info_t *) sh->hostdata[0];
1322        int i;
1323
1324        if (h == NULL)  /* This really shouldn't ever happen. */
1325                return -EINVAL;
1326
1327        seq_printf(m, "cciss%d: SCSI host: %d\n",
1328                        h->ctlr, sh->host_no);
1329
1330        /* this information is needed by apps to know which cciss
1331           device corresponds to which scsi host number without
1332           having to open a scsi target device node.  The device
1333           information is not a duplicate of /proc/scsi/scsi because
1334           the two may be out of sync due to scsi hotplug, rather
1335           this info is for an app to be able to use to know how to
1336           get them back in sync. */
1337
1338        for (i = 0; i < ccissscsi[h->ctlr].ndevices; i++) {
1339                struct cciss_scsi_dev_t *sd =
1340                        &ccissscsi[h->ctlr].dev[i];
1341                seq_printf(m, "c%db%dt%dl%d %02d "
1342                        "0x%02x%02x%02x%02x%02x%02x%02x%02x\n",
1343                        sh->host_no, sd->bus, sd->target, sd->lun,
1344                        sd->devtype,
1345                        sd->scsi3addr[0], sd->scsi3addr[1],
1346                        sd->scsi3addr[2], sd->scsi3addr[3],
1347                        sd->scsi3addr[4], sd->scsi3addr[5],
1348                        sd->scsi3addr[6], sd->scsi3addr[7]);
1349        }
1350        return 0;
1351}
1352
1353/* cciss_scatter_gather takes a struct scsi_cmnd, (cmd), and does the pci 
1354   dma mapping  and fills in the scatter gather entries of the 
1355   cciss command, c. */
1356
1357static void cciss_scatter_gather(ctlr_info_t *h, CommandList_struct *c,
1358        struct scsi_cmnd *cmd)
1359{
1360        unsigned int len;
1361        struct scatterlist *sg;
1362        __u64 addr64;
1363        int request_nsgs, i, chained, sg_index;
1364        struct cciss_scsi_adapter_data_t *sa = h->scsi_ctlr;
1365        SGDescriptor_struct *curr_sg;
1366
1367        BUG_ON(scsi_sg_count(cmd) > h->maxsgentries);
1368
1369        chained = 0;
1370        sg_index = 0;
1371        curr_sg = c->SG;
1372        request_nsgs = scsi_dma_map(cmd);
1373        if (request_nsgs) {
1374                scsi_for_each_sg(cmd, sg, request_nsgs, i) {
1375                        if (sg_index + 1 == h->max_cmd_sgentries &&
1376                                !chained && request_nsgs - i > 1) {
1377                                chained = 1;
1378                                sg_index = 0;
1379                                curr_sg = sa->cmd_sg_list[c->cmdindex];
1380                        }
1381                        addr64 = (__u64) sg_dma_address(sg);
1382                        len  = sg_dma_len(sg);
1383                        curr_sg[sg_index].Addr.lower =
1384                                (__u32) (addr64 & 0x0FFFFFFFFULL);
1385                        curr_sg[sg_index].Addr.upper =
1386                                (__u32) ((addr64 >> 32) & 0x0FFFFFFFFULL);
1387                        curr_sg[sg_index].Len = len;
1388                        curr_sg[sg_index].Ext = 0;
1389                        ++sg_index;
1390                }
1391                if (chained)
1392                        cciss_map_sg_chain_block(h, c,
1393                                sa->cmd_sg_list[c->cmdindex],
1394                                (request_nsgs - (h->max_cmd_sgentries - 1)) *
1395                                        sizeof(SGDescriptor_struct));
1396        }
1397        /* track how many SG entries we are using */
1398        if (request_nsgs > h->maxSG)
1399                h->maxSG = request_nsgs;
1400        c->Header.SGTotal = (u16) request_nsgs + chained;
1401        if (request_nsgs > h->max_cmd_sgentries)
1402                c->Header.SGList = h->max_cmd_sgentries;
1403        else
1404                c->Header.SGList = c->Header.SGTotal;
1405        return;
1406}
1407
1408
1409static int
1410cciss_scsi_queue_command_lck(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
1411{
1412        ctlr_info_t *h;
1413        int rc;
1414        unsigned char scsi3addr[8];
1415        CommandList_struct *c;
1416        unsigned long flags;
1417
1418        // Get the ptr to our adapter structure (hba[i]) out of cmd->host.
1419        // We violate cmd->host privacy here.  (Is there another way?)
1420        h = (ctlr_info_t *) cmd->device->host->hostdata[0];
1421
1422        rc = lookup_scsi3addr(h, cmd->device->channel, cmd->device->id,
1423                        cmd->device->lun, scsi3addr);
1424        if (rc != 0) {
1425                /* the scsi nexus does not match any that we presented... */
1426                /* pretend to mid layer that we got selection timeout */
1427                cmd->result = DID_NO_CONNECT << 16;
1428                done(cmd);
1429                /* we might want to think about registering controller itself
1430                   as a processor device on the bus so sg binds to it. */
1431                return 0;
1432        }
1433
1434        /* Ok, we have a reasonable scsi nexus, so send the cmd down, and
1435           see what the device thinks of it. */
1436
1437        spin_lock_irqsave(&h->lock, flags);
1438        c = scsi_cmd_alloc(h);
1439        spin_unlock_irqrestore(&h->lock, flags);
1440        if (c == NULL) {                        /* trouble... */
1441                dev_warn(&h->pdev->dev, "scsi_cmd_alloc returned NULL!\n");
1442                /* FIXME: next 3 lines are -> BAD! <- */
1443                cmd->result = DID_NO_CONNECT << 16;
1444                done(cmd);
1445                return 0;
1446        }
1447
1448        // Fill in the command list header
1449
1450        cmd->scsi_done = done;    // save this for use by completion code 
1451
1452        /* save c in case we have to abort it */
1453        cmd->host_scribble = (unsigned char *) c;
1454
1455        c->cmd_type = CMD_SCSI;
1456        c->scsi_cmd = cmd;
1457        c->Header.ReplyQueue = 0;  /* unused in simple mode */
1458        memcpy(&c->Header.LUN.LunAddrBytes[0], &scsi3addr[0], 8);
1459        c->Header.Tag.lower = c->busaddr;  /* Use k. address of cmd as tag */
1460        
1461        // Fill in the request block...
1462
1463        c->Request.Timeout = 0;
1464        memset(c->Request.CDB, 0, sizeof(c->Request.CDB));
1465        BUG_ON(cmd->cmd_len > sizeof(c->Request.CDB));
1466        c->Request.CDBLen = cmd->cmd_len;
1467        memcpy(c->Request.CDB, cmd->cmnd, cmd->cmd_len);
1468        c->Request.Type.Type = TYPE_CMD;
1469        c->Request.Type.Attribute = ATTR_SIMPLE;
1470        switch(cmd->sc_data_direction)
1471        {
1472          case DMA_TO_DEVICE:
1473                c->Request.Type.Direction = XFER_WRITE;
1474                break;
1475          case DMA_FROM_DEVICE:
1476                c->Request.Type.Direction = XFER_READ;
1477                break;
1478          case DMA_NONE:
1479                c->Request.Type.Direction = XFER_NONE;
1480                break;
1481          case DMA_BIDIRECTIONAL:
1482                // This can happen if a buggy application does a scsi passthru
1483                // and sets both inlen and outlen to non-zero. ( see
1484                // ../scsi/scsi_ioctl.c:scsi_ioctl_send_command() )
1485
1486                c->Request.Type.Direction = XFER_RSVD;
1487                // This is technically wrong, and cciss controllers should
1488                // reject it with CMD_INVALID, which is the most correct 
1489                // response, but non-fibre backends appear to let it 
1490                // slide by, and give the same results as if this field
1491                // were set correctly.  Either way is acceptable for
1492                // our purposes here.
1493
1494                break;
1495
1496          default: 
1497                dev_warn(&h->pdev->dev, "unknown data direction: %d\n",
1498                        cmd->sc_data_direction);
1499                BUG();
1500                break;
1501        }
1502        cciss_scatter_gather(h, c, cmd);
1503        enqueue_cmd_and_start_io(h, c);
1504        /* the cmd'll come back via intr handler in complete_scsi_command()  */
1505        return 0;
1506}
1507
1508static DEF_SCSI_QCMD(cciss_scsi_queue_command)
1509
1510static void cciss_unregister_scsi(ctlr_info_t *h)
1511{
1512        struct cciss_scsi_adapter_data_t *sa;
1513        struct cciss_scsi_cmd_stack_t *stk;
1514        unsigned long flags;
1515
1516        /* we are being forcibly unloaded, and may not refuse. */
1517
1518        spin_lock_irqsave(&h->lock, flags);
1519        sa = h->scsi_ctlr;
1520        stk = &sa->cmd_stack; 
1521
1522        /* if we weren't ever actually registered, don't unregister */ 
1523        if (sa->registered) {
1524                spin_unlock_irqrestore(&h->lock, flags);
1525                scsi_remove_host(sa->scsi_host);
1526                scsi_host_put(sa->scsi_host);
1527                spin_lock_irqsave(&h->lock, flags);
1528        }
1529
1530        /* set scsi_host to NULL so our detect routine will 
1531           find us on register */
1532        sa->scsi_host = NULL;
1533        spin_unlock_irqrestore(&h->lock, flags);
1534        scsi_cmd_stack_free(h);
1535        kfree(sa);
1536}
1537
1538static int cciss_engage_scsi(ctlr_info_t *h)
1539{
1540        struct cciss_scsi_adapter_data_t *sa;
1541        struct cciss_scsi_cmd_stack_t *stk;
1542        unsigned long flags;
1543
1544        spin_lock_irqsave(&h->lock, flags);
1545        sa = h->scsi_ctlr;
1546        stk = &sa->cmd_stack; 
1547
1548        if (sa->registered) {
1549                dev_info(&h->pdev->dev, "SCSI subsystem already engaged.\n");
1550                spin_unlock_irqrestore(&h->lock, flags);
1551                return -ENXIO;
1552        }
1553        sa->registered = 1;
1554        spin_unlock_irqrestore(&h->lock, flags);
1555        cciss_update_non_disk_devices(h, -1);
1556        cciss_scsi_detect(h);
1557        return 0;
1558}
1559
1560static void
1561cciss_seq_tape_report(struct seq_file *seq, ctlr_info_t *h)
1562{
1563        unsigned long flags;
1564
1565        CPQ_TAPE_LOCK(h, flags);
1566        seq_printf(seq,
1567                "Sequential access devices: %d\n\n",
1568                        ccissscsi[h->ctlr].ndevices);
1569        CPQ_TAPE_UNLOCK(h, flags);
1570}
1571
1572static int wait_for_device_to_become_ready(ctlr_info_t *h,
1573        unsigned char lunaddr[])
1574{
1575        int rc;
1576        int count = 0;
1577        int waittime = HZ;
1578        CommandList_struct *c;
1579
1580        c = cmd_alloc(h);
1581        if (!c) {
1582                dev_warn(&h->pdev->dev, "out of memory in "
1583                        "wait_for_device_to_become_ready.\n");
1584                return IO_ERROR;
1585        }
1586
1587        /* Send test unit ready until device ready, or give up. */
1588        while (count < 20) {
1589
1590                /* Wait for a bit.  do this first, because if we send
1591                 * the TUR right away, the reset will just abort it.
1592                 */
1593                schedule_timeout_uninterruptible(waittime);
1594                count++;
1595
1596                /* Increase wait time with each try, up to a point. */
1597                if (waittime < (HZ * 30))
1598                        waittime = waittime * 2;
1599
1600                /* Send the Test Unit Ready */
1601                rc = fill_cmd(h, c, TEST_UNIT_READY, NULL, 0, 0,
1602                        lunaddr, TYPE_CMD);
1603                if (rc == 0)
1604                        rc = sendcmd_withirq_core(h, c, 0);
1605
1606                (void) process_sendcmd_error(h, c);
1607
1608                if (rc != 0)
1609                        goto retry_tur;
1610
1611                if (c->err_info->CommandStatus == CMD_SUCCESS)
1612                        break;
1613
1614                if (c->err_info->CommandStatus == CMD_TARGET_STATUS &&
1615                        c->err_info->ScsiStatus == SAM_STAT_CHECK_CONDITION) {
1616                        if (c->err_info->SenseInfo[2] == NO_SENSE)
1617                                break;
1618                        if (c->err_info->SenseInfo[2] == UNIT_ATTENTION) {
1619                                unsigned char asc;
1620                                asc = c->err_info->SenseInfo[12];
1621                                check_for_unit_attention(h, c);
1622                                if (asc == POWER_OR_RESET)
1623                                        break;
1624                        }
1625                }
1626retry_tur:
1627                dev_warn(&h->pdev->dev, "Waiting %d secs "
1628                        "for device to become ready.\n",
1629                        waittime / HZ);
1630                rc = 1; /* device not ready. */
1631        }
1632
1633        if (rc)
1634                dev_warn(&h->pdev->dev, "giving up on device.\n");
1635        else
1636                dev_warn(&h->pdev->dev, "device is ready.\n");
1637
1638        cmd_free(h, c);
1639        return rc;
1640}
1641
1642/* Need at least one of these error handlers to keep ../scsi/hosts.c from 
1643 * complaining.  Doing a host- or bus-reset can't do anything good here. 
1644 * Despite what it might say in scsi_error.c, there may well be commands
1645 * on the controller, as the cciss driver registers twice, once as a block
1646 * device for the logical drives, and once as a scsi device, for any tape
1647 * drives.  So we know there are no commands out on the tape drives, but we
1648 * don't know there are no commands on the controller, and it is likely 
1649 * that there probably are, as the cciss block device is most commonly used
1650 * as a boot device (embedded controller on HP/Compaq systems.)
1651*/
1652
1653static int cciss_eh_device_reset_handler(struct scsi_cmnd *scsicmd)
1654{
1655        int rc;
1656        CommandList_struct *cmd_in_trouble;
1657        unsigned char lunaddr[8];
1658        ctlr_info_t *h;
1659
1660        /* find the controller to which the command to be aborted was sent */
1661        h = (ctlr_info_t *) scsicmd->device->host->hostdata[0];
1662        if (h == NULL) /* paranoia */
1663                return FAILED;
1664        dev_warn(&h->pdev->dev, "resetting tape drive or medium changer.\n");
1665        /* find the command that's giving us trouble */
1666        cmd_in_trouble = (CommandList_struct *) scsicmd->host_scribble;
1667        if (cmd_in_trouble == NULL) /* paranoia */
1668                return FAILED;
1669        memcpy(lunaddr, &cmd_in_trouble->Header.LUN.LunAddrBytes[0], 8);
1670        /* send a reset to the SCSI LUN which the command was sent to */
1671        rc = sendcmd_withirq(h, CCISS_RESET_MSG, NULL, 0, 0, lunaddr,
1672                TYPE_MSG);
1673        if (rc == 0 && wait_for_device_to_become_ready(h, lunaddr) == 0)
1674                return SUCCESS;
1675        dev_warn(&h->pdev->dev, "resetting device failed.\n");
1676        return FAILED;
1677}
1678
1679static int  cciss_eh_abort_handler(struct scsi_cmnd *scsicmd)
1680{
1681        int rc;
1682        CommandList_struct *cmd_to_abort;
1683        unsigned char lunaddr[8];
1684        ctlr_info_t *h;
1685
1686        /* find the controller to which the command to be aborted was sent */
1687        h = (ctlr_info_t *) scsicmd->device->host->hostdata[0];
1688        if (h == NULL) /* paranoia */
1689                return FAILED;
1690        dev_warn(&h->pdev->dev, "aborting tardy SCSI cmd\n");
1691
1692        /* find the command to be aborted */
1693        cmd_to_abort = (CommandList_struct *) scsicmd->host_scribble;
1694        if (cmd_to_abort == NULL) /* paranoia */
1695                return FAILED;
1696        memcpy(lunaddr, &cmd_to_abort->Header.LUN.LunAddrBytes[0], 8);
1697        rc = sendcmd_withirq(h, CCISS_ABORT_MSG, &cmd_to_abort->Header.Tag,
1698                0, 0, lunaddr, TYPE_MSG);
1699        if (rc == 0)
1700                return SUCCESS;
1701        return FAILED;
1702
1703}
1704
1705#else /* no CONFIG_CISS_SCSI_TAPE */
1706
1707/* If no tape support, then these become defined out of existence */
1708
1709#define cciss_scsi_setup(cntl_num)
1710#define cciss_engage_scsi(h)
1711
1712#endif /* CONFIG_CISS_SCSI_TAPE */
1713