linux/drivers/block/DAC960.c
<<
>>
Prefs
   1/*
   2
   3  Linux Driver for Mylex DAC960/AcceleRAID/eXtremeRAID PCI RAID Controllers
   4
   5  Copyright 1998-2001 by Leonard N. Zubkoff <lnz@dandelion.com>
   6  Portions Copyright 2002 by Mylex (An IBM Business Unit)
   7
   8  This program is free software; you may redistribute and/or modify it under
   9  the terms of the GNU General Public License Version 2 as published by the
  10  Free Software Foundation.
  11
  12  This program is distributed in the hope that it will be useful, but
  13  WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
  14  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  15  for complete details.
  16
  17*/
  18
  19
  20#define DAC960_DriverVersion                    "2.5.49"
  21#define DAC960_DriverDate                       "21 Aug 2007"
  22
  23
  24#include <linux/module.h>
  25#include <linux/types.h>
  26#include <linux/miscdevice.h>
  27#include <linux/blkdev.h>
  28#include <linux/bio.h>
  29#include <linux/completion.h>
  30#include <linux/delay.h>
  31#include <linux/genhd.h>
  32#include <linux/hdreg.h>
  33#include <linux/blkpg.h>
  34#include <linux/dma-mapping.h>
  35#include <linux/interrupt.h>
  36#include <linux/ioport.h>
  37#include <linux/mm.h>
  38#include <linux/slab.h>
  39#include <linux/mutex.h>
  40#include <linux/proc_fs.h>
  41#include <linux/seq_file.h>
  42#include <linux/reboot.h>
  43#include <linux/spinlock.h>
  44#include <linux/timer.h>
  45#include <linux/pci.h>
  46#include <linux/init.h>
  47#include <linux/jiffies.h>
  48#include <linux/random.h>
  49#include <linux/scatterlist.h>
  50#include <asm/io.h>
  51#include <asm/uaccess.h>
  52#include "DAC960.h"
  53
  54#define DAC960_GAM_MINOR        252
  55
  56
  57static DEFINE_MUTEX(DAC960_mutex);
  58static DAC960_Controller_T *DAC960_Controllers[DAC960_MaxControllers];
  59static int DAC960_ControllerCount;
  60static struct proc_dir_entry *DAC960_ProcDirectoryEntry;
  61
  62static long disk_size(DAC960_Controller_T *p, int drive_nr)
  63{
  64        if (p->FirmwareType == DAC960_V1_Controller) {
  65                if (drive_nr >= p->LogicalDriveCount)
  66                        return 0;
  67                return p->V1.LogicalDriveInformation[drive_nr].
  68                        LogicalDriveSize;
  69        } else {
  70                DAC960_V2_LogicalDeviceInfo_T *i =
  71                        p->V2.LogicalDeviceInformation[drive_nr];
  72                if (i == NULL)
  73                        return 0;
  74                return i->ConfigurableDeviceSize;
  75        }
  76}
  77
  78static int DAC960_open(struct block_device *bdev, fmode_t mode)
  79{
  80        struct gendisk *disk = bdev->bd_disk;
  81        DAC960_Controller_T *p = disk->queue->queuedata;
  82        int drive_nr = (long)disk->private_data;
  83        int ret = -ENXIO;
  84
  85        mutex_lock(&DAC960_mutex);
  86        if (p->FirmwareType == DAC960_V1_Controller) {
  87                if (p->V1.LogicalDriveInformation[drive_nr].
  88                    LogicalDriveState == DAC960_V1_LogicalDrive_Offline)
  89                        goto out;
  90        } else {
  91                DAC960_V2_LogicalDeviceInfo_T *i =
  92                        p->V2.LogicalDeviceInformation[drive_nr];
  93                if (!i || i->LogicalDeviceState == DAC960_V2_LogicalDevice_Offline)
  94                        goto out;
  95        }
  96
  97        check_disk_change(bdev);
  98
  99        if (!get_capacity(p->disks[drive_nr]))
 100                goto out;
 101        ret = 0;
 102out:
 103        mutex_unlock(&DAC960_mutex);
 104        return ret;
 105}
 106
 107static int DAC960_getgeo(struct block_device *bdev, struct hd_geometry *geo)
 108{
 109        struct gendisk *disk = bdev->bd_disk;
 110        DAC960_Controller_T *p = disk->queue->queuedata;
 111        int drive_nr = (long)disk->private_data;
 112
 113        if (p->FirmwareType == DAC960_V1_Controller) {
 114                geo->heads = p->V1.GeometryTranslationHeads;
 115                geo->sectors = p->V1.GeometryTranslationSectors;
 116                geo->cylinders = p->V1.LogicalDriveInformation[drive_nr].
 117                        LogicalDriveSize / (geo->heads * geo->sectors);
 118        } else {
 119                DAC960_V2_LogicalDeviceInfo_T *i =
 120                        p->V2.LogicalDeviceInformation[drive_nr];
 121                switch (i->DriveGeometry) {
 122                case DAC960_V2_Geometry_128_32:
 123                        geo->heads = 128;
 124                        geo->sectors = 32;
 125                        break;
 126                case DAC960_V2_Geometry_255_63:
 127                        geo->heads = 255;
 128                        geo->sectors = 63;
 129                        break;
 130                default:
 131                        DAC960_Error("Illegal Logical Device Geometry %d\n",
 132                                        p, i->DriveGeometry);
 133                        return -EINVAL;
 134                }
 135
 136                geo->cylinders = i->ConfigurableDeviceSize /
 137                        (geo->heads * geo->sectors);
 138        }
 139        
 140        return 0;
 141}
 142
 143static unsigned int DAC960_check_events(struct gendisk *disk,
 144                                        unsigned int clearing)
 145{
 146        DAC960_Controller_T *p = disk->queue->queuedata;
 147        int drive_nr = (long)disk->private_data;
 148
 149        if (!p->LogicalDriveInitiallyAccessible[drive_nr])
 150                return DISK_EVENT_MEDIA_CHANGE;
 151        return 0;
 152}
 153
 154static int DAC960_revalidate_disk(struct gendisk *disk)
 155{
 156        DAC960_Controller_T *p = disk->queue->queuedata;
 157        int unit = (long)disk->private_data;
 158
 159        set_capacity(disk, disk_size(p, unit));
 160        return 0;
 161}
 162
 163static const struct block_device_operations DAC960_BlockDeviceOperations = {
 164        .owner                  = THIS_MODULE,
 165        .open                   = DAC960_open,
 166        .getgeo                 = DAC960_getgeo,
 167        .check_events           = DAC960_check_events,
 168        .revalidate_disk        = DAC960_revalidate_disk,
 169};
 170
 171
 172/*
 173  DAC960_AnnounceDriver announces the Driver Version and Date, Author's Name,
 174  Copyright Notice, and Electronic Mail Address.
 175*/
 176
 177static void DAC960_AnnounceDriver(DAC960_Controller_T *Controller)
 178{
 179  DAC960_Announce("***** DAC960 RAID Driver Version "
 180                  DAC960_DriverVersion " of "
 181                  DAC960_DriverDate " *****\n", Controller);
 182  DAC960_Announce("Copyright 1998-2001 by Leonard N. Zubkoff "
 183                  "<lnz@dandelion.com>\n", Controller);
 184}
 185
 186
 187/*
 188  DAC960_Failure prints a standardized error message, and then returns false.
 189*/
 190
 191static bool DAC960_Failure(DAC960_Controller_T *Controller,
 192                              unsigned char *ErrorMessage)
 193{
 194  DAC960_Error("While configuring DAC960 PCI RAID Controller at\n",
 195               Controller);
 196  if (Controller->IO_Address == 0)
 197    DAC960_Error("PCI Bus %d Device %d Function %d I/O Address N/A "
 198                 "PCI Address 0x%X\n", Controller,
 199                 Controller->Bus, Controller->Device,
 200                 Controller->Function, Controller->PCI_Address);
 201  else DAC960_Error("PCI Bus %d Device %d Function %d I/O Address "
 202                    "0x%X PCI Address 0x%X\n", Controller,
 203                    Controller->Bus, Controller->Device,
 204                    Controller->Function, Controller->IO_Address,
 205                    Controller->PCI_Address);
 206  DAC960_Error("%s FAILED - DETACHING\n", Controller, ErrorMessage);
 207  return false;
 208}
 209
 210/*
 211  init_dma_loaf() and slice_dma_loaf() are helper functions for
 212  aggregating the dma-mapped memory for a well-known collection of
 213  data structures that are of different lengths.
 214
 215  These routines don't guarantee any alignment.  The caller must
 216  include any space needed for alignment in the sizes of the structures
 217  that are passed in.
 218 */
 219
 220static bool init_dma_loaf(struct pci_dev *dev, struct dma_loaf *loaf,
 221                                                                 size_t len)
 222{
 223        void *cpu_addr;
 224        dma_addr_t dma_handle;
 225
 226        cpu_addr = pci_alloc_consistent(dev, len, &dma_handle);
 227        if (cpu_addr == NULL)
 228                return false;
 229        
 230        loaf->cpu_free = loaf->cpu_base = cpu_addr;
 231        loaf->dma_free =loaf->dma_base = dma_handle;
 232        loaf->length = len;
 233        memset(cpu_addr, 0, len);
 234        return true;
 235}
 236
 237static void *slice_dma_loaf(struct dma_loaf *loaf, size_t len,
 238                                        dma_addr_t *dma_handle)
 239{
 240        void *cpu_end = loaf->cpu_free + len;
 241        void *cpu_addr = loaf->cpu_free;
 242
 243        BUG_ON(cpu_end > loaf->cpu_base + loaf->length);
 244        *dma_handle = loaf->dma_free;
 245        loaf->cpu_free = cpu_end;
 246        loaf->dma_free += len;
 247        return cpu_addr;
 248}
 249
 250static void free_dma_loaf(struct pci_dev *dev, struct dma_loaf *loaf_handle)
 251{
 252        if (loaf_handle->cpu_base != NULL)
 253                pci_free_consistent(dev, loaf_handle->length,
 254                        loaf_handle->cpu_base, loaf_handle->dma_base);
 255}
 256
 257
 258/*
 259  DAC960_CreateAuxiliaryStructures allocates and initializes the auxiliary
 260  data structures for Controller.  It returns true on success and false on
 261  failure.
 262*/
 263
 264static bool DAC960_CreateAuxiliaryStructures(DAC960_Controller_T *Controller)
 265{
 266  int CommandAllocationLength, CommandAllocationGroupSize;
 267  int CommandsRemaining = 0, CommandIdentifier, CommandGroupByteCount;
 268  void *AllocationPointer = NULL;
 269  void *ScatterGatherCPU = NULL;
 270  dma_addr_t ScatterGatherDMA;
 271  struct pci_pool *ScatterGatherPool;
 272  void *RequestSenseCPU = NULL;
 273  dma_addr_t RequestSenseDMA;
 274  struct pci_pool *RequestSensePool = NULL;
 275
 276  if (Controller->FirmwareType == DAC960_V1_Controller)
 277    {
 278      CommandAllocationLength = offsetof(DAC960_Command_T, V1.EndMarker);
 279      CommandAllocationGroupSize = DAC960_V1_CommandAllocationGroupSize;
 280      ScatterGatherPool = pci_pool_create("DAC960_V1_ScatterGather",
 281                Controller->PCIDevice,
 282        DAC960_V1_ScatterGatherLimit * sizeof(DAC960_V1_ScatterGatherSegment_T),
 283        sizeof(DAC960_V1_ScatterGatherSegment_T), 0);
 284      if (ScatterGatherPool == NULL)
 285            return DAC960_Failure(Controller,
 286                        "AUXILIARY STRUCTURE CREATION (SG)");
 287      Controller->ScatterGatherPool = ScatterGatherPool;
 288    }
 289  else
 290    {
 291      CommandAllocationLength = offsetof(DAC960_Command_T, V2.EndMarker);
 292      CommandAllocationGroupSize = DAC960_V2_CommandAllocationGroupSize;
 293      ScatterGatherPool = pci_pool_create("DAC960_V2_ScatterGather",
 294                Controller->PCIDevice,
 295        DAC960_V2_ScatterGatherLimit * sizeof(DAC960_V2_ScatterGatherSegment_T),
 296        sizeof(DAC960_V2_ScatterGatherSegment_T), 0);
 297      if (ScatterGatherPool == NULL)
 298            return DAC960_Failure(Controller,
 299                        "AUXILIARY STRUCTURE CREATION (SG)");
 300      RequestSensePool = pci_pool_create("DAC960_V2_RequestSense",
 301                Controller->PCIDevice, sizeof(DAC960_SCSI_RequestSense_T),
 302                sizeof(int), 0);
 303      if (RequestSensePool == NULL) {
 304            pci_pool_destroy(ScatterGatherPool);
 305            return DAC960_Failure(Controller,
 306                        "AUXILIARY STRUCTURE CREATION (SG)");
 307      }
 308      Controller->ScatterGatherPool = ScatterGatherPool;
 309      Controller->V2.RequestSensePool = RequestSensePool;
 310    }
 311  Controller->CommandAllocationGroupSize = CommandAllocationGroupSize;
 312  Controller->FreeCommands = NULL;
 313  for (CommandIdentifier = 1;
 314       CommandIdentifier <= Controller->DriverQueueDepth;
 315       CommandIdentifier++)
 316    {
 317      DAC960_Command_T *Command;
 318      if (--CommandsRemaining <= 0)
 319        {
 320          CommandsRemaining =
 321                Controller->DriverQueueDepth - CommandIdentifier + 1;
 322          if (CommandsRemaining > CommandAllocationGroupSize)
 323                CommandsRemaining = CommandAllocationGroupSize;
 324          CommandGroupByteCount =
 325                CommandsRemaining * CommandAllocationLength;
 326          AllocationPointer = kzalloc(CommandGroupByteCount, GFP_ATOMIC);
 327          if (AllocationPointer == NULL)
 328                return DAC960_Failure(Controller,
 329                                        "AUXILIARY STRUCTURE CREATION");
 330         }
 331      Command = (DAC960_Command_T *) AllocationPointer;
 332      AllocationPointer += CommandAllocationLength;
 333      Command->CommandIdentifier = CommandIdentifier;
 334      Command->Controller = Controller;
 335      Command->Next = Controller->FreeCommands;
 336      Controller->FreeCommands = Command;
 337      Controller->Commands[CommandIdentifier-1] = Command;
 338      ScatterGatherCPU = pci_pool_alloc(ScatterGatherPool, GFP_ATOMIC,
 339                                                        &ScatterGatherDMA);
 340      if (ScatterGatherCPU == NULL)
 341          return DAC960_Failure(Controller, "AUXILIARY STRUCTURE CREATION");
 342
 343      if (RequestSensePool != NULL) {
 344          RequestSenseCPU = pci_pool_alloc(RequestSensePool, GFP_ATOMIC,
 345                                                &RequestSenseDMA);
 346          if (RequestSenseCPU == NULL) {
 347                pci_pool_free(ScatterGatherPool, ScatterGatherCPU,
 348                                ScatterGatherDMA);
 349                return DAC960_Failure(Controller,
 350                                        "AUXILIARY STRUCTURE CREATION");
 351          }
 352        }
 353     if (Controller->FirmwareType == DAC960_V1_Controller) {
 354        Command->cmd_sglist = Command->V1.ScatterList;
 355        Command->V1.ScatterGatherList =
 356                (DAC960_V1_ScatterGatherSegment_T *)ScatterGatherCPU;
 357        Command->V1.ScatterGatherListDMA = ScatterGatherDMA;
 358        sg_init_table(Command->cmd_sglist, DAC960_V1_ScatterGatherLimit);
 359      } else {
 360        Command->cmd_sglist = Command->V2.ScatterList;
 361        Command->V2.ScatterGatherList =
 362                (DAC960_V2_ScatterGatherSegment_T *)ScatterGatherCPU;
 363        Command->V2.ScatterGatherListDMA = ScatterGatherDMA;
 364        Command->V2.RequestSense =
 365                                (DAC960_SCSI_RequestSense_T *)RequestSenseCPU;
 366        Command->V2.RequestSenseDMA = RequestSenseDMA;
 367        sg_init_table(Command->cmd_sglist, DAC960_V2_ScatterGatherLimit);
 368      }
 369    }
 370  return true;
 371}
 372
 373
 374/*
 375  DAC960_DestroyAuxiliaryStructures deallocates the auxiliary data
 376  structures for Controller.
 377*/
 378
 379static void DAC960_DestroyAuxiliaryStructures(DAC960_Controller_T *Controller)
 380{
 381  int i;
 382  struct pci_pool *ScatterGatherPool = Controller->ScatterGatherPool;
 383  struct pci_pool *RequestSensePool = NULL;
 384  void *ScatterGatherCPU;
 385  dma_addr_t ScatterGatherDMA;
 386  void *RequestSenseCPU;
 387  dma_addr_t RequestSenseDMA;
 388  DAC960_Command_T *CommandGroup = NULL;
 389  
 390
 391  if (Controller->FirmwareType == DAC960_V2_Controller)
 392        RequestSensePool = Controller->V2.RequestSensePool;
 393
 394  Controller->FreeCommands = NULL;
 395  for (i = 0; i < Controller->DriverQueueDepth; i++)
 396    {
 397      DAC960_Command_T *Command = Controller->Commands[i];
 398
 399      if (Command == NULL)
 400          continue;
 401
 402      if (Controller->FirmwareType == DAC960_V1_Controller) {
 403          ScatterGatherCPU = (void *)Command->V1.ScatterGatherList;
 404          ScatterGatherDMA = Command->V1.ScatterGatherListDMA;
 405          RequestSenseCPU = NULL;
 406          RequestSenseDMA = (dma_addr_t)0;
 407      } else {
 408          ScatterGatherCPU = (void *)Command->V2.ScatterGatherList;
 409          ScatterGatherDMA = Command->V2.ScatterGatherListDMA;
 410          RequestSenseCPU = (void *)Command->V2.RequestSense;
 411          RequestSenseDMA = Command->V2.RequestSenseDMA;
 412      }
 413      if (ScatterGatherCPU != NULL)
 414          pci_pool_free(ScatterGatherPool, ScatterGatherCPU, ScatterGatherDMA);
 415      if (RequestSenseCPU != NULL)
 416          pci_pool_free(RequestSensePool, RequestSenseCPU, RequestSenseDMA);
 417
 418      if ((Command->CommandIdentifier
 419           % Controller->CommandAllocationGroupSize) == 1) {
 420           /*
 421            * We can't free the group of commands until all of the
 422            * request sense and scatter gather dma structures are free.
 423            * Remember the beginning of the group, but don't free it
 424            * until we've reached the beginning of the next group.
 425            */
 426           kfree(CommandGroup);
 427           CommandGroup = Command;
 428      }
 429      Controller->Commands[i] = NULL;
 430    }
 431  kfree(CommandGroup);
 432
 433  if (Controller->CombinedStatusBuffer != NULL)
 434    {
 435      kfree(Controller->CombinedStatusBuffer);
 436      Controller->CombinedStatusBuffer = NULL;
 437      Controller->CurrentStatusBuffer = NULL;
 438    }
 439
 440  if (ScatterGatherPool != NULL)
 441        pci_pool_destroy(ScatterGatherPool);
 442  if (Controller->FirmwareType == DAC960_V1_Controller)
 443        return;
 444
 445  if (RequestSensePool != NULL)
 446        pci_pool_destroy(RequestSensePool);
 447
 448  for (i = 0; i < DAC960_MaxLogicalDrives; i++) {
 449        kfree(Controller->V2.LogicalDeviceInformation[i]);
 450        Controller->V2.LogicalDeviceInformation[i] = NULL;
 451  }
 452
 453  for (i = 0; i < DAC960_V2_MaxPhysicalDevices; i++)
 454    {
 455      kfree(Controller->V2.PhysicalDeviceInformation[i]);
 456      Controller->V2.PhysicalDeviceInformation[i] = NULL;
 457      kfree(Controller->V2.InquiryUnitSerialNumber[i]);
 458      Controller->V2.InquiryUnitSerialNumber[i] = NULL;
 459    }
 460}
 461
 462
 463/*
 464  DAC960_V1_ClearCommand clears critical fields of Command for DAC960 V1
 465  Firmware Controllers.
 466*/
 467
 468static inline void DAC960_V1_ClearCommand(DAC960_Command_T *Command)
 469{
 470  DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
 471  memset(CommandMailbox, 0, sizeof(DAC960_V1_CommandMailbox_T));
 472  Command->V1.CommandStatus = 0;
 473}
 474
 475
 476/*
 477  DAC960_V2_ClearCommand clears critical fields of Command for DAC960 V2
 478  Firmware Controllers.
 479*/
 480
 481static inline void DAC960_V2_ClearCommand(DAC960_Command_T *Command)
 482{
 483  DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
 484  memset(CommandMailbox, 0, sizeof(DAC960_V2_CommandMailbox_T));
 485  Command->V2.CommandStatus = 0;
 486}
 487
 488
 489/*
 490  DAC960_AllocateCommand allocates a Command structure from Controller's
 491  free list.  During driver initialization, a special initialization command
 492  has been placed on the free list to guarantee that command allocation can
 493  never fail.
 494*/
 495
 496static inline DAC960_Command_T *DAC960_AllocateCommand(DAC960_Controller_T
 497                                                       *Controller)
 498{
 499  DAC960_Command_T *Command = Controller->FreeCommands;
 500  if (Command == NULL) return NULL;
 501  Controller->FreeCommands = Command->Next;
 502  Command->Next = NULL;
 503  return Command;
 504}
 505
 506
 507/*
 508  DAC960_DeallocateCommand deallocates Command, returning it to Controller's
 509  free list.
 510*/
 511
 512static inline void DAC960_DeallocateCommand(DAC960_Command_T *Command)
 513{
 514  DAC960_Controller_T *Controller = Command->Controller;
 515
 516  Command->Request = NULL;
 517  Command->Next = Controller->FreeCommands;
 518  Controller->FreeCommands = Command;
 519}
 520
 521
 522/*
 523  DAC960_WaitForCommand waits for a wake_up on Controller's Command Wait Queue.
 524*/
 525
 526static void DAC960_WaitForCommand(DAC960_Controller_T *Controller)
 527{
 528  spin_unlock_irq(&Controller->queue_lock);
 529  __wait_event(Controller->CommandWaitQueue, Controller->FreeCommands);
 530  spin_lock_irq(&Controller->queue_lock);
 531}
 532
 533/*
 534  DAC960_GEM_QueueCommand queues Command for DAC960 GEM Series Controllers.
 535*/
 536
 537static void DAC960_GEM_QueueCommand(DAC960_Command_T *Command)
 538{
 539  DAC960_Controller_T *Controller = Command->Controller;
 540  void __iomem *ControllerBaseAddress = Controller->BaseAddress;
 541  DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
 542  DAC960_V2_CommandMailbox_T *NextCommandMailbox =
 543      Controller->V2.NextCommandMailbox;
 544
 545  CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier;
 546  DAC960_GEM_WriteCommandMailbox(NextCommandMailbox, CommandMailbox);
 547
 548  if (Controller->V2.PreviousCommandMailbox1->Words[0] == 0 ||
 549      Controller->V2.PreviousCommandMailbox2->Words[0] == 0)
 550      DAC960_GEM_MemoryMailboxNewCommand(ControllerBaseAddress);
 551
 552  Controller->V2.PreviousCommandMailbox2 =
 553      Controller->V2.PreviousCommandMailbox1;
 554  Controller->V2.PreviousCommandMailbox1 = NextCommandMailbox;
 555
 556  if (++NextCommandMailbox > Controller->V2.LastCommandMailbox)
 557      NextCommandMailbox = Controller->V2.FirstCommandMailbox;
 558
 559  Controller->V2.NextCommandMailbox = NextCommandMailbox;
 560}
 561
 562/*
 563  DAC960_BA_QueueCommand queues Command for DAC960 BA Series Controllers.
 564*/
 565
 566static void DAC960_BA_QueueCommand(DAC960_Command_T *Command)
 567{
 568  DAC960_Controller_T *Controller = Command->Controller;
 569  void __iomem *ControllerBaseAddress = Controller->BaseAddress;
 570  DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
 571  DAC960_V2_CommandMailbox_T *NextCommandMailbox =
 572    Controller->V2.NextCommandMailbox;
 573  CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier;
 574  DAC960_BA_WriteCommandMailbox(NextCommandMailbox, CommandMailbox);
 575  if (Controller->V2.PreviousCommandMailbox1->Words[0] == 0 ||
 576      Controller->V2.PreviousCommandMailbox2->Words[0] == 0)
 577    DAC960_BA_MemoryMailboxNewCommand(ControllerBaseAddress);
 578  Controller->V2.PreviousCommandMailbox2 =
 579    Controller->V2.PreviousCommandMailbox1;
 580  Controller->V2.PreviousCommandMailbox1 = NextCommandMailbox;
 581  if (++NextCommandMailbox > Controller->V2.LastCommandMailbox)
 582    NextCommandMailbox = Controller->V2.FirstCommandMailbox;
 583  Controller->V2.NextCommandMailbox = NextCommandMailbox;
 584}
 585
 586
 587/*
 588  DAC960_LP_QueueCommand queues Command for DAC960 LP Series Controllers.
 589*/
 590
 591static void DAC960_LP_QueueCommand(DAC960_Command_T *Command)
 592{
 593  DAC960_Controller_T *Controller = Command->Controller;
 594  void __iomem *ControllerBaseAddress = Controller->BaseAddress;
 595  DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
 596  DAC960_V2_CommandMailbox_T *NextCommandMailbox =
 597    Controller->V2.NextCommandMailbox;
 598  CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier;
 599  DAC960_LP_WriteCommandMailbox(NextCommandMailbox, CommandMailbox);
 600  if (Controller->V2.PreviousCommandMailbox1->Words[0] == 0 ||
 601      Controller->V2.PreviousCommandMailbox2->Words[0] == 0)
 602    DAC960_LP_MemoryMailboxNewCommand(ControllerBaseAddress);
 603  Controller->V2.PreviousCommandMailbox2 =
 604    Controller->V2.PreviousCommandMailbox1;
 605  Controller->V2.PreviousCommandMailbox1 = NextCommandMailbox;
 606  if (++NextCommandMailbox > Controller->V2.LastCommandMailbox)
 607    NextCommandMailbox = Controller->V2.FirstCommandMailbox;
 608  Controller->V2.NextCommandMailbox = NextCommandMailbox;
 609}
 610
 611
 612/*
 613  DAC960_LA_QueueCommandDualMode queues Command for DAC960 LA Series
 614  Controllers with Dual Mode Firmware.
 615*/
 616
 617static void DAC960_LA_QueueCommandDualMode(DAC960_Command_T *Command)
 618{
 619  DAC960_Controller_T *Controller = Command->Controller;
 620  void __iomem *ControllerBaseAddress = Controller->BaseAddress;
 621  DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
 622  DAC960_V1_CommandMailbox_T *NextCommandMailbox =
 623    Controller->V1.NextCommandMailbox;
 624  CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier;
 625  DAC960_LA_WriteCommandMailbox(NextCommandMailbox, CommandMailbox);
 626  if (Controller->V1.PreviousCommandMailbox1->Words[0] == 0 ||
 627      Controller->V1.PreviousCommandMailbox2->Words[0] == 0)
 628    DAC960_LA_MemoryMailboxNewCommand(ControllerBaseAddress);
 629  Controller->V1.PreviousCommandMailbox2 =
 630    Controller->V1.PreviousCommandMailbox1;
 631  Controller->V1.PreviousCommandMailbox1 = NextCommandMailbox;
 632  if (++NextCommandMailbox > Controller->V1.LastCommandMailbox)
 633    NextCommandMailbox = Controller->V1.FirstCommandMailbox;
 634  Controller->V1.NextCommandMailbox = NextCommandMailbox;
 635}
 636
 637
 638/*
 639  DAC960_LA_QueueCommandSingleMode queues Command for DAC960 LA Series
 640  Controllers with Single Mode Firmware.
 641*/
 642
 643static void DAC960_LA_QueueCommandSingleMode(DAC960_Command_T *Command)
 644{
 645  DAC960_Controller_T *Controller = Command->Controller;
 646  void __iomem *ControllerBaseAddress = Controller->BaseAddress;
 647  DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
 648  DAC960_V1_CommandMailbox_T *NextCommandMailbox =
 649    Controller->V1.NextCommandMailbox;
 650  CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier;
 651  DAC960_LA_WriteCommandMailbox(NextCommandMailbox, CommandMailbox);
 652  if (Controller->V1.PreviousCommandMailbox1->Words[0] == 0 ||
 653      Controller->V1.PreviousCommandMailbox2->Words[0] == 0)
 654    DAC960_LA_HardwareMailboxNewCommand(ControllerBaseAddress);
 655  Controller->V1.PreviousCommandMailbox2 =
 656    Controller->V1.PreviousCommandMailbox1;
 657  Controller->V1.PreviousCommandMailbox1 = NextCommandMailbox;
 658  if (++NextCommandMailbox > Controller->V1.LastCommandMailbox)
 659    NextCommandMailbox = Controller->V1.FirstCommandMailbox;
 660  Controller->V1.NextCommandMailbox = NextCommandMailbox;
 661}
 662
 663
 664/*
 665  DAC960_PG_QueueCommandDualMode queues Command for DAC960 PG Series
 666  Controllers with Dual Mode Firmware.
 667*/
 668
 669static void DAC960_PG_QueueCommandDualMode(DAC960_Command_T *Command)
 670{
 671  DAC960_Controller_T *Controller = Command->Controller;
 672  void __iomem *ControllerBaseAddress = Controller->BaseAddress;
 673  DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
 674  DAC960_V1_CommandMailbox_T *NextCommandMailbox =
 675    Controller->V1.NextCommandMailbox;
 676  CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier;
 677  DAC960_PG_WriteCommandMailbox(NextCommandMailbox, CommandMailbox);
 678  if (Controller->V1.PreviousCommandMailbox1->Words[0] == 0 ||
 679      Controller->V1.PreviousCommandMailbox2->Words[0] == 0)
 680    DAC960_PG_MemoryMailboxNewCommand(ControllerBaseAddress);
 681  Controller->V1.PreviousCommandMailbox2 =
 682    Controller->V1.PreviousCommandMailbox1;
 683  Controller->V1.PreviousCommandMailbox1 = NextCommandMailbox;
 684  if (++NextCommandMailbox > Controller->V1.LastCommandMailbox)
 685    NextCommandMailbox = Controller->V1.FirstCommandMailbox;
 686  Controller->V1.NextCommandMailbox = NextCommandMailbox;
 687}
 688
 689
 690/*
 691  DAC960_PG_QueueCommandSingleMode queues Command for DAC960 PG Series
 692  Controllers with Single Mode Firmware.
 693*/
 694
 695static void DAC960_PG_QueueCommandSingleMode(DAC960_Command_T *Command)
 696{
 697  DAC960_Controller_T *Controller = Command->Controller;
 698  void __iomem *ControllerBaseAddress = Controller->BaseAddress;
 699  DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
 700  DAC960_V1_CommandMailbox_T *NextCommandMailbox =
 701    Controller->V1.NextCommandMailbox;
 702  CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier;
 703  DAC960_PG_WriteCommandMailbox(NextCommandMailbox, CommandMailbox);
 704  if (Controller->V1.PreviousCommandMailbox1->Words[0] == 0 ||
 705      Controller->V1.PreviousCommandMailbox2->Words[0] == 0)
 706    DAC960_PG_HardwareMailboxNewCommand(ControllerBaseAddress);
 707  Controller->V1.PreviousCommandMailbox2 =
 708    Controller->V1.PreviousCommandMailbox1;
 709  Controller->V1.PreviousCommandMailbox1 = NextCommandMailbox;
 710  if (++NextCommandMailbox > Controller->V1.LastCommandMailbox)
 711    NextCommandMailbox = Controller->V1.FirstCommandMailbox;
 712  Controller->V1.NextCommandMailbox = NextCommandMailbox;
 713}
 714
 715
 716/*
 717  DAC960_PD_QueueCommand queues Command for DAC960 PD Series Controllers.
 718*/
 719
 720static void DAC960_PD_QueueCommand(DAC960_Command_T *Command)
 721{
 722  DAC960_Controller_T *Controller = Command->Controller;
 723  void __iomem *ControllerBaseAddress = Controller->BaseAddress;
 724  DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
 725  CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier;
 726  while (DAC960_PD_MailboxFullP(ControllerBaseAddress))
 727    udelay(1);
 728  DAC960_PD_WriteCommandMailbox(ControllerBaseAddress, CommandMailbox);
 729  DAC960_PD_NewCommand(ControllerBaseAddress);
 730}
 731
 732
 733/*
 734  DAC960_P_QueueCommand queues Command for DAC960 P Series Controllers.
 735*/
 736
 737static void DAC960_P_QueueCommand(DAC960_Command_T *Command)
 738{
 739  DAC960_Controller_T *Controller = Command->Controller;
 740  void __iomem *ControllerBaseAddress = Controller->BaseAddress;
 741  DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
 742  CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier;
 743  switch (CommandMailbox->Common.CommandOpcode)
 744    {
 745    case DAC960_V1_Enquiry:
 746      CommandMailbox->Common.CommandOpcode = DAC960_V1_Enquiry_Old;
 747      break;
 748    case DAC960_V1_GetDeviceState:
 749      CommandMailbox->Common.CommandOpcode = DAC960_V1_GetDeviceState_Old;
 750      break;
 751    case DAC960_V1_Read:
 752      CommandMailbox->Common.CommandOpcode = DAC960_V1_Read_Old;
 753      DAC960_PD_To_P_TranslateReadWriteCommand(CommandMailbox);
 754      break;
 755    case DAC960_V1_Write:
 756      CommandMailbox->Common.CommandOpcode = DAC960_V1_Write_Old;
 757      DAC960_PD_To_P_TranslateReadWriteCommand(CommandMailbox);
 758      break;
 759    case DAC960_V1_ReadWithScatterGather:
 760      CommandMailbox->Common.CommandOpcode =
 761        DAC960_V1_ReadWithScatterGather_Old;
 762      DAC960_PD_To_P_TranslateReadWriteCommand(CommandMailbox);
 763      break;
 764    case DAC960_V1_WriteWithScatterGather:
 765      CommandMailbox->Common.CommandOpcode =
 766        DAC960_V1_WriteWithScatterGather_Old;
 767      DAC960_PD_To_P_TranslateReadWriteCommand(CommandMailbox);
 768      break;
 769    default:
 770      break;
 771    }
 772  while (DAC960_PD_MailboxFullP(ControllerBaseAddress))
 773    udelay(1);
 774  DAC960_PD_WriteCommandMailbox(ControllerBaseAddress, CommandMailbox);
 775  DAC960_PD_NewCommand(ControllerBaseAddress);
 776}
 777
 778
 779/*
 780  DAC960_ExecuteCommand executes Command and waits for completion.
 781*/
 782
 783static void DAC960_ExecuteCommand(DAC960_Command_T *Command)
 784{
 785  DAC960_Controller_T *Controller = Command->Controller;
 786  DECLARE_COMPLETION_ONSTACK(Completion);
 787  unsigned long flags;
 788  Command->Completion = &Completion;
 789
 790  spin_lock_irqsave(&Controller->queue_lock, flags);
 791  DAC960_QueueCommand(Command);
 792  spin_unlock_irqrestore(&Controller->queue_lock, flags);
 793 
 794  if (in_interrupt())
 795          return;
 796  wait_for_completion(&Completion);
 797}
 798
 799
 800/*
 801  DAC960_V1_ExecuteType3 executes a DAC960 V1 Firmware Controller Type 3
 802  Command and waits for completion.  It returns true on success and false
 803  on failure.
 804*/
 805
 806static bool DAC960_V1_ExecuteType3(DAC960_Controller_T *Controller,
 807                                      DAC960_V1_CommandOpcode_T CommandOpcode,
 808                                      dma_addr_t DataDMA)
 809{
 810  DAC960_Command_T *Command = DAC960_AllocateCommand(Controller);
 811  DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
 812  DAC960_V1_CommandStatus_T CommandStatus;
 813  DAC960_V1_ClearCommand(Command);
 814  Command->CommandType = DAC960_ImmediateCommand;
 815  CommandMailbox->Type3.CommandOpcode = CommandOpcode;
 816  CommandMailbox->Type3.BusAddress = DataDMA;
 817  DAC960_ExecuteCommand(Command);
 818  CommandStatus = Command->V1.CommandStatus;
 819  DAC960_DeallocateCommand(Command);
 820  return (CommandStatus == DAC960_V1_NormalCompletion);
 821}
 822
 823
 824/*
 825  DAC960_V1_ExecuteTypeB executes a DAC960 V1 Firmware Controller Type 3B
 826  Command and waits for completion.  It returns true on success and false
 827  on failure.
 828*/
 829
 830static bool DAC960_V1_ExecuteType3B(DAC960_Controller_T *Controller,
 831                                       DAC960_V1_CommandOpcode_T CommandOpcode,
 832                                       unsigned char CommandOpcode2,
 833                                       dma_addr_t DataDMA)
 834{
 835  DAC960_Command_T *Command = DAC960_AllocateCommand(Controller);
 836  DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
 837  DAC960_V1_CommandStatus_T CommandStatus;
 838  DAC960_V1_ClearCommand(Command);
 839  Command->CommandType = DAC960_ImmediateCommand;
 840  CommandMailbox->Type3B.CommandOpcode = CommandOpcode;
 841  CommandMailbox->Type3B.CommandOpcode2 = CommandOpcode2;
 842  CommandMailbox->Type3B.BusAddress = DataDMA;
 843  DAC960_ExecuteCommand(Command);
 844  CommandStatus = Command->V1.CommandStatus;
 845  DAC960_DeallocateCommand(Command);
 846  return (CommandStatus == DAC960_V1_NormalCompletion);
 847}
 848
 849
 850/*
 851  DAC960_V1_ExecuteType3D executes a DAC960 V1 Firmware Controller Type 3D
 852  Command and waits for completion.  It returns true on success and false
 853  on failure.
 854*/
 855
 856static bool DAC960_V1_ExecuteType3D(DAC960_Controller_T *Controller,
 857                                       DAC960_V1_CommandOpcode_T CommandOpcode,
 858                                       unsigned char Channel,
 859                                       unsigned char TargetID,
 860                                       dma_addr_t DataDMA)
 861{
 862  DAC960_Command_T *Command = DAC960_AllocateCommand(Controller);
 863  DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
 864  DAC960_V1_CommandStatus_T CommandStatus;
 865  DAC960_V1_ClearCommand(Command);
 866  Command->CommandType = DAC960_ImmediateCommand;
 867  CommandMailbox->Type3D.CommandOpcode = CommandOpcode;
 868  CommandMailbox->Type3D.Channel = Channel;
 869  CommandMailbox->Type3D.TargetID = TargetID;
 870  CommandMailbox->Type3D.BusAddress = DataDMA;
 871  DAC960_ExecuteCommand(Command);
 872  CommandStatus = Command->V1.CommandStatus;
 873  DAC960_DeallocateCommand(Command);
 874  return (CommandStatus == DAC960_V1_NormalCompletion);
 875}
 876
 877
 878/*
 879  DAC960_V2_GeneralInfo executes a DAC960 V2 Firmware General Information
 880  Reading IOCTL Command and waits for completion.  It returns true on success
 881  and false on failure.
 882
 883  Return data in The controller's HealthStatusBuffer, which is dma-able memory
 884*/
 885
 886static bool DAC960_V2_GeneralInfo(DAC960_Controller_T *Controller)
 887{
 888  DAC960_Command_T *Command = DAC960_AllocateCommand(Controller);
 889  DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
 890  DAC960_V2_CommandStatus_T CommandStatus;
 891  DAC960_V2_ClearCommand(Command);
 892  Command->CommandType = DAC960_ImmediateCommand;
 893  CommandMailbox->Common.CommandOpcode = DAC960_V2_IOCTL;
 894  CommandMailbox->Common.CommandControlBits
 895                        .DataTransferControllerToHost = true;
 896  CommandMailbox->Common.CommandControlBits
 897                        .NoAutoRequestSense = true;
 898  CommandMailbox->Common.DataTransferSize = sizeof(DAC960_V2_HealthStatusBuffer_T);
 899  CommandMailbox->Common.IOCTL_Opcode = DAC960_V2_GetHealthStatus;
 900  CommandMailbox->Common.DataTransferMemoryAddress
 901                        .ScatterGatherSegments[0]
 902                        .SegmentDataPointer =
 903    Controller->V2.HealthStatusBufferDMA;
 904  CommandMailbox->Common.DataTransferMemoryAddress
 905                        .ScatterGatherSegments[0]
 906                        .SegmentByteCount =
 907    CommandMailbox->Common.DataTransferSize;
 908  DAC960_ExecuteCommand(Command);
 909  CommandStatus = Command->V2.CommandStatus;
 910  DAC960_DeallocateCommand(Command);
 911  return (CommandStatus == DAC960_V2_NormalCompletion);
 912}
 913
 914
 915/*
 916  DAC960_V2_ControllerInfo executes a DAC960 V2 Firmware Controller
 917  Information Reading IOCTL Command and waits for completion.  It returns
 918  true on success and false on failure.
 919
 920  Data is returned in the controller's V2.NewControllerInformation dma-able
 921  memory buffer.
 922*/
 923
 924static bool DAC960_V2_NewControllerInfo(DAC960_Controller_T *Controller)
 925{
 926  DAC960_Command_T *Command = DAC960_AllocateCommand(Controller);
 927  DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
 928  DAC960_V2_CommandStatus_T CommandStatus;
 929  DAC960_V2_ClearCommand(Command);
 930  Command->CommandType = DAC960_ImmediateCommand;
 931  CommandMailbox->ControllerInfo.CommandOpcode = DAC960_V2_IOCTL;
 932  CommandMailbox->ControllerInfo.CommandControlBits
 933                                .DataTransferControllerToHost = true;
 934  CommandMailbox->ControllerInfo.CommandControlBits
 935                                .NoAutoRequestSense = true;
 936  CommandMailbox->ControllerInfo.DataTransferSize = sizeof(DAC960_V2_ControllerInfo_T);
 937  CommandMailbox->ControllerInfo.ControllerNumber = 0;
 938  CommandMailbox->ControllerInfo.IOCTL_Opcode = DAC960_V2_GetControllerInfo;
 939  CommandMailbox->ControllerInfo.DataTransferMemoryAddress
 940                                .ScatterGatherSegments[0]
 941                                .SegmentDataPointer =
 942        Controller->V2.NewControllerInformationDMA;
 943  CommandMailbox->ControllerInfo.DataTransferMemoryAddress
 944                                .ScatterGatherSegments[0]
 945                                .SegmentByteCount =
 946    CommandMailbox->ControllerInfo.DataTransferSize;
 947  DAC960_ExecuteCommand(Command);
 948  CommandStatus = Command->V2.CommandStatus;
 949  DAC960_DeallocateCommand(Command);
 950  return (CommandStatus == DAC960_V2_NormalCompletion);
 951}
 952
 953
 954/*
 955  DAC960_V2_LogicalDeviceInfo executes a DAC960 V2 Firmware Controller Logical
 956  Device Information Reading IOCTL Command and waits for completion.  It
 957  returns true on success and false on failure.
 958
 959  Data is returned in the controller's V2.NewLogicalDeviceInformation
 960*/
 961
 962static bool DAC960_V2_NewLogicalDeviceInfo(DAC960_Controller_T *Controller,
 963                                           unsigned short LogicalDeviceNumber)
 964{
 965  DAC960_Command_T *Command = DAC960_AllocateCommand(Controller);
 966  DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
 967  DAC960_V2_CommandStatus_T CommandStatus;
 968
 969  DAC960_V2_ClearCommand(Command);
 970  Command->CommandType = DAC960_ImmediateCommand;
 971  CommandMailbox->LogicalDeviceInfo.CommandOpcode =
 972                                DAC960_V2_IOCTL;
 973  CommandMailbox->LogicalDeviceInfo.CommandControlBits
 974                                   .DataTransferControllerToHost = true;
 975  CommandMailbox->LogicalDeviceInfo.CommandControlBits
 976                                   .NoAutoRequestSense = true;
 977  CommandMailbox->LogicalDeviceInfo.DataTransferSize = 
 978                                sizeof(DAC960_V2_LogicalDeviceInfo_T);
 979  CommandMailbox->LogicalDeviceInfo.LogicalDevice.LogicalDeviceNumber =
 980    LogicalDeviceNumber;
 981  CommandMailbox->LogicalDeviceInfo.IOCTL_Opcode = DAC960_V2_GetLogicalDeviceInfoValid;
 982  CommandMailbox->LogicalDeviceInfo.DataTransferMemoryAddress
 983                                   .ScatterGatherSegments[0]
 984                                   .SegmentDataPointer =
 985        Controller->V2.NewLogicalDeviceInformationDMA;
 986  CommandMailbox->LogicalDeviceInfo.DataTransferMemoryAddress
 987                                   .ScatterGatherSegments[0]
 988                                   .SegmentByteCount =
 989    CommandMailbox->LogicalDeviceInfo.DataTransferSize;
 990  DAC960_ExecuteCommand(Command);
 991  CommandStatus = Command->V2.CommandStatus;
 992  DAC960_DeallocateCommand(Command);
 993  return (CommandStatus == DAC960_V2_NormalCompletion);
 994}
 995
 996
 997/*
 998  DAC960_V2_PhysicalDeviceInfo executes a DAC960 V2 Firmware Controller "Read
 999  Physical Device Information" IOCTL Command and waits for completion.  It
1000  returns true on success and false on failure.
1001
1002  The Channel, TargetID, LogicalUnit arguments should be 0 the first time
1003  this function is called for a given controller.  This will return data
1004  for the "first" device on that controller.  The returned data includes a
1005  Channel, TargetID, LogicalUnit that can be passed in to this routine to
1006  get data for the NEXT device on that controller.
1007
1008  Data is stored in the controller's V2.NewPhysicalDeviceInfo dma-able
1009  memory buffer.
1010
1011*/
1012
1013static bool DAC960_V2_NewPhysicalDeviceInfo(DAC960_Controller_T *Controller,
1014                                            unsigned char Channel,
1015                                            unsigned char TargetID,
1016                                            unsigned char LogicalUnit)
1017{
1018  DAC960_Command_T *Command = DAC960_AllocateCommand(Controller);
1019  DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
1020  DAC960_V2_CommandStatus_T CommandStatus;
1021
1022  DAC960_V2_ClearCommand(Command);
1023  Command->CommandType = DAC960_ImmediateCommand;
1024  CommandMailbox->PhysicalDeviceInfo.CommandOpcode = DAC960_V2_IOCTL;
1025  CommandMailbox->PhysicalDeviceInfo.CommandControlBits
1026                                    .DataTransferControllerToHost = true;
1027  CommandMailbox->PhysicalDeviceInfo.CommandControlBits
1028                                    .NoAutoRequestSense = true;
1029  CommandMailbox->PhysicalDeviceInfo.DataTransferSize =
1030                                sizeof(DAC960_V2_PhysicalDeviceInfo_T);
1031  CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.LogicalUnit = LogicalUnit;
1032  CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.TargetID = TargetID;
1033  CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.Channel = Channel;
1034  CommandMailbox->PhysicalDeviceInfo.IOCTL_Opcode =
1035                                        DAC960_V2_GetPhysicalDeviceInfoValid;
1036  CommandMailbox->PhysicalDeviceInfo.DataTransferMemoryAddress
1037                                    .ScatterGatherSegments[0]
1038                                    .SegmentDataPointer =
1039                                        Controller->V2.NewPhysicalDeviceInformationDMA;
1040  CommandMailbox->PhysicalDeviceInfo.DataTransferMemoryAddress
1041                                    .ScatterGatherSegments[0]
1042                                    .SegmentByteCount =
1043    CommandMailbox->PhysicalDeviceInfo.DataTransferSize;
1044  DAC960_ExecuteCommand(Command);
1045  CommandStatus = Command->V2.CommandStatus;
1046  DAC960_DeallocateCommand(Command);
1047  return (CommandStatus == DAC960_V2_NormalCompletion);
1048}
1049
1050
1051static void DAC960_V2_ConstructNewUnitSerialNumber(
1052        DAC960_Controller_T *Controller,
1053        DAC960_V2_CommandMailbox_T *CommandMailbox, int Channel, int TargetID,
1054        int LogicalUnit)
1055{
1056      CommandMailbox->SCSI_10.CommandOpcode = DAC960_V2_SCSI_10_Passthru;
1057      CommandMailbox->SCSI_10.CommandControlBits
1058                             .DataTransferControllerToHost = true;
1059      CommandMailbox->SCSI_10.CommandControlBits
1060                             .NoAutoRequestSense = true;
1061      CommandMailbox->SCSI_10.DataTransferSize =
1062        sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T);
1063      CommandMailbox->SCSI_10.PhysicalDevice.LogicalUnit = LogicalUnit;
1064      CommandMailbox->SCSI_10.PhysicalDevice.TargetID = TargetID;
1065      CommandMailbox->SCSI_10.PhysicalDevice.Channel = Channel;
1066      CommandMailbox->SCSI_10.CDBLength = 6;
1067      CommandMailbox->SCSI_10.SCSI_CDB[0] = 0x12; /* INQUIRY */
1068      CommandMailbox->SCSI_10.SCSI_CDB[1] = 1; /* EVPD = 1 */
1069      CommandMailbox->SCSI_10.SCSI_CDB[2] = 0x80; /* Page Code */
1070      CommandMailbox->SCSI_10.SCSI_CDB[3] = 0; /* Reserved */
1071      CommandMailbox->SCSI_10.SCSI_CDB[4] =
1072        sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T);
1073      CommandMailbox->SCSI_10.SCSI_CDB[5] = 0; /* Control */
1074      CommandMailbox->SCSI_10.DataTransferMemoryAddress
1075                             .ScatterGatherSegments[0]
1076                             .SegmentDataPointer =
1077                Controller->V2.NewInquiryUnitSerialNumberDMA;
1078      CommandMailbox->SCSI_10.DataTransferMemoryAddress
1079                             .ScatterGatherSegments[0]
1080                             .SegmentByteCount =
1081                CommandMailbox->SCSI_10.DataTransferSize;
1082}
1083
1084
1085/*
1086  DAC960_V2_NewUnitSerialNumber executes an SCSI pass-through
1087  Inquiry command to a SCSI device identified by Channel number,
1088  Target id, Logical Unit Number.  This function Waits for completion
1089  of the command.
1090
1091  The return data includes Unit Serial Number information for the
1092  specified device.
1093
1094  Data is stored in the controller's V2.NewPhysicalDeviceInfo dma-able
1095  memory buffer.
1096*/
1097
1098static bool DAC960_V2_NewInquiryUnitSerialNumber(DAC960_Controller_T *Controller,
1099                        int Channel, int TargetID, int LogicalUnit)
1100{
1101      DAC960_Command_T *Command;
1102      DAC960_V2_CommandMailbox_T *CommandMailbox;
1103      DAC960_V2_CommandStatus_T CommandStatus;
1104
1105      Command = DAC960_AllocateCommand(Controller);
1106      CommandMailbox = &Command->V2.CommandMailbox;
1107      DAC960_V2_ClearCommand(Command);
1108      Command->CommandType = DAC960_ImmediateCommand;
1109
1110      DAC960_V2_ConstructNewUnitSerialNumber(Controller, CommandMailbox,
1111                        Channel, TargetID, LogicalUnit);
1112
1113      DAC960_ExecuteCommand(Command);
1114      CommandStatus = Command->V2.CommandStatus;
1115      DAC960_DeallocateCommand(Command);
1116      return (CommandStatus == DAC960_V2_NormalCompletion);
1117}
1118
1119
1120/*
1121  DAC960_V2_DeviceOperation executes a DAC960 V2 Firmware Controller Device
1122  Operation IOCTL Command and waits for completion.  It returns true on
1123  success and false on failure.
1124*/
1125
1126static bool DAC960_V2_DeviceOperation(DAC960_Controller_T *Controller,
1127                                         DAC960_V2_IOCTL_Opcode_T IOCTL_Opcode,
1128                                         DAC960_V2_OperationDevice_T
1129                                           OperationDevice)
1130{
1131  DAC960_Command_T *Command = DAC960_AllocateCommand(Controller);
1132  DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
1133  DAC960_V2_CommandStatus_T CommandStatus;
1134  DAC960_V2_ClearCommand(Command);
1135  Command->CommandType = DAC960_ImmediateCommand;
1136  CommandMailbox->DeviceOperation.CommandOpcode = DAC960_V2_IOCTL;
1137  CommandMailbox->DeviceOperation.CommandControlBits
1138                                 .DataTransferControllerToHost = true;
1139  CommandMailbox->DeviceOperation.CommandControlBits
1140                                 .NoAutoRequestSense = true;
1141  CommandMailbox->DeviceOperation.IOCTL_Opcode = IOCTL_Opcode;
1142  CommandMailbox->DeviceOperation.OperationDevice = OperationDevice;
1143  DAC960_ExecuteCommand(Command);
1144  CommandStatus = Command->V2.CommandStatus;
1145  DAC960_DeallocateCommand(Command);
1146  return (CommandStatus == DAC960_V2_NormalCompletion);
1147}
1148
1149
1150/*
1151  DAC960_V1_EnableMemoryMailboxInterface enables the Memory Mailbox Interface
1152  for DAC960 V1 Firmware Controllers.
1153
1154  PD and P controller types have no memory mailbox, but still need the
1155  other dma mapped memory.
1156*/
1157
1158static bool DAC960_V1_EnableMemoryMailboxInterface(DAC960_Controller_T
1159                                                      *Controller)
1160{
1161  void __iomem *ControllerBaseAddress = Controller->BaseAddress;
1162  DAC960_HardwareType_T hw_type = Controller->HardwareType;
1163  struct pci_dev *PCI_Device = Controller->PCIDevice;
1164  struct dma_loaf *DmaPages = &Controller->DmaPages;
1165  size_t DmaPagesSize;
1166  size_t CommandMailboxesSize;
1167  size_t StatusMailboxesSize;
1168
1169  DAC960_V1_CommandMailbox_T *CommandMailboxesMemory;
1170  dma_addr_t CommandMailboxesMemoryDMA;
1171
1172  DAC960_V1_StatusMailbox_T *StatusMailboxesMemory;
1173  dma_addr_t StatusMailboxesMemoryDMA;
1174
1175  DAC960_V1_CommandMailbox_T CommandMailbox;
1176  DAC960_V1_CommandStatus_T CommandStatus;
1177  int TimeoutCounter;
1178  int i;
1179
1180  memset(&CommandMailbox, 0, sizeof(DAC960_V1_CommandMailbox_T));
1181
1182  if (pci_set_dma_mask(Controller->PCIDevice, DMA_BIT_MASK(32)))
1183        return DAC960_Failure(Controller, "DMA mask out of range");
1184  Controller->BounceBufferLimit = DMA_BIT_MASK(32);
1185
1186  if ((hw_type == DAC960_PD_Controller) || (hw_type == DAC960_P_Controller)) {
1187    CommandMailboxesSize =  0;
1188    StatusMailboxesSize = 0;
1189  } else {
1190    CommandMailboxesSize =  DAC960_V1_CommandMailboxCount * sizeof(DAC960_V1_CommandMailbox_T);
1191    StatusMailboxesSize = DAC960_V1_StatusMailboxCount * sizeof(DAC960_V1_StatusMailbox_T);
1192  }
1193  DmaPagesSize = CommandMailboxesSize + StatusMailboxesSize + 
1194        sizeof(DAC960_V1_DCDB_T) + sizeof(DAC960_V1_Enquiry_T) +
1195        sizeof(DAC960_V1_ErrorTable_T) + sizeof(DAC960_V1_EventLogEntry_T) +
1196        sizeof(DAC960_V1_RebuildProgress_T) +
1197        sizeof(DAC960_V1_LogicalDriveInformationArray_T) +
1198        sizeof(DAC960_V1_BackgroundInitializationStatus_T) +
1199        sizeof(DAC960_V1_DeviceState_T) + sizeof(DAC960_SCSI_Inquiry_T) +
1200        sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T);
1201
1202  if (!init_dma_loaf(PCI_Device, DmaPages, DmaPagesSize))
1203        return false;
1204
1205
1206  if ((hw_type == DAC960_PD_Controller) || (hw_type == DAC960_P_Controller)) 
1207        goto skip_mailboxes;
1208
1209  CommandMailboxesMemory = slice_dma_loaf(DmaPages,
1210                CommandMailboxesSize, &CommandMailboxesMemoryDMA);
1211  
1212  /* These are the base addresses for the command memory mailbox array */
1213  Controller->V1.FirstCommandMailbox = CommandMailboxesMemory;
1214  Controller->V1.FirstCommandMailboxDMA = CommandMailboxesMemoryDMA;
1215
1216  CommandMailboxesMemory += DAC960_V1_CommandMailboxCount - 1;
1217  Controller->V1.LastCommandMailbox = CommandMailboxesMemory;
1218  Controller->V1.NextCommandMailbox = Controller->V1.FirstCommandMailbox;
1219  Controller->V1.PreviousCommandMailbox1 = Controller->V1.LastCommandMailbox;
1220  Controller->V1.PreviousCommandMailbox2 =
1221                                        Controller->V1.LastCommandMailbox - 1;
1222
1223  /* These are the base addresses for the status memory mailbox array */
1224  StatusMailboxesMemory = slice_dma_loaf(DmaPages,
1225                StatusMailboxesSize, &StatusMailboxesMemoryDMA);
1226
1227  Controller->V1.FirstStatusMailbox = StatusMailboxesMemory;
1228  Controller->V1.FirstStatusMailboxDMA = StatusMailboxesMemoryDMA;
1229  StatusMailboxesMemory += DAC960_V1_StatusMailboxCount - 1;
1230  Controller->V1.LastStatusMailbox = StatusMailboxesMemory;
1231  Controller->V1.NextStatusMailbox = Controller->V1.FirstStatusMailbox;
1232
1233skip_mailboxes:
1234  Controller->V1.MonitoringDCDB = slice_dma_loaf(DmaPages,
1235                sizeof(DAC960_V1_DCDB_T),
1236                &Controller->V1.MonitoringDCDB_DMA);
1237
1238  Controller->V1.NewEnquiry = slice_dma_loaf(DmaPages,
1239                sizeof(DAC960_V1_Enquiry_T),
1240                &Controller->V1.NewEnquiryDMA);
1241
1242  Controller->V1.NewErrorTable = slice_dma_loaf(DmaPages,
1243                sizeof(DAC960_V1_ErrorTable_T),
1244                &Controller->V1.NewErrorTableDMA);
1245
1246  Controller->V1.EventLogEntry = slice_dma_loaf(DmaPages,
1247                sizeof(DAC960_V1_EventLogEntry_T),
1248                &Controller->V1.EventLogEntryDMA);
1249
1250  Controller->V1.RebuildProgress = slice_dma_loaf(DmaPages,
1251                sizeof(DAC960_V1_RebuildProgress_T),
1252                &Controller->V1.RebuildProgressDMA);
1253
1254  Controller->V1.NewLogicalDriveInformation = slice_dma_loaf(DmaPages,
1255                sizeof(DAC960_V1_LogicalDriveInformationArray_T),
1256                &Controller->V1.NewLogicalDriveInformationDMA);
1257
1258  Controller->V1.BackgroundInitializationStatus = slice_dma_loaf(DmaPages,
1259                sizeof(DAC960_V1_BackgroundInitializationStatus_T),
1260                &Controller->V1.BackgroundInitializationStatusDMA);
1261
1262  Controller->V1.NewDeviceState = slice_dma_loaf(DmaPages,
1263                sizeof(DAC960_V1_DeviceState_T),
1264                &Controller->V1.NewDeviceStateDMA);
1265
1266  Controller->V1.NewInquiryStandardData = slice_dma_loaf(DmaPages,
1267                sizeof(DAC960_SCSI_Inquiry_T),
1268                &Controller->V1.NewInquiryStandardDataDMA);
1269
1270  Controller->V1.NewInquiryUnitSerialNumber = slice_dma_loaf(DmaPages,
1271                sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T),
1272                &Controller->V1.NewInquiryUnitSerialNumberDMA);
1273
1274  if ((hw_type == DAC960_PD_Controller) || (hw_type == DAC960_P_Controller))
1275        return true;
1276 
1277  /* Enable the Memory Mailbox Interface. */
1278  Controller->V1.DualModeMemoryMailboxInterface = true;
1279  CommandMailbox.TypeX.CommandOpcode = 0x2B;
1280  CommandMailbox.TypeX.CommandIdentifier = 0;
1281  CommandMailbox.TypeX.CommandOpcode2 = 0x14;
1282  CommandMailbox.TypeX.CommandMailboxesBusAddress =
1283                                Controller->V1.FirstCommandMailboxDMA;
1284  CommandMailbox.TypeX.StatusMailboxesBusAddress =
1285                                Controller->V1.FirstStatusMailboxDMA;
1286#define TIMEOUT_COUNT 1000000
1287
1288  for (i = 0; i < 2; i++)
1289    switch (Controller->HardwareType)
1290      {
1291      case DAC960_LA_Controller:
1292        TimeoutCounter = TIMEOUT_COUNT;
1293        while (--TimeoutCounter >= 0)
1294          {
1295            if (!DAC960_LA_HardwareMailboxFullP(ControllerBaseAddress))
1296              break;
1297            udelay(10);
1298          }
1299        if (TimeoutCounter < 0) return false;
1300        DAC960_LA_WriteHardwareMailbox(ControllerBaseAddress, &CommandMailbox);
1301        DAC960_LA_HardwareMailboxNewCommand(ControllerBaseAddress);
1302        TimeoutCounter = TIMEOUT_COUNT;
1303        while (--TimeoutCounter >= 0)
1304          {
1305            if (DAC960_LA_HardwareMailboxStatusAvailableP(
1306                  ControllerBaseAddress))
1307              break;
1308            udelay(10);
1309          }
1310        if (TimeoutCounter < 0) return false;
1311        CommandStatus = DAC960_LA_ReadStatusRegister(ControllerBaseAddress);
1312        DAC960_LA_AcknowledgeHardwareMailboxInterrupt(ControllerBaseAddress);
1313        DAC960_LA_AcknowledgeHardwareMailboxStatus(ControllerBaseAddress);
1314        if (CommandStatus == DAC960_V1_NormalCompletion) return true;
1315        Controller->V1.DualModeMemoryMailboxInterface = false;
1316        CommandMailbox.TypeX.CommandOpcode2 = 0x10;
1317        break;
1318      case DAC960_PG_Controller:
1319        TimeoutCounter = TIMEOUT_COUNT;
1320        while (--TimeoutCounter >= 0)
1321          {
1322            if (!DAC960_PG_HardwareMailboxFullP(ControllerBaseAddress))
1323              break;
1324            udelay(10);
1325          }
1326        if (TimeoutCounter < 0) return false;
1327        DAC960_PG_WriteHardwareMailbox(ControllerBaseAddress, &CommandMailbox);
1328        DAC960_PG_HardwareMailboxNewCommand(ControllerBaseAddress);
1329
1330        TimeoutCounter = TIMEOUT_COUNT;
1331        while (--TimeoutCounter >= 0)
1332          {
1333            if (DAC960_PG_HardwareMailboxStatusAvailableP(
1334                  ControllerBaseAddress))
1335              break;
1336            udelay(10);
1337          }
1338        if (TimeoutCounter < 0) return false;
1339        CommandStatus = DAC960_PG_ReadStatusRegister(ControllerBaseAddress);
1340        DAC960_PG_AcknowledgeHardwareMailboxInterrupt(ControllerBaseAddress);
1341        DAC960_PG_AcknowledgeHardwareMailboxStatus(ControllerBaseAddress);
1342        if (CommandStatus == DAC960_V1_NormalCompletion) return true;
1343        Controller->V1.DualModeMemoryMailboxInterface = false;
1344        CommandMailbox.TypeX.CommandOpcode2 = 0x10;
1345        break;
1346      default:
1347        DAC960_Failure(Controller, "Unknown Controller Type\n");
1348        break;
1349      }
1350  return false;
1351}
1352
1353
1354/*
1355  DAC960_V2_EnableMemoryMailboxInterface enables the Memory Mailbox Interface
1356  for DAC960 V2 Firmware Controllers.
1357
1358  Aggregate the space needed for the controller's memory mailbox and
1359  the other data structures that will be targets of dma transfers with
1360  the controller.  Allocate a dma-mapped region of memory to hold these
1361  structures.  Then, save CPU pointers and dma_addr_t values to reference
1362  the structures that are contained in that region.
1363*/
1364
1365static bool DAC960_V2_EnableMemoryMailboxInterface(DAC960_Controller_T
1366                                                      *Controller)
1367{
1368  void __iomem *ControllerBaseAddress = Controller->BaseAddress;
1369  struct pci_dev *PCI_Device = Controller->PCIDevice;
1370  struct dma_loaf *DmaPages = &Controller->DmaPages;
1371  size_t DmaPagesSize;
1372  size_t CommandMailboxesSize;
1373  size_t StatusMailboxesSize;
1374
1375  DAC960_V2_CommandMailbox_T *CommandMailboxesMemory;
1376  dma_addr_t CommandMailboxesMemoryDMA;
1377
1378  DAC960_V2_StatusMailbox_T *StatusMailboxesMemory;
1379  dma_addr_t StatusMailboxesMemoryDMA;
1380
1381  DAC960_V2_CommandMailbox_T *CommandMailbox;
1382  dma_addr_t    CommandMailboxDMA;
1383  DAC960_V2_CommandStatus_T CommandStatus;
1384
1385        if (!pci_set_dma_mask(Controller->PCIDevice, DMA_BIT_MASK(64)))
1386                Controller->BounceBufferLimit = DMA_BIT_MASK(64);
1387        else if (!pci_set_dma_mask(Controller->PCIDevice, DMA_BIT_MASK(32)))
1388                Controller->BounceBufferLimit = DMA_BIT_MASK(32);
1389        else
1390                return DAC960_Failure(Controller, "DMA mask out of range");
1391
1392  /* This is a temporary dma mapping, used only in the scope of this function */
1393  CommandMailbox = pci_alloc_consistent(PCI_Device,
1394                sizeof(DAC960_V2_CommandMailbox_T), &CommandMailboxDMA);
1395  if (CommandMailbox == NULL)
1396          return false;
1397
1398  CommandMailboxesSize = DAC960_V2_CommandMailboxCount * sizeof(DAC960_V2_CommandMailbox_T);
1399  StatusMailboxesSize = DAC960_V2_StatusMailboxCount * sizeof(DAC960_V2_StatusMailbox_T);
1400  DmaPagesSize =
1401    CommandMailboxesSize + StatusMailboxesSize +
1402    sizeof(DAC960_V2_HealthStatusBuffer_T) +
1403    sizeof(DAC960_V2_ControllerInfo_T) +
1404    sizeof(DAC960_V2_LogicalDeviceInfo_T) +
1405    sizeof(DAC960_V2_PhysicalDeviceInfo_T) +
1406    sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T) +
1407    sizeof(DAC960_V2_Event_T) +
1408    sizeof(DAC960_V2_PhysicalToLogicalDevice_T);
1409
1410  if (!init_dma_loaf(PCI_Device, DmaPages, DmaPagesSize)) {
1411        pci_free_consistent(PCI_Device, sizeof(DAC960_V2_CommandMailbox_T),
1412                                        CommandMailbox, CommandMailboxDMA);
1413        return false;
1414  }
1415
1416  CommandMailboxesMemory = slice_dma_loaf(DmaPages,
1417                CommandMailboxesSize, &CommandMailboxesMemoryDMA);
1418
1419  /* These are the base addresses for the command memory mailbox array */
1420  Controller->V2.FirstCommandMailbox = CommandMailboxesMemory;
1421  Controller->V2.FirstCommandMailboxDMA = CommandMailboxesMemoryDMA;
1422
1423  CommandMailboxesMemory += DAC960_V2_CommandMailboxCount - 1;
1424  Controller->V2.LastCommandMailbox = CommandMailboxesMemory;
1425  Controller->V2.NextCommandMailbox = Controller->V2.FirstCommandMailbox;
1426  Controller->V2.PreviousCommandMailbox1 = Controller->V2.LastCommandMailbox;
1427  Controller->V2.PreviousCommandMailbox2 =
1428                                        Controller->V2.LastCommandMailbox - 1;
1429
1430  /* These are the base addresses for the status memory mailbox array */
1431  StatusMailboxesMemory = slice_dma_loaf(DmaPages,
1432                StatusMailboxesSize, &StatusMailboxesMemoryDMA);
1433
1434  Controller->V2.FirstStatusMailbox = StatusMailboxesMemory;
1435  Controller->V2.FirstStatusMailboxDMA = StatusMailboxesMemoryDMA;
1436  StatusMailboxesMemory += DAC960_V2_StatusMailboxCount - 1;
1437  Controller->V2.LastStatusMailbox = StatusMailboxesMemory;
1438  Controller->V2.NextStatusMailbox = Controller->V2.FirstStatusMailbox;
1439
1440  Controller->V2.HealthStatusBuffer = slice_dma_loaf(DmaPages,
1441                sizeof(DAC960_V2_HealthStatusBuffer_T),
1442                &Controller->V2.HealthStatusBufferDMA);
1443
1444  Controller->V2.NewControllerInformation = slice_dma_loaf(DmaPages,
1445                sizeof(DAC960_V2_ControllerInfo_T), 
1446                &Controller->V2.NewControllerInformationDMA);
1447
1448  Controller->V2.NewLogicalDeviceInformation =  slice_dma_loaf(DmaPages,
1449                sizeof(DAC960_V2_LogicalDeviceInfo_T),
1450                &Controller->V2.NewLogicalDeviceInformationDMA);
1451
1452  Controller->V2.NewPhysicalDeviceInformation = slice_dma_loaf(DmaPages,
1453                sizeof(DAC960_V2_PhysicalDeviceInfo_T),
1454                &Controller->V2.NewPhysicalDeviceInformationDMA);
1455
1456  Controller->V2.NewInquiryUnitSerialNumber = slice_dma_loaf(DmaPages,
1457                sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T),
1458                &Controller->V2.NewInquiryUnitSerialNumberDMA);
1459
1460  Controller->V2.Event = slice_dma_loaf(DmaPages,
1461                sizeof(DAC960_V2_Event_T),
1462                &Controller->V2.EventDMA);
1463
1464  Controller->V2.PhysicalToLogicalDevice = slice_dma_loaf(DmaPages,
1465                sizeof(DAC960_V2_PhysicalToLogicalDevice_T),
1466                &Controller->V2.PhysicalToLogicalDeviceDMA);
1467
1468  /*
1469    Enable the Memory Mailbox Interface.
1470    
1471    I don't know why we can't just use one of the memory mailboxes
1472    we just allocated to do this, instead of using this temporary one.
1473    Try this change later.
1474  */
1475  memset(CommandMailbox, 0, sizeof(DAC960_V2_CommandMailbox_T));
1476  CommandMailbox->SetMemoryMailbox.CommandIdentifier = 1;
1477  CommandMailbox->SetMemoryMailbox.CommandOpcode = DAC960_V2_IOCTL;
1478  CommandMailbox->SetMemoryMailbox.CommandControlBits.NoAutoRequestSense = true;
1479  CommandMailbox->SetMemoryMailbox.FirstCommandMailboxSizeKB =
1480    (DAC960_V2_CommandMailboxCount * sizeof(DAC960_V2_CommandMailbox_T)) >> 10;
1481  CommandMailbox->SetMemoryMailbox.FirstStatusMailboxSizeKB =
1482    (DAC960_V2_StatusMailboxCount * sizeof(DAC960_V2_StatusMailbox_T)) >> 10;
1483  CommandMailbox->SetMemoryMailbox.SecondCommandMailboxSizeKB = 0;
1484  CommandMailbox->SetMemoryMailbox.SecondStatusMailboxSizeKB = 0;
1485  CommandMailbox->SetMemoryMailbox.RequestSenseSize = 0;
1486  CommandMailbox->SetMemoryMailbox.IOCTL_Opcode = DAC960_V2_SetMemoryMailbox;
1487  CommandMailbox->SetMemoryMailbox.HealthStatusBufferSizeKB = 1;
1488  CommandMailbox->SetMemoryMailbox.HealthStatusBufferBusAddress =
1489                                        Controller->V2.HealthStatusBufferDMA;
1490  CommandMailbox->SetMemoryMailbox.FirstCommandMailboxBusAddress =
1491                                        Controller->V2.FirstCommandMailboxDMA;
1492  CommandMailbox->SetMemoryMailbox.FirstStatusMailboxBusAddress =
1493                                        Controller->V2.FirstStatusMailboxDMA;
1494  switch (Controller->HardwareType)
1495    {
1496    case DAC960_GEM_Controller:
1497      while (DAC960_GEM_HardwareMailboxFullP(ControllerBaseAddress))
1498        udelay(1);
1499      DAC960_GEM_WriteHardwareMailbox(ControllerBaseAddress, CommandMailboxDMA);
1500      DAC960_GEM_HardwareMailboxNewCommand(ControllerBaseAddress);
1501      while (!DAC960_GEM_HardwareMailboxStatusAvailableP(ControllerBaseAddress))
1502        udelay(1);
1503      CommandStatus = DAC960_GEM_ReadCommandStatus(ControllerBaseAddress);
1504      DAC960_GEM_AcknowledgeHardwareMailboxInterrupt(ControllerBaseAddress);
1505      DAC960_GEM_AcknowledgeHardwareMailboxStatus(ControllerBaseAddress);
1506      break;
1507    case DAC960_BA_Controller:
1508      while (DAC960_BA_HardwareMailboxFullP(ControllerBaseAddress))
1509        udelay(1);
1510      DAC960_BA_WriteHardwareMailbox(ControllerBaseAddress, CommandMailboxDMA);
1511      DAC960_BA_HardwareMailboxNewCommand(ControllerBaseAddress);
1512      while (!DAC960_BA_HardwareMailboxStatusAvailableP(ControllerBaseAddress))
1513        udelay(1);
1514      CommandStatus = DAC960_BA_ReadCommandStatus(ControllerBaseAddress);
1515      DAC960_BA_AcknowledgeHardwareMailboxInterrupt(ControllerBaseAddress);
1516      DAC960_BA_AcknowledgeHardwareMailboxStatus(ControllerBaseAddress);
1517      break;
1518    case DAC960_LP_Controller:
1519      while (DAC960_LP_HardwareMailboxFullP(ControllerBaseAddress))
1520        udelay(1);
1521      DAC960_LP_WriteHardwareMailbox(ControllerBaseAddress, CommandMailboxDMA);
1522      DAC960_LP_HardwareMailboxNewCommand(ControllerBaseAddress);
1523      while (!DAC960_LP_HardwareMailboxStatusAvailableP(ControllerBaseAddress))
1524        udelay(1);
1525      CommandStatus = DAC960_LP_ReadCommandStatus(ControllerBaseAddress);
1526      DAC960_LP_AcknowledgeHardwareMailboxInterrupt(ControllerBaseAddress);
1527      DAC960_LP_AcknowledgeHardwareMailboxStatus(ControllerBaseAddress);
1528      break;
1529    default:
1530      DAC960_Failure(Controller, "Unknown Controller Type\n");
1531      CommandStatus = DAC960_V2_AbormalCompletion;
1532      break;
1533    }
1534  pci_free_consistent(PCI_Device, sizeof(DAC960_V2_CommandMailbox_T),
1535                                        CommandMailbox, CommandMailboxDMA);
1536  return (CommandStatus == DAC960_V2_NormalCompletion);
1537}
1538
1539
1540/*
1541  DAC960_V1_ReadControllerConfiguration reads the Configuration Information
1542  from DAC960 V1 Firmware Controllers and initializes the Controller structure.
1543*/
1544
1545static bool DAC960_V1_ReadControllerConfiguration(DAC960_Controller_T
1546                                                     *Controller)
1547{
1548  DAC960_V1_Enquiry2_T *Enquiry2;
1549  dma_addr_t Enquiry2DMA;
1550  DAC960_V1_Config2_T *Config2;
1551  dma_addr_t Config2DMA;
1552  int LogicalDriveNumber, Channel, TargetID;
1553  struct dma_loaf local_dma;
1554
1555  if (!init_dma_loaf(Controller->PCIDevice, &local_dma,
1556                sizeof(DAC960_V1_Enquiry2_T) + sizeof(DAC960_V1_Config2_T)))
1557        return DAC960_Failure(Controller, "LOGICAL DEVICE ALLOCATION");
1558
1559  Enquiry2 = slice_dma_loaf(&local_dma, sizeof(DAC960_V1_Enquiry2_T), &Enquiry2DMA);
1560  Config2 = slice_dma_loaf(&local_dma, sizeof(DAC960_V1_Config2_T), &Config2DMA);
1561
1562  if (!DAC960_V1_ExecuteType3(Controller, DAC960_V1_Enquiry,
1563                              Controller->V1.NewEnquiryDMA)) {
1564    free_dma_loaf(Controller->PCIDevice, &local_dma);
1565    return DAC960_Failure(Controller, "ENQUIRY");
1566  }
1567  memcpy(&Controller->V1.Enquiry, Controller->V1.NewEnquiry,
1568                                                sizeof(DAC960_V1_Enquiry_T));
1569
1570  if (!DAC960_V1_ExecuteType3(Controller, DAC960_V1_Enquiry2, Enquiry2DMA)) {
1571    free_dma_loaf(Controller->PCIDevice, &local_dma);
1572    return DAC960_Failure(Controller, "ENQUIRY2");
1573  }
1574
1575  if (!DAC960_V1_ExecuteType3(Controller, DAC960_V1_ReadConfig2, Config2DMA)) {
1576    free_dma_loaf(Controller->PCIDevice, &local_dma);
1577    return DAC960_Failure(Controller, "READ CONFIG2");
1578  }
1579
1580  if (!DAC960_V1_ExecuteType3(Controller, DAC960_V1_GetLogicalDriveInformation,
1581                              Controller->V1.NewLogicalDriveInformationDMA)) {
1582    free_dma_loaf(Controller->PCIDevice, &local_dma);
1583    return DAC960_Failure(Controller, "GET LOGICAL DRIVE INFORMATION");
1584  }
1585  memcpy(&Controller->V1.LogicalDriveInformation,
1586                Controller->V1.NewLogicalDriveInformation,
1587                sizeof(DAC960_V1_LogicalDriveInformationArray_T));
1588
1589  for (Channel = 0; Channel < Enquiry2->ActualChannels; Channel++)
1590    for (TargetID = 0; TargetID < Enquiry2->MaxTargets; TargetID++) {
1591      if (!DAC960_V1_ExecuteType3D(Controller, DAC960_V1_GetDeviceState,
1592                                   Channel, TargetID,
1593                                   Controller->V1.NewDeviceStateDMA)) {
1594                free_dma_loaf(Controller->PCIDevice, &local_dma);
1595                return DAC960_Failure(Controller, "GET DEVICE STATE");
1596        }
1597        memcpy(&Controller->V1.DeviceState[Channel][TargetID],
1598                Controller->V1.NewDeviceState, sizeof(DAC960_V1_DeviceState_T));
1599     }
1600  /*
1601    Initialize the Controller Model Name and Full Model Name fields.
1602  */
1603  switch (Enquiry2->HardwareID.SubModel)
1604    {
1605    case DAC960_V1_P_PD_PU:
1606      if (Enquiry2->SCSICapability.BusSpeed == DAC960_V1_Ultra)
1607        strcpy(Controller->ModelName, "DAC960PU");
1608      else strcpy(Controller->ModelName, "DAC960PD");
1609      break;
1610    case DAC960_V1_PL:
1611      strcpy(Controller->ModelName, "DAC960PL");
1612      break;
1613    case DAC960_V1_PG:
1614      strcpy(Controller->ModelName, "DAC960PG");
1615      break;
1616    case DAC960_V1_PJ:
1617      strcpy(Controller->ModelName, "DAC960PJ");
1618      break;
1619    case DAC960_V1_PR:
1620      strcpy(Controller->ModelName, "DAC960PR");
1621      break;
1622    case DAC960_V1_PT:
1623      strcpy(Controller->ModelName, "DAC960PT");
1624      break;
1625    case DAC960_V1_PTL0:
1626      strcpy(Controller->ModelName, "DAC960PTL0");
1627      break;
1628    case DAC960_V1_PRL:
1629      strcpy(Controller->ModelName, "DAC960PRL");
1630      break;
1631    case DAC960_V1_PTL1:
1632      strcpy(Controller->ModelName, "DAC960PTL1");
1633      break;
1634    case DAC960_V1_1164P:
1635      strcpy(Controller->ModelName, "DAC1164P");
1636      break;
1637    default:
1638      free_dma_loaf(Controller->PCIDevice, &local_dma);
1639      return DAC960_Failure(Controller, "MODEL VERIFICATION");
1640    }
1641  strcpy(Controller->FullModelName, "Mylex ");
1642  strcat(Controller->FullModelName, Controller->ModelName);
1643  /*
1644    Initialize the Controller Firmware Version field and verify that it
1645    is a supported firmware version.  The supported firmware versions are:
1646
1647    DAC1164P                5.06 and above
1648    DAC960PTL/PRL/PJ/PG     4.06 and above
1649    DAC960PU/PD/PL          3.51 and above
1650    DAC960PU/PD/PL/P        2.73 and above
1651  */
1652#if defined(CONFIG_ALPHA)
1653  /*
1654    DEC Alpha machines were often equipped with DAC960 cards that were
1655    OEMed from Mylex, and had their own custom firmware. Version 2.70,
1656    the last custom FW revision to be released by DEC for these older
1657    controllers, appears to work quite well with this driver.
1658
1659    Cards tested successfully were several versions each of the PD and
1660    PU, called by DEC the KZPSC and KZPAC, respectively, and having
1661    the Manufacturer Numbers (from Mylex), usually on a sticker on the
1662    back of the board, of:
1663
1664    KZPSC:  D040347 (1-channel) or D040348 (2-channel) or D040349 (3-channel)
1665    KZPAC:  D040395 (1-channel) or D040396 (2-channel) or D040397 (3-channel)
1666  */
1667# define FIRMWARE_27X   "2.70"
1668#else
1669# define FIRMWARE_27X   "2.73"
1670#endif
1671
1672  if (Enquiry2->FirmwareID.MajorVersion == 0)
1673    {
1674      Enquiry2->FirmwareID.MajorVersion =
1675        Controller->V1.Enquiry.MajorFirmwareVersion;
1676      Enquiry2->FirmwareID.MinorVersion =
1677        Controller->V1.Enquiry.MinorFirmwareVersion;
1678      Enquiry2->FirmwareID.FirmwareType = '0';
1679      Enquiry2->FirmwareID.TurnID = 0;
1680    }
1681  sprintf(Controller->FirmwareVersion, "%d.%02d-%c-%02d",
1682          Enquiry2->FirmwareID.MajorVersion, Enquiry2->FirmwareID.MinorVersion,
1683          Enquiry2->FirmwareID.FirmwareType, Enquiry2->FirmwareID.TurnID);
1684  if (!((Controller->FirmwareVersion[0] == '5' &&
1685         strcmp(Controller->FirmwareVersion, "5.06") >= 0) ||
1686        (Controller->FirmwareVersion[0] == '4' &&
1687         strcmp(Controller->FirmwareVersion, "4.06") >= 0) ||
1688        (Controller->FirmwareVersion[0] == '3' &&
1689         strcmp(Controller->FirmwareVersion, "3.51") >= 0) ||
1690        (Controller->FirmwareVersion[0] == '2' &&
1691         strcmp(Controller->FirmwareVersion, FIRMWARE_27X) >= 0)))
1692    {
1693      DAC960_Failure(Controller, "FIRMWARE VERSION VERIFICATION");
1694      DAC960_Error("Firmware Version = '%s'\n", Controller,
1695                   Controller->FirmwareVersion);
1696      free_dma_loaf(Controller->PCIDevice, &local_dma);
1697      return false;
1698    }
1699  /*
1700    Initialize the Controller Channels, Targets, Memory Size, and SAF-TE
1701    Enclosure Management Enabled fields.
1702  */
1703  Controller->Channels = Enquiry2->ActualChannels;
1704  Controller->Targets = Enquiry2->MaxTargets;
1705  Controller->MemorySize = Enquiry2->MemorySize >> 20;
1706  Controller->V1.SAFTE_EnclosureManagementEnabled =
1707    (Enquiry2->FaultManagementType == DAC960_V1_SAFTE);
1708  /*
1709    Initialize the Controller Queue Depth, Driver Queue Depth, Logical Drive
1710    Count, Maximum Blocks per Command, Controller Scatter/Gather Limit, and
1711    Driver Scatter/Gather Limit.  The Driver Queue Depth must be at most one
1712    less than the Controller Queue Depth to allow for an automatic drive
1713    rebuild operation.
1714  */
1715  Controller->ControllerQueueDepth = Controller->V1.Enquiry.MaxCommands;
1716  Controller->DriverQueueDepth = Controller->ControllerQueueDepth - 1;
1717  if (Controller->DriverQueueDepth > DAC960_MaxDriverQueueDepth)
1718    Controller->DriverQueueDepth = DAC960_MaxDriverQueueDepth;
1719  Controller->LogicalDriveCount =
1720    Controller->V1.Enquiry.NumberOfLogicalDrives;
1721  Controller->MaxBlocksPerCommand = Enquiry2->MaxBlocksPerCommand;
1722  Controller->ControllerScatterGatherLimit = Enquiry2->MaxScatterGatherEntries;
1723  Controller->DriverScatterGatherLimit =
1724    Controller->ControllerScatterGatherLimit;
1725  if (Controller->DriverScatterGatherLimit > DAC960_V1_ScatterGatherLimit)
1726    Controller->DriverScatterGatherLimit = DAC960_V1_ScatterGatherLimit;
1727  /*
1728    Initialize the Stripe Size, Segment Size, and Geometry Translation.
1729  */
1730  Controller->V1.StripeSize = Config2->BlocksPerStripe * Config2->BlockFactor
1731                              >> (10 - DAC960_BlockSizeBits);
1732  Controller->V1.SegmentSize = Config2->BlocksPerCacheLine * Config2->BlockFactor
1733                               >> (10 - DAC960_BlockSizeBits);
1734  switch (Config2->DriveGeometry)
1735    {
1736    case DAC960_V1_Geometry_128_32:
1737      Controller->V1.GeometryTranslationHeads = 128;
1738      Controller->V1.GeometryTranslationSectors = 32;
1739      break;
1740    case DAC960_V1_Geometry_255_63:
1741      Controller->V1.GeometryTranslationHeads = 255;
1742      Controller->V1.GeometryTranslationSectors = 63;
1743      break;
1744    default:
1745      free_dma_loaf(Controller->PCIDevice, &local_dma);
1746      return DAC960_Failure(Controller, "CONFIG2 DRIVE GEOMETRY");
1747    }
1748  /*
1749    Initialize the Background Initialization Status.
1750  */
1751  if ((Controller->FirmwareVersion[0] == '4' &&
1752      strcmp(Controller->FirmwareVersion, "4.08") >= 0) ||
1753      (Controller->FirmwareVersion[0] == '5' &&
1754       strcmp(Controller->FirmwareVersion, "5.08") >= 0))
1755    {
1756      Controller->V1.BackgroundInitializationStatusSupported = true;
1757      DAC960_V1_ExecuteType3B(Controller,
1758                              DAC960_V1_BackgroundInitializationControl, 0x20,
1759                              Controller->
1760                               V1.BackgroundInitializationStatusDMA);
1761      memcpy(&Controller->V1.LastBackgroundInitializationStatus,
1762                Controller->V1.BackgroundInitializationStatus,
1763                sizeof(DAC960_V1_BackgroundInitializationStatus_T));
1764    }
1765  /*
1766    Initialize the Logical Drive Initially Accessible flag.
1767  */
1768  for (LogicalDriveNumber = 0;
1769       LogicalDriveNumber < Controller->LogicalDriveCount;
1770       LogicalDriveNumber++)
1771    if (Controller->V1.LogicalDriveInformation
1772                       [LogicalDriveNumber].LogicalDriveState !=
1773        DAC960_V1_LogicalDrive_Offline)
1774      Controller->LogicalDriveInitiallyAccessible[LogicalDriveNumber] = true;
1775  Controller->V1.LastRebuildStatus = DAC960_V1_NoRebuildOrCheckInProgress;
1776  free_dma_loaf(Controller->PCIDevice, &local_dma);
1777  return true;
1778}
1779
1780
1781/*
1782  DAC960_V2_ReadControllerConfiguration reads the Configuration Information
1783  from DAC960 V2 Firmware Controllers and initializes the Controller structure.
1784*/
1785
1786static bool DAC960_V2_ReadControllerConfiguration(DAC960_Controller_T
1787                                                     *Controller)
1788{
1789  DAC960_V2_ControllerInfo_T *ControllerInfo =
1790                &Controller->V2.ControllerInformation;
1791  unsigned short LogicalDeviceNumber = 0;
1792  int ModelNameLength;
1793
1794  /* Get data into dma-able area, then copy into permanent location */
1795  if (!DAC960_V2_NewControllerInfo(Controller))
1796    return DAC960_Failure(Controller, "GET CONTROLLER INFO");
1797  memcpy(ControllerInfo, Controller->V2.NewControllerInformation,
1798                        sizeof(DAC960_V2_ControllerInfo_T));
1799         
1800  
1801  if (!DAC960_V2_GeneralInfo(Controller))
1802    return DAC960_Failure(Controller, "GET HEALTH STATUS");
1803
1804  /*
1805    Initialize the Controller Model Name and Full Model Name fields.
1806  */
1807  ModelNameLength = sizeof(ControllerInfo->ControllerName);
1808  if (ModelNameLength > sizeof(Controller->ModelName)-1)
1809    ModelNameLength = sizeof(Controller->ModelName)-1;
1810  memcpy(Controller->ModelName, ControllerInfo->ControllerName,
1811         ModelNameLength);
1812  ModelNameLength--;
1813  while (Controller->ModelName[ModelNameLength] == ' ' ||
1814         Controller->ModelName[ModelNameLength] == '\0')
1815    ModelNameLength--;
1816  Controller->ModelName[++ModelNameLength] = '\0';
1817  strcpy(Controller->FullModelName, "Mylex ");
1818  strcat(Controller->FullModelName, Controller->ModelName);
1819  /*
1820    Initialize the Controller Firmware Version field.
1821  */
1822  sprintf(Controller->FirmwareVersion, "%d.%02d-%02d",
1823          ControllerInfo->FirmwareMajorVersion,
1824          ControllerInfo->FirmwareMinorVersion,
1825          ControllerInfo->FirmwareTurnNumber);
1826  if (ControllerInfo->FirmwareMajorVersion == 6 &&
1827      ControllerInfo->FirmwareMinorVersion == 0 &&
1828      ControllerInfo->FirmwareTurnNumber < 1)
1829    {
1830      DAC960_Info("FIRMWARE VERSION %s DOES NOT PROVIDE THE CONTROLLER\n",
1831                  Controller, Controller->FirmwareVersion);
1832      DAC960_Info("STATUS MONITORING FUNCTIONALITY NEEDED BY THIS DRIVER.\n",
1833                  Controller);
1834      DAC960_Info("PLEASE UPGRADE TO VERSION 6.00-01 OR ABOVE.\n",
1835                  Controller);
1836    }
1837  /*
1838    Initialize the Controller Channels, Targets, and Memory Size.
1839  */
1840  Controller->Channels = ControllerInfo->NumberOfPhysicalChannelsPresent;
1841  Controller->Targets =
1842    ControllerInfo->MaximumTargetsPerChannel
1843                    [ControllerInfo->NumberOfPhysicalChannelsPresent-1];
1844  Controller->MemorySize = ControllerInfo->MemorySizeMB;
1845  /*
1846    Initialize the Controller Queue Depth, Driver Queue Depth, Logical Drive
1847    Count, Maximum Blocks per Command, Controller Scatter/Gather Limit, and
1848    Driver Scatter/Gather Limit.  The Driver Queue Depth must be at most one
1849    less than the Controller Queue Depth to allow for an automatic drive
1850    rebuild operation.
1851  */
1852  Controller->ControllerQueueDepth = ControllerInfo->MaximumParallelCommands;
1853  Controller->DriverQueueDepth = Controller->ControllerQueueDepth - 1;
1854  if (Controller->DriverQueueDepth > DAC960_MaxDriverQueueDepth)
1855    Controller->DriverQueueDepth = DAC960_MaxDriverQueueDepth;
1856  Controller->LogicalDriveCount = ControllerInfo->LogicalDevicesPresent;
1857  Controller->MaxBlocksPerCommand =
1858    ControllerInfo->MaximumDataTransferSizeInBlocks;
1859  Controller->ControllerScatterGatherLimit =
1860    ControllerInfo->MaximumScatterGatherEntries;
1861  Controller->DriverScatterGatherLimit =
1862    Controller->ControllerScatterGatherLimit;
1863  if (Controller->DriverScatterGatherLimit > DAC960_V2_ScatterGatherLimit)
1864    Controller->DriverScatterGatherLimit = DAC960_V2_ScatterGatherLimit;
1865  /*
1866    Initialize the Logical Device Information.
1867  */
1868  while (true)
1869    {
1870      DAC960_V2_LogicalDeviceInfo_T *NewLogicalDeviceInfo =
1871        Controller->V2.NewLogicalDeviceInformation;
1872      DAC960_V2_LogicalDeviceInfo_T *LogicalDeviceInfo;
1873      DAC960_V2_PhysicalDevice_T PhysicalDevice;
1874
1875      if (!DAC960_V2_NewLogicalDeviceInfo(Controller, LogicalDeviceNumber))
1876        break;
1877      LogicalDeviceNumber = NewLogicalDeviceInfo->LogicalDeviceNumber;
1878      if (LogicalDeviceNumber >= DAC960_MaxLogicalDrives) {
1879        DAC960_Error("DAC960: Logical Drive Number %d not supported\n",
1880                       Controller, LogicalDeviceNumber);
1881                break;
1882      }
1883      if (NewLogicalDeviceInfo->DeviceBlockSizeInBytes != DAC960_BlockSize) {
1884        DAC960_Error("DAC960: Logical Drive Block Size %d not supported\n",
1885              Controller, NewLogicalDeviceInfo->DeviceBlockSizeInBytes);
1886        LogicalDeviceNumber++;
1887        continue;
1888      }
1889      PhysicalDevice.Controller = 0;
1890      PhysicalDevice.Channel = NewLogicalDeviceInfo->Channel;
1891      PhysicalDevice.TargetID = NewLogicalDeviceInfo->TargetID;
1892      PhysicalDevice.LogicalUnit = NewLogicalDeviceInfo->LogicalUnit;
1893      Controller->V2.LogicalDriveToVirtualDevice[LogicalDeviceNumber] =
1894        PhysicalDevice;
1895      if (NewLogicalDeviceInfo->LogicalDeviceState !=
1896          DAC960_V2_LogicalDevice_Offline)
1897        Controller->LogicalDriveInitiallyAccessible[LogicalDeviceNumber] = true;
1898      LogicalDeviceInfo = kmalloc(sizeof(DAC960_V2_LogicalDeviceInfo_T),
1899                                   GFP_ATOMIC);
1900      if (LogicalDeviceInfo == NULL)
1901        return DAC960_Failure(Controller, "LOGICAL DEVICE ALLOCATION");
1902      Controller->V2.LogicalDeviceInformation[LogicalDeviceNumber] =
1903        LogicalDeviceInfo;
1904      memcpy(LogicalDeviceInfo, NewLogicalDeviceInfo,
1905             sizeof(DAC960_V2_LogicalDeviceInfo_T));
1906      LogicalDeviceNumber++;
1907    }
1908  return true;
1909}
1910
1911
1912/*
1913  DAC960_ReportControllerConfiguration reports the Configuration Information
1914  for Controller.
1915*/
1916
1917static bool DAC960_ReportControllerConfiguration(DAC960_Controller_T
1918                                                    *Controller)
1919{
1920  DAC960_Info("Configuring Mylex %s PCI RAID Controller\n",
1921              Controller, Controller->ModelName);
1922  DAC960_Info("  Firmware Version: %s, Channels: %d, Memory Size: %dMB\n",
1923              Controller, Controller->FirmwareVersion,
1924              Controller->Channels, Controller->MemorySize);
1925  DAC960_Info("  PCI Bus: %d, Device: %d, Function: %d, I/O Address: ",
1926              Controller, Controller->Bus,
1927              Controller->Device, Controller->Function);
1928  if (Controller->IO_Address == 0)
1929    DAC960_Info("Unassigned\n", Controller);
1930  else DAC960_Info("0x%X\n", Controller, Controller->IO_Address);
1931  DAC960_Info("  PCI Address: 0x%X mapped at 0x%lX, IRQ Channel: %d\n",
1932              Controller, Controller->PCI_Address,
1933              (unsigned long) Controller->BaseAddress,
1934              Controller->IRQ_Channel);
1935  DAC960_Info("  Controller Queue Depth: %d, "
1936              "Maximum Blocks per Command: %d\n",
1937              Controller, Controller->ControllerQueueDepth,
1938              Controller->MaxBlocksPerCommand);
1939  DAC960_Info("  Driver Queue Depth: %d, "
1940              "Scatter/Gather Limit: %d of %d Segments\n",
1941              Controller, Controller->DriverQueueDepth,
1942              Controller->DriverScatterGatherLimit,
1943              Controller->ControllerScatterGatherLimit);
1944  if (Controller->FirmwareType == DAC960_V1_Controller)
1945    {
1946      DAC960_Info("  Stripe Size: %dKB, Segment Size: %dKB, "
1947                  "BIOS Geometry: %d/%d\n", Controller,
1948                  Controller->V1.StripeSize,
1949                  Controller->V1.SegmentSize,
1950                  Controller->V1.GeometryTranslationHeads,
1951                  Controller->V1.GeometryTranslationSectors);
1952      if (Controller->V1.SAFTE_EnclosureManagementEnabled)
1953        DAC960_Info("  SAF-TE Enclosure Management Enabled\n", Controller);
1954    }
1955  return true;
1956}
1957
1958
1959/*
1960  DAC960_V1_ReadDeviceConfiguration reads the Device Configuration Information
1961  for DAC960 V1 Firmware Controllers by requesting the SCSI Inquiry and SCSI
1962  Inquiry Unit Serial Number information for each device connected to
1963  Controller.
1964*/
1965
1966static bool DAC960_V1_ReadDeviceConfiguration(DAC960_Controller_T
1967                                                 *Controller)
1968{
1969  struct dma_loaf local_dma;
1970
1971  dma_addr_t DCDBs_dma[DAC960_V1_MaxChannels];
1972  DAC960_V1_DCDB_T *DCDBs_cpu[DAC960_V1_MaxChannels];
1973
1974  dma_addr_t SCSI_Inquiry_dma[DAC960_V1_MaxChannels];
1975  DAC960_SCSI_Inquiry_T *SCSI_Inquiry_cpu[DAC960_V1_MaxChannels];
1976
1977  dma_addr_t SCSI_NewInquiryUnitSerialNumberDMA[DAC960_V1_MaxChannels];
1978  DAC960_SCSI_Inquiry_UnitSerialNumber_T *SCSI_NewInquiryUnitSerialNumberCPU[DAC960_V1_MaxChannels];
1979
1980  struct completion Completions[DAC960_V1_MaxChannels];
1981  unsigned long flags;
1982  int Channel, TargetID;
1983
1984  if (!init_dma_loaf(Controller->PCIDevice, &local_dma, 
1985                DAC960_V1_MaxChannels*(sizeof(DAC960_V1_DCDB_T) +
1986                        sizeof(DAC960_SCSI_Inquiry_T) +
1987                        sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T))))
1988     return DAC960_Failure(Controller,
1989                        "DMA ALLOCATION FAILED IN ReadDeviceConfiguration"); 
1990   
1991  for (Channel = 0; Channel < Controller->Channels; Channel++) {
1992        DCDBs_cpu[Channel] = slice_dma_loaf(&local_dma,
1993                        sizeof(DAC960_V1_DCDB_T), DCDBs_dma + Channel);
1994        SCSI_Inquiry_cpu[Channel] = slice_dma_loaf(&local_dma,
1995                        sizeof(DAC960_SCSI_Inquiry_T),
1996                        SCSI_Inquiry_dma + Channel);
1997        SCSI_NewInquiryUnitSerialNumberCPU[Channel] = slice_dma_loaf(&local_dma,
1998                        sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T),
1999                        SCSI_NewInquiryUnitSerialNumberDMA + Channel);
2000  }
2001                
2002  for (TargetID = 0; TargetID < Controller->Targets; TargetID++)
2003    {
2004      /*
2005       * For each channel, submit a probe for a device on that channel.
2006       * The timeout interval for a device that is present is 10 seconds.
2007       * With this approach, the timeout periods can elapse in parallel
2008       * on each channel.
2009       */
2010      for (Channel = 0; Channel < Controller->Channels; Channel++)
2011        {
2012          dma_addr_t NewInquiryStandardDataDMA = SCSI_Inquiry_dma[Channel];
2013          DAC960_V1_DCDB_T *DCDB = DCDBs_cpu[Channel];
2014          dma_addr_t DCDB_dma = DCDBs_dma[Channel];
2015          DAC960_Command_T *Command = Controller->Commands[Channel];
2016          struct completion *Completion = &Completions[Channel];
2017
2018          init_completion(Completion);
2019          DAC960_V1_ClearCommand(Command);
2020          Command->CommandType = DAC960_ImmediateCommand;
2021          Command->Completion = Completion;
2022          Command->V1.CommandMailbox.Type3.CommandOpcode = DAC960_V1_DCDB;
2023          Command->V1.CommandMailbox.Type3.BusAddress = DCDB_dma;
2024          DCDB->Channel = Channel;
2025          DCDB->TargetID = TargetID;
2026          DCDB->Direction = DAC960_V1_DCDB_DataTransferDeviceToSystem;
2027          DCDB->EarlyStatus = false;
2028          DCDB->Timeout = DAC960_V1_DCDB_Timeout_10_seconds;
2029          DCDB->NoAutomaticRequestSense = false;
2030          DCDB->DisconnectPermitted = true;
2031          DCDB->TransferLength = sizeof(DAC960_SCSI_Inquiry_T);
2032          DCDB->BusAddress = NewInquiryStandardDataDMA;
2033          DCDB->CDBLength = 6;
2034          DCDB->TransferLengthHigh4 = 0;
2035          DCDB->SenseLength = sizeof(DCDB->SenseData);
2036          DCDB->CDB[0] = 0x12; /* INQUIRY */
2037          DCDB->CDB[1] = 0; /* EVPD = 0 */
2038          DCDB->CDB[2] = 0; /* Page Code */
2039          DCDB->CDB[3] = 0; /* Reserved */
2040          DCDB->CDB[4] = sizeof(DAC960_SCSI_Inquiry_T);
2041          DCDB->CDB[5] = 0; /* Control */
2042
2043          spin_lock_irqsave(&Controller->queue_lock, flags);
2044          DAC960_QueueCommand(Command);
2045          spin_unlock_irqrestore(&Controller->queue_lock, flags);
2046        }
2047      /*
2048       * Wait for the problems submitted in the previous loop
2049       * to complete.  On the probes that are successful, 
2050       * get the serial number of the device that was found.
2051       */
2052      for (Channel = 0; Channel < Controller->Channels; Channel++)
2053        {
2054          DAC960_SCSI_Inquiry_T *InquiryStandardData =
2055            &Controller->V1.InquiryStandardData[Channel][TargetID];
2056          DAC960_SCSI_Inquiry_T *NewInquiryStandardData = SCSI_Inquiry_cpu[Channel];
2057          dma_addr_t NewInquiryUnitSerialNumberDMA =
2058                        SCSI_NewInquiryUnitSerialNumberDMA[Channel];
2059          DAC960_SCSI_Inquiry_UnitSerialNumber_T *NewInquiryUnitSerialNumber =
2060                        SCSI_NewInquiryUnitSerialNumberCPU[Channel];
2061          DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber =
2062            &Controller->V1.InquiryUnitSerialNumber[Channel][TargetID];
2063          DAC960_Command_T *Command = Controller->Commands[Channel];
2064          DAC960_V1_DCDB_T *DCDB = DCDBs_cpu[Channel];
2065          struct completion *Completion = &Completions[Channel];
2066
2067          wait_for_completion(Completion);
2068
2069          if (Command->V1.CommandStatus != DAC960_V1_NormalCompletion) {
2070            memset(InquiryStandardData, 0, sizeof(DAC960_SCSI_Inquiry_T));
2071            InquiryStandardData->PeripheralDeviceType = 0x1F;
2072            continue;
2073          } else
2074            memcpy(InquiryStandardData, NewInquiryStandardData, sizeof(DAC960_SCSI_Inquiry_T));
2075        
2076          /* Preserve Channel and TargetID values from the previous loop */
2077          Command->Completion = Completion;
2078          DCDB->TransferLength = sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T);
2079          DCDB->BusAddress = NewInquiryUnitSerialNumberDMA;
2080          DCDB->SenseLength = sizeof(DCDB->SenseData);
2081          DCDB->CDB[0] = 0x12; /* INQUIRY */
2082          DCDB->CDB[1] = 1; /* EVPD = 1 */
2083          DCDB->CDB[2] = 0x80; /* Page Code */
2084          DCDB->CDB[3] = 0; /* Reserved */
2085          DCDB->CDB[4] = sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T);
2086          DCDB->CDB[5] = 0; /* Control */
2087
2088          spin_lock_irqsave(&Controller->queue_lock, flags);
2089          DAC960_QueueCommand(Command);
2090          spin_unlock_irqrestore(&Controller->queue_lock, flags);
2091          wait_for_completion(Completion);
2092
2093          if (Command->V1.CommandStatus != DAC960_V1_NormalCompletion) {
2094                memset(InquiryUnitSerialNumber, 0,
2095                        sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T));
2096                InquiryUnitSerialNumber->PeripheralDeviceType = 0x1F;
2097          } else
2098                memcpy(InquiryUnitSerialNumber, NewInquiryUnitSerialNumber,
2099                        sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T));
2100        }
2101    }
2102    free_dma_loaf(Controller->PCIDevice, &local_dma);
2103  return true;
2104}
2105
2106
2107/*
2108  DAC960_V2_ReadDeviceConfiguration reads the Device Configuration Information
2109  for DAC960 V2 Firmware Controllers by requesting the Physical Device
2110  Information and SCSI Inquiry Unit Serial Number information for each
2111  device connected to Controller.
2112*/
2113
2114static bool DAC960_V2_ReadDeviceConfiguration(DAC960_Controller_T
2115                                                 *Controller)
2116{
2117  unsigned char Channel = 0, TargetID = 0, LogicalUnit = 0;
2118  unsigned short PhysicalDeviceIndex = 0;
2119
2120  while (true)
2121    {
2122      DAC960_V2_PhysicalDeviceInfo_T *NewPhysicalDeviceInfo =
2123                Controller->V2.NewPhysicalDeviceInformation;
2124      DAC960_V2_PhysicalDeviceInfo_T *PhysicalDeviceInfo;
2125      DAC960_SCSI_Inquiry_UnitSerialNumber_T *NewInquiryUnitSerialNumber =
2126                Controller->V2.NewInquiryUnitSerialNumber;
2127      DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber;
2128
2129      if (!DAC960_V2_NewPhysicalDeviceInfo(Controller, Channel, TargetID, LogicalUnit))
2130          break;
2131
2132      PhysicalDeviceInfo = kmalloc(sizeof(DAC960_V2_PhysicalDeviceInfo_T),
2133                                    GFP_ATOMIC);
2134      if (PhysicalDeviceInfo == NULL)
2135                return DAC960_Failure(Controller, "PHYSICAL DEVICE ALLOCATION");
2136      Controller->V2.PhysicalDeviceInformation[PhysicalDeviceIndex] =
2137                PhysicalDeviceInfo;
2138      memcpy(PhysicalDeviceInfo, NewPhysicalDeviceInfo,
2139                sizeof(DAC960_V2_PhysicalDeviceInfo_T));
2140
2141      InquiryUnitSerialNumber = kmalloc(
2142              sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T), GFP_ATOMIC);
2143      if (InquiryUnitSerialNumber == NULL) {
2144        kfree(PhysicalDeviceInfo);
2145        return DAC960_Failure(Controller, "SERIAL NUMBER ALLOCATION");
2146      }
2147      Controller->V2.InquiryUnitSerialNumber[PhysicalDeviceIndex] =
2148                InquiryUnitSerialNumber;
2149
2150      Channel = NewPhysicalDeviceInfo->Channel;
2151      TargetID = NewPhysicalDeviceInfo->TargetID;
2152      LogicalUnit = NewPhysicalDeviceInfo->LogicalUnit;
2153
2154      /*
2155         Some devices do NOT have Unit Serial Numbers.
2156         This command fails for them.  But, we still want to
2157         remember those devices are there.  Construct a
2158         UnitSerialNumber structure for the failure case.
2159      */
2160      if (!DAC960_V2_NewInquiryUnitSerialNumber(Controller, Channel, TargetID, LogicalUnit)) {
2161        memset(InquiryUnitSerialNumber, 0,
2162             sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T));
2163        InquiryUnitSerialNumber->PeripheralDeviceType = 0x1F;
2164      } else
2165        memcpy(InquiryUnitSerialNumber, NewInquiryUnitSerialNumber,
2166                sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T));
2167
2168      PhysicalDeviceIndex++;
2169      LogicalUnit++;
2170    }
2171  return true;
2172}
2173
2174
2175/*
2176  DAC960_SanitizeInquiryData sanitizes the Vendor, Model, Revision, and
2177  Product Serial Number fields of the Inquiry Standard Data and Inquiry
2178  Unit Serial Number structures.
2179*/
2180
2181static void DAC960_SanitizeInquiryData(DAC960_SCSI_Inquiry_T
2182                                         *InquiryStandardData,
2183                                       DAC960_SCSI_Inquiry_UnitSerialNumber_T
2184                                         *InquiryUnitSerialNumber,
2185                                       unsigned char *Vendor,
2186                                       unsigned char *Model,
2187                                       unsigned char *Revision,
2188                                       unsigned char *SerialNumber)
2189{
2190  int SerialNumberLength, i;
2191  if (InquiryStandardData->PeripheralDeviceType == 0x1F) return;
2192  for (i = 0; i < sizeof(InquiryStandardData->VendorIdentification); i++)
2193    {
2194      unsigned char VendorCharacter =
2195        InquiryStandardData->VendorIdentification[i];
2196      Vendor[i] = (VendorCharacter >= ' ' && VendorCharacter <= '~'
2197                   ? VendorCharacter : ' ');
2198    }
2199  Vendor[sizeof(InquiryStandardData->VendorIdentification)] = '\0';
2200  for (i = 0; i < sizeof(InquiryStandardData->ProductIdentification); i++)
2201    {
2202      unsigned char ModelCharacter =
2203        InquiryStandardData->ProductIdentification[i];
2204      Model[i] = (ModelCharacter >= ' ' && ModelCharacter <= '~'
2205                  ? ModelCharacter : ' ');
2206    }
2207  Model[sizeof(InquiryStandardData->ProductIdentification)] = '\0';
2208  for (i = 0; i < sizeof(InquiryStandardData->ProductRevisionLevel); i++)
2209    {
2210      unsigned char RevisionCharacter =
2211        InquiryStandardData->ProductRevisionLevel[i];
2212      Revision[i] = (RevisionCharacter >= ' ' && RevisionCharacter <= '~'
2213                     ? RevisionCharacter : ' ');
2214    }
2215  Revision[sizeof(InquiryStandardData->ProductRevisionLevel)] = '\0';
2216  if (InquiryUnitSerialNumber->PeripheralDeviceType == 0x1F) return;
2217  SerialNumberLength = InquiryUnitSerialNumber->PageLength;
2218  if (SerialNumberLength >
2219      sizeof(InquiryUnitSerialNumber->ProductSerialNumber))
2220    SerialNumberLength = sizeof(InquiryUnitSerialNumber->ProductSerialNumber);
2221  for (i = 0; i < SerialNumberLength; i++)
2222    {
2223      unsigned char SerialNumberCharacter =
2224        InquiryUnitSerialNumber->ProductSerialNumber[i];
2225      SerialNumber[i] =
2226        (SerialNumberCharacter >= ' ' && SerialNumberCharacter <= '~'
2227         ? SerialNumberCharacter : ' ');
2228    }
2229  SerialNumber[SerialNumberLength] = '\0';
2230}
2231
2232
2233/*
2234  DAC960_V1_ReportDeviceConfiguration reports the Device Configuration
2235  Information for DAC960 V1 Firmware Controllers.
2236*/
2237
2238static bool DAC960_V1_ReportDeviceConfiguration(DAC960_Controller_T
2239                                                   *Controller)
2240{
2241  int LogicalDriveNumber, Channel, TargetID;
2242  DAC960_Info("  Physical Devices:\n", Controller);
2243  for (Channel = 0; Channel < Controller->Channels; Channel++)
2244    for (TargetID = 0; TargetID < Controller->Targets; TargetID++)
2245      {
2246        DAC960_SCSI_Inquiry_T *InquiryStandardData =
2247          &Controller->V1.InquiryStandardData[Channel][TargetID];
2248        DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber =
2249          &Controller->V1.InquiryUnitSerialNumber[Channel][TargetID];
2250        DAC960_V1_DeviceState_T *DeviceState =
2251          &Controller->V1.DeviceState[Channel][TargetID];
2252        DAC960_V1_ErrorTableEntry_T *ErrorEntry =
2253          &Controller->V1.ErrorTable.ErrorTableEntries[Channel][TargetID];
2254        char Vendor[1+sizeof(InquiryStandardData->VendorIdentification)];
2255        char Model[1+sizeof(InquiryStandardData->ProductIdentification)];
2256        char Revision[1+sizeof(InquiryStandardData->ProductRevisionLevel)];
2257        char SerialNumber[1+sizeof(InquiryUnitSerialNumber
2258                                   ->ProductSerialNumber)];
2259        if (InquiryStandardData->PeripheralDeviceType == 0x1F) continue;
2260        DAC960_SanitizeInquiryData(InquiryStandardData, InquiryUnitSerialNumber,
2261                                   Vendor, Model, Revision, SerialNumber);
2262        DAC960_Info("    %d:%d%s Vendor: %s  Model: %s  Revision: %s\n",
2263                    Controller, Channel, TargetID, (TargetID < 10 ? " " : ""),
2264                    Vendor, Model, Revision);
2265        if (InquiryUnitSerialNumber->PeripheralDeviceType != 0x1F)
2266          DAC960_Info("         Serial Number: %s\n", Controller, SerialNumber);
2267        if (DeviceState->Present &&
2268            DeviceState->DeviceType == DAC960_V1_DiskType)
2269          {
2270            if (Controller->V1.DeviceResetCount[Channel][TargetID] > 0)
2271              DAC960_Info("         Disk Status: %s, %u blocks, %d resets\n",
2272                          Controller,
2273                          (DeviceState->DeviceState == DAC960_V1_Device_Dead
2274                           ? "Dead"
2275                           : DeviceState->DeviceState
2276                             == DAC960_V1_Device_WriteOnly
2277                             ? "Write-Only"
2278                             : DeviceState->DeviceState
2279                               == DAC960_V1_Device_Online
2280                               ? "Online" : "Standby"),
2281                          DeviceState->DiskSize,
2282                          Controller->V1.DeviceResetCount[Channel][TargetID]);
2283            else
2284              DAC960_Info("         Disk Status: %s, %u blocks\n", Controller,
2285                          (DeviceState->DeviceState == DAC960_V1_Device_Dead
2286                           ? "Dead"
2287                           : DeviceState->DeviceState
2288                             == DAC960_V1_Device_WriteOnly
2289                             ? "Write-Only"
2290                             : DeviceState->DeviceState
2291                               == DAC960_V1_Device_Online
2292                               ? "Online" : "Standby"),
2293                          DeviceState->DiskSize);
2294          }
2295        if (ErrorEntry->ParityErrorCount > 0 ||
2296            ErrorEntry->SoftErrorCount > 0 ||
2297            ErrorEntry->HardErrorCount > 0 ||
2298            ErrorEntry->MiscErrorCount > 0)
2299          DAC960_Info("         Errors - Parity: %d, Soft: %d, "
2300                      "Hard: %d, Misc: %d\n", Controller,
2301                      ErrorEntry->ParityErrorCount,
2302                      ErrorEntry->SoftErrorCount,
2303                      ErrorEntry->HardErrorCount,
2304                      ErrorEntry->MiscErrorCount);
2305      }
2306  DAC960_Info("  Logical Drives:\n", Controller);
2307  for (LogicalDriveNumber = 0;
2308       LogicalDriveNumber < Controller->LogicalDriveCount;
2309       LogicalDriveNumber++)
2310    {
2311      DAC960_V1_LogicalDriveInformation_T *LogicalDriveInformation =
2312        &Controller->V1.LogicalDriveInformation[LogicalDriveNumber];
2313      DAC960_Info("    /dev/rd/c%dd%d: RAID-%d, %s, %u blocks, %s\n",
2314                  Controller, Controller->ControllerNumber, LogicalDriveNumber,
2315                  LogicalDriveInformation->RAIDLevel,
2316                  (LogicalDriveInformation->LogicalDriveState
2317                   == DAC960_V1_LogicalDrive_Online
2318                   ? "Online"
2319                   : LogicalDriveInformation->LogicalDriveState
2320                     == DAC960_V1_LogicalDrive_Critical
2321                     ? "Critical" : "Offline"),
2322                  LogicalDriveInformation->LogicalDriveSize,
2323                  (LogicalDriveInformation->WriteBack
2324                   ? "Write Back" : "Write Thru"));
2325    }
2326  return true;
2327}
2328
2329
2330/*
2331  DAC960_V2_ReportDeviceConfiguration reports the Device Configuration
2332  Information for DAC960 V2 Firmware Controllers.
2333*/
2334
2335static bool DAC960_V2_ReportDeviceConfiguration(DAC960_Controller_T
2336                                                   *Controller)
2337{
2338  int PhysicalDeviceIndex, LogicalDriveNumber;
2339  DAC960_Info("  Physical Devices:\n", Controller);
2340  for (PhysicalDeviceIndex = 0;
2341       PhysicalDeviceIndex < DAC960_V2_MaxPhysicalDevices;
2342       PhysicalDeviceIndex++)
2343    {
2344      DAC960_V2_PhysicalDeviceInfo_T *PhysicalDeviceInfo =
2345        Controller->V2.PhysicalDeviceInformation[PhysicalDeviceIndex];
2346      DAC960_SCSI_Inquiry_T *InquiryStandardData =
2347        (DAC960_SCSI_Inquiry_T *) &PhysicalDeviceInfo->SCSI_InquiryData;
2348      DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber =
2349        Controller->V2.InquiryUnitSerialNumber[PhysicalDeviceIndex];
2350      char Vendor[1+sizeof(InquiryStandardData->VendorIdentification)];
2351      char Model[1+sizeof(InquiryStandardData->ProductIdentification)];
2352      char Revision[1+sizeof(InquiryStandardData->ProductRevisionLevel)];
2353      char SerialNumber[1+sizeof(InquiryUnitSerialNumber->ProductSerialNumber)];
2354      if (PhysicalDeviceInfo == NULL) break;
2355      DAC960_SanitizeInquiryData(InquiryStandardData, InquiryUnitSerialNumber,
2356                                 Vendor, Model, Revision, SerialNumber);
2357      DAC960_Info("    %d:%d%s Vendor: %s  Model: %s  Revision: %s\n",
2358                  Controller,
2359                  PhysicalDeviceInfo->Channel,
2360                  PhysicalDeviceInfo->TargetID,
2361                  (PhysicalDeviceInfo->TargetID < 10 ? " " : ""),
2362                  Vendor, Model, Revision);
2363      if (PhysicalDeviceInfo->NegotiatedSynchronousMegaTransfers == 0)
2364        DAC960_Info("         %sAsynchronous\n", Controller,
2365                    (PhysicalDeviceInfo->NegotiatedDataWidthBits == 16
2366                     ? "Wide " :""));
2367      else
2368        DAC960_Info("         %sSynchronous at %d MB/sec\n", Controller,
2369                    (PhysicalDeviceInfo->NegotiatedDataWidthBits == 16
2370                     ? "Wide " :""),
2371                    (PhysicalDeviceInfo->NegotiatedSynchronousMegaTransfers
2372                     * PhysicalDeviceInfo->NegotiatedDataWidthBits/8));
2373      if (InquiryUnitSerialNumber->PeripheralDeviceType != 0x1F)
2374        DAC960_Info("         Serial Number: %s\n", Controller, SerialNumber);
2375      if (PhysicalDeviceInfo->PhysicalDeviceState ==
2376          DAC960_V2_Device_Unconfigured)
2377        continue;
2378      DAC960_Info("         Disk Status: %s, %u blocks\n", Controller,
2379                  (PhysicalDeviceInfo->PhysicalDeviceState
2380                   == DAC960_V2_Device_Online
2381                   ? "Online"
2382                   : PhysicalDeviceInfo->PhysicalDeviceState
2383                     == DAC960_V2_Device_Rebuild
2384                     ? "Rebuild"
2385                     : PhysicalDeviceInfo->PhysicalDeviceState
2386                       == DAC960_V2_Device_Missing
2387                       ? "Missing"
2388                       : PhysicalDeviceInfo->PhysicalDeviceState
2389                         == DAC960_V2_Device_Critical
2390                         ? "Critical"
2391                         : PhysicalDeviceInfo->PhysicalDeviceState
2392                           == DAC960_V2_Device_Dead
2393                           ? "Dead"
2394                           : PhysicalDeviceInfo->PhysicalDeviceState
2395                             == DAC960_V2_Device_SuspectedDead
2396                             ? "Suspected-Dead"
2397                             : PhysicalDeviceInfo->PhysicalDeviceState
2398                               == DAC960_V2_Device_CommandedOffline
2399                               ? "Commanded-Offline"
2400                               : PhysicalDeviceInfo->PhysicalDeviceState
2401                                 == DAC960_V2_Device_Standby
2402                                 ? "Standby" : "Unknown"),
2403                  PhysicalDeviceInfo->ConfigurableDeviceSize);
2404      if (PhysicalDeviceInfo->ParityErrors == 0 &&
2405          PhysicalDeviceInfo->SoftErrors == 0 &&
2406          PhysicalDeviceInfo->HardErrors == 0 &&
2407          PhysicalDeviceInfo->MiscellaneousErrors == 0 &&
2408          PhysicalDeviceInfo->CommandTimeouts == 0 &&
2409          PhysicalDeviceInfo->Retries == 0 &&
2410          PhysicalDeviceInfo->Aborts == 0 &&
2411          PhysicalDeviceInfo->PredictedFailuresDetected == 0)
2412        continue;
2413      DAC960_Info("         Errors - Parity: %d, Soft: %d, "
2414                  "Hard: %d, Misc: %d\n", Controller,
2415                  PhysicalDeviceInfo->ParityErrors,
2416                  PhysicalDeviceInfo->SoftErrors,
2417                  PhysicalDeviceInfo->HardErrors,
2418                  PhysicalDeviceInfo->MiscellaneousErrors);
2419      DAC960_Info("                  Timeouts: %d, Retries: %d, "
2420                  "Aborts: %d, Predicted: %d\n", Controller,
2421                  PhysicalDeviceInfo->CommandTimeouts,
2422                  PhysicalDeviceInfo->Retries,
2423                  PhysicalDeviceInfo->Aborts,
2424                  PhysicalDeviceInfo->PredictedFailuresDetected);
2425    }
2426  DAC960_Info("  Logical Drives:\n", Controller);
2427  for (LogicalDriveNumber = 0;
2428       LogicalDriveNumber < DAC960_MaxLogicalDrives;
2429       LogicalDriveNumber++)
2430    {
2431      DAC960_V2_LogicalDeviceInfo_T *LogicalDeviceInfo =
2432        Controller->V2.LogicalDeviceInformation[LogicalDriveNumber];
2433      unsigned char *ReadCacheStatus[] = { "Read Cache Disabled",
2434                                           "Read Cache Enabled",
2435                                           "Read Ahead Enabled",
2436                                           "Intelligent Read Ahead Enabled",
2437                                           "-", "-", "-", "-" };
2438      unsigned char *WriteCacheStatus[] = { "Write Cache Disabled",
2439                                            "Logical Device Read Only",
2440                                            "Write Cache Enabled",
2441                                            "Intelligent Write Cache Enabled",
2442                                            "-", "-", "-", "-" };
2443      unsigned char *GeometryTranslation;
2444      if (LogicalDeviceInfo == NULL) continue;
2445      switch (LogicalDeviceInfo->DriveGeometry)
2446        {
2447        case DAC960_V2_Geometry_128_32:
2448          GeometryTranslation = "128/32";
2449          break;
2450        case DAC960_V2_Geometry_255_63:
2451          GeometryTranslation = "255/63";
2452          break;
2453        default:
2454          GeometryTranslation = "Invalid";
2455          DAC960_Error("Illegal Logical Device Geometry %d\n",
2456                       Controller, LogicalDeviceInfo->DriveGeometry);
2457          break;
2458        }
2459      DAC960_Info("    /dev/rd/c%dd%d: RAID-%d, %s, %u blocks\n",
2460                  Controller, Controller->ControllerNumber, LogicalDriveNumber,
2461                  LogicalDeviceInfo->RAIDLevel,
2462                  (LogicalDeviceInfo->LogicalDeviceState
2463                   == DAC960_V2_LogicalDevice_Online
2464                   ? "Online"
2465                   : LogicalDeviceInfo->LogicalDeviceState
2466                     == DAC960_V2_LogicalDevice_Critical
2467                     ? "Critical" : "Offline"),
2468                  LogicalDeviceInfo->ConfigurableDeviceSize);
2469      DAC960_Info("                  Logical Device %s, BIOS Geometry: %s\n",
2470                  Controller,
2471                  (LogicalDeviceInfo->LogicalDeviceControl
2472                                     .LogicalDeviceInitialized
2473                   ? "Initialized" : "Uninitialized"),
2474                  GeometryTranslation);
2475      if (LogicalDeviceInfo->StripeSize == 0)
2476        {
2477          if (LogicalDeviceInfo->CacheLineSize == 0)
2478            DAC960_Info("                  Stripe Size: N/A, "
2479                        "Segment Size: N/A\n", Controller);
2480          else
2481            DAC960_Info("                  Stripe Size: N/A, "
2482                        "Segment Size: %dKB\n", Controller,
2483                        1 << (LogicalDeviceInfo->CacheLineSize - 2));
2484        }
2485      else
2486        {
2487          if (LogicalDeviceInfo->CacheLineSize == 0)
2488            DAC960_Info("                  Stripe Size: %dKB, "
2489                        "Segment Size: N/A\n", Controller,
2490                        1 << (LogicalDeviceInfo->StripeSize - 2));
2491          else
2492            DAC960_Info("                  Stripe Size: %dKB, "
2493                        "Segment Size: %dKB\n", Controller,
2494                        1 << (LogicalDeviceInfo->StripeSize - 2),
2495                        1 << (LogicalDeviceInfo->CacheLineSize - 2));
2496        }
2497      DAC960_Info("                  %s, %s\n", Controller,
2498                  ReadCacheStatus[
2499                    LogicalDeviceInfo->LogicalDeviceControl.ReadCache],
2500                  WriteCacheStatus[
2501                    LogicalDeviceInfo->LogicalDeviceControl.WriteCache]);
2502      if (LogicalDeviceInfo->SoftErrors > 0 ||
2503          LogicalDeviceInfo->CommandsFailed > 0 ||
2504          LogicalDeviceInfo->DeferredWriteErrors)
2505        DAC960_Info("                  Errors - Soft: %d, Failed: %d, "
2506                    "Deferred Write: %d\n", Controller,
2507                    LogicalDeviceInfo->SoftErrors,
2508                    LogicalDeviceInfo->CommandsFailed,
2509                    LogicalDeviceInfo->DeferredWriteErrors);
2510
2511    }
2512  return true;
2513}
2514
2515/*
2516  DAC960_RegisterBlockDevice registers the Block Device structures
2517  associated with Controller.
2518*/
2519
2520static bool DAC960_RegisterBlockDevice(DAC960_Controller_T *Controller)
2521{
2522  int MajorNumber = DAC960_MAJOR + Controller->ControllerNumber;
2523  int n;
2524
2525  /*
2526    Register the Block Device Major Number for this DAC960 Controller.
2527  */
2528  if (register_blkdev(MajorNumber, "dac960") < 0)
2529      return false;
2530
2531  for (n = 0; n < DAC960_MaxLogicalDrives; n++) {
2532        struct gendisk *disk = Controller->disks[n];
2533        struct request_queue *RequestQueue;
2534
2535        /* for now, let all request queues share controller's lock */
2536        RequestQueue = blk_init_queue(DAC960_RequestFunction,&Controller->queue_lock);
2537        if (!RequestQueue) {
2538                printk("DAC960: failure to allocate request queue\n");
2539                continue;
2540        }
2541        Controller->RequestQueue[n] = RequestQueue;
2542        blk_queue_bounce_limit(RequestQueue, Controller->BounceBufferLimit);
2543        RequestQueue->queuedata = Controller;
2544        blk_queue_max_segments(RequestQueue, Controller->DriverScatterGatherLimit);
2545        blk_queue_max_hw_sectors(RequestQueue, Controller->MaxBlocksPerCommand);
2546        disk->queue = RequestQueue;
2547        sprintf(disk->disk_name, "rd/c%dd%d", Controller->ControllerNumber, n);
2548        disk->major = MajorNumber;
2549        disk->first_minor = n << DAC960_MaxPartitionsBits;
2550        disk->fops = &DAC960_BlockDeviceOperations;
2551   }
2552  /*
2553    Indicate the Block Device Registration completed successfully,
2554  */
2555  return true;
2556}
2557
2558
2559/*
2560  DAC960_UnregisterBlockDevice unregisters the Block Device structures
2561  associated with Controller.
2562*/
2563
2564static void DAC960_UnregisterBlockDevice(DAC960_Controller_T *Controller)
2565{
2566  int MajorNumber = DAC960_MAJOR + Controller->ControllerNumber;
2567  int disk;
2568
2569  /* does order matter when deleting gendisk and cleanup in request queue? */
2570  for (disk = 0; disk < DAC960_MaxLogicalDrives; disk++) {
2571        del_gendisk(Controller->disks[disk]);
2572        blk_cleanup_queue(Controller->RequestQueue[disk]);
2573        Controller->RequestQueue[disk] = NULL;
2574  }
2575
2576  /*
2577    Unregister the Block Device Major Number for this DAC960 Controller.
2578  */
2579  unregister_blkdev(MajorNumber, "dac960");
2580}
2581
2582/*
2583  DAC960_ComputeGenericDiskInfo computes the values for the Generic Disk
2584  Information Partition Sector Counts and Block Sizes.
2585*/
2586
2587static void DAC960_ComputeGenericDiskInfo(DAC960_Controller_T *Controller)
2588{
2589        int disk;
2590        for (disk = 0; disk < DAC960_MaxLogicalDrives; disk++)
2591                set_capacity(Controller->disks[disk], disk_size(Controller, disk));
2592}
2593
2594/*
2595  DAC960_ReportErrorStatus reports Controller BIOS Messages passed through
2596  the Error Status Register when the driver performs the BIOS handshaking.
2597  It returns true for fatal errors and false otherwise.
2598*/
2599
2600static bool DAC960_ReportErrorStatus(DAC960_Controller_T *Controller,
2601                                        unsigned char ErrorStatus,
2602                                        unsigned char Parameter0,
2603                                        unsigned char Parameter1)
2604{
2605  switch (ErrorStatus)
2606    {
2607    case 0x00:
2608      DAC960_Notice("Physical Device %d:%d Not Responding\n",
2609                    Controller, Parameter1, Parameter0);
2610      break;
2611    case 0x08:
2612      if (Controller->DriveSpinUpMessageDisplayed) break;
2613      DAC960_Notice("Spinning Up Drives\n", Controller);
2614      Controller->DriveSpinUpMessageDisplayed = true;
2615      break;
2616    case 0x30:
2617      DAC960_Notice("Configuration Checksum Error\n", Controller);
2618      break;
2619    case 0x60:
2620      DAC960_Notice("Mirror Race Recovery Failed\n", Controller);
2621      break;
2622    case 0x70:
2623      DAC960_Notice("Mirror Race Recovery In Progress\n", Controller);
2624      break;
2625    case 0x90:
2626      DAC960_Notice("Physical Device %d:%d COD Mismatch\n",
2627                    Controller, Parameter1, Parameter0);
2628      break;
2629    case 0xA0:
2630      DAC960_Notice("Logical Drive Installation Aborted\n", Controller);
2631      break;
2632    case 0xB0:
2633      DAC960_Notice("Mirror Race On A Critical Logical Drive\n", Controller);
2634      break;
2635    case 0xD0:
2636      DAC960_Notice("New Controller Configuration Found\n", Controller);
2637      break;
2638    case 0xF0:
2639      DAC960_Error("Fatal Memory Parity Error for Controller at\n", Controller);
2640      return true;
2641    default:
2642      DAC960_Error("Unknown Initialization Error %02X for Controller at\n",
2643                   Controller, ErrorStatus);
2644      return true;
2645    }
2646  return false;
2647}
2648
2649
2650/*
2651 * DAC960_DetectCleanup releases the resources that were allocated
2652 * during DAC960_DetectController().  DAC960_DetectController can
2653 * has several internal failure points, so not ALL resources may 
2654 * have been allocated.  It's important to free only
2655 * resources that HAVE been allocated.  The code below always
2656 * tests that the resource has been allocated before attempting to
2657 * free it.
2658 */
2659static void DAC960_DetectCleanup(DAC960_Controller_T *Controller)
2660{
2661  int i;
2662
2663  /* Free the memory mailbox, status, and related structures */
2664  free_dma_loaf(Controller->PCIDevice, &Controller->DmaPages);
2665  if (Controller->MemoryMappedAddress) {
2666        switch(Controller->HardwareType)
2667        {
2668                case DAC960_GEM_Controller:
2669                        DAC960_GEM_DisableInterrupts(Controller->BaseAddress);
2670                        break;
2671                case DAC960_BA_Controller:
2672                        DAC960_BA_DisableInterrupts(Controller->BaseAddress);
2673                        break;
2674                case DAC960_LP_Controller:
2675                        DAC960_LP_DisableInterrupts(Controller->BaseAddress);
2676                        break;
2677                case DAC960_LA_Controller:
2678                        DAC960_LA_DisableInterrupts(Controller->BaseAddress);
2679                        break;
2680                case DAC960_PG_Controller:
2681                        DAC960_PG_DisableInterrupts(Controller->BaseAddress);
2682                        break;
2683                case DAC960_PD_Controller:
2684                        DAC960_PD_DisableInterrupts(Controller->BaseAddress);
2685                        break;
2686                case DAC960_P_Controller:
2687                        DAC960_PD_DisableInterrupts(Controller->BaseAddress);
2688                        break;
2689        }
2690        iounmap(Controller->MemoryMappedAddress);
2691  }
2692  if (Controller->IRQ_Channel)
2693        free_irq(Controller->IRQ_Channel, Controller);
2694  if (Controller->IO_Address)
2695        release_region(Controller->IO_Address, 0x80);
2696  pci_disable_device(Controller->PCIDevice);
2697  for (i = 0; (i < DAC960_MaxLogicalDrives) && Controller->disks[i]; i++)
2698       put_disk(Controller->disks[i]);
2699  DAC960_Controllers[Controller->ControllerNumber] = NULL;
2700  kfree(Controller);
2701}
2702
2703
2704/*
2705  DAC960_DetectController detects Mylex DAC960/AcceleRAID/eXtremeRAID
2706  PCI RAID Controllers by interrogating the PCI Configuration Space for
2707  Controller Type.
2708*/
2709
2710static DAC960_Controller_T * 
2711DAC960_DetectController(struct pci_dev *PCI_Device,
2712                        const struct pci_device_id *entry)
2713{
2714  struct DAC960_privdata *privdata =
2715                (struct DAC960_privdata *)entry->driver_data;
2716  irq_handler_t InterruptHandler = privdata->InterruptHandler;
2717  unsigned int MemoryWindowSize = privdata->MemoryWindowSize;
2718  DAC960_Controller_T *Controller = NULL;
2719  unsigned char DeviceFunction = PCI_Device->devfn;
2720  unsigned char ErrorStatus, Parameter0, Parameter1;
2721  unsigned int IRQ_Channel;
2722  void __iomem *BaseAddress;
2723  int i;
2724
2725  Controller = kzalloc(sizeof(DAC960_Controller_T), GFP_ATOMIC);
2726  if (Controller == NULL) {
2727        DAC960_Error("Unable to allocate Controller structure for "
2728                       "Controller at\n", NULL);
2729        return NULL;
2730  }
2731  Controller->ControllerNumber = DAC960_ControllerCount;
2732  DAC960_Controllers[DAC960_ControllerCount++] = Controller;
2733  Controller->Bus = PCI_Device->bus->number;
2734  Controller->FirmwareType = privdata->FirmwareType;
2735  Controller->HardwareType = privdata->HardwareType;
2736  Controller->Device = DeviceFunction >> 3;
2737  Controller->Function = DeviceFunction & 0x7;
2738  Controller->PCIDevice = PCI_Device;
2739  strcpy(Controller->FullModelName, "DAC960");
2740
2741  if (pci_enable_device(PCI_Device))
2742        goto Failure;
2743
2744  switch (Controller->HardwareType)
2745  {
2746        case DAC960_GEM_Controller:
2747          Controller->PCI_Address = pci_resource_start(PCI_Device, 0);
2748          break;
2749        case DAC960_BA_Controller:
2750          Controller->PCI_Address = pci_resource_start(PCI_Device, 0);
2751          break;
2752        case DAC960_LP_Controller:
2753          Controller->PCI_Address = pci_resource_start(PCI_Device, 0);
2754          break;
2755        case DAC960_LA_Controller:
2756          Controller->PCI_Address = pci_resource_start(PCI_Device, 0);
2757          break;
2758        case DAC960_PG_Controller:
2759          Controller->PCI_Address = pci_resource_start(PCI_Device, 0);
2760          break;
2761        case DAC960_PD_Controller:
2762          Controller->IO_Address = pci_resource_start(PCI_Device, 0);
2763          Controller->PCI_Address = pci_resource_start(PCI_Device, 1);
2764          break;
2765        case DAC960_P_Controller:
2766          Controller->IO_Address = pci_resource_start(PCI_Device, 0);
2767          Controller->PCI_Address = pci_resource_start(PCI_Device, 1);
2768          break;
2769  }
2770
2771  pci_set_drvdata(PCI_Device, (void *)((long)Controller->ControllerNumber));
2772  for (i = 0; i < DAC960_MaxLogicalDrives; i++) {
2773        Controller->disks[i] = alloc_disk(1<<DAC960_MaxPartitionsBits);
2774        if (!Controller->disks[i])
2775                goto Failure;
2776        Controller->disks[i]->private_data = (void *)((long)i);
2777  }
2778  init_waitqueue_head(&Controller->CommandWaitQueue);
2779  init_waitqueue_head(&Controller->HealthStatusWaitQueue);
2780  spin_lock_init(&Controller->queue_lock);
2781  DAC960_AnnounceDriver(Controller);
2782  /*
2783    Map the Controller Register Window.
2784  */
2785 if (MemoryWindowSize < PAGE_SIZE)
2786        MemoryWindowSize = PAGE_SIZE;
2787  Controller->MemoryMappedAddress =
2788        ioremap_nocache(Controller->PCI_Address & PAGE_MASK, MemoryWindowSize);
2789  Controller->BaseAddress =
2790        Controller->MemoryMappedAddress + (Controller->PCI_Address & ~PAGE_MASK);
2791  if (Controller->MemoryMappedAddress == NULL)
2792  {
2793          DAC960_Error("Unable to map Controller Register Window for "
2794                       "Controller at\n", Controller);
2795          goto Failure;
2796  }
2797  BaseAddress = Controller->BaseAddress;
2798  switch (Controller->HardwareType)
2799  {
2800        case DAC960_GEM_Controller:
2801          DAC960_GEM_DisableInterrupts(BaseAddress);
2802          DAC960_GEM_AcknowledgeHardwareMailboxStatus(BaseAddress);
2803          udelay(1000);
2804          while (DAC960_GEM_InitializationInProgressP(BaseAddress))
2805            {
2806              if (DAC960_GEM_ReadErrorStatus(BaseAddress, &ErrorStatus,
2807                                            &Parameter0, &Parameter1) &&
2808                  DAC960_ReportErrorStatus(Controller, ErrorStatus,
2809                                           Parameter0, Parameter1))
2810                goto Failure;
2811              udelay(10);
2812            }
2813          if (!DAC960_V2_EnableMemoryMailboxInterface(Controller))
2814            {
2815              DAC960_Error("Unable to Enable Memory Mailbox Interface "
2816                           "for Controller at\n", Controller);
2817              goto Failure;
2818            }
2819          DAC960_GEM_EnableInterrupts(BaseAddress);
2820          Controller->QueueCommand = DAC960_GEM_QueueCommand;
2821          Controller->ReadControllerConfiguration =
2822            DAC960_V2_ReadControllerConfiguration;
2823          Controller->ReadDeviceConfiguration =
2824            DAC960_V2_ReadDeviceConfiguration;
2825          Controller->ReportDeviceConfiguration =
2826            DAC960_V2_ReportDeviceConfiguration;
2827          Controller->QueueReadWriteCommand =
2828            DAC960_V2_QueueReadWriteCommand;
2829          break;
2830        case DAC960_BA_Controller:
2831          DAC960_BA_DisableInterrupts(BaseAddress);
2832          DAC960_BA_AcknowledgeHardwareMailboxStatus(BaseAddress);
2833          udelay(1000);
2834          while (DAC960_BA_InitializationInProgressP(BaseAddress))
2835            {
2836              if (DAC960_BA_ReadErrorStatus(BaseAddress, &ErrorStatus,
2837                                            &Parameter0, &Parameter1) &&
2838                  DAC960_ReportErrorStatus(Controller, ErrorStatus,
2839                                           Parameter0, Parameter1))
2840                goto Failure;
2841              udelay(10);
2842            }
2843          if (!DAC960_V2_EnableMemoryMailboxInterface(Controller))
2844            {
2845              DAC960_Error("Unable to Enable Memory Mailbox Interface "
2846                           "for Controller at\n", Controller);
2847              goto Failure;
2848            }
2849          DAC960_BA_EnableInterrupts(BaseAddress);
2850          Controller->QueueCommand = DAC960_BA_QueueCommand;
2851          Controller->ReadControllerConfiguration =
2852            DAC960_V2_ReadControllerConfiguration;
2853          Controller->ReadDeviceConfiguration =
2854            DAC960_V2_ReadDeviceConfiguration;
2855          Controller->ReportDeviceConfiguration =
2856            DAC960_V2_ReportDeviceConfiguration;
2857          Controller->QueueReadWriteCommand =
2858            DAC960_V2_QueueReadWriteCommand;
2859          break;
2860        case DAC960_LP_Controller:
2861          DAC960_LP_DisableInterrupts(BaseAddress);
2862          DAC960_LP_AcknowledgeHardwareMailboxStatus(BaseAddress);
2863          udelay(1000);
2864          while (DAC960_LP_InitializationInProgressP(BaseAddress))
2865            {
2866              if (DAC960_LP_ReadErrorStatus(BaseAddress, &ErrorStatus,
2867                                            &Parameter0, &Parameter1) &&
2868                  DAC960_ReportErrorStatus(Controller, ErrorStatus,
2869                                           Parameter0, Parameter1))
2870                goto Failure;
2871              udelay(10);
2872            }
2873          if (!DAC960_V2_EnableMemoryMailboxInterface(Controller))
2874            {
2875              DAC960_Error("Unable to Enable Memory Mailbox Interface "
2876                           "for Controller at\n", Controller);
2877              goto Failure;
2878            }
2879          DAC960_LP_EnableInterrupts(BaseAddress);
2880          Controller->QueueCommand = DAC960_LP_QueueCommand;
2881          Controller->ReadControllerConfiguration =
2882            DAC960_V2_ReadControllerConfiguration;
2883          Controller->ReadDeviceConfiguration =
2884            DAC960_V2_ReadDeviceConfiguration;
2885          Controller->ReportDeviceConfiguration =
2886            DAC960_V2_ReportDeviceConfiguration;
2887          Controller->QueueReadWriteCommand =
2888            DAC960_V2_QueueReadWriteCommand;
2889          break;
2890        case DAC960_LA_Controller:
2891          DAC960_LA_DisableInterrupts(BaseAddress);
2892          DAC960_LA_AcknowledgeHardwareMailboxStatus(BaseAddress);
2893          udelay(1000);
2894          while (DAC960_LA_InitializationInProgressP(BaseAddress))
2895            {
2896              if (DAC960_LA_ReadErrorStatus(BaseAddress, &ErrorStatus,
2897                                            &Parameter0, &Parameter1) &&
2898                  DAC960_ReportErrorStatus(Controller, ErrorStatus,
2899                                           Parameter0, Parameter1))
2900                goto Failure;
2901              udelay(10);
2902            }
2903          if (!DAC960_V1_EnableMemoryMailboxInterface(Controller))
2904            {
2905              DAC960_Error("Unable to Enable Memory Mailbox Interface "
2906                           "for Controller at\n", Controller);
2907              goto Failure;
2908            }
2909          DAC960_LA_EnableInterrupts(BaseAddress);
2910          if (Controller->V1.DualModeMemoryMailboxInterface)
2911            Controller->QueueCommand = DAC960_LA_QueueCommandDualMode;
2912          else Controller->QueueCommand = DAC960_LA_QueueCommandSingleMode;
2913          Controller->ReadControllerConfiguration =
2914            DAC960_V1_ReadControllerConfiguration;
2915          Controller->ReadDeviceConfiguration =
2916            DAC960_V1_ReadDeviceConfiguration;
2917          Controller->ReportDeviceConfiguration =
2918            DAC960_V1_ReportDeviceConfiguration;
2919          Controller->QueueReadWriteCommand =
2920            DAC960_V1_QueueReadWriteCommand;
2921          break;
2922        case DAC960_PG_Controller:
2923          DAC960_PG_DisableInterrupts(BaseAddress);
2924          DAC960_PG_AcknowledgeHardwareMailboxStatus(BaseAddress);
2925          udelay(1000);
2926          while (DAC960_PG_InitializationInProgressP(BaseAddress))
2927            {
2928              if (DAC960_PG_ReadErrorStatus(BaseAddress, &ErrorStatus,
2929                                            &Parameter0, &Parameter1) &&
2930                  DAC960_ReportErrorStatus(Controller, ErrorStatus,
2931                                           Parameter0, Parameter1))
2932                goto Failure;
2933              udelay(10);
2934            }
2935          if (!DAC960_V1_EnableMemoryMailboxInterface(Controller))
2936            {
2937              DAC960_Error("Unable to Enable Memory Mailbox Interface "
2938                           "for Controller at\n", Controller);
2939              goto Failure;
2940            }
2941          DAC960_PG_EnableInterrupts(BaseAddress);
2942          if (Controller->V1.DualModeMemoryMailboxInterface)
2943            Controller->QueueCommand = DAC960_PG_QueueCommandDualMode;
2944          else Controller->QueueCommand = DAC960_PG_QueueCommandSingleMode;
2945          Controller->ReadControllerConfiguration =
2946            DAC960_V1_ReadControllerConfiguration;
2947          Controller->ReadDeviceConfiguration =
2948            DAC960_V1_ReadDeviceConfiguration;
2949          Controller->ReportDeviceConfiguration =
2950            DAC960_V1_ReportDeviceConfiguration;
2951          Controller->QueueReadWriteCommand =
2952            DAC960_V1_QueueReadWriteCommand;
2953          break;
2954        case DAC960_PD_Controller:
2955          if (!request_region(Controller->IO_Address, 0x80,
2956                              Controller->FullModelName)) {
2957                DAC960_Error("IO port 0x%d busy for Controller at\n",
2958                             Controller, Controller->IO_Address);
2959                goto Failure;
2960          }
2961          DAC960_PD_DisableInterrupts(BaseAddress);
2962          DAC960_PD_AcknowledgeStatus(BaseAddress);
2963          udelay(1000);
2964          while (DAC960_PD_InitializationInProgressP(BaseAddress))
2965            {
2966              if (DAC960_PD_ReadErrorStatus(BaseAddress, &ErrorStatus,
2967                                            &Parameter0, &Parameter1) &&
2968                  DAC960_ReportErrorStatus(Controller, ErrorStatus,
2969                                           Parameter0, Parameter1))
2970                goto Failure;
2971              udelay(10);
2972            }
2973          if (!DAC960_V1_EnableMemoryMailboxInterface(Controller))
2974            {
2975              DAC960_Error("Unable to allocate DMA mapped memory "
2976                           "for Controller at\n", Controller);
2977              goto Failure;
2978            }
2979          DAC960_PD_EnableInterrupts(BaseAddress);
2980          Controller->QueueCommand = DAC960_PD_QueueCommand;
2981          Controller->ReadControllerConfiguration =
2982            DAC960_V1_ReadControllerConfiguration;
2983          Controller->ReadDeviceConfiguration =
2984            DAC960_V1_ReadDeviceConfiguration;
2985          Controller->ReportDeviceConfiguration =
2986            DAC960_V1_ReportDeviceConfiguration;
2987          Controller->QueueReadWriteCommand =
2988            DAC960_V1_QueueReadWriteCommand;
2989          break;
2990        case DAC960_P_Controller:
2991          if (!request_region(Controller->IO_Address, 0x80,
2992                              Controller->FullModelName)){
2993                DAC960_Error("IO port 0x%d busy for Controller at\n",
2994                             Controller, Controller->IO_Address);
2995                goto Failure;
2996          }
2997          DAC960_PD_DisableInterrupts(BaseAddress);
2998          DAC960_PD_AcknowledgeStatus(BaseAddress);
2999          udelay(1000);
3000          while (DAC960_PD_InitializationInProgressP(BaseAddress))
3001            {
3002              if (DAC960_PD_ReadErrorStatus(BaseAddress, &ErrorStatus,
3003                                            &Parameter0, &Parameter1) &&
3004                  DAC960_ReportErrorStatus(Controller, ErrorStatus,
3005                                           Parameter0, Parameter1))
3006                goto Failure;
3007              udelay(10);
3008            }
3009          if (!DAC960_V1_EnableMemoryMailboxInterface(Controller))
3010            {
3011              DAC960_Error("Unable to allocate DMA mapped memory"
3012                           "for Controller at\n", Controller);
3013              goto Failure;
3014            }
3015          DAC960_PD_EnableInterrupts(BaseAddress);
3016          Controller->QueueCommand = DAC960_P_QueueCommand;
3017          Controller->ReadControllerConfiguration =
3018            DAC960_V1_ReadControllerConfiguration;
3019          Controller->ReadDeviceConfiguration =
3020            DAC960_V1_ReadDeviceConfiguration;
3021          Controller->ReportDeviceConfiguration =
3022            DAC960_V1_ReportDeviceConfiguration;
3023          Controller->QueueReadWriteCommand =
3024            DAC960_V1_QueueReadWriteCommand;
3025          break;
3026  }
3027  /*
3028     Acquire shared access to the IRQ Channel.
3029  */
3030  IRQ_Channel = PCI_Device->irq;
3031  if (request_irq(IRQ_Channel, InterruptHandler, IRQF_SHARED,
3032                      Controller->FullModelName, Controller) < 0)
3033  {
3034        DAC960_Error("Unable to acquire IRQ Channel %d for Controller at\n",
3035                       Controller, Controller->IRQ_Channel);
3036        goto Failure;
3037  }
3038  Controller->IRQ_Channel = IRQ_Channel;
3039  Controller->InitialCommand.CommandIdentifier = 1;
3040  Controller->InitialCommand.Controller = Controller;
3041  Controller->Commands[0] = &Controller->InitialCommand;
3042  Controller->FreeCommands = &Controller->InitialCommand;
3043  return Controller;
3044      
3045Failure:
3046  if (Controller->IO_Address == 0)
3047        DAC960_Error("PCI Bus %d Device %d Function %d I/O Address N/A "
3048                     "PCI Address 0x%X\n", Controller,
3049                     Controller->Bus, Controller->Device,
3050                     Controller->Function, Controller->PCI_Address);
3051  else
3052        DAC960_Error("PCI Bus %d Device %d Function %d I/O Address "
3053                        "0x%X PCI Address 0x%X\n", Controller,
3054                        Controller->Bus, Controller->Device,
3055                        Controller->Function, Controller->IO_Address,
3056                        Controller->PCI_Address);
3057  DAC960_DetectCleanup(Controller);
3058  DAC960_ControllerCount--;
3059  return NULL;
3060}
3061
3062/*
3063  DAC960_InitializeController initializes Controller.
3064*/
3065
3066static bool 
3067DAC960_InitializeController(DAC960_Controller_T *Controller)
3068{
3069  if (DAC960_ReadControllerConfiguration(Controller) &&
3070      DAC960_ReportControllerConfiguration(Controller) &&
3071      DAC960_CreateAuxiliaryStructures(Controller) &&
3072      DAC960_ReadDeviceConfiguration(Controller) &&
3073      DAC960_ReportDeviceConfiguration(Controller) &&
3074      DAC960_RegisterBlockDevice(Controller))
3075    {
3076      /*
3077        Initialize the Monitoring Timer.
3078      */
3079      init_timer(&Controller->MonitoringTimer);
3080      Controller->MonitoringTimer.expires =
3081        jiffies + DAC960_MonitoringTimerInterval;
3082      Controller->MonitoringTimer.data = (unsigned long) Controller;
3083      Controller->MonitoringTimer.function = DAC960_MonitoringTimerFunction;
3084      add_timer(&Controller->MonitoringTimer);
3085      Controller->ControllerInitialized = true;
3086      return true;
3087    }
3088  return false;
3089}
3090
3091
3092/*
3093  DAC960_FinalizeController finalizes Controller.
3094*/
3095
3096static void DAC960_FinalizeController(DAC960_Controller_T *Controller)
3097{
3098  if (Controller->ControllerInitialized)
3099    {
3100      unsigned long flags;
3101
3102      /*
3103       * Acquiring and releasing lock here eliminates
3104       * a very low probability race.
3105       *
3106       * The code below allocates controller command structures
3107       * from the free list without holding the controller lock.
3108       * This is safe assuming there is no other activity on
3109       * the controller at the time.
3110       * 
3111       * But, there might be a monitoring command still
3112       * in progress.  Setting the Shutdown flag while holding
3113       * the lock ensures that there is no monitoring command
3114       * in the interrupt handler currently, and any monitoring
3115       * commands that complete from this time on will NOT return
3116       * their command structure to the free list.
3117       */
3118
3119      spin_lock_irqsave(&Controller->queue_lock, flags);
3120      Controller->ShutdownMonitoringTimer = 1;
3121      spin_unlock_irqrestore(&Controller->queue_lock, flags);
3122
3123      del_timer_sync(&Controller->MonitoringTimer);
3124      if (Controller->FirmwareType == DAC960_V1_Controller)
3125        {
3126          DAC960_Notice("Flushing Cache...", Controller);
3127          DAC960_V1_ExecuteType3(Controller, DAC960_V1_Flush, 0);
3128          DAC960_Notice("done\n", Controller);
3129
3130          if (Controller->HardwareType == DAC960_PD_Controller)
3131              release_region(Controller->IO_Address, 0x80);
3132        }
3133      else
3134        {
3135          DAC960_Notice("Flushing Cache...", Controller);
3136          DAC960_V2_DeviceOperation(Controller, DAC960_V2_PauseDevice,
3137                                    DAC960_V2_RAID_Controller);
3138          DAC960_Notice("done\n", Controller);
3139        }
3140    }
3141  DAC960_UnregisterBlockDevice(Controller);
3142  DAC960_DestroyAuxiliaryStructures(Controller);
3143  DAC960_DestroyProcEntries(Controller);
3144  DAC960_DetectCleanup(Controller);
3145}
3146
3147
3148/*
3149  DAC960_Probe verifies controller's existence and
3150  initializes the DAC960 Driver for that controller.
3151*/
3152
3153static int 
3154DAC960_Probe(struct pci_dev *dev, const struct pci_device_id *entry)
3155{
3156  int disk;
3157  DAC960_Controller_T *Controller;
3158
3159  if (DAC960_ControllerCount == DAC960_MaxControllers)
3160  {
3161        DAC960_Error("More than %d DAC960 Controllers detected - "
3162                       "ignoring from Controller at\n",
3163                       NULL, DAC960_MaxControllers);
3164        return -ENODEV;
3165  }
3166
3167  Controller = DAC960_DetectController(dev, entry);
3168  if (!Controller)
3169        return -ENODEV;
3170
3171  if (!DAC960_InitializeController(Controller)) {
3172        DAC960_FinalizeController(Controller);
3173        return -ENODEV;
3174  }
3175
3176  for (disk = 0; disk < DAC960_MaxLogicalDrives; disk++) {
3177        set_capacity(Controller->disks[disk], disk_size(Controller, disk));
3178        add_disk(Controller->disks[disk]);
3179  }
3180  DAC960_CreateProcEntries(Controller);
3181  return 0;
3182}
3183
3184
3185/*
3186  DAC960_Finalize finalizes the DAC960 Driver.
3187*/
3188
3189static void DAC960_Remove(struct pci_dev *PCI_Device)
3190{
3191  int Controller_Number = (long)pci_get_drvdata(PCI_Device);
3192  DAC960_Controller_T *Controller = DAC960_Controllers[Controller_Number];
3193  if (Controller != NULL)
3194      DAC960_FinalizeController(Controller);
3195}
3196
3197
3198/*
3199  DAC960_V1_QueueReadWriteCommand prepares and queues a Read/Write Command for
3200  DAC960 V1 Firmware Controllers.
3201*/
3202
3203static void DAC960_V1_QueueReadWriteCommand(DAC960_Command_T *Command)
3204{
3205  DAC960_Controller_T *Controller = Command->Controller;
3206  DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
3207  DAC960_V1_ScatterGatherSegment_T *ScatterGatherList =
3208                                        Command->V1.ScatterGatherList;
3209  struct scatterlist *ScatterList = Command->V1.ScatterList;
3210
3211  DAC960_V1_ClearCommand(Command);
3212
3213  if (Command->SegmentCount == 1)
3214    {
3215      if (Command->DmaDirection == PCI_DMA_FROMDEVICE)
3216        CommandMailbox->Type5.CommandOpcode = DAC960_V1_Read;
3217      else 
3218        CommandMailbox->Type5.CommandOpcode = DAC960_V1_Write;
3219
3220      CommandMailbox->Type5.LD.TransferLength = Command->BlockCount;
3221      CommandMailbox->Type5.LD.LogicalDriveNumber = Command->LogicalDriveNumber;
3222      CommandMailbox->Type5.LogicalBlockAddress = Command->BlockNumber;
3223      CommandMailbox->Type5.BusAddress =
3224                        (DAC960_BusAddress32_T)sg_dma_address(ScatterList);     
3225    }
3226  else
3227    {
3228      int i;
3229
3230      if (Command->DmaDirection == PCI_DMA_FROMDEVICE)
3231        CommandMailbox->Type5.CommandOpcode = DAC960_V1_ReadWithScatterGather;
3232      else
3233        CommandMailbox->Type5.CommandOpcode = DAC960_V1_WriteWithScatterGather;
3234
3235      CommandMailbox->Type5.LD.TransferLength = Command->BlockCount;
3236      CommandMailbox->Type5.LD.LogicalDriveNumber = Command->LogicalDriveNumber;
3237      CommandMailbox->Type5.LogicalBlockAddress = Command->BlockNumber;
3238      CommandMailbox->Type5.BusAddress = Command->V1.ScatterGatherListDMA;
3239
3240      CommandMailbox->Type5.ScatterGatherCount = Command->SegmentCount;
3241
3242      for (i = 0; i < Command->SegmentCount; i++, ScatterList++, ScatterGatherList++) {
3243                ScatterGatherList->SegmentDataPointer =
3244                        (DAC960_BusAddress32_T)sg_dma_address(ScatterList);
3245                ScatterGatherList->SegmentByteCount =
3246                        (DAC960_ByteCount32_T)sg_dma_len(ScatterList);
3247      }
3248    }
3249  DAC960_QueueCommand(Command);
3250}
3251
3252
3253/*
3254  DAC960_V2_QueueReadWriteCommand prepares and queues a Read/Write Command for
3255  DAC960 V2 Firmware Controllers.
3256*/
3257
3258static void DAC960_V2_QueueReadWriteCommand(DAC960_Command_T *Command)
3259{
3260  DAC960_Controller_T *Controller = Command->Controller;
3261  DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
3262  struct scatterlist *ScatterList = Command->V2.ScatterList;
3263
3264  DAC960_V2_ClearCommand(Command);
3265
3266  CommandMailbox->SCSI_10.CommandOpcode = DAC960_V2_SCSI_10;
3267  CommandMailbox->SCSI_10.CommandControlBits.DataTransferControllerToHost =
3268    (Command->DmaDirection == PCI_DMA_FROMDEVICE);
3269  CommandMailbox->SCSI_10.DataTransferSize =
3270    Command->BlockCount << DAC960_BlockSizeBits;
3271  CommandMailbox->SCSI_10.RequestSenseBusAddress = Command->V2.RequestSenseDMA;
3272  CommandMailbox->SCSI_10.PhysicalDevice =
3273    Controller->V2.LogicalDriveToVirtualDevice[Command->LogicalDriveNumber];
3274  CommandMailbox->SCSI_10.RequestSenseSize = sizeof(DAC960_SCSI_RequestSense_T);
3275  CommandMailbox->SCSI_10.CDBLength = 10;
3276  CommandMailbox->SCSI_10.SCSI_CDB[0] =
3277    (Command->DmaDirection == PCI_DMA_FROMDEVICE ? 0x28 : 0x2A);
3278  CommandMailbox->SCSI_10.SCSI_CDB[2] = Command->BlockNumber >> 24;
3279  CommandMailbox->SCSI_10.SCSI_CDB[3] = Command->BlockNumber >> 16;
3280  CommandMailbox->SCSI_10.SCSI_CDB[4] = Command->BlockNumber >> 8;
3281  CommandMailbox->SCSI_10.SCSI_CDB[5] = Command->BlockNumber;
3282  CommandMailbox->SCSI_10.SCSI_CDB[7] = Command->BlockCount >> 8;
3283  CommandMailbox->SCSI_10.SCSI_CDB[8] = Command->BlockCount;
3284
3285  if (Command->SegmentCount == 1)
3286    {
3287      CommandMailbox->SCSI_10.DataTransferMemoryAddress
3288                             .ScatterGatherSegments[0]
3289                             .SegmentDataPointer =
3290        (DAC960_BusAddress64_T)sg_dma_address(ScatterList);
3291      CommandMailbox->SCSI_10.DataTransferMemoryAddress
3292                             .ScatterGatherSegments[0]
3293                             .SegmentByteCount =
3294        CommandMailbox->SCSI_10.DataTransferSize;
3295    }
3296  else
3297    {
3298      DAC960_V2_ScatterGatherSegment_T *ScatterGatherList;
3299      int i;
3300
3301      if (Command->SegmentCount > 2)
3302        {
3303          ScatterGatherList = Command->V2.ScatterGatherList;
3304          CommandMailbox->SCSI_10.CommandControlBits
3305                         .AdditionalScatterGatherListMemory = true;
3306          CommandMailbox->SCSI_10.DataTransferMemoryAddress
3307                .ExtendedScatterGather.ScatterGatherList0Length = Command->SegmentCount;
3308          CommandMailbox->SCSI_10.DataTransferMemoryAddress
3309                         .ExtendedScatterGather.ScatterGatherList0Address =
3310            Command->V2.ScatterGatherListDMA;
3311        }
3312      else
3313        ScatterGatherList = CommandMailbox->SCSI_10.DataTransferMemoryAddress
3314                                 .ScatterGatherSegments;
3315
3316      for (i = 0; i < Command->SegmentCount; i++, ScatterList++, ScatterGatherList++) {
3317                ScatterGatherList->SegmentDataPointer =
3318                        (DAC960_BusAddress64_T)sg_dma_address(ScatterList);
3319                ScatterGatherList->SegmentByteCount =
3320                        (DAC960_ByteCount64_T)sg_dma_len(ScatterList);
3321      }
3322    }
3323  DAC960_QueueCommand(Command);
3324}
3325
3326
3327static int DAC960_process_queue(DAC960_Controller_T *Controller, struct request_queue *req_q)
3328{
3329        struct request *Request;
3330        DAC960_Command_T *Command;
3331
3332   while(1) {
3333        Request = blk_peek_request(req_q);
3334        if (!Request)
3335                return 1;
3336
3337        Command = DAC960_AllocateCommand(Controller);
3338        if (Command == NULL)
3339                return 0;
3340
3341        if (rq_data_dir(Request) == READ) {
3342                Command->DmaDirection = PCI_DMA_FROMDEVICE;
3343                Command->CommandType = DAC960_ReadCommand;
3344        } else {
3345                Command->DmaDirection = PCI_DMA_TODEVICE;
3346                Command->CommandType = DAC960_WriteCommand;
3347        }
3348        Command->Completion = Request->end_io_data;
3349        Command->LogicalDriveNumber = (long)Request->rq_disk->private_data;
3350        Command->BlockNumber = blk_rq_pos(Request);
3351        Command->BlockCount = blk_rq_sectors(Request);
3352        Command->Request = Request;
3353        blk_start_request(Request);
3354        Command->SegmentCount = blk_rq_map_sg(req_q,
3355                  Command->Request, Command->cmd_sglist);
3356        /* pci_map_sg MAY change the value of SegCount */
3357        Command->SegmentCount = pci_map_sg(Controller->PCIDevice, Command->cmd_sglist,
3358                 Command->SegmentCount, Command->DmaDirection);
3359
3360        DAC960_QueueReadWriteCommand(Command);
3361  }
3362}
3363
3364/*
3365  DAC960_ProcessRequest attempts to remove one I/O Request from Controller's
3366  I/O Request Queue and queues it to the Controller.  WaitForCommand is true if
3367  this function should wait for a Command to become available if necessary.
3368  This function returns true if an I/O Request was queued and false otherwise.
3369*/
3370static void DAC960_ProcessRequest(DAC960_Controller_T *controller)
3371{
3372        int i;
3373
3374        if (!controller->ControllerInitialized)
3375                return;
3376
3377        /* Do this better later! */
3378        for (i = controller->req_q_index; i < DAC960_MaxLogicalDrives; i++) {
3379                struct request_queue *req_q = controller->RequestQueue[i];
3380
3381                if (req_q == NULL)
3382                        continue;
3383
3384                if (!DAC960_process_queue(controller, req_q)) {
3385                        controller->req_q_index = i;
3386                        return;
3387                }
3388        }
3389
3390        if (controller->req_q_index == 0)
3391                return;
3392
3393        for (i = 0; i < controller->req_q_index; i++) {
3394                struct request_queue *req_q = controller->RequestQueue[i];
3395
3396                if (req_q == NULL)
3397                        continue;
3398
3399                if (!DAC960_process_queue(controller, req_q)) {
3400                        controller->req_q_index = i;
3401                        return;
3402                }
3403        }
3404}
3405
3406
3407/*
3408  DAC960_queue_partial_rw extracts one bio from the request already
3409  associated with argument command, and construct a new command block to retry I/O
3410  only on that bio.  Queue that command to the controller.
3411
3412  This function re-uses a previously-allocated Command,
3413        there is no failure mode from trying to allocate a command.
3414*/
3415
3416static void DAC960_queue_partial_rw(DAC960_Command_T *Command)
3417{
3418  DAC960_Controller_T *Controller = Command->Controller;
3419  struct request *Request = Command->Request;
3420  struct request_queue *req_q = Controller->RequestQueue[Command->LogicalDriveNumber];
3421
3422  if (Command->DmaDirection == PCI_DMA_FROMDEVICE)
3423    Command->CommandType = DAC960_ReadRetryCommand;
3424  else
3425    Command->CommandType = DAC960_WriteRetryCommand;
3426
3427  /*
3428   * We could be more efficient with these mapping requests
3429   * and map only the portions that we need.  But since this
3430   * code should almost never be called, just go with a
3431   * simple coding.
3432   */
3433  (void)blk_rq_map_sg(req_q, Command->Request, Command->cmd_sglist);
3434
3435  (void)pci_map_sg(Controller->PCIDevice, Command->cmd_sglist, 1, Command->DmaDirection);
3436  /*
3437   * Resubmitting the request sector at a time is really tedious.
3438   * But, this should almost never happen.  So, we're willing to pay
3439   * this price so that in the end, as much of the transfer is completed
3440   * successfully as possible.
3441   */
3442  Command->SegmentCount = 1;
3443  Command->BlockNumber = blk_rq_pos(Request);
3444  Command->BlockCount = 1;
3445  DAC960_QueueReadWriteCommand(Command);
3446  return;
3447}
3448
3449/*
3450  DAC960_RequestFunction is the I/O Request Function for DAC960 Controllers.
3451*/
3452
3453static void DAC960_RequestFunction(struct request_queue *RequestQueue)
3454{
3455        DAC960_ProcessRequest(RequestQueue->queuedata);
3456}
3457
3458/*
3459  DAC960_ProcessCompletedBuffer performs completion processing for an
3460  individual Buffer.
3461*/
3462
3463static inline bool DAC960_ProcessCompletedRequest(DAC960_Command_T *Command,
3464                                                 bool SuccessfulIO)
3465{
3466        struct request *Request = Command->Request;
3467        int Error = SuccessfulIO ? 0 : -EIO;
3468
3469        pci_unmap_sg(Command->Controller->PCIDevice, Command->cmd_sglist,
3470                Command->SegmentCount, Command->DmaDirection);
3471
3472         if (!__blk_end_request(Request, Error, Command->BlockCount << 9)) {
3473                if (Command->Completion) {
3474                        complete(Command->Completion);
3475                        Command->Completion = NULL;
3476                }
3477                return true;
3478        }
3479        return false;
3480}
3481
3482/*
3483  DAC960_V1_ReadWriteError prints an appropriate error message for Command
3484  when an error occurs on a Read or Write operation.
3485*/
3486
3487static void DAC960_V1_ReadWriteError(DAC960_Command_T *Command)
3488{
3489  DAC960_Controller_T *Controller = Command->Controller;
3490  unsigned char *CommandName = "UNKNOWN";
3491  switch (Command->CommandType)
3492    {
3493    case DAC960_ReadCommand:
3494    case DAC960_ReadRetryCommand:
3495      CommandName = "READ";
3496      break;
3497    case DAC960_WriteCommand:
3498    case DAC960_WriteRetryCommand:
3499      CommandName = "WRITE";
3500      break;
3501    case DAC960_MonitoringCommand:
3502    case DAC960_ImmediateCommand:
3503    case DAC960_QueuedCommand:
3504      break;
3505    }
3506  switch (Command->V1.CommandStatus)
3507    {
3508    case DAC960_V1_IrrecoverableDataError:
3509      DAC960_Error("Irrecoverable Data Error on %s:\n",
3510                   Controller, CommandName);
3511      break;
3512    case DAC960_V1_LogicalDriveNonexistentOrOffline:
3513      DAC960_Error("Logical Drive Nonexistent or Offline on %s:\n",
3514                   Controller, CommandName);
3515      break;
3516    case DAC960_V1_AccessBeyondEndOfLogicalDrive:
3517      DAC960_Error("Attempt to Access Beyond End of Logical Drive "
3518                   "on %s:\n", Controller, CommandName);
3519      break;
3520    case DAC960_V1_BadDataEncountered:
3521      DAC960_Error("Bad Data Encountered on %s:\n", Controller, CommandName);
3522      break;
3523    default:
3524      DAC960_Error("Unexpected Error Status %04X on %s:\n",
3525                   Controller, Command->V1.CommandStatus, CommandName);
3526      break;
3527    }
3528  DAC960_Error("  /dev/rd/c%dd%d:   absolute blocks %u..%u\n",
3529               Controller, Controller->ControllerNumber,
3530               Command->LogicalDriveNumber, Command->BlockNumber,
3531               Command->BlockNumber + Command->BlockCount - 1);
3532}
3533
3534
3535/*
3536  DAC960_V1_ProcessCompletedCommand performs completion processing for Command
3537  for DAC960 V1 Firmware Controllers.
3538*/
3539
3540static void DAC960_V1_ProcessCompletedCommand(DAC960_Command_T *Command)
3541{
3542  DAC960_Controller_T *Controller = Command->Controller;
3543  DAC960_CommandType_T CommandType = Command->CommandType;
3544  DAC960_V1_CommandOpcode_T CommandOpcode =
3545    Command->V1.CommandMailbox.Common.CommandOpcode;
3546  DAC960_V1_CommandStatus_T CommandStatus = Command->V1.CommandStatus;
3547
3548  if (CommandType == DAC960_ReadCommand ||
3549      CommandType == DAC960_WriteCommand)
3550    {
3551
3552#ifdef FORCE_RETRY_DEBUG
3553      CommandStatus = DAC960_V1_IrrecoverableDataError;
3554#endif
3555
3556      if (CommandStatus == DAC960_V1_NormalCompletion) {
3557
3558                if (!DAC960_ProcessCompletedRequest(Command, true))
3559                        BUG();
3560
3561      } else if (CommandStatus == DAC960_V1_IrrecoverableDataError ||
3562                CommandStatus == DAC960_V1_BadDataEncountered)
3563        {
3564          /*
3565           * break the command down into pieces and resubmit each
3566           * piece, hoping that some of them will succeed.
3567           */
3568           DAC960_queue_partial_rw(Command);
3569           return;
3570        }
3571      else
3572        {
3573          if (CommandStatus != DAC960_V1_LogicalDriveNonexistentOrOffline)
3574            DAC960_V1_ReadWriteError(Command);
3575
3576         if (!DAC960_ProcessCompletedRequest(Command, false))
3577                BUG();
3578        }
3579    }
3580  else if (CommandType == DAC960_ReadRetryCommand ||
3581           CommandType == DAC960_WriteRetryCommand)
3582    {
3583      bool normal_completion;
3584#ifdef FORCE_RETRY_FAILURE_DEBUG
3585      static int retry_count = 1;
3586#endif
3587      /*
3588        Perform completion processing for the portion that was
3589        retried, and submit the next portion, if any.
3590      */
3591      normal_completion = true;
3592      if (CommandStatus != DAC960_V1_NormalCompletion) {
3593        normal_completion = false;
3594        if (CommandStatus != DAC960_V1_LogicalDriveNonexistentOrOffline)
3595            DAC960_V1_ReadWriteError(Command);
3596      }
3597
3598#ifdef FORCE_RETRY_FAILURE_DEBUG
3599      if (!(++retry_count % 10000)) {
3600              printk("V1 error retry failure test\n");
3601              normal_completion = false;
3602              DAC960_V1_ReadWriteError(Command);
3603      }
3604#endif
3605
3606      if (!DAC960_ProcessCompletedRequest(Command, normal_completion)) {
3607        DAC960_queue_partial_rw(Command);
3608        return;
3609      }
3610    }
3611
3612  else if (CommandType == DAC960_MonitoringCommand)
3613    {
3614      if (Controller->ShutdownMonitoringTimer)
3615              return;
3616      if (CommandOpcode == DAC960_V1_Enquiry)
3617        {
3618          DAC960_V1_Enquiry_T *OldEnquiry = &Controller->V1.Enquiry;
3619          DAC960_V1_Enquiry_T *NewEnquiry = Controller->V1.NewEnquiry;
3620          unsigned int OldCriticalLogicalDriveCount =
3621            OldEnquiry->CriticalLogicalDriveCount;
3622          unsigned int NewCriticalLogicalDriveCount =
3623            NewEnquiry->CriticalLogicalDriveCount;
3624          if (NewEnquiry->NumberOfLogicalDrives > Controller->LogicalDriveCount)
3625            {
3626              int LogicalDriveNumber = Controller->LogicalDriveCount - 1;
3627              while (++LogicalDriveNumber < NewEnquiry->NumberOfLogicalDrives)
3628                DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) "
3629                                "Now Exists\n", Controller,
3630                                LogicalDriveNumber,
3631                                Controller->ControllerNumber,
3632                                LogicalDriveNumber);
3633              Controller->LogicalDriveCount = NewEnquiry->NumberOfLogicalDrives;
3634              DAC960_ComputeGenericDiskInfo(Controller);
3635            }
3636          if (NewEnquiry->NumberOfLogicalDrives < Controller->LogicalDriveCount)
3637            {
3638              int LogicalDriveNumber = NewEnquiry->NumberOfLogicalDrives - 1;
3639              while (++LogicalDriveNumber < Controller->LogicalDriveCount)
3640                DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) "
3641                                "No Longer Exists\n", Controller,
3642                                LogicalDriveNumber,
3643                                Controller->ControllerNumber,
3644                                LogicalDriveNumber);
3645              Controller->LogicalDriveCount = NewEnquiry->NumberOfLogicalDrives;
3646              DAC960_ComputeGenericDiskInfo(Controller);
3647            }
3648          if (NewEnquiry->StatusFlags.DeferredWriteError !=
3649              OldEnquiry->StatusFlags.DeferredWriteError)
3650            DAC960_Critical("Deferred Write Error Flag is now %s\n", Controller,
3651                            (NewEnquiry->StatusFlags.DeferredWriteError
3652                             ? "TRUE" : "FALSE"));
3653          if ((NewCriticalLogicalDriveCount > 0 ||
3654               NewCriticalLogicalDriveCount != OldCriticalLogicalDriveCount) ||
3655              (NewEnquiry->OfflineLogicalDriveCount > 0 ||
3656               NewEnquiry->OfflineLogicalDriveCount !=
3657               OldEnquiry->OfflineLogicalDriveCount) ||
3658              (NewEnquiry->DeadDriveCount > 0 ||
3659               NewEnquiry->DeadDriveCount !=
3660               OldEnquiry->DeadDriveCount) ||
3661              (NewEnquiry->EventLogSequenceNumber !=
3662               OldEnquiry->EventLogSequenceNumber) ||
3663              Controller->MonitoringTimerCount == 0 ||
3664              time_after_eq(jiffies, Controller->SecondaryMonitoringTime
3665               + DAC960_SecondaryMonitoringInterval))
3666            {
3667              Controller->V1.NeedLogicalDriveInformation = true;
3668              Controller->V1.NewEventLogSequenceNumber =
3669                NewEnquiry->EventLogSequenceNumber;
3670              Controller->V1.NeedErrorTableInformation = true;
3671              Controller->V1.NeedDeviceStateInformation = true;
3672              Controller->V1.StartDeviceStateScan = true;
3673              Controller->V1.NeedBackgroundInitializationStatus =
3674                Controller->V1.BackgroundInitializationStatusSupported;
3675              Controller->SecondaryMonitoringTime = jiffies;
3676            }
3677          if (NewEnquiry->RebuildFlag == DAC960_V1_StandbyRebuildInProgress ||
3678              NewEnquiry->RebuildFlag
3679              == DAC960_V1_BackgroundRebuildInProgress ||
3680              OldEnquiry->RebuildFlag == DAC960_V1_StandbyRebuildInProgress ||
3681              OldEnquiry->RebuildFlag == DAC960_V1_BackgroundRebuildInProgress)
3682            {
3683              Controller->V1.NeedRebuildProgress = true;
3684              Controller->V1.RebuildProgressFirst =
3685                (NewEnquiry->CriticalLogicalDriveCount <
3686                 OldEnquiry->CriticalLogicalDriveCount);
3687            }
3688          if (OldEnquiry->RebuildFlag == DAC960_V1_BackgroundCheckInProgress)
3689            switch (NewEnquiry->RebuildFlag)
3690              {
3691              case DAC960_V1_NoStandbyRebuildOrCheckInProgress:
3692                DAC960_Progress("Consistency Check Completed Successfully\n",
3693                                Controller);
3694                break;
3695              case DAC960_V1_StandbyRebuildInProgress:
3696              case DAC960_V1_BackgroundRebuildInProgress:
3697                break;
3698              case DAC960_V1_BackgroundCheckInProgress:
3699                Controller->V1.NeedConsistencyCheckProgress = true;
3700                break;
3701              case DAC960_V1_StandbyRebuildCompletedWithError:
3702                DAC960_Progress("Consistency Check Completed with Error\n",
3703                                Controller);
3704                break;
3705              case DAC960_V1_BackgroundRebuildOrCheckFailed_DriveFailed:
3706                DAC960_Progress("Consistency Check Failed - "
3707                                "Physical Device Failed\n", Controller);
3708                break;
3709              case DAC960_V1_BackgroundRebuildOrCheckFailed_LogicalDriveFailed:
3710                DAC960_Progress("Consistency Check Failed - "
3711                                "Logical Drive Failed\n", Controller);
3712                break;
3713              case DAC960_V1_BackgroundRebuildOrCheckFailed_OtherCauses:
3714                DAC960_Progress("Consistency Check Failed - Other Causes\n",
3715                                Controller);
3716                break;
3717              case DAC960_V1_BackgroundRebuildOrCheckSuccessfullyTerminated:
3718                DAC960_Progress("Consistency Check Successfully Terminated\n",
3719                                Controller);
3720                break;
3721              }
3722          else if (NewEnquiry->RebuildFlag
3723                   == DAC960_V1_BackgroundCheckInProgress)
3724            Controller->V1.NeedConsistencyCheckProgress = true;
3725          Controller->MonitoringAlertMode =
3726            (NewEnquiry->CriticalLogicalDriveCount > 0 ||
3727             NewEnquiry->OfflineLogicalDriveCount > 0 ||
3728             NewEnquiry->DeadDriveCount > 0);
3729          if (NewEnquiry->RebuildFlag > DAC960_V1_BackgroundCheckInProgress)
3730            {
3731              Controller->V1.PendingRebuildFlag = NewEnquiry->RebuildFlag;
3732              Controller->V1.RebuildFlagPending = true;
3733            }
3734          memcpy(&Controller->V1.Enquiry, &Controller->V1.NewEnquiry,
3735                 sizeof(DAC960_V1_Enquiry_T));
3736        }
3737      else if (CommandOpcode == DAC960_V1_PerformEventLogOperation)
3738        {
3739          static char
3740            *DAC960_EventMessages[] =
3741               { "killed because write recovery failed",
3742                 "killed because of SCSI bus reset failure",
3743                 "killed because of double check condition",
3744                 "killed because it was removed",
3745                 "killed because of gross error on SCSI chip",
3746                 "killed because of bad tag returned from drive",
3747                 "killed because of timeout on SCSI command",
3748                 "killed because of reset SCSI command issued from system",
3749                 "killed because busy or parity error count exceeded limit",
3750                 "killed because of 'kill drive' command from system",
3751                 "killed because of selection timeout",
3752                 "killed due to SCSI phase sequence error",
3753                 "killed due to unknown status" };
3754          DAC960_V1_EventLogEntry_T *EventLogEntry =
3755                Controller->V1.EventLogEntry;
3756          if (EventLogEntry->SequenceNumber ==
3757              Controller->V1.OldEventLogSequenceNumber)
3758            {
3759              unsigned char SenseKey = EventLogEntry->SenseKey;
3760              unsigned char AdditionalSenseCode =
3761                EventLogEntry->AdditionalSenseCode;
3762              unsigned char AdditionalSenseCodeQualifier =
3763                EventLogEntry->AdditionalSenseCodeQualifier;
3764              if (SenseKey == DAC960_SenseKey_VendorSpecific &&
3765                  AdditionalSenseCode == 0x80 &&
3766                  AdditionalSenseCodeQualifier <
3767                  ARRAY_SIZE(DAC960_EventMessages))
3768                DAC960_Critical("Physical Device %d:%d %s\n", Controller,
3769                                EventLogEntry->Channel,
3770                                EventLogEntry->TargetID,
3771                                DAC960_EventMessages[
3772                                  AdditionalSenseCodeQualifier]);
3773              else if (SenseKey == DAC960_SenseKey_UnitAttention &&
3774                       AdditionalSenseCode == 0x29)
3775                {
3776                  if (Controller->MonitoringTimerCount > 0)
3777                    Controller->V1.DeviceResetCount[EventLogEntry->Channel]
3778                                                   [EventLogEntry->TargetID]++;
3779                }
3780              else if (!(SenseKey == DAC960_SenseKey_NoSense ||
3781                         (SenseKey == DAC960_SenseKey_NotReady &&
3782                          AdditionalSenseCode == 0x04 &&
3783                          (AdditionalSenseCodeQualifier == 0x01 ||
3784                           AdditionalSenseCodeQualifier == 0x02))))
3785                {
3786                  DAC960_Critical("Physical Device %d:%d Error Log: "
3787                                  "Sense Key = %X, ASC = %02X, ASCQ = %02X\n",
3788                                  Controller,
3789                                  EventLogEntry->Channel,
3790                                  EventLogEntry->TargetID,
3791                                  SenseKey,
3792                                  AdditionalSenseCode,
3793                                  AdditionalSenseCodeQualifier);
3794                  DAC960_Critical("Physical Device %d:%d Error Log: "
3795                                  "Information = %02X%02X%02X%02X "
3796                                  "%02X%02X%02X%02X\n",
3797                                  Controller,
3798                                  EventLogEntry->Channel,
3799                                  EventLogEntry->TargetID,
3800                                  EventLogEntry->Information[0],
3801                                  EventLogEntry->Information[1],
3802                                  EventLogEntry->Information[2],
3803                                  EventLogEntry->Information[3],
3804                                  EventLogEntry->CommandSpecificInformation[0],
3805                                  EventLogEntry->CommandSpecificInformation[1],
3806                                  EventLogEntry->CommandSpecificInformation[2],
3807                                  EventLogEntry->CommandSpecificInformation[3]);
3808                }
3809            }
3810          Controller->V1.OldEventLogSequenceNumber++;
3811        }
3812      else if (CommandOpcode == DAC960_V1_GetErrorTable)
3813        {
3814          DAC960_V1_ErrorTable_T *OldErrorTable = &Controller->V1.ErrorTable;
3815          DAC960_V1_ErrorTable_T *NewErrorTable = Controller->V1.NewErrorTable;
3816          int Channel, TargetID;
3817          for (Channel = 0; Channel < Controller->Channels; Channel++)
3818            for (TargetID = 0; TargetID < Controller->Targets; TargetID++)
3819              {
3820                DAC960_V1_ErrorTableEntry_T *NewErrorEntry =
3821                  &NewErrorTable->ErrorTableEntries[Channel][TargetID];
3822                DAC960_V1_ErrorTableEntry_T *OldErrorEntry =
3823                  &OldErrorTable->ErrorTableEntries[Channel][TargetID];
3824                if ((NewErrorEntry->ParityErrorCount !=
3825                     OldErrorEntry->ParityErrorCount) ||
3826                    (NewErrorEntry->SoftErrorCount !=
3827                     OldErrorEntry->SoftErrorCount) ||
3828                    (NewErrorEntry->HardErrorCount !=
3829                     OldErrorEntry->HardErrorCount) ||
3830                    (NewErrorEntry->MiscErrorCount !=
3831                     OldErrorEntry->MiscErrorCount))
3832                  DAC960_Critical("Physical Device %d:%d Errors: "
3833                                  "Parity = %d, Soft = %d, "
3834                                  "Hard = %d, Misc = %d\n",
3835                                  Controller, Channel, TargetID,
3836                                  NewErrorEntry->ParityErrorCount,
3837                                  NewErrorEntry->SoftErrorCount,
3838                                  NewErrorEntry->HardErrorCount,
3839                                  NewErrorEntry->MiscErrorCount);
3840              }
3841          memcpy(&Controller->V1.ErrorTable, Controller->V1.NewErrorTable,
3842                 sizeof(DAC960_V1_ErrorTable_T));
3843        }
3844      else if (CommandOpcode == DAC960_V1_GetDeviceState)
3845        {
3846          DAC960_V1_DeviceState_T *OldDeviceState =
3847            &Controller->V1.DeviceState[Controller->V1.DeviceStateChannel]
3848                                       [Controller->V1.DeviceStateTargetID];
3849          DAC960_V1_DeviceState_T *NewDeviceState =
3850            Controller->V1.NewDeviceState;
3851          if (NewDeviceState->DeviceState != OldDeviceState->DeviceState)
3852            DAC960_Critical("Physical Device %d:%d is now %s\n", Controller,
3853                            Controller->V1.DeviceStateChannel,
3854                            Controller->V1.DeviceStateTargetID,
3855                            (NewDeviceState->DeviceState
3856                             == DAC960_V1_Device_Dead
3857                             ? "DEAD"
3858                             : NewDeviceState->DeviceState
3859                               == DAC960_V1_Device_WriteOnly
3860                               ? "WRITE-ONLY"
3861                               : NewDeviceState->DeviceState
3862                                 == DAC960_V1_Device_Online
3863                                 ? "ONLINE" : "STANDBY"));
3864          if (OldDeviceState->DeviceState == DAC960_V1_Device_Dead &&
3865              NewDeviceState->DeviceState != DAC960_V1_Device_Dead)
3866            {
3867              Controller->V1.NeedDeviceInquiryInformation = true;
3868              Controller->V1.NeedDeviceSerialNumberInformation = true;
3869              Controller->V1.DeviceResetCount
3870                             [Controller->V1.DeviceStateChannel]
3871                             [Controller->V1.DeviceStateTargetID] = 0;
3872            }
3873          memcpy(OldDeviceState, NewDeviceState,
3874                 sizeof(DAC960_V1_DeviceState_T));
3875        }
3876      else if (CommandOpcode == DAC960_V1_GetLogicalDriveInformation)
3877        {
3878          int LogicalDriveNumber;
3879          for (LogicalDriveNumber = 0;
3880               LogicalDriveNumber < Controller->LogicalDriveCount;
3881               LogicalDriveNumber++)
3882            {
3883              DAC960_V1_LogicalDriveInformation_T *OldLogicalDriveInformation =
3884                &Controller->V1.LogicalDriveInformation[LogicalDriveNumber];
3885              DAC960_V1_LogicalDriveInformation_T *NewLogicalDriveInformation =
3886                &(*Controller->V1.NewLogicalDriveInformation)[LogicalDriveNumber];
3887              if (NewLogicalDriveInformation->LogicalDriveState !=
3888                  OldLogicalDriveInformation->LogicalDriveState)
3889                DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) "
3890                                "is now %s\n", Controller,
3891                                LogicalDriveNumber,
3892                                Controller->ControllerNumber,
3893                                LogicalDriveNumber,
3894                                (NewLogicalDriveInformation->LogicalDriveState
3895                                 == DAC960_V1_LogicalDrive_Online
3896                                 ? "ONLINE"
3897                                 : NewLogicalDriveInformation->LogicalDriveState
3898                                   == DAC960_V1_LogicalDrive_Critical
3899                                   ? "CRITICAL" : "OFFLINE"));
3900              if (NewLogicalDriveInformation->WriteBack !=
3901                  OldLogicalDriveInformation->WriteBack)
3902                DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) "
3903                                "is now %s\n", Controller,
3904                                LogicalDriveNumber,
3905                                Controller->ControllerNumber,
3906                                LogicalDriveNumber,
3907                                (NewLogicalDriveInformation->WriteBack
3908                                 ? "WRITE BACK" : "WRITE THRU"));
3909            }
3910          memcpy(&Controller->V1.LogicalDriveInformation,
3911                 Controller->V1.NewLogicalDriveInformation,
3912                 sizeof(DAC960_V1_LogicalDriveInformationArray_T));
3913        }
3914      else if (CommandOpcode == DAC960_V1_GetRebuildProgress)
3915        {
3916          unsigned int LogicalDriveNumber =
3917            Controller->V1.RebuildProgress->LogicalDriveNumber;
3918          unsigned int LogicalDriveSize =
3919            Controller->V1.RebuildProgress->LogicalDriveSize;
3920          unsigned int BlocksCompleted =
3921            LogicalDriveSize - Controller->V1.RebuildProgress->RemainingBlocks;
3922          if (CommandStatus == DAC960_V1_NoRebuildOrCheckInProgress &&
3923              Controller->V1.LastRebuildStatus == DAC960_V1_NormalCompletion)
3924            CommandStatus = DAC960_V1_RebuildSuccessful;
3925          switch (CommandStatus)
3926            {
3927            case DAC960_V1_NormalCompletion:
3928              Controller->EphemeralProgressMessage = true;
3929              DAC960_Progress("Rebuild in Progress: "
3930                              "Logical Drive %d (/dev/rd/c%dd%d) "
3931                              "%d%% completed\n",
3932                              Controller, LogicalDriveNumber,
3933                              Controller->ControllerNumber,
3934                              LogicalDriveNumber,
3935                              (100 * (BlocksCompleted >> 7))
3936                              / (LogicalDriveSize >> 7));
3937              Controller->EphemeralProgressMessage = false;
3938              break;
3939            case DAC960_V1_RebuildFailed_LogicalDriveFailure:
3940              DAC960_Progress("Rebuild Failed due to "
3941                              "Logical Drive Failure\n", Controller);
3942              break;
3943            case DAC960_V1_RebuildFailed_BadBlocksOnOther:
3944              DAC960_Progress("Rebuild Failed due to "
3945                              "Bad Blocks on Other Drives\n", Controller);
3946              break;
3947            case DAC960_V1_RebuildFailed_NewDriveFailed:
3948              DAC960_Progress("Rebuild Failed due to "
3949                              "Failure of Drive Being Rebuilt\n", Controller);
3950              break;
3951            case DAC960_V1_NoRebuildOrCheckInProgress:
3952              break;
3953            case DAC960_V1_RebuildSuccessful:
3954              DAC960_Progress("Rebuild Completed Successfully\n", Controller);
3955              break;
3956            case DAC960_V1_RebuildSuccessfullyTerminated:
3957              DAC960_Progress("Rebuild Successfully Terminated\n", Controller);
3958              break;
3959            }
3960          Controller->V1.LastRebuildStatus = CommandStatus;
3961          if (CommandType != DAC960_MonitoringCommand &&
3962              Controller->V1.RebuildStatusPending)
3963            {
3964              Command->V1.CommandStatus = Controller->V1.PendingRebuildStatus;
3965              Controller->V1.RebuildStatusPending = false;
3966            }
3967          else if (CommandType == DAC960_MonitoringCommand &&
3968                   CommandStatus != DAC960_V1_NormalCompletion &&
3969                   CommandStatus != DAC960_V1_NoRebuildOrCheckInProgress)
3970            {
3971              Controller->V1.PendingRebuildStatus = CommandStatus;
3972              Controller->V1.RebuildStatusPending = true;
3973            }
3974        }
3975      else if (CommandOpcode == DAC960_V1_RebuildStat)
3976        {
3977          unsigned int LogicalDriveNumber =
3978            Controller->V1.RebuildProgress->LogicalDriveNumber;
3979          unsigned int LogicalDriveSize =
3980            Controller->V1.RebuildProgress->LogicalDriveSize;
3981          unsigned int BlocksCompleted =
3982            LogicalDriveSize - Controller->V1.RebuildProgress->RemainingBlocks;
3983          if (CommandStatus == DAC960_V1_NormalCompletion)
3984            {
3985              Controller->EphemeralProgressMessage = true;
3986              DAC960_Progress("Consistency Check in Progress: "
3987                              "Logical Drive %d (/dev/rd/c%dd%d) "
3988                              "%d%% completed\n",
3989                              Controller, LogicalDriveNumber,
3990                              Controller->ControllerNumber,
3991                              LogicalDriveNumber,
3992                              (100 * (BlocksCompleted >> 7))
3993                              / (LogicalDriveSize >> 7));
3994              Controller->EphemeralProgressMessage = false;
3995            }
3996        }
3997      else if (CommandOpcode == DAC960_V1_BackgroundInitializationControl)
3998        {
3999          unsigned int LogicalDriveNumber =
4000            Controller->V1.BackgroundInitializationStatus->LogicalDriveNumber;
4001          unsigned int LogicalDriveSize =
4002            Controller->V1.BackgroundInitializationStatus->LogicalDriveSize;
4003          unsigned int BlocksCompleted =
4004            Controller->V1.BackgroundInitializationStatus->BlocksCompleted;
4005          switch (CommandStatus)
4006            {
4007            case DAC960_V1_NormalCompletion:
4008              switch (Controller->V1.BackgroundInitializationStatus->Status)
4009                {
4010                case DAC960_V1_BackgroundInitializationInvalid:
4011                  break;
4012                case DAC960_V1_BackgroundInitializationStarted:
4013                  DAC960_Progress("Background Initialization Started\n",
4014                                  Controller);
4015                  break;
4016                case DAC960_V1_BackgroundInitializationInProgress:
4017                  if (BlocksCompleted ==
4018                      Controller->V1.LastBackgroundInitializationStatus.
4019                                BlocksCompleted &&
4020                      LogicalDriveNumber ==
4021                      Controller->V1.LastBackgroundInitializationStatus.
4022                                LogicalDriveNumber)
4023                    break;
4024                  Controller->EphemeralProgressMessage = true;
4025                  DAC960_Progress("Background Initialization in Progress: "
4026                                  "Logical Drive %d (/dev/rd/c%dd%d) "
4027                                  "%d%% completed\n",
4028                                  Controller, LogicalDriveNumber,
4029                                  Controller->ControllerNumber,
4030                                  LogicalDriveNumber,
4031                                  (100 * (BlocksCompleted >> 7))
4032                                  / (LogicalDriveSize >> 7));
4033                  Controller->EphemeralProgressMessage = false;
4034                  break;
4035                case DAC960_V1_BackgroundInitializationSuspended:
4036                  DAC960_Progress("Background Initialization Suspended\n",
4037                                  Controller);
4038                  break;
4039                case DAC960_V1_BackgroundInitializationCancelled:
4040                  DAC960_Progress("Background Initialization Cancelled\n",
4041                                  Controller);
4042                  break;
4043                }
4044              memcpy(&Controller->V1.LastBackgroundInitializationStatus,
4045                     Controller->V1.BackgroundInitializationStatus,
4046                     sizeof(DAC960_V1_BackgroundInitializationStatus_T));
4047              break;
4048            case DAC960_V1_BackgroundInitSuccessful:
4049              if (Controller->V1.BackgroundInitializationStatus->Status ==
4050                  DAC960_V1_BackgroundInitializationInProgress)
4051                DAC960_Progress("Background Initialization "
4052                                "Completed Successfully\n", Controller);
4053              Controller->V1.BackgroundInitializationStatus->Status =
4054                DAC960_V1_BackgroundInitializationInvalid;
4055              break;
4056            case DAC960_V1_BackgroundInitAborted:
4057              if (Controller->V1.BackgroundInitializationStatus->Status ==
4058                  DAC960_V1_BackgroundInitializationInProgress)
4059                DAC960_Progress("Background Initialization Aborted\n",
4060                                Controller);
4061              Controller->V1.BackgroundInitializationStatus->Status =
4062                DAC960_V1_BackgroundInitializationInvalid;
4063              break;
4064            case DAC960_V1_NoBackgroundInitInProgress:
4065              break;
4066            }
4067        } 
4068      else if (CommandOpcode == DAC960_V1_DCDB)
4069        {
4070           /*
4071             This is a bit ugly.
4072
4073             The InquiryStandardData and 
4074             the InquiryUntitSerialNumber information
4075             retrieval operations BOTH use the DAC960_V1_DCDB
4076             commands.  the test above can't distinguish between
4077             these two cases.
4078
4079             Instead, we rely on the order of code later in this
4080             function to ensure that DeviceInquiryInformation commands
4081             are submitted before DeviceSerialNumber commands.
4082           */
4083           if (Controller->V1.NeedDeviceInquiryInformation)
4084             {
4085                DAC960_SCSI_Inquiry_T *InquiryStandardData =
4086                        &Controller->V1.InquiryStandardData
4087                                [Controller->V1.DeviceStateChannel]
4088                                [Controller->V1.DeviceStateTargetID];
4089                if (CommandStatus != DAC960_V1_NormalCompletion)
4090                   {
4091                        memset(InquiryStandardData, 0,
4092                                sizeof(DAC960_SCSI_Inquiry_T));
4093                        InquiryStandardData->PeripheralDeviceType = 0x1F;
4094                    }
4095                 else
4096                        memcpy(InquiryStandardData, 
4097                                Controller->V1.NewInquiryStandardData,
4098                                sizeof(DAC960_SCSI_Inquiry_T));
4099                 Controller->V1.NeedDeviceInquiryInformation = false;
4100              }
4101           else if (Controller->V1.NeedDeviceSerialNumberInformation) 
4102              {
4103                DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber =
4104                  &Controller->V1.InquiryUnitSerialNumber
4105                                [Controller->V1.DeviceStateChannel]
4106                                [Controller->V1.DeviceStateTargetID];
4107                 if (CommandStatus != DAC960_V1_NormalCompletion)
4108                   {
4109                        memset(InquiryUnitSerialNumber, 0,
4110                                sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T));
4111                        InquiryUnitSerialNumber->PeripheralDeviceType = 0x1F;
4112                    }
4113                  else
4114                        memcpy(InquiryUnitSerialNumber, 
4115                                Controller->V1.NewInquiryUnitSerialNumber,
4116                                sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T));
4117              Controller->V1.NeedDeviceSerialNumberInformation = false;
4118             }
4119        }
4120      /*
4121        Begin submitting new monitoring commands.
4122       */
4123      if (Controller->V1.NewEventLogSequenceNumber
4124          - Controller->V1.OldEventLogSequenceNumber > 0)
4125        {
4126          Command->V1.CommandMailbox.Type3E.CommandOpcode =
4127            DAC960_V1_PerformEventLogOperation;
4128          Command->V1.CommandMailbox.Type3E.OperationType =
4129            DAC960_V1_GetEventLogEntry;
4130          Command->V1.CommandMailbox.Type3E.OperationQualifier = 1;
4131          Command->V1.CommandMailbox.Type3E.SequenceNumber =
4132            Controller->V1.OldEventLogSequenceNumber;
4133          Command->V1.CommandMailbox.Type3E.BusAddress =
4134                Controller->V1.EventLogEntryDMA;
4135          DAC960_QueueCommand(Command);
4136          return;
4137        }
4138      if (Controller->V1.NeedErrorTableInformation)
4139        {
4140          Controller->V1.NeedErrorTableInformation = false;
4141          Command->V1.CommandMailbox.Type3.CommandOpcode =
4142            DAC960_V1_GetErrorTable;
4143          Command->V1.CommandMailbox.Type3.BusAddress =
4144                Controller->V1.NewErrorTableDMA;
4145          DAC960_QueueCommand(Command);
4146          return;
4147        }
4148      if (Controller->V1.NeedRebuildProgress &&
4149          Controller->V1.RebuildProgressFirst)
4150        {
4151          Controller->V1.NeedRebuildProgress = false;
4152          Command->V1.CommandMailbox.Type3.CommandOpcode =
4153            DAC960_V1_GetRebuildProgress;
4154          Command->V1.CommandMailbox.Type3.BusAddress =
4155            Controller->V1.RebuildProgressDMA;
4156          DAC960_QueueCommand(Command);
4157          return;
4158        }
4159      if (Controller->V1.NeedDeviceStateInformation)
4160        {
4161          if (Controller->V1.NeedDeviceInquiryInformation)
4162            {
4163              DAC960_V1_DCDB_T *DCDB = Controller->V1.MonitoringDCDB;
4164              dma_addr_t DCDB_DMA = Controller->V1.MonitoringDCDB_DMA;
4165
4166              dma_addr_t NewInquiryStandardDataDMA =
4167                Controller->V1.NewInquiryStandardDataDMA;
4168
4169              Command->V1.CommandMailbox.Type3.CommandOpcode = DAC960_V1_DCDB;
4170              Command->V1.CommandMailbox.Type3.BusAddress = DCDB_DMA;
4171              DCDB->Channel = Controller->V1.DeviceStateChannel;
4172              DCDB->TargetID = Controller->V1.DeviceStateTargetID;
4173              DCDB->Direction = DAC960_V1_DCDB_DataTransferDeviceToSystem;
4174              DCDB->EarlyStatus = false;
4175              DCDB->Timeout = DAC960_V1_DCDB_Timeout_10_seconds;
4176              DCDB->NoAutomaticRequestSense = false;
4177              DCDB->DisconnectPermitted = true;
4178              DCDB->TransferLength = sizeof(DAC960_SCSI_Inquiry_T);
4179              DCDB->BusAddress = NewInquiryStandardDataDMA;
4180              DCDB->CDBLength = 6;
4181              DCDB->TransferLengthHigh4 = 0;
4182              DCDB->SenseLength = sizeof(DCDB->SenseData);
4183              DCDB->CDB[0] = 0x12; /* INQUIRY */
4184              DCDB->CDB[1] = 0; /* EVPD = 0 */
4185              DCDB->CDB[2] = 0; /* Page Code */
4186              DCDB->CDB[3] = 0; /* Reserved */
4187              DCDB->CDB[4] = sizeof(DAC960_SCSI_Inquiry_T);
4188              DCDB->CDB[5] = 0; /* Control */
4189              DAC960_QueueCommand(Command);
4190              return;
4191            }
4192          if (Controller->V1.NeedDeviceSerialNumberInformation)
4193            {
4194              DAC960_V1_DCDB_T *DCDB = Controller->V1.MonitoringDCDB;
4195              dma_addr_t DCDB_DMA = Controller->V1.MonitoringDCDB_DMA;
4196              dma_addr_t NewInquiryUnitSerialNumberDMA = 
4197                        Controller->V1.NewInquiryUnitSerialNumberDMA;
4198
4199              Command->V1.CommandMailbox.Type3.CommandOpcode = DAC960_V1_DCDB;
4200              Command->V1.CommandMailbox.Type3.BusAddress = DCDB_DMA;
4201              DCDB->Channel = Controller->V1.DeviceStateChannel;
4202              DCDB->TargetID = Controller->V1.DeviceStateTargetID;
4203              DCDB->Direction = DAC960_V1_DCDB_DataTransferDeviceToSystem;
4204              DCDB->EarlyStatus = false;
4205              DCDB->Timeout = DAC960_V1_DCDB_Timeout_10_seconds;
4206              DCDB->NoAutomaticRequestSense = false;
4207              DCDB->DisconnectPermitted = true;
4208              DCDB->TransferLength =
4209                sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T);
4210              DCDB->BusAddress = NewInquiryUnitSerialNumberDMA;
4211              DCDB->CDBLength = 6;
4212              DCDB->TransferLengthHigh4 = 0;
4213              DCDB->SenseLength = sizeof(DCDB->SenseData);
4214              DCDB->CDB[0] = 0x12; /* INQUIRY */
4215              DCDB->CDB[1] = 1; /* EVPD = 1 */
4216              DCDB->CDB[2] = 0x80; /* Page Code */
4217              DCDB->CDB[3] = 0; /* Reserved */
4218              DCDB->CDB[4] = sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T);
4219              DCDB->CDB[5] = 0; /* Control */
4220              DAC960_QueueCommand(Command);
4221              return;
4222            }
4223          if (Controller->V1.StartDeviceStateScan)
4224            {
4225              Controller->V1.DeviceStateChannel = 0;
4226              Controller->V1.DeviceStateTargetID = 0;
4227              Controller->V1.StartDeviceStateScan = false;
4228            }
4229          else if (++Controller->V1.DeviceStateTargetID == Controller->Targets)
4230            {
4231              Controller->V1.DeviceStateChannel++;
4232              Controller->V1.DeviceStateTargetID = 0;
4233            }
4234          if (Controller->V1.DeviceStateChannel < Controller->Channels)
4235            {
4236              Controller->V1.NewDeviceState->DeviceState =
4237                DAC960_V1_Device_Dead;
4238              Command->V1.CommandMailbox.Type3D.CommandOpcode =
4239                DAC960_V1_GetDeviceState;
4240              Command->V1.CommandMailbox.Type3D.Channel =
4241                Controller->V1.DeviceStateChannel;
4242              Command->V1.CommandMailbox.Type3D.TargetID =
4243                Controller->V1.DeviceStateTargetID;
4244              Command->V1.CommandMailbox.Type3D.BusAddress =
4245                Controller->V1.NewDeviceStateDMA;
4246              DAC960_QueueCommand(Command);
4247              return;
4248            }
4249          Controller->V1.NeedDeviceStateInformation = false;
4250        }
4251      if (Controller->V1.NeedLogicalDriveInformation)
4252        {
4253          Controller->V1.NeedLogicalDriveInformation = false;
4254          Command->V1.CommandMailbox.Type3.CommandOpcode =
4255            DAC960_V1_GetLogicalDriveInformation;
4256          Command->V1.CommandMailbox.Type3.BusAddress =
4257            Controller->V1.NewLogicalDriveInformationDMA;
4258          DAC960_QueueCommand(Command);
4259          return;
4260        }
4261      if (Controller->V1.NeedRebuildProgress)
4262        {
4263          Controller->V1.NeedRebuildProgress = false;
4264          Command->V1.CommandMailbox.Type3.CommandOpcode =
4265            DAC960_V1_GetRebuildProgress;
4266          Command->V1.CommandMailbox.Type3.BusAddress =
4267                Controller->V1.RebuildProgressDMA;
4268          DAC960_QueueCommand(Command);
4269          return;
4270        }
4271      if (Controller->V1.NeedConsistencyCheckProgress)
4272        {
4273          Controller->V1.NeedConsistencyCheckProgress = false;
4274          Command->V1.CommandMailbox.Type3.CommandOpcode =
4275            DAC960_V1_RebuildStat;
4276          Command->V1.CommandMailbox.Type3.BusAddress =
4277            Controller->V1.RebuildProgressDMA;
4278          DAC960_QueueCommand(Command);
4279          return;
4280        }
4281      if (Controller->V1.NeedBackgroundInitializationStatus)
4282        {
4283          Controller->V1.NeedBackgroundInitializationStatus = false;
4284          Command->V1.CommandMailbox.Type3B.CommandOpcode =
4285            DAC960_V1_BackgroundInitializationControl;
4286          Command->V1.CommandMailbox.Type3B.CommandOpcode2 = 0x20;
4287          Command->V1.CommandMailbox.Type3B.BusAddress =
4288            Controller->V1.BackgroundInitializationStatusDMA;
4289          DAC960_QueueCommand(Command);
4290          return;
4291        }
4292      Controller->MonitoringTimerCount++;
4293      Controller->MonitoringTimer.expires =
4294        jiffies + DAC960_MonitoringTimerInterval;
4295        add_timer(&Controller->MonitoringTimer);
4296    }
4297  if (CommandType == DAC960_ImmediateCommand)
4298    {
4299      complete(Command->Completion);
4300      Command->Completion = NULL;
4301      return;
4302    }
4303  if (CommandType == DAC960_QueuedCommand)
4304    {
4305      DAC960_V1_KernelCommand_T *KernelCommand = Command->V1.KernelCommand;
4306      KernelCommand->CommandStatus = Command->V1.CommandStatus;
4307      Command->V1.KernelCommand = NULL;
4308      if (CommandOpcode == DAC960_V1_DCDB)
4309        Controller->V1.DirectCommandActive[KernelCommand->DCDB->Channel]
4310                                          [KernelCommand->DCDB->TargetID] =
4311          false;
4312      DAC960_DeallocateCommand(Command);
4313      KernelCommand->CompletionFunction(KernelCommand);
4314      return;
4315    }
4316  /*
4317    Queue a Status Monitoring Command to the Controller using the just
4318    completed Command if one was deferred previously due to lack of a
4319    free Command when the Monitoring Timer Function was called.
4320  */
4321  if (Controller->MonitoringCommandDeferred)
4322    {
4323      Controller->MonitoringCommandDeferred = false;
4324      DAC960_V1_QueueMonitoringCommand(Command);
4325      return;
4326    }
4327  /*
4328    Deallocate the Command.
4329  */
4330  DAC960_DeallocateCommand(Command);
4331  /*
4332    Wake up any processes waiting on a free Command.
4333  */
4334  wake_up(&Controller->CommandWaitQueue);
4335}
4336
4337
4338/*
4339  DAC960_V2_ReadWriteError prints an appropriate error message for Command
4340  when an error occurs on a Read or Write operation.
4341*/
4342
4343static void DAC960_V2_ReadWriteError(DAC960_Command_T *Command)
4344{
4345  DAC960_Controller_T *Controller = Command->Controller;
4346  unsigned char *SenseErrors[] = { "NO SENSE", "RECOVERED ERROR",
4347                                   "NOT READY", "MEDIUM ERROR",
4348                                   "HARDWARE ERROR", "ILLEGAL REQUEST",
4349                                   "UNIT ATTENTION", "DATA PROTECT",
4350                                   "BLANK CHECK", "VENDOR-SPECIFIC",
4351                                   "COPY ABORTED", "ABORTED COMMAND",
4352                                   "EQUAL", "VOLUME OVERFLOW",
4353                                   "MISCOMPARE", "RESERVED" };
4354  unsigned char *CommandName = "UNKNOWN";
4355  switch (Command->CommandType)
4356    {
4357    case DAC960_ReadCommand:
4358    case DAC960_ReadRetryCommand:
4359      CommandName = "READ";
4360      break;
4361    case DAC960_WriteCommand:
4362    case DAC960_WriteRetryCommand:
4363      CommandName = "WRITE";
4364      break;
4365    case DAC960_MonitoringCommand:
4366    case DAC960_ImmediateCommand:
4367    case DAC960_QueuedCommand:
4368      break;
4369    }
4370  DAC960_Error("Error Condition %s on %s:\n", Controller,
4371               SenseErrors[Command->V2.RequestSense->SenseKey], CommandName);
4372  DAC960_Error("  /dev/rd/c%dd%d:   absolute blocks %u..%u\n",
4373               Controller, Controller->ControllerNumber,
4374               Command->LogicalDriveNumber, Command->BlockNumber,
4375               Command->BlockNumber + Command->BlockCount - 1);
4376}
4377
4378
4379/*
4380  DAC960_V2_ReportEvent prints an appropriate message when a Controller Event
4381  occurs.
4382*/
4383
4384static void DAC960_V2_ReportEvent(DAC960_Controller_T *Controller,
4385                                  DAC960_V2_Event_T *Event)
4386{
4387  DAC960_SCSI_RequestSense_T *RequestSense =
4388    (DAC960_SCSI_RequestSense_T *) &Event->RequestSenseData;
4389  unsigned char MessageBuffer[DAC960_LineBufferSize];
4390  static struct { int EventCode; unsigned char *EventMessage; } EventList[] =
4391    { /* Physical Device Events (0x0000 - 0x007F) */
4392      { 0x0001, "P Online" },
4393      { 0x0002, "P Standby" },
4394      { 0x0005, "P Automatic Rebuild Started" },
4395      { 0x0006, "P Manual Rebuild Started" },
4396      { 0x0007, "P Rebuild Completed" },
4397      { 0x0008, "P Rebuild Cancelled" },
4398      { 0x0009, "P Rebuild Failed for Unknown Reasons" },
4399      { 0x000A, "P Rebuild Failed due to New Physical Device" },
4400      { 0x000B, "P Rebuild Failed due to Logical Drive Failure" },
4401      { 0x000C, "S Offline" },
4402      { 0x000D, "P Found" },
4403      { 0x000E, "P Removed" },
4404      { 0x000F, "P Unconfigured" },
4405      { 0x0010, "P Expand Capacity Started" },
4406      { 0x0011, "P Expand Capacity Completed" },
4407      { 0x0012, "P Expand Capacity Failed" },
4408      { 0x0013, "P Command Timed Out" },
4409      { 0x0014, "P Command Aborted" },
4410      { 0x0015, "P Command Retried" },
4411      { 0x0016, "P Parity Error" },
4412      { 0x0017, "P Soft Error" },
4413      { 0x0018, "P Miscellaneous Error" },
4414      { 0x0019, "P Reset" },
4415      { 0x001A, "P Active Spare Found" },
4416      { 0x001B, "P Warm Spare Found" },
4417      { 0x001C, "S Sense Data Received" },
4418      { 0x001D, "P Initialization Started" },
4419      { 0x001E, "P Initialization Completed" },
4420      { 0x001F, "P Initialization Failed" },
4421      { 0x0020, "P Initialization Cancelled" },
4422      { 0x0021, "P Failed because Write Recovery Failed" },
4423      { 0x0022, "P Failed because SCSI Bus Reset Failed" },
4424      { 0x0023, "P Failed because of Double Check Condition" },
4425      { 0x0024, "P Failed because Device Cannot Be Accessed" },
4426      { 0x0025, "P Failed because of Gross Error on SCSI Processor" },
4427      { 0x0026, "P Failed because of Bad Tag from Device" },
4428      { 0x0027, "P Failed because of Command Timeout" },
4429      { 0x0028, "P Failed because of System Reset" },
4430      { 0x0029, "P Failed because of Busy Status or Parity Error" },
4431      { 0x002A, "P Failed because Host Set Device to Failed State" },
4432      { 0x002B, "P Failed because of Selection Timeout" },
4433      { 0x002C, "P Failed because of SCSI Bus Phase Error" },
4434      { 0x002D, "P Failed because Device Returned Unknown Status" },
4435      { 0x002E, "P Failed because Device Not Ready" },
4436      { 0x002F, "P Failed because Device Not Found at Startup" },
4437      { 0x0030, "P Failed because COD Write Operation Failed" },
4438      { 0x0031, "P Failed because BDT Write Operation Failed" },
4439      { 0x0039, "P Missing at Startup" },
4440      { 0x003A, "P Start Rebuild Failed due to Physical Drive Too Small" },
4441      { 0x003C, "P Temporarily Offline Device Automatically Made Online" },
4442      { 0x003D, "P Standby Rebuild Started" },
4443      /* Logical Device Events (0x0080 - 0x00FF) */
4444      { 0x0080, "M Consistency Check Started" },
4445      { 0x0081, "M Consistency Check Completed" },
4446      { 0x0082, "M Consistency Check Cancelled" },
4447      { 0x0083, "M Consistency Check Completed With Errors" },
4448      { 0x0084, "M Consistency Check Failed due to Logical Drive Failure" },
4449      { 0x0085, "M Consistency Check Failed due to Physical Device Failure" },
4450      { 0x0086, "L Offline" },
4451      { 0x0087, "L Critical" },
4452      { 0x0088, "L Online" },
4453      { 0x0089, "M Automatic Rebuild Started" },
4454      { 0x008A, "M Manual Rebuild Started" },
4455      { 0x008B, "M Rebuild Completed" },
4456      { 0x008C, "M Rebuild Cancelled" },
4457      { 0x008D, "M Rebuild Failed for Unknown Reasons" },
4458      { 0x008E, "M Rebuild Failed due to New Physical Device" },
4459      { 0x008F, "M Rebuild Failed due to Logical Drive Failure" },
4460      { 0x0090, "M Initialization Started" },
4461      { 0x0091, "M Initialization Completed" },
4462      { 0x0092, "M Initialization Cancelled" },
4463      { 0x0093, "M Initialization Failed" },
4464      { 0x0094, "L Found" },
4465      { 0x0095, "L Deleted" },
4466      { 0x0096, "M Expand Capacity Started" },
4467      { 0x0097, "M Expand Capacity Completed" },
4468      { 0x0098, "M Expand Capacity Failed" },
4469      { 0x0099, "L Bad Block Found" },
4470      { 0x009A, "L Size Changed" },
4471      { 0x009B, "L Type Changed" },
4472      { 0x009C, "L Bad Data Block Found" },
4473      { 0x009E, "L Read of Data Block in BDT" },
4474      { 0x009F, "L Write Back Data for Disk Block Lost" },
4475      { 0x00A0, "L Temporarily Offline RAID-5/3 Drive Made Online" },
4476      { 0x00A1, "L Temporarily Offline RAID-6/1/0/7 Drive Made Online" },
4477      { 0x00A2, "L Standby Rebuild Started" },
4478      /* Fault Management Events (0x0100 - 0x017F) */
4479      { 0x0140, "E Fan %d Failed" },
4480      { 0x0141, "E Fan %d OK" },
4481      { 0x0142, "E Fan %d Not Present" },
4482      { 0x0143, "E Power Supply %d Failed" },
4483      { 0x0144, "E Power Supply %d OK" },
4484      { 0x0145, "E Power Supply %d Not Present" },
4485      { 0x0146, "E Temperature Sensor %d Temperature Exceeds Safe Limit" },
4486      { 0x0147, "E Temperature Sensor %d Temperature Exceeds Working Limit" },
4487      { 0x0148, "E Temperature Sensor %d Temperature Normal" },
4488      { 0x0149, "E Temperature Sensor %d Not Present" },
4489      { 0x014A, "E Enclosure Management Unit %d Access Critical" },
4490      { 0x014B, "E Enclosure Management Unit %d Access OK" },
4491      { 0x014C, "E Enclosure Management Unit %d Access Offline" },
4492      /* Controller Events (0x0180 - 0x01FF) */
4493      { 0x0181, "C Cache Write Back Error" },
4494      { 0x0188, "C Battery Backup Unit Found" },
4495      { 0x0189, "C Battery Backup Unit Charge Level Low" },
4496      { 0x018A, "C Battery Backup Unit Charge Level OK" },
4497      { 0x0193, "C Installation Aborted" },
4498      { 0x0195, "C Battery Backup Unit Physically Removed" },
4499      { 0x0196, "C Memory Error During Warm Boot" },
4500      { 0x019E, "C Memory Soft ECC Error Corrected" },
4501      { 0x019F, "C Memory Hard ECC Error Corrected" },
4502      { 0x01A2, "C Battery Backup Unit Failed" },
4503      { 0x01AB, "C Mirror Race Recovery Failed" },
4504      { 0x01AC, "C Mirror Race on Critical Drive" },
4505      /* Controller Internal Processor Events */
4506      { 0x0380, "C Internal Controller Hung" },
4507      { 0x0381, "C Internal Controller Firmware Breakpoint" },
4508      { 0x0390, "C Internal Controller i960 Processor Specific Error" },
4509      { 0x03A0, "C Internal Controller StrongARM Processor Specific Error" },
4510      { 0, "" } };
4511  int EventListIndex = 0, EventCode;
4512  unsigned char EventType, *EventMessage;
4513  if (Event->EventCode == 0x1C &&
4514      RequestSense->SenseKey == DAC960_SenseKey_VendorSpecific &&
4515      (RequestSense->AdditionalSenseCode == 0x80 ||
4516       RequestSense->AdditionalSenseCode == 0x81))
4517    Event->EventCode = ((RequestSense->AdditionalSenseCode - 0x80) << 8) |
4518                       RequestSense->AdditionalSenseCodeQualifier;
4519  while (true)
4520    {
4521      EventCode = EventList[EventListIndex].EventCode;
4522      if (EventCode == Event->EventCode || EventCode == 0) break;
4523      EventListIndex++;
4524    }
4525  EventType = EventList[EventListIndex].EventMessage[0];
4526  EventMessage = &EventList[EventListIndex].EventMessage[2];
4527  if (EventCode == 0)
4528    {
4529      DAC960_Critical("Unknown Controller Event Code %04X\n",
4530                      Controller, Event->EventCode);
4531      return;
4532    }
4533  switch (EventType)
4534    {
4535    case 'P':
4536      DAC960_Critical("Physical Device %d:%d %s\n", Controller,
4537                      Event->Channel, Event->TargetID, EventMessage);
4538      break;
4539    case 'L':
4540      DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) %s\n", Controller,
4541                      Event->LogicalUnit, Controller->ControllerNumber,
4542                      Event->LogicalUnit, EventMessage);
4543      break;
4544    case 'M':
4545      DAC960_Progress("Logical Drive %d (/dev/rd/c%dd%d) %s\n", Controller,
4546                      Event->LogicalUnit, Controller->ControllerNumber,
4547                      Event->LogicalUnit, EventMessage);
4548      break;
4549    case 'S':
4550      if (RequestSense->SenseKey == DAC960_SenseKey_NoSense ||
4551          (RequestSense->SenseKey == DAC960_SenseKey_NotReady &&
4552           RequestSense->AdditionalSenseCode == 0x04 &&
4553           (RequestSense->AdditionalSenseCodeQualifier == 0x01 ||
4554            RequestSense->AdditionalSenseCodeQualifier == 0x02)))
4555        break;
4556      DAC960_Critical("Physical Device %d:%d %s\n", Controller,
4557                      Event->Channel, Event->TargetID, EventMessage);
4558      DAC960_Critical("Physical Device %d:%d Request Sense: "
4559                      "Sense Key = %X, ASC = %02X, ASCQ = %02X\n",
4560                      Controller,
4561                      Event->Channel,
4562                      Event->TargetID,
4563                      RequestSense->SenseKey,
4564                      RequestSense->AdditionalSenseCode,
4565                      RequestSense->AdditionalSenseCodeQualifier);
4566      DAC960_Critical("Physical Device %d:%d Request Sense: "
4567                      "Information = %02X%02X%02X%02X "
4568                      "%02X%02X%02X%02X\n",
4569                      Controller,
4570                      Event->Channel,
4571                      Event->TargetID,
4572                      RequestSense->Information[0],
4573                      RequestSense->Information[1],
4574                      RequestSense->Information[2],
4575                      RequestSense->Information[3],
4576                      RequestSense->CommandSpecificInformation[0],
4577                      RequestSense->CommandSpecificInformation[1],
4578                      RequestSense->CommandSpecificInformation[2],
4579                      RequestSense->CommandSpecificInformation[3]);
4580      break;
4581    case 'E':
4582      if (Controller->SuppressEnclosureMessages) break;
4583      sprintf(MessageBuffer, EventMessage, Event->LogicalUnit);
4584      DAC960_Critical("Enclosure %d %s\n", Controller,
4585                      Event->TargetID, MessageBuffer);
4586      break;
4587    case 'C':
4588      DAC960_Critical("Controller %s\n", Controller, EventMessage);
4589      break;
4590    default:
4591      DAC960_Critical("Unknown Controller Event Code %04X\n",
4592                      Controller, Event->EventCode);
4593      break;
4594    }
4595}
4596
4597
4598/*
4599  DAC960_V2_ReportProgress prints an appropriate progress message for
4600  Logical Device Long Operations.
4601*/
4602
4603static void DAC960_V2_ReportProgress(DAC960_Controller_T *Controller,
4604                                     unsigned char *MessageString,
4605                                     unsigned int LogicalDeviceNumber,
4606                                     unsigned long BlocksCompleted,
4607                                     unsigned long LogicalDeviceSize)
4608{
4609  Controller->EphemeralProgressMessage = true;
4610  DAC960_Progress("%s in Progress: Logical Drive %d (/dev/rd/c%dd%d) "
4611                  "%d%% completed\n", Controller,
4612                  MessageString,
4613                  LogicalDeviceNumber,
4614                  Controller->ControllerNumber,
4615                  LogicalDeviceNumber,
4616                  (100 * (BlocksCompleted >> 7)) / (LogicalDeviceSize >> 7));
4617  Controller->EphemeralProgressMessage = false;
4618}
4619
4620
4621/*
4622  DAC960_V2_ProcessCompletedCommand performs completion processing for Command
4623  for DAC960 V2 Firmware Controllers.
4624*/
4625
4626static void DAC960_V2_ProcessCompletedCommand(DAC960_Command_T *Command)
4627{
4628  DAC960_Controller_T *Controller = Command->Controller;
4629  DAC960_CommandType_T CommandType = Command->CommandType;
4630  DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
4631  DAC960_V2_IOCTL_Opcode_T IOCTLOpcode = CommandMailbox->Common.IOCTL_Opcode;
4632  DAC960_V2_CommandOpcode_T CommandOpcode = CommandMailbox->SCSI_10.CommandOpcode;
4633  DAC960_V2_CommandStatus_T CommandStatus = Command->V2.CommandStatus;
4634
4635  if (CommandType == DAC960_ReadCommand ||
4636      CommandType == DAC960_WriteCommand)
4637    {
4638
4639#ifdef FORCE_RETRY_DEBUG
4640      CommandStatus = DAC960_V2_AbormalCompletion;
4641#endif
4642      Command->V2.RequestSense->SenseKey = DAC960_SenseKey_MediumError;
4643
4644      if (CommandStatus == DAC960_V2_NormalCompletion) {
4645
4646                if (!DAC960_ProcessCompletedRequest(Command, true))
4647                        BUG();
4648
4649      } else if (Command->V2.RequestSense->SenseKey == DAC960_SenseKey_MediumError)
4650        {
4651          /*
4652           * break the command down into pieces and resubmit each
4653           * piece, hoping that some of them will succeed.
4654           */
4655           DAC960_queue_partial_rw(Command);
4656           return;
4657        }
4658      else
4659        {
4660          if (Command->V2.RequestSense->SenseKey != DAC960_SenseKey_NotReady)
4661            DAC960_V2_ReadWriteError(Command);
4662          /*
4663            Perform completion processing for all buffers in this I/O Request.
4664          */
4665          (void)DAC960_ProcessCompletedRequest(Command, false);
4666        }
4667    }
4668  else if (CommandType == DAC960_ReadRetryCommand ||
4669           CommandType == DAC960_WriteRetryCommand)
4670    {
4671      bool normal_completion;
4672
4673#ifdef FORCE_RETRY_FAILURE_DEBUG
4674      static int retry_count = 1;
4675#endif
4676      /*
4677        Perform completion processing for the portion that was
4678        retried, and submit the next portion, if any.
4679      */
4680      normal_completion = true;
4681      if (CommandStatus != DAC960_V2_NormalCompletion) {
4682        normal_completion = false;
4683        if (Command->V2.RequestSense->SenseKey != DAC960_SenseKey_NotReady)
4684            DAC960_V2_ReadWriteError(Command);
4685      }
4686
4687#ifdef FORCE_RETRY_FAILURE_DEBUG
4688      if (!(++retry_count % 10000)) {
4689              printk("V2 error retry failure test\n");
4690              normal_completion = false;
4691              DAC960_V2_ReadWriteError(Command);
4692      }
4693#endif
4694
4695      if (!DAC960_ProcessCompletedRequest(Command, normal_completion)) {
4696                DAC960_queue_partial_rw(Command);
4697                return;
4698      }
4699    }
4700  else if (CommandType == DAC960_MonitoringCommand)
4701    {
4702      if (Controller->ShutdownMonitoringTimer)
4703              return;
4704      if (IOCTLOpcode == DAC960_V2_GetControllerInfo)
4705        {
4706          DAC960_V2_ControllerInfo_T *NewControllerInfo =
4707            Controller->V2.NewControllerInformation;
4708          DAC960_V2_ControllerInfo_T *ControllerInfo =
4709            &Controller->V2.ControllerInformation;
4710          Controller->LogicalDriveCount =
4711            NewControllerInfo->LogicalDevicesPresent;
4712          Controller->V2.NeedLogicalDeviceInformation = true;
4713          Controller->V2.NeedPhysicalDeviceInformation = true;
4714          Controller->V2.StartLogicalDeviceInformationScan = true;
4715          Controller->V2.StartPhysicalDeviceInformationScan = true;
4716          Controller->MonitoringAlertMode =
4717            (NewControllerInfo->LogicalDevicesCritical > 0 ||
4718             NewControllerInfo->LogicalDevicesOffline > 0 ||
4719             NewControllerInfo->PhysicalDisksCritical > 0 ||
4720             NewControllerInfo->PhysicalDisksOffline > 0);
4721          memcpy(ControllerInfo, NewControllerInfo,
4722                 sizeof(DAC960_V2_ControllerInfo_T));
4723        }
4724      else if (IOCTLOpcode == DAC960_V2_GetEvent)
4725        {
4726          if (CommandStatus == DAC960_V2_NormalCompletion) {
4727            DAC960_V2_ReportEvent(Controller, Controller->V2.Event);
4728          }
4729          Controller->V2.NextEventSequenceNumber++;
4730        }
4731      else if (IOCTLOpcode == DAC960_V2_GetPhysicalDeviceInfoValid &&
4732               CommandStatus == DAC960_V2_NormalCompletion)
4733        {
4734          DAC960_V2_PhysicalDeviceInfo_T *NewPhysicalDeviceInfo =
4735            Controller->V2.NewPhysicalDeviceInformation;
4736          unsigned int PhysicalDeviceIndex = Controller->V2.PhysicalDeviceIndex;
4737          DAC960_V2_PhysicalDeviceInfo_T *PhysicalDeviceInfo =
4738            Controller->V2.PhysicalDeviceInformation[PhysicalDeviceIndex];
4739          DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber =
4740            Controller->V2.InquiryUnitSerialNumber[PhysicalDeviceIndex];
4741          unsigned int DeviceIndex;
4742          while (PhysicalDeviceInfo != NULL &&
4743                 (NewPhysicalDeviceInfo->Channel >
4744                  PhysicalDeviceInfo->Channel ||
4745                  (NewPhysicalDeviceInfo->Channel ==
4746                   PhysicalDeviceInfo->Channel &&
4747                   (NewPhysicalDeviceInfo->TargetID >
4748                    PhysicalDeviceInfo->TargetID ||
4749                   (NewPhysicalDeviceInfo->TargetID ==
4750                    PhysicalDeviceInfo->TargetID &&
4751                    NewPhysicalDeviceInfo->LogicalUnit >
4752                    PhysicalDeviceInfo->LogicalUnit)))))
4753            {
4754              DAC960_Critical("Physical Device %d:%d No Longer Exists\n",
4755                              Controller,
4756                              PhysicalDeviceInfo->Channel,
4757                              PhysicalDeviceInfo->TargetID);
4758              Controller->V2.PhysicalDeviceInformation
4759                             [PhysicalDeviceIndex] = NULL;
4760              Controller->V2.InquiryUnitSerialNumber
4761                             [PhysicalDeviceIndex] = NULL;
4762              kfree(PhysicalDeviceInfo);
4763              kfree(InquiryUnitSerialNumber);
4764              for (DeviceIndex = PhysicalDeviceIndex;
4765                   DeviceIndex < DAC960_V2_MaxPhysicalDevices - 1;
4766                   DeviceIndex++)
4767                {
4768                  Controller->V2.PhysicalDeviceInformation[DeviceIndex] =
4769                    Controller->V2.PhysicalDeviceInformation[DeviceIndex+1];
4770                  Controller->V2.InquiryUnitSerialNumber[DeviceIndex] =
4771                    Controller->V2.InquiryUnitSerialNumber[DeviceIndex+1];
4772                }
4773              Controller->V2.PhysicalDeviceInformation
4774                             [DAC960_V2_MaxPhysicalDevices-1] = NULL;
4775              Controller->V2.InquiryUnitSerialNumber
4776                             [DAC960_V2_MaxPhysicalDevices-1] = NULL;
4777              PhysicalDeviceInfo =
4778                Controller->V2.PhysicalDeviceInformation[PhysicalDeviceIndex];
4779              InquiryUnitSerialNumber =
4780                Controller->V2.InquiryUnitSerialNumber[PhysicalDeviceIndex];
4781            }
4782          if (PhysicalDeviceInfo == NULL ||
4783              (NewPhysicalDeviceInfo->Channel !=
4784               PhysicalDeviceInfo->Channel) ||
4785              (NewPhysicalDeviceInfo->TargetID !=
4786               PhysicalDeviceInfo->TargetID) ||
4787              (NewPhysicalDeviceInfo->LogicalUnit !=
4788               PhysicalDeviceInfo->LogicalUnit))
4789            {
4790              PhysicalDeviceInfo =
4791                kmalloc(sizeof(DAC960_V2_PhysicalDeviceInfo_T), GFP_ATOMIC);
4792              InquiryUnitSerialNumber =
4793                  kmalloc(sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T),
4794                          GFP_ATOMIC);
4795              if (InquiryUnitSerialNumber == NULL ||
4796                  PhysicalDeviceInfo == NULL)
4797                {
4798                  kfree(InquiryUnitSerialNumber);
4799                  InquiryUnitSerialNumber = NULL;
4800                  kfree(PhysicalDeviceInfo);
4801                  PhysicalDeviceInfo = NULL;
4802                }
4803              DAC960_Critical("Physical Device %d:%d Now Exists%s\n",
4804                              Controller,
4805                              NewPhysicalDeviceInfo->Channel,
4806                              NewPhysicalDeviceInfo->TargetID,
4807                              (PhysicalDeviceInfo != NULL
4808                               ? "" : " - Allocation Failed"));
4809              if (PhysicalDeviceInfo != NULL)
4810                {
4811                  memset(PhysicalDeviceInfo, 0,
4812                         sizeof(DAC960_V2_PhysicalDeviceInfo_T));
4813                  PhysicalDeviceInfo->PhysicalDeviceState =
4814                    DAC960_V2_Device_InvalidState;
4815                  memset(InquiryUnitSerialNumber, 0,
4816                         sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T));
4817                  InquiryUnitSerialNumber->PeripheralDeviceType = 0x1F;
4818                  for (DeviceIndex = DAC960_V2_MaxPhysicalDevices - 1;
4819                       DeviceIndex > PhysicalDeviceIndex;
4820                       DeviceIndex--)
4821                    {
4822                      Controller->V2.PhysicalDeviceInformation[DeviceIndex] =
4823                        Controller->V2.PhysicalDeviceInformation[DeviceIndex-1];
4824                      Controller->V2.InquiryUnitSerialNumber[DeviceIndex] =
4825                        Controller->V2.InquiryUnitSerialNumber[DeviceIndex-1];
4826                    }
4827                  Controller->V2.PhysicalDeviceInformation
4828                                 [PhysicalDeviceIndex] =
4829                    PhysicalDeviceInfo;
4830                  Controller->V2.InquiryUnitSerialNumber
4831                                 [PhysicalDeviceIndex] =
4832                    InquiryUnitSerialNumber;
4833                  Controller->V2.NeedDeviceSerialNumberInformation = true;
4834                }
4835            }
4836          if (PhysicalDeviceInfo != NULL)
4837            {
4838              if (NewPhysicalDeviceInfo->PhysicalDeviceState !=
4839                  PhysicalDeviceInfo->PhysicalDeviceState)
4840                DAC960_Critical(
4841                  "Physical Device %d:%d is now %s\n", Controller,
4842                  NewPhysicalDeviceInfo->Channel,
4843                  NewPhysicalDeviceInfo->TargetID,
4844                  (NewPhysicalDeviceInfo->PhysicalDeviceState
4845                   == DAC960_V2_Device_Online
4846                   ? "ONLINE"
4847                   : NewPhysicalDeviceInfo->PhysicalDeviceState
4848                     == DAC960_V2_Device_Rebuild
4849                     ? "REBUILD"
4850                     : NewPhysicalDeviceInfo->PhysicalDeviceState
4851                       == DAC960_V2_Device_Missing
4852                       ? "MISSING"
4853                       : NewPhysicalDeviceInfo->PhysicalDeviceState
4854                         == DAC960_V2_Device_Critical
4855                         ? "CRITICAL"
4856                         : NewPhysicalDeviceInfo->PhysicalDeviceState
4857                           == DAC960_V2_Device_Dead
4858                           ? "DEAD"
4859                           : NewPhysicalDeviceInfo->PhysicalDeviceState
4860                             == DAC960_V2_Device_SuspectedDead
4861                             ? "SUSPECTED-DEAD"
4862                             : NewPhysicalDeviceInfo->PhysicalDeviceState
4863                               == DAC960_V2_Device_CommandedOffline
4864                               ? "COMMANDED-OFFLINE"
4865                               : NewPhysicalDeviceInfo->PhysicalDeviceState
4866                                 == DAC960_V2_Device_Standby
4867                                 ? "STANDBY" : "UNKNOWN"));
4868              if ((NewPhysicalDeviceInfo->ParityErrors !=
4869                   PhysicalDeviceInfo->ParityErrors) ||
4870                  (NewPhysicalDeviceInfo->SoftErrors !=
4871                   PhysicalDeviceInfo->SoftErrors) ||
4872                  (NewPhysicalDeviceInfo->HardErrors !=
4873                   PhysicalDeviceInfo->HardErrors) ||
4874                  (NewPhysicalDeviceInfo->MiscellaneousErrors !=
4875                   PhysicalDeviceInfo->MiscellaneousErrors) ||
4876                  (NewPhysicalDeviceInfo->CommandTimeouts !=
4877                   PhysicalDeviceInfo->CommandTimeouts) ||
4878                  (NewPhysicalDeviceInfo->Retries !=
4879                   PhysicalDeviceInfo->Retries) ||
4880                  (NewPhysicalDeviceInfo->Aborts !=
4881                   PhysicalDeviceInfo->Aborts) ||
4882                  (NewPhysicalDeviceInfo->PredictedFailuresDetected !=
4883                   PhysicalDeviceInfo->PredictedFailuresDetected))
4884                {
4885                  DAC960_Critical("Physical Device %d:%d Errors: "
4886                                  "Parity = %d, Soft = %d, "
4887                                  "Hard = %d, Misc = %d\n",
4888                                  Controller,
4889                                  NewPhysicalDeviceInfo->Channel,
4890                                  NewPhysicalDeviceInfo->TargetID,
4891                                  NewPhysicalDeviceInfo->ParityErrors,
4892                                  NewPhysicalDeviceInfo->SoftErrors,
4893                                  NewPhysicalDeviceInfo->HardErrors,
4894                                  NewPhysicalDeviceInfo->MiscellaneousErrors);
4895                  DAC960_Critical("Physical Device %d:%d Errors: "
4896                                  "Timeouts = %d, Retries = %d, "
4897                                  "Aborts = %d, Predicted = %d\n",
4898                                  Controller,
4899                                  NewPhysicalDeviceInfo->Channel,
4900                                  NewPhysicalDeviceInfo->TargetID,
4901                                  NewPhysicalDeviceInfo->CommandTimeouts,
4902                                  NewPhysicalDeviceInfo->Retries,
4903                                  NewPhysicalDeviceInfo->Aborts,
4904                                  NewPhysicalDeviceInfo
4905                                  ->PredictedFailuresDetected);
4906                }
4907              if ((PhysicalDeviceInfo->PhysicalDeviceState
4908                   == DAC960_V2_Device_Dead ||
4909                   PhysicalDeviceInfo->PhysicalDeviceState
4910                   == DAC960_V2_Device_InvalidState) &&
4911                  NewPhysicalDeviceInfo->PhysicalDeviceState
4912                  != DAC960_V2_Device_Dead)
4913                Controller->V2.NeedDeviceSerialNumberInformation = true;
4914              memcpy(PhysicalDeviceInfo, NewPhysicalDeviceInfo,
4915                     sizeof(DAC960_V2_PhysicalDeviceInfo_T));
4916            }
4917          NewPhysicalDeviceInfo->LogicalUnit++;
4918          Controller->V2.PhysicalDeviceIndex++;
4919        }
4920      else if (IOCTLOpcode == DAC960_V2_GetPhysicalDeviceInfoValid)
4921        {
4922          unsigned int DeviceIndex;
4923          for (DeviceIndex = Controller->V2.PhysicalDeviceIndex;
4924               DeviceIndex < DAC960_V2_MaxPhysicalDevices;
4925               DeviceIndex++)
4926            {
4927              DAC960_V2_PhysicalDeviceInfo_T *PhysicalDeviceInfo =
4928                Controller->V2.PhysicalDeviceInformation[DeviceIndex];
4929              DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber =
4930                Controller->V2.InquiryUnitSerialNumber[DeviceIndex];
4931              if (PhysicalDeviceInfo == NULL) break;
4932              DAC960_Critical("Physical Device %d:%d No Longer Exists\n",
4933                              Controller,
4934                              PhysicalDeviceInfo->Channel,
4935                              PhysicalDeviceInfo->TargetID);
4936              Controller->V2.PhysicalDeviceInformation[DeviceIndex] = NULL;
4937              Controller->V2.InquiryUnitSerialNumber[DeviceIndex] = NULL;
4938              kfree(PhysicalDeviceInfo);
4939              kfree(InquiryUnitSerialNumber);
4940            }
4941          Controller->V2.NeedPhysicalDeviceInformation = false;
4942        }
4943      else if (IOCTLOpcode == DAC960_V2_GetLogicalDeviceInfoValid &&
4944               CommandStatus == DAC960_V2_NormalCompletion)
4945        {
4946          DAC960_V2_LogicalDeviceInfo_T *NewLogicalDeviceInfo =
4947            Controller->V2.NewLogicalDeviceInformation;
4948          unsigned short LogicalDeviceNumber =
4949            NewLogicalDeviceInfo->LogicalDeviceNumber;
4950          DAC960_V2_LogicalDeviceInfo_T *LogicalDeviceInfo =
4951            Controller->V2.LogicalDeviceInformation[LogicalDeviceNumber];
4952          if (LogicalDeviceInfo == NULL)
4953            {
4954              DAC960_V2_PhysicalDevice_T PhysicalDevice;
4955              PhysicalDevice.Controller = 0;
4956              PhysicalDevice.Channel = NewLogicalDeviceInfo->Channel;
4957              PhysicalDevice.TargetID = NewLogicalDeviceInfo->TargetID;
4958              PhysicalDevice.LogicalUnit = NewLogicalDeviceInfo->LogicalUnit;
4959              Controller->V2.LogicalDriveToVirtualDevice[LogicalDeviceNumber] =
4960                PhysicalDevice;
4961              LogicalDeviceInfo = kmalloc(sizeof(DAC960_V2_LogicalDeviceInfo_T),
4962                                          GFP_ATOMIC);
4963              Controller->V2.LogicalDeviceInformation[LogicalDeviceNumber] =
4964                LogicalDeviceInfo;
4965              DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) "
4966                              "Now Exists%s\n", Controller,
4967                              LogicalDeviceNumber,
4968                              Controller->ControllerNumber,
4969                              LogicalDeviceNumber,
4970                              (LogicalDeviceInfo != NULL
4971                               ? "" : " - Allocation Failed"));
4972              if (LogicalDeviceInfo != NULL)
4973                {
4974                  memset(LogicalDeviceInfo, 0,
4975                         sizeof(DAC960_V2_LogicalDeviceInfo_T));
4976                  DAC960_ComputeGenericDiskInfo(Controller);
4977                }
4978            }
4979          if (LogicalDeviceInfo != NULL)
4980            {
4981              unsigned long LogicalDeviceSize =
4982                NewLogicalDeviceInfo->ConfigurableDeviceSize;
4983              if (NewLogicalDeviceInfo->LogicalDeviceState !=
4984                  LogicalDeviceInfo->LogicalDeviceState)
4985                DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) "
4986                                "is now %s\n", Controller,
4987                                LogicalDeviceNumber,
4988                                Controller->ControllerNumber,
4989                                LogicalDeviceNumber,
4990                                (NewLogicalDeviceInfo->LogicalDeviceState
4991                                 == DAC960_V2_LogicalDevice_Online
4992                                 ? "ONLINE"
4993                                 : NewLogicalDeviceInfo->LogicalDeviceState
4994                                   == DAC960_V2_LogicalDevice_Critical
4995                                   ? "CRITICAL" : "OFFLINE"));
4996              if ((NewLogicalDeviceInfo->SoftErrors !=
4997                   LogicalDeviceInfo->SoftErrors) ||
4998                  (NewLogicalDeviceInfo->CommandsFailed !=
4999                   LogicalDeviceInfo->CommandsFailed) ||
5000                  (NewLogicalDeviceInfo->DeferredWriteErrors !=
5001                   LogicalDeviceInfo->DeferredWriteErrors))
5002                DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) Errors: "
5003                                "Soft = %d, Failed = %d, Deferred Write = %d\n",
5004                                Controller, LogicalDeviceNumber,
5005                                Controller->ControllerNumber,
5006                                LogicalDeviceNumber,
5007                                NewLogicalDeviceInfo->SoftErrors,
5008                                NewLogicalDeviceInfo->CommandsFailed,
5009                                NewLogicalDeviceInfo->DeferredWriteErrors);
5010              if (NewLogicalDeviceInfo->ConsistencyCheckInProgress)
5011                DAC960_V2_ReportProgress(Controller,
5012                                         "Consistency Check",
5013                                         LogicalDeviceNumber,
5014                                         NewLogicalDeviceInfo
5015                                         ->ConsistencyCheckBlockNumber,
5016                                         LogicalDeviceSize);
5017              else if (NewLogicalDeviceInfo->RebuildInProgress)
5018                DAC960_V2_ReportProgress(Controller,
5019                                         "Rebuild",
5020                                         LogicalDeviceNumber,
5021                                         NewLogicalDeviceInfo
5022                                         ->RebuildBlockNumber,
5023                                         LogicalDeviceSize);
5024              else if (NewLogicalDeviceInfo->BackgroundInitializationInProgress)
5025                DAC960_V2_ReportProgress(Controller,
5026                                         "Background Initialization",
5027                                         LogicalDeviceNumber,
5028                                         NewLogicalDeviceInfo
5029                                         ->BackgroundInitializationBlockNumber,
5030                                         LogicalDeviceSize);
5031              else if (NewLogicalDeviceInfo->ForegroundInitializationInProgress)
5032                DAC960_V2_ReportProgress(Controller,
5033                                         "Foreground Initialization",
5034                                         LogicalDeviceNumber,
5035                                         NewLogicalDeviceInfo
5036                                         ->ForegroundInitializationBlockNumber,
5037                                         LogicalDeviceSize);
5038              else if (NewLogicalDeviceInfo->DataMigrationInProgress)
5039                DAC960_V2_ReportProgress(Controller,
5040                                         "Data Migration",
5041                                         LogicalDeviceNumber,
5042                                         NewLogicalDeviceInfo
5043                                         ->DataMigrationBlockNumber,
5044                                         LogicalDeviceSize);
5045              else if (NewLogicalDeviceInfo->PatrolOperationInProgress)
5046                DAC960_V2_ReportProgress(Controller,
5047                                         "Patrol Operation",
5048                                         LogicalDeviceNumber,
5049                                         NewLogicalDeviceInfo
5050                                         ->PatrolOperationBlockNumber,
5051                                         LogicalDeviceSize);
5052              if (LogicalDeviceInfo->BackgroundInitializationInProgress &&
5053                  !NewLogicalDeviceInfo->BackgroundInitializationInProgress)
5054                DAC960_Progress("Logical Drive %d (/dev/rd/c%dd%d) "
5055                                "Background Initialization %s\n",
5056                                Controller,
5057                                LogicalDeviceNumber,
5058                                Controller->ControllerNumber,
5059                                LogicalDeviceNumber,
5060                                (NewLogicalDeviceInfo->LogicalDeviceControl
5061                                                      .LogicalDeviceInitialized
5062                                 ? "Completed" : "Failed"));
5063              memcpy(LogicalDeviceInfo, NewLogicalDeviceInfo,
5064                     sizeof(DAC960_V2_LogicalDeviceInfo_T));
5065            }
5066          Controller->V2.LogicalDriveFoundDuringScan
5067                         [LogicalDeviceNumber] = true;
5068          NewLogicalDeviceInfo->LogicalDeviceNumber++;
5069        }
5070      else if (IOCTLOpcode == DAC960_V2_GetLogicalDeviceInfoValid)
5071        {
5072          int LogicalDriveNumber;
5073          for (LogicalDriveNumber = 0;
5074               LogicalDriveNumber < DAC960_MaxLogicalDrives;
5075               LogicalDriveNumber++)
5076            {
5077              DAC960_V2_LogicalDeviceInfo_T *LogicalDeviceInfo =
5078                Controller->V2.LogicalDeviceInformation[LogicalDriveNumber];
5079              if (LogicalDeviceInfo == NULL ||
5080                  Controller->V2.LogicalDriveFoundDuringScan
5081                                 [LogicalDriveNumber])
5082                continue;
5083              DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) "
5084                              "No Longer Exists\n", Controller,
5085                              LogicalDriveNumber,
5086                              Controller->ControllerNumber,
5087                              LogicalDriveNumber);
5088              Controller->V2.LogicalDeviceInformation
5089                             [LogicalDriveNumber] = NULL;
5090              kfree(LogicalDeviceInfo);
5091              Controller->LogicalDriveInitiallyAccessible
5092                          [LogicalDriveNumber] = false;
5093              DAC960_ComputeGenericDiskInfo(Controller);
5094            }
5095          Controller->V2.NeedLogicalDeviceInformation = false;
5096        }
5097      else if (CommandOpcode == DAC960_V2_SCSI_10_Passthru)
5098        {
5099            DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber =
5100                Controller->V2.InquiryUnitSerialNumber[Controller->V2.PhysicalDeviceIndex - 1];
5101
5102            if (CommandStatus != DAC960_V2_NormalCompletion) {
5103                memset(InquiryUnitSerialNumber,
5104                        0, sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T));
5105                InquiryUnitSerialNumber->PeripheralDeviceType = 0x1F;
5106            } else
5107                memcpy(InquiryUnitSerialNumber,
5108                        Controller->V2.NewInquiryUnitSerialNumber,
5109                        sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T));
5110
5111             Controller->V2.NeedDeviceSerialNumberInformation = false;
5112        }
5113
5114      if (Controller->V2.HealthStatusBuffer->NextEventSequenceNumber
5115          - Controller->V2.NextEventSequenceNumber > 0)
5116        {
5117          CommandMailbox->GetEvent.CommandOpcode = DAC960_V2_IOCTL;
5118          CommandMailbox->GetEvent.DataTransferSize = sizeof(DAC960_V2_Event_T);
5119          CommandMailbox->GetEvent.EventSequenceNumberHigh16 =
5120            Controller->V2.NextEventSequenceNumber >> 16;
5121          CommandMailbox->GetEvent.ControllerNumber = 0;
5122          CommandMailbox->GetEvent.IOCTL_Opcode =
5123            DAC960_V2_GetEvent;
5124          CommandMailbox->GetEvent.EventSequenceNumberLow16 =
5125            Controller->V2.NextEventSequenceNumber & 0xFFFF;
5126          CommandMailbox->GetEvent.DataTransferMemoryAddress
5127                                  .ScatterGatherSegments[0]
5128                                  .SegmentDataPointer =
5129            Controller->V2.EventDMA;
5130          CommandMailbox->GetEvent.DataTransferMemoryAddress
5131                                  .ScatterGatherSegments[0]
5132                                  .SegmentByteCount =
5133            CommandMailbox->GetEvent.DataTransferSize;
5134          DAC960_QueueCommand(Command);
5135          return;
5136        }
5137      if (Controller->V2.NeedPhysicalDeviceInformation)
5138        {
5139          if (Controller->V2.NeedDeviceSerialNumberInformation)
5140            {
5141              DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber =
5142                Controller->V2.NewInquiryUnitSerialNumber;
5143              InquiryUnitSerialNumber->PeripheralDeviceType = 0x1F;
5144
5145              DAC960_V2_ConstructNewUnitSerialNumber(Controller, CommandMailbox,
5146                        Controller->V2.NewPhysicalDeviceInformation->Channel,
5147                        Controller->V2.NewPhysicalDeviceInformation->TargetID,
5148                Controller->V2.NewPhysicalDeviceInformation->LogicalUnit - 1);
5149
5150
5151              DAC960_QueueCommand(Command);
5152              return;
5153            }
5154          if (Controller->V2.StartPhysicalDeviceInformationScan)
5155            {
5156              Controller->V2.PhysicalDeviceIndex = 0;
5157              Controller->V2.NewPhysicalDeviceInformation->Channel = 0;
5158              Controller->V2.NewPhysicalDeviceInformation->TargetID = 0;
5159              Controller->V2.NewPhysicalDeviceInformation->LogicalUnit = 0;
5160              Controller->V2.StartPhysicalDeviceInformationScan = false;
5161            }
5162          CommandMailbox->PhysicalDeviceInfo.CommandOpcode = DAC960_V2_IOCTL;
5163          CommandMailbox->PhysicalDeviceInfo.DataTransferSize =
5164            sizeof(DAC960_V2_PhysicalDeviceInfo_T);
5165          CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.LogicalUnit =
5166            Controller->V2.NewPhysicalDeviceInformation->LogicalUnit;
5167          CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.TargetID =
5168            Controller->V2.NewPhysicalDeviceInformation->TargetID;
5169          CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.Channel =
5170            Controller->V2.NewPhysicalDeviceInformation->Channel;
5171          CommandMailbox->PhysicalDeviceInfo.IOCTL_Opcode =
5172            DAC960_V2_GetPhysicalDeviceInfoValid;
5173          CommandMailbox->PhysicalDeviceInfo.DataTransferMemoryAddress
5174                                            .ScatterGatherSegments[0]
5175                                            .SegmentDataPointer =
5176            Controller->V2.NewPhysicalDeviceInformationDMA;
5177          CommandMailbox->PhysicalDeviceInfo.DataTransferMemoryAddress
5178                                            .ScatterGatherSegments[0]
5179                                            .SegmentByteCount =
5180            CommandMailbox->PhysicalDeviceInfo.DataTransferSize;
5181          DAC960_QueueCommand(Command);
5182          return;
5183        }
5184      if (Controller->V2.NeedLogicalDeviceInformation)
5185        {
5186          if (Controller->V2.StartLogicalDeviceInformationScan)
5187            {
5188              int LogicalDriveNumber;
5189              for (LogicalDriveNumber = 0;
5190                   LogicalDriveNumber < DAC960_MaxLogicalDrives;
5191                   LogicalDriveNumber++)
5192                Controller->V2.LogicalDriveFoundDuringScan
5193                               [LogicalDriveNumber] = false;
5194              Controller->V2.NewLogicalDeviceInformation->LogicalDeviceNumber = 0;
5195              Controller->V2.StartLogicalDeviceInformationScan = false;
5196            }
5197          CommandMailbox->LogicalDeviceInfo.CommandOpcode = DAC960_V2_IOCTL;
5198          CommandMailbox->LogicalDeviceInfo.DataTransferSize =
5199            sizeof(DAC960_V2_LogicalDeviceInfo_T);
5200          CommandMailbox->LogicalDeviceInfo.LogicalDevice.LogicalDeviceNumber =
5201            Controller->V2.NewLogicalDeviceInformation->LogicalDeviceNumber;
5202          CommandMailbox->LogicalDeviceInfo.IOCTL_Opcode =
5203            DAC960_V2_GetLogicalDeviceInfoValid;
5204          CommandMailbox->LogicalDeviceInfo.DataTransferMemoryAddress
5205                                           .ScatterGatherSegments[0]
5206                                           .SegmentDataPointer =
5207            Controller->V2.NewLogicalDeviceInformationDMA;
5208          CommandMailbox->LogicalDeviceInfo.DataTransferMemoryAddress
5209                                           .ScatterGatherSegments[0]
5210                                           .SegmentByteCount =
5211            CommandMailbox->LogicalDeviceInfo.DataTransferSize;
5212          DAC960_QueueCommand(Command);
5213          return;
5214        }
5215      Controller->MonitoringTimerCount++;
5216      Controller->MonitoringTimer.expires =
5217        jiffies + DAC960_HealthStatusMonitoringInterval;
5218        add_timer(&Controller->MonitoringTimer);
5219    }
5220  if (CommandType == DAC960_ImmediateCommand)
5221    {
5222      complete(Command->Completion);
5223      Command->Completion = NULL;
5224      return;
5225    }
5226  if (CommandType == DAC960_QueuedCommand)
5227    {
5228      DAC960_V2_KernelCommand_T *KernelCommand = Command->V2.KernelCommand;
5229      KernelCommand->CommandStatus = CommandStatus;
5230      KernelCommand->RequestSenseLength = Command->V2.RequestSenseLength;
5231      KernelCommand->DataTransferLength = Command->V2.DataTransferResidue;
5232      Command->V2.KernelCommand = NULL;
5233      DAC960_DeallocateCommand(Command);
5234      KernelCommand->CompletionFunction(KernelCommand);
5235      return;
5236    }
5237  /*
5238    Queue a Status Monitoring Command to the Controller using the just
5239    completed Command if one was deferred previously due to lack of a
5240    free Command when the Monitoring Timer Function was called.
5241  */
5242  if (Controller->MonitoringCommandDeferred)
5243    {
5244      Controller->MonitoringCommandDeferred = false;
5245      DAC960_V2_QueueMonitoringCommand(Command);
5246      return;
5247    }
5248  /*
5249    Deallocate the Command.
5250  */
5251  DAC960_DeallocateCommand(Command);
5252  /*
5253    Wake up any processes waiting on a free Command.
5254  */
5255  wake_up(&Controller->CommandWaitQueue);
5256}
5257
5258/*
5259  DAC960_GEM_InterruptHandler handles hardware interrupts from DAC960 GEM Series
5260  Controllers.
5261*/
5262
5263static irqreturn_t DAC960_GEM_InterruptHandler(int IRQ_Channel,
5264                                       void *DeviceIdentifier)
5265{
5266  DAC960_Controller_T *Controller = DeviceIdentifier;
5267  void __iomem *ControllerBaseAddress = Controller->BaseAddress;
5268  DAC960_V2_StatusMailbox_T *NextStatusMailbox;
5269  unsigned long flags;
5270
5271  spin_lock_irqsave(&Controller->queue_lock, flags);
5272  DAC960_GEM_AcknowledgeInterrupt(ControllerBaseAddress);
5273  NextStatusMailbox = Controller->V2.NextStatusMailbox;
5274  while (NextStatusMailbox->Fields.CommandIdentifier > 0)
5275    {
5276       DAC960_V2_CommandIdentifier_T CommandIdentifier =
5277           NextStatusMailbox->Fields.CommandIdentifier;
5278       DAC960_Command_T *Command = Controller->Commands[CommandIdentifier-1];
5279       Command->V2.CommandStatus = NextStatusMailbox->Fields.CommandStatus;
5280       Command->V2.RequestSenseLength =
5281           NextStatusMailbox->Fields.RequestSenseLength;
5282       Command->V2.DataTransferResidue =
5283           NextStatusMailbox->Fields.DataTransferResidue;
5284       NextStatusMailbox->Words[0] = 0;
5285       if (++NextStatusMailbox > Controller->V2.LastStatusMailbox)
5286           NextStatusMailbox = Controller->V2.FirstStatusMailbox;
5287       DAC960_V2_ProcessCompletedCommand(Command);
5288    }
5289  Controller->V2.NextStatusMailbox = NextStatusMailbox;
5290  /*
5291    Attempt to remove additional I/O Requests from the Controller's
5292    I/O Request Queue and queue them to the Controller.
5293  */
5294  DAC960_ProcessRequest(Controller);
5295  spin_unlock_irqrestore(&Controller->queue_lock, flags);
5296  return IRQ_HANDLED;
5297}
5298
5299/*
5300  DAC960_BA_InterruptHandler handles hardware interrupts from DAC960 BA Series
5301  Controllers.
5302*/
5303
5304static irqreturn_t DAC960_BA_InterruptHandler(int IRQ_Channel,
5305                                       void *DeviceIdentifier)
5306{
5307  DAC960_Controller_T *Controller = DeviceIdentifier;
5308  void __iomem *ControllerBaseAddress = Controller->BaseAddress;
5309  DAC960_V2_StatusMailbox_T *NextStatusMailbox;
5310  unsigned long flags;
5311
5312  spin_lock_irqsave(&Controller->queue_lock, flags);
5313  DAC960_BA_AcknowledgeInterrupt(ControllerBaseAddress);
5314  NextStatusMailbox = Controller->V2.NextStatusMailbox;
5315  while (NextStatusMailbox->Fields.CommandIdentifier > 0)
5316    {
5317      DAC960_V2_CommandIdentifier_T CommandIdentifier =
5318        NextStatusMailbox->Fields.CommandIdentifier;
5319      DAC960_Command_T *Command = Controller->Commands[CommandIdentifier-1];
5320      Command->V2.CommandStatus = NextStatusMailbox->Fields.CommandStatus;
5321      Command->V2.RequestSenseLength =
5322        NextStatusMailbox->Fields.RequestSenseLength;
5323      Command->V2.DataTransferResidue =
5324        NextStatusMailbox->Fields.DataTransferResidue;
5325      NextStatusMailbox->Words[0] = 0;
5326      if (++NextStatusMailbox > Controller->V2.LastStatusMailbox)
5327        NextStatusMailbox = Controller->V2.FirstStatusMailbox;
5328      DAC960_V2_ProcessCompletedCommand(Command);
5329    }
5330  Controller->V2.NextStatusMailbox = NextStatusMailbox;
5331  /*
5332    Attempt to remove additional I/O Requests from the Controller's
5333    I/O Request Queue and queue them to the Controller.
5334  */
5335  DAC960_ProcessRequest(Controller);
5336  spin_unlock_irqrestore(&Controller->queue_lock, flags);
5337  return IRQ_HANDLED;
5338}
5339
5340
5341/*
5342  DAC960_LP_InterruptHandler handles hardware interrupts from DAC960 LP Series
5343  Controllers.
5344*/
5345
5346static irqreturn_t DAC960_LP_InterruptHandler(int IRQ_Channel,
5347                                       void *DeviceIdentifier)
5348{
5349  DAC960_Controller_T *Controller = DeviceIdentifier;
5350  void __iomem *ControllerBaseAddress = Controller->BaseAddress;
5351  DAC960_V2_StatusMailbox_T *NextStatusMailbox;
5352  unsigned long flags;
5353
5354  spin_lock_irqsave(&Controller->queue_lock, flags);
5355  DAC960_LP_AcknowledgeInterrupt(ControllerBaseAddress);
5356  NextStatusMailbox = Controller->V2.NextStatusMailbox;
5357  while (NextStatusMailbox->Fields.CommandIdentifier > 0)
5358    {
5359      DAC960_V2_CommandIdentifier_T CommandIdentifier =
5360        NextStatusMailbox->Fields.CommandIdentifier;
5361      DAC960_Command_T *Command = Controller->Commands[CommandIdentifier-1];
5362      Command->V2.CommandStatus = NextStatusMailbox->Fields.CommandStatus;
5363      Command->V2.RequestSenseLength =
5364        NextStatusMailbox->Fields.RequestSenseLength;
5365      Command->V2.DataTransferResidue =
5366        NextStatusMailbox->Fields.DataTransferResidue;
5367      NextStatusMailbox->Words[0] = 0;
5368      if (++NextStatusMailbox > Controller->V2.LastStatusMailbox)
5369        NextStatusMailbox = Controller->V2.FirstStatusMailbox;
5370      DAC960_V2_ProcessCompletedCommand(Command);
5371    }
5372  Controller->V2.NextStatusMailbox = NextStatusMailbox;
5373  /*
5374    Attempt to remove additional I/O Requests from the Controller's
5375    I/O Request Queue and queue them to the Controller.
5376  */
5377  DAC960_ProcessRequest(Controller);
5378  spin_unlock_irqrestore(&Controller->queue_lock, flags);
5379  return IRQ_HANDLED;
5380}
5381
5382
5383/*
5384  DAC960_LA_InterruptHandler handles hardware interrupts from DAC960 LA Series
5385  Controllers.
5386*/
5387
5388static irqreturn_t DAC960_LA_InterruptHandler(int IRQ_Channel,
5389                                       void *DeviceIdentifier)
5390{
5391  DAC960_Controller_T *Controller = DeviceIdentifier;
5392  void __iomem *ControllerBaseAddress = Controller->BaseAddress;
5393  DAC960_V1_StatusMailbox_T *NextStatusMailbox;
5394  unsigned long flags;
5395
5396  spin_lock_irqsave(&Controller->queue_lock, flags);
5397  DAC960_LA_AcknowledgeInterrupt(ControllerBaseAddress);
5398  NextStatusMailbox = Controller->V1.NextStatusMailbox;
5399  while (NextStatusMailbox->Fields.Valid)
5400    {
5401      DAC960_V1_CommandIdentifier_T CommandIdentifier =
5402        NextStatusMailbox->Fields.CommandIdentifier;
5403      DAC960_Command_T *Command = Controller->Commands[CommandIdentifier-1];
5404      Command->V1.CommandStatus = NextStatusMailbox->Fields.CommandStatus;
5405      NextStatusMailbox->Word = 0;
5406      if (++NextStatusMailbox > Controller->V1.LastStatusMailbox)
5407        NextStatusMailbox = Controller->V1.FirstStatusMailbox;
5408      DAC960_V1_ProcessCompletedCommand(Command);
5409    }
5410  Controller->V1.NextStatusMailbox = NextStatusMailbox;
5411  /*
5412    Attempt to remove additional I/O Requests from the Controller's
5413    I/O Request Queue and queue them to the Controller.
5414  */
5415  DAC960_ProcessRequest(Controller);
5416  spin_unlock_irqrestore(&Controller->queue_lock, flags);
5417  return IRQ_HANDLED;
5418}
5419
5420
5421/*
5422  DAC960_PG_InterruptHandler handles hardware interrupts from DAC960 PG Series
5423  Controllers.
5424*/
5425
5426static irqreturn_t DAC960_PG_InterruptHandler(int IRQ_Channel,
5427                                       void *DeviceIdentifier)
5428{
5429  DAC960_Controller_T *Controller = DeviceIdentifier;
5430  void __iomem *ControllerBaseAddress = Controller->BaseAddress;
5431  DAC960_V1_StatusMailbox_T *NextStatusMailbox;
5432  unsigned long flags;
5433
5434  spin_lock_irqsave(&Controller->queue_lock, flags);
5435  DAC960_PG_AcknowledgeInterrupt(ControllerBaseAddress);
5436  NextStatusMailbox = Controller->V1.NextStatusMailbox;
5437  while (NextStatusMailbox->Fields.Valid)
5438    {
5439      DAC960_V1_CommandIdentifier_T CommandIdentifier =
5440        NextStatusMailbox->Fields.CommandIdentifier;
5441      DAC960_Command_T *Command = Controller->Commands[CommandIdentifier-1];
5442      Command->V1.CommandStatus = NextStatusMailbox->Fields.CommandStatus;
5443      NextStatusMailbox->Word = 0;
5444      if (++NextStatusMailbox > Controller->V1.LastStatusMailbox)
5445        NextStatusMailbox = Controller->V1.FirstStatusMailbox;
5446      DAC960_V1_ProcessCompletedCommand(Command);
5447    }
5448  Controller->V1.NextStatusMailbox = NextStatusMailbox;
5449  /*
5450    Attempt to remove additional I/O Requests from the Controller's
5451    I/O Request Queue and queue them to the Controller.
5452  */
5453  DAC960_ProcessRequest(Controller);
5454  spin_unlock_irqrestore(&Controller->queue_lock, flags);
5455  return IRQ_HANDLED;
5456}
5457
5458
5459/*
5460  DAC960_PD_InterruptHandler handles hardware interrupts from DAC960 PD Series
5461  Controllers.
5462*/
5463
5464static irqreturn_t DAC960_PD_InterruptHandler(int IRQ_Channel,
5465                                       void *DeviceIdentifier)
5466{
5467  DAC960_Controller_T *Controller = DeviceIdentifier;
5468  void __iomem *ControllerBaseAddress = Controller->BaseAddress;
5469  unsigned long flags;
5470
5471  spin_lock_irqsave(&Controller->queue_lock, flags);
5472  while (DAC960_PD_StatusAvailableP(ControllerBaseAddress))
5473    {
5474      DAC960_V1_CommandIdentifier_T CommandIdentifier =
5475        DAC960_PD_ReadStatusCommandIdentifier(ControllerBaseAddress);
5476      DAC960_Command_T *Command = Controller->Commands[CommandIdentifier-1];
5477      Command->V1.CommandStatus =
5478        DAC960_PD_ReadStatusRegister(ControllerBaseAddress);
5479      DAC960_PD_AcknowledgeInterrupt(ControllerBaseAddress);
5480      DAC960_PD_AcknowledgeStatus(ControllerBaseAddress);
5481      DAC960_V1_ProcessCompletedCommand(Command);
5482    }
5483  /*
5484    Attempt to remove additional I/O Requests from the Controller's
5485    I/O Request Queue and queue them to the Controller.
5486  */
5487  DAC960_ProcessRequest(Controller);
5488  spin_unlock_irqrestore(&Controller->queue_lock, flags);
5489  return IRQ_HANDLED;
5490}
5491
5492
5493/*
5494  DAC960_P_InterruptHandler handles hardware interrupts from DAC960 P Series
5495  Controllers.
5496
5497  Translations of DAC960_V1_Enquiry and DAC960_V1_GetDeviceState rely
5498  on the data having been placed into DAC960_Controller_T, rather than
5499  an arbitrary buffer.
5500*/
5501
5502static irqreturn_t DAC960_P_InterruptHandler(int IRQ_Channel,
5503                                      void *DeviceIdentifier)
5504{
5505  DAC960_Controller_T *Controller = DeviceIdentifier;
5506  void __iomem *ControllerBaseAddress = Controller->BaseAddress;
5507  unsigned long flags;
5508
5509  spin_lock_irqsave(&Controller->queue_lock, flags);
5510  while (DAC960_PD_StatusAvailableP(ControllerBaseAddress))
5511    {
5512      DAC960_V1_CommandIdentifier_T CommandIdentifier =
5513        DAC960_PD_ReadStatusCommandIdentifier(ControllerBaseAddress);
5514      DAC960_Command_T *Command = Controller->Commands[CommandIdentifier-1];
5515      DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
5516      DAC960_V1_CommandOpcode_T CommandOpcode =
5517        CommandMailbox->Common.CommandOpcode;
5518      Command->V1.CommandStatus =
5519        DAC960_PD_ReadStatusRegister(ControllerBaseAddress);
5520      DAC960_PD_AcknowledgeInterrupt(ControllerBaseAddress);
5521      DAC960_PD_AcknowledgeStatus(ControllerBaseAddress);
5522      switch (CommandOpcode)
5523        {
5524        case DAC960_V1_Enquiry_Old:
5525          Command->V1.CommandMailbox.Common.CommandOpcode = DAC960_V1_Enquiry;
5526          DAC960_P_To_PD_TranslateEnquiry(Controller->V1.NewEnquiry);
5527          break;
5528        case DAC960_V1_GetDeviceState_Old:
5529          Command->V1.CommandMailbox.Common.CommandOpcode =
5530                                                DAC960_V1_GetDeviceState;
5531          DAC960_P_To_PD_TranslateDeviceState(Controller->V1.NewDeviceState);
5532          break;
5533        case DAC960_V1_Read_Old:
5534          Command->V1.CommandMailbox.Common.CommandOpcode = DAC960_V1_Read;
5535          DAC960_P_To_PD_TranslateReadWriteCommand(CommandMailbox);
5536          break;
5537        case DAC960_V1_Write_Old:
5538          Command->V1.CommandMailbox.Common.CommandOpcode = DAC960_V1_Write;
5539          DAC960_P_To_PD_TranslateReadWriteCommand(CommandMailbox);
5540          break;
5541        case DAC960_V1_ReadWithScatterGather_Old:
5542          Command->V1.CommandMailbox.Common.CommandOpcode =
5543            DAC960_V1_ReadWithScatterGather;
5544          DAC960_P_To_PD_TranslateReadWriteCommand(CommandMailbox);
5545          break;
5546        case DAC960_V1_WriteWithScatterGather_Old:
5547          Command->V1.CommandMailbox.Common.CommandOpcode =
5548            DAC960_V1_WriteWithScatterGather;
5549          DAC960_P_To_PD_TranslateReadWriteCommand(CommandMailbox);
5550          break;
5551        default:
5552          break;
5553        }
5554      DAC960_V1_ProcessCompletedCommand(Command);
5555    }
5556  /*
5557    Attempt to remove additional I/O Requests from the Controller's
5558    I/O Request Queue and queue them to the Controller.
5559  */
5560  DAC960_ProcessRequest(Controller);
5561  spin_unlock_irqrestore(&Controller->queue_lock, flags);
5562  return IRQ_HANDLED;
5563}
5564
5565
5566/*
5567  DAC960_V1_QueueMonitoringCommand queues a Monitoring Command to DAC960 V1
5568  Firmware Controllers.
5569*/
5570
5571static void DAC960_V1_QueueMonitoringCommand(DAC960_Command_T *Command)
5572{
5573  DAC960_Controller_T *Controller = Command->Controller;
5574  DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
5575  DAC960_V1_ClearCommand(Command);
5576  Command->CommandType = DAC960_MonitoringCommand;
5577  CommandMailbox->Type3.CommandOpcode = DAC960_V1_Enquiry;
5578  CommandMailbox->Type3.BusAddress = Controller->V1.NewEnquiryDMA;
5579  DAC960_QueueCommand(Command);
5580}
5581
5582
5583/*
5584  DAC960_V2_QueueMonitoringCommand queues a Monitoring Command to DAC960 V2
5585  Firmware Controllers.
5586*/
5587
5588static void DAC960_V2_QueueMonitoringCommand(DAC960_Command_T *Command)
5589{
5590  DAC960_Controller_T *Controller = Command->Controller;
5591  DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
5592  DAC960_V2_ClearCommand(Command);
5593  Command->CommandType = DAC960_MonitoringCommand;
5594  CommandMailbox->ControllerInfo.CommandOpcode = DAC960_V2_IOCTL;
5595  CommandMailbox->ControllerInfo.CommandControlBits
5596                                .DataTransferControllerToHost = true;
5597  CommandMailbox->ControllerInfo.CommandControlBits
5598                                .NoAutoRequestSense = true;
5599  CommandMailbox->ControllerInfo.DataTransferSize =
5600    sizeof(DAC960_V2_ControllerInfo_T);
5601  CommandMailbox->ControllerInfo.ControllerNumber = 0;
5602  CommandMailbox->ControllerInfo.IOCTL_Opcode = DAC960_V2_GetControllerInfo;
5603  CommandMailbox->ControllerInfo.DataTransferMemoryAddress
5604                                .ScatterGatherSegments[0]
5605                                .SegmentDataPointer =
5606    Controller->V2.NewControllerInformationDMA;
5607  CommandMailbox->ControllerInfo.DataTransferMemoryAddress
5608                                .ScatterGatherSegments[0]
5609                                .SegmentByteCount =
5610    CommandMailbox->ControllerInfo.DataTransferSize;
5611  DAC960_QueueCommand(Command);
5612}
5613
5614
5615/*
5616  DAC960_MonitoringTimerFunction is the timer function for monitoring
5617  the status of DAC960 Controllers.
5618*/
5619
5620static void DAC960_MonitoringTimerFunction(unsigned long TimerData)
5621{
5622  DAC960_Controller_T *Controller = (DAC960_Controller_T *) TimerData;
5623  DAC960_Command_T *Command;
5624  unsigned long flags;
5625
5626  if (Controller->FirmwareType == DAC960_V1_Controller)
5627    {
5628      spin_lock_irqsave(&Controller->queue_lock, flags);
5629      /*
5630        Queue a Status Monitoring Command to Controller.
5631      */
5632      Command = DAC960_AllocateCommand(Controller);
5633      if (Command != NULL)
5634        DAC960_V1_QueueMonitoringCommand(Command);
5635      else Controller->MonitoringCommandDeferred = true;
5636      spin_unlock_irqrestore(&Controller->queue_lock, flags);
5637    }
5638  else
5639    {
5640      DAC960_V2_ControllerInfo_T *ControllerInfo =
5641        &Controller->V2.ControllerInformation;
5642      unsigned int StatusChangeCounter =
5643        Controller->V2.HealthStatusBuffer->StatusChangeCounter;
5644      bool ForceMonitoringCommand = false;
5645      if (time_after(jiffies, Controller->SecondaryMonitoringTime
5646          + DAC960_SecondaryMonitoringInterval))
5647        {
5648          int LogicalDriveNumber;
5649          for (LogicalDriveNumber = 0;
5650               LogicalDriveNumber < DAC960_MaxLogicalDrives;
5651               LogicalDriveNumber++)
5652            {
5653              DAC960_V2_LogicalDeviceInfo_T *LogicalDeviceInfo =
5654                Controller->V2.LogicalDeviceInformation[LogicalDriveNumber];
5655              if (LogicalDeviceInfo == NULL) continue;
5656              if (!LogicalDeviceInfo->LogicalDeviceControl
5657                                     .LogicalDeviceInitialized)
5658                {
5659                  ForceMonitoringCommand = true;
5660                  break;
5661                }
5662            }
5663          Controller->SecondaryMonitoringTime = jiffies;
5664        }
5665      if (StatusChangeCounter == Controller->V2.StatusChangeCounter &&
5666          Controller->V2.HealthStatusBuffer->NextEventSequenceNumber
5667          == Controller->V2.NextEventSequenceNumber &&
5668          (ControllerInfo->BackgroundInitializationsActive +
5669           ControllerInfo->LogicalDeviceInitializationsActive +
5670           ControllerInfo->PhysicalDeviceInitializationsActive +
5671           ControllerInfo->ConsistencyChecksActive +
5672           ControllerInfo->RebuildsActive +
5673           ControllerInfo->OnlineExpansionsActive == 0 ||
5674           time_before(jiffies, Controller->PrimaryMonitoringTime
5675           + DAC960_MonitoringTimerInterval)) &&
5676          !ForceMonitoringCommand)
5677        {
5678          Controller->MonitoringTimer.expires =
5679            jiffies + DAC960_HealthStatusMonitoringInterval;
5680            add_timer(&Controller->MonitoringTimer);
5681          return;
5682        }
5683      Controller->V2.StatusChangeCounter = StatusChangeCounter;
5684      Controller->PrimaryMonitoringTime = jiffies;
5685
5686      spin_lock_irqsave(&Controller->queue_lock, flags);
5687      /*
5688        Queue a Status Monitoring Command to Controller.
5689      */
5690      Command = DAC960_AllocateCommand(Controller);
5691      if (Command != NULL)
5692        DAC960_V2_QueueMonitoringCommand(Command);
5693      else Controller->MonitoringCommandDeferred = true;
5694      spin_unlock_irqrestore(&Controller->queue_lock, flags);
5695      /*
5696        Wake up any processes waiting on a Health Status Buffer change.
5697      */
5698      wake_up(&Controller->HealthStatusWaitQueue);
5699    }
5700}
5701
5702/*
5703  DAC960_CheckStatusBuffer verifies that there is room to hold ByteCount
5704  additional bytes in the Combined Status Buffer and grows the buffer if
5705  necessary.  It returns true if there is enough room and false otherwise.
5706*/
5707
5708static bool DAC960_CheckStatusBuffer(DAC960_Controller_T *Controller,
5709                                        unsigned int ByteCount)
5710{
5711  unsigned char *NewStatusBuffer;
5712  if (Controller->InitialStatusLength + 1 +
5713      Controller->CurrentStatusLength + ByteCount + 1 <=
5714      Controller->CombinedStatusBufferLength)
5715    return true;
5716  if (Controller->CombinedStatusBufferLength == 0)
5717    {
5718      unsigned int NewStatusBufferLength = DAC960_InitialStatusBufferSize;
5719      while (NewStatusBufferLength < ByteCount)
5720        NewStatusBufferLength *= 2;
5721      Controller->CombinedStatusBuffer = kmalloc(NewStatusBufferLength,
5722                                                  GFP_ATOMIC);
5723      if (Controller->CombinedStatusBuffer == NULL) return false;
5724      Controller->CombinedStatusBufferLength = NewStatusBufferLength;
5725      return true;
5726    }
5727  NewStatusBuffer = kmalloc(2 * Controller->CombinedStatusBufferLength,
5728                             GFP_ATOMIC);
5729  if (NewStatusBuffer == NULL)
5730    {
5731      DAC960_Warning("Unable to expand Combined Status Buffer - Truncating\n",
5732                     Controller);
5733      return false;
5734    }
5735  memcpy(NewStatusBuffer, Controller->CombinedStatusBuffer,
5736         Controller->CombinedStatusBufferLength);
5737  kfree(Controller->CombinedStatusBuffer);
5738  Controller->CombinedStatusBuffer = NewStatusBuffer;
5739  Controller->CombinedStatusBufferLength *= 2;
5740  Controller->CurrentStatusBuffer =
5741    &NewStatusBuffer[Controller->InitialStatusLength + 1];
5742  return true;
5743}
5744
5745
5746/*
5747  DAC960_Message prints Driver Messages.
5748*/
5749
5750static void DAC960_Message(DAC960_MessageLevel_T MessageLevel,
5751                           unsigned char *Format,
5752                           DAC960_Controller_T *Controller,
5753                           ...)
5754{
5755  static unsigned char Buffer[DAC960_LineBufferSize];
5756  static bool BeginningOfLine = true;
5757  va_list Arguments;
5758  int Length = 0;
5759  va_start(Arguments, Controller);
5760  Length = vsprintf(Buffer, Format, Arguments);
5761  va_end(Arguments);
5762  if (Controller == NULL)
5763    printk("%sDAC960#%d: %s", DAC960_MessageLevelMap[MessageLevel],
5764           DAC960_ControllerCount, Buffer);
5765  else if (MessageLevel == DAC960_AnnounceLevel ||
5766           MessageLevel == DAC960_InfoLevel)
5767    {
5768      if (!Controller->ControllerInitialized)
5769        {
5770          if (DAC960_CheckStatusBuffer(Controller, Length))
5771            {
5772              strcpy(&Controller->CombinedStatusBuffer
5773                                  [Controller->InitialStatusLength],
5774                     Buffer);
5775              Controller->InitialStatusLength += Length;
5776              Controller->CurrentStatusBuffer =
5777                &Controller->CombinedStatusBuffer
5778                             [Controller->InitialStatusLength + 1];
5779            }
5780          if (MessageLevel == DAC960_AnnounceLevel)
5781            {
5782              static int AnnouncementLines = 0;
5783              if (++AnnouncementLines <= 2)
5784                printk("%sDAC960: %s", DAC960_MessageLevelMap[MessageLevel],
5785                       Buffer);
5786            }
5787          else
5788            {
5789              if (BeginningOfLine)
5790                {
5791                  if (Buffer[0] != '\n' || Length > 1)
5792                    printk("%sDAC960#%d: %s",
5793                           DAC960_MessageLevelMap[MessageLevel],
5794                           Controller->ControllerNumber, Buffer);
5795                }
5796              else printk("%s", Buffer);
5797            }
5798        }
5799      else if (DAC960_CheckStatusBuffer(Controller, Length))
5800        {
5801          strcpy(&Controller->CurrentStatusBuffer[
5802                    Controller->CurrentStatusLength], Buffer);
5803          Controller->CurrentStatusLength += Length;
5804        }
5805    }
5806  else if (MessageLevel == DAC960_ProgressLevel)
5807    {
5808      strcpy(Controller->ProgressBuffer, Buffer);
5809      Controller->ProgressBufferLength = Length;
5810      if (Controller->EphemeralProgressMessage)
5811        {
5812          if (time_after_eq(jiffies, Controller->LastProgressReportTime
5813              + DAC960_ProgressReportingInterval))
5814            {
5815              printk("%sDAC960#%d: %s", DAC960_MessageLevelMap[MessageLevel],
5816                     Controller->ControllerNumber, Buffer);
5817              Controller->LastProgressReportTime = jiffies;
5818            }
5819        }
5820      else printk("%sDAC960#%d: %s", DAC960_MessageLevelMap[MessageLevel],
5821                  Controller->ControllerNumber, Buffer);
5822    }
5823  else if (MessageLevel == DAC960_UserCriticalLevel)
5824    {
5825      strcpy(&Controller->UserStatusBuffer[Controller->UserStatusLength],
5826             Buffer);
5827      Controller->UserStatusLength += Length;
5828      if (Buffer[0] != '\n' || Length > 1)
5829        printk("%sDAC960#%d: %s", DAC960_MessageLevelMap[MessageLevel],
5830               Controller->ControllerNumber, Buffer);
5831    }
5832  else
5833    {
5834      if (BeginningOfLine)
5835        printk("%sDAC960#%d: %s", DAC960_MessageLevelMap[MessageLevel],
5836               Controller->ControllerNumber, Buffer);
5837      else printk("%s", Buffer);
5838    }
5839  BeginningOfLine = (Buffer[Length-1] == '\n');
5840}
5841
5842
5843/*
5844  DAC960_ParsePhysicalDevice parses spaces followed by a Physical Device
5845  Channel:TargetID specification from a User Command string.  It updates
5846  Channel and TargetID and returns true on success and false on failure.
5847*/
5848
5849static bool DAC960_ParsePhysicalDevice(DAC960_Controller_T *Controller,
5850                                          char *UserCommandString,
5851                                          unsigned char *Channel,
5852                                          unsigned char *TargetID)
5853{
5854  char *NewUserCommandString = UserCommandString;
5855  unsigned long XChannel, XTargetID;
5856  while (*UserCommandString == ' ') UserCommandString++;
5857  if (UserCommandString == NewUserCommandString)
5858    return false;
5859  XChannel = simple_strtoul(UserCommandString, &NewUserCommandString, 10);
5860  if (NewUserCommandString == UserCommandString ||
5861      *NewUserCommandString != ':' ||
5862      XChannel >= Controller->Channels)
5863    return false;
5864  UserCommandString = ++NewUserCommandString;
5865  XTargetID = simple_strtoul(UserCommandString, &NewUserCommandString, 10);
5866  if (NewUserCommandString == UserCommandString ||
5867      *NewUserCommandString != '\0' ||
5868      XTargetID >= Controller->Targets)
5869    return false;
5870  *Channel = XChannel;
5871  *TargetID = XTargetID;
5872  return true;
5873}
5874
5875
5876/*
5877  DAC960_ParseLogicalDrive parses spaces followed by a Logical Drive Number
5878  specification from a User Command string.  It updates LogicalDriveNumber and
5879  returns true on success and false on failure.
5880*/
5881
5882static bool DAC960_ParseLogicalDrive(DAC960_Controller_T *Controller,
5883                                        char *UserCommandString,
5884                                        unsigned char *LogicalDriveNumber)
5885{
5886  char *NewUserCommandString = UserCommandString;
5887  unsigned long XLogicalDriveNumber;
5888  while (*UserCommandString == ' ') UserCommandString++;
5889  if (UserCommandString == NewUserCommandString)
5890    return false;
5891  XLogicalDriveNumber =
5892    simple_strtoul(UserCommandString, &NewUserCommandString, 10);
5893  if (NewUserCommandString == UserCommandString ||
5894      *NewUserCommandString != '\0' ||
5895      XLogicalDriveNumber > DAC960_MaxLogicalDrives - 1)
5896    return false;
5897  *LogicalDriveNumber = XLogicalDriveNumber;
5898  return true;
5899}
5900
5901
5902/*
5903  DAC960_V1_SetDeviceState sets the Device State for a Physical Device for
5904  DAC960 V1 Firmware Controllers.
5905*/
5906
5907static void DAC960_V1_SetDeviceState(DAC960_Controller_T *Controller,
5908                                     DAC960_Command_T *Command,
5909                                     unsigned char Channel,
5910                                     unsigned char TargetID,
5911                                     DAC960_V1_PhysicalDeviceState_T
5912                                       DeviceState,
5913                                     const unsigned char *DeviceStateString)
5914{
5915  DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
5916  CommandMailbox->Type3D.CommandOpcode = DAC960_V1_StartDevice;
5917  CommandMailbox->Type3D.Channel = Channel;
5918  CommandMailbox->Type3D.TargetID = TargetID;
5919  CommandMailbox->Type3D.DeviceState = DeviceState;
5920  CommandMailbox->Type3D.Modifier = 0;
5921  DAC960_ExecuteCommand(Command);
5922  switch (Command->V1.CommandStatus)
5923    {
5924    case DAC960_V1_NormalCompletion:
5925      DAC960_UserCritical("%s of Physical Device %d:%d Succeeded\n", Controller,
5926                          DeviceStateString, Channel, TargetID);
5927      break;
5928    case DAC960_V1_UnableToStartDevice:
5929      DAC960_UserCritical("%s of Physical Device %d:%d Failed - "
5930                          "Unable to Start Device\n", Controller,
5931                          DeviceStateString, Channel, TargetID);
5932      break;
5933    case DAC960_V1_NoDeviceAtAddress:
5934      DAC960_UserCritical("%s of Physical Device %d:%d Failed - "
5935                          "No Device at Address\n", Controller,
5936                          DeviceStateString, Channel, TargetID);
5937      break;
5938    case DAC960_V1_InvalidChannelOrTargetOrModifier:
5939      DAC960_UserCritical("%s of Physical Device %d:%d Failed - "
5940                          "Invalid Channel or Target or Modifier\n",
5941                          Controller, DeviceStateString, Channel, TargetID);
5942      break;
5943    case DAC960_V1_ChannelBusy:
5944      DAC960_UserCritical("%s of Physical Device %d:%d Failed - "
5945                          "Channel Busy\n", Controller,
5946                          DeviceStateString, Channel, TargetID);
5947      break;
5948    default:
5949      DAC960_UserCritical("%s of Physical Device %d:%d Failed - "
5950                          "Unexpected Status %04X\n", Controller,
5951                          DeviceStateString, Channel, TargetID,
5952                          Command->V1.CommandStatus);
5953      break;
5954    }
5955}
5956
5957
5958/*
5959  DAC960_V1_ExecuteUserCommand executes a User Command for DAC960 V1 Firmware
5960  Controllers.
5961*/
5962
5963static bool DAC960_V1_ExecuteUserCommand(DAC960_Controller_T *Controller,
5964                                            unsigned char *UserCommand)
5965{
5966  DAC960_Command_T *Command;
5967  DAC960_V1_CommandMailbox_T *CommandMailbox;
5968  unsigned long flags;
5969  unsigned char Channel, TargetID, LogicalDriveNumber;
5970
5971  spin_lock_irqsave(&Controller->queue_lock, flags);
5972  while ((Command = DAC960_AllocateCommand(Controller)) == NULL)
5973    DAC960_WaitForCommand(Controller);
5974  spin_unlock_irqrestore(&Controller->queue_lock, flags);
5975  Controller->UserStatusLength = 0;
5976  DAC960_V1_ClearCommand(Command);
5977  Command->CommandType = DAC960_ImmediateCommand;
5978  CommandMailbox = &Command->V1.CommandMailbox;
5979  if (strcmp(UserCommand, "flush-cache") == 0)
5980    {
5981      CommandMailbox->Type3.CommandOpcode = DAC960_V1_Flush;
5982      DAC960_ExecuteCommand(Command);
5983      DAC960_UserCritical("Cache Flush Completed\n", Controller);
5984    }
5985  else if (strncmp(UserCommand, "kill", 4) == 0 &&
5986           DAC960_ParsePhysicalDevice(Controller, &UserCommand[4],
5987                                      &Channel, &TargetID))
5988    {
5989      DAC960_V1_DeviceState_T *DeviceState =
5990        &Controller->V1.DeviceState[Channel][TargetID];
5991      if (DeviceState->Present &&
5992          DeviceState->DeviceType == DAC960_V1_DiskType &&
5993          DeviceState->DeviceState != DAC960_V1_Device_Dead)
5994        DAC960_V1_SetDeviceState(Controller, Command, Channel, TargetID,
5995                                 DAC960_V1_Device_Dead, "Kill");
5996      else DAC960_UserCritical("Kill of Physical Device %d:%d Illegal\n",
5997                               Controller, Channel, TargetID);
5998    }
5999  else if (strncmp(UserCommand, "make-online", 11) == 0 &&
6000           DAC960_ParsePhysicalDevice(Controller, &UserCommand[11],
6001                                      &Channel, &TargetID))
6002    {
6003      DAC960_V1_DeviceState_T *DeviceState =
6004        &Controller->V1.DeviceState[Channel][TargetID];
6005      if (DeviceState->Present &&
6006          DeviceState->DeviceType == DAC960_V1_DiskType &&
6007          DeviceState->DeviceState == DAC960_V1_Device_Dead)
6008        DAC960_V1_SetDeviceState(Controller, Command, Channel, TargetID,
6009                                 DAC960_V1_Device_Online, "Make Online");
6010      else DAC960_UserCritical("Make Online of Physical Device %d:%d Illegal\n",
6011                               Controller, Channel, TargetID);
6012
6013    }
6014  else if (strncmp(UserCommand, "make-standby", 12) == 0 &&
6015           DAC960_ParsePhysicalDevice(Controller, &UserCommand[12],
6016                                      &Channel, &TargetID))
6017    {
6018      DAC960_V1_DeviceState_T *DeviceState =
6019        &Controller->V1.DeviceState[Channel][TargetID];
6020      if (DeviceState->Present &&
6021          DeviceState->DeviceType == DAC960_V1_DiskType &&
6022          DeviceState->DeviceState == DAC960_V1_Device_Dead)
6023        DAC960_V1_SetDeviceState(Controller, Command, Channel, TargetID,
6024                                 DAC960_V1_Device_Standby, "Make Standby");
6025      else DAC960_UserCritical("Make Standby of Physical "
6026                               "Device %d:%d Illegal\n",
6027                               Controller, Channel, TargetID);
6028    }
6029  else if (strncmp(UserCommand, "rebuild", 7) == 0 &&
6030           DAC960_ParsePhysicalDevice(Controller, &UserCommand[7],
6031                                      &Channel, &TargetID))
6032    {
6033      CommandMailbox->Type3D.CommandOpcode = DAC960_V1_RebuildAsync;
6034      CommandMailbox->Type3D.Channel = Channel;
6035      CommandMailbox->Type3D.TargetID = TargetID;
6036      DAC960_ExecuteCommand(Command);
6037      switch (Command->V1.CommandStatus)
6038        {
6039        case DAC960_V1_NormalCompletion:
6040          DAC960_UserCritical("Rebuild of Physical Device %d:%d Initiated\n",
6041                              Controller, Channel, TargetID);
6042          break;
6043        case DAC960_V1_AttemptToRebuildOnlineDrive:
6044          DAC960_UserCritical("Rebuild of Physical Device %d:%d Failed - "
6045                              "Attempt to Rebuild Online or "
6046                              "Unresponsive Drive\n",
6047                              Controller, Channel, TargetID);
6048          break;
6049        case DAC960_V1_NewDiskFailedDuringRebuild:
6050          DAC960_UserCritical("Rebuild of Physical Device %d:%d Failed - "
6051                              "New Disk Failed During Rebuild\n",
6052                              Controller, Channel, TargetID);
6053          break;
6054        case DAC960_V1_InvalidDeviceAddress:
6055          DAC960_UserCritical("Rebuild of Physical Device %d:%d Failed - "
6056                              "Invalid Device Address\n",
6057                              Controller, Channel, TargetID);
6058          break;
6059        case DAC960_V1_RebuildOrCheckAlreadyInProgress:
6060          DAC960_UserCritical("Rebuild of Physical Device %d:%d Failed - "
6061                              "Rebuild or Consistency Check Already "
6062                              "in Progress\n", Controller, Channel, TargetID);
6063          break;
6064        default:
6065          DAC960_UserCritical("Rebuild of Physical Device %d:%d Failed - "
6066                              "Unexpected Status %04X\n", Controller,
6067                              Channel, TargetID, Command->V1.CommandStatus);
6068          break;
6069        }
6070    }
6071  else if (strncmp(UserCommand, "check-consistency", 17) == 0 &&
6072           DAC960_ParseLogicalDrive(Controller, &UserCommand[17],
6073                                    &LogicalDriveNumber))
6074    {
6075      CommandMailbox->Type3C.CommandOpcode = DAC960_V1_CheckConsistencyAsync;
6076      CommandMailbox->Type3C.LogicalDriveNumber = LogicalDriveNumber;
6077      CommandMailbox->Type3C.AutoRestore = true;
6078      DAC960_ExecuteCommand(Command);
6079      switch (Command->V1.CommandStatus)
6080        {
6081        case DAC960_V1_NormalCompletion:
6082          DAC960_UserCritical("Consistency Check of Logical Drive %d "
6083                              "(/dev/rd/c%dd%d) Initiated\n",
6084                              Controller, LogicalDriveNumber,
6085                              Controller->ControllerNumber,
6086                              LogicalDriveNumber);
6087          break;
6088        case DAC960_V1_DependentDiskIsDead:
6089          DAC960_UserCritical("Consistency Check of Logical Drive %d "
6090                              "(/dev/rd/c%dd%d) Failed - "
6091                              "Dependent Physical Device is DEAD\n",
6092                              Controller, LogicalDriveNumber,
6093                              Controller->ControllerNumber,
6094                              LogicalDriveNumber);
6095          break;
6096        case DAC960_V1_InvalidOrNonredundantLogicalDrive:
6097          DAC960_UserCritical("Consistency Check of Logical Drive %d "
6098                              "(/dev/rd/c%dd%d) Failed - "
6099                              "Invalid or Nonredundant Logical Drive\n",
6100                              Controller, LogicalDriveNumber,
6101                              Controller->ControllerNumber,
6102                              LogicalDriveNumber);
6103          break;
6104        case DAC960_V1_RebuildOrCheckAlreadyInProgress:
6105          DAC960_UserCritical("Consistency Check of Logical Drive %d "
6106                              "(/dev/rd/c%dd%d) Failed - Rebuild or "
6107                              "Consistency Check Already in Progress\n",
6108                              Controller, LogicalDriveNumber,
6109                              Controller->ControllerNumber,
6110                              LogicalDriveNumber);
6111          break;
6112        default:
6113          DAC960_UserCritical("Consistency Check of Logical Drive %d "
6114                              "(/dev/rd/c%dd%d) Failed - "
6115                              "Unexpected Status %04X\n",
6116                              Controller, LogicalDriveNumber,
6117                              Controller->ControllerNumber,
6118                              LogicalDriveNumber, Command->V1.CommandStatus);
6119          break;
6120        }
6121    }
6122  else if (strcmp(UserCommand, "cancel-rebuild") == 0 ||
6123           strcmp(UserCommand, "cancel-consistency-check") == 0)
6124    {
6125      /*
6126        the OldRebuildRateConstant is never actually used
6127        once its value is retrieved from the controller.
6128       */
6129      unsigned char *OldRebuildRateConstant;
6130      dma_addr_t OldRebuildRateConstantDMA;
6131
6132      OldRebuildRateConstant = pci_alloc_consistent( Controller->PCIDevice,
6133                sizeof(char), &OldRebuildRateConstantDMA);
6134      if (OldRebuildRateConstant == NULL) {
6135         DAC960_UserCritical("Cancellation of Rebuild or "
6136                             "Consistency Check Failed - "
6137                             "Out of Memory",
6138                             Controller);
6139         goto failure;
6140      }
6141      CommandMailbox->Type3R.CommandOpcode = DAC960_V1_RebuildControl;
6142      CommandMailbox->Type3R.RebuildRateConstant = 0xFF;
6143      CommandMailbox->Type3R.BusAddress = OldRebuildRateConstantDMA;
6144      DAC960_ExecuteCommand(Command);
6145      switch (Command->V1.CommandStatus)
6146        {
6147        case DAC960_V1_NormalCompletion:
6148          DAC960_UserCritical("Rebuild or Consistency Check Cancelled\n",
6149                              Controller);
6150          break;
6151        default:
6152          DAC960_UserCritical("Cancellation of Rebuild or "
6153                              "Consistency Check Failed - "
6154                              "Unexpected Status %04X\n",
6155                              Controller, Command->V1.CommandStatus);
6156          break;
6157        }
6158failure:
6159        pci_free_consistent(Controller->PCIDevice, sizeof(char),
6160                OldRebuildRateConstant, OldRebuildRateConstantDMA);
6161    }
6162  else DAC960_UserCritical("Illegal User Command: '%s'\n",
6163                           Controller, UserCommand);
6164
6165  spin_lock_irqsave(&Controller->queue_lock, flags);
6166  DAC960_DeallocateCommand(Command);
6167  spin_unlock_irqrestore(&Controller->queue_lock, flags);
6168  return true;
6169}
6170
6171
6172/*
6173  DAC960_V2_TranslatePhysicalDevice translates a Physical Device Channel and
6174  TargetID into a Logical Device.  It returns true on success and false
6175  on failure.
6176*/
6177
6178static bool DAC960_V2_TranslatePhysicalDevice(DAC960_Command_T *Command,
6179                                                 unsigned char Channel,
6180                                                 unsigned char TargetID,
6181                                                 unsigned short
6182                                                   *LogicalDeviceNumber)
6183{
6184  DAC960_V2_CommandMailbox_T SavedCommandMailbox, *CommandMailbox;
6185  DAC960_Controller_T *Controller =  Command->Controller;
6186
6187  CommandMailbox = &Command->V2.CommandMailbox;
6188  memcpy(&SavedCommandMailbox, CommandMailbox,
6189         sizeof(DAC960_V2_CommandMailbox_T));
6190
6191  CommandMailbox->PhysicalDeviceInfo.CommandOpcode = DAC960_V2_IOCTL;
6192  CommandMailbox->PhysicalDeviceInfo.CommandControlBits
6193                                    .DataTransferControllerToHost = true;
6194  CommandMailbox->PhysicalDeviceInfo.CommandControlBits
6195                                    .NoAutoRequestSense = true;
6196  CommandMailbox->PhysicalDeviceInfo.DataTransferSize =
6197    sizeof(DAC960_V2_PhysicalToLogicalDevice_T);
6198  CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.TargetID = TargetID;
6199  CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.Channel = Channel;
6200  CommandMailbox->PhysicalDeviceInfo.IOCTL_Opcode =
6201    DAC960_V2_TranslatePhysicalToLogicalDevice;
6202  CommandMailbox->Common.DataTransferMemoryAddress
6203                        .ScatterGatherSegments[0]
6204                        .SegmentDataPointer =
6205                Controller->V2.PhysicalToLogicalDeviceDMA;
6206  CommandMailbox->Common.DataTransferMemoryAddress
6207                        .ScatterGatherSegments[0]
6208                        .SegmentByteCount =
6209                CommandMailbox->Common.DataTransferSize;
6210
6211  DAC960_ExecuteCommand(Command);
6212  *LogicalDeviceNumber = Controller->V2.PhysicalToLogicalDevice->LogicalDeviceNumber;
6213
6214  memcpy(CommandMailbox, &SavedCommandMailbox,
6215         sizeof(DAC960_V2_CommandMailbox_T));
6216  return (Command->V2.CommandStatus == DAC960_V2_NormalCompletion);
6217}
6218
6219
6220/*
6221  DAC960_V2_ExecuteUserCommand executes a User Command for DAC960 V2 Firmware
6222  Controllers.
6223*/
6224
6225static bool DAC960_V2_ExecuteUserCommand(DAC960_Controller_T *Controller,
6226                                            unsigned char *UserCommand)
6227{
6228  DAC960_Command_T *Command;
6229  DAC960_V2_CommandMailbox_T *CommandMailbox;
6230  unsigned long flags;
6231  unsigned char Channel, TargetID, LogicalDriveNumber;
6232  unsigned short LogicalDeviceNumber;
6233
6234  spin_lock_irqsave(&Controller->queue_lock, flags);
6235  while ((Command = DAC960_AllocateCommand(Controller)) == NULL)
6236    DAC960_WaitForCommand(Controller);
6237  spin_unlock_irqrestore(&Controller->queue_lock, flags);
6238  Controller->UserStatusLength = 0;
6239  DAC960_V2_ClearCommand(Command);
6240  Command->CommandType = DAC960_ImmediateCommand;
6241  CommandMailbox = &Command->V2.CommandMailbox;
6242  CommandMailbox->Common.CommandOpcode = DAC960_V2_IOCTL;
6243  CommandMailbox->Common.CommandControlBits.DataTransferControllerToHost = true;
6244  CommandMailbox->Common.CommandControlBits.NoAutoRequestSense = true;
6245  if (strcmp(UserCommand, "flush-cache") == 0)
6246    {
6247      CommandMailbox->DeviceOperation.IOCTL_Opcode = DAC960_V2_PauseDevice;
6248      CommandMailbox->DeviceOperation.OperationDevice =
6249        DAC960_V2_RAID_Controller;
6250      DAC960_ExecuteCommand(Command);
6251      DAC960_UserCritical("Cache Flush Completed\n", Controller);
6252    }
6253  else if (strncmp(UserCommand, "kill", 4) == 0 &&
6254           DAC960_ParsePhysicalDevice(Controller, &UserCommand[4],
6255                                      &Channel, &TargetID) &&
6256           DAC960_V2_TranslatePhysicalDevice(Command, Channel, TargetID,
6257                                             &LogicalDeviceNumber))
6258    {
6259      CommandMailbox->SetDeviceState.LogicalDevice.LogicalDeviceNumber =
6260        LogicalDeviceNumber;
6261      CommandMailbox->SetDeviceState.IOCTL_Opcode =
6262        DAC960_V2_SetDeviceState;
6263      CommandMailbox->SetDeviceState.DeviceState.PhysicalDeviceState =
6264        DAC960_V2_Device_Dead;
6265      DAC960_ExecuteCommand(Command);
6266      DAC960_UserCritical("Kill of Physical Device %d:%d %s\n",
6267                          Controller, Channel, TargetID,
6268                          (Command->V2.CommandStatus
6269                           == DAC960_V2_NormalCompletion
6270                           ? "Succeeded" : "Failed"));
6271    }
6272  else if (strncmp(UserCommand, "make-online", 11) == 0 &&
6273           DAC960_ParsePhysicalDevice(Controller, &UserCommand[11],
6274                                      &Channel, &TargetID) &&
6275           DAC960_V2_TranslatePhysicalDevice(Command, Channel, TargetID,
6276                                             &LogicalDeviceNumber))
6277    {
6278      CommandMailbox->SetDeviceState.LogicalDevice.LogicalDeviceNumber =
6279        LogicalDeviceNumber;
6280      CommandMailbox->SetDeviceState.IOCTL_Opcode =
6281        DAC960_V2_SetDeviceState;
6282      CommandMailbox->SetDeviceState.DeviceState.PhysicalDeviceState =
6283        DAC960_V2_Device_Online;
6284      DAC960_ExecuteCommand(Command);
6285      DAC960_UserCritical("Make Online of Physical Device %d:%d %s\n",
6286                          Controller, Channel, TargetID,
6287                          (Command->V2.CommandStatus
6288                           == DAC960_V2_NormalCompletion
6289                           ? "Succeeded" : "Failed"));
6290    }
6291  else if (strncmp(UserCommand, "make-standby", 12) == 0 &&
6292           DAC960_ParsePhysicalDevice(Controller, &UserCommand[12],
6293                                      &Channel, &TargetID) &&
6294           DAC960_V2_TranslatePhysicalDevice(Command, Channel, TargetID,
6295                                             &LogicalDeviceNumber))
6296    {
6297      CommandMailbox->SetDeviceState.LogicalDevice.LogicalDeviceNumber =
6298        LogicalDeviceNumber;
6299      CommandMailbox->SetDeviceState.IOCTL_Opcode =
6300        DAC960_V2_SetDeviceState;
6301      CommandMailbox->SetDeviceState.DeviceState.PhysicalDeviceState =
6302        DAC960_V2_Device_Standby;
6303      DAC960_ExecuteCommand(Command);
6304      DAC960_UserCritical("Make Standby of Physical Device %d:%d %s\n",
6305                          Controller, Channel, TargetID,
6306                          (Command->V2.CommandStatus
6307                           == DAC960_V2_NormalCompletion
6308                           ? "Succeeded" : "Failed"));
6309    }
6310  else if (strncmp(UserCommand, "rebuild", 7) == 0 &&
6311           DAC960_ParsePhysicalDevice(Controller, &UserCommand[7],
6312                                      &Channel, &TargetID) &&
6313           DAC960_V2_TranslatePhysicalDevice(Command, Channel, TargetID,
6314                                             &LogicalDeviceNumber))
6315    {
6316      CommandMailbox->LogicalDeviceInfo.LogicalDevice.LogicalDeviceNumber =
6317        LogicalDeviceNumber;
6318      CommandMailbox->LogicalDeviceInfo.IOCTL_Opcode =
6319        DAC960_V2_RebuildDeviceStart;
6320      DAC960_ExecuteCommand(Command);
6321      DAC960_UserCritical("Rebuild of Physical Device %d:%d %s\n",
6322                          Controller, Channel, TargetID,
6323                          (Command->V2.CommandStatus
6324                           == DAC960_V2_NormalCompletion
6325                           ? "Initiated" : "Not Initiated"));
6326    }
6327  else if (strncmp(UserCommand, "cancel-rebuild", 14) == 0 &&
6328           DAC960_ParsePhysicalDevice(Controller, &UserCommand[14],
6329                                      &Channel, &TargetID) &&
6330           DAC960_V2_TranslatePhysicalDevice(Command, Channel, TargetID,
6331                                             &LogicalDeviceNumber))
6332    {
6333      CommandMailbox->LogicalDeviceInfo.LogicalDevice.LogicalDeviceNumber =
6334        LogicalDeviceNumber;
6335      CommandMailbox->LogicalDeviceInfo.IOCTL_Opcode =
6336        DAC960_V2_RebuildDeviceStop;
6337      DAC960_ExecuteCommand(Command);
6338      DAC960_UserCritical("Rebuild of Physical Device %d:%d %s\n",
6339                          Controller, Channel, TargetID,
6340                          (Command->V2.CommandStatus
6341                           == DAC960_V2_NormalCompletion
6342                           ? "Cancelled" : "Not Cancelled"));
6343    }
6344  else if (strncmp(UserCommand, "check-consistency", 17) == 0 &&
6345           DAC960_ParseLogicalDrive(Controller, &UserCommand[17],
6346                                    &LogicalDriveNumber))
6347    {
6348      CommandMailbox->ConsistencyCheck.LogicalDevice.LogicalDeviceNumber =
6349        LogicalDriveNumber;
6350      CommandMailbox->ConsistencyCheck.IOCTL_Opcode =
6351        DAC960_V2_ConsistencyCheckStart;
6352      CommandMailbox->ConsistencyCheck.RestoreConsistency = true;
6353      CommandMailbox->ConsistencyCheck.InitializedAreaOnly = false;
6354      DAC960_ExecuteCommand(Command);
6355      DAC960_UserCritical("Consistency Check of Logical Drive %d "
6356                          "(/dev/rd/c%dd%d) %s\n",
6357                          Controller, LogicalDriveNumber,
6358                          Controller->ControllerNumber,
6359                          LogicalDriveNumber,
6360                          (Command->V2.CommandStatus
6361                           == DAC960_V2_NormalCompletion
6362                           ? "Initiated" : "Not Initiated"));
6363    }
6364  else if (strncmp(UserCommand, "cancel-consistency-check", 24) == 0 &&
6365           DAC960_ParseLogicalDrive(Controller, &UserCommand[24],
6366                                    &LogicalDriveNumber))
6367    {
6368      CommandMailbox->ConsistencyCheck.LogicalDevice.LogicalDeviceNumber =
6369        LogicalDriveNumber;
6370      CommandMailbox->ConsistencyCheck.IOCTL_Opcode =
6371        DAC960_V2_ConsistencyCheckStop;
6372      DAC960_ExecuteCommand(Command);
6373      DAC960_UserCritical("Consistency Check of Logical Drive %d "
6374                          "(/dev/rd/c%dd%d) %s\n",
6375                          Controller, LogicalDriveNumber,
6376                          Controller->ControllerNumber,
6377                          LogicalDriveNumber,
6378                          (Command->V2.CommandStatus
6379                           == DAC960_V2_NormalCompletion
6380                           ? "Cancelled" : "Not Cancelled"));
6381    }
6382  else if (strcmp(UserCommand, "perform-discovery") == 0)
6383    {
6384      CommandMailbox->Common.IOCTL_Opcode = DAC960_V2_StartDiscovery;
6385      DAC960_ExecuteCommand(Command);
6386      DAC960_UserCritical("Discovery %s\n", Controller,
6387                          (Command->V2.CommandStatus
6388                           == DAC960_V2_NormalCompletion
6389                           ? "Initiated" : "Not Initiated"));
6390      if (Command->V2.CommandStatus == DAC960_V2_NormalCompletion)
6391        {
6392          CommandMailbox->ControllerInfo.CommandOpcode = DAC960_V2_IOCTL;
6393          CommandMailbox->ControllerInfo.CommandControlBits
6394                                        .DataTransferControllerToHost = true;
6395          CommandMailbox->ControllerInfo.CommandControlBits
6396                                        .NoAutoRequestSense = true;
6397          CommandMailbox->ControllerInfo.DataTransferSize =
6398            sizeof(DAC960_V2_ControllerInfo_T);
6399          CommandMailbox->ControllerInfo.ControllerNumber = 0;
6400          CommandMailbox->ControllerInfo.IOCTL_Opcode =
6401            DAC960_V2_GetControllerInfo;
6402          /*
6403           * How does this NOT race with the queued Monitoring
6404           * usage of this structure?
6405           */
6406          CommandMailbox->ControllerInfo.DataTransferMemoryAddress
6407                                        .ScatterGatherSegments[0]
6408                                        .SegmentDataPointer =
6409            Controller->V2.NewControllerInformationDMA;
6410          CommandMailbox->ControllerInfo.DataTransferMemoryAddress
6411                                        .ScatterGatherSegments[0]
6412                                        .SegmentByteCount =
6413            CommandMailbox->ControllerInfo.DataTransferSize;
6414          DAC960_ExecuteCommand(Command);
6415          while (Controller->V2.NewControllerInformation->PhysicalScanActive)
6416            {
6417              DAC960_ExecuteCommand(Command);
6418              sleep_on_timeout(&Controller->CommandWaitQueue, HZ);
6419            }
6420          DAC960_UserCritical("Discovery Completed\n", Controller);
6421        }
6422    }
6423  else if (strcmp(UserCommand, "suppress-enclosure-messages") == 0)
6424    Controller->SuppressEnclosureMessages = true;
6425  else DAC960_UserCritical("Illegal User Command: '%s'\n",
6426                           Controller, UserCommand);
6427
6428  spin_lock_irqsave(&Controller->queue_lock, flags);
6429  DAC960_DeallocateCommand(Command);
6430  spin_unlock_irqrestore(&Controller->queue_lock, flags);
6431  return true;
6432}
6433
6434static int dac960_proc_show(struct seq_file *m, void *v)
6435{
6436  unsigned char *StatusMessage = "OK\n";
6437  int ControllerNumber;
6438  for (ControllerNumber = 0;
6439       ControllerNumber < DAC960_ControllerCount;
6440       ControllerNumber++)
6441    {
6442      DAC960_Controller_T *Controller = DAC960_Controllers[ControllerNumber];
6443      if (Controller == NULL) continue;
6444      if (Controller->MonitoringAlertMode)
6445        {
6446          StatusMessage = "ALERT\n";
6447          break;
6448        }
6449    }
6450  seq_puts(m, StatusMessage);
6451  return 0;
6452}
6453
6454static int dac960_proc_open(struct inode *inode, struct file *file)
6455{
6456        return single_open(file, dac960_proc_show, NULL);
6457}
6458
6459static const struct file_operations dac960_proc_fops = {
6460        .owner          = THIS_MODULE,
6461        .open           = dac960_proc_open,
6462        .read           = seq_read,
6463        .llseek         = seq_lseek,
6464        .release        = single_release,
6465};
6466
6467static int dac960_initial_status_proc_show(struct seq_file *m, void *v)
6468{
6469        DAC960_Controller_T *Controller = (DAC960_Controller_T *)m->private;
6470        seq_printf(m, "%.*s", Controller->InitialStatusLength, Controller->CombinedStatusBuffer);
6471        return 0;
6472}
6473
6474static int dac960_initial_status_proc_open(struct inode *inode, struct file *file)
6475{
6476        return single_open(file, dac960_initial_status_proc_show, PDE_DATA(inode));
6477}
6478
6479static const struct file_operations dac960_initial_status_proc_fops = {
6480        .owner          = THIS_MODULE,
6481        .open           = dac960_initial_status_proc_open,
6482        .read           = seq_read,
6483        .llseek         = seq_lseek,
6484        .release        = single_release,
6485};
6486
6487static int dac960_current_status_proc_show(struct seq_file *m, void *v)
6488{
6489  DAC960_Controller_T *Controller = (DAC960_Controller_T *) m->private;
6490  unsigned char *StatusMessage =
6491    "No Rebuild or Consistency Check in Progress\n";
6492  int ProgressMessageLength = strlen(StatusMessage);
6493  if (jiffies != Controller->LastCurrentStatusTime)
6494    {
6495      Controller->CurrentStatusLength = 0;
6496      DAC960_AnnounceDriver(Controller);
6497      DAC960_ReportControllerConfiguration(Controller);
6498      DAC960_ReportDeviceConfiguration(Controller);
6499      if (Controller->ProgressBufferLength > 0)
6500        ProgressMessageLength = Controller->ProgressBufferLength;
6501      if (DAC960_CheckStatusBuffer(Controller, 2 + ProgressMessageLength))
6502        {
6503          unsigned char *CurrentStatusBuffer = Controller->CurrentStatusBuffer;
6504          CurrentStatusBuffer[Controller->CurrentStatusLength++] = ' ';
6505          CurrentStatusBuffer[Controller->CurrentStatusLength++] = ' ';
6506          if (Controller->ProgressBufferLength > 0)
6507            strcpy(&CurrentStatusBuffer[Controller->CurrentStatusLength],
6508                   Controller->ProgressBuffer);
6509          else
6510            strcpy(&CurrentStatusBuffer[Controller->CurrentStatusLength],
6511                   StatusMessage);
6512          Controller->CurrentStatusLength += ProgressMessageLength;
6513        }
6514      Controller->LastCurrentStatusTime = jiffies;
6515    }
6516        seq_printf(m, "%.*s", Controller->CurrentStatusLength, Controller->CurrentStatusBuffer);
6517        return 0;
6518}
6519
6520static int dac960_current_status_proc_open(struct inode *inode, struct file *file)
6521{
6522        return single_open(file, dac960_current_status_proc_show, PDE_DATA(inode));
6523}
6524
6525static const struct file_operations dac960_current_status_proc_fops = {
6526        .owner          = THIS_MODULE,
6527        .open           = dac960_current_status_proc_open,
6528        .read           = seq_read,
6529        .llseek         = seq_lseek,
6530        .release        = single_release,
6531};
6532
6533static int dac960_user_command_proc_show(struct seq_file *m, void *v)
6534{
6535        DAC960_Controller_T *Controller = (DAC960_Controller_T *)m->private;
6536
6537        seq_printf(m, "%.*s", Controller->UserStatusLength, Controller->UserStatusBuffer);
6538        return 0;
6539}
6540
6541static int dac960_user_command_proc_open(struct inode *inode, struct file *file)
6542{
6543        return single_open(file, dac960_user_command_proc_show, PDE_DATA(inode));
6544}
6545
6546static ssize_t dac960_user_command_proc_write(struct file *file,
6547                                       const char __user *Buffer,
6548                                       size_t Count, loff_t *pos)
6549{
6550  DAC960_Controller_T *Controller = PDE_DATA(file_inode(file));
6551  unsigned char CommandBuffer[80];
6552  int Length;
6553  if (Count > sizeof(CommandBuffer)-1) return -EINVAL;
6554  if (copy_from_user(CommandBuffer, Buffer, Count)) return -EFAULT;
6555  CommandBuffer[Count] = '\0';
6556  Length = strlen(CommandBuffer);
6557  if (Length > 0 && CommandBuffer[Length-1] == '\n')
6558    CommandBuffer[--Length] = '\0';
6559  if (Controller->FirmwareType == DAC960_V1_Controller)
6560    return (DAC960_V1_ExecuteUserCommand(Controller, CommandBuffer)
6561            ? Count : -EBUSY);
6562  else
6563    return (DAC960_V2_ExecuteUserCommand(Controller, CommandBuffer)
6564            ? Count : -EBUSY);
6565}
6566
6567static const struct file_operations dac960_user_command_proc_fops = {
6568        .owner          = THIS_MODULE,
6569        .open           = dac960_user_command_proc_open,
6570        .read           = seq_read,
6571        .llseek         = seq_lseek,
6572        .release        = single_release,
6573        .write          = dac960_user_command_proc_write,
6574};
6575
6576/*
6577  DAC960_CreateProcEntries creates the /proc/rd/... entries for the
6578  DAC960 Driver.
6579*/
6580
6581static void DAC960_CreateProcEntries(DAC960_Controller_T *Controller)
6582{
6583        struct proc_dir_entry *ControllerProcEntry;
6584
6585        if (DAC960_ProcDirectoryEntry == NULL) {
6586                DAC960_ProcDirectoryEntry = proc_mkdir("rd", NULL);
6587                proc_create("status", 0, DAC960_ProcDirectoryEntry,
6588                            &dac960_proc_fops);
6589        }
6590
6591        sprintf(Controller->ControllerName, "c%d", Controller->ControllerNumber);
6592        ControllerProcEntry = proc_mkdir(Controller->ControllerName,
6593                                         DAC960_ProcDirectoryEntry);
6594        proc_create_data("initial_status", 0, ControllerProcEntry, &dac960_initial_status_proc_fops, Controller);
6595        proc_create_data("current_status", 0, ControllerProcEntry, &dac960_current_status_proc_fops, Controller);
6596        proc_create_data("user_command", S_IWUSR | S_IRUSR, ControllerProcEntry, &dac960_user_command_proc_fops, Controller);
6597        Controller->ControllerProcEntry = ControllerProcEntry;
6598}
6599
6600
6601/*
6602  DAC960_DestroyProcEntries destroys the /proc/rd/... entries for the
6603  DAC960 Driver.
6604*/
6605
6606static void DAC960_DestroyProcEntries(DAC960_Controller_T *Controller)
6607{
6608      if (Controller->ControllerProcEntry == NULL)
6609              return;
6610      remove_proc_entry("initial_status", Controller->ControllerProcEntry);
6611      remove_proc_entry("current_status", Controller->ControllerProcEntry);
6612      remove_proc_entry("user_command", Controller->ControllerProcEntry);
6613      remove_proc_entry(Controller->ControllerName, DAC960_ProcDirectoryEntry);
6614      Controller->ControllerProcEntry = NULL;
6615}
6616
6617#ifdef DAC960_GAM_MINOR
6618
6619/*
6620 * DAC960_gam_ioctl is the ioctl function for performing RAID operations.
6621*/
6622
6623static long DAC960_gam_ioctl(struct file *file, unsigned int Request,
6624                                                unsigned long Argument)
6625{
6626  long ErrorCode = 0;
6627  if (!capable(CAP_SYS_ADMIN)) return -EACCES;
6628
6629  mutex_lock(&DAC960_mutex);
6630  switch (Request)
6631    {
6632    case DAC960_IOCTL_GET_CONTROLLER_COUNT:
6633      ErrorCode = DAC960_ControllerCount;
6634      break;
6635    case DAC960_IOCTL_GET_CONTROLLER_INFO:
6636      {
6637        DAC960_ControllerInfo_T __user *UserSpaceControllerInfo =
6638          (DAC960_ControllerInfo_T __user *) Argument;
6639        DAC960_ControllerInfo_T ControllerInfo;
6640        DAC960_Controller_T *Controller;
6641        int ControllerNumber;
6642        if (UserSpaceControllerInfo == NULL)
6643                ErrorCode = -EINVAL;
6644        else ErrorCode = get_user(ControllerNumber,
6645                             &UserSpaceControllerInfo->ControllerNumber);
6646        if (ErrorCode != 0)
6647                break;
6648        ErrorCode = -ENXIO;
6649        if (ControllerNumber < 0 ||
6650            ControllerNumber > DAC960_ControllerCount - 1) {
6651          break;
6652        }
6653        Controller = DAC960_Controllers[ControllerNumber];
6654        if (Controller == NULL)
6655                break;
6656        memset(&ControllerInfo, 0, sizeof(DAC960_ControllerInfo_T));
6657        ControllerInfo.ControllerNumber = ControllerNumber;
6658        ControllerInfo.FirmwareType = Controller->FirmwareType;
6659        ControllerInfo.Channels = Controller->Channels;
6660        ControllerInfo.Targets = Controller->Targets;
6661        ControllerInfo.PCI_Bus = Controller->Bus;
6662        ControllerInfo.PCI_Device = Controller->Device;
6663        ControllerInfo.PCI_Function = Controller->Function;
6664        ControllerInfo.IRQ_Channel = Controller->IRQ_Channel;
6665        ControllerInfo.PCI_Address = Controller->PCI_Address;
6666        strcpy(ControllerInfo.ModelName, Controller->ModelName);
6667        strcpy(ControllerInfo.FirmwareVersion, Controller->FirmwareVersion);
6668        ErrorCode = (copy_to_user(UserSpaceControllerInfo, &ControllerInfo,
6669                             sizeof(DAC960_ControllerInfo_T)) ? -EFAULT : 0);
6670        break;
6671      }
6672    case DAC960_IOCTL_V1_EXECUTE_COMMAND:
6673      {
6674        DAC960_V1_UserCommand_T __user *UserSpaceUserCommand =
6675          (DAC960_V1_UserCommand_T __user *) Argument;
6676        DAC960_V1_UserCommand_T UserCommand;
6677        DAC960_Controller_T *Controller;
6678        DAC960_Command_T *Command = NULL;
6679        DAC960_V1_CommandOpcode_T CommandOpcode;
6680        DAC960_V1_CommandStatus_T CommandStatus;
6681        DAC960_V1_DCDB_T DCDB;
6682        DAC960_V1_DCDB_T *DCDB_IOBUF = NULL;
6683        dma_addr_t      DCDB_IOBUFDMA;
6684        unsigned long flags;
6685        int ControllerNumber, DataTransferLength;
6686        unsigned char *DataTransferBuffer = NULL;
6687        dma_addr_t DataTransferBufferDMA;
6688        if (UserSpaceUserCommand == NULL) {
6689                ErrorCode = -EINVAL;
6690                break;
6691        }
6692        if (copy_from_user(&UserCommand, UserSpaceUserCommand,
6693                                   sizeof(DAC960_V1_UserCommand_T))) {
6694                ErrorCode = -EFAULT;
6695                break;
6696        }
6697        ControllerNumber = UserCommand.ControllerNumber;
6698        ErrorCode = -ENXIO;
6699        if (ControllerNumber < 0 ||
6700            ControllerNumber > DAC960_ControllerCount - 1)
6701                break;
6702        Controller = DAC960_Controllers[ControllerNumber];
6703        if (Controller == NULL)
6704                break;
6705        ErrorCode = -EINVAL;
6706        if (Controller->FirmwareType != DAC960_V1_Controller)
6707                break;
6708        CommandOpcode = UserCommand.CommandMailbox.Common.CommandOpcode;
6709        DataTransferLength = UserCommand.DataTransferLength;
6710        if (CommandOpcode & 0x80)
6711                break;
6712        if (CommandOpcode == DAC960_V1_DCDB)
6713          {
6714            if (copy_from_user(&DCDB, UserCommand.DCDB,
6715                               sizeof(DAC960_V1_DCDB_T))) {
6716                ErrorCode = -EFAULT;
6717                break;
6718            }
6719            if (DCDB.Channel >= DAC960_V1_MaxChannels)
6720                        break;
6721            if (!((DataTransferLength == 0 &&
6722                   DCDB.Direction
6723                   == DAC960_V1_DCDB_NoDataTransfer) ||
6724                  (DataTransferLength > 0 &&
6725                   DCDB.Direction
6726                   == DAC960_V1_DCDB_DataTransferDeviceToSystem) ||
6727                  (DataTransferLength < 0 &&
6728                   DCDB.Direction
6729                   == DAC960_V1_DCDB_DataTransferSystemToDevice)))
6730                        break;
6731            if (((DCDB.TransferLengthHigh4 << 16) | DCDB.TransferLength)
6732                != abs(DataTransferLength))
6733                        break;
6734            DCDB_IOBUF = pci_alloc_consistent(Controller->PCIDevice,
6735                        sizeof(DAC960_V1_DCDB_T), &DCDB_IOBUFDMA);
6736            if (DCDB_IOBUF == NULL) {
6737                        ErrorCode = -ENOMEM;
6738                        break;
6739                }
6740          }
6741        ErrorCode = -ENOMEM;
6742        if (DataTransferLength > 0)
6743          {
6744            DataTransferBuffer = pci_alloc_consistent(Controller->PCIDevice,
6745                                DataTransferLength, &DataTransferBufferDMA);
6746            if (DataTransferBuffer == NULL)
6747                break;
6748            memset(DataTransferBuffer, 0, DataTransferLength);
6749          }
6750        else if (DataTransferLength < 0)
6751          {
6752            DataTransferBuffer = pci_alloc_consistent(Controller->PCIDevice,
6753                                -DataTransferLength, &DataTransferBufferDMA);
6754            if (DataTransferBuffer == NULL)
6755                break;
6756            if (copy_from_user(DataTransferBuffer,
6757                               UserCommand.DataTransferBuffer,
6758                               -DataTransferLength)) {
6759                ErrorCode = -EFAULT;
6760                break;
6761            }
6762          }
6763        if (CommandOpcode == DAC960_V1_DCDB)
6764          {
6765            spin_lock_irqsave(&Controller->queue_lock, flags);
6766            while ((Command = DAC960_AllocateCommand(Controller)) == NULL)
6767              DAC960_WaitForCommand(Controller);
6768            while (Controller->V1.DirectCommandActive[DCDB.Channel]
6769                                                     [DCDB.TargetID])
6770              {
6771                spin_unlock_irq(&Controller->queue_lock);
6772                __wait_event(Controller->CommandWaitQueue,
6773                             !Controller->V1.DirectCommandActive
6774                                             [DCDB.Channel][DCDB.TargetID]);
6775                spin_lock_irq(&Controller->queue_lock);
6776              }
6777            Controller->V1.DirectCommandActive[DCDB.Channel]
6778                                              [DCDB.TargetID] = true;
6779            spin_unlock_irqrestore(&Controller->queue_lock, flags);
6780            DAC960_V1_ClearCommand(Command);
6781            Command->CommandType = DAC960_ImmediateCommand;
6782            memcpy(&Command->V1.CommandMailbox, &UserCommand.CommandMailbox,
6783                   sizeof(DAC960_V1_CommandMailbox_T));
6784            Command->V1.CommandMailbox.Type3.BusAddress = DCDB_IOBUFDMA;
6785            DCDB.BusAddress = DataTransferBufferDMA;
6786            memcpy(DCDB_IOBUF, &DCDB, sizeof(DAC960_V1_DCDB_T));
6787          }
6788        else
6789          {
6790            spin_lock_irqsave(&Controller->queue_lock, flags);
6791            while ((Command = DAC960_AllocateCommand(Controller)) == NULL)
6792              DAC960_WaitForCommand(Controller);
6793            spin_unlock_irqrestore(&Controller->queue_lock, flags);
6794            DAC960_V1_ClearCommand(Command);
6795            Command->CommandType = DAC960_ImmediateCommand;
6796            memcpy(&Command->V1.CommandMailbox, &UserCommand.CommandMailbox,
6797                   sizeof(DAC960_V1_CommandMailbox_T));
6798            if (DataTransferBuffer != NULL)
6799              Command->V1.CommandMailbox.Type3.BusAddress =
6800                DataTransferBufferDMA;
6801          }
6802        DAC960_ExecuteCommand(Command);
6803        CommandStatus = Command->V1.CommandStatus;
6804        spin_lock_irqsave(&Controller->queue_lock, flags);
6805        DAC960_DeallocateCommand(Command);
6806        spin_unlock_irqrestore(&Controller->queue_lock, flags);
6807        if (DataTransferLength > 0)
6808          {
6809            if (copy_to_user(UserCommand.DataTransferBuffer,
6810                             DataTransferBuffer, DataTransferLength)) {
6811                ErrorCode = -EFAULT;
6812                goto Failure1;
6813            }
6814          }
6815        if (CommandOpcode == DAC960_V1_DCDB)
6816          {
6817            /*
6818              I don't believe Target or Channel in the DCDB_IOBUF
6819              should be any different from the contents of DCDB.
6820             */
6821            Controller->V1.DirectCommandActive[DCDB.Channel]
6822                                              [DCDB.TargetID] = false;
6823            if (copy_to_user(UserCommand.DCDB, DCDB_IOBUF,
6824                             sizeof(DAC960_V1_DCDB_T))) {
6825                ErrorCode = -EFAULT;
6826                goto Failure1;
6827            }
6828          }
6829        ErrorCode = CommandStatus;
6830      Failure1:
6831        if (DataTransferBuffer != NULL)
6832          pci_free_consistent(Controller->PCIDevice, abs(DataTransferLength),
6833                        DataTransferBuffer, DataTransferBufferDMA);
6834        if (DCDB_IOBUF != NULL)
6835          pci_free_consistent(Controller->PCIDevice, sizeof(DAC960_V1_DCDB_T),
6836                        DCDB_IOBUF, DCDB_IOBUFDMA);
6837        break;
6838      }
6839    case DAC960_IOCTL_V2_EXECUTE_COMMAND:
6840      {
6841        DAC960_V2_UserCommand_T __user *UserSpaceUserCommand =
6842          (DAC960_V2_UserCommand_T __user *) Argument;
6843        DAC960_V2_UserCommand_T UserCommand;
6844        DAC960_Controller_T *Controller;
6845        DAC960_Command_T *Command = NULL;
6846        DAC960_V2_CommandMailbox_T *CommandMailbox;
6847        DAC960_V2_CommandStatus_T CommandStatus;
6848        unsigned long flags;
6849        int ControllerNumber, DataTransferLength;
6850        int DataTransferResidue, RequestSenseLength;
6851        unsigned char *DataTransferBuffer = NULL;
6852        dma_addr_t DataTransferBufferDMA;
6853        unsigned char *RequestSenseBuffer = NULL;
6854        dma_addr_t RequestSenseBufferDMA;
6855
6856        ErrorCode = -EINVAL;
6857        if (UserSpaceUserCommand == NULL)
6858                break;
6859        if (copy_from_user(&UserCommand, UserSpaceUserCommand,
6860                           sizeof(DAC960_V2_UserCommand_T))) {
6861                ErrorCode = -EFAULT;
6862                break;
6863        }
6864        ErrorCode = -ENXIO;
6865        ControllerNumber = UserCommand.ControllerNumber;
6866        if (ControllerNumber < 0 ||
6867            ControllerNumber > DAC960_ControllerCount - 1)
6868                break;
6869        Controller = DAC960_Controllers[ControllerNumber];
6870        if (Controller == NULL)
6871                break;
6872        if (Controller->FirmwareType != DAC960_V2_Controller){
6873                ErrorCode = -EINVAL;
6874                break;
6875        }
6876        DataTransferLength = UserCommand.DataTransferLength;
6877        ErrorCode = -ENOMEM;
6878        if (DataTransferLength > 0)
6879          {
6880            DataTransferBuffer = pci_alloc_consistent(Controller->PCIDevice,
6881                                DataTransferLength, &DataTransferBufferDMA);
6882            if (DataTransferBuffer == NULL)
6883                break;
6884            memset(DataTransferBuffer, 0, DataTransferLength);
6885          }
6886        else if (DataTransferLength < 0)
6887          {
6888            DataTransferBuffer = pci_alloc_consistent(Controller->PCIDevice,
6889                                -DataTransferLength, &DataTransferBufferDMA);
6890            if (DataTransferBuffer == NULL)
6891                break;
6892            if (copy_from_user(DataTransferBuffer,
6893                               UserCommand.DataTransferBuffer,
6894                               -DataTransferLength)) {
6895                ErrorCode = -EFAULT;
6896                goto Failure2;
6897            }
6898          }
6899        RequestSenseLength = UserCommand.RequestSenseLength;
6900        if (RequestSenseLength > 0)
6901          {
6902            RequestSenseBuffer = pci_alloc_consistent(Controller->PCIDevice,
6903                        RequestSenseLength, &RequestSenseBufferDMA);
6904            if (RequestSenseBuffer == NULL)
6905              {
6906                ErrorCode = -ENOMEM;
6907                goto Failure2;
6908              }
6909            memset(RequestSenseBuffer, 0, RequestSenseLength);
6910          }
6911        spin_lock_irqsave(&Controller->queue_lock, flags);
6912        while ((Command = DAC960_AllocateCommand(Controller)) == NULL)
6913          DAC960_WaitForCommand(Controller);
6914        spin_unlock_irqrestore(&Controller->queue_lock, flags);
6915        DAC960_V2_ClearCommand(Command);
6916        Command->CommandType = DAC960_ImmediateCommand;
6917        CommandMailbox = &Command->V2.CommandMailbox;
6918        memcpy(CommandMailbox, &UserCommand.CommandMailbox,
6919               sizeof(DAC960_V2_CommandMailbox_T));
6920        CommandMailbox->Common.CommandControlBits
6921                              .AdditionalScatterGatherListMemory = false;
6922        CommandMailbox->Common.CommandControlBits
6923                              .NoAutoRequestSense = true;
6924        CommandMailbox->Common.DataTransferSize = 0;
6925        CommandMailbox->Common.DataTransferPageNumber = 0;
6926        memset(&CommandMailbox->Common.DataTransferMemoryAddress, 0,
6927               sizeof(DAC960_V2_DataTransferMemoryAddress_T));
6928        if (DataTransferLength != 0)
6929          {
6930            if (DataTransferLength > 0)
6931              {
6932                CommandMailbox->Common.CommandControlBits
6933                                      .DataTransferControllerToHost = true;
6934                CommandMailbox->Common.DataTransferSize = DataTransferLength;
6935              }
6936            else
6937              {
6938                CommandMailbox->Common.CommandControlBits
6939                                      .DataTransferControllerToHost = false;
6940                CommandMailbox->Common.DataTransferSize = -DataTransferLength;
6941              }
6942            CommandMailbox->Common.DataTransferMemoryAddress
6943                                  .ScatterGatherSegments[0]
6944                                  .SegmentDataPointer = DataTransferBufferDMA;
6945            CommandMailbox->Common.DataTransferMemoryAddress
6946                                  .ScatterGatherSegments[0]
6947                                  .SegmentByteCount =
6948              CommandMailbox->Common.DataTransferSize;
6949          }
6950        if (RequestSenseLength > 0)
6951          {
6952            CommandMailbox->Common.CommandControlBits
6953                                  .NoAutoRequestSense = false;
6954            CommandMailbox->Common.RequestSenseSize = RequestSenseLength;
6955            CommandMailbox->Common.RequestSenseBusAddress =
6956                                                        RequestSenseBufferDMA;
6957          }
6958        DAC960_ExecuteCommand(Command);
6959        CommandStatus = Command->V2.CommandStatus;
6960        RequestSenseLength = Command->V2.RequestSenseLength;
6961        DataTransferResidue = Command->V2.DataTransferResidue;
6962        spin_lock_irqsave(&Controller->queue_lock, flags);
6963        DAC960_DeallocateCommand(Command);
6964        spin_unlock_irqrestore(&Controller->queue_lock, flags);
6965        if (RequestSenseLength > UserCommand.RequestSenseLength)
6966          RequestSenseLength = UserCommand.RequestSenseLength;
6967        if (copy_to_user(&UserSpaceUserCommand->DataTransferLength,
6968                                 &DataTransferResidue,
6969                                 sizeof(DataTransferResidue))) {
6970                ErrorCode = -EFAULT;
6971                goto Failure2;
6972        }
6973        if (copy_to_user(&UserSpaceUserCommand->RequestSenseLength,
6974                         &RequestSenseLength, sizeof(RequestSenseLength))) {
6975                ErrorCode = -EFAULT;
6976                goto Failure2;
6977        }
6978        if (DataTransferLength > 0)
6979          {
6980            if (copy_to_user(UserCommand.DataTransferBuffer,
6981                             DataTransferBuffer, DataTransferLength)) {
6982                ErrorCode = -EFAULT;
6983                goto Failure2;
6984            }
6985          }
6986        if (RequestSenseLength > 0)
6987          {
6988            if (copy_to_user(UserCommand.RequestSenseBuffer,
6989                             RequestSenseBuffer, RequestSenseLength)) {
6990                ErrorCode = -EFAULT;
6991                goto Failure2;
6992            }
6993          }
6994        ErrorCode = CommandStatus;
6995      Failure2:
6996          pci_free_consistent(Controller->PCIDevice, abs(DataTransferLength),
6997                DataTransferBuffer, DataTransferBufferDMA);
6998        if (RequestSenseBuffer != NULL)
6999          pci_free_consistent(Controller->PCIDevice, RequestSenseLength,
7000                RequestSenseBuffer, RequestSenseBufferDMA);
7001        break;
7002      }
7003    case DAC960_IOCTL_V2_GET_HEALTH_STATUS:
7004      {
7005        DAC960_V2_GetHealthStatus_T __user *UserSpaceGetHealthStatus =
7006          (DAC960_V2_GetHealthStatus_T __user *) Argument;
7007        DAC960_V2_GetHealthStatus_T GetHealthStatus;
7008        DAC960_V2_HealthStatusBuffer_T HealthStatusBuffer;
7009        DAC960_Controller_T *Controller;
7010        int ControllerNumber;
7011        if (UserSpaceGetHealthStatus == NULL) {
7012                ErrorCode = -EINVAL;
7013                break;
7014        }
7015        if (copy_from_user(&GetHealthStatus, UserSpaceGetHealthStatus,
7016                           sizeof(DAC960_V2_GetHealthStatus_T))) {
7017                ErrorCode = -EFAULT;
7018                break;
7019        }
7020        ErrorCode = -ENXIO;
7021        ControllerNumber = GetHealthStatus.ControllerNumber;
7022        if (ControllerNumber < 0 ||
7023            ControllerNumber > DAC960_ControllerCount - 1)
7024                    break;
7025        Controller = DAC960_Controllers[ControllerNumber];
7026        if (Controller == NULL)
7027                break;
7028        if (Controller->FirmwareType != DAC960_V2_Controller) {
7029                ErrorCode = -EINVAL;
7030                break;
7031        }
7032        if (copy_from_user(&HealthStatusBuffer,
7033                           GetHealthStatus.HealthStatusBuffer,
7034                           sizeof(DAC960_V2_HealthStatusBuffer_T))) {
7035                ErrorCode = -EFAULT;
7036                break;
7037        }
7038        while (Controller->V2.HealthStatusBuffer->StatusChangeCounter
7039               == HealthStatusBuffer.StatusChangeCounter &&
7040               Controller->V2.HealthStatusBuffer->NextEventSequenceNumber
7041               == HealthStatusBuffer.NextEventSequenceNumber)
7042          {
7043            interruptible_sleep_on_timeout(&Controller->HealthStatusWaitQueue,
7044                                           DAC960_MonitoringTimerInterval);
7045            if (signal_pending(current)) {
7046                ErrorCode = -EINTR;
7047                break;
7048            }
7049          }
7050        if (copy_to_user(GetHealthStatus.HealthStatusBuffer,
7051                         Controller->V2.HealthStatusBuffer,
7052                         sizeof(DAC960_V2_HealthStatusBuffer_T)))
7053                ErrorCode = -EFAULT;
7054        else
7055                ErrorCode =  0;
7056      }
7057      break;
7058      default:
7059        ErrorCode = -ENOTTY;
7060    }
7061  mutex_unlock(&DAC960_mutex);
7062  return ErrorCode;
7063}
7064
7065static const struct file_operations DAC960_gam_fops = {
7066        .owner          = THIS_MODULE,
7067        .unlocked_ioctl = DAC960_gam_ioctl,
7068        .llseek         = noop_llseek,
7069};
7070
7071static struct miscdevice DAC960_gam_dev = {
7072        DAC960_GAM_MINOR,
7073        "dac960_gam",
7074        &DAC960_gam_fops
7075};
7076
7077static int DAC960_gam_init(void)
7078{
7079        int ret;
7080
7081        ret = misc_register(&DAC960_gam_dev);
7082        if (ret)
7083                printk(KERN_ERR "DAC960_gam: can't misc_register on minor %d\n", DAC960_GAM_MINOR);
7084        return ret;
7085}
7086
7087static void DAC960_gam_cleanup(void)
7088{
7089        misc_deregister(&DAC960_gam_dev);
7090}
7091
7092#endif /* DAC960_GAM_MINOR */
7093
7094static struct DAC960_privdata DAC960_GEM_privdata = {
7095        .HardwareType =         DAC960_GEM_Controller,
7096        .FirmwareType   =       DAC960_V2_Controller,
7097        .InterruptHandler =     DAC960_GEM_InterruptHandler,
7098        .MemoryWindowSize =     DAC960_GEM_RegisterWindowSize,
7099};
7100
7101
7102static struct DAC960_privdata DAC960_BA_privdata = {
7103        .HardwareType =         DAC960_BA_Controller,
7104        .FirmwareType   =       DAC960_V2_Controller,
7105        .InterruptHandler =     DAC960_BA_InterruptHandler,
7106        .MemoryWindowSize =     DAC960_BA_RegisterWindowSize,
7107};
7108
7109static struct DAC960_privdata DAC960_LP_privdata = {
7110        .HardwareType =         DAC960_LP_Controller,
7111        .FirmwareType   =       DAC960_V2_Controller,
7112        .InterruptHandler =     DAC960_LP_InterruptHandler,
7113        .MemoryWindowSize =     DAC960_LP_RegisterWindowSize,
7114};
7115
7116static struct DAC960_privdata DAC960_LA_privdata = {
7117        .HardwareType =         DAC960_LA_Controller,
7118        .FirmwareType   =       DAC960_V1_Controller,
7119        .InterruptHandler =     DAC960_LA_InterruptHandler,
7120        .MemoryWindowSize =     DAC960_LA_RegisterWindowSize,
7121};
7122
7123static struct DAC960_privdata DAC960_PG_privdata = {
7124        .HardwareType =         DAC960_PG_Controller,
7125        .FirmwareType   =       DAC960_V1_Controller,
7126        .InterruptHandler =     DAC960_PG_InterruptHandler,
7127        .MemoryWindowSize =     DAC960_PG_RegisterWindowSize,
7128};
7129
7130static struct DAC960_privdata DAC960_PD_privdata = {
7131        .HardwareType =         DAC960_PD_Controller,
7132        .FirmwareType   =       DAC960_V1_Controller,
7133        .InterruptHandler =     DAC960_PD_InterruptHandler,
7134        .MemoryWindowSize =     DAC960_PD_RegisterWindowSize,
7135};
7136
7137static struct DAC960_privdata DAC960_P_privdata = {
7138        .HardwareType =         DAC960_P_Controller,
7139        .FirmwareType   =       DAC960_V1_Controller,
7140        .InterruptHandler =     DAC960_P_InterruptHandler,
7141        .MemoryWindowSize =     DAC960_PD_RegisterWindowSize,
7142};
7143
7144static const struct pci_device_id DAC960_id_table[] = {
7145        {
7146                .vendor         = PCI_VENDOR_ID_MYLEX,
7147                .device         = PCI_DEVICE_ID_MYLEX_DAC960_GEM,
7148                .subvendor      = PCI_VENDOR_ID_MYLEX,
7149                .subdevice      = PCI_ANY_ID,
7150                .driver_data    = (unsigned long) &DAC960_GEM_privdata,
7151        },
7152        {
7153                .vendor         = PCI_VENDOR_ID_MYLEX,
7154                .device         = PCI_DEVICE_ID_MYLEX_DAC960_BA,
7155                .subvendor      = PCI_ANY_ID,
7156                .subdevice      = PCI_ANY_ID,
7157                .driver_data    = (unsigned long) &DAC960_BA_privdata,
7158        },
7159        {
7160                .vendor         = PCI_VENDOR_ID_MYLEX,
7161                .device         = PCI_DEVICE_ID_MYLEX_DAC960_LP,
7162                .subvendor      = PCI_ANY_ID,
7163                .subdevice      = PCI_ANY_ID,
7164                .driver_data    = (unsigned long) &DAC960_LP_privdata,
7165        },
7166        {
7167                .vendor         = PCI_VENDOR_ID_DEC,
7168                .device         = PCI_DEVICE_ID_DEC_21285,
7169                .subvendor      = PCI_VENDOR_ID_MYLEX,
7170                .subdevice      = PCI_DEVICE_ID_MYLEX_DAC960_LA,
7171                .driver_data    = (unsigned long) &DAC960_LA_privdata,
7172        },
7173        {
7174                .vendor         = PCI_VENDOR_ID_MYLEX,
7175                .device         = PCI_DEVICE_ID_MYLEX_DAC960_PG,
7176                .subvendor      = PCI_ANY_ID,
7177                .subdevice      = PCI_ANY_ID,
7178                .driver_data    = (unsigned long) &DAC960_PG_privdata,
7179        },
7180        {
7181                .vendor         = PCI_VENDOR_ID_MYLEX,
7182                .device         = PCI_DEVICE_ID_MYLEX_DAC960_PD,
7183                .subvendor      = PCI_ANY_ID,
7184                .subdevice      = PCI_ANY_ID,
7185                .driver_data    = (unsigned long) &DAC960_PD_privdata,
7186        },
7187        {
7188                .vendor         = PCI_VENDOR_ID_MYLEX,
7189                .device         = PCI_DEVICE_ID_MYLEX_DAC960_P,
7190                .subvendor      = PCI_ANY_ID,
7191                .subdevice      = PCI_ANY_ID,
7192                .driver_data    = (unsigned long) &DAC960_P_privdata,
7193        },
7194        {0, },
7195};
7196
7197MODULE_DEVICE_TABLE(pci, DAC960_id_table);
7198
7199static struct pci_driver DAC960_pci_driver = {
7200        .name           = "DAC960",
7201        .id_table       = DAC960_id_table,
7202        .probe          = DAC960_Probe,
7203        .remove         = DAC960_Remove,
7204};
7205
7206static int __init DAC960_init_module(void)
7207{
7208        int ret;
7209
7210        ret =  pci_register_driver(&DAC960_pci_driver);
7211#ifdef DAC960_GAM_MINOR
7212        if (!ret)
7213                DAC960_gam_init();
7214#endif
7215        return ret;
7216}
7217
7218static void __exit DAC960_cleanup_module(void)
7219{
7220        int i;
7221
7222#ifdef DAC960_GAM_MINOR
7223        DAC960_gam_cleanup();
7224#endif
7225
7226        for (i = 0; i < DAC960_ControllerCount; i++) {
7227                DAC960_Controller_T *Controller = DAC960_Controllers[i];
7228                if (Controller == NULL)
7229                        continue;
7230                DAC960_FinalizeController(Controller);
7231        }
7232        if (DAC960_ProcDirectoryEntry != NULL) {
7233                remove_proc_entry("rd/status", NULL);
7234                remove_proc_entry("rd", NULL);
7235        }
7236        DAC960_ControllerCount = 0;
7237        pci_unregister_driver(&DAC960_pci_driver);
7238}
7239
7240module_init(DAC960_init_module);
7241module_exit(DAC960_cleanup_module);
7242
7243MODULE_LICENSE("GPL");
7244