linux/drivers/scsi/aacraid/aachba.c
<<
>>
Prefs
   1/*
   2 *      Adaptec AAC series RAID controller driver
   3 *      (c) Copyright 2001 Red Hat Inc. <alan@redhat.com>
   4 *
   5 * based on the old aacraid driver that is..
   6 * Adaptec aacraid device driver for Linux.
   7 *
   8 * Copyright (c) 2000-2007 Adaptec, Inc. (aacraid@adaptec.com)
   9 *
  10 * This program is free software; you can redistribute it and/or modify
  11 * it under the terms of the GNU General Public License as published by
  12 * the Free Software Foundation; either version 2, or (at your option)
  13 * any later version.
  14 *
  15 * This program is distributed in the hope that it will be useful,
  16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18 * GNU General Public License for more details.
  19 *
  20 * You should have received a copy of the GNU General Public License
  21 * along with this program; see the file COPYING.  If not, write to
  22 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  23 *
  24 */
  25
  26#include <linux/kernel.h>
  27#include <linux/init.h>
  28#include <linux/types.h>
  29#include <linux/pci.h>
  30#include <linux/spinlock.h>
  31#include <linux/slab.h>
  32#include <linux/completion.h>
  33#include <linux/blkdev.h>
  34#include <linux/dma-mapping.h>
  35#include <asm/semaphore.h>
  36#include <asm/uaccess.h>
  37
  38#include <scsi/scsi.h>
  39#include <scsi/scsi_cmnd.h>
  40#include <scsi/scsi_device.h>
  41#include <scsi/scsi_host.h>
  42
  43#include "aacraid.h"
  44
  45/* values for inqd_pdt: Peripheral device type in plain English */
  46#define INQD_PDT_DA     0x00    /* Direct-access (DISK) device */
  47#define INQD_PDT_PROC   0x03    /* Processor device */
  48#define INQD_PDT_CHNGR  0x08    /* Changer (jukebox, scsi2) */
  49#define INQD_PDT_COMM   0x09    /* Communication device (scsi2) */
  50#define INQD_PDT_NOLUN2 0x1f    /* Unknown Device (scsi2) */
  51#define INQD_PDT_NOLUN  0x7f    /* Logical Unit Not Present */
  52
  53#define INQD_PDT_DMASK  0x1F    /* Peripheral Device Type Mask */
  54#define INQD_PDT_QMASK  0xE0    /* Peripheral Device Qualifer Mask */
  55
  56/*
  57 *      Sense codes
  58 */
  59 
  60#define SENCODE_NO_SENSE                        0x00
  61#define SENCODE_END_OF_DATA                     0x00
  62#define SENCODE_BECOMING_READY                  0x04
  63#define SENCODE_INIT_CMD_REQUIRED               0x04
  64#define SENCODE_PARAM_LIST_LENGTH_ERROR         0x1A
  65#define SENCODE_INVALID_COMMAND                 0x20
  66#define SENCODE_LBA_OUT_OF_RANGE                0x21
  67#define SENCODE_INVALID_CDB_FIELD               0x24
  68#define SENCODE_LUN_NOT_SUPPORTED               0x25
  69#define SENCODE_INVALID_PARAM_FIELD             0x26
  70#define SENCODE_PARAM_NOT_SUPPORTED             0x26
  71#define SENCODE_PARAM_VALUE_INVALID             0x26
  72#define SENCODE_RESET_OCCURRED                  0x29
  73#define SENCODE_LUN_NOT_SELF_CONFIGURED_YET     0x3E
  74#define SENCODE_INQUIRY_DATA_CHANGED            0x3F
  75#define SENCODE_SAVING_PARAMS_NOT_SUPPORTED     0x39
  76#define SENCODE_DIAGNOSTIC_FAILURE              0x40
  77#define SENCODE_INTERNAL_TARGET_FAILURE         0x44
  78#define SENCODE_INVALID_MESSAGE_ERROR           0x49
  79#define SENCODE_LUN_FAILED_SELF_CONFIG          0x4c
  80#define SENCODE_OVERLAPPED_COMMAND              0x4E
  81
  82/*
  83 *      Additional sense codes
  84 */
  85 
  86#define ASENCODE_NO_SENSE                       0x00
  87#define ASENCODE_END_OF_DATA                    0x05
  88#define ASENCODE_BECOMING_READY                 0x01
  89#define ASENCODE_INIT_CMD_REQUIRED              0x02
  90#define ASENCODE_PARAM_LIST_LENGTH_ERROR        0x00
  91#define ASENCODE_INVALID_COMMAND                0x00
  92#define ASENCODE_LBA_OUT_OF_RANGE               0x00
  93#define ASENCODE_INVALID_CDB_FIELD              0x00
  94#define ASENCODE_LUN_NOT_SUPPORTED              0x00
  95#define ASENCODE_INVALID_PARAM_FIELD            0x00
  96#define ASENCODE_PARAM_NOT_SUPPORTED            0x01
  97#define ASENCODE_PARAM_VALUE_INVALID            0x02
  98#define ASENCODE_RESET_OCCURRED                 0x00
  99#define ASENCODE_LUN_NOT_SELF_CONFIGURED_YET    0x00
 100#define ASENCODE_INQUIRY_DATA_CHANGED           0x03
 101#define ASENCODE_SAVING_PARAMS_NOT_SUPPORTED    0x00
 102#define ASENCODE_DIAGNOSTIC_FAILURE             0x80
 103#define ASENCODE_INTERNAL_TARGET_FAILURE        0x00
 104#define ASENCODE_INVALID_MESSAGE_ERROR          0x00
 105#define ASENCODE_LUN_FAILED_SELF_CONFIG         0x00
 106#define ASENCODE_OVERLAPPED_COMMAND             0x00
 107
 108#define BYTE0(x) (unsigned char)(x)
 109#define BYTE1(x) (unsigned char)((x) >> 8)
 110#define BYTE2(x) (unsigned char)((x) >> 16)
 111#define BYTE3(x) (unsigned char)((x) >> 24)
 112
 113/*------------------------------------------------------------------------------
 114 *              S T R U C T S / T Y P E D E F S
 115 *----------------------------------------------------------------------------*/
 116/* SCSI inquiry data */
 117struct inquiry_data {
 118        u8 inqd_pdt;    /* Peripheral qualifier | Peripheral Device Type  */
 119        u8 inqd_dtq;    /* RMB | Device Type Qualifier  */
 120        u8 inqd_ver;    /* ISO version | ECMA version | ANSI-approved version */
 121        u8 inqd_rdf;    /* AENC | TrmIOP | Response data format */
 122        u8 inqd_len;    /* Additional length (n-4) */
 123        u8 inqd_pad1[2];/* Reserved - must be zero */
 124        u8 inqd_pad2;   /* RelAdr | WBus32 | WBus16 |  Sync  | Linked |Reserved| CmdQue | SftRe */
 125        u8 inqd_vid[8]; /* Vendor ID */
 126        u8 inqd_pid[16];/* Product ID */
 127        u8 inqd_prl[4]; /* Product Revision Level */
 128};
 129
 130/*
 131 *              M O D U L E   G L O B A L S
 132 */
 133 
 134static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* sgmap);
 135static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* psg);
 136static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw* psg);
 137static int aac_send_srb_fib(struct scsi_cmnd* scsicmd);
 138#ifdef AAC_DETAILED_STATUS_INFO
 139static char *aac_get_status_string(u32 status);
 140#endif
 141
 142/*
 143 *      Non dasd selection is handled entirely in aachba now
 144 */     
 145 
 146static int nondasd = -1;
 147static int dacmode = -1;
 148
 149int aac_commit = -1;
 150int startup_timeout = 180;
 151int aif_timeout = 120;
 152
 153module_param(nondasd, int, S_IRUGO|S_IWUSR);
 154MODULE_PARM_DESC(nondasd, "Control scanning of hba for nondasd devices. 0=off, 1=on");
 155module_param(dacmode, int, S_IRUGO|S_IWUSR);
 156MODULE_PARM_DESC(dacmode, "Control whether dma addressing is using 64 bit DAC. 0=off, 1=on");
 157module_param_named(commit, aac_commit, int, S_IRUGO|S_IWUSR);
 158MODULE_PARM_DESC(commit, "Control whether a COMMIT_CONFIG is issued to the adapter for foreign arrays.\nThis is typically needed in systems that do not have a BIOS. 0=off, 1=on");
 159module_param(startup_timeout, int, S_IRUGO|S_IWUSR);
 160MODULE_PARM_DESC(startup_timeout, "The duration of time in seconds to wait for adapter to have it's kernel up and\nrunning. This is typically adjusted for large systems that do not have a BIOS.");
 161module_param(aif_timeout, int, S_IRUGO|S_IWUSR);
 162MODULE_PARM_DESC(aif_timeout, "The duration of time in seconds to wait for applications to pick up AIFs before\nderegistering them. This is typically adjusted for heavily burdened systems.");
 163
 164int numacb = -1;
 165module_param(numacb, int, S_IRUGO|S_IWUSR);
 166MODULE_PARM_DESC(numacb, "Request a limit to the number of adapter control blocks (FIB) allocated. Valid values are 512 and down. Default is to use suggestion from Firmware.");
 167
 168int acbsize = -1;
 169module_param(acbsize, int, S_IRUGO|S_IWUSR);
 170MODULE_PARM_DESC(acbsize, "Request a specific adapter control block (FIB) size. Valid values are 512, 2048, 4096 and 8192. Default is to use suggestion from Firmware.");
 171
 172int update_interval = 30 * 60;
 173module_param(update_interval, int, S_IRUGO|S_IWUSR);
 174MODULE_PARM_DESC(update_interval, "Interval in seconds between time sync updates issued to adapter.");
 175
 176int check_interval = 24 * 60 * 60;
 177module_param(check_interval, int, S_IRUGO|S_IWUSR);
 178MODULE_PARM_DESC(check_interval, "Interval in seconds between adapter health checks.");
 179
 180int aac_check_reset = 1;
 181module_param_named(check_reset, aac_check_reset, int, S_IRUGO|S_IWUSR);
 182MODULE_PARM_DESC(aac_check_reset, "If adapter fails health check, reset the adapter.");
 183
 184int expose_physicals = -1;
 185module_param(expose_physicals, int, S_IRUGO|S_IWUSR);
 186MODULE_PARM_DESC(expose_physicals, "Expose physical components of the arrays. -1=protect 0=off, 1=on");
 187
 188int aac_reset_devices = 0;
 189module_param_named(reset_devices, aac_reset_devices, int, S_IRUGO|S_IWUSR);
 190MODULE_PARM_DESC(reset_devices, "Force an adapter reset at initialization.");
 191
 192static inline int aac_valid_context(struct scsi_cmnd *scsicmd,
 193                struct fib *fibptr) {
 194        struct scsi_device *device;
 195
 196        if (unlikely(!scsicmd || !scsicmd->scsi_done )) {
 197                dprintk((KERN_WARNING "aac_valid_context: scsi command corrupt\n"));
 198                aac_fib_complete(fibptr);
 199                aac_fib_free(fibptr);
 200                return 0;
 201        }
 202        scsicmd->SCp.phase = AAC_OWNER_MIDLEVEL;
 203        device = scsicmd->device;
 204        if (unlikely(!device || !scsi_device_online(device))) {
 205                dprintk((KERN_WARNING "aac_valid_context: scsi device corrupt\n"));
 206                aac_fib_complete(fibptr);
 207                aac_fib_free(fibptr);
 208                return 0;
 209        }
 210        return 1;
 211}
 212
 213/**
 214 *      aac_get_config_status   -       check the adapter configuration
 215 *      @common: adapter to query
 216 *
 217 *      Query config status, and commit the configuration if needed.
 218 */
 219int aac_get_config_status(struct aac_dev *dev, int commit_flag)
 220{
 221        int status = 0;
 222        struct fib * fibptr;
 223
 224        if (!(fibptr = aac_fib_alloc(dev)))
 225                return -ENOMEM;
 226
 227        aac_fib_init(fibptr);
 228        {
 229                struct aac_get_config_status *dinfo;
 230                dinfo = (struct aac_get_config_status *) fib_data(fibptr);
 231
 232                dinfo->command = cpu_to_le32(VM_ContainerConfig);
 233                dinfo->type = cpu_to_le32(CT_GET_CONFIG_STATUS);
 234                dinfo->count = cpu_to_le32(sizeof(((struct aac_get_config_status_resp *)NULL)->data));
 235        }
 236
 237        status = aac_fib_send(ContainerCommand,
 238                            fibptr,
 239                            sizeof (struct aac_get_config_status),
 240                            FsaNormal,
 241                            1, 1,
 242                            NULL, NULL);
 243        if (status < 0 ) {
 244                printk(KERN_WARNING "aac_get_config_status: SendFIB failed.\n");
 245        } else {
 246                struct aac_get_config_status_resp *reply
 247                  = (struct aac_get_config_status_resp *) fib_data(fibptr);
 248                dprintk((KERN_WARNING
 249                  "aac_get_config_status: response=%d status=%d action=%d\n",
 250                  le32_to_cpu(reply->response),
 251                  le32_to_cpu(reply->status),
 252                  le32_to_cpu(reply->data.action)));
 253                if ((le32_to_cpu(reply->response) != ST_OK) ||
 254                     (le32_to_cpu(reply->status) != CT_OK) ||
 255                     (le32_to_cpu(reply->data.action) > CFACT_PAUSE)) {
 256                        printk(KERN_WARNING "aac_get_config_status: Will not issue the Commit Configuration\n");
 257                        status = -EINVAL;
 258                }
 259        }
 260        aac_fib_complete(fibptr);
 261        /* Send a CT_COMMIT_CONFIG to enable discovery of devices */
 262        if (status >= 0) {
 263                if ((aac_commit == 1) || commit_flag) {
 264                        struct aac_commit_config * dinfo;
 265                        aac_fib_init(fibptr);
 266                        dinfo = (struct aac_commit_config *) fib_data(fibptr);
 267        
 268                        dinfo->command = cpu_to_le32(VM_ContainerConfig);
 269                        dinfo->type = cpu_to_le32(CT_COMMIT_CONFIG);
 270        
 271                        status = aac_fib_send(ContainerCommand,
 272                                    fibptr,
 273                                    sizeof (struct aac_commit_config),
 274                                    FsaNormal,
 275                                    1, 1,
 276                                    NULL, NULL);
 277                        aac_fib_complete(fibptr);
 278                } else if (aac_commit == 0) {
 279                        printk(KERN_WARNING
 280                          "aac_get_config_status: Foreign device configurations are being ignored\n");
 281                }
 282        }
 283        aac_fib_free(fibptr);
 284        return status;
 285}
 286
 287/**
 288 *      aac_get_containers      -       list containers
 289 *      @common: adapter to probe
 290 *
 291 *      Make a list of all containers on this controller
 292 */
 293int aac_get_containers(struct aac_dev *dev)
 294{
 295        struct fsa_dev_info *fsa_dev_ptr;
 296        u32 index; 
 297        int status = 0;
 298        struct fib * fibptr;
 299        struct aac_get_container_count *dinfo;
 300        struct aac_get_container_count_resp *dresp;
 301        int maximum_num_containers = MAXIMUM_NUM_CONTAINERS;
 302
 303        if (!(fibptr = aac_fib_alloc(dev)))
 304                return -ENOMEM;
 305
 306        aac_fib_init(fibptr);
 307        dinfo = (struct aac_get_container_count *) fib_data(fibptr);
 308        dinfo->command = cpu_to_le32(VM_ContainerConfig);
 309        dinfo->type = cpu_to_le32(CT_GET_CONTAINER_COUNT);
 310
 311        status = aac_fib_send(ContainerCommand,
 312                    fibptr,
 313                    sizeof (struct aac_get_container_count),
 314                    FsaNormal,
 315                    1, 1,
 316                    NULL, NULL);
 317        if (status >= 0) {
 318                dresp = (struct aac_get_container_count_resp *)fib_data(fibptr);
 319                maximum_num_containers = le32_to_cpu(dresp->ContainerSwitchEntries);
 320                aac_fib_complete(fibptr);
 321        }
 322        aac_fib_free(fibptr);
 323
 324        if (maximum_num_containers < MAXIMUM_NUM_CONTAINERS)
 325                maximum_num_containers = MAXIMUM_NUM_CONTAINERS;
 326        fsa_dev_ptr = kzalloc(sizeof(*fsa_dev_ptr) * maximum_num_containers,
 327                        GFP_KERNEL);
 328        if (!fsa_dev_ptr)
 329                return -ENOMEM;
 330
 331        dev->fsa_dev = fsa_dev_ptr;
 332        dev->maximum_num_containers = maximum_num_containers;
 333
 334        for (index = 0; index < dev->maximum_num_containers; ) {
 335                fsa_dev_ptr[index].devname[0] = '\0';
 336
 337                status = aac_probe_container(dev, index);
 338
 339                if (status < 0) {
 340                        printk(KERN_WARNING "aac_get_containers: SendFIB failed.\n");
 341                        break;
 342                }
 343
 344                /*
 345                 *      If there are no more containers, then stop asking.
 346                 */
 347                if (++index >= status)
 348                        break;
 349        }
 350        return status;
 351}
 352
 353static void aac_internal_transfer(struct scsi_cmnd *scsicmd, void *data, unsigned int offset, unsigned int len)
 354{
 355        void *buf;
 356        int transfer_len;
 357        struct scatterlist *sg = scsi_sglist(scsicmd);
 358
 359        buf = kmap_atomic(sg_page(sg), KM_IRQ0) + sg->offset;
 360        transfer_len = min(sg->length, len + offset);
 361
 362        transfer_len -= offset;
 363        if (buf && transfer_len > 0)
 364                memcpy(buf + offset, data, transfer_len);
 365
 366        kunmap_atomic(buf - sg->offset, KM_IRQ0);
 367
 368}
 369
 370static void get_container_name_callback(void *context, struct fib * fibptr)
 371{
 372        struct aac_get_name_resp * get_name_reply;
 373        struct scsi_cmnd * scsicmd;
 374
 375        scsicmd = (struct scsi_cmnd *) context;
 376
 377        if (!aac_valid_context(scsicmd, fibptr))
 378                return;
 379
 380        dprintk((KERN_DEBUG "get_container_name_callback[cpu %d]: t = %ld.\n", smp_processor_id(), jiffies));
 381        BUG_ON(fibptr == NULL);
 382
 383        get_name_reply = (struct aac_get_name_resp *) fib_data(fibptr);
 384        /* Failure is irrelevant, using default value instead */
 385        if ((le32_to_cpu(get_name_reply->status) == CT_OK)
 386         && (get_name_reply->data[0] != '\0')) {
 387                char *sp = get_name_reply->data;
 388                sp[sizeof(((struct aac_get_name_resp *)NULL)->data)-1] = '\0';
 389                while (*sp == ' ')
 390                        ++sp;
 391                if (*sp) {
 392                        char d[sizeof(((struct inquiry_data *)NULL)->inqd_pid)];
 393                        int count = sizeof(d);
 394                        char *dp = d;
 395                        do {
 396                                *dp++ = (*sp) ? *sp++ : ' ';
 397                        } while (--count > 0);
 398                        aac_internal_transfer(scsicmd, d, 
 399                          offsetof(struct inquiry_data, inqd_pid), sizeof(d));
 400                }
 401        }
 402
 403        scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
 404
 405        aac_fib_complete(fibptr);
 406        aac_fib_free(fibptr);
 407        scsicmd->scsi_done(scsicmd);
 408}
 409
 410/**
 411 *      aac_get_container_name  -       get container name, none blocking.
 412 */
 413static int aac_get_container_name(struct scsi_cmnd * scsicmd)
 414{
 415        int status;
 416        struct aac_get_name *dinfo;
 417        struct fib * cmd_fibcontext;
 418        struct aac_dev * dev;
 419
 420        dev = (struct aac_dev *)scsicmd->device->host->hostdata;
 421
 422        if (!(cmd_fibcontext = aac_fib_alloc(dev)))
 423                return -ENOMEM;
 424
 425        aac_fib_init(cmd_fibcontext);
 426        dinfo = (struct aac_get_name *) fib_data(cmd_fibcontext);
 427
 428        dinfo->command = cpu_to_le32(VM_ContainerConfig);
 429        dinfo->type = cpu_to_le32(CT_READ_NAME);
 430        dinfo->cid = cpu_to_le32(scmd_id(scsicmd));
 431        dinfo->count = cpu_to_le32(sizeof(((struct aac_get_name_resp *)NULL)->data));
 432
 433        status = aac_fib_send(ContainerCommand,
 434                  cmd_fibcontext, 
 435                  sizeof (struct aac_get_name),
 436                  FsaNormal, 
 437                  0, 1, 
 438                  (fib_callback) get_container_name_callback, 
 439                  (void *) scsicmd);
 440        
 441        /*
 442         *      Check that the command queued to the controller
 443         */
 444        if (status == -EINPROGRESS) {
 445                scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
 446                return 0;
 447        }
 448                
 449        printk(KERN_WARNING "aac_get_container_name: aac_fib_send failed with status: %d.\n", status);
 450        aac_fib_complete(cmd_fibcontext);
 451        aac_fib_free(cmd_fibcontext);
 452        return -1;
 453}
 454
 455static int aac_probe_container_callback2(struct scsi_cmnd * scsicmd)
 456{
 457        struct fsa_dev_info *fsa_dev_ptr = ((struct aac_dev *)(scsicmd->device->host->hostdata))->fsa_dev;
 458
 459        if ((fsa_dev_ptr[scmd_id(scsicmd)].valid & 1))
 460                return aac_scsi_cmd(scsicmd);
 461
 462        scsicmd->result = DID_NO_CONNECT << 16;
 463        scsicmd->scsi_done(scsicmd);
 464        return 0;
 465}
 466
 467static void _aac_probe_container2(void * context, struct fib * fibptr)
 468{
 469        struct fsa_dev_info *fsa_dev_ptr;
 470        int (*callback)(struct scsi_cmnd *);
 471        struct scsi_cmnd * scsicmd = (struct scsi_cmnd *)context;
 472
 473
 474        if (!aac_valid_context(scsicmd, fibptr))
 475                return;
 476
 477        scsicmd->SCp.Status = 0;
 478        fsa_dev_ptr = fibptr->dev->fsa_dev;
 479        if (fsa_dev_ptr) {
 480                struct aac_mount * dresp = (struct aac_mount *) fib_data(fibptr);
 481                fsa_dev_ptr += scmd_id(scsicmd);
 482
 483                if ((le32_to_cpu(dresp->status) == ST_OK) &&
 484                    (le32_to_cpu(dresp->mnt[0].vol) != CT_NONE) &&
 485                    (le32_to_cpu(dresp->mnt[0].state) != FSCS_HIDDEN)) {
 486                        fsa_dev_ptr->valid = 1;
 487                        fsa_dev_ptr->type = le32_to_cpu(dresp->mnt[0].vol);
 488                        fsa_dev_ptr->size
 489                          = ((u64)le32_to_cpu(dresp->mnt[0].capacity)) +
 490                            (((u64)le32_to_cpu(dresp->mnt[0].capacityhigh)) << 32);
 491                        fsa_dev_ptr->ro = ((le32_to_cpu(dresp->mnt[0].state) & FSCS_READONLY) != 0);
 492                }
 493                if ((fsa_dev_ptr->valid & 1) == 0)
 494                        fsa_dev_ptr->valid = 0;
 495                scsicmd->SCp.Status = le32_to_cpu(dresp->count);
 496        }
 497        aac_fib_complete(fibptr);
 498        aac_fib_free(fibptr);
 499        callback = (int (*)(struct scsi_cmnd *))(scsicmd->SCp.ptr);
 500        scsicmd->SCp.ptr = NULL;
 501        (*callback)(scsicmd);
 502        return;
 503}
 504
 505static void _aac_probe_container1(void * context, struct fib * fibptr)
 506{
 507        struct scsi_cmnd * scsicmd;
 508        struct aac_mount * dresp;
 509        struct aac_query_mount *dinfo;
 510        int status;
 511
 512        dresp = (struct aac_mount *) fib_data(fibptr);
 513        dresp->mnt[0].capacityhigh = 0;
 514        if ((le32_to_cpu(dresp->status) != ST_OK) ||
 515            (le32_to_cpu(dresp->mnt[0].vol) != CT_NONE)) {
 516                _aac_probe_container2(context, fibptr);
 517                return;
 518        }
 519        scsicmd = (struct scsi_cmnd *) context;
 520
 521        if (!aac_valid_context(scsicmd, fibptr))
 522                return;
 523
 524        aac_fib_init(fibptr);
 525
 526        dinfo = (struct aac_query_mount *)fib_data(fibptr);
 527
 528        dinfo->command = cpu_to_le32(VM_NameServe64);
 529        dinfo->count = cpu_to_le32(scmd_id(scsicmd));
 530        dinfo->type = cpu_to_le32(FT_FILESYS);
 531
 532        status = aac_fib_send(ContainerCommand,
 533                          fibptr,
 534                          sizeof(struct aac_query_mount),
 535                          FsaNormal,
 536                          0, 1,
 537                          _aac_probe_container2,
 538                          (void *) scsicmd);
 539        /*
 540         *      Check that the command queued to the controller
 541         */
 542        if (status == -EINPROGRESS)
 543                scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
 544        else if (status < 0) {
 545                /* Inherit results from VM_NameServe, if any */
 546                dresp->status = cpu_to_le32(ST_OK);
 547                _aac_probe_container2(context, fibptr);
 548        }
 549}
 550
 551static int _aac_probe_container(struct scsi_cmnd * scsicmd, int (*callback)(struct scsi_cmnd *))
 552{
 553        struct fib * fibptr;
 554        int status = -ENOMEM;
 555
 556        if ((fibptr = aac_fib_alloc((struct aac_dev *)scsicmd->device->host->hostdata))) {
 557                struct aac_query_mount *dinfo;
 558
 559                aac_fib_init(fibptr);
 560
 561                dinfo = (struct aac_query_mount *)fib_data(fibptr);
 562
 563                dinfo->command = cpu_to_le32(VM_NameServe);
 564                dinfo->count = cpu_to_le32(scmd_id(scsicmd));
 565                dinfo->type = cpu_to_le32(FT_FILESYS);
 566                scsicmd->SCp.ptr = (char *)callback;
 567
 568                status = aac_fib_send(ContainerCommand,
 569                          fibptr,
 570                          sizeof(struct aac_query_mount),
 571                          FsaNormal,
 572                          0, 1,
 573                          _aac_probe_container1,
 574                          (void *) scsicmd);
 575                /*
 576                 *      Check that the command queued to the controller
 577                 */
 578                if (status == -EINPROGRESS) {
 579                        scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
 580                        return 0;
 581                }
 582                if (status < 0) {
 583                        scsicmd->SCp.ptr = NULL;
 584                        aac_fib_complete(fibptr);
 585                        aac_fib_free(fibptr);
 586                }
 587        }
 588        if (status < 0) {
 589                struct fsa_dev_info *fsa_dev_ptr = ((struct aac_dev *)(scsicmd->device->host->hostdata))->fsa_dev;
 590                if (fsa_dev_ptr) {
 591                        fsa_dev_ptr += scmd_id(scsicmd);
 592                        if ((fsa_dev_ptr->valid & 1) == 0) {
 593                                fsa_dev_ptr->valid = 0;
 594                                return (*callback)(scsicmd);
 595                        }
 596                }
 597        }
 598        return status;
 599}
 600
 601/**
 602 *      aac_probe_container             -       query a logical volume
 603 *      @dev: device to query
 604 *      @cid: container identifier
 605 *
 606 *      Queries the controller about the given volume. The volume information
 607 *      is updated in the struct fsa_dev_info structure rather than returned.
 608 */
 609static int aac_probe_container_callback1(struct scsi_cmnd * scsicmd)
 610{
 611        scsicmd->device = NULL;
 612        return 0;
 613}
 614
 615int aac_probe_container(struct aac_dev *dev, int cid)
 616{
 617        struct scsi_cmnd *scsicmd = kmalloc(sizeof(*scsicmd), GFP_KERNEL);
 618        struct scsi_device *scsidev = kmalloc(sizeof(*scsidev), GFP_KERNEL);
 619        int status;
 620
 621        if (!scsicmd || !scsidev) {
 622                kfree(scsicmd);
 623                kfree(scsidev);
 624                return -ENOMEM;
 625        }
 626        scsicmd->list.next = NULL;
 627        scsicmd->scsi_done = (void (*)(struct scsi_cmnd*))aac_probe_container_callback1;
 628
 629        scsicmd->device = scsidev;
 630        scsidev->sdev_state = 0;
 631        scsidev->id = cid;
 632        scsidev->host = dev->scsi_host_ptr;
 633
 634        if (_aac_probe_container(scsicmd, aac_probe_container_callback1) == 0)
 635                while (scsicmd->device == scsidev)
 636                        schedule();
 637        kfree(scsidev);
 638        status = scsicmd->SCp.Status;
 639        kfree(scsicmd);
 640        return status;
 641}
 642
 643/* Local Structure to set SCSI inquiry data strings */
 644struct scsi_inq {
 645        char vid[8];         /* Vendor ID */
 646        char pid[16];        /* Product ID */
 647        char prl[4];         /* Product Revision Level */
 648};
 649
 650/**
 651 *      InqStrCopy      -       string merge
 652 *      @a:     string to copy from
 653 *      @b:     string to copy to
 654 *
 655 *      Copy a String from one location to another
 656 *      without copying \0
 657 */
 658
 659static void inqstrcpy(char *a, char *b)
 660{
 661
 662        while(*a != (char)0) 
 663                *b++ = *a++;
 664}
 665
 666static char *container_types[] = {
 667        "None",
 668        "Volume",
 669        "Mirror",
 670        "Stripe",
 671        "RAID5",
 672        "SSRW",
 673        "SSRO",
 674        "Morph",
 675        "Legacy",
 676        "RAID4",
 677        "RAID10",             
 678        "RAID00",             
 679        "V-MIRRORS",          
 680        "PSEUDO R4",          
 681        "RAID50",
 682        "RAID5D",
 683        "RAID5D0",
 684        "RAID1E",
 685        "RAID6",
 686        "RAID60",
 687        "Unknown"
 688};
 689
 690
 691
 692/* Function: setinqstr
 693 *
 694 * Arguments: [1] pointer to void [1] int
 695 *
 696 * Purpose: Sets SCSI inquiry data strings for vendor, product
 697 * and revision level. Allows strings to be set in platform dependant
 698 * files instead of in OS dependant driver source.
 699 */
 700
 701static void setinqstr(struct aac_dev *dev, void *data, int tindex)
 702{
 703        struct scsi_inq *str;
 704
 705        str = (struct scsi_inq *)(data); /* cast data to scsi inq block */
 706        memset(str, ' ', sizeof(*str));
 707
 708        if (dev->supplement_adapter_info.AdapterTypeText[0]) {
 709                char * cp = dev->supplement_adapter_info.AdapterTypeText;
 710                int c = sizeof(str->vid);
 711                while (*cp && *cp != ' ' && --c)
 712                        ++cp;
 713                c = *cp;
 714                *cp = '\0';
 715                inqstrcpy (dev->supplement_adapter_info.AdapterTypeText,
 716                  str->vid); 
 717                *cp = c;
 718                while (*cp && *cp != ' ')
 719                        ++cp;
 720                while (*cp == ' ')
 721                        ++cp;
 722                /* last six chars reserved for vol type */
 723                c = 0;
 724                if (strlen(cp) > sizeof(str->pid)) {
 725                        c = cp[sizeof(str->pid)];
 726                        cp[sizeof(str->pid)] = '\0';
 727                }
 728                inqstrcpy (cp, str->pid);
 729                if (c)
 730                        cp[sizeof(str->pid)] = c;
 731        } else {
 732                struct aac_driver_ident *mp = aac_get_driver_ident(dev->cardtype);
 733
 734                inqstrcpy (mp->vname, str->vid);
 735                /* last six chars reserved for vol type */
 736                inqstrcpy (mp->model, str->pid);
 737        }
 738
 739        if (tindex < ARRAY_SIZE(container_types)){
 740                char *findit = str->pid;
 741
 742                for ( ; *findit != ' '; findit++); /* walk till we find a space */
 743                /* RAID is superfluous in the context of a RAID device */
 744                if (memcmp(findit-4, "RAID", 4) == 0)
 745                        *(findit -= 4) = ' ';
 746                if (((findit - str->pid) + strlen(container_types[tindex]))
 747                 < (sizeof(str->pid) + sizeof(str->prl)))
 748                        inqstrcpy (container_types[tindex], findit + 1);
 749        }
 750        inqstrcpy ("V1.0", str->prl);
 751}
 752
 753static void get_container_serial_callback(void *context, struct fib * fibptr)
 754{
 755        struct aac_get_serial_resp * get_serial_reply;
 756        struct scsi_cmnd * scsicmd;
 757
 758        BUG_ON(fibptr == NULL);
 759
 760        scsicmd = (struct scsi_cmnd *) context;
 761        if (!aac_valid_context(scsicmd, fibptr))
 762                return;
 763
 764        get_serial_reply = (struct aac_get_serial_resp *) fib_data(fibptr);
 765        /* Failure is irrelevant, using default value instead */
 766        if (le32_to_cpu(get_serial_reply->status) == CT_OK) {
 767                char sp[13];
 768                /* EVPD bit set */
 769                sp[0] = INQD_PDT_DA;
 770                sp[1] = scsicmd->cmnd[2];
 771                sp[2] = 0;
 772                sp[3] = snprintf(sp+4, sizeof(sp)-4, "%08X",
 773                  le32_to_cpu(get_serial_reply->uid));
 774                aac_internal_transfer(scsicmd, sp, 0, sizeof(sp));
 775        }
 776
 777        scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
 778
 779        aac_fib_complete(fibptr);
 780        aac_fib_free(fibptr);
 781        scsicmd->scsi_done(scsicmd);
 782}
 783
 784/**
 785 *      aac_get_container_serial - get container serial, none blocking.
 786 */
 787static int aac_get_container_serial(struct scsi_cmnd * scsicmd)
 788{
 789        int status;
 790        struct aac_get_serial *dinfo;
 791        struct fib * cmd_fibcontext;
 792        struct aac_dev * dev;
 793
 794        dev = (struct aac_dev *)scsicmd->device->host->hostdata;
 795
 796        if (!(cmd_fibcontext = aac_fib_alloc(dev)))
 797                return -ENOMEM;
 798
 799        aac_fib_init(cmd_fibcontext);
 800        dinfo = (struct aac_get_serial *) fib_data(cmd_fibcontext);
 801
 802        dinfo->command = cpu_to_le32(VM_ContainerConfig);
 803        dinfo->type = cpu_to_le32(CT_CID_TO_32BITS_UID);
 804        dinfo->cid = cpu_to_le32(scmd_id(scsicmd));
 805
 806        status = aac_fib_send(ContainerCommand,
 807                  cmd_fibcontext,
 808                  sizeof (struct aac_get_serial),
 809                  FsaNormal,
 810                  0, 1,
 811                  (fib_callback) get_container_serial_callback,
 812                  (void *) scsicmd);
 813
 814        /*
 815         *      Check that the command queued to the controller
 816         */
 817        if (status == -EINPROGRESS) {
 818                scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
 819                return 0;
 820        }
 821
 822        printk(KERN_WARNING "aac_get_container_serial: aac_fib_send failed with status: %d.\n", status);
 823        aac_fib_complete(cmd_fibcontext);
 824        aac_fib_free(cmd_fibcontext);
 825        return -1;
 826}
 827
 828/* Function: setinqserial
 829 *
 830 * Arguments: [1] pointer to void [1] int
 831 *
 832 * Purpose: Sets SCSI Unit Serial number.
 833 *          This is a fake. We should read a proper
 834 *          serial number from the container. <SuSE>But
 835 *          without docs it's quite hard to do it :-)
 836 *          So this will have to do in the meantime.</SuSE>
 837 */
 838
 839static int setinqserial(struct aac_dev *dev, void *data, int cid)
 840{
 841        /*
 842         *      This breaks array migration.
 843         */
 844        return snprintf((char *)(data), sizeof(struct scsi_inq) - 4, "%08X%02X",
 845                        le32_to_cpu(dev->adapter_info.serial[0]), cid);
 846}
 847
 848static void set_sense(u8 *sense_buf, u8 sense_key, u8 sense_code,
 849                      u8 a_sense_code, u8 incorrect_length,
 850                      u8 bit_pointer, u16 field_pointer,
 851                      u32 residue)
 852{
 853        sense_buf[0] = 0xF0;    /* Sense data valid, err code 70h (current error) */
 854        sense_buf[1] = 0;       /* Segment number, always zero */
 855
 856        if (incorrect_length) {
 857                sense_buf[2] = sense_key | 0x20;/* Set ILI bit | sense key */
 858                sense_buf[3] = BYTE3(residue);
 859                sense_buf[4] = BYTE2(residue);
 860                sense_buf[5] = BYTE1(residue);
 861                sense_buf[6] = BYTE0(residue);
 862        } else
 863                sense_buf[2] = sense_key;       /* Sense key */
 864
 865        if (sense_key == ILLEGAL_REQUEST)
 866                sense_buf[7] = 10;      /* Additional sense length */
 867        else
 868                sense_buf[7] = 6;       /* Additional sense length */
 869
 870        sense_buf[12] = sense_code;     /* Additional sense code */
 871        sense_buf[13] = a_sense_code;   /* Additional sense code qualifier */
 872        if (sense_key == ILLEGAL_REQUEST) {
 873                sense_buf[15] = 0;
 874
 875                if (sense_code == SENCODE_INVALID_PARAM_FIELD)
 876                        sense_buf[15] = 0x80;/* Std sense key specific field */
 877                /* Illegal parameter is in the parameter block */
 878
 879                if (sense_code == SENCODE_INVALID_CDB_FIELD)
 880                        sense_buf[15] = 0xc0;/* Std sense key specific field */
 881                /* Illegal parameter is in the CDB block */
 882                sense_buf[15] |= bit_pointer;
 883                sense_buf[16] = field_pointer >> 8;     /* MSB */
 884                sense_buf[17] = field_pointer;          /* LSB */
 885        }
 886}
 887
 888static int aac_bounds_32(struct aac_dev * dev, struct scsi_cmnd * cmd, u64 lba)
 889{
 890        if (lba & 0xffffffff00000000LL) {
 891                int cid = scmd_id(cmd);
 892                dprintk((KERN_DEBUG "aacraid: Illegal lba\n"));
 893                cmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
 894                        SAM_STAT_CHECK_CONDITION;
 895                set_sense((u8 *) &dev->fsa_dev[cid].sense_data,
 896                            HARDWARE_ERROR,
 897                            SENCODE_INTERNAL_TARGET_FAILURE,
 898                            ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0,
 899                            0, 0);
 900                memcpy(cmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
 901                  (sizeof(dev->fsa_dev[cid].sense_data) > sizeof(cmd->sense_buffer))
 902                    ? sizeof(cmd->sense_buffer)
 903                    : sizeof(dev->fsa_dev[cid].sense_data));
 904                cmd->scsi_done(cmd);
 905                return 1;
 906        }
 907        return 0;
 908}
 909
 910static int aac_bounds_64(struct aac_dev * dev, struct scsi_cmnd * cmd, u64 lba)
 911{
 912        return 0;
 913}
 914
 915static void io_callback(void *context, struct fib * fibptr);
 916
 917static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count)
 918{
 919        u16 fibsize;
 920        struct aac_raw_io *readcmd;
 921        aac_fib_init(fib);
 922        readcmd = (struct aac_raw_io *) fib_data(fib);
 923        readcmd->block[0] = cpu_to_le32((u32)(lba&0xffffffff));
 924        readcmd->block[1] = cpu_to_le32((u32)((lba&0xffffffff00000000LL)>>32));
 925        readcmd->count = cpu_to_le32(count<<9);
 926        readcmd->cid = cpu_to_le16(scmd_id(cmd));
 927        readcmd->flags = cpu_to_le16(IO_TYPE_READ);
 928        readcmd->bpTotal = 0;
 929        readcmd->bpComplete = 0;
 930
 931        aac_build_sgraw(cmd, &readcmd->sg);
 932        fibsize = sizeof(struct aac_raw_io) + ((le32_to_cpu(readcmd->sg.count) - 1) * sizeof (struct sgentryraw));
 933        BUG_ON(fibsize > (fib->dev->max_fib_size - sizeof(struct aac_fibhdr)));
 934        /*
 935         *      Now send the Fib to the adapter
 936         */
 937        return aac_fib_send(ContainerRawIo,
 938                          fib,
 939                          fibsize,
 940                          FsaNormal,
 941                          0, 1,
 942                          (fib_callback) io_callback,
 943                          (void *) cmd);
 944}
 945
 946static int aac_read_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count)
 947{
 948        u16 fibsize;
 949        struct aac_read64 *readcmd;
 950        aac_fib_init(fib);
 951        readcmd = (struct aac_read64 *) fib_data(fib);
 952        readcmd->command = cpu_to_le32(VM_CtHostRead64);
 953        readcmd->cid = cpu_to_le16(scmd_id(cmd));
 954        readcmd->sector_count = cpu_to_le16(count);
 955        readcmd->block = cpu_to_le32((u32)(lba&0xffffffff));
 956        readcmd->pad   = 0;
 957        readcmd->flags = 0;
 958
 959        aac_build_sg64(cmd, &readcmd->sg);
 960        fibsize = sizeof(struct aac_read64) +
 961                ((le32_to_cpu(readcmd->sg.count) - 1) *
 962                 sizeof (struct sgentry64));
 963        BUG_ON (fibsize > (fib->dev->max_fib_size -
 964                                sizeof(struct aac_fibhdr)));
 965        /*
 966         *      Now send the Fib to the adapter
 967         */
 968        return aac_fib_send(ContainerCommand64,
 969                          fib,
 970                          fibsize,
 971                          FsaNormal,
 972                          0, 1,
 973                          (fib_callback) io_callback,
 974                          (void *) cmd);
 975}
 976
 977static int aac_read_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count)
 978{
 979        u16 fibsize;
 980        struct aac_read *readcmd;
 981        aac_fib_init(fib);
 982        readcmd = (struct aac_read *) fib_data(fib);
 983        readcmd->command = cpu_to_le32(VM_CtBlockRead);
 984        readcmd->cid = cpu_to_le16(scmd_id(cmd));
 985        readcmd->block = cpu_to_le32((u32)(lba&0xffffffff));
 986        readcmd->count = cpu_to_le32(count * 512);
 987
 988        aac_build_sg(cmd, &readcmd->sg);
 989        fibsize = sizeof(struct aac_read) +
 990                        ((le32_to_cpu(readcmd->sg.count) - 1) *
 991                         sizeof (struct sgentry));
 992        BUG_ON (fibsize > (fib->dev->max_fib_size -
 993                                sizeof(struct aac_fibhdr)));
 994        /*
 995         *      Now send the Fib to the adapter
 996         */
 997        return aac_fib_send(ContainerCommand,
 998                          fib,
 999                          fibsize,
1000                          FsaNormal,
1001                          0, 1,
1002                          (fib_callback) io_callback,
1003                          (void *) cmd);
1004}
1005
1006static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count, int fua)
1007{
1008        u16 fibsize;
1009        struct aac_raw_io *writecmd;
1010        aac_fib_init(fib);
1011        writecmd = (struct aac_raw_io *) fib_data(fib);
1012        writecmd->block[0] = cpu_to_le32((u32)(lba&0xffffffff));
1013        writecmd->block[1] = cpu_to_le32((u32)((lba&0xffffffff00000000LL)>>32));
1014        writecmd->count = cpu_to_le32(count<<9);
1015        writecmd->cid = cpu_to_le16(scmd_id(cmd));
1016        writecmd->flags = fua ?
1017                cpu_to_le16(IO_TYPE_WRITE|IO_SUREWRITE) :
1018                cpu_to_le16(IO_TYPE_WRITE);
1019        writecmd->bpTotal = 0;
1020        writecmd->bpComplete = 0;
1021
1022        aac_build_sgraw(cmd, &writecmd->sg);
1023        fibsize = sizeof(struct aac_raw_io) + ((le32_to_cpu(writecmd->sg.count) - 1) * sizeof (struct sgentryraw));
1024        BUG_ON(fibsize > (fib->dev->max_fib_size - sizeof(struct aac_fibhdr)));
1025        /*
1026         *      Now send the Fib to the adapter
1027         */
1028        return aac_fib_send(ContainerRawIo,
1029                          fib,
1030                          fibsize,
1031                          FsaNormal,
1032                          0, 1,
1033                          (fib_callback) io_callback,
1034                          (void *) cmd);
1035}
1036
1037static int aac_write_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count, int fua)
1038{
1039        u16 fibsize;
1040        struct aac_write64 *writecmd;
1041        aac_fib_init(fib);
1042        writecmd = (struct aac_write64 *) fib_data(fib);
1043        writecmd->command = cpu_to_le32(VM_CtHostWrite64);
1044        writecmd->cid = cpu_to_le16(scmd_id(cmd));
1045        writecmd->sector_count = cpu_to_le16(count);
1046        writecmd->block = cpu_to_le32((u32)(lba&0xffffffff));
1047        writecmd->pad   = 0;
1048        writecmd->flags = 0;
1049
1050        aac_build_sg64(cmd, &writecmd->sg);
1051        fibsize = sizeof(struct aac_write64) +
1052                ((le32_to_cpu(writecmd->sg.count) - 1) *
1053                 sizeof (struct sgentry64));
1054        BUG_ON (fibsize > (fib->dev->max_fib_size -
1055                                sizeof(struct aac_fibhdr)));
1056        /*
1057         *      Now send the Fib to the adapter
1058         */
1059        return aac_fib_send(ContainerCommand64,
1060                          fib,
1061                          fibsize,
1062                          FsaNormal,
1063                          0, 1,
1064                          (fib_callback) io_callback,
1065                          (void *) cmd);
1066}
1067
1068static int aac_write_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count, int fua)
1069{
1070        u16 fibsize;
1071        struct aac_write *writecmd;
1072        aac_fib_init(fib);
1073        writecmd = (struct aac_write *) fib_data(fib);
1074        writecmd->command = cpu_to_le32(VM_CtBlockWrite);
1075        writecmd->cid = cpu_to_le16(scmd_id(cmd));
1076        writecmd->block = cpu_to_le32((u32)(lba&0xffffffff));
1077        writecmd->count = cpu_to_le32(count * 512);
1078        writecmd->sg.count = cpu_to_le32(1);
1079        /* ->stable is not used - it did mean which type of write */
1080
1081        aac_build_sg(cmd, &writecmd->sg);
1082        fibsize = sizeof(struct aac_write) +
1083                ((le32_to_cpu(writecmd->sg.count) - 1) *
1084                 sizeof (struct sgentry));
1085        BUG_ON (fibsize > (fib->dev->max_fib_size -
1086                                sizeof(struct aac_fibhdr)));
1087        /*
1088         *      Now send the Fib to the adapter
1089         */
1090        return aac_fib_send(ContainerCommand,
1091                          fib,
1092                          fibsize,
1093                          FsaNormal,
1094                          0, 1,
1095                          (fib_callback) io_callback,
1096                          (void *) cmd);
1097}
1098
1099static struct aac_srb * aac_scsi_common(struct fib * fib, struct scsi_cmnd * cmd)
1100{
1101        struct aac_srb * srbcmd;
1102        u32 flag;
1103        u32 timeout;
1104
1105        aac_fib_init(fib);
1106        switch(cmd->sc_data_direction){
1107        case DMA_TO_DEVICE:
1108                flag = SRB_DataOut;
1109                break;
1110        case DMA_BIDIRECTIONAL:
1111                flag = SRB_DataIn | SRB_DataOut;
1112                break;
1113        case DMA_FROM_DEVICE:
1114                flag = SRB_DataIn;
1115                break;
1116        case DMA_NONE:
1117        default:        /* shuts up some versions of gcc */
1118                flag = SRB_NoDataXfer;
1119                break;
1120        }
1121
1122        srbcmd = (struct aac_srb*) fib_data(fib);
1123        srbcmd->function = cpu_to_le32(SRBF_ExecuteScsi);
1124        srbcmd->channel  = cpu_to_le32(aac_logical_to_phys(scmd_channel(cmd)));
1125        srbcmd->id       = cpu_to_le32(scmd_id(cmd));
1126        srbcmd->lun      = cpu_to_le32(cmd->device->lun);
1127        srbcmd->flags    = cpu_to_le32(flag);
1128        timeout = cmd->timeout_per_command/HZ;
1129        if (timeout == 0)
1130                timeout = 1;
1131        srbcmd->timeout  = cpu_to_le32(timeout);  // timeout in seconds
1132        srbcmd->retry_limit = 0; /* Obsolete parameter */
1133        srbcmd->cdb_size = cpu_to_le32(cmd->cmd_len);
1134        return srbcmd;
1135}
1136
1137static void aac_srb_callback(void *context, struct fib * fibptr);
1138
1139static int aac_scsi_64(struct fib * fib, struct scsi_cmnd * cmd)
1140{
1141        u16 fibsize;
1142        struct aac_srb * srbcmd = aac_scsi_common(fib, cmd);
1143
1144        aac_build_sg64(cmd, (struct sgmap64*) &srbcmd->sg);
1145        srbcmd->count = cpu_to_le32(scsi_bufflen(cmd));
1146
1147        memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb));
1148        memcpy(srbcmd->cdb, cmd->cmnd, cmd->cmd_len);
1149        /*
1150         *      Build Scatter/Gather list
1151         */
1152        fibsize = sizeof (struct aac_srb) - sizeof (struct sgentry) +
1153                ((le32_to_cpu(srbcmd->sg.count) & 0xff) *
1154                 sizeof (struct sgentry64));
1155        BUG_ON (fibsize > (fib->dev->max_fib_size -
1156                                sizeof(struct aac_fibhdr)));
1157
1158        /*
1159         *      Now send the Fib to the adapter
1160         */
1161        return aac_fib_send(ScsiPortCommand64, fib,
1162                                fibsize, FsaNormal, 0, 1,
1163                                  (fib_callback) aac_srb_callback,
1164                                  (void *) cmd);
1165}
1166
1167static int aac_scsi_32(struct fib * fib, struct scsi_cmnd * cmd)
1168{
1169        u16 fibsize;
1170        struct aac_srb * srbcmd = aac_scsi_common(fib, cmd);
1171
1172        aac_build_sg(cmd, (struct sgmap*)&srbcmd->sg);
1173        srbcmd->count = cpu_to_le32(scsi_bufflen(cmd));
1174
1175        memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb));
1176        memcpy(srbcmd->cdb, cmd->cmnd, cmd->cmd_len);
1177        /*
1178         *      Build Scatter/Gather list
1179         */
1180        fibsize = sizeof (struct aac_srb) +
1181                (((le32_to_cpu(srbcmd->sg.count) & 0xff) - 1) *
1182                 sizeof (struct sgentry));
1183        BUG_ON (fibsize > (fib->dev->max_fib_size -
1184                                sizeof(struct aac_fibhdr)));
1185
1186        /*
1187         *      Now send the Fib to the adapter
1188         */
1189        return aac_fib_send(ScsiPortCommand, fib, fibsize, FsaNormal, 0, 1,
1190                                  (fib_callback) aac_srb_callback, (void *) cmd);
1191}
1192
1193int aac_get_adapter_info(struct aac_dev* dev)
1194{
1195        struct fib* fibptr;
1196        int rcode;
1197        u32 tmp;
1198        struct aac_adapter_info *info;
1199        struct aac_bus_info *command;
1200        struct aac_bus_info_response *bus_info;
1201
1202        if (!(fibptr = aac_fib_alloc(dev)))
1203                return -ENOMEM;
1204
1205        aac_fib_init(fibptr);
1206        info = (struct aac_adapter_info *) fib_data(fibptr);
1207        memset(info,0,sizeof(*info));
1208
1209        rcode = aac_fib_send(RequestAdapterInfo,
1210                         fibptr, 
1211                         sizeof(*info),
1212                         FsaNormal, 
1213                         -1, 1, /* First `interrupt' command uses special wait */
1214                         NULL, 
1215                         NULL);
1216
1217        if (rcode < 0) {
1218                aac_fib_complete(fibptr);
1219                aac_fib_free(fibptr);
1220                return rcode;
1221        }
1222        memcpy(&dev->adapter_info, info, sizeof(*info));
1223
1224        if (dev->adapter_info.options & AAC_OPT_SUPPLEMENT_ADAPTER_INFO) {
1225                struct aac_supplement_adapter_info * info;
1226
1227                aac_fib_init(fibptr);
1228
1229                info = (struct aac_supplement_adapter_info *) fib_data(fibptr);
1230
1231                memset(info,0,sizeof(*info));
1232
1233                rcode = aac_fib_send(RequestSupplementAdapterInfo,
1234                                 fibptr,
1235                                 sizeof(*info),
1236                                 FsaNormal,
1237                                 1, 1,
1238                                 NULL,
1239                                 NULL);
1240
1241                if (rcode >= 0)
1242                        memcpy(&dev->supplement_adapter_info, info, sizeof(*info));
1243        }
1244
1245
1246        /* 
1247         * GetBusInfo 
1248         */
1249
1250        aac_fib_init(fibptr);
1251
1252        bus_info = (struct aac_bus_info_response *) fib_data(fibptr);
1253
1254        memset(bus_info, 0, sizeof(*bus_info));
1255
1256        command = (struct aac_bus_info *)bus_info;
1257
1258        command->Command = cpu_to_le32(VM_Ioctl);
1259        command->ObjType = cpu_to_le32(FT_DRIVE);
1260        command->MethodId = cpu_to_le32(1);
1261        command->CtlCmd = cpu_to_le32(GetBusInfo);
1262
1263        rcode = aac_fib_send(ContainerCommand,
1264                         fibptr,
1265                         sizeof (*bus_info),
1266                         FsaNormal,
1267                         1, 1,
1268                         NULL, NULL);
1269
1270        if (rcode >= 0 && le32_to_cpu(bus_info->Status) == ST_OK) {
1271                dev->maximum_num_physicals = le32_to_cpu(bus_info->TargetsPerBus);
1272                dev->maximum_num_channels = le32_to_cpu(bus_info->BusCount);
1273        }
1274
1275        if (!dev->in_reset) {
1276                char buffer[16];
1277                tmp = le32_to_cpu(dev->adapter_info.kernelrev);
1278                printk(KERN_INFO "%s%d: kernel %d.%d-%d[%d] %.*s\n",
1279                        dev->name, 
1280                        dev->id,
1281                        tmp>>24,
1282                        (tmp>>16)&0xff,
1283                        tmp&0xff,
1284                        le32_to_cpu(dev->adapter_info.kernelbuild),
1285                        (int)sizeof(dev->supplement_adapter_info.BuildDate),
1286                        dev->supplement_adapter_info.BuildDate);
1287                tmp = le32_to_cpu(dev->adapter_info.monitorrev);
1288                printk(KERN_INFO "%s%d: monitor %d.%d-%d[%d]\n",
1289                        dev->name, dev->id,
1290                        tmp>>24,(tmp>>16)&0xff,tmp&0xff,
1291                        le32_to_cpu(dev->adapter_info.monitorbuild));
1292                tmp = le32_to_cpu(dev->adapter_info.biosrev);
1293                printk(KERN_INFO "%s%d: bios %d.%d-%d[%d]\n",
1294                        dev->name, dev->id,
1295                        tmp>>24,(tmp>>16)&0xff,tmp&0xff,
1296                        le32_to_cpu(dev->adapter_info.biosbuild));
1297                buffer[0] = '\0';
1298                if (aac_show_serial_number(
1299                  shost_to_class(dev->scsi_host_ptr), buffer))
1300                        printk(KERN_INFO "%s%d: serial %s",
1301                          dev->name, dev->id, buffer);
1302                if (dev->supplement_adapter_info.VpdInfo.Tsid[0]) {
1303                        printk(KERN_INFO "%s%d: TSID %.*s\n",
1304                          dev->name, dev->id,
1305                          (int)sizeof(dev->supplement_adapter_info.VpdInfo.Tsid),
1306                          dev->supplement_adapter_info.VpdInfo.Tsid);
1307                }
1308                if (!aac_check_reset ||
1309                  (dev->supplement_adapter_info.SupportedOptions2 &
1310                  le32_to_cpu(AAC_OPTION_IGNORE_RESET))) {
1311                        printk(KERN_INFO "%s%d: Reset Adapter Ignored\n",
1312                          dev->name, dev->id);
1313                }
1314        }
1315
1316        dev->nondasd_support = 0;
1317        dev->raid_scsi_mode = 0;
1318        if(dev->adapter_info.options & AAC_OPT_NONDASD){
1319                dev->nondasd_support = 1;
1320        }
1321
1322        /*
1323         * If the firmware supports ROMB RAID/SCSI mode and we are currently
1324         * in RAID/SCSI mode, set the flag. For now if in this mode we will
1325         * force nondasd support on. If we decide to allow the non-dasd flag
1326         * additional changes changes will have to be made to support
1327         * RAID/SCSI.  the function aac_scsi_cmd in this module will have to be
1328         * changed to support the new dev->raid_scsi_mode flag instead of
1329         * leaching off of the dev->nondasd_support flag. Also in linit.c the
1330         * function aac_detect will have to be modified where it sets up the
1331         * max number of channels based on the aac->nondasd_support flag only.
1332         */
1333        if ((dev->adapter_info.options & AAC_OPT_SCSI_MANAGED) &&
1334            (dev->adapter_info.options & AAC_OPT_RAID_SCSI_MODE)) {
1335                dev->nondasd_support = 1;
1336                dev->raid_scsi_mode = 1;
1337        }
1338        if (dev->raid_scsi_mode != 0)
1339                printk(KERN_INFO "%s%d: ROMB RAID/SCSI mode enabled\n",
1340                                dev->name, dev->id);
1341                
1342        if(nondasd != -1) {  
1343                dev->nondasd_support = (nondasd!=0);
1344        }
1345        if(dev->nondasd_support != 0){
1346                printk(KERN_INFO "%s%d: Non-DASD support enabled.\n",dev->name, dev->id);
1347        }
1348
1349        dev->dac_support = 0;
1350        if( (sizeof(dma_addr_t) > 4) && (dev->adapter_info.options & AAC_OPT_SGMAP_HOST64)){
1351                printk(KERN_INFO "%s%d: 64bit support enabled.\n", dev->name, dev->id);
1352                dev->dac_support = 1;
1353        }
1354
1355        if(dacmode != -1) {
1356                dev->dac_support = (dacmode!=0);
1357        }
1358        if(dev->dac_support != 0) {
1359                if (!pci_set_dma_mask(dev->pdev, DMA_64BIT_MASK) &&
1360                        !pci_set_consistent_dma_mask(dev->pdev, DMA_64BIT_MASK)) {
1361                        printk(KERN_INFO"%s%d: 64 Bit DAC enabled\n",
1362                                dev->name, dev->id);
1363                } else if (!pci_set_dma_mask(dev->pdev, DMA_32BIT_MASK) &&
1364                        !pci_set_consistent_dma_mask(dev->pdev, DMA_32BIT_MASK)) {
1365                        printk(KERN_INFO"%s%d: DMA mask set failed, 64 Bit DAC disabled\n",
1366                                dev->name, dev->id);
1367                        dev->dac_support = 0;
1368                } else {
1369                        printk(KERN_WARNING"%s%d: No suitable DMA available.\n",
1370                                dev->name, dev->id);
1371                        rcode = -ENOMEM;
1372                }
1373        }
1374        /* 
1375         * Deal with configuring for the individualized limits of each packet
1376         * interface.
1377         */
1378        dev->a_ops.adapter_scsi = (dev->dac_support)
1379                                ? aac_scsi_64
1380                                : aac_scsi_32;
1381        if (dev->raw_io_interface) {
1382                dev->a_ops.adapter_bounds = (dev->raw_io_64)
1383                                        ? aac_bounds_64
1384                                        : aac_bounds_32;
1385                dev->a_ops.adapter_read = aac_read_raw_io;
1386                dev->a_ops.adapter_write = aac_write_raw_io;
1387        } else {
1388                dev->a_ops.adapter_bounds = aac_bounds_32;
1389                dev->scsi_host_ptr->sg_tablesize = (dev->max_fib_size -
1390                        sizeof(struct aac_fibhdr) -
1391                        sizeof(struct aac_write) + sizeof(struct sgentry)) /
1392                                sizeof(struct sgentry);
1393                if (dev->dac_support) {
1394                        dev->a_ops.adapter_read = aac_read_block64;
1395                        dev->a_ops.adapter_write = aac_write_block64;
1396                        /* 
1397                         * 38 scatter gather elements 
1398                         */
1399                        dev->scsi_host_ptr->sg_tablesize =
1400                                (dev->max_fib_size -
1401                                sizeof(struct aac_fibhdr) -
1402                                sizeof(struct aac_write64) +
1403                                sizeof(struct sgentry64)) /
1404                                        sizeof(struct sgentry64);
1405                } else {
1406                        dev->a_ops.adapter_read = aac_read_block;
1407                        dev->a_ops.adapter_write = aac_write_block;
1408                }
1409                dev->scsi_host_ptr->max_sectors = AAC_MAX_32BIT_SGBCOUNT;
1410                if(!(dev->adapter_info.options & AAC_OPT_NEW_COMM)) {
1411                        /*
1412                         * Worst case size that could cause sg overflow when
1413                         * we break up SG elements that are larger than 64KB.
1414                         * Would be nice if we could tell the SCSI layer what
1415                         * the maximum SG element size can be. Worst case is
1416                         * (sg_tablesize-1) 4KB elements with one 64KB
1417                         * element.
1418                         *      32bit -> 468 or 238KB   64bit -> 424 or 212KB
1419                         */
1420                        dev->scsi_host_ptr->max_sectors =
1421                          (dev->scsi_host_ptr->sg_tablesize * 8) + 112;
1422                }
1423        }
1424
1425        aac_fib_complete(fibptr);
1426        aac_fib_free(fibptr);
1427
1428        return rcode;
1429}
1430
1431
1432static void io_callback(void *context, struct fib * fibptr)
1433{
1434        struct aac_dev *dev;
1435        struct aac_read_reply *readreply;
1436        struct scsi_cmnd *scsicmd;
1437        u32 cid;
1438
1439        scsicmd = (struct scsi_cmnd *) context;
1440
1441        if (!aac_valid_context(scsicmd, fibptr))
1442                return;
1443
1444        dev = fibptr->dev;
1445        cid = scmd_id(scsicmd);
1446
1447        if (nblank(dprintk(x))) {
1448                u64 lba;
1449                switch (scsicmd->cmnd[0]) {
1450                case WRITE_6:
1451                case READ_6:
1452                        lba = ((scsicmd->cmnd[1] & 0x1F) << 16) |
1453                            (scsicmd->cmnd[2] << 8) | scsicmd->cmnd[3];
1454                        break;
1455                case WRITE_16:
1456                case READ_16:
1457                        lba = ((u64)scsicmd->cmnd[2] << 56) |
1458                              ((u64)scsicmd->cmnd[3] << 48) |
1459                              ((u64)scsicmd->cmnd[4] << 40) |
1460                              ((u64)scsicmd->cmnd[5] << 32) |
1461                              ((u64)scsicmd->cmnd[6] << 24) |
1462                              (scsicmd->cmnd[7] << 16) |
1463                              (scsicmd->cmnd[8] << 8) | scsicmd->cmnd[9];
1464                        break;
1465                case WRITE_12:
1466                case READ_12:
1467                        lba = ((u64)scsicmd->cmnd[2] << 24) |
1468                              (scsicmd->cmnd[3] << 16) |
1469                              (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5];
1470                        break;
1471                default:
1472                        lba = ((u64)scsicmd->cmnd[2] << 24) |
1473                               (scsicmd->cmnd[3] << 16) |
1474                               (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5];
1475                        break;
1476                }
1477                printk(KERN_DEBUG
1478                  "io_callback[cpu %d]: lba = %llu, t = %ld.\n",
1479                  smp_processor_id(), (unsigned long long)lba, jiffies);
1480        }
1481
1482        BUG_ON(fibptr == NULL);
1483
1484        scsi_dma_unmap(scsicmd);
1485
1486        readreply = (struct aac_read_reply *)fib_data(fibptr);
1487        if (le32_to_cpu(readreply->status) == ST_OK)
1488                scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
1489        else {
1490#ifdef AAC_DETAILED_STATUS_INFO
1491                printk(KERN_WARNING "io_callback: io failed, status = %d\n",
1492                  le32_to_cpu(readreply->status));
1493#endif
1494                scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
1495                set_sense((u8 *) &dev->fsa_dev[cid].sense_data,
1496                                    HARDWARE_ERROR,
1497                                    SENCODE_INTERNAL_TARGET_FAILURE,
1498                                    ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0,
1499                                    0, 0);
1500                memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
1501                  (sizeof(dev->fsa_dev[cid].sense_data) > sizeof(scsicmd->sense_buffer))
1502                    ? sizeof(scsicmd->sense_buffer)
1503                    : sizeof(dev->fsa_dev[cid].sense_data));
1504        }
1505        aac_fib_complete(fibptr);
1506        aac_fib_free(fibptr);
1507
1508        scsicmd->scsi_done(scsicmd);
1509}
1510
1511static int aac_read(struct scsi_cmnd * scsicmd)
1512{
1513        u64 lba;
1514        u32 count;
1515        int status;
1516        struct aac_dev *dev;
1517        struct fib * cmd_fibcontext;
1518
1519        dev = (struct aac_dev *)scsicmd->device->host->hostdata;
1520        /*
1521         *      Get block address and transfer length
1522         */
1523        switch (scsicmd->cmnd[0]) {
1524        case READ_6:
1525                dprintk((KERN_DEBUG "aachba: received a read(6) command on id %d.\n", scmd_id(scsicmd)));
1526
1527                lba = ((scsicmd->cmnd[1] & 0x1F) << 16) | 
1528                        (scsicmd->cmnd[2] << 8) | scsicmd->cmnd[3];
1529                count = scsicmd->cmnd[4];
1530
1531                if (count == 0)
1532                        count = 256;
1533                break;
1534        case READ_16:
1535                dprintk((KERN_DEBUG "aachba: received a read(16) command on id %d.\n", scmd_id(scsicmd)));
1536
1537                lba =   ((u64)scsicmd->cmnd[2] << 56) |
1538                        ((u64)scsicmd->cmnd[3] << 48) |
1539                        ((u64)scsicmd->cmnd[4] << 40) |
1540                        ((u64)scsicmd->cmnd[5] << 32) |
1541                        ((u64)scsicmd->cmnd[6] << 24) | 
1542                        (scsicmd->cmnd[7] << 16) |
1543                        (scsicmd->cmnd[8] << 8) | scsicmd->cmnd[9];
1544                count = (scsicmd->cmnd[10] << 24) | 
1545                        (scsicmd->cmnd[11] << 16) |
1546                        (scsicmd->cmnd[12] << 8) | scsicmd->cmnd[13];
1547                break;
1548        case READ_12:
1549                dprintk((KERN_DEBUG "aachba: received a read(12) command on id %d.\n", scmd_id(scsicmd)));
1550
1551                lba = ((u64)scsicmd->cmnd[2] << 24) | 
1552                        (scsicmd->cmnd[3] << 16) |
1553                        (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5];
1554                count = (scsicmd->cmnd[6] << 24) | 
1555                        (scsicmd->cmnd[7] << 16) |
1556                        (scsicmd->cmnd[8] << 8) | scsicmd->cmnd[9];
1557                break;
1558        default:
1559                dprintk((KERN_DEBUG "aachba: received a read(10) command on id %d.\n", scmd_id(scsicmd)));
1560
1561                lba = ((u64)scsicmd->cmnd[2] << 24) | 
1562                        (scsicmd->cmnd[3] << 16) | 
1563                        (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5];
1564                count = (scsicmd->cmnd[7] << 8) | scsicmd->cmnd[8];
1565                break;
1566        }
1567        dprintk((KERN_DEBUG "aac_read[cpu %d]: lba = %llu, t = %ld.\n",
1568          smp_processor_id(), (unsigned long long)lba, jiffies));
1569        if (aac_adapter_bounds(dev,scsicmd,lba))
1570                return 0;
1571        /*
1572         *      Alocate and initialize a Fib
1573         */
1574        if (!(cmd_fibcontext = aac_fib_alloc(dev))) {
1575                return -1;
1576        }
1577
1578        status = aac_adapter_read(cmd_fibcontext, scsicmd, lba, count);
1579
1580        /*
1581         *      Check that the command queued to the controller
1582         */
1583        if (status == -EINPROGRESS) {
1584                scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
1585                return 0;
1586        }
1587                
1588        printk(KERN_WARNING "aac_read: aac_fib_send failed with status: %d.\n", status);
1589        /*
1590         *      For some reason, the Fib didn't queue, return QUEUE_FULL
1591         */
1592        scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_TASK_SET_FULL;
1593        scsicmd->scsi_done(scsicmd);
1594        aac_fib_complete(cmd_fibcontext);
1595        aac_fib_free(cmd_fibcontext);
1596        return 0;
1597}
1598
1599static int aac_write(struct scsi_cmnd * scsicmd)
1600{
1601        u64 lba;
1602        u32 count;
1603        int fua;
1604        int status;
1605        struct aac_dev *dev;
1606        struct fib * cmd_fibcontext;
1607
1608        dev = (struct aac_dev *)scsicmd->device->host->hostdata;
1609        /*
1610         *      Get block address and transfer length
1611         */
1612        if (scsicmd->cmnd[0] == WRITE_6)        /* 6 byte command */
1613        {
1614                lba = ((scsicmd->cmnd[1] & 0x1F) << 16) | (scsicmd->cmnd[2] << 8) | scsicmd->cmnd[3];
1615                count = scsicmd->cmnd[4];
1616                if (count == 0)
1617                        count = 256;
1618                fua = 0;
1619        } else if (scsicmd->cmnd[0] == WRITE_16) { /* 16 byte command */
1620                dprintk((KERN_DEBUG "aachba: received a write(16) command on id %d.\n", scmd_id(scsicmd)));
1621
1622                lba =   ((u64)scsicmd->cmnd[2] << 56) |
1623                        ((u64)scsicmd->cmnd[3] << 48) |
1624                        ((u64)scsicmd->cmnd[4] << 40) |
1625                        ((u64)scsicmd->cmnd[5] << 32) |
1626                        ((u64)scsicmd->cmnd[6] << 24) | 
1627                        (scsicmd->cmnd[7] << 16) |
1628                        (scsicmd->cmnd[8] << 8) | scsicmd->cmnd[9];
1629                count = (scsicmd->cmnd[10] << 24) | (scsicmd->cmnd[11] << 16) |
1630                        (scsicmd->cmnd[12] << 8) | scsicmd->cmnd[13];
1631                fua = scsicmd->cmnd[1] & 0x8;
1632        } else if (scsicmd->cmnd[0] == WRITE_12) { /* 12 byte command */
1633                dprintk((KERN_DEBUG "aachba: received a write(12) command on id %d.\n", scmd_id(scsicmd)));
1634
1635                lba = ((u64)scsicmd->cmnd[2] << 24) | (scsicmd->cmnd[3] << 16)
1636                    | (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5];
1637                count = (scsicmd->cmnd[6] << 24) | (scsicmd->cmnd[7] << 16)
1638                      | (scsicmd->cmnd[8] << 8) | scsicmd->cmnd[9];
1639                fua = scsicmd->cmnd[1] & 0x8;
1640        } else {
1641                dprintk((KERN_DEBUG "aachba: received a write(10) command on id %d.\n", scmd_id(scsicmd)));
1642                lba = ((u64)scsicmd->cmnd[2] << 24) | (scsicmd->cmnd[3] << 16) | (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5];
1643                count = (scsicmd->cmnd[7] << 8) | scsicmd->cmnd[8];
1644                fua = scsicmd->cmnd[1] & 0x8;
1645        }
1646        dprintk((KERN_DEBUG "aac_write[cpu %d]: lba = %llu, t = %ld.\n",
1647          smp_processor_id(), (unsigned long long)lba, jiffies));
1648        if (aac_adapter_bounds(dev,scsicmd,lba))
1649                return 0;
1650        /*
1651         *      Allocate and initialize a Fib then setup a BlockWrite command
1652         */
1653        if (!(cmd_fibcontext = aac_fib_alloc(dev))) {
1654                scsicmd->result = DID_ERROR << 16;
1655                scsicmd->scsi_done(scsicmd);
1656                return 0;
1657        }
1658
1659        status = aac_adapter_write(cmd_fibcontext, scsicmd, lba, count, fua);
1660
1661        /*
1662         *      Check that the command queued to the controller
1663         */
1664        if (status == -EINPROGRESS) {
1665                scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
1666                return 0;
1667        }
1668
1669        printk(KERN_WARNING "aac_write: aac_fib_send failed with status: %d\n", status);
1670        /*
1671         *      For some reason, the Fib didn't queue, return QUEUE_FULL
1672         */
1673        scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_TASK_SET_FULL;
1674        scsicmd->scsi_done(scsicmd);
1675
1676        aac_fib_complete(cmd_fibcontext);
1677        aac_fib_free(cmd_fibcontext);
1678        return 0;
1679}
1680
1681static void synchronize_callback(void *context, struct fib *fibptr)
1682{
1683        struct aac_synchronize_reply *synchronizereply;
1684        struct scsi_cmnd *cmd;
1685
1686        cmd = context;
1687
1688        if (!aac_valid_context(cmd, fibptr))
1689                return;
1690
1691        dprintk((KERN_DEBUG "synchronize_callback[cpu %d]: t = %ld.\n",
1692                                smp_processor_id(), jiffies));
1693        BUG_ON(fibptr == NULL);
1694
1695
1696        synchronizereply = fib_data(fibptr);
1697        if (le32_to_cpu(synchronizereply->status) == CT_OK)
1698                cmd->result = DID_OK << 16 |
1699                        COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
1700        else {
1701                struct scsi_device *sdev = cmd->device;
1702                struct aac_dev *dev = fibptr->dev;
1703                u32 cid = sdev_id(sdev);
1704                printk(KERN_WARNING
1705                     "synchronize_callback: synchronize failed, status = %d\n",
1706                     le32_to_cpu(synchronizereply->status));
1707                cmd->result = DID_OK << 16 |
1708                        COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
1709                set_sense((u8 *)&dev->fsa_dev[cid].sense_data,
1710                                    HARDWARE_ERROR,
1711                                    SENCODE_INTERNAL_TARGET_FAILURE,
1712                                    ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0,
1713                                    0, 0);
1714                memcpy(cmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
1715                  min(sizeof(dev->fsa_dev[cid].sense_data),
1716                          sizeof(cmd->sense_buffer)));
1717        }
1718
1719        aac_fib_complete(fibptr);
1720        aac_fib_free(fibptr);
1721        cmd->scsi_done(cmd);
1722}
1723
1724static int aac_synchronize(struct scsi_cmnd *scsicmd)
1725{
1726        int status;
1727        struct fib *cmd_fibcontext;
1728        struct aac_synchronize *synchronizecmd;
1729        struct scsi_cmnd *cmd;
1730        struct scsi_device *sdev = scsicmd->device;
1731        int active = 0;
1732        struct aac_dev *aac;
1733        u64 lba = ((u64)scsicmd->cmnd[2] << 24) | (scsicmd->cmnd[3] << 16) |
1734                (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5];
1735        u32 count = (scsicmd->cmnd[7] << 8) | scsicmd->cmnd[8];
1736        unsigned long flags;
1737
1738        /*
1739         * Wait for all outstanding queued commands to complete to this
1740         * specific target (block).
1741         */
1742        spin_lock_irqsave(&sdev->list_lock, flags);
1743        list_for_each_entry(cmd, &sdev->cmd_list, list)
1744                if (cmd->SCp.phase == AAC_OWNER_FIRMWARE) {
1745                        u64 cmnd_lba;
1746                        u32 cmnd_count;
1747
1748                        if (cmd->cmnd[0] == WRITE_6) {
1749                                cmnd_lba = ((cmd->cmnd[1] & 0x1F) << 16) |
1750                                        (cmd->cmnd[2] << 8) |
1751                                        cmd->cmnd[3];
1752                                cmnd_count = cmd->cmnd[4];
1753                                if (cmnd_count == 0)
1754                                        cmnd_count = 256;
1755                        } else if (cmd->cmnd[0] == WRITE_16) {
1756                                cmnd_lba = ((u64)cmd->cmnd[2] << 56) |
1757                                        ((u64)cmd->cmnd[3] << 48) |
1758                                        ((u64)cmd->cmnd[4] << 40) |
1759                                        ((u64)cmd->cmnd[5] << 32) |
1760                                        ((u64)cmd->cmnd[6] << 24) |
1761                                        (cmd->cmnd[7] << 16) |
1762                                        (cmd->cmnd[8] << 8) |
1763                                        cmd->cmnd[9];
1764                                cmnd_count = (cmd->cmnd[10] << 24) |
1765                                        (cmd->cmnd[11] << 16) |
1766                                        (cmd->cmnd[12] << 8) |
1767                                        cmd->cmnd[13];
1768                        } else if (cmd->cmnd[0] == WRITE_12) {
1769                                cmnd_lba = ((u64)cmd->cmnd[2] << 24) |
1770                                        (cmd->cmnd[3] << 16) |
1771                                        (cmd->cmnd[4] << 8) |
1772                                        cmd->cmnd[5];
1773                                cmnd_count = (cmd->cmnd[6] << 24) |
1774                                        (cmd->cmnd[7] << 16) |
1775                                        (cmd->cmnd[8] << 8) |
1776                                        cmd->cmnd[9];
1777                        } else if (cmd->cmnd[0] == WRITE_10) {
1778                                cmnd_lba = ((u64)cmd->cmnd[2] << 24) |
1779                                        (cmd->cmnd[3] << 16) |
1780                                        (cmd->cmnd[4] << 8) |
1781                                        cmd->cmnd[5];
1782                                cmnd_count = (cmd->cmnd[7] << 8) |
1783                                        cmd->cmnd[8];
1784                        } else
1785                                continue;
1786                        if (((cmnd_lba + cmnd_count) < lba) ||
1787                          (count && ((lba + count) < cmnd_lba)))
1788                                continue;
1789                        ++active;
1790                        break;
1791                }
1792
1793        spin_unlock_irqrestore(&sdev->list_lock, flags);
1794
1795        /*
1796         *      Yield the processor (requeue for later)
1797         */
1798        if (active)
1799                return SCSI_MLQUEUE_DEVICE_BUSY;
1800
1801        aac = (struct aac_dev *)scsicmd->device->host->hostdata;
1802        if (aac->in_reset)
1803                return SCSI_MLQUEUE_HOST_BUSY;
1804
1805        /*
1806         *      Allocate and initialize a Fib
1807         */
1808        if (!(cmd_fibcontext = aac_fib_alloc(aac)))
1809                return SCSI_MLQUEUE_HOST_BUSY;
1810
1811        aac_fib_init(cmd_fibcontext);
1812
1813        synchronizecmd = fib_data(cmd_fibcontext);
1814        synchronizecmd->command = cpu_to_le32(VM_ContainerConfig);
1815        synchronizecmd->type = cpu_to_le32(CT_FLUSH_CACHE);
1816        synchronizecmd->cid = cpu_to_le32(scmd_id(scsicmd));
1817        synchronizecmd->count =
1818             cpu_to_le32(sizeof(((struct aac_synchronize_reply *)NULL)->data));
1819
1820        /*
1821         *      Now send the Fib to the adapter
1822         */
1823        status = aac_fib_send(ContainerCommand,
1824                  cmd_fibcontext,
1825                  sizeof(struct aac_synchronize),
1826                  FsaNormal,
1827                  0, 1,
1828                  (fib_callback)synchronize_callback,
1829                  (void *)scsicmd);
1830
1831        /*
1832         *      Check that the command queued to the controller
1833         */
1834        if (status == -EINPROGRESS) {
1835                scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
1836                return 0;
1837        }
1838
1839        printk(KERN_WARNING
1840                "aac_synchronize: aac_fib_send failed with status: %d.\n", status);
1841        aac_fib_complete(cmd_fibcontext);
1842        aac_fib_free(cmd_fibcontext);
1843        return SCSI_MLQUEUE_HOST_BUSY;
1844}
1845
1846/**
1847 *      aac_scsi_cmd()          -       Process SCSI command
1848 *      @scsicmd:               SCSI command block
1849 *
1850 *      Emulate a SCSI command and queue the required request for the
1851 *      aacraid firmware.
1852 */
1853 
1854int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
1855{
1856        u32 cid;
1857        struct Scsi_Host *host = scsicmd->device->host;
1858        struct aac_dev *dev = (struct aac_dev *)host->hostdata;
1859        struct fsa_dev_info *fsa_dev_ptr = dev->fsa_dev;
1860        
1861        if (fsa_dev_ptr == NULL)
1862                return -1;
1863        /*
1864         *      If the bus, id or lun is out of range, return fail
1865         *      Test does not apply to ID 16, the pseudo id for the controller
1866         *      itself.
1867         */
1868        cid = scmd_id(scsicmd);
1869        if (cid != host->this_id) {
1870                if (scmd_channel(scsicmd) == CONTAINER_CHANNEL) {
1871                        if((cid >= dev->maximum_num_containers) ||
1872                                        (scsicmd->device->lun != 0)) {
1873                                scsicmd->result = DID_NO_CONNECT << 16;
1874                                scsicmd->scsi_done(scsicmd);
1875                                return 0;
1876                        }
1877
1878                        /*
1879                         *      If the target container doesn't exist, it may have
1880                         *      been newly created
1881                         */
1882                        if ((fsa_dev_ptr[cid].valid & 1) == 0) {
1883                                switch (scsicmd->cmnd[0]) {
1884                                case SERVICE_ACTION_IN:
1885                                        if (!(dev->raw_io_interface) ||
1886                                            !(dev->raw_io_64) ||
1887                                            ((scsicmd->cmnd[1] & 0x1f) != SAI_READ_CAPACITY_16))
1888                                                break;
1889                                case INQUIRY:
1890                                case READ_CAPACITY:
1891                                case TEST_UNIT_READY:
1892                                        if (dev->in_reset)
1893                                                return -1;
1894                                        return _aac_probe_container(scsicmd,
1895                                                        aac_probe_container_callback2);
1896                                default:
1897                                        break;
1898                                }
1899                        }
1900                } else {  /* check for physical non-dasd devices */
1901                        if ((dev->nondasd_support == 1) || expose_physicals) {
1902                                if (dev->in_reset)
1903                                        return -1;
1904                                return aac_send_srb_fib(scsicmd);
1905                        } else {
1906                                scsicmd->result = DID_NO_CONNECT << 16;
1907                                scsicmd->scsi_done(scsicmd);
1908                                return 0;
1909                        }
1910                }
1911        }
1912        /*
1913         * else Command for the controller itself
1914         */
1915        else if ((scsicmd->cmnd[0] != INQUIRY) &&       /* only INQUIRY & TUR cmnd supported for controller */
1916                (scsicmd->cmnd[0] != TEST_UNIT_READY)) 
1917        {
1918                dprintk((KERN_WARNING "Only INQUIRY & TUR command supported for controller, rcvd = 0x%x.\n", scsicmd->cmnd[0]));
1919                scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
1920                set_sense((u8 *) &dev->fsa_dev[cid].sense_data,
1921                            ILLEGAL_REQUEST,
1922                            SENCODE_INVALID_COMMAND,
1923                            ASENCODE_INVALID_COMMAND, 0, 0, 0, 0);
1924                memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
1925                  (sizeof(dev->fsa_dev[cid].sense_data) > sizeof(scsicmd->sense_buffer))
1926                    ? sizeof(scsicmd->sense_buffer)
1927                    : sizeof(dev->fsa_dev[cid].sense_data));
1928                scsicmd->scsi_done(scsicmd);
1929                return 0;
1930        }
1931
1932
1933        /* Handle commands here that don't really require going out to the adapter */
1934        switch (scsicmd->cmnd[0]) {
1935        case INQUIRY:
1936        {
1937                struct inquiry_data inq_data;
1938
1939                dprintk((KERN_DEBUG "INQUIRY command, ID: %d.\n", cid));
1940                memset(&inq_data, 0, sizeof (struct inquiry_data));
1941
1942                if (scsicmd->cmnd[1] & 0x1 ) {
1943                        char *arr = (char *)&inq_data;
1944
1945                        /* EVPD bit set */
1946                        arr[0] = (scmd_id(scsicmd) == host->this_id) ?
1947                          INQD_PDT_PROC : INQD_PDT_DA;
1948                        if (scsicmd->cmnd[2] == 0) {
1949                                /* supported vital product data pages */
1950                                arr[3] = 2;
1951                                arr[4] = 0x0;
1952                                arr[5] = 0x80;
1953                                arr[1] = scsicmd->cmnd[2];
1954                                aac_internal_transfer(scsicmd, &inq_data, 0,
1955                                  sizeof(inq_data));
1956                                scsicmd->result = DID_OK << 16 |
1957                                  COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
1958                        } else if (scsicmd->cmnd[2] == 0x80) {
1959                                /* unit serial number page */
1960                                arr[3] = setinqserial(dev, &arr[4],
1961                                  scmd_id(scsicmd));
1962                                arr[1] = scsicmd->cmnd[2];
1963                                aac_internal_transfer(scsicmd, &inq_data, 0,
1964                                  sizeof(inq_data));
1965                                return aac_get_container_serial(scsicmd);
1966                        } else {
1967                                /* vpd page not implemented */
1968                                scsicmd->result = DID_OK << 16 |
1969                                  COMMAND_COMPLETE << 8 |
1970                                  SAM_STAT_CHECK_CONDITION;
1971                                set_sense((u8 *) &dev->fsa_dev[cid].sense_data,
1972                                  ILLEGAL_REQUEST,
1973                                  SENCODE_INVALID_CDB_FIELD,
1974                                  ASENCODE_NO_SENSE, 0, 7, 2, 0);
1975                                memcpy(scsicmd->sense_buffer,
1976                                  &dev->fsa_dev[cid].sense_data,
1977                                  (sizeof(dev->fsa_dev[cid].sense_data) >
1978                                    sizeof(scsicmd->sense_buffer))
1979                                       ? sizeof(scsicmd->sense_buffer)
1980                                       : sizeof(dev->fsa_dev[cid].sense_data));
1981                        }
1982                        scsicmd->scsi_done(scsicmd);
1983                        return 0;
1984                }
1985                inq_data.inqd_ver = 2;  /* claim compliance to SCSI-2 */
1986                inq_data.inqd_rdf = 2;  /* A response data format value of two indicates that the data shall be in the format specified in SCSI-2 */
1987                inq_data.inqd_len = 31;
1988                /*Format for "pad2" is  RelAdr | WBus32 | WBus16 |  Sync  | Linked |Reserved| CmdQue | SftRe */
1989                inq_data.inqd_pad2= 0x32 ;       /*WBus16|Sync|CmdQue */
1990                /*
1991                 *      Set the Vendor, Product, and Revision Level
1992                 *      see: <vendor>.c i.e. aac.c
1993                 */
1994                if (cid == host->this_id) {
1995                        setinqstr(dev, (void *) (inq_data.inqd_vid), ARRAY_SIZE(container_types));
1996                        inq_data.inqd_pdt = INQD_PDT_PROC;      /* Processor device */
1997                        aac_internal_transfer(scsicmd, &inq_data, 0, sizeof(inq_data));
1998                        scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
1999                        scsicmd->scsi_done(scsicmd);
2000                        return 0;
2001                }
2002                if (dev->in_reset)
2003                        return -1;
2004                setinqstr(dev, (void *) (inq_data.inqd_vid), fsa_dev_ptr[cid].type);
2005                inq_data.inqd_pdt = INQD_PDT_DA;        /* Direct/random access device */
2006                aac_internal_transfer(scsicmd, &inq_data, 0, sizeof(inq_data));
2007                return aac_get_container_name(scsicmd);
2008        }
2009        case SERVICE_ACTION_IN:
2010                if (!(dev->raw_io_interface) ||
2011                    !(dev->raw_io_64) ||
2012                    ((scsicmd->cmnd[1] & 0x1f) != SAI_READ_CAPACITY_16))
2013                        break;
2014        {
2015                u64 capacity;
2016                char cp[13];
2017
2018                dprintk((KERN_DEBUG "READ CAPACITY_16 command.\n"));
2019                capacity = fsa_dev_ptr[cid].size - 1;
2020                cp[0] = (capacity >> 56) & 0xff;
2021                cp[1] = (capacity >> 48) & 0xff;
2022                cp[2] = (capacity >> 40) & 0xff;
2023                cp[3] = (capacity >> 32) & 0xff;
2024                cp[4] = (capacity >> 24) & 0xff;
2025                cp[5] = (capacity >> 16) & 0xff;
2026                cp[6] = (capacity >> 8) & 0xff;
2027                cp[7] = (capacity >> 0) & 0xff;
2028                cp[8] = 0;
2029                cp[9] = 0;
2030                cp[10] = 2;
2031                cp[11] = 0;
2032                cp[12] = 0;
2033                aac_internal_transfer(scsicmd, cp, 0,
2034                  min_t(size_t, scsicmd->cmnd[13], sizeof(cp)));
2035                if (sizeof(cp) < scsicmd->cmnd[13]) {
2036                        unsigned int len, offset = sizeof(cp);
2037
2038                        memset(cp, 0, offset);
2039                        do {
2040                                len = min_t(size_t, scsicmd->cmnd[13] - offset,
2041                                                sizeof(cp));
2042                                aac_internal_transfer(scsicmd, cp, offset, len);
2043                        } while ((offset += len) < scsicmd->cmnd[13]);
2044                }
2045
2046                /* Do not cache partition table for arrays */
2047                scsicmd->device->removable = 1;
2048
2049                scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
2050                scsicmd->scsi_done(scsicmd);
2051
2052                return 0;
2053        }
2054
2055        case READ_CAPACITY:
2056        {
2057                u32 capacity;
2058                char cp[8];
2059
2060                dprintk((KERN_DEBUG "READ CAPACITY command.\n"));
2061                if (fsa_dev_ptr[cid].size <= 0x100000000ULL)
2062                        capacity = fsa_dev_ptr[cid].size - 1;
2063                else
2064                        capacity = (u32)-1;
2065
2066                cp[0] = (capacity >> 24) & 0xff;
2067                cp[1] = (capacity >> 16) & 0xff;
2068                cp[2] = (capacity >> 8) & 0xff;
2069                cp[3] = (capacity >> 0) & 0xff;
2070                cp[4] = 0;
2071                cp[5] = 0;
2072                cp[6] = 2;
2073                cp[7] = 0;
2074                aac_internal_transfer(scsicmd, cp, 0, sizeof(cp));
2075                /* Do not cache partition table for arrays */
2076                scsicmd->device->removable = 1;
2077
2078                scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
2079                scsicmd->scsi_done(scsicmd);
2080
2081                return 0;
2082        }
2083
2084        case MODE_SENSE:
2085        {
2086                char mode_buf[7];
2087                int mode_buf_length = 4;
2088
2089                dprintk((KERN_DEBUG "MODE SENSE command.\n"));
2090                mode_buf[0] = 3;        /* Mode data length */
2091                mode_buf[1] = 0;        /* Medium type - default */
2092                mode_buf[2] = 0;        /* Device-specific param,
2093                                           bit 8: 0/1 = write enabled/protected
2094                                           bit 4: 0/1 = FUA enabled */
2095                if (dev->raw_io_interface)
2096                        mode_buf[2] = 0x10;
2097                mode_buf[3] = 0;        /* Block descriptor length */
2098                if (((scsicmd->cmnd[2] & 0x3f) == 8) ||
2099                  ((scsicmd->cmnd[2] & 0x3f) == 0x3f)) {
2100                        mode_buf[0] = 6;
2101                        mode_buf[4] = 8;
2102                        mode_buf[5] = 1;
2103                        mode_buf[6] = 0x04; /* WCE */
2104                        mode_buf_length = 7;
2105                        if (mode_buf_length > scsicmd->cmnd[4])
2106                                mode_buf_length = scsicmd->cmnd[4];
2107                }
2108                aac_internal_transfer(scsicmd, mode_buf, 0, mode_buf_length);
2109                scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
2110                scsicmd->scsi_done(scsicmd);
2111
2112                return 0;
2113        }
2114        case MODE_SENSE_10:
2115        {
2116                char mode_buf[11];
2117                int mode_buf_length = 8;
2118
2119                dprintk((KERN_DEBUG "MODE SENSE 10 byte command.\n"));
2120                mode_buf[0] = 0;        /* Mode data length (MSB) */
2121                mode_buf[1] = 6;        /* Mode data length (LSB) */
2122                mode_buf[2] = 0;        /* Medium type - default */
2123                mode_buf[3] = 0;        /* Device-specific param,
2124                                           bit 8: 0/1 = write enabled/protected
2125                                           bit 4: 0/1 = FUA enabled */
2126                if (dev->raw_io_interface)
2127                        mode_buf[3] = 0x10;
2128                mode_buf[4] = 0;        /* reserved */
2129                mode_buf[5] = 0;        /* reserved */
2130                mode_buf[6] = 0;        /* Block descriptor length (MSB) */
2131                mode_buf[7] = 0;        /* Block descriptor length (LSB) */
2132                if (((scsicmd->cmnd[2] & 0x3f) == 8) ||
2133                  ((scsicmd->cmnd[2] & 0x3f) == 0x3f)) {
2134                        mode_buf[1] = 9;
2135                        mode_buf[8] = 8;
2136                        mode_buf[9] = 1;
2137                        mode_buf[10] = 0x04; /* WCE */
2138                        mode_buf_length = 11;
2139                        if (mode_buf_length > scsicmd->cmnd[8])
2140                                mode_buf_length = scsicmd->cmnd[8];
2141                }
2142                aac_internal_transfer(scsicmd, mode_buf, 0, mode_buf_length);
2143
2144                scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
2145                scsicmd->scsi_done(scsicmd);
2146
2147                return 0;
2148        }
2149        case REQUEST_SENSE:
2150                dprintk((KERN_DEBUG "REQUEST SENSE command.\n"));
2151                memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data, sizeof (struct sense_data));
2152                memset(&dev->fsa_dev[cid].sense_data, 0, sizeof (struct sense_data));
2153                scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
2154                scsicmd->scsi_done(scsicmd);
2155                return 0;
2156
2157        case ALLOW_MEDIUM_REMOVAL:
2158                dprintk((KERN_DEBUG "LOCK command.\n"));
2159                if (scsicmd->cmnd[4])
2160                        fsa_dev_ptr[cid].locked = 1;
2161                else
2162                        fsa_dev_ptr[cid].locked = 0;
2163
2164                scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
2165                scsicmd->scsi_done(scsicmd);
2166                return 0;
2167        /*
2168         *      These commands are all No-Ops
2169         */
2170        case TEST_UNIT_READY:
2171        case RESERVE:
2172        case RELEASE:
2173        case REZERO_UNIT:
2174        case REASSIGN_BLOCKS:
2175        case SEEK_10:
2176        case START_STOP:
2177                scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
2178                scsicmd->scsi_done(scsicmd);
2179                return 0;
2180        }
2181
2182        switch (scsicmd->cmnd[0]) 
2183        {
2184                case READ_6:
2185                case READ_10:
2186                case READ_12:
2187                case READ_16:
2188                        if (dev->in_reset)
2189                                return -1;
2190                        /*
2191                         *      Hack to keep track of ordinal number of the device that
2192                         *      corresponds to a container. Needed to convert
2193                         *      containers to /dev/sd device names
2194                         */
2195                         
2196                        if (scsicmd->request->rq_disk)
2197                                strlcpy(fsa_dev_ptr[cid].devname,
2198                                scsicmd->request->rq_disk->disk_name,
2199                                min(sizeof(fsa_dev_ptr[cid].devname),
2200                                sizeof(scsicmd->request->rq_disk->disk_name) + 1));
2201
2202                        return aac_read(scsicmd);
2203
2204                case WRITE_6:
2205                case WRITE_10:
2206                case WRITE_12:
2207                case WRITE_16:
2208                        if (dev->in_reset)
2209                                return -1;
2210                        return aac_write(scsicmd);
2211
2212                case SYNCHRONIZE_CACHE:
2213                        /* Issue FIB to tell Firmware to flush it's cache */
2214                        return aac_synchronize(scsicmd);
2215                        
2216                default:
2217                        /*
2218                         *      Unhandled commands
2219                         */
2220                        dprintk((KERN_WARNING "Unhandled SCSI Command: 0x%x.\n", scsicmd->cmnd[0]));
2221                        scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
2222                        set_sense((u8 *) &dev->fsa_dev[cid].sense_data,
2223                                ILLEGAL_REQUEST, SENCODE_INVALID_COMMAND,
2224                                ASENCODE_INVALID_COMMAND, 0, 0, 0, 0);
2225                        memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
2226                          (sizeof(dev->fsa_dev[cid].sense_data) > sizeof(scsicmd->sense_buffer))
2227                            ? sizeof(scsicmd->sense_buffer)
2228                            : sizeof(dev->fsa_dev[cid].sense_data));
2229                        scsicmd->scsi_done(scsicmd);
2230                        return 0;
2231        }
2232}
2233
2234static int query_disk(struct aac_dev *dev, void __user *arg)
2235{
2236        struct aac_query_disk qd;
2237        struct fsa_dev_info *fsa_dev_ptr;
2238
2239        fsa_dev_ptr = dev->fsa_dev;
2240        if (!fsa_dev_ptr)
2241                return -EBUSY;
2242        if (copy_from_user(&qd, arg, sizeof (struct aac_query_disk)))
2243                return -EFAULT;
2244        if (qd.cnum == -1)
2245                qd.cnum = qd.id;
2246        else if ((qd.bus == -1) && (qd.id == -1) && (qd.lun == -1)) 
2247        {
2248                if (qd.cnum < 0 || qd.cnum >= dev->maximum_num_containers)
2249                        return -EINVAL;
2250                qd.instance = dev->scsi_host_ptr->host_no;
2251                qd.bus = 0;
2252                qd.id = CONTAINER_TO_ID(qd.cnum);
2253                qd.lun = CONTAINER_TO_LUN(qd.cnum);
2254        }
2255        else return -EINVAL;
2256
2257        qd.valid = fsa_dev_ptr[qd.cnum].valid != 0;
2258        qd.locked = fsa_dev_ptr[qd.cnum].locked;
2259        qd.deleted = fsa_dev_ptr[qd.cnum].deleted;
2260
2261        if (fsa_dev_ptr[qd.cnum].devname[0] == '\0')
2262                qd.unmapped = 1;
2263        else
2264                qd.unmapped = 0;
2265
2266        strlcpy(qd.name, fsa_dev_ptr[qd.cnum].devname,
2267          min(sizeof(qd.name), sizeof(fsa_dev_ptr[qd.cnum].devname) + 1));
2268
2269        if (copy_to_user(arg, &qd, sizeof (struct aac_query_disk)))
2270                return -EFAULT;
2271        return 0;
2272}
2273
2274static int force_delete_disk(struct aac_dev *dev, void __user *arg)
2275{
2276        struct aac_delete_disk dd;
2277        struct fsa_dev_info *fsa_dev_ptr;
2278
2279        fsa_dev_ptr = dev->fsa_dev;
2280        if (!fsa_dev_ptr)
2281                return -EBUSY;
2282
2283        if (copy_from_user(&dd, arg, sizeof (struct aac_delete_disk)))
2284                return -EFAULT;
2285
2286        if (dd.cnum >= dev->maximum_num_containers)
2287                return -EINVAL;
2288        /*
2289         *      Mark this container as being deleted.
2290         */
2291        fsa_dev_ptr[dd.cnum].deleted = 1;
2292        /*
2293         *      Mark the container as no longer valid
2294         */
2295        fsa_dev_ptr[dd.cnum].valid = 0;
2296        return 0;
2297}
2298
2299static int delete_disk(struct aac_dev *dev, void __user *arg)
2300{
2301        struct aac_delete_disk dd;
2302        struct fsa_dev_info *fsa_dev_ptr;
2303
2304        fsa_dev_ptr = dev->fsa_dev;
2305        if (!fsa_dev_ptr)
2306                return -EBUSY;
2307
2308        if (copy_from_user(&dd, arg, sizeof (struct aac_delete_disk)))
2309                return -EFAULT;
2310
2311        if (dd.cnum >= dev->maximum_num_containers)
2312                return -EINVAL;
2313        /*
2314         *      If the container is locked, it can not be deleted by the API.
2315         */
2316        if (fsa_dev_ptr[dd.cnum].locked)
2317                return -EBUSY;
2318        else {
2319                /*
2320                 *      Mark the container as no longer being valid.
2321                 */
2322                fsa_dev_ptr[dd.cnum].valid = 0;
2323                fsa_dev_ptr[dd.cnum].devname[0] = '\0';
2324                return 0;
2325        }
2326}
2327
2328int aac_dev_ioctl(struct aac_dev *dev, int cmd, void __user *arg)
2329{
2330        switch (cmd) {
2331        case FSACTL_QUERY_DISK:
2332                return query_disk(dev, arg);
2333        case FSACTL_DELETE_DISK:
2334                return delete_disk(dev, arg);
2335        case FSACTL_FORCE_DELETE_DISK:
2336                return force_delete_disk(dev, arg);
2337        case FSACTL_GET_CONTAINERS:
2338                return aac_get_containers(dev);
2339        default:
2340                return -ENOTTY;
2341        }
2342}
2343
2344/**
2345 *
2346 * aac_srb_callback
2347 * @context: the context set in the fib - here it is scsi cmd
2348 * @fibptr: pointer to the fib
2349 *
2350 * Handles the completion of a scsi command to a non dasd device
2351 *
2352 */
2353
2354static void aac_srb_callback(void *context, struct fib * fibptr)
2355{
2356        struct aac_dev *dev;
2357        struct aac_srb_reply *srbreply;
2358        struct scsi_cmnd *scsicmd;
2359
2360        scsicmd = (struct scsi_cmnd *) context;
2361
2362        if (!aac_valid_context(scsicmd, fibptr))
2363                return;
2364
2365        BUG_ON(fibptr == NULL);
2366
2367        dev = fibptr->dev;
2368
2369        srbreply = (struct aac_srb_reply *) fib_data(fibptr);
2370
2371        scsicmd->sense_buffer[0] = '\0';  /* Initialize sense valid flag to false */
2372        /*
2373         *      Calculate resid for sg 
2374         */
2375
2376        scsi_set_resid(scsicmd, scsi_bufflen(scsicmd)
2377                       - le32_to_cpu(srbreply->data_xfer_length));
2378
2379        scsi_dma_unmap(scsicmd);
2380
2381        /*
2382         * First check the fib status
2383         */
2384
2385        if (le32_to_cpu(srbreply->status) != ST_OK){
2386                int len;
2387                printk(KERN_WARNING "aac_srb_callback: srb failed, status = %d\n", le32_to_cpu(srbreply->status));
2388                len = (le32_to_cpu(srbreply->sense_data_size) > 
2389                                sizeof(scsicmd->sense_buffer)) ?
2390                                sizeof(scsicmd->sense_buffer) : 
2391                                le32_to_cpu(srbreply->sense_data_size);
2392                scsicmd->result = DID_ERROR << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
2393                memcpy(scsicmd->sense_buffer, srbreply->sense_data, len);
2394        }
2395
2396        /*
2397         * Next check the srb status
2398         */
2399        switch( (le32_to_cpu(srbreply->srb_status))&0x3f){
2400        case SRB_STATUS_ERROR_RECOVERY:
2401        case SRB_STATUS_PENDING:
2402        case SRB_STATUS_SUCCESS:
2403                scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
2404                break;
2405        case SRB_STATUS_DATA_OVERRUN:
2406                switch(scsicmd->cmnd[0]){
2407                case  READ_6:
2408                case  WRITE_6:
2409                case  READ_10:
2410                case  WRITE_10:
2411                case  READ_12:
2412                case  WRITE_12:
2413                case  READ_16:
2414                case  WRITE_16:
2415                        if(le32_to_cpu(srbreply->data_xfer_length) < scsicmd->underflow ) {
2416                                printk(KERN_WARNING"aacraid: SCSI CMD underflow\n");
2417                        } else {
2418                                printk(KERN_WARNING"aacraid: SCSI CMD Data Overrun\n");
2419                        }
2420                        scsicmd->result = DID_ERROR << 16 | COMMAND_COMPLETE << 8;
2421                        break;
2422                case INQUIRY: {
2423                        scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
2424                        break;
2425                }
2426                default:
2427                        scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
2428                        break;
2429                }
2430                break;
2431        case SRB_STATUS_ABORTED:
2432                scsicmd->result = DID_ABORT << 16 | ABORT << 8;
2433                break;
2434        case SRB_STATUS_ABORT_FAILED:
2435                // Not sure about this one - but assuming the hba was trying to abort for some reason
2436                scsicmd->result = DID_ERROR << 16 | ABORT << 8;
2437                break;
2438        case SRB_STATUS_PARITY_ERROR:
2439                scsicmd->result = DID_PARITY << 16 | MSG_PARITY_ERROR << 8;
2440                break;
2441        case SRB_STATUS_NO_DEVICE:
2442        case SRB_STATUS_INVALID_PATH_ID:
2443        case SRB_STATUS_INVALID_TARGET_ID:
2444        case SRB_STATUS_INVALID_LUN:
2445        case SRB_STATUS_SELECTION_TIMEOUT:
2446                scsicmd->result = DID_NO_CONNECT << 16 | COMMAND_COMPLETE << 8;
2447                break;
2448
2449        case SRB_STATUS_COMMAND_TIMEOUT:
2450        case SRB_STATUS_TIMEOUT:
2451                scsicmd->result = DID_TIME_OUT << 16 | COMMAND_COMPLETE << 8;
2452                break;
2453
2454        case SRB_STATUS_BUSY:
2455                scsicmd->result = DID_BUS_BUSY << 16 | COMMAND_COMPLETE << 8;
2456                break;
2457
2458        case SRB_STATUS_BUS_RESET:
2459                scsicmd->result = DID_RESET << 16 | COMMAND_COMPLETE << 8;
2460                break;
2461
2462        case SRB_STATUS_MESSAGE_REJECTED:
2463                scsicmd->result = DID_ERROR << 16 | MESSAGE_REJECT << 8;
2464                break;
2465        case SRB_STATUS_REQUEST_FLUSHED:
2466        case SRB_STATUS_ERROR:
2467        case SRB_STATUS_INVALID_REQUEST:
2468        case SRB_STATUS_REQUEST_SENSE_FAILED:
2469        case SRB_STATUS_NO_HBA:
2470        case SRB_STATUS_UNEXPECTED_BUS_FREE:
2471        case SRB_STATUS_PHASE_SEQUENCE_FAILURE:
2472        case SRB_STATUS_BAD_SRB_BLOCK_LENGTH:
2473        case SRB_STATUS_DELAYED_RETRY:
2474        case SRB_STATUS_BAD_FUNCTION:
2475        case SRB_STATUS_NOT_STARTED:
2476        case SRB_STATUS_NOT_IN_USE:
2477        case SRB_STATUS_FORCE_ABORT:
2478        case SRB_STATUS_DOMAIN_VALIDATION_FAIL:
2479        default:
2480#ifdef AAC_DETAILED_STATUS_INFO
2481                printk("aacraid: SRB ERROR(%u) %s scsi cmd 0x%x - scsi status 0x%x\n",
2482                        le32_to_cpu(srbreply->srb_status) & 0x3F,
2483                        aac_get_status_string(
2484                                le32_to_cpu(srbreply->srb_status) & 0x3F), 
2485                        scsicmd->cmnd[0], 
2486                        le32_to_cpu(srbreply->scsi_status));
2487#endif
2488                scsicmd->result = DID_ERROR << 16 | COMMAND_COMPLETE << 8;
2489                break;
2490        }
2491        if (le32_to_cpu(srbreply->scsi_status) == 0x02 ){  // Check Condition
2492                int len;
2493                scsicmd->result |= SAM_STAT_CHECK_CONDITION;
2494                len = (le32_to_cpu(srbreply->sense_data_size) > 
2495                                sizeof(scsicmd->sense_buffer)) ?
2496                                sizeof(scsicmd->sense_buffer) :
2497                                le32_to_cpu(srbreply->sense_data_size);
2498#ifdef AAC_DETAILED_STATUS_INFO
2499                printk(KERN_WARNING "aac_srb_callback: check condition, status = %d len=%d\n",
2500                                        le32_to_cpu(srbreply->status), len);
2501#endif
2502                memcpy(scsicmd->sense_buffer, srbreply->sense_data, len);
2503                
2504        }
2505        /*
2506         * OR in the scsi status (already shifted up a bit)
2507         */
2508        scsicmd->result |= le32_to_cpu(srbreply->scsi_status);
2509
2510        aac_fib_complete(fibptr);
2511        aac_fib_free(fibptr);
2512        scsicmd->scsi_done(scsicmd);
2513}
2514
2515/**
2516 *
2517 * aac_send_scb_fib
2518 * @scsicmd: the scsi command block
2519 *
2520 * This routine will form a FIB and fill in the aac_srb from the 
2521 * scsicmd passed in.
2522 */
2523
2524static int aac_send_srb_fib(struct scsi_cmnd* scsicmd)
2525{
2526        struct fib* cmd_fibcontext;
2527        struct aac_dev* dev;
2528        int status;
2529
2530        dev = (struct aac_dev *)scsicmd->device->host->hostdata;
2531        if (scmd_id(scsicmd) >= dev->maximum_num_physicals ||
2532                        scsicmd->device->lun > 7) {
2533                scsicmd->result = DID_NO_CONNECT << 16;
2534                scsicmd->scsi_done(scsicmd);
2535                return 0;
2536        }
2537
2538        /*
2539         *      Allocate and initialize a Fib then setup a BlockWrite command
2540         */
2541        if (!(cmd_fibcontext = aac_fib_alloc(dev))) {
2542                return -1;
2543        }
2544        status = aac_adapter_scsi(cmd_fibcontext, scsicmd);
2545
2546        /*
2547         *      Check that the command queued to the controller
2548         */
2549        if (status == -EINPROGRESS) {
2550                scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
2551                return 0;
2552        }
2553
2554        printk(KERN_WARNING "aac_srb: aac_fib_send failed with status: %d\n", status);
2555        aac_fib_complete(cmd_fibcontext);
2556        aac_fib_free(cmd_fibcontext);
2557
2558        return -1;
2559}
2560
2561static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg)
2562{
2563        struct aac_dev *dev;
2564        unsigned long byte_count = 0;
2565        int nseg;
2566
2567        dev = (struct aac_dev *)scsicmd->device->host->hostdata;
2568        // Get rid of old data
2569        psg->count = 0;
2570        psg->sg[0].addr = 0;
2571        psg->sg[0].count = 0;
2572
2573        nseg = scsi_dma_map(scsicmd);
2574        BUG_ON(nseg < 0);
2575        if (nseg) {
2576                struct scatterlist *sg;
2577                int i;
2578
2579                psg->count = cpu_to_le32(nseg);
2580
2581                scsi_for_each_sg(scsicmd, sg, nseg, i) {
2582                        psg->sg[i].addr = cpu_to_le32(sg_dma_address(sg));
2583                        psg->sg[i].count = cpu_to_le32(sg_dma_len(sg));
2584                        byte_count += sg_dma_len(sg);
2585                }
2586                /* hba wants the size to be exact */
2587                if (byte_count > scsi_bufflen(scsicmd)) {
2588                        u32 temp = le32_to_cpu(psg->sg[i-1].count) -
2589                                (byte_count - scsi_bufflen(scsicmd));
2590                        psg->sg[i-1].count = cpu_to_le32(temp);
2591                        byte_count = scsi_bufflen(scsicmd);
2592                }
2593                /* Check for command underflow */
2594                if(scsicmd->underflow && (byte_count < scsicmd->underflow)){
2595                        printk(KERN_WARNING"aacraid: cmd len %08lX cmd underflow %08X\n",
2596                                        byte_count, scsicmd->underflow);
2597                }
2598        }
2599        return byte_count;
2600}
2601
2602
2603static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* psg)
2604{
2605        struct aac_dev *dev;
2606        unsigned long byte_count = 0;
2607        u64 addr;
2608        int nseg;
2609
2610        dev = (struct aac_dev *)scsicmd->device->host->hostdata;
2611        // Get rid of old data
2612        psg->count = 0;
2613        psg->sg[0].addr[0] = 0;
2614        psg->sg[0].addr[1] = 0;
2615        psg->sg[0].count = 0;
2616
2617        nseg = scsi_dma_map(scsicmd);
2618        BUG_ON(nseg < 0);
2619        if (nseg) {
2620                struct scatterlist *sg;
2621                int i;
2622
2623                scsi_for_each_sg(scsicmd, sg, nseg, i) {
2624                        int count = sg_dma_len(sg);
2625                        addr = sg_dma_address(sg);
2626                        psg->sg[i].addr[0] = cpu_to_le32(addr & 0xffffffff);
2627                        psg->sg[i].addr[1] = cpu_to_le32(addr>>32);
2628                        psg->sg[i].count = cpu_to_le32(count);
2629                        byte_count += count;
2630                }
2631                psg->count = cpu_to_le32(nseg);
2632                /* hba wants the size to be exact */
2633                if (byte_count > scsi_bufflen(scsicmd)) {
2634                        u32 temp = le32_to_cpu(psg->sg[i-1].count) -
2635                                (byte_count - scsi_bufflen(scsicmd));
2636                        psg->sg[i-1].count = cpu_to_le32(temp);
2637                        byte_count = scsi_bufflen(scsicmd);
2638                }
2639                /* Check for command underflow */
2640                if(scsicmd->underflow && (byte_count < scsicmd->underflow)){
2641                        printk(KERN_WARNING"aacraid: cmd len %08lX cmd underflow %08X\n",
2642                                        byte_count, scsicmd->underflow);
2643                }
2644        }
2645        return byte_count;
2646}
2647
2648static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw* psg)
2649{
2650        unsigned long byte_count = 0;
2651        int nseg;
2652
2653        // Get rid of old data
2654        psg->count = 0;
2655        psg->sg[0].next = 0;
2656        psg->sg[0].prev = 0;
2657        psg->sg[0].addr[0] = 0;
2658        psg->sg[0].addr[1] = 0;
2659        psg->sg[0].count = 0;
2660        psg->sg[0].flags = 0;
2661
2662        nseg = scsi_dma_map(scsicmd);
2663        BUG_ON(nseg < 0);
2664        if (nseg) {
2665                struct scatterlist *sg;
2666                int i;
2667
2668                scsi_for_each_sg(scsicmd, sg, nseg, i) {
2669                        int count = sg_dma_len(sg);
2670                        u64 addr = sg_dma_address(sg);
2671                        psg->sg[i].next = 0;
2672                        psg->sg[i].prev = 0;
2673                        psg->sg[i].addr[1] = cpu_to_le32((u32)(addr>>32));
2674                        psg->sg[i].addr[0] = cpu_to_le32((u32)(addr & 0xffffffff));
2675                        psg->sg[i].count = cpu_to_le32(count);
2676                        psg->sg[i].flags = 0;
2677                        byte_count += count;
2678                }
2679                psg->count = cpu_to_le32(nseg);
2680                /* hba wants the size to be exact */
2681                if (byte_count > scsi_bufflen(scsicmd)) {
2682                        u32 temp = le32_to_cpu(psg->sg[i-1].count) -
2683                                (byte_count - scsi_bufflen(scsicmd));
2684                        psg->sg[i-1].count = cpu_to_le32(temp);
2685                        byte_count = scsi_bufflen(scsicmd);
2686                }
2687                /* Check for command underflow */
2688                if(scsicmd->underflow && (byte_count < scsicmd->underflow)){
2689                        printk(KERN_WARNING"aacraid: cmd len %08lX cmd underflow %08X\n",
2690                                        byte_count, scsicmd->underflow);
2691                }
2692        }
2693        return byte_count;
2694}
2695
2696#ifdef AAC_DETAILED_STATUS_INFO
2697
2698struct aac_srb_status_info {
2699        u32     status;
2700        char    *str;
2701};
2702
2703
2704static struct aac_srb_status_info srb_status_info[] = {
2705        { SRB_STATUS_PENDING,           "Pending Status"},
2706        { SRB_STATUS_SUCCESS,           "Success"},
2707        { SRB_STATUS_ABORTED,           "Aborted Command"},
2708        { SRB_STATUS_ABORT_FAILED,      "Abort Failed"},
2709        { SRB_STATUS_ERROR,             "Error Event"},
2710        { SRB_STATUS_BUSY,              "Device Busy"},
2711        { SRB_STATUS_INVALID_REQUEST,   "Invalid Request"},
2712        { SRB_STATUS_INVALID_PATH_ID,   "Invalid Path ID"},
2713        { SRB_STATUS_NO_DEVICE,         "No Device"},
2714        { SRB_STATUS_TIMEOUT,           "Timeout"},
2715        { SRB_STATUS_SELECTION_TIMEOUT, "Selection Timeout"},
2716        { SRB_STATUS_COMMAND_TIMEOUT,   "Command Timeout"},
2717        { SRB_STATUS_MESSAGE_REJECTED,  "Message Rejected"},
2718        { SRB_STATUS_BUS_RESET,         "Bus Reset"},
2719        { SRB_STATUS_PARITY_ERROR,      "Parity Error"},
2720        { SRB_STATUS_REQUEST_SENSE_FAILED,"Request Sense Failed"},
2721        { SRB_STATUS_NO_HBA,            "No HBA"},
2722        { SRB_STATUS_DATA_OVERRUN,      "Data Overrun/Data Underrun"},
2723        { SRB_STATUS_UNEXPECTED_BUS_FREE,"Unexpected Bus Free"},
2724        { SRB_STATUS_PHASE_SEQUENCE_FAILURE,"Phase Error"},
2725        { SRB_STATUS_BAD_SRB_BLOCK_LENGTH,"Bad Srb Block Length"},
2726        { SRB_STATUS_REQUEST_FLUSHED,   "Request Flushed"},
2727        { SRB_STATUS_DELAYED_RETRY,     "Delayed Retry"},
2728        { SRB_STATUS_INVALID_LUN,       "Invalid LUN"},
2729        { SRB_STATUS_INVALID_TARGET_ID, "Invalid TARGET ID"},
2730        { SRB_STATUS_BAD_FUNCTION,      "Bad Function"},
2731        { SRB_STATUS_ERROR_RECOVERY,    "Error Recovery"},
2732        { SRB_STATUS_NOT_STARTED,       "Not Started"},
2733        { SRB_STATUS_NOT_IN_USE,        "Not In Use"},
2734        { SRB_STATUS_FORCE_ABORT,       "Force Abort"},
2735        { SRB_STATUS_DOMAIN_VALIDATION_FAIL,"Domain Validation Failure"},
2736        { 0xff,                         "Unknown Error"}
2737};
2738
2739char *aac_get_status_string(u32 status)
2740{
2741        int i;
2742
2743        for (i = 0; i < ARRAY_SIZE(srb_status_info); i++)
2744                if (srb_status_info[i].status == status)
2745                        return srb_status_info[i].str;
2746
2747        return "Bad Status Code";
2748}
2749
2750#endif
2751