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