2  *      Adaptec AAC series RAID controller driver
 
   3  *      (c) Copyright 2001 Red Hat Inc.
 
   5  * based on the old aacraid driver that is..
 
   6  * Adaptec aacraid device driver for Linux.
 
   8  * Copyright (c) 2000-2007 Adaptec, Inc. (aacraid@adaptec.com)
 
  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)
 
  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.
 
  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.
 
  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 <asm/uaccess.h>
 
  35 #include <linux/highmem.h> /* For flush_kernel_dcache_page */
 
  37 #include <scsi/scsi.h>
 
  38 #include <scsi/scsi_cmnd.h>
 
  39 #include <scsi/scsi_device.h>
 
  40 #include <scsi/scsi_host.h>
 
  44 /* values for inqd_pdt: Peripheral device type in plain English */
 
  45 #define INQD_PDT_DA     0x00    /* Direct-access (DISK) device */
 
  46 #define INQD_PDT_PROC   0x03    /* Processor device */
 
  47 #define INQD_PDT_CHNGR  0x08    /* Changer (jukebox, scsi2) */
 
  48 #define INQD_PDT_COMM   0x09    /* Communication device (scsi2) */
 
  49 #define INQD_PDT_NOLUN2 0x1f    /* Unknown Device (scsi2) */
 
  50 #define INQD_PDT_NOLUN  0x7f    /* Logical Unit Not Present */
 
  52 #define INQD_PDT_DMASK  0x1F    /* Peripheral Device Type Mask */
 
  53 #define INQD_PDT_QMASK  0xE0    /* Peripheral Device Qualifer Mask */
 
  59 #define SENCODE_NO_SENSE                        0x00
 
  60 #define SENCODE_END_OF_DATA                     0x00
 
  61 #define SENCODE_BECOMING_READY                  0x04
 
  62 #define SENCODE_INIT_CMD_REQUIRED               0x04
 
  63 #define SENCODE_PARAM_LIST_LENGTH_ERROR         0x1A
 
  64 #define SENCODE_INVALID_COMMAND                 0x20
 
  65 #define SENCODE_LBA_OUT_OF_RANGE                0x21
 
  66 #define SENCODE_INVALID_CDB_FIELD               0x24
 
  67 #define SENCODE_LUN_NOT_SUPPORTED               0x25
 
  68 #define SENCODE_INVALID_PARAM_FIELD             0x26
 
  69 #define SENCODE_PARAM_NOT_SUPPORTED             0x26
 
  70 #define SENCODE_PARAM_VALUE_INVALID             0x26
 
  71 #define SENCODE_RESET_OCCURRED                  0x29
 
  72 #define SENCODE_LUN_NOT_SELF_CONFIGURED_YET     0x3E
 
  73 #define SENCODE_INQUIRY_DATA_CHANGED            0x3F
 
  74 #define SENCODE_SAVING_PARAMS_NOT_SUPPORTED     0x39
 
  75 #define SENCODE_DIAGNOSTIC_FAILURE              0x40
 
  76 #define SENCODE_INTERNAL_TARGET_FAILURE         0x44
 
  77 #define SENCODE_INVALID_MESSAGE_ERROR           0x49
 
  78 #define SENCODE_LUN_FAILED_SELF_CONFIG          0x4c
 
  79 #define SENCODE_OVERLAPPED_COMMAND              0x4E
 
  82  *      Additional sense codes
 
  85 #define ASENCODE_NO_SENSE                       0x00
 
  86 #define ASENCODE_END_OF_DATA                    0x05
 
  87 #define ASENCODE_BECOMING_READY                 0x01
 
  88 #define ASENCODE_INIT_CMD_REQUIRED              0x02
 
  89 #define ASENCODE_PARAM_LIST_LENGTH_ERROR        0x00
 
  90 #define ASENCODE_INVALID_COMMAND                0x00
 
  91 #define ASENCODE_LBA_OUT_OF_RANGE               0x00
 
  92 #define ASENCODE_INVALID_CDB_FIELD              0x00
 
  93 #define ASENCODE_LUN_NOT_SUPPORTED              0x00
 
  94 #define ASENCODE_INVALID_PARAM_FIELD            0x00
 
  95 #define ASENCODE_PARAM_NOT_SUPPORTED            0x01
 
  96 #define ASENCODE_PARAM_VALUE_INVALID            0x02
 
  97 #define ASENCODE_RESET_OCCURRED                 0x00
 
  98 #define ASENCODE_LUN_NOT_SELF_CONFIGURED_YET    0x00
 
  99 #define ASENCODE_INQUIRY_DATA_CHANGED           0x03
 
 100 #define ASENCODE_SAVING_PARAMS_NOT_SUPPORTED    0x00
 
 101 #define ASENCODE_DIAGNOSTIC_FAILURE             0x80
 
 102 #define ASENCODE_INTERNAL_TARGET_FAILURE        0x00
 
 103 #define ASENCODE_INVALID_MESSAGE_ERROR          0x00
 
 104 #define ASENCODE_LUN_FAILED_SELF_CONFIG         0x00
 
 105 #define ASENCODE_OVERLAPPED_COMMAND             0x00
 
 107 #define BYTE0(x) (unsigned char)(x)
 
 108 #define BYTE1(x) (unsigned char)((x) >> 8)
 
 109 #define BYTE2(x) (unsigned char)((x) >> 16)
 
 110 #define BYTE3(x) (unsigned char)((x) >> 24)
 
 112 /*------------------------------------------------------------------------------
 
 113  *              S T R U C T S / T Y P E D E F S
 
 114  *----------------------------------------------------------------------------*/
 
 115 /* SCSI inquiry data */
 
 116 struct inquiry_data {
 
 117         u8 inqd_pdt;    /* Peripheral qualifier | Peripheral Device Type */
 
 118         u8 inqd_dtq;    /* RMB | Device Type Qualifier */
 
 119         u8 inqd_ver;    /* ISO version | ECMA version | ANSI-approved version */
 
 120         u8 inqd_rdf;    /* AENC | TrmIOP | Response data format */
 
 121         u8 inqd_len;    /* Additional length (n-4) */
 
 122         u8 inqd_pad1[2];/* Reserved - must be zero */
 
 123         u8 inqd_pad2;   /* RelAdr | WBus32 | WBus16 |  Sync  | Linked |Reserved| CmdQue | SftRe */
 
 124         u8 inqd_vid[8]; /* Vendor ID */
 
 125         u8 inqd_pid[16];/* Product ID */
 
 126         u8 inqd_prl[4]; /* Product Revision Level */
 
 130  *              M O D U L E   G L O B A L S
 
 133 static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* sgmap);
 
 134 static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* psg);
 
 135 static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw* psg);
 
 136 static int aac_send_srb_fib(struct scsi_cmnd* scsicmd);
 
 137 #ifdef AAC_DETAILED_STATUS_INFO
 
 138 static char *aac_get_status_string(u32 status);
 
 142  *      Non dasd selection is handled entirely in aachba now
 
 145 static int nondasd = -1;
 
 146 static int aac_cache = 2;       /* WCE=0 to avoid performance problems */
 
 147 static int dacmode = -1;
 
 150 int startup_timeout = 180;
 
 151 int aif_timeout = 120;
 
 153 module_param(nondasd, int, S_IRUGO|S_IWUSR);
 
 154 MODULE_PARM_DESC(nondasd, "Control scanning of hba for nondasd devices."
 
 156 module_param_named(cache, aac_cache, int, S_IRUGO|S_IWUSR);
 
 157 MODULE_PARM_DESC(cache, "Disable Queue Flush commands:\n"
 
 158         "\tbit 0 - Disable FUA in WRITE SCSI commands\n"
 
 159         "\tbit 1 - Disable SYNCHRONIZE_CACHE SCSI command\n"
 
 160         "\tbit 2 - Disable only if Battery is protecting Cache");
 
 161 module_param(dacmode, int, S_IRUGO|S_IWUSR);
 
 162 MODULE_PARM_DESC(dacmode, "Control whether dma addressing is using 64 bit DAC."
 
 164 module_param_named(commit, aac_commit, int, S_IRUGO|S_IWUSR);
 
 165 MODULE_PARM_DESC(commit, "Control whether a COMMIT_CONFIG is issued to the"
 
 166         " adapter for foreign arrays.\n"
 
 167         "This is typically needed in systems that do not have a BIOS."
 
 169 module_param_named(msi, aac_msi, int, S_IRUGO|S_IWUSR);
 
 170 MODULE_PARM_DESC(msi, "IRQ handling."
 
 171         " 0=PIC(default), 1=MSI, 2=MSI-X(unsupported, uses MSI)");
 
 172 module_param(startup_timeout, int, S_IRUGO|S_IWUSR);
 
 173 MODULE_PARM_DESC(startup_timeout, "The duration of time in seconds to wait for"
 
 174         " adapter to have it's kernel up and\n"
 
 175         "running. This is typically adjusted for large systems that do not"
 
 177 module_param(aif_timeout, int, S_IRUGO|S_IWUSR);
 
 178 MODULE_PARM_DESC(aif_timeout, "The duration of time in seconds to wait for"
 
 179         " applications to pick up AIFs before\n"
 
 180         "deregistering them. This is typically adjusted for heavily burdened"
 
 184 module_param(numacb, int, S_IRUGO|S_IWUSR);
 
 185 MODULE_PARM_DESC(numacb, "Request a limit to the number of adapter control"
 
 186         " blocks (FIB) allocated. Valid values are 512 and down. Default is"
 
 187         " to use suggestion from Firmware.");
 
 190 module_param(acbsize, int, S_IRUGO|S_IWUSR);
 
 191 MODULE_PARM_DESC(acbsize, "Request a specific adapter control block (FIB)"
 
 192         " size. Valid values are 512, 2048, 4096 and 8192. Default is to use"
 
 193         " suggestion from Firmware.");
 
 195 int update_interval = 30 * 60;
 
 196 module_param(update_interval, int, S_IRUGO|S_IWUSR);
 
 197 MODULE_PARM_DESC(update_interval, "Interval in seconds between time sync"
 
 198         " updates issued to adapter.");
 
 200 int check_interval = 24 * 60 * 60;
 
 201 module_param(check_interval, int, S_IRUGO|S_IWUSR);
 
 202 MODULE_PARM_DESC(check_interval, "Interval in seconds between adapter health"
 
 205 int aac_check_reset = 1;
 
 206 module_param_named(check_reset, aac_check_reset, int, S_IRUGO|S_IWUSR);
 
 207 MODULE_PARM_DESC(check_reset, "If adapter fails health check, reset the"
 
 208         " adapter. a value of -1 forces the reset to adapters programmed to"
 
 211 int expose_physicals = -1;
 
 212 module_param(expose_physicals, int, S_IRUGO|S_IWUSR);
 
 213 MODULE_PARM_DESC(expose_physicals, "Expose physical components of the arrays."
 
 214         " -1=protect 0=off, 1=on");
 
 216 int aac_reset_devices;
 
 217 module_param_named(reset_devices, aac_reset_devices, int, S_IRUGO|S_IWUSR);
 
 218 MODULE_PARM_DESC(reset_devices, "Force an adapter reset at initialization.");
 
 221 module_param_named(wwn, aac_wwn, int, S_IRUGO|S_IWUSR);
 
 222 MODULE_PARM_DESC(wwn, "Select a WWN type for the arrays:\n"
 
 224         "\t1 - Array Meta Data Signature (default)\n"
 
 225         "\t2 - Adapter Serial Number");
 
 228 static inline int aac_valid_context(struct scsi_cmnd *scsicmd,
 
 229                 struct fib *fibptr) {
 
 230         struct scsi_device *device;
 
 232         if (unlikely(!scsicmd || !scsicmd->scsi_done)) {
 
 233                 dprintk((KERN_WARNING "aac_valid_context: scsi command corrupt\n"));
 
 234                 aac_fib_complete(fibptr);
 
 235                 aac_fib_free(fibptr);
 
 238         scsicmd->SCp.phase = AAC_OWNER_MIDLEVEL;
 
 239         device = scsicmd->device;
 
 240         if (unlikely(!device || !scsi_device_online(device))) {
 
 241                 dprintk((KERN_WARNING "aac_valid_context: scsi device corrupt\n"));
 
 242                 aac_fib_complete(fibptr);
 
 243                 aac_fib_free(fibptr);
 
 250  *      aac_get_config_status   -       check the adapter configuration
 
 251  *      @common: adapter to query
 
 253  *      Query config status, and commit the configuration if needed.
 
 255 int aac_get_config_status(struct aac_dev *dev, int commit_flag)
 
 260         if (!(fibptr = aac_fib_alloc(dev)))
 
 263         aac_fib_init(fibptr);
 
 265                 struct aac_get_config_status *dinfo;
 
 266                 dinfo = (struct aac_get_config_status *) fib_data(fibptr);
 
 268                 dinfo->command = cpu_to_le32(VM_ContainerConfig);
 
 269                 dinfo->type = cpu_to_le32(CT_GET_CONFIG_STATUS);
 
 270                 dinfo->count = cpu_to_le32(sizeof(((struct aac_get_config_status_resp *)NULL)->data));
 
 273         status = aac_fib_send(ContainerCommand,
 
 275                             sizeof (struct aac_get_config_status),
 
 280                 printk(KERN_WARNING "aac_get_config_status: SendFIB failed.\n");
 
 282                 struct aac_get_config_status_resp *reply
 
 283                   = (struct aac_get_config_status_resp *) fib_data(fibptr);
 
 284                 dprintk((KERN_WARNING
 
 285                   "aac_get_config_status: response=%d status=%d action=%d\n",
 
 286                   le32_to_cpu(reply->response),
 
 287                   le32_to_cpu(reply->status),
 
 288                   le32_to_cpu(reply->data.action)));
 
 289                 if ((le32_to_cpu(reply->response) != ST_OK) ||
 
 290                      (le32_to_cpu(reply->status) != CT_OK) ||
 
 291                      (le32_to_cpu(reply->data.action) > CFACT_PAUSE)) {
 
 292                         printk(KERN_WARNING "aac_get_config_status: Will not issue the Commit Configuration\n");
 
 296         aac_fib_complete(fibptr);
 
 297         /* Send a CT_COMMIT_CONFIG to enable discovery of devices */
 
 299                 if ((aac_commit == 1) || commit_flag) {
 
 300                         struct aac_commit_config * dinfo;
 
 301                         aac_fib_init(fibptr);
 
 302                         dinfo = (struct aac_commit_config *) fib_data(fibptr);
 
 304                         dinfo->command = cpu_to_le32(VM_ContainerConfig);
 
 305                         dinfo->type = cpu_to_le32(CT_COMMIT_CONFIG);
 
 307                         status = aac_fib_send(ContainerCommand,
 
 309                                     sizeof (struct aac_commit_config),
 
 313                         aac_fib_complete(fibptr);
 
 314                 } else if (aac_commit == 0) {
 
 316                           "aac_get_config_status: Foreign device configurations are being ignored\n");
 
 319         aac_fib_free(fibptr);
 
 324  *      aac_get_containers      -       list containers
 
 325  *      @common: adapter to probe
 
 327  *      Make a list of all containers on this controller
 
 329 int aac_get_containers(struct aac_dev *dev)
 
 331         struct fsa_dev_info *fsa_dev_ptr;
 
 335         struct aac_get_container_count *dinfo;
 
 336         struct aac_get_container_count_resp *dresp;
 
 337         int maximum_num_containers = MAXIMUM_NUM_CONTAINERS;
 
 339         if (!(fibptr = aac_fib_alloc(dev)))
 
 342         aac_fib_init(fibptr);
 
 343         dinfo = (struct aac_get_container_count *) fib_data(fibptr);
 
 344         dinfo->command = cpu_to_le32(VM_ContainerConfig);
 
 345         dinfo->type = cpu_to_le32(CT_GET_CONTAINER_COUNT);
 
 347         status = aac_fib_send(ContainerCommand,
 
 349                     sizeof (struct aac_get_container_count),
 
 354                 dresp = (struct aac_get_container_count_resp *)fib_data(fibptr);
 
 355                 maximum_num_containers = le32_to_cpu(dresp->ContainerSwitchEntries);
 
 356                 aac_fib_complete(fibptr);
 
 358         aac_fib_free(fibptr);
 
 360         if (maximum_num_containers < MAXIMUM_NUM_CONTAINERS)
 
 361                 maximum_num_containers = MAXIMUM_NUM_CONTAINERS;
 
 362         fsa_dev_ptr = kzalloc(sizeof(*fsa_dev_ptr) * maximum_num_containers,
 
 367         dev->fsa_dev = fsa_dev_ptr;
 
 368         dev->maximum_num_containers = maximum_num_containers;
 
 370         for (index = 0; index < dev->maximum_num_containers; ) {
 
 371                 fsa_dev_ptr[index].devname[0] = '\0';
 
 373                 status = aac_probe_container(dev, index);
 
 376                         printk(KERN_WARNING "aac_get_containers: SendFIB failed.\n");
 
 381                  *      If there are no more containers, then stop asking.
 
 383                 if (++index >= status)
 
 389 static void get_container_name_callback(void *context, struct fib * fibptr)
 
 391         struct aac_get_name_resp * get_name_reply;
 
 392         struct scsi_cmnd * scsicmd;
 
 394         scsicmd = (struct scsi_cmnd *) context;
 
 396         if (!aac_valid_context(scsicmd, fibptr))
 
 399         dprintk((KERN_DEBUG "get_container_name_callback[cpu %d]: t = %ld.\n", smp_processor_id(), jiffies));
 
 400         BUG_ON(fibptr == NULL);
 
 402         get_name_reply = (struct aac_get_name_resp *) fib_data(fibptr);
 
 403         /* Failure is irrelevant, using default value instead */
 
 404         if ((le32_to_cpu(get_name_reply->status) == CT_OK)
 
 405          && (get_name_reply->data[0] != '\0')) {
 
 406                 char *sp = get_name_reply->data;
 
 407                 sp[sizeof(((struct aac_get_name_resp *)NULL)->data)-1] = '\0';
 
 411                         struct inquiry_data inq;
 
 412                         char d[sizeof(((struct inquiry_data *)NULL)->inqd_pid)];
 
 413                         int count = sizeof(d);
 
 416                                 *dp++ = (*sp) ? *sp++ : ' ';
 
 417                         } while (--count > 0);
 
 419                         scsi_sg_copy_to_buffer(scsicmd, &inq, sizeof(inq));
 
 420                         memcpy(inq.inqd_pid, d, sizeof(d));
 
 421                         scsi_sg_copy_from_buffer(scsicmd, &inq, sizeof(inq));
 
 425         scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
 
 427         aac_fib_complete(fibptr);
 
 428         aac_fib_free(fibptr);
 
 429         scsicmd->scsi_done(scsicmd);
 
 433  *      aac_get_container_name  -       get container name, none blocking.
 
 435 static int aac_get_container_name(struct scsi_cmnd * scsicmd)
 
 438         struct aac_get_name *dinfo;
 
 439         struct fib * cmd_fibcontext;
 
 440         struct aac_dev * dev;
 
 442         dev = (struct aac_dev *)scsicmd->device->host->hostdata;
 
 444         if (!(cmd_fibcontext = aac_fib_alloc(dev)))
 
 447         aac_fib_init(cmd_fibcontext);
 
 448         dinfo = (struct aac_get_name *) fib_data(cmd_fibcontext);
 
 450         dinfo->command = cpu_to_le32(VM_ContainerConfig);
 
 451         dinfo->type = cpu_to_le32(CT_READ_NAME);
 
 452         dinfo->cid = cpu_to_le32(scmd_id(scsicmd));
 
 453         dinfo->count = cpu_to_le32(sizeof(((struct aac_get_name_resp *)NULL)->data));
 
 455         status = aac_fib_send(ContainerCommand,
 
 457                   sizeof (struct aac_get_name),
 
 460                   (fib_callback)get_container_name_callback,
 
 464          *      Check that the command queued to the controller
 
 466         if (status == -EINPROGRESS) {
 
 467                 scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
 
 471         printk(KERN_WARNING "aac_get_container_name: aac_fib_send failed with status: %d.\n", status);
 
 472         aac_fib_complete(cmd_fibcontext);
 
 473         aac_fib_free(cmd_fibcontext);
 
 477 static int aac_probe_container_callback2(struct scsi_cmnd * scsicmd)
 
 479         struct fsa_dev_info *fsa_dev_ptr = ((struct aac_dev *)(scsicmd->device->host->hostdata))->fsa_dev;
 
 481         if ((fsa_dev_ptr[scmd_id(scsicmd)].valid & 1))
 
 482                 return aac_scsi_cmd(scsicmd);
 
 484         scsicmd->result = DID_NO_CONNECT << 16;
 
 485         scsicmd->scsi_done(scsicmd);
 
 489 static void _aac_probe_container2(void * context, struct fib * fibptr)
 
 491         struct fsa_dev_info *fsa_dev_ptr;
 
 492         int (*callback)(struct scsi_cmnd *);
 
 493         struct scsi_cmnd * scsicmd = (struct scsi_cmnd *)context;
 
 496         if (!aac_valid_context(scsicmd, fibptr))
 
 499         scsicmd->SCp.Status = 0;
 
 500         fsa_dev_ptr = fibptr->dev->fsa_dev;
 
 502                 struct aac_mount * dresp = (struct aac_mount *) fib_data(fibptr);
 
 503                 fsa_dev_ptr += scmd_id(scsicmd);
 
 505                 if ((le32_to_cpu(dresp->status) == ST_OK) &&
 
 506                     (le32_to_cpu(dresp->mnt[0].vol) != CT_NONE) &&
 
 507                     (le32_to_cpu(dresp->mnt[0].state) != FSCS_HIDDEN)) {
 
 508                         fsa_dev_ptr->valid = 1;
 
 509                         /* sense_key holds the current state of the spin-up */
 
 510                         if (dresp->mnt[0].state & cpu_to_le32(FSCS_NOT_READY))
 
 511                                 fsa_dev_ptr->sense_data.sense_key = NOT_READY;
 
 512                         else if (fsa_dev_ptr->sense_data.sense_key == NOT_READY)
 
 513                                 fsa_dev_ptr->sense_data.sense_key = NO_SENSE;
 
 514                         fsa_dev_ptr->type = le32_to_cpu(dresp->mnt[0].vol);
 
 516                           = ((u64)le32_to_cpu(dresp->mnt[0].capacity)) +
 
 517                             (((u64)le32_to_cpu(dresp->mnt[0].capacityhigh)) << 32);
 
 518                         fsa_dev_ptr->ro = ((le32_to_cpu(dresp->mnt[0].state) & FSCS_READONLY) != 0);
 
 520                 if ((fsa_dev_ptr->valid & 1) == 0)
 
 521                         fsa_dev_ptr->valid = 0;
 
 522                 scsicmd->SCp.Status = le32_to_cpu(dresp->count);
 
 524         aac_fib_complete(fibptr);
 
 525         aac_fib_free(fibptr);
 
 526         callback = (int (*)(struct scsi_cmnd *))(scsicmd->SCp.ptr);
 
 527         scsicmd->SCp.ptr = NULL;
 
 528         (*callback)(scsicmd);
 
 532 static void _aac_probe_container1(void * context, struct fib * fibptr)
 
 534         struct scsi_cmnd * scsicmd;
 
 535         struct aac_mount * dresp;
 
 536         struct aac_query_mount *dinfo;
 
 539         dresp = (struct aac_mount *) fib_data(fibptr);
 
 540         dresp->mnt[0].capacityhigh = 0;
 
 541         if ((le32_to_cpu(dresp->status) != ST_OK) ||
 
 542             (le32_to_cpu(dresp->mnt[0].vol) != CT_NONE)) {
 
 543                 _aac_probe_container2(context, fibptr);
 
 546         scsicmd = (struct scsi_cmnd *) context;
 
 548         if (!aac_valid_context(scsicmd, fibptr))
 
 551         aac_fib_init(fibptr);
 
 553         dinfo = (struct aac_query_mount *)fib_data(fibptr);
 
 555         dinfo->command = cpu_to_le32(VM_NameServe64);
 
 556         dinfo->count = cpu_to_le32(scmd_id(scsicmd));
 
 557         dinfo->type = cpu_to_le32(FT_FILESYS);
 
 559         status = aac_fib_send(ContainerCommand,
 
 561                           sizeof(struct aac_query_mount),
 
 564                           _aac_probe_container2,
 
 567          *      Check that the command queued to the controller
 
 569         if (status == -EINPROGRESS)
 
 570                 scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
 
 571         else if (status < 0) {
 
 572                 /* Inherit results from VM_NameServe, if any */
 
 573                 dresp->status = cpu_to_le32(ST_OK);
 
 574                 _aac_probe_container2(context, fibptr);
 
 578 static int _aac_probe_container(struct scsi_cmnd * scsicmd, int (*callback)(struct scsi_cmnd *))
 
 581         int status = -ENOMEM;
 
 583         if ((fibptr = aac_fib_alloc((struct aac_dev *)scsicmd->device->host->hostdata))) {
 
 584                 struct aac_query_mount *dinfo;
 
 586                 aac_fib_init(fibptr);
 
 588                 dinfo = (struct aac_query_mount *)fib_data(fibptr);
 
 590                 dinfo->command = cpu_to_le32(VM_NameServe);
 
 591                 dinfo->count = cpu_to_le32(scmd_id(scsicmd));
 
 592                 dinfo->type = cpu_to_le32(FT_FILESYS);
 
 593                 scsicmd->SCp.ptr = (char *)callback;
 
 595                 status = aac_fib_send(ContainerCommand,
 
 597                           sizeof(struct aac_query_mount),
 
 600                           _aac_probe_container1,
 
 603                  *      Check that the command queued to the controller
 
 605                 if (status == -EINPROGRESS) {
 
 606                         scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
 
 610                         scsicmd->SCp.ptr = NULL;
 
 611                         aac_fib_complete(fibptr);
 
 612                         aac_fib_free(fibptr);
 
 616                 struct fsa_dev_info *fsa_dev_ptr = ((struct aac_dev *)(scsicmd->device->host->hostdata))->fsa_dev;
 
 618                         fsa_dev_ptr += scmd_id(scsicmd);
 
 619                         if ((fsa_dev_ptr->valid & 1) == 0) {
 
 620                                 fsa_dev_ptr->valid = 0;
 
 621                                 return (*callback)(scsicmd);
 
 629  *      aac_probe_container             -       query a logical volume
 
 630  *      @dev: device to query
 
 631  *      @cid: container identifier
 
 633  *      Queries the controller about the given volume. The volume information
 
 634  *      is updated in the struct fsa_dev_info structure rather than returned.
 
 636 static int aac_probe_container_callback1(struct scsi_cmnd * scsicmd)
 
 638         scsicmd->device = NULL;
 
 642 int aac_probe_container(struct aac_dev *dev, int cid)
 
 644         struct scsi_cmnd *scsicmd = kmalloc(sizeof(*scsicmd), GFP_KERNEL);
 
 645         struct scsi_device *scsidev = kmalloc(sizeof(*scsidev), GFP_KERNEL);
 
 648         if (!scsicmd || !scsidev) {
 
 653         scsicmd->list.next = NULL;
 
 654         scsicmd->scsi_done = (void (*)(struct scsi_cmnd*))aac_probe_container_callback1;
 
 656         scsicmd->device = scsidev;
 
 657         scsidev->sdev_state = 0;
 
 659         scsidev->host = dev->scsi_host_ptr;
 
 661         if (_aac_probe_container(scsicmd, aac_probe_container_callback1) == 0)
 
 662                 while (scsicmd->device == scsidev)
 
 665         status = scsicmd->SCp.Status;
 
 670 /* Local Structure to set SCSI inquiry data strings */
 
 672         char vid[8];         /* Vendor ID */
 
 673         char pid[16];        /* Product ID */
 
 674         char prl[4];         /* Product Revision Level */
 
 678  *      InqStrCopy      -       string merge
 
 679  *      @a:     string to copy from
 
 680  *      @b:     string to copy to
 
 682  *      Copy a String from one location to another
 
 686 static void inqstrcpy(char *a, char *b)
 
 689         while (*a != (char)0)
 
 693 static char *container_types[] = {
 
 717 char * get_container_type(unsigned tindex)
 
 719         if (tindex >= ARRAY_SIZE(container_types))
 
 720                 tindex = ARRAY_SIZE(container_types) - 1;
 
 721         return container_types[tindex];
 
 724 /* Function: setinqstr
 
 726  * Arguments: [1] pointer to void [1] int
 
 728  * Purpose: Sets SCSI inquiry data strings for vendor, product
 
 729  * and revision level. Allows strings to be set in platform dependant
 
 730  * files instead of in OS dependant driver source.
 
 733 static void setinqstr(struct aac_dev *dev, void *data, int tindex)
 
 735         struct scsi_inq *str;
 
 737         str = (struct scsi_inq *)(data); /* cast data to scsi inq block */
 
 738         memset(str, ' ', sizeof(*str));
 
 740         if (dev->supplement_adapter_info.AdapterTypeText[0]) {
 
 741                 char * cp = dev->supplement_adapter_info.AdapterTypeText;
 
 743                 if ((cp[0] == 'A') && (cp[1] == 'O') && (cp[2] == 'C'))
 
 744                         inqstrcpy("SMC", str->vid);
 
 746                         c = sizeof(str->vid);
 
 747                         while (*cp && *cp != ' ' && --c)
 
 751                         inqstrcpy (dev->supplement_adapter_info.AdapterTypeText,
 
 754                         while (*cp && *cp != ' ')
 
 759                 /* last six chars reserved for vol type */
 
 761                 if (strlen(cp) > sizeof(str->pid)) {
 
 762                         c = cp[sizeof(str->pid)];
 
 763                         cp[sizeof(str->pid)] = '\0';
 
 765                 inqstrcpy (cp, str->pid);
 
 767                         cp[sizeof(str->pid)] = c;
 
 769                 struct aac_driver_ident *mp = aac_get_driver_ident(dev->cardtype);
 
 771                 inqstrcpy (mp->vname, str->vid);
 
 772                 /* last six chars reserved for vol type */
 
 773                 inqstrcpy (mp->model, str->pid);
 
 776         if (tindex < ARRAY_SIZE(container_types)){
 
 777                 char *findit = str->pid;
 
 779                 for ( ; *findit != ' '; findit++); /* walk till we find a space */
 
 780                 /* RAID is superfluous in the context of a RAID device */
 
 781                 if (memcmp(findit-4, "RAID", 4) == 0)
 
 782                         *(findit -= 4) = ' ';
 
 783                 if (((findit - str->pid) + strlen(container_types[tindex]))
 
 784                  < (sizeof(str->pid) + sizeof(str->prl)))
 
 785                         inqstrcpy (container_types[tindex], findit + 1);
 
 787         inqstrcpy ("V1.0", str->prl);
 
 790 static void get_container_serial_callback(void *context, struct fib * fibptr)
 
 792         struct aac_get_serial_resp * get_serial_reply;
 
 793         struct scsi_cmnd * scsicmd;
 
 795         BUG_ON(fibptr == NULL);
 
 797         scsicmd = (struct scsi_cmnd *) context;
 
 798         if (!aac_valid_context(scsicmd, fibptr))
 
 801         get_serial_reply = (struct aac_get_serial_resp *) fib_data(fibptr);
 
 802         /* Failure is irrelevant, using default value instead */
 
 803         if (le32_to_cpu(get_serial_reply->status) == CT_OK) {
 
 807                 sp[1] = scsicmd->cmnd[2];
 
 809                 sp[3] = snprintf(sp+4, sizeof(sp)-4, "%08X",
 
 810                   le32_to_cpu(get_serial_reply->uid));
 
 811                 scsi_sg_copy_from_buffer(scsicmd, sp, sizeof(sp));
 
 814         scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
 
 816         aac_fib_complete(fibptr);
 
 817         aac_fib_free(fibptr);
 
 818         scsicmd->scsi_done(scsicmd);
 
 822  *      aac_get_container_serial - get container serial, none blocking.
 
 824 static int aac_get_container_serial(struct scsi_cmnd * scsicmd)
 
 827         struct aac_get_serial *dinfo;
 
 828         struct fib * cmd_fibcontext;
 
 829         struct aac_dev * dev;
 
 831         dev = (struct aac_dev *)scsicmd->device->host->hostdata;
 
 833         if (!(cmd_fibcontext = aac_fib_alloc(dev)))
 
 836         aac_fib_init(cmd_fibcontext);
 
 837         dinfo = (struct aac_get_serial *) fib_data(cmd_fibcontext);
 
 839         dinfo->command = cpu_to_le32(VM_ContainerConfig);
 
 840         dinfo->type = cpu_to_le32(CT_CID_TO_32BITS_UID);
 
 841         dinfo->cid = cpu_to_le32(scmd_id(scsicmd));
 
 843         status = aac_fib_send(ContainerCommand,
 
 845                   sizeof (struct aac_get_serial),
 
 848                   (fib_callback) get_container_serial_callback,
 
 852          *      Check that the command queued to the controller
 
 854         if (status == -EINPROGRESS) {
 
 855                 scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
 
 859         printk(KERN_WARNING "aac_get_container_serial: aac_fib_send failed with status: %d.\n", status);
 
 860         aac_fib_complete(cmd_fibcontext);
 
 861         aac_fib_free(cmd_fibcontext);
 
 865 /* Function: setinqserial
 
 867  * Arguments: [1] pointer to void [1] int
 
 869  * Purpose: Sets SCSI Unit Serial number.
 
 870  *          This is a fake. We should read a proper
 
 871  *          serial number from the container. <SuSE>But
 
 872  *          without docs it's quite hard to do it :-)
 
 873  *          So this will have to do in the meantime.</SuSE>
 
 876 static int setinqserial(struct aac_dev *dev, void *data, int cid)
 
 879          *      This breaks array migration.
 
 881         return snprintf((char *)(data), sizeof(struct scsi_inq) - 4, "%08X%02X",
 
 882                         le32_to_cpu(dev->adapter_info.serial[0]), cid);
 
 885 static inline void set_sense(struct sense_data *sense_data, u8 sense_key,
 
 886         u8 sense_code, u8 a_sense_code, u8 bit_pointer, u16 field_pointer)
 
 888         u8 *sense_buf = (u8 *)sense_data;
 
 889         /* Sense data valid, err code 70h */
 
 890         sense_buf[0] = 0x70; /* No info field */
 
 891         sense_buf[1] = 0;       /* Segment number, always zero */
 
 893         sense_buf[2] = sense_key;       /* Sense key */
 
 895         sense_buf[12] = sense_code;     /* Additional sense code */
 
 896         sense_buf[13] = a_sense_code;   /* Additional sense code qualifier */
 
 898         if (sense_key == ILLEGAL_REQUEST) {
 
 899                 sense_buf[7] = 10;      /* Additional sense length */
 
 901                 sense_buf[15] = bit_pointer;
 
 902                 /* Illegal parameter is in the parameter block */
 
 903                 if (sense_code == SENCODE_INVALID_CDB_FIELD)
 
 904                         sense_buf[15] |= 0xc0;/* Std sense key specific field */
 
 905                 /* Illegal parameter is in the CDB block */
 
 906                 sense_buf[16] = field_pointer >> 8;     /* MSB */
 
 907                 sense_buf[17] = field_pointer;          /* LSB */
 
 909                 sense_buf[7] = 6;       /* Additional sense length */
 
 912 static int aac_bounds_32(struct aac_dev * dev, struct scsi_cmnd * cmd, u64 lba)
 
 914         if (lba & 0xffffffff00000000LL) {
 
 915                 int cid = scmd_id(cmd);
 
 916                 dprintk((KERN_DEBUG "aacraid: Illegal lba\n"));
 
 917                 cmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
 
 918                         SAM_STAT_CHECK_CONDITION;
 
 919                 set_sense(&dev->fsa_dev[cid].sense_data,
 
 920                   HARDWARE_ERROR, SENCODE_INTERNAL_TARGET_FAILURE,
 
 921                   ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0);
 
 922                 memcpy(cmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
 
 923                        min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
 
 924                              SCSI_SENSE_BUFFERSIZE));
 
 931 static int aac_bounds_64(struct aac_dev * dev, struct scsi_cmnd * cmd, u64 lba)
 
 936 static void io_callback(void *context, struct fib * fibptr);
 
 938 static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count)
 
 941         struct aac_raw_io *readcmd;
 
 943         readcmd = (struct aac_raw_io *) fib_data(fib);
 
 944         readcmd->block[0] = cpu_to_le32((u32)(lba&0xffffffff));
 
 945         readcmd->block[1] = cpu_to_le32((u32)((lba&0xffffffff00000000LL)>>32));
 
 946         readcmd->count = cpu_to_le32(count<<9);
 
 947         readcmd->cid = cpu_to_le16(scmd_id(cmd));
 
 948         readcmd->flags = cpu_to_le16(IO_TYPE_READ);
 
 949         readcmd->bpTotal = 0;
 
 950         readcmd->bpComplete = 0;
 
 952         aac_build_sgraw(cmd, &readcmd->sg);
 
 953         fibsize = sizeof(struct aac_raw_io) + ((le32_to_cpu(readcmd->sg.count) - 1) * sizeof (struct sgentryraw));
 
 954         BUG_ON(fibsize > (fib->dev->max_fib_size - sizeof(struct aac_fibhdr)));
 
 956          *      Now send the Fib to the adapter
 
 958         return aac_fib_send(ContainerRawIo,
 
 963                           (fib_callback) io_callback,
 
 967 static int aac_read_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count)
 
 970         struct aac_read64 *readcmd;
 
 972         readcmd = (struct aac_read64 *) fib_data(fib);
 
 973         readcmd->command = cpu_to_le32(VM_CtHostRead64);
 
 974         readcmd->cid = cpu_to_le16(scmd_id(cmd));
 
 975         readcmd->sector_count = cpu_to_le16(count);
 
 976         readcmd->block = cpu_to_le32((u32)(lba&0xffffffff));
 
 980         aac_build_sg64(cmd, &readcmd->sg);
 
 981         fibsize = sizeof(struct aac_read64) +
 
 982                 ((le32_to_cpu(readcmd->sg.count) - 1) *
 
 983                  sizeof (struct sgentry64));
 
 984         BUG_ON (fibsize > (fib->dev->max_fib_size -
 
 985                                 sizeof(struct aac_fibhdr)));
 
 987          *      Now send the Fib to the adapter
 
 989         return aac_fib_send(ContainerCommand64,
 
 994                           (fib_callback) io_callback,
 
 998 static int aac_read_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count)
 
1001         struct aac_read *readcmd;
 
1003         readcmd = (struct aac_read *) fib_data(fib);
 
1004         readcmd->command = cpu_to_le32(VM_CtBlockRead);
 
1005         readcmd->cid = cpu_to_le32(scmd_id(cmd));
 
1006         readcmd->block = cpu_to_le32((u32)(lba&0xffffffff));
 
1007         readcmd->count = cpu_to_le32(count * 512);
 
1009         aac_build_sg(cmd, &readcmd->sg);
 
1010         fibsize = sizeof(struct aac_read) +
 
1011                         ((le32_to_cpu(readcmd->sg.count) - 1) *
 
1012                          sizeof (struct sgentry));
 
1013         BUG_ON (fibsize > (fib->dev->max_fib_size -
 
1014                                 sizeof(struct aac_fibhdr)));
 
1016          *      Now send the Fib to the adapter
 
1018         return aac_fib_send(ContainerCommand,
 
1023                           (fib_callback) io_callback,
 
1027 static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count, int fua)
 
1030         struct aac_raw_io *writecmd;
 
1032         writecmd = (struct aac_raw_io *) fib_data(fib);
 
1033         writecmd->block[0] = cpu_to_le32((u32)(lba&0xffffffff));
 
1034         writecmd->block[1] = cpu_to_le32((u32)((lba&0xffffffff00000000LL)>>32));
 
1035         writecmd->count = cpu_to_le32(count<<9);
 
1036         writecmd->cid = cpu_to_le16(scmd_id(cmd));
 
1037         writecmd->flags = (fua && ((aac_cache & 5) != 1) &&
 
1038           (((aac_cache & 5) != 5) || !fib->dev->cache_protected)) ?
 
1039                 cpu_to_le16(IO_TYPE_WRITE|IO_SUREWRITE) :
 
1040                 cpu_to_le16(IO_TYPE_WRITE);
 
1041         writecmd->bpTotal = 0;
 
1042         writecmd->bpComplete = 0;
 
1044         aac_build_sgraw(cmd, &writecmd->sg);
 
1045         fibsize = sizeof(struct aac_raw_io) + ((le32_to_cpu(writecmd->sg.count) - 1) * sizeof (struct sgentryraw));
 
1046         BUG_ON(fibsize > (fib->dev->max_fib_size - sizeof(struct aac_fibhdr)));
 
1048          *      Now send the Fib to the adapter
 
1050         return aac_fib_send(ContainerRawIo,
 
1055                           (fib_callback) io_callback,
 
1059 static int aac_write_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count, int fua)
 
1062         struct aac_write64 *writecmd;
 
1064         writecmd = (struct aac_write64 *) fib_data(fib);
 
1065         writecmd->command = cpu_to_le32(VM_CtHostWrite64);
 
1066         writecmd->cid = cpu_to_le16(scmd_id(cmd));
 
1067         writecmd->sector_count = cpu_to_le16(count);
 
1068         writecmd->block = cpu_to_le32((u32)(lba&0xffffffff));
 
1070         writecmd->flags = 0;
 
1072         aac_build_sg64(cmd, &writecmd->sg);
 
1073         fibsize = sizeof(struct aac_write64) +
 
1074                 ((le32_to_cpu(writecmd->sg.count) - 1) *
 
1075                  sizeof (struct sgentry64));
 
1076         BUG_ON (fibsize > (fib->dev->max_fib_size -
 
1077                                 sizeof(struct aac_fibhdr)));
 
1079          *      Now send the Fib to the adapter
 
1081         return aac_fib_send(ContainerCommand64,
 
1086                           (fib_callback) io_callback,
 
1090 static int aac_write_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count, int fua)
 
1093         struct aac_write *writecmd;
 
1095         writecmd = (struct aac_write *) fib_data(fib);
 
1096         writecmd->command = cpu_to_le32(VM_CtBlockWrite);
 
1097         writecmd->cid = cpu_to_le32(scmd_id(cmd));
 
1098         writecmd->block = cpu_to_le32((u32)(lba&0xffffffff));
 
1099         writecmd->count = cpu_to_le32(count * 512);
 
1100         writecmd->sg.count = cpu_to_le32(1);
 
1101         /* ->stable is not used - it did mean which type of write */
 
1103         aac_build_sg(cmd, &writecmd->sg);
 
1104         fibsize = sizeof(struct aac_write) +
 
1105                 ((le32_to_cpu(writecmd->sg.count) - 1) *
 
1106                  sizeof (struct sgentry));
 
1107         BUG_ON (fibsize > (fib->dev->max_fib_size -
 
1108                                 sizeof(struct aac_fibhdr)));
 
1110          *      Now send the Fib to the adapter
 
1112         return aac_fib_send(ContainerCommand,
 
1117                           (fib_callback) io_callback,
 
1121 static struct aac_srb * aac_scsi_common(struct fib * fib, struct scsi_cmnd * cmd)
 
1123         struct aac_srb * srbcmd;
 
1128         switch(cmd->sc_data_direction){
 
1132         case DMA_BIDIRECTIONAL:
 
1133                 flag = SRB_DataIn | SRB_DataOut;
 
1135         case DMA_FROM_DEVICE:
 
1139         default:        /* shuts up some versions of gcc */
 
1140                 flag = SRB_NoDataXfer;
 
1144         srbcmd = (struct aac_srb*) fib_data(fib);
 
1145         srbcmd->function = cpu_to_le32(SRBF_ExecuteScsi);
 
1146         srbcmd->channel  = cpu_to_le32(aac_logical_to_phys(scmd_channel(cmd)));
 
1147         srbcmd->id       = cpu_to_le32(scmd_id(cmd));
 
1148         srbcmd->lun      = cpu_to_le32(cmd->device->lun);
 
1149         srbcmd->flags    = cpu_to_le32(flag);
 
1150         timeout = cmd->request->timeout/HZ;
 
1153         srbcmd->timeout  = cpu_to_le32(timeout);  // timeout in seconds
 
1154         srbcmd->retry_limit = 0; /* Obsolete parameter */
 
1155         srbcmd->cdb_size = cpu_to_le32(cmd->cmd_len);
 
1159 static void aac_srb_callback(void *context, struct fib * fibptr);
 
1161 static int aac_scsi_64(struct fib * fib, struct scsi_cmnd * cmd)
 
1164         struct aac_srb * srbcmd = aac_scsi_common(fib, cmd);
 
1166         aac_build_sg64(cmd, (struct sgmap64*) &srbcmd->sg);
 
1167         srbcmd->count = cpu_to_le32(scsi_bufflen(cmd));
 
1169         memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb));
 
1170         memcpy(srbcmd->cdb, cmd->cmnd, cmd->cmd_len);
 
1172          *      Build Scatter/Gather list
 
1174         fibsize = sizeof (struct aac_srb) - sizeof (struct sgentry) +
 
1175                 ((le32_to_cpu(srbcmd->sg.count) & 0xff) *
 
1176                  sizeof (struct sgentry64));
 
1177         BUG_ON (fibsize > (fib->dev->max_fib_size -
 
1178                                 sizeof(struct aac_fibhdr)));
 
1181          *      Now send the Fib to the adapter
 
1183         return aac_fib_send(ScsiPortCommand64, fib,
 
1184                                 fibsize, FsaNormal, 0, 1,
 
1185                                   (fib_callback) aac_srb_callback,
 
1189 static int aac_scsi_32(struct fib * fib, struct scsi_cmnd * cmd)
 
1192         struct aac_srb * srbcmd = aac_scsi_common(fib, cmd);
 
1194         aac_build_sg(cmd, (struct sgmap*)&srbcmd->sg);
 
1195         srbcmd->count = cpu_to_le32(scsi_bufflen(cmd));
 
1197         memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb));
 
1198         memcpy(srbcmd->cdb, cmd->cmnd, cmd->cmd_len);
 
1200          *      Build Scatter/Gather list
 
1202         fibsize = sizeof (struct aac_srb) +
 
1203                 (((le32_to_cpu(srbcmd->sg.count) & 0xff) - 1) *
 
1204                  sizeof (struct sgentry));
 
1205         BUG_ON (fibsize > (fib->dev->max_fib_size -
 
1206                                 sizeof(struct aac_fibhdr)));
 
1209          *      Now send the Fib to the adapter
 
1211         return aac_fib_send(ScsiPortCommand, fib, fibsize, FsaNormal, 0, 1,
 
1212                                   (fib_callback) aac_srb_callback, (void *) cmd);
 
1215 static int aac_scsi_32_64(struct fib * fib, struct scsi_cmnd * cmd)
 
1217         if ((sizeof(dma_addr_t) > 4) && fib->dev->needs_dac &&
 
1218             (fib->dev->adapter_info.options & AAC_OPT_SGMAP_HOST64))
 
1220         return aac_scsi_32(fib, cmd);
 
1223 int aac_get_adapter_info(struct aac_dev* dev)
 
1228         struct aac_adapter_info *info;
 
1229         struct aac_bus_info *command;
 
1230         struct aac_bus_info_response *bus_info;
 
1232         if (!(fibptr = aac_fib_alloc(dev)))
 
1235         aac_fib_init(fibptr);
 
1236         info = (struct aac_adapter_info *) fib_data(fibptr);
 
1237         memset(info,0,sizeof(*info));
 
1239         rcode = aac_fib_send(RequestAdapterInfo,
 
1243                          -1, 1, /* First `interrupt' command uses special wait */
 
1248                 aac_fib_complete(fibptr);
 
1249                 aac_fib_free(fibptr);
 
1252         memcpy(&dev->adapter_info, info, sizeof(*info));
 
1254         if (dev->adapter_info.options & AAC_OPT_SUPPLEMENT_ADAPTER_INFO) {
 
1255                 struct aac_supplement_adapter_info * sinfo;
 
1257                 aac_fib_init(fibptr);
 
1259                 sinfo = (struct aac_supplement_adapter_info *) fib_data(fibptr);
 
1261                 memset(sinfo,0,sizeof(*sinfo));
 
1263                 rcode = aac_fib_send(RequestSupplementAdapterInfo,
 
1272                         memcpy(&dev->supplement_adapter_info, sinfo, sizeof(*sinfo));
 
1280         aac_fib_init(fibptr);
 
1282         bus_info = (struct aac_bus_info_response *) fib_data(fibptr);
 
1284         memset(bus_info, 0, sizeof(*bus_info));
 
1286         command = (struct aac_bus_info *)bus_info;
 
1288         command->Command = cpu_to_le32(VM_Ioctl);
 
1289         command->ObjType = cpu_to_le32(FT_DRIVE);
 
1290         command->MethodId = cpu_to_le32(1);
 
1291         command->CtlCmd = cpu_to_le32(GetBusInfo);
 
1293         rcode = aac_fib_send(ContainerCommand,
 
1300         /* reasoned default */
 
1301         dev->maximum_num_physicals = 16;
 
1302         if (rcode >= 0 && le32_to_cpu(bus_info->Status) == ST_OK) {
 
1303                 dev->maximum_num_physicals = le32_to_cpu(bus_info->TargetsPerBus);
 
1304                 dev->maximum_num_channels = le32_to_cpu(bus_info->BusCount);
 
1307         if (!dev->in_reset) {
 
1309                 tmp = le32_to_cpu(dev->adapter_info.kernelrev);
 
1310                 printk(KERN_INFO "%s%d: kernel %d.%d-%d[%d] %.*s\n",
 
1316                         le32_to_cpu(dev->adapter_info.kernelbuild),
 
1317                         (int)sizeof(dev->supplement_adapter_info.BuildDate),
 
1318                         dev->supplement_adapter_info.BuildDate);
 
1319                 tmp = le32_to_cpu(dev->adapter_info.monitorrev);
 
1320                 printk(KERN_INFO "%s%d: monitor %d.%d-%d[%d]\n",
 
1322                         tmp>>24,(tmp>>16)&0xff,tmp&0xff,
 
1323                         le32_to_cpu(dev->adapter_info.monitorbuild));
 
1324                 tmp = le32_to_cpu(dev->adapter_info.biosrev);
 
1325                 printk(KERN_INFO "%s%d: bios %d.%d-%d[%d]\n",
 
1327                         tmp>>24,(tmp>>16)&0xff,tmp&0xff,
 
1328                         le32_to_cpu(dev->adapter_info.biosbuild));
 
1330                 if (aac_get_serial_number(
 
1331                   shost_to_class(dev->scsi_host_ptr), buffer))
 
1332                         printk(KERN_INFO "%s%d: serial %s",
 
1333                           dev->name, dev->id, buffer);
 
1334                 if (dev->supplement_adapter_info.VpdInfo.Tsid[0]) {
 
1335                         printk(KERN_INFO "%s%d: TSID %.*s\n",
 
1337                           (int)sizeof(dev->supplement_adapter_info.VpdInfo.Tsid),
 
1338                           dev->supplement_adapter_info.VpdInfo.Tsid);
 
1340                 if (!aac_check_reset || ((aac_check_reset == 1) &&
 
1341                   (dev->supplement_adapter_info.SupportedOptions2 &
 
1342                   AAC_OPTION_IGNORE_RESET))) {
 
1343                         printk(KERN_INFO "%s%d: Reset Adapter Ignored\n",
 
1344                           dev->name, dev->id);
 
1348         dev->cache_protected = 0;
 
1349         dev->jbod = ((dev->supplement_adapter_info.FeatureBits &
 
1350                 AAC_FEATURE_JBOD) != 0);
 
1351         dev->nondasd_support = 0;
 
1352         dev->raid_scsi_mode = 0;
 
1353         if(dev->adapter_info.options & AAC_OPT_NONDASD)
 
1354                 dev->nondasd_support = 1;
 
1357          * If the firmware supports ROMB RAID/SCSI mode and we are currently
 
1358          * in RAID/SCSI mode, set the flag. For now if in this mode we will
 
1359          * force nondasd support on. If we decide to allow the non-dasd flag
 
1360          * additional changes changes will have to be made to support
 
1361          * RAID/SCSI.  the function aac_scsi_cmd in this module will have to be
 
1362          * changed to support the new dev->raid_scsi_mode flag instead of
 
1363          * leaching off of the dev->nondasd_support flag. Also in linit.c the
 
1364          * function aac_detect will have to be modified where it sets up the
 
1365          * max number of channels based on the aac->nondasd_support flag only.
 
1367         if ((dev->adapter_info.options & AAC_OPT_SCSI_MANAGED) &&
 
1368             (dev->adapter_info.options & AAC_OPT_RAID_SCSI_MODE)) {
 
1369                 dev->nondasd_support = 1;
 
1370                 dev->raid_scsi_mode = 1;
 
1372         if (dev->raid_scsi_mode != 0)
 
1373                 printk(KERN_INFO "%s%d: ROMB RAID/SCSI mode enabled\n",
 
1374                                 dev->name, dev->id);
 
1377                 dev->nondasd_support = (nondasd!=0);
 
1378         if (dev->nondasd_support && !dev->in_reset)
 
1379                 printk(KERN_INFO "%s%d: Non-DASD support enabled.\n",dev->name, dev->id);
 
1381         if (dma_get_required_mask(&dev->pdev->dev) > DMA_BIT_MASK(32))
 
1383         dev->dac_support = 0;
 
1384         if ((sizeof(dma_addr_t) > 4) && dev->needs_dac &&
 
1385             (dev->adapter_info.options & AAC_OPT_SGMAP_HOST64)) {
 
1387                         printk(KERN_INFO "%s%d: 64bit support enabled.\n",
 
1388                                 dev->name, dev->id);
 
1389                 dev->dac_support = 1;
 
1393                 dev->dac_support = (dacmode!=0);
 
1396         /* avoid problems with AAC_QUIRK_SCSI_32 controllers */
 
1397         if (dev->dac_support && (aac_get_driver_ident(dev->cardtype)->quirks
 
1398                 & AAC_QUIRK_SCSI_32)) {
 
1399                 dev->nondasd_support = 0;
 
1401                 expose_physicals = 0;
 
1404         if(dev->dac_support != 0) {
 
1405                 if (!pci_set_dma_mask(dev->pdev, DMA_BIT_MASK(64)) &&
 
1406                         !pci_set_consistent_dma_mask(dev->pdev, DMA_BIT_MASK(64))) {
 
1408                                 printk(KERN_INFO"%s%d: 64 Bit DAC enabled\n",
 
1409                                         dev->name, dev->id);
 
1410                 } else if (!pci_set_dma_mask(dev->pdev, DMA_BIT_MASK(32)) &&
 
1411                         !pci_set_consistent_dma_mask(dev->pdev, DMA_BIT_MASK(32))) {
 
1412                         printk(KERN_INFO"%s%d: DMA mask set failed, 64 Bit DAC disabled\n",
 
1413                                 dev->name, dev->id);
 
1414                         dev->dac_support = 0;
 
1416                         printk(KERN_WARNING"%s%d: No suitable DMA available.\n",
 
1417                                 dev->name, dev->id);
 
1422          * Deal with configuring for the individualized limits of each packet
 
1425         dev->a_ops.adapter_scsi = (dev->dac_support)
 
1426           ? ((aac_get_driver_ident(dev->cardtype)->quirks & AAC_QUIRK_SCSI_32)
 
1430         if (dev->raw_io_interface) {
 
1431                 dev->a_ops.adapter_bounds = (dev->raw_io_64)
 
1434                 dev->a_ops.adapter_read = aac_read_raw_io;
 
1435                 dev->a_ops.adapter_write = aac_write_raw_io;
 
1437                 dev->a_ops.adapter_bounds = aac_bounds_32;
 
1438                 dev->scsi_host_ptr->sg_tablesize = (dev->max_fib_size -
 
1439                         sizeof(struct aac_fibhdr) -
 
1440                         sizeof(struct aac_write) + sizeof(struct sgentry)) /
 
1441                                 sizeof(struct sgentry);
 
1442                 if (dev->dac_support) {
 
1443                         dev->a_ops.adapter_read = aac_read_block64;
 
1444                         dev->a_ops.adapter_write = aac_write_block64;
 
1446                          * 38 scatter gather elements
 
1448                         dev->scsi_host_ptr->sg_tablesize =
 
1449                                 (dev->max_fib_size -
 
1450                                 sizeof(struct aac_fibhdr) -
 
1451                                 sizeof(struct aac_write64) +
 
1452                                 sizeof(struct sgentry64)) /
 
1453                                         sizeof(struct sgentry64);
 
1455                         dev->a_ops.adapter_read = aac_read_block;
 
1456                         dev->a_ops.adapter_write = aac_write_block;
 
1458                 dev->scsi_host_ptr->max_sectors = AAC_MAX_32BIT_SGBCOUNT;
 
1459                 if(!(dev->adapter_info.options & AAC_OPT_NEW_COMM)) {
 
1461                          * Worst case size that could cause sg overflow when
 
1462                          * we break up SG elements that are larger than 64KB.
 
1463                          * Would be nice if we could tell the SCSI layer what
 
1464                          * the maximum SG element size can be. Worst case is
 
1465                          * (sg_tablesize-1) 4KB elements with one 64KB
 
1467                          *      32bit -> 468 or 238KB   64bit -> 424 or 212KB
 
1469                         dev->scsi_host_ptr->max_sectors =
 
1470                           (dev->scsi_host_ptr->sg_tablesize * 8) + 112;
 
1474         aac_fib_complete(fibptr);
 
1475         aac_fib_free(fibptr);
 
1481 static void io_callback(void *context, struct fib * fibptr)
 
1483         struct aac_dev *dev;
 
1484         struct aac_read_reply *readreply;
 
1485         struct scsi_cmnd *scsicmd;
 
1488         scsicmd = (struct scsi_cmnd *) context;
 
1490         if (!aac_valid_context(scsicmd, fibptr))
 
1494         cid = scmd_id(scsicmd);
 
1496         if (nblank(dprintk(x))) {
 
1498                 switch (scsicmd->cmnd[0]) {
 
1501                         lba = ((scsicmd->cmnd[1] & 0x1F) << 16) |
 
1502                             (scsicmd->cmnd[2] << 8) | scsicmd->cmnd[3];
 
1506                         lba = ((u64)scsicmd->cmnd[2] << 56) |
 
1507                               ((u64)scsicmd->cmnd[3] << 48) |
 
1508                               ((u64)scsicmd->cmnd[4] << 40) |
 
1509                               ((u64)scsicmd->cmnd[5] << 32) |
 
1510                               ((u64)scsicmd->cmnd[6] << 24) |
 
1511                               (scsicmd->cmnd[7] << 16) |
 
1512                               (scsicmd->cmnd[8] << 8) | scsicmd->cmnd[9];
 
1516                         lba = ((u64)scsicmd->cmnd[2] << 24) |
 
1517                               (scsicmd->cmnd[3] << 16) |
 
1518                               (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5];
 
1521                         lba = ((u64)scsicmd->cmnd[2] << 24) |
 
1522                                (scsicmd->cmnd[3] << 16) |
 
1523                                (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5];
 
1527                   "io_callback[cpu %d]: lba = %llu, t = %ld.\n",
 
1528                   smp_processor_id(), (unsigned long long)lba, jiffies);
 
1531         BUG_ON(fibptr == NULL);
 
1533         scsi_dma_unmap(scsicmd);
 
1535         readreply = (struct aac_read_reply *)fib_data(fibptr);
 
1536         switch (le32_to_cpu(readreply->status)) {
 
1538                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
 
1540                 dev->fsa_dev[cid].sense_data.sense_key = NO_SENSE;
 
1543                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
 
1544                         SAM_STAT_CHECK_CONDITION;
 
1545                 set_sense(&dev->fsa_dev[cid].sense_data, NOT_READY,
 
1546                   SENCODE_BECOMING_READY, ASENCODE_BECOMING_READY, 0, 0);
 
1547                 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
 
1548                        min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
 
1549                              SCSI_SENSE_BUFFERSIZE));
 
1552 #ifdef AAC_DETAILED_STATUS_INFO
 
1553                 printk(KERN_WARNING "io_callback: io failed, status = %d\n",
 
1554                   le32_to_cpu(readreply->status));
 
1556                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
 
1557                         SAM_STAT_CHECK_CONDITION;
 
1558                 set_sense(&dev->fsa_dev[cid].sense_data,
 
1559                   HARDWARE_ERROR, SENCODE_INTERNAL_TARGET_FAILURE,
 
1560                   ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0);
 
1561                 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
 
1562                        min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
 
1563                              SCSI_SENSE_BUFFERSIZE));
 
1566         aac_fib_complete(fibptr);
 
1567         aac_fib_free(fibptr);
 
1569         scsicmd->scsi_done(scsicmd);
 
1572 static int aac_read(struct scsi_cmnd * scsicmd)
 
1577         struct aac_dev *dev;
 
1578         struct fib * cmd_fibcontext;
 
1580         dev = (struct aac_dev *)scsicmd->device->host->hostdata;
 
1582          *      Get block address and transfer length
 
1584         switch (scsicmd->cmnd[0]) {
 
1586                 dprintk((KERN_DEBUG "aachba: received a read(6) command on id %d.\n", scmd_id(scsicmd)));
 
1588                 lba = ((scsicmd->cmnd[1] & 0x1F) << 16) |
 
1589                         (scsicmd->cmnd[2] << 8) | scsicmd->cmnd[3];
 
1590                 count = scsicmd->cmnd[4];
 
1596                 dprintk((KERN_DEBUG "aachba: received a read(16) command on id %d.\n", scmd_id(scsicmd)));
 
1598                 lba =   ((u64)scsicmd->cmnd[2] << 56) |
 
1599                         ((u64)scsicmd->cmnd[3] << 48) |
 
1600                         ((u64)scsicmd->cmnd[4] << 40) |
 
1601                         ((u64)scsicmd->cmnd[5] << 32) |
 
1602                         ((u64)scsicmd->cmnd[6] << 24) |
 
1603                         (scsicmd->cmnd[7] << 16) |
 
1604                         (scsicmd->cmnd[8] << 8) | scsicmd->cmnd[9];
 
1605                 count = (scsicmd->cmnd[10] << 24) |
 
1606                         (scsicmd->cmnd[11] << 16) |
 
1607                         (scsicmd->cmnd[12] << 8) | scsicmd->cmnd[13];
 
1610                 dprintk((KERN_DEBUG "aachba: received a read(12) command on id %d.\n", scmd_id(scsicmd)));
 
1612                 lba = ((u64)scsicmd->cmnd[2] << 24) |
 
1613                         (scsicmd->cmnd[3] << 16) |
 
1614                         (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5];
 
1615                 count = (scsicmd->cmnd[6] << 24) |
 
1616                         (scsicmd->cmnd[7] << 16) |
 
1617                         (scsicmd->cmnd[8] << 8) | scsicmd->cmnd[9];
 
1620                 dprintk((KERN_DEBUG "aachba: received a read(10) command on id %d.\n", scmd_id(scsicmd)));
 
1622                 lba = ((u64)scsicmd->cmnd[2] << 24) |
 
1623                         (scsicmd->cmnd[3] << 16) |
 
1624                         (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5];
 
1625                 count = (scsicmd->cmnd[7] << 8) | scsicmd->cmnd[8];
 
1628         dprintk((KERN_DEBUG "aac_read[cpu %d]: lba = %llu, t = %ld.\n",
 
1629           smp_processor_id(), (unsigned long long)lba, jiffies));
 
1630         if (aac_adapter_bounds(dev,scsicmd,lba))
 
1633          *      Alocate and initialize a Fib
 
1635         if (!(cmd_fibcontext = aac_fib_alloc(dev))) {
 
1639         status = aac_adapter_read(cmd_fibcontext, scsicmd, lba, count);
 
1642          *      Check that the command queued to the controller
 
1644         if (status == -EINPROGRESS) {
 
1645                 scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
 
1649         printk(KERN_WARNING "aac_read: aac_fib_send failed with status: %d.\n", status);
 
1651          *      For some reason, the Fib didn't queue, return QUEUE_FULL
 
1653         scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_TASK_SET_FULL;
 
1654         scsicmd->scsi_done(scsicmd);
 
1655         aac_fib_complete(cmd_fibcontext);
 
1656         aac_fib_free(cmd_fibcontext);
 
1660 static int aac_write(struct scsi_cmnd * scsicmd)
 
1666         struct aac_dev *dev;
 
1667         struct fib * cmd_fibcontext;
 
1669         dev = (struct aac_dev *)scsicmd->device->host->hostdata;
 
1671          *      Get block address and transfer length
 
1673         if (scsicmd->cmnd[0] == WRITE_6)        /* 6 byte command */
 
1675                 lba = ((scsicmd->cmnd[1] & 0x1F) << 16) | (scsicmd->cmnd[2] << 8) | scsicmd->cmnd[3];
 
1676                 count = scsicmd->cmnd[4];
 
1680         } else if (scsicmd->cmnd[0] == WRITE_16) { /* 16 byte command */
 
1681                 dprintk((KERN_DEBUG "aachba: received a write(16) command on id %d.\n", scmd_id(scsicmd)));
 
1683                 lba =   ((u64)scsicmd->cmnd[2] << 56) |
 
1684                         ((u64)scsicmd->cmnd[3] << 48) |
 
1685                         ((u64)scsicmd->cmnd[4] << 40) |
 
1686                         ((u64)scsicmd->cmnd[5] << 32) |
 
1687                         ((u64)scsicmd->cmnd[6] << 24) |
 
1688                         (scsicmd->cmnd[7] << 16) |
 
1689                         (scsicmd->cmnd[8] << 8) | scsicmd->cmnd[9];
 
1690                 count = (scsicmd->cmnd[10] << 24) | (scsicmd->cmnd[11] << 16) |
 
1691                         (scsicmd->cmnd[12] << 8) | scsicmd->cmnd[13];
 
1692                 fua = scsicmd->cmnd[1] & 0x8;
 
1693         } else if (scsicmd->cmnd[0] == WRITE_12) { /* 12 byte command */
 
1694                 dprintk((KERN_DEBUG "aachba: received a write(12) command on id %d.\n", scmd_id(scsicmd)));
 
1696                 lba = ((u64)scsicmd->cmnd[2] << 24) | (scsicmd->cmnd[3] << 16)
 
1697                     | (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5];
 
1698                 count = (scsicmd->cmnd[6] << 24) | (scsicmd->cmnd[7] << 16)
 
1699                       | (scsicmd->cmnd[8] << 8) | scsicmd->cmnd[9];
 
1700                 fua = scsicmd->cmnd[1] & 0x8;
 
1702                 dprintk((KERN_DEBUG "aachba: received a write(10) command on id %d.\n", scmd_id(scsicmd)));
 
1703                 lba = ((u64)scsicmd->cmnd[2] << 24) | (scsicmd->cmnd[3] << 16) | (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5];
 
1704                 count = (scsicmd->cmnd[7] << 8) | scsicmd->cmnd[8];
 
1705                 fua = scsicmd->cmnd[1] & 0x8;
 
1707         dprintk((KERN_DEBUG "aac_write[cpu %d]: lba = %llu, t = %ld.\n",
 
1708           smp_processor_id(), (unsigned long long)lba, jiffies));
 
1709         if (aac_adapter_bounds(dev,scsicmd,lba))
 
1712          *      Allocate and initialize a Fib then setup a BlockWrite command
 
1714         if (!(cmd_fibcontext = aac_fib_alloc(dev))) {
 
1715                 scsicmd->result = DID_ERROR << 16;
 
1716                 scsicmd->scsi_done(scsicmd);
 
1720         status = aac_adapter_write(cmd_fibcontext, scsicmd, lba, count, fua);
 
1723          *      Check that the command queued to the controller
 
1725         if (status == -EINPROGRESS) {
 
1726                 scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
 
1730         printk(KERN_WARNING "aac_write: aac_fib_send failed with status: %d\n", status);
 
1732          *      For some reason, the Fib didn't queue, return QUEUE_FULL
 
1734         scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_TASK_SET_FULL;
 
1735         scsicmd->scsi_done(scsicmd);
 
1737         aac_fib_complete(cmd_fibcontext);
 
1738         aac_fib_free(cmd_fibcontext);
 
1742 static void synchronize_callback(void *context, struct fib *fibptr)
 
1744         struct aac_synchronize_reply *synchronizereply;
 
1745         struct scsi_cmnd *cmd;
 
1749         if (!aac_valid_context(cmd, fibptr))
 
1752         dprintk((KERN_DEBUG "synchronize_callback[cpu %d]: t = %ld.\n",
 
1753                                 smp_processor_id(), jiffies));
 
1754         BUG_ON(fibptr == NULL);
 
1757         synchronizereply = fib_data(fibptr);
 
1758         if (le32_to_cpu(synchronizereply->status) == CT_OK)
 
1759                 cmd->result = DID_OK << 16 |
 
1760                         COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
 
1762                 struct scsi_device *sdev = cmd->device;
 
1763                 struct aac_dev *dev = fibptr->dev;
 
1764                 u32 cid = sdev_id(sdev);
 
1766                      "synchronize_callback: synchronize failed, status = %d\n",
 
1767                      le32_to_cpu(synchronizereply->status));
 
1768                 cmd->result = DID_OK << 16 |
 
1769                         COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
 
1770                 set_sense(&dev->fsa_dev[cid].sense_data,
 
1771                   HARDWARE_ERROR, SENCODE_INTERNAL_TARGET_FAILURE,
 
1772                   ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0);
 
1773                 memcpy(cmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
 
1774                        min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
 
1775                              SCSI_SENSE_BUFFERSIZE));
 
1778         aac_fib_complete(fibptr);
 
1779         aac_fib_free(fibptr);
 
1780         cmd->scsi_done(cmd);
 
1783 static int aac_synchronize(struct scsi_cmnd *scsicmd)
 
1786         struct fib *cmd_fibcontext;
 
1787         struct aac_synchronize *synchronizecmd;
 
1788         struct scsi_cmnd *cmd;
 
1789         struct scsi_device *sdev = scsicmd->device;
 
1791         struct aac_dev *aac;
 
1792         u64 lba = ((u64)scsicmd->cmnd[2] << 24) | (scsicmd->cmnd[3] << 16) |
 
1793                 (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5];
 
1794         u32 count = (scsicmd->cmnd[7] << 8) | scsicmd->cmnd[8];
 
1795         unsigned long flags;
 
1798          * Wait for all outstanding queued commands to complete to this
 
1799          * specific target (block).
 
1801         spin_lock_irqsave(&sdev->list_lock, flags);
 
1802         list_for_each_entry(cmd, &sdev->cmd_list, list)
 
1803                 if (cmd->SCp.phase == AAC_OWNER_FIRMWARE) {
 
1807                         if (cmd->cmnd[0] == WRITE_6) {
 
1808                                 cmnd_lba = ((cmd->cmnd[1] & 0x1F) << 16) |
 
1809                                         (cmd->cmnd[2] << 8) |
 
1811                                 cmnd_count = cmd->cmnd[4];
 
1812                                 if (cmnd_count == 0)
 
1814                         } else if (cmd->cmnd[0] == WRITE_16) {
 
1815                                 cmnd_lba = ((u64)cmd->cmnd[2] << 56) |
 
1816                                         ((u64)cmd->cmnd[3] << 48) |
 
1817                                         ((u64)cmd->cmnd[4] << 40) |
 
1818                                         ((u64)cmd->cmnd[5] << 32) |
 
1819                                         ((u64)cmd->cmnd[6] << 24) |
 
1820                                         (cmd->cmnd[7] << 16) |
 
1821                                         (cmd->cmnd[8] << 8) |
 
1823                                 cmnd_count = (cmd->cmnd[10] << 24) |
 
1824                                         (cmd->cmnd[11] << 16) |
 
1825                                         (cmd->cmnd[12] << 8) |
 
1827                         } else if (cmd->cmnd[0] == WRITE_12) {
 
1828                                 cmnd_lba = ((u64)cmd->cmnd[2] << 24) |
 
1829                                         (cmd->cmnd[3] << 16) |
 
1830                                         (cmd->cmnd[4] << 8) |
 
1832                                 cmnd_count = (cmd->cmnd[6] << 24) |
 
1833                                         (cmd->cmnd[7] << 16) |
 
1834                                         (cmd->cmnd[8] << 8) |
 
1836                         } else if (cmd->cmnd[0] == WRITE_10) {
 
1837                                 cmnd_lba = ((u64)cmd->cmnd[2] << 24) |
 
1838                                         (cmd->cmnd[3] << 16) |
 
1839                                         (cmd->cmnd[4] << 8) |
 
1841                                 cmnd_count = (cmd->cmnd[7] << 8) |
 
1845                         if (((cmnd_lba + cmnd_count) < lba) ||
 
1846                           (count && ((lba + count) < cmnd_lba)))
 
1852         spin_unlock_irqrestore(&sdev->list_lock, flags);
 
1855          *      Yield the processor (requeue for later)
 
1858                 return SCSI_MLQUEUE_DEVICE_BUSY;
 
1860         aac = (struct aac_dev *)sdev->host->hostdata;
 
1862                 return SCSI_MLQUEUE_HOST_BUSY;
 
1865          *      Allocate and initialize a Fib
 
1867         if (!(cmd_fibcontext = aac_fib_alloc(aac)))
 
1868                 return SCSI_MLQUEUE_HOST_BUSY;
 
1870         aac_fib_init(cmd_fibcontext);
 
1872         synchronizecmd = fib_data(cmd_fibcontext);
 
1873         synchronizecmd->command = cpu_to_le32(VM_ContainerConfig);
 
1874         synchronizecmd->type = cpu_to_le32(CT_FLUSH_CACHE);
 
1875         synchronizecmd->cid = cpu_to_le32(scmd_id(scsicmd));
 
1876         synchronizecmd->count =
 
1877              cpu_to_le32(sizeof(((struct aac_synchronize_reply *)NULL)->data));
 
1880          *      Now send the Fib to the adapter
 
1882         status = aac_fib_send(ContainerCommand,
 
1884                   sizeof(struct aac_synchronize),
 
1887                   (fib_callback)synchronize_callback,
 
1891          *      Check that the command queued to the controller
 
1893         if (status == -EINPROGRESS) {
 
1894                 scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
 
1899                 "aac_synchronize: aac_fib_send failed with status: %d.\n", status);
 
1900         aac_fib_complete(cmd_fibcontext);
 
1901         aac_fib_free(cmd_fibcontext);
 
1902         return SCSI_MLQUEUE_HOST_BUSY;
 
1905 static void aac_start_stop_callback(void *context, struct fib *fibptr)
 
1907         struct scsi_cmnd *scsicmd = context;
 
1909         if (!aac_valid_context(scsicmd, fibptr))
 
1912         BUG_ON(fibptr == NULL);
 
1914         scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
 
1916         aac_fib_complete(fibptr);
 
1917         aac_fib_free(fibptr);
 
1918         scsicmd->scsi_done(scsicmd);
 
1921 static int aac_start_stop(struct scsi_cmnd *scsicmd)
 
1924         struct fib *cmd_fibcontext;
 
1925         struct aac_power_management *pmcmd;
 
1926         struct scsi_device *sdev = scsicmd->device;
 
1927         struct aac_dev *aac = (struct aac_dev *)sdev->host->hostdata;
 
1929         if (!(aac->supplement_adapter_info.SupportedOptions2 &
 
1930               AAC_OPTION_POWER_MANAGEMENT)) {
 
1931                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
 
1933                 scsicmd->scsi_done(scsicmd);
 
1938                 return SCSI_MLQUEUE_HOST_BUSY;
 
1941          *      Allocate and initialize a Fib
 
1943         cmd_fibcontext = aac_fib_alloc(aac);
 
1944         if (!cmd_fibcontext)
 
1945                 return SCSI_MLQUEUE_HOST_BUSY;
 
1947         aac_fib_init(cmd_fibcontext);
 
1949         pmcmd = fib_data(cmd_fibcontext);
 
1950         pmcmd->command = cpu_to_le32(VM_ContainerConfig);
 
1951         pmcmd->type = cpu_to_le32(CT_POWER_MANAGEMENT);
 
1952         /* Eject bit ignored, not relevant */
 
1953         pmcmd->sub = (scsicmd->cmnd[4] & 1) ?
 
1954                 cpu_to_le32(CT_PM_START_UNIT) : cpu_to_le32(CT_PM_STOP_UNIT);
 
1955         pmcmd->cid = cpu_to_le32(sdev_id(sdev));
 
1956         pmcmd->parm = (scsicmd->cmnd[1] & 1) ?
 
1957                 cpu_to_le32(CT_PM_UNIT_IMMEDIATE) : 0;
 
1960          *      Now send the Fib to the adapter
 
1962         status = aac_fib_send(ContainerCommand,
 
1964                   sizeof(struct aac_power_management),
 
1967                   (fib_callback)aac_start_stop_callback,
 
1971          *      Check that the command queued to the controller
 
1973         if (status == -EINPROGRESS) {
 
1974                 scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
 
1978         aac_fib_complete(cmd_fibcontext);
 
1979         aac_fib_free(cmd_fibcontext);
 
1980         return SCSI_MLQUEUE_HOST_BUSY;
 
1984  *      aac_scsi_cmd()          -       Process SCSI command
 
1985  *      @scsicmd:               SCSI command block
 
1987  *      Emulate a SCSI command and queue the required request for the
 
1991 int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
 
1994         struct Scsi_Host *host = scsicmd->device->host;
 
1995         struct aac_dev *dev = (struct aac_dev *)host->hostdata;
 
1996         struct fsa_dev_info *fsa_dev_ptr = dev->fsa_dev;
 
1998         if (fsa_dev_ptr == NULL)
 
2001          *      If the bus, id or lun is out of range, return fail
 
2002          *      Test does not apply to ID 16, the pseudo id for the controller
 
2005         cid = scmd_id(scsicmd);
 
2006         if (cid != host->this_id) {
 
2007                 if (scmd_channel(scsicmd) == CONTAINER_CHANNEL) {
 
2008                         if((cid >= dev->maximum_num_containers) ||
 
2009                                         (scsicmd->device->lun != 0)) {
 
2010                                 scsicmd->result = DID_NO_CONNECT << 16;
 
2011                                 scsicmd->scsi_done(scsicmd);
 
2016                          *      If the target container doesn't exist, it may have
 
2017                          *      been newly created
 
2019                         if (((fsa_dev_ptr[cid].valid & 1) == 0) ||
 
2020                           (fsa_dev_ptr[cid].sense_data.sense_key ==
 
2022                                 switch (scsicmd->cmnd[0]) {
 
2023                                 case SERVICE_ACTION_IN:
 
2024                                         if (!(dev->raw_io_interface) ||
 
2025                                             !(dev->raw_io_64) ||
 
2026                                             ((scsicmd->cmnd[1] & 0x1f) != SAI_READ_CAPACITY_16))
 
2030                                 case TEST_UNIT_READY:
 
2033                                         return _aac_probe_container(scsicmd,
 
2034                                                         aac_probe_container_callback2);
 
2039                 } else {  /* check for physical non-dasd devices */
 
2040                         if (dev->nondasd_support || expose_physicals ||
 
2044                                 return aac_send_srb_fib(scsicmd);
 
2046                                 scsicmd->result = DID_NO_CONNECT << 16;
 
2047                                 scsicmd->scsi_done(scsicmd);
 
2053          * else Command for the controller itself
 
2055         else if ((scsicmd->cmnd[0] != INQUIRY) &&       /* only INQUIRY & TUR cmnd supported for controller */
 
2056                 (scsicmd->cmnd[0] != TEST_UNIT_READY))
 
2058                 dprintk((KERN_WARNING "Only INQUIRY & TUR command supported for controller, rcvd = 0x%x.\n", scsicmd->cmnd[0]));
 
2059                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
 
2060                 set_sense(&dev->fsa_dev[cid].sense_data,
 
2061                   ILLEGAL_REQUEST, SENCODE_INVALID_COMMAND,
 
2062                   ASENCODE_INVALID_COMMAND, 0, 0);
 
2063                 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
 
2064                        min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
 
2065                              SCSI_SENSE_BUFFERSIZE));
 
2066                 scsicmd->scsi_done(scsicmd);
 
2071         /* Handle commands here that don't really require going out to the adapter */
 
2072         switch (scsicmd->cmnd[0]) {
 
2075                 struct inquiry_data inq_data;
 
2077                 dprintk((KERN_DEBUG "INQUIRY command, ID: %d.\n", cid));
 
2078                 memset(&inq_data, 0, sizeof (struct inquiry_data));
 
2080                 if ((scsicmd->cmnd[1] & 0x1) && aac_wwn) {
 
2081                         char *arr = (char *)&inq_data;
 
2084                         arr[0] = (scmd_id(scsicmd) == host->this_id) ?
 
2085                           INQD_PDT_PROC : INQD_PDT_DA;
 
2086                         if (scsicmd->cmnd[2] == 0) {
 
2087                                 /* supported vital product data pages */
 
2091                                 arr[1] = scsicmd->cmnd[2];
 
2092                                 scsi_sg_copy_from_buffer(scsicmd, &inq_data,
 
2094                                 scsicmd->result = DID_OK << 16 |
 
2095                                   COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
 
2096                         } else if (scsicmd->cmnd[2] == 0x80) {
 
2097                                 /* unit serial number page */
 
2098                                 arr[3] = setinqserial(dev, &arr[4],
 
2100                                 arr[1] = scsicmd->cmnd[2];
 
2101                                 scsi_sg_copy_from_buffer(scsicmd, &inq_data,
 
2104                                         return aac_get_container_serial(
 
2106                                 /* SLES 10 SP1 special */
 
2107                                 scsicmd->result = DID_OK << 16 |
 
2108                                   COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
 
2110                                 /* vpd page not implemented */
 
2111                                 scsicmd->result = DID_OK << 16 |
 
2112                                   COMMAND_COMPLETE << 8 |
 
2113                                   SAM_STAT_CHECK_CONDITION;
 
2114                                 set_sense(&dev->fsa_dev[cid].sense_data,
 
2115                                   ILLEGAL_REQUEST, SENCODE_INVALID_CDB_FIELD,
 
2116                                   ASENCODE_NO_SENSE, 7, 2);
 
2117                                 memcpy(scsicmd->sense_buffer,
 
2118                                   &dev->fsa_dev[cid].sense_data,
 
2120                                         sizeof(dev->fsa_dev[cid].sense_data),
 
2121                                         SCSI_SENSE_BUFFERSIZE));
 
2123                         scsicmd->scsi_done(scsicmd);
 
2126                 inq_data.inqd_ver = 2;  /* claim compliance to SCSI-2 */
 
2127                 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 */
 
2128                 inq_data.inqd_len = 31;
 
2129                 /*Format for "pad2" is  RelAdr | WBus32 | WBus16 |  Sync  | Linked |Reserved| CmdQue | SftRe */
 
2130                 inq_data.inqd_pad2= 0x32 ;       /*WBus16|Sync|CmdQue */
 
2132                  *      Set the Vendor, Product, and Revision Level
 
2133                  *      see: <vendor>.c i.e. aac.c
 
2135                 if (cid == host->this_id) {
 
2136                         setinqstr(dev, (void *) (inq_data.inqd_vid), ARRAY_SIZE(container_types));
 
2137                         inq_data.inqd_pdt = INQD_PDT_PROC;      /* Processor device */
 
2138                         scsi_sg_copy_from_buffer(scsicmd, &inq_data,
 
2140                         scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
 
2141                         scsicmd->scsi_done(scsicmd);
 
2146                 setinqstr(dev, (void *) (inq_data.inqd_vid), fsa_dev_ptr[cid].type);
 
2147                 inq_data.inqd_pdt = INQD_PDT_DA;        /* Direct/random access device */
 
2148                 scsi_sg_copy_from_buffer(scsicmd, &inq_data, sizeof(inq_data));
 
2149                 return aac_get_container_name(scsicmd);
 
2151         case SERVICE_ACTION_IN:
 
2152                 if (!(dev->raw_io_interface) ||
 
2153                     !(dev->raw_io_64) ||
 
2154                     ((scsicmd->cmnd[1] & 0x1f) != SAI_READ_CAPACITY_16))
 
2159                 unsigned int alloc_len;
 
2161                 dprintk((KERN_DEBUG "READ CAPACITY_16 command.\n"));
 
2162                 capacity = fsa_dev_ptr[cid].size - 1;
 
2163                 cp[0] = (capacity >> 56) & 0xff;
 
2164                 cp[1] = (capacity >> 48) & 0xff;
 
2165                 cp[2] = (capacity >> 40) & 0xff;
 
2166                 cp[3] = (capacity >> 32) & 0xff;
 
2167                 cp[4] = (capacity >> 24) & 0xff;
 
2168                 cp[5] = (capacity >> 16) & 0xff;
 
2169                 cp[6] = (capacity >> 8) & 0xff;
 
2170                 cp[7] = (capacity >> 0) & 0xff;
 
2177                 alloc_len = ((scsicmd->cmnd[10] << 24)
 
2178                              + (scsicmd->cmnd[11] << 16)
 
2179                              + (scsicmd->cmnd[12] << 8) + scsicmd->cmnd[13]);
 
2181                 alloc_len = min_t(size_t, alloc_len, sizeof(cp));
 
2182                 scsi_sg_copy_from_buffer(scsicmd, cp, alloc_len);
 
2183                 if (alloc_len < scsi_bufflen(scsicmd))
 
2184                         scsi_set_resid(scsicmd,
 
2185                                        scsi_bufflen(scsicmd) - alloc_len);
 
2187                 /* Do not cache partition table for arrays */
 
2188                 scsicmd->device->removable = 1;
 
2190                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
 
2191                 scsicmd->scsi_done(scsicmd);
 
2201                 dprintk((KERN_DEBUG "READ CAPACITY command.\n"));
 
2202                 if (fsa_dev_ptr[cid].size <= 0x100000000ULL)
 
2203                         capacity = fsa_dev_ptr[cid].size - 1;
 
2207                 cp[0] = (capacity >> 24) & 0xff;
 
2208                 cp[1] = (capacity >> 16) & 0xff;
 
2209                 cp[2] = (capacity >> 8) & 0xff;
 
2210                 cp[3] = (capacity >> 0) & 0xff;
 
2215                 scsi_sg_copy_from_buffer(scsicmd, cp, sizeof(cp));
 
2216                 /* Do not cache partition table for arrays */
 
2217                 scsicmd->device->removable = 1;
 
2218                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
 
2220                 scsicmd->scsi_done(scsicmd);
 
2228                 int mode_buf_length = 4;
 
2230                 dprintk((KERN_DEBUG "MODE SENSE command.\n"));
 
2231                 mode_buf[0] = 3;        /* Mode data length */
 
2232                 mode_buf[1] = 0;        /* Medium type - default */
 
2233                 mode_buf[2] = 0;        /* Device-specific param,
 
2234                                            bit 8: 0/1 = write enabled/protected
 
2235                                            bit 4: 0/1 = FUA enabled */
 
2236                 if (dev->raw_io_interface && ((aac_cache & 5) != 1))
 
2238                 mode_buf[3] = 0;        /* Block descriptor length */
 
2239                 if (((scsicmd->cmnd[2] & 0x3f) == 8) ||
 
2240                   ((scsicmd->cmnd[2] & 0x3f) == 0x3f)) {
 
2244                         mode_buf[6] = ((aac_cache & 6) == 2)
 
2245                                 ? 0 : 0x04; /* WCE */
 
2246                         mode_buf_length = 7;
 
2247                         if (mode_buf_length > scsicmd->cmnd[4])
 
2248                                 mode_buf_length = scsicmd->cmnd[4];
 
2250                 scsi_sg_copy_from_buffer(scsicmd, mode_buf, mode_buf_length);
 
2251                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
 
2252                 scsicmd->scsi_done(scsicmd);
 
2259                 int mode_buf_length = 8;
 
2261                 dprintk((KERN_DEBUG "MODE SENSE 10 byte command.\n"));
 
2262                 mode_buf[0] = 0;        /* Mode data length (MSB) */
 
2263                 mode_buf[1] = 6;        /* Mode data length (LSB) */
 
2264                 mode_buf[2] = 0;        /* Medium type - default */
 
2265                 mode_buf[3] = 0;        /* Device-specific param,
 
2266                                            bit 8: 0/1 = write enabled/protected
 
2267                                            bit 4: 0/1 = FUA enabled */
 
2268                 if (dev->raw_io_interface && ((aac_cache & 5) != 1))
 
2270                 mode_buf[4] = 0;        /* reserved */
 
2271                 mode_buf[5] = 0;        /* reserved */
 
2272                 mode_buf[6] = 0;        /* Block descriptor length (MSB) */
 
2273                 mode_buf[7] = 0;        /* Block descriptor length (LSB) */
 
2274                 if (((scsicmd->cmnd[2] & 0x3f) == 8) ||
 
2275                   ((scsicmd->cmnd[2] & 0x3f) == 0x3f)) {
 
2279                         mode_buf[10] = ((aac_cache & 6) == 2)
 
2280                                 ? 0 : 0x04; /* WCE */
 
2281                         mode_buf_length = 11;
 
2282                         if (mode_buf_length > scsicmd->cmnd[8])
 
2283                                 mode_buf_length = scsicmd->cmnd[8];
 
2285                 scsi_sg_copy_from_buffer(scsicmd, mode_buf, mode_buf_length);
 
2287                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
 
2288                 scsicmd->scsi_done(scsicmd);
 
2293                 dprintk((KERN_DEBUG "REQUEST SENSE command.\n"));
 
2294                 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data, sizeof (struct sense_data));
 
2295                 memset(&dev->fsa_dev[cid].sense_data, 0, sizeof (struct sense_data));
 
2296                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
 
2297                 scsicmd->scsi_done(scsicmd);
 
2300         case ALLOW_MEDIUM_REMOVAL:
 
2301                 dprintk((KERN_DEBUG "LOCK command.\n"));
 
2302                 if (scsicmd->cmnd[4])
 
2303                         fsa_dev_ptr[cid].locked = 1;
 
2305                         fsa_dev_ptr[cid].locked = 0;
 
2307                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
 
2308                 scsicmd->scsi_done(scsicmd);
 
2311          *      These commands are all No-Ops
 
2313         case TEST_UNIT_READY:
 
2314                 if (fsa_dev_ptr[cid].sense_data.sense_key == NOT_READY) {
 
2315                         scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
 
2316                                 SAM_STAT_CHECK_CONDITION;
 
2317                         set_sense(&dev->fsa_dev[cid].sense_data,
 
2318                                   NOT_READY, SENCODE_BECOMING_READY,
 
2319                                   ASENCODE_BECOMING_READY, 0, 0);
 
2320                         memcpy(scsicmd->sense_buffer,
 
2321                                &dev->fsa_dev[cid].sense_data,
 
2323                                      sizeof(dev->fsa_dev[cid].sense_data),
 
2324                                      SCSI_SENSE_BUFFERSIZE));
 
2325                         scsicmd->scsi_done(scsicmd);
 
2332         case REASSIGN_BLOCKS:
 
2334                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
 
2335                 scsicmd->scsi_done(scsicmd);
 
2339                 return aac_start_stop(scsicmd);
 
2342         switch (scsicmd->cmnd[0])
 
2351                          *      Hack to keep track of ordinal number of the device that
 
2352                          *      corresponds to a container. Needed to convert
 
2353                          *      containers to /dev/sd device names
 
2356                         if (scsicmd->request->rq_disk)
 
2357                                 strlcpy(fsa_dev_ptr[cid].devname,
 
2358                                 scsicmd->request->rq_disk->disk_name,
 
2359                                 min(sizeof(fsa_dev_ptr[cid].devname),
 
2360                                 sizeof(scsicmd->request->rq_disk->disk_name) + 1));
 
2362                         return aac_read(scsicmd);
 
2370                         return aac_write(scsicmd);
 
2372                 case SYNCHRONIZE_CACHE:
 
2373                         if (((aac_cache & 6) == 6) && dev->cache_protected) {
 
2374                                 scsicmd->result = DID_OK << 16 |
 
2375                                         COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
 
2376                                 scsicmd->scsi_done(scsicmd);
 
2379                         /* Issue FIB to tell Firmware to flush it's cache */
 
2380                         if ((aac_cache & 6) != 2)
 
2381                                 return aac_synchronize(scsicmd);
 
2385                          *      Unhandled commands
 
2387                         dprintk((KERN_WARNING "Unhandled SCSI Command: 0x%x.\n", scsicmd->cmnd[0]));
 
2388                         scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
 
2389                         set_sense(&dev->fsa_dev[cid].sense_data,
 
2390                           ILLEGAL_REQUEST, SENCODE_INVALID_COMMAND,
 
2391                           ASENCODE_INVALID_COMMAND, 0, 0);
 
2392                         memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
 
2394                                       sizeof(dev->fsa_dev[cid].sense_data),
 
2395                                       SCSI_SENSE_BUFFERSIZE));
 
2396                         scsicmd->scsi_done(scsicmd);
 
2401 static int query_disk(struct aac_dev *dev, void __user *arg)
 
2403         struct aac_query_disk qd;
 
2404         struct fsa_dev_info *fsa_dev_ptr;
 
2406         fsa_dev_ptr = dev->fsa_dev;
 
2409         if (copy_from_user(&qd, arg, sizeof (struct aac_query_disk)))
 
2413         else if ((qd.bus == -1) && (qd.id == -1) && (qd.lun == -1))
 
2415                 if (qd.cnum < 0 || qd.cnum >= dev->maximum_num_containers)
 
2417                 qd.instance = dev->scsi_host_ptr->host_no;
 
2419                 qd.id = CONTAINER_TO_ID(qd.cnum);
 
2420                 qd.lun = CONTAINER_TO_LUN(qd.cnum);
 
2422         else return -EINVAL;
 
2424         qd.valid = fsa_dev_ptr[qd.cnum].valid != 0;
 
2425         qd.locked = fsa_dev_ptr[qd.cnum].locked;
 
2426         qd.deleted = fsa_dev_ptr[qd.cnum].deleted;
 
2428         if (fsa_dev_ptr[qd.cnum].devname[0] == '\0')
 
2433         strlcpy(qd.name, fsa_dev_ptr[qd.cnum].devname,
 
2434           min(sizeof(qd.name), sizeof(fsa_dev_ptr[qd.cnum].devname) + 1));
 
2436         if (copy_to_user(arg, &qd, sizeof (struct aac_query_disk)))
 
2441 static int force_delete_disk(struct aac_dev *dev, void __user *arg)
 
2443         struct aac_delete_disk dd;
 
2444         struct fsa_dev_info *fsa_dev_ptr;
 
2446         fsa_dev_ptr = dev->fsa_dev;
 
2450         if (copy_from_user(&dd, arg, sizeof (struct aac_delete_disk)))
 
2453         if (dd.cnum >= dev->maximum_num_containers)
 
2456          *      Mark this container as being deleted.
 
2458         fsa_dev_ptr[dd.cnum].deleted = 1;
 
2460          *      Mark the container as no longer valid
 
2462         fsa_dev_ptr[dd.cnum].valid = 0;
 
2466 static int delete_disk(struct aac_dev *dev, void __user *arg)
 
2468         struct aac_delete_disk dd;
 
2469         struct fsa_dev_info *fsa_dev_ptr;
 
2471         fsa_dev_ptr = dev->fsa_dev;
 
2475         if (copy_from_user(&dd, arg, sizeof (struct aac_delete_disk)))
 
2478         if (dd.cnum >= dev->maximum_num_containers)
 
2481          *      If the container is locked, it can not be deleted by the API.
 
2483         if (fsa_dev_ptr[dd.cnum].locked)
 
2487                  *      Mark the container as no longer being valid.
 
2489                 fsa_dev_ptr[dd.cnum].valid = 0;
 
2490                 fsa_dev_ptr[dd.cnum].devname[0] = '\0';
 
2495 int aac_dev_ioctl(struct aac_dev *dev, int cmd, void __user *arg)
 
2498         case FSACTL_QUERY_DISK:
 
2499                 return query_disk(dev, arg);
 
2500         case FSACTL_DELETE_DISK:
 
2501                 return delete_disk(dev, arg);
 
2502         case FSACTL_FORCE_DELETE_DISK:
 
2503                 return force_delete_disk(dev, arg);
 
2504         case FSACTL_GET_CONTAINERS:
 
2505                 return aac_get_containers(dev);
 
2514  * @context: the context set in the fib - here it is scsi cmd
 
2515  * @fibptr: pointer to the fib
 
2517  * Handles the completion of a scsi command to a non dasd device
 
2521 static void aac_srb_callback(void *context, struct fib * fibptr)
 
2523         struct aac_dev *dev;
 
2524         struct aac_srb_reply *srbreply;
 
2525         struct scsi_cmnd *scsicmd;
 
2527         scsicmd = (struct scsi_cmnd *) context;
 
2529         if (!aac_valid_context(scsicmd, fibptr))
 
2532         BUG_ON(fibptr == NULL);
 
2536         srbreply = (struct aac_srb_reply *) fib_data(fibptr);
 
2538         scsicmd->sense_buffer[0] = '\0';  /* Initialize sense valid flag to false */
 
2540          *      Calculate resid for sg
 
2543         scsi_set_resid(scsicmd, scsi_bufflen(scsicmd)
 
2544                        - le32_to_cpu(srbreply->data_xfer_length));
 
2546         scsi_dma_unmap(scsicmd);
 
2549          * First check the fib status
 
2552         if (le32_to_cpu(srbreply->status) != ST_OK){
 
2554                 printk(KERN_WARNING "aac_srb_callback: srb failed, status = %d\n", le32_to_cpu(srbreply->status));
 
2555                 len = min_t(u32, le32_to_cpu(srbreply->sense_data_size),
 
2556                             SCSI_SENSE_BUFFERSIZE);
 
2557                 scsicmd->result = DID_ERROR << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
 
2558                 memcpy(scsicmd->sense_buffer, srbreply->sense_data, len);
 
2562          * Next check the srb status
 
2564         switch( (le32_to_cpu(srbreply->srb_status))&0x3f){
 
2565         case SRB_STATUS_ERROR_RECOVERY:
 
2566         case SRB_STATUS_PENDING:
 
2567         case SRB_STATUS_SUCCESS:
 
2568                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
 
2570         case SRB_STATUS_DATA_OVERRUN:
 
2571                 switch(scsicmd->cmnd[0]){
 
2580                         if (le32_to_cpu(srbreply->data_xfer_length) < scsicmd->underflow) {
 
2581                                 printk(KERN_WARNING"aacraid: SCSI CMD underflow\n");
 
2583                                 printk(KERN_WARNING"aacraid: SCSI CMD Data Overrun\n");
 
2585                         scsicmd->result = DID_ERROR << 16 | COMMAND_COMPLETE << 8;
 
2588                         scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
 
2592                         scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
 
2596         case SRB_STATUS_ABORTED:
 
2597                 scsicmd->result = DID_ABORT << 16 | ABORT << 8;
 
2599         case SRB_STATUS_ABORT_FAILED:
 
2600                 // Not sure about this one - but assuming the hba was trying to abort for some reason
 
2601                 scsicmd->result = DID_ERROR << 16 | ABORT << 8;
 
2603         case SRB_STATUS_PARITY_ERROR:
 
2604                 scsicmd->result = DID_PARITY << 16 | MSG_PARITY_ERROR << 8;
 
2606         case SRB_STATUS_NO_DEVICE:
 
2607         case SRB_STATUS_INVALID_PATH_ID:
 
2608         case SRB_STATUS_INVALID_TARGET_ID:
 
2609         case SRB_STATUS_INVALID_LUN:
 
2610         case SRB_STATUS_SELECTION_TIMEOUT:
 
2611                 scsicmd->result = DID_NO_CONNECT << 16 | COMMAND_COMPLETE << 8;
 
2614         case SRB_STATUS_COMMAND_TIMEOUT:
 
2615         case SRB_STATUS_TIMEOUT:
 
2616                 scsicmd->result = DID_TIME_OUT << 16 | COMMAND_COMPLETE << 8;
 
2619         case SRB_STATUS_BUSY:
 
2620                 scsicmd->result = DID_BUS_BUSY << 16 | COMMAND_COMPLETE << 8;
 
2623         case SRB_STATUS_BUS_RESET:
 
2624                 scsicmd->result = DID_RESET << 16 | COMMAND_COMPLETE << 8;
 
2627         case SRB_STATUS_MESSAGE_REJECTED:
 
2628                 scsicmd->result = DID_ERROR << 16 | MESSAGE_REJECT << 8;
 
2630         case SRB_STATUS_REQUEST_FLUSHED:
 
2631         case SRB_STATUS_ERROR:
 
2632         case SRB_STATUS_INVALID_REQUEST:
 
2633         case SRB_STATUS_REQUEST_SENSE_FAILED:
 
2634         case SRB_STATUS_NO_HBA:
 
2635         case SRB_STATUS_UNEXPECTED_BUS_FREE:
 
2636         case SRB_STATUS_PHASE_SEQUENCE_FAILURE:
 
2637         case SRB_STATUS_BAD_SRB_BLOCK_LENGTH:
 
2638         case SRB_STATUS_DELAYED_RETRY:
 
2639         case SRB_STATUS_BAD_FUNCTION:
 
2640         case SRB_STATUS_NOT_STARTED:
 
2641         case SRB_STATUS_NOT_IN_USE:
 
2642         case SRB_STATUS_FORCE_ABORT:
 
2643         case SRB_STATUS_DOMAIN_VALIDATION_FAIL:
 
2645 #ifdef AAC_DETAILED_STATUS_INFO
 
2646                 printk("aacraid: SRB ERROR(%u) %s scsi cmd 0x%x - scsi status 0x%x\n",
 
2647                         le32_to_cpu(srbreply->srb_status) & 0x3F,
 
2648                         aac_get_status_string(
 
2649                                 le32_to_cpu(srbreply->srb_status) & 0x3F),
 
2651                         le32_to_cpu(srbreply->scsi_status));
 
2653                 scsicmd->result = DID_ERROR << 16 | COMMAND_COMPLETE << 8;
 
2656         if (le32_to_cpu(srbreply->scsi_status) == SAM_STAT_CHECK_CONDITION) {
 
2658                 scsicmd->result |= SAM_STAT_CHECK_CONDITION;
 
2659                 len = min_t(u32, le32_to_cpu(srbreply->sense_data_size),
 
2660                             SCSI_SENSE_BUFFERSIZE);
 
2661 #ifdef AAC_DETAILED_STATUS_INFO
 
2662                 printk(KERN_WARNING "aac_srb_callback: check condition, status = %d len=%d\n",
 
2663                                         le32_to_cpu(srbreply->status), len);
 
2665                 memcpy(scsicmd->sense_buffer, srbreply->sense_data, len);
 
2668          * OR in the scsi status (already shifted up a bit)
 
2670         scsicmd->result |= le32_to_cpu(srbreply->scsi_status);
 
2672         aac_fib_complete(fibptr);
 
2673         aac_fib_free(fibptr);
 
2674         scsicmd->scsi_done(scsicmd);
 
2680  * @scsicmd: the scsi command block
 
2682  * This routine will form a FIB and fill in the aac_srb from the
 
2683  * scsicmd passed in.
 
2686 static int aac_send_srb_fib(struct scsi_cmnd* scsicmd)
 
2688         struct fib* cmd_fibcontext;
 
2689         struct aac_dev* dev;
 
2692         dev = (struct aac_dev *)scsicmd->device->host->hostdata;
 
2693         if (scmd_id(scsicmd) >= dev->maximum_num_physicals ||
 
2694                         scsicmd->device->lun > 7) {
 
2695                 scsicmd->result = DID_NO_CONNECT << 16;
 
2696                 scsicmd->scsi_done(scsicmd);
 
2701          *      Allocate and initialize a Fib then setup a BlockWrite command
 
2703         if (!(cmd_fibcontext = aac_fib_alloc(dev))) {
 
2706         status = aac_adapter_scsi(cmd_fibcontext, scsicmd);
 
2709          *      Check that the command queued to the controller
 
2711         if (status == -EINPROGRESS) {
 
2712                 scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
 
2716         printk(KERN_WARNING "aac_srb: aac_fib_send failed with status: %d\n", status);
 
2717         aac_fib_complete(cmd_fibcontext);
 
2718         aac_fib_free(cmd_fibcontext);
 
2723 static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg)
 
2725         struct aac_dev *dev;
 
2726         unsigned long byte_count = 0;
 
2729         dev = (struct aac_dev *)scsicmd->device->host->hostdata;
 
2730         // Get rid of old data
 
2732         psg->sg[0].addr = 0;
 
2733         psg->sg[0].count = 0;
 
2735         nseg = scsi_dma_map(scsicmd);
 
2738                 struct scatterlist *sg;
 
2741                 psg->count = cpu_to_le32(nseg);
 
2743                 scsi_for_each_sg(scsicmd, sg, nseg, i) {
 
2744                         psg->sg[i].addr = cpu_to_le32(sg_dma_address(sg));
 
2745                         psg->sg[i].count = cpu_to_le32(sg_dma_len(sg));
 
2746                         byte_count += sg_dma_len(sg);
 
2748                 /* hba wants the size to be exact */
 
2749                 if (byte_count > scsi_bufflen(scsicmd)) {
 
2750                         u32 temp = le32_to_cpu(psg->sg[i-1].count) -
 
2751                                 (byte_count - scsi_bufflen(scsicmd));
 
2752                         psg->sg[i-1].count = cpu_to_le32(temp);
 
2753                         byte_count = scsi_bufflen(scsicmd);
 
2755                 /* Check for command underflow */
 
2756                 if(scsicmd->underflow && (byte_count < scsicmd->underflow)){
 
2757                         printk(KERN_WARNING"aacraid: cmd len %08lX cmd underflow %08X\n",
 
2758                                         byte_count, scsicmd->underflow);
 
2765 static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* psg)
 
2767         struct aac_dev *dev;
 
2768         unsigned long byte_count = 0;
 
2772         dev = (struct aac_dev *)scsicmd->device->host->hostdata;
 
2773         // Get rid of old data
 
2775         psg->sg[0].addr[0] = 0;
 
2776         psg->sg[0].addr[1] = 0;
 
2777         psg->sg[0].count = 0;
 
2779         nseg = scsi_dma_map(scsicmd);
 
2782                 struct scatterlist *sg;
 
2785                 scsi_for_each_sg(scsicmd, sg, nseg, i) {
 
2786                         int count = sg_dma_len(sg);
 
2787                         addr = sg_dma_address(sg);
 
2788                         psg->sg[i].addr[0] = cpu_to_le32(addr & 0xffffffff);
 
2789                         psg->sg[i].addr[1] = cpu_to_le32(addr>>32);
 
2790                         psg->sg[i].count = cpu_to_le32(count);
 
2791                         byte_count += count;
 
2793                 psg->count = cpu_to_le32(nseg);
 
2794                 /* hba wants the size to be exact */
 
2795                 if (byte_count > scsi_bufflen(scsicmd)) {
 
2796                         u32 temp = le32_to_cpu(psg->sg[i-1].count) -
 
2797                                 (byte_count - scsi_bufflen(scsicmd));
 
2798                         psg->sg[i-1].count = cpu_to_le32(temp);
 
2799                         byte_count = scsi_bufflen(scsicmd);
 
2801                 /* Check for command underflow */
 
2802                 if(scsicmd->underflow && (byte_count < scsicmd->underflow)){
 
2803                         printk(KERN_WARNING"aacraid: cmd len %08lX cmd underflow %08X\n",
 
2804                                         byte_count, scsicmd->underflow);
 
2810 static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw* psg)
 
2812         unsigned long byte_count = 0;
 
2815         // Get rid of old data
 
2817         psg->sg[0].next = 0;
 
2818         psg->sg[0].prev = 0;
 
2819         psg->sg[0].addr[0] = 0;
 
2820         psg->sg[0].addr[1] = 0;
 
2821         psg->sg[0].count = 0;
 
2822         psg->sg[0].flags = 0;
 
2824         nseg = scsi_dma_map(scsicmd);
 
2827                 struct scatterlist *sg;
 
2830                 scsi_for_each_sg(scsicmd, sg, nseg, i) {
 
2831                         int count = sg_dma_len(sg);
 
2832                         u64 addr = sg_dma_address(sg);
 
2833                         psg->sg[i].next = 0;
 
2834                         psg->sg[i].prev = 0;
 
2835                         psg->sg[i].addr[1] = cpu_to_le32((u32)(addr>>32));
 
2836                         psg->sg[i].addr[0] = cpu_to_le32((u32)(addr & 0xffffffff));
 
2837                         psg->sg[i].count = cpu_to_le32(count);
 
2838                         psg->sg[i].flags = 0;
 
2839                         byte_count += count;
 
2841                 psg->count = cpu_to_le32(nseg);
 
2842                 /* hba wants the size to be exact */
 
2843                 if (byte_count > scsi_bufflen(scsicmd)) {
 
2844                         u32 temp = le32_to_cpu(psg->sg[i-1].count) -
 
2845                                 (byte_count - scsi_bufflen(scsicmd));
 
2846                         psg->sg[i-1].count = cpu_to_le32(temp);
 
2847                         byte_count = scsi_bufflen(scsicmd);
 
2849                 /* Check for command underflow */
 
2850                 if(scsicmd->underflow && (byte_count < scsicmd->underflow)){
 
2851                         printk(KERN_WARNING"aacraid: cmd len %08lX cmd underflow %08X\n",
 
2852                                         byte_count, scsicmd->underflow);
 
2858 #ifdef AAC_DETAILED_STATUS_INFO
 
2860 struct aac_srb_status_info {
 
2866 static struct aac_srb_status_info srb_status_info[] = {
 
2867         { SRB_STATUS_PENDING,           "Pending Status"},
 
2868         { SRB_STATUS_SUCCESS,           "Success"},
 
2869         { SRB_STATUS_ABORTED,           "Aborted Command"},
 
2870         { SRB_STATUS_ABORT_FAILED,      "Abort Failed"},
 
2871         { SRB_STATUS_ERROR,             "Error Event"},
 
2872         { SRB_STATUS_BUSY,              "Device Busy"},
 
2873         { SRB_STATUS_INVALID_REQUEST,   "Invalid Request"},
 
2874         { SRB_STATUS_INVALID_PATH_ID,   "Invalid Path ID"},
 
2875         { SRB_STATUS_NO_DEVICE,         "No Device"},
 
2876         { SRB_STATUS_TIMEOUT,           "Timeout"},
 
2877         { SRB_STATUS_SELECTION_TIMEOUT, "Selection Timeout"},
 
2878         { SRB_STATUS_COMMAND_TIMEOUT,   "Command Timeout"},
 
2879         { SRB_STATUS_MESSAGE_REJECTED,  "Message Rejected"},
 
2880         { SRB_STATUS_BUS_RESET,         "Bus Reset"},
 
2881         { SRB_STATUS_PARITY_ERROR,      "Parity Error"},
 
2882         { SRB_STATUS_REQUEST_SENSE_FAILED,"Request Sense Failed"},
 
2883         { SRB_STATUS_NO_HBA,            "No HBA"},
 
2884         { SRB_STATUS_DATA_OVERRUN,      "Data Overrun/Data Underrun"},
 
2885         { SRB_STATUS_UNEXPECTED_BUS_FREE,"Unexpected Bus Free"},
 
2886         { SRB_STATUS_PHASE_SEQUENCE_FAILURE,"Phase Error"},
 
2887         { SRB_STATUS_BAD_SRB_BLOCK_LENGTH,"Bad Srb Block Length"},
 
2888         { SRB_STATUS_REQUEST_FLUSHED,   "Request Flushed"},
 
2889         { SRB_STATUS_DELAYED_RETRY,     "Delayed Retry"},
 
2890         { SRB_STATUS_INVALID_LUN,       "Invalid LUN"},
 
2891         { SRB_STATUS_INVALID_TARGET_ID, "Invalid TARGET ID"},
 
2892         { SRB_STATUS_BAD_FUNCTION,      "Bad Function"},
 
2893         { SRB_STATUS_ERROR_RECOVERY,    "Error Recovery"},
 
2894         { SRB_STATUS_NOT_STARTED,       "Not Started"},
 
2895         { SRB_STATUS_NOT_IN_USE,        "Not In Use"},
 
2896         { SRB_STATUS_FORCE_ABORT,       "Force Abort"},
 
2897         { SRB_STATUS_DOMAIN_VALIDATION_FAIL,"Domain Validation Failure"},
 
2898         { 0xff,                         "Unknown Error"}
 
2901 char *aac_get_status_string(u32 status)
 
2905         for (i = 0; i < ARRAY_SIZE(srb_status_info); i++)
 
2906                 if (srb_status_info[i].status == status)
 
2907                         return srb_status_info[i].str;
 
2909         return "Bad Status Code";