Showing error 1570

User: Jiri Slaby
Error type: Leaving function in locked state
Error type description: Some lock is not unlocked on all paths of a function, so it is leaked
File location: drivers/block/cciss_scsi.c
Line in file: 1647
Project: Linux Kernel
Project version: 2.6.28
Tools: Stanse (1.2)
Entered: 2012-05-29 20:11:37 UTC


Source:

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