linux/drivers/scsi/ips.c
<<
>>
Prefs
   1/*****************************************************************************/
   2/* ips.c -- driver for the Adaptec / IBM ServeRAID controller                */
   3/*                                                                           */
   4/* Written By: Keith Mitchell, IBM Corporation                               */
   5/*             Jack Hammer, Adaptec, Inc.                                    */
   6/*             David Jeffery, Adaptec, Inc.                                  */
   7/*                                                                           */
   8/* Copyright (C) 2000 IBM Corporation                                        */
   9/* Copyright (C) 2002,2003 Adaptec, Inc.                                     */
  10/*                                                                           */
  11/* This program is free software; you can redistribute it and/or modify      */
  12/* it under the terms of the GNU General Public License as published by      */
  13/* the Free Software Foundation; either version 2 of the License, or         */
  14/* (at your option) any later version.                                       */
  15/*                                                                           */
  16/* This program is distributed in the hope that it will be useful,           */
  17/* but WITHOUT ANY WARRANTY; without even the implied warranty of            */
  18/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             */
  19/* GNU General Public License for more details.                              */
  20/*                                                                           */
  21/* NO WARRANTY                                                               */
  22/* THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR        */
  23/* CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT      */
  24/* LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,      */
  25/* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is    */
  26/* solely responsible for determining the appropriateness of using and       */
  27/* distributing the Program and assumes all risks associated with its        */
  28/* exercise of rights under this Agreement, including but not limited to     */
  29/* the risks and costs of program errors, damage to or loss of data,         */
  30/* programs or equipment, and unavailability or interruption of operations.  */
  31/*                                                                           */
  32/* DISCLAIMER OF LIABILITY                                                   */
  33/* NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY   */
  34/* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL        */
  35/* DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND   */
  36/* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR     */
  37/* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE    */
  38/* USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED  */
  39/* HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES             */
  40/*                                                                           */
  41/* You should have received a copy of the GNU General Public License         */
  42/* along with this program; if not, write to the Free Software               */
  43/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  44/*                                                                           */
  45/* Bugs/Comments/Suggestions about this driver should be mailed to:          */
  46/*      ipslinux@adaptec.com                                                 */
  47/*                                                                           */
  48/* For system support issues, contact your local IBM Customer support.       */
  49/* Directions to find IBM Customer Support for each country can be found at: */
  50/*      http://www.ibm.com/planetwide/                                       */
  51/*                                                                           */
  52/*****************************************************************************/
  53
  54/*****************************************************************************/
  55/* Change Log                                                                */
  56/*                                                                           */
  57/* 0.99.02  - Breakup commands that are bigger than 8 * the stripe size      */
  58/* 0.99.03  - Make interrupt routine handle all completed request on the     */
  59/*            adapter not just the first one                                 */
  60/*          - Make sure passthru commands get woken up if we run out of      */
  61/*            SCBs                                                           */
  62/*          - Send all of the commands on the queue at once rather than      */
  63/*            one at a time since the card will support it.                  */
  64/* 0.99.04  - Fix race condition in the passthru mechanism -- this required  */
  65/*            the interface to the utilities to change                       */
  66/*          - Fix error recovery code                                        */
  67/* 0.99.05  - Fix an oops when we get certain passthru commands              */
  68/* 1.00.00  - Initial Public Release                                         */
  69/*            Functionally equivalent to 0.99.05                             */
  70/* 3.60.00  - Bump max commands to 128 for use with firmware 3.60            */
  71/*          - Change version to 3.60 to coincide with release numbering.     */
  72/* 3.60.01  - Remove bogus error check in passthru routine                   */
  73/* 3.60.02  - Make DCDB direction based on lookup table                      */
  74/*          - Only allow one DCDB command to a SCSI ID at a time             */
  75/* 4.00.00  - Add support for ServeRAID 4                                    */
  76/* 4.00.01  - Add support for First Failure Data Capture                     */
  77/* 4.00.02  - Fix problem with PT DCDB with no buffer                        */
  78/* 4.00.03  - Add alternative passthru interface                             */
  79/*          - Add ability to flash BIOS                                      */
  80/* 4.00.04  - Rename structures/constants to be prefixed with IPS_           */
  81/* 4.00.05  - Remove wish_block from init routine                            */
  82/*          - Use linux/spinlock.h instead of asm/spinlock.h for kernels     */
  83/*            2.3.18 and later                                               */
  84/*          - Sync with other changes from the 2.3 kernels                   */
  85/* 4.00.06  - Fix timeout with initial FFDC command                          */
  86/* 4.00.06a - Port to 2.4 (trivial) -- Christoph Hellwig <hch@infradead.org> */
  87/* 4.10.00  - Add support for ServeRAID 4M/4L                                */
  88/* 4.10.13  - Fix for dynamic unload and proc file system                    */
  89/* 4.20.03  - Rename version to coincide with new release schedules          */
  90/*            Performance fixes                                              */
  91/*            Fix truncation of /proc files with cat                         */
  92/*            Merge in changes through kernel 2.4.0test1ac21                 */
  93/* 4.20.13  - Fix some failure cases / reset code                            */
  94/*          - Hook into the reboot_notifier to flush the controller cache    */
  95/* 4.50.01  - Fix problem when there is a hole in logical drive numbering    */
  96/* 4.70.09  - Use a Common ( Large Buffer ) for Flashing from the JCRM CD    */
  97/*          - Add IPSSEND Flash Support                                      */
  98/*          - Set Sense Data for Unknown SCSI Command                        */
  99/*          - Use Slot Number from NVRAM Page 5                              */
 100/*          - Restore caller's DCDB Structure                                */
 101/* 4.70.12  - Corrective actions for bad controller ( during initialization )*/
 102/* 4.70.13  - Don't Send CDB's if we already know the device is not present  */
 103/*          - Don't release HA Lock in ips_next() until SC taken off queue   */
 104/*          - Unregister SCSI device in ips_release()                        */
 105/* 4.70.15  - Fix Breakup for very large ( non-SG ) requests in ips_done()   */
 106/* 4.71.00  - Change all memory allocations to not use GFP_DMA flag          */
 107/*            Code Clean-Up for 2.4.x kernel                                 */
 108/* 4.72.00  - Allow for a Scatter-Gather Element to exceed MAX_XFER Size     */
 109/* 4.72.01  - I/O Mapped Memory release ( so "insmod ips" does not Fail )    */
 110/*          - Don't Issue Internal FFDC Command if there are Active Commands */
 111/*          - Close Window for getting too many IOCTL's active               */
 112/* 4.80.00  - Make ia64 Safe                                                 */
 113/* 4.80.04  - Eliminate calls to strtok() if 2.4.x or greater                */
 114/*          - Adjustments to Device Queue Depth                              */
 115/* 4.80.14  - Take all semaphores off stack                                  */
 116/*          - Clean Up New_IOCTL path                                        */
 117/* 4.80.20  - Set max_sectors in Scsi_Host structure ( if >= 2.4.7 kernel )  */
 118/*          - 5 second delay needed after resetting an i960 adapter          */
 119/* 4.80.26  - Clean up potential code problems ( Arjan's recommendations )   */
 120/* 4.90.01  - Version Matching for FirmWare, BIOS, and Driver                */
 121/* 4.90.05  - Use New PCI Architecture to facilitate Hot Plug Development    */
 122/* 4.90.08  - Increase Delays in Flashing ( Trombone Only - 4H )             */
 123/* 4.90.08  - Data Corruption if First Scatter Gather Element is > 64K       */
 124/* 4.90.11  - Don't actually RESET unless it's physically required           */
 125/*          - Remove unused compile options                                  */
 126/* 5.00.01  - Sarasota ( 5i ) adapters must always be scanned first          */
 127/*          - Get rid on IOCTL_NEW_COMMAND code                              */
 128/*          - Add Extended DCDB Commands for Tape Support in 5I              */
 129/* 5.10.12  - use pci_dma interfaces, update for 2.5 kernel changes          */
 130/* 5.10.15  - remove unused code (sem, macros, etc.)                         */
 131/* 5.30.00  - use __devexit_p()                                              */
 132/* 6.00.00  - Add 6x Adapters and Battery Flash                              */
 133/* 6.10.00  - Remove 1G Addressing Limitations                               */
 134/* 6.11.xx  - Get VersionInfo buffer off the stack !              DDTS 60401 */
 135/* 6.11.xx  - Make Logical Drive Info structure safe for DMA      DDTS 60639 */
 136/* 7.10.18  - Add highmem_io flag in SCSI Templete for 2.4 kernels           */
 137/*          - Fix path/name for scsi_hosts.h include for 2.6 kernels         */
 138/*          - Fix sort order of 7k                                           */
 139/*          - Remove 3 unused "inline" functions                             */
 140/* 7.12.xx  - Use STATIC functions wherever possible                        */
 141/*          - Clean up deprecated MODULE_PARM calls                          */
 142/* 7.12.05  - Remove Version Matching per IBM request                        */
 143/*****************************************************************************/
 144
 145/*
 146 * Conditional Compilation directives for this driver:
 147 *
 148 * IPS_DEBUG            - Turn on debugging info
 149 *
 150 * Parameters:
 151 *
 152 * debug:<number>       - Set debug level to <number>
 153 *                        NOTE: only works when IPS_DEBUG compile directive is used.
 154 *       1              - Normal debug messages
 155 *       2              - Verbose debug messages
 156 *       11             - Method trace (non interrupt)
 157 *       12             - Method trace (includes interrupt)
 158 *
 159 * noi2o                - Don't use I2O Queues (ServeRAID 4 only)
 160 * nommap               - Don't use memory mapped I/O
 161 * ioctlsize            - Initial size of the IOCTL buffer
 162 */
 163
 164#include <asm/io.h>
 165#include <asm/byteorder.h>
 166#include <asm/page.h>
 167#include <linux/stddef.h>
 168#include <linux/string.h>
 169#include <linux/errno.h>
 170#include <linux/kernel.h>
 171#include <linux/ioport.h>
 172#include <linux/slab.h>
 173#include <linux/delay.h>
 174#include <linux/pci.h>
 175#include <linux/proc_fs.h>
 176#include <linux/reboot.h>
 177#include <linux/interrupt.h>
 178
 179#include <linux/blkdev.h>
 180#include <linux/types.h>
 181#include <linux/dma-mapping.h>
 182
 183#include <scsi/sg.h>
 184#include "scsi.h"
 185#include <scsi/scsi_host.h>
 186
 187#include "ips.h"
 188
 189#include <linux/module.h>
 190
 191#include <linux/stat.h>
 192
 193#include <linux/spinlock.h>
 194#include <linux/init.h>
 195
 196#include <linux/smp.h>
 197
 198#ifdef MODULE
 199static char *ips = NULL;
 200module_param(ips, charp, 0);
 201#endif
 202
 203/*
 204 * DRIVER_VER
 205 */
 206#define IPS_VERSION_HIGH        IPS_VER_MAJOR_STRING "." IPS_VER_MINOR_STRING
 207#define IPS_VERSION_LOW         "." IPS_VER_BUILD_STRING " "
 208
 209#if !defined(__i386__) && !defined(__ia64__) && !defined(__x86_64__)
 210#warning "This driver has only been tested on the x86/ia64/x86_64 platforms"
 211#endif
 212
 213#define IPS_DMA_DIR(scb) ((!scb->scsi_cmd || ips_is_passthru(scb->scsi_cmd) || \
 214                         DMA_NONE == scb->scsi_cmd->sc_data_direction) ? \
 215                         PCI_DMA_BIDIRECTIONAL : \
 216                         scb->scsi_cmd->sc_data_direction)
 217
 218#ifdef IPS_DEBUG
 219#define METHOD_TRACE(s, i)    if (ips_debug >= (i+10)) printk(KERN_NOTICE s "\n");
 220#define DEBUG(i, s)           if (ips_debug >= i) printk(KERN_NOTICE s "\n");
 221#define DEBUG_VAR(i, s, v...) if (ips_debug >= i) printk(KERN_NOTICE s "\n", v);
 222#else
 223#define METHOD_TRACE(s, i)
 224#define DEBUG(i, s)
 225#define DEBUG_VAR(i, s, v...)
 226#endif
 227
 228/*
 229 * Function prototypes
 230 */
 231static int ips_detect(struct scsi_host_template *);
 232static int ips_release(struct Scsi_Host *);
 233static int ips_eh_abort(struct scsi_cmnd *);
 234static int ips_eh_reset(struct scsi_cmnd *);
 235static int ips_queue(struct Scsi_Host *, struct scsi_cmnd *);
 236static const char *ips_info(struct Scsi_Host *);
 237static irqreturn_t do_ipsintr(int, void *);
 238static int ips_hainit(ips_ha_t *);
 239static int ips_map_status(ips_ha_t *, ips_scb_t *, ips_stat_t *);
 240static int ips_send_wait(ips_ha_t *, ips_scb_t *, int, int);
 241static int ips_send_cmd(ips_ha_t *, ips_scb_t *);
 242static int ips_online(ips_ha_t *, ips_scb_t *);
 243static int ips_inquiry(ips_ha_t *, ips_scb_t *);
 244static int ips_rdcap(ips_ha_t *, ips_scb_t *);
 245static int ips_msense(ips_ha_t *, ips_scb_t *);
 246static int ips_reqsen(ips_ha_t *, ips_scb_t *);
 247static int ips_deallocatescbs(ips_ha_t *, int);
 248static int ips_allocatescbs(ips_ha_t *);
 249static int ips_reset_copperhead(ips_ha_t *);
 250static int ips_reset_copperhead_memio(ips_ha_t *);
 251static int ips_reset_morpheus(ips_ha_t *);
 252static int ips_issue_copperhead(ips_ha_t *, ips_scb_t *);
 253static int ips_issue_copperhead_memio(ips_ha_t *, ips_scb_t *);
 254static int ips_issue_i2o(ips_ha_t *, ips_scb_t *);
 255static int ips_issue_i2o_memio(ips_ha_t *, ips_scb_t *);
 256static int ips_isintr_copperhead(ips_ha_t *);
 257static int ips_isintr_copperhead_memio(ips_ha_t *);
 258static int ips_isintr_morpheus(ips_ha_t *);
 259static int ips_wait(ips_ha_t *, int, int);
 260static int ips_write_driver_status(ips_ha_t *, int);
 261static int ips_read_adapter_status(ips_ha_t *, int);
 262static int ips_read_subsystem_parameters(ips_ha_t *, int);
 263static int ips_read_config(ips_ha_t *, int);
 264static int ips_clear_adapter(ips_ha_t *, int);
 265static int ips_readwrite_page5(ips_ha_t *, int, int);
 266static int ips_init_copperhead(ips_ha_t *);
 267static int ips_init_copperhead_memio(ips_ha_t *);
 268static int ips_init_morpheus(ips_ha_t *);
 269static int ips_isinit_copperhead(ips_ha_t *);
 270static int ips_isinit_copperhead_memio(ips_ha_t *);
 271static int ips_isinit_morpheus(ips_ha_t *);
 272static int ips_erase_bios(ips_ha_t *);
 273static int ips_program_bios(ips_ha_t *, char *, uint32_t, uint32_t);
 274static int ips_verify_bios(ips_ha_t *, char *, uint32_t, uint32_t);
 275static int ips_erase_bios_memio(ips_ha_t *);
 276static int ips_program_bios_memio(ips_ha_t *, char *, uint32_t, uint32_t);
 277static int ips_verify_bios_memio(ips_ha_t *, char *, uint32_t, uint32_t);
 278static int ips_flash_copperhead(ips_ha_t *, ips_passthru_t *, ips_scb_t *);
 279static int ips_flash_bios(ips_ha_t *, ips_passthru_t *, ips_scb_t *);
 280static int ips_flash_firmware(ips_ha_t *, ips_passthru_t *, ips_scb_t *);
 281static void ips_free_flash_copperhead(ips_ha_t * ha);
 282static void ips_get_bios_version(ips_ha_t *, int);
 283static void ips_identify_controller(ips_ha_t *);
 284static void ips_chkstatus(ips_ha_t *, IPS_STATUS *);
 285static void ips_enable_int_copperhead(ips_ha_t *);
 286static void ips_enable_int_copperhead_memio(ips_ha_t *);
 287static void ips_enable_int_morpheus(ips_ha_t *);
 288static int ips_intr_copperhead(ips_ha_t *);
 289static int ips_intr_morpheus(ips_ha_t *);
 290static void ips_next(ips_ha_t *, int);
 291static void ipsintr_blocking(ips_ha_t *, struct ips_scb *);
 292static void ipsintr_done(ips_ha_t *, struct ips_scb *);
 293static void ips_done(ips_ha_t *, ips_scb_t *);
 294static void ips_free(ips_ha_t *);
 295static void ips_init_scb(ips_ha_t *, ips_scb_t *);
 296static void ips_freescb(ips_ha_t *, ips_scb_t *);
 297static void ips_setup_funclist(ips_ha_t *);
 298static void ips_statinit(ips_ha_t *);
 299static void ips_statinit_memio(ips_ha_t *);
 300static void ips_fix_ffdc_time(ips_ha_t *, ips_scb_t *, time_t);
 301static void ips_ffdc_reset(ips_ha_t *, int);
 302static void ips_ffdc_time(ips_ha_t *);
 303static uint32_t ips_statupd_copperhead(ips_ha_t *);
 304static uint32_t ips_statupd_copperhead_memio(ips_ha_t *);
 305static uint32_t ips_statupd_morpheus(ips_ha_t *);
 306static ips_scb_t *ips_getscb(ips_ha_t *);
 307static void ips_putq_scb_head(ips_scb_queue_t *, ips_scb_t *);
 308static void ips_putq_wait_tail(ips_wait_queue_t *, struct scsi_cmnd *);
 309static void ips_putq_copp_tail(ips_copp_queue_t *,
 310                                      ips_copp_wait_item_t *);
 311static ips_scb_t *ips_removeq_scb_head(ips_scb_queue_t *);
 312static ips_scb_t *ips_removeq_scb(ips_scb_queue_t *, ips_scb_t *);
 313static struct scsi_cmnd *ips_removeq_wait_head(ips_wait_queue_t *);
 314static struct scsi_cmnd *ips_removeq_wait(ips_wait_queue_t *,
 315                                          struct scsi_cmnd *);
 316static ips_copp_wait_item_t *ips_removeq_copp(ips_copp_queue_t *,
 317                                                     ips_copp_wait_item_t *);
 318static ips_copp_wait_item_t *ips_removeq_copp_head(ips_copp_queue_t *);
 319
 320static int ips_is_passthru(struct scsi_cmnd *);
 321static int ips_make_passthru(ips_ha_t *, struct scsi_cmnd *, ips_scb_t *, int);
 322static int ips_usrcmd(ips_ha_t *, ips_passthru_t *, ips_scb_t *);
 323static void ips_cleanup_passthru(ips_ha_t *, ips_scb_t *);
 324static void ips_scmd_buf_write(struct scsi_cmnd * scmd, void *data,
 325                               unsigned int count);
 326static void ips_scmd_buf_read(struct scsi_cmnd * scmd, void *data,
 327                              unsigned int count);
 328
 329static int ips_write_info(struct Scsi_Host *, char *, int);
 330static int ips_show_info(struct seq_file *, struct Scsi_Host *);
 331static int ips_host_info(ips_ha_t *, struct seq_file *);
 332static int ips_abort_init(ips_ha_t * ha, int index);
 333static int ips_init_phase2(int index);
 334
 335static int ips_init_phase1(struct pci_dev *pci_dev, int *indexPtr);
 336static int ips_register_scsi(int index);
 337
 338static int  ips_poll_for_flush_complete(ips_ha_t * ha);
 339static void ips_flush_and_reset(ips_ha_t *ha);
 340
 341/*
 342 * global variables
 343 */
 344static const char ips_name[] = "ips";
 345static struct Scsi_Host *ips_sh[IPS_MAX_ADAPTERS];      /* Array of host controller structures */
 346static ips_ha_t *ips_ha[IPS_MAX_ADAPTERS];      /* Array of HA structures */
 347static unsigned int ips_next_controller;
 348static unsigned int ips_num_controllers;
 349static unsigned int ips_released_controllers;
 350static int ips_hotplug;
 351static int ips_cmd_timeout = 60;
 352static int ips_reset_timeout = 60 * 5;
 353static int ips_force_memio = 1;         /* Always use Memory Mapped I/O    */
 354static int ips_force_i2o = 1;   /* Always use I2O command delivery */
 355static int ips_ioctlsize = IPS_IOCTL_SIZE;      /* Size of the ioctl buffer        */
 356static int ips_cd_boot;                 /* Booting from Manager CD         */
 357static char *ips_FlashData = NULL;      /* CD Boot - Flash Data Buffer      */
 358static dma_addr_t ips_flashbusaddr;
 359static long ips_FlashDataInUse;         /* CD Boot - Flash Data In Use Flag */
 360static uint32_t MaxLiteCmds = 32;       /* Max Active Cmds for a Lite Adapter */
 361static struct scsi_host_template ips_driver_template = {
 362        .detect                 = ips_detect,
 363        .release                = ips_release,
 364        .info                   = ips_info,
 365        .queuecommand           = ips_queue,
 366        .eh_abort_handler       = ips_eh_abort,
 367        .eh_host_reset_handler  = ips_eh_reset,
 368        .proc_name              = "ips",
 369        .show_info              = ips_show_info,
 370        .write_info             = ips_write_info,
 371        .slave_configure        = ips_slave_configure,
 372        .bios_param             = ips_biosparam,
 373        .this_id                = -1,
 374        .sg_tablesize           = IPS_MAX_SG,
 375        .cmd_per_lun            = 3,
 376        .use_clustering         = ENABLE_CLUSTERING,
 377        .no_write_same          = 1,
 378};
 379
 380
 381/* This table describes all ServeRAID Adapters */
 382static struct  pci_device_id  ips_pci_table[] = {
 383        { 0x1014, 0x002E, PCI_ANY_ID, PCI_ANY_ID, 0, 0 },
 384        { 0x1014, 0x01BD, PCI_ANY_ID, PCI_ANY_ID, 0, 0 },
 385        { 0x9005, 0x0250, PCI_ANY_ID, PCI_ANY_ID, 0, 0 },
 386        { 0, }
 387};
 388
 389MODULE_DEVICE_TABLE( pci, ips_pci_table );
 390
 391static char ips_hot_plug_name[] = "ips";
 392
 393static int  ips_insert_device(struct pci_dev *pci_dev, const struct pci_device_id *ent);
 394static void ips_remove_device(struct pci_dev *pci_dev);
 395
 396static struct pci_driver ips_pci_driver = {
 397        .name           = ips_hot_plug_name,
 398        .id_table       = ips_pci_table,
 399        .probe          = ips_insert_device,
 400        .remove         = ips_remove_device,
 401};
 402
 403
 404/*
 405 * Necessary forward function protoypes
 406 */
 407static int ips_halt(struct notifier_block *nb, ulong event, void *buf);
 408
 409#define MAX_ADAPTER_NAME 15
 410
 411static char ips_adapter_name[][30] = {
 412        "ServeRAID",
 413        "ServeRAID II",
 414        "ServeRAID on motherboard",
 415        "ServeRAID on motherboard",
 416        "ServeRAID 3H",
 417        "ServeRAID 3L",
 418        "ServeRAID 4H",
 419        "ServeRAID 4M",
 420        "ServeRAID 4L",
 421        "ServeRAID 4Mx",
 422        "ServeRAID 4Lx",
 423        "ServeRAID 5i",
 424        "ServeRAID 5i",
 425        "ServeRAID 6M",
 426        "ServeRAID 6i",
 427        "ServeRAID 7t",
 428        "ServeRAID 7k",
 429        "ServeRAID 7M"
 430};
 431
 432static struct notifier_block ips_notifier = {
 433        ips_halt, NULL, 0
 434};
 435
 436/*
 437 * Direction table
 438 */
 439static char ips_command_direction[] = {
 440        IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_OUT,
 441        IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_UNK,
 442        IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 443        IPS_DATA_IN, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_OUT,
 444        IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_OUT,
 445        IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_OUT,
 446        IPS_DATA_NONE, IPS_DATA_UNK, IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_IN,
 447        IPS_DATA_UNK, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_UNK,
 448        IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_NONE, IPS_DATA_UNK,
 449        IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT,
 450        IPS_DATA_OUT, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_NONE, IPS_DATA_NONE,
 451        IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT,
 452        IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_OUT,
 453        IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_NONE,
 454        IPS_DATA_UNK, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_UNK,
 455        IPS_DATA_NONE, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_UNK,
 456        IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 457        IPS_DATA_OUT, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 458        IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 459        IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 460        IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 461        IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 462        IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 463        IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 464        IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 465        IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 466        IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 467        IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 468        IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 469        IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 470        IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 471        IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 472        IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 473        IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_UNK, IPS_DATA_IN, IPS_DATA_NONE,
 474        IPS_DATA_OUT, IPS_DATA_UNK, IPS_DATA_NONE, IPS_DATA_UNK, IPS_DATA_OUT,
 475        IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_NONE,
 476        IPS_DATA_UNK, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_IN,
 477        IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 478        IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 479        IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 480        IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 481        IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 482        IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 483        IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 484        IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 485        IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 486        IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_OUT,
 487        IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 488        IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 489        IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 490        IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK
 491};
 492
 493
 494/****************************************************************************/
 495/*                                                                          */
 496/* Routine Name: ips_setup                                                  */
 497/*                                                                          */
 498/* Routine Description:                                                     */
 499/*                                                                          */
 500/*   setup parameters to the driver                                         */
 501/*                                                                          */
 502/****************************************************************************/
 503static int
 504ips_setup(char *ips_str)
 505{
 506
 507        int i;
 508        char *key;
 509        char *value;
 510        IPS_OPTION options[] = {
 511                {"noi2o", &ips_force_i2o, 0},
 512                {"nommap", &ips_force_memio, 0},
 513                {"ioctlsize", &ips_ioctlsize, IPS_IOCTL_SIZE},
 514                {"cdboot", &ips_cd_boot, 0},
 515                {"maxcmds", &MaxLiteCmds, 32},
 516        };
 517
 518        /* Don't use strtok() anymore ( if 2.4 Kernel or beyond ) */
 519        /* Search for value */
 520        while ((key = strsep(&ips_str, ",."))) {
 521                if (!*key)
 522                        continue;
 523                value = strchr(key, ':');
 524                if (value)
 525                        *value++ = '\0';
 526                /*
 527                 * We now have key/value pairs.
 528                 * Update the variables
 529                 */
 530                for (i = 0; i < ARRAY_SIZE(options); i++) {
 531                        if (strncasecmp
 532                            (key, options[i].option_name,
 533                             strlen(options[i].option_name)) == 0) {
 534                                if (value)
 535                                        *options[i].option_flag =
 536                                            simple_strtoul(value, NULL, 0);
 537                                else
 538                                        *options[i].option_flag =
 539                                            options[i].option_value;
 540                                break;
 541                        }
 542                }
 543        }
 544
 545        return (1);
 546}
 547
 548__setup("ips=", ips_setup);
 549
 550/****************************************************************************/
 551/*                                                                          */
 552/* Routine Name: ips_detect                                                 */
 553/*                                                                          */
 554/* Routine Description:                                                     */
 555/*                                                                          */
 556/*   Detect and initialize the driver                                       */
 557/*                                                                          */
 558/* NOTE: this routine is called under the io_request_lock spinlock          */
 559/*                                                                          */
 560/****************************************************************************/
 561static int
 562ips_detect(struct scsi_host_template * SHT)
 563{
 564        int i;
 565
 566        METHOD_TRACE("ips_detect", 1);
 567
 568#ifdef MODULE
 569        if (ips)
 570                ips_setup(ips);
 571#endif
 572
 573        for (i = 0; i < ips_num_controllers; i++) {
 574                if (ips_register_scsi(i))
 575                        ips_free(ips_ha[i]);
 576                ips_released_controllers++;
 577        }
 578        ips_hotplug = 1;
 579        return (ips_num_controllers);
 580}
 581
 582/****************************************************************************/
 583/*   configure the function pointers to use the functions that will work    */
 584/*   with the found version of the adapter                                  */
 585/****************************************************************************/
 586static void
 587ips_setup_funclist(ips_ha_t * ha)
 588{
 589
 590        /*
 591         * Setup Functions
 592         */
 593        if (IPS_IS_MORPHEUS(ha) || IPS_IS_MARCO(ha)) {
 594                /* morpheus / marco / sebring */
 595                ha->func.isintr = ips_isintr_morpheus;
 596                ha->func.isinit = ips_isinit_morpheus;
 597                ha->func.issue = ips_issue_i2o_memio;
 598                ha->func.init = ips_init_morpheus;
 599                ha->func.statupd = ips_statupd_morpheus;
 600                ha->func.reset = ips_reset_morpheus;
 601                ha->func.intr = ips_intr_morpheus;
 602                ha->func.enableint = ips_enable_int_morpheus;
 603        } else if (IPS_USE_MEMIO(ha)) {
 604                /* copperhead w/MEMIO */
 605                ha->func.isintr = ips_isintr_copperhead_memio;
 606                ha->func.isinit = ips_isinit_copperhead_memio;
 607                ha->func.init = ips_init_copperhead_memio;
 608                ha->func.statupd = ips_statupd_copperhead_memio;
 609                ha->func.statinit = ips_statinit_memio;
 610                ha->func.reset = ips_reset_copperhead_memio;
 611                ha->func.intr = ips_intr_copperhead;
 612                ha->func.erasebios = ips_erase_bios_memio;
 613                ha->func.programbios = ips_program_bios_memio;
 614                ha->func.verifybios = ips_verify_bios_memio;
 615                ha->func.enableint = ips_enable_int_copperhead_memio;
 616                if (IPS_USE_I2O_DELIVER(ha))
 617                        ha->func.issue = ips_issue_i2o_memio;
 618                else
 619                        ha->func.issue = ips_issue_copperhead_memio;
 620        } else {
 621                /* copperhead */
 622                ha->func.isintr = ips_isintr_copperhead;
 623                ha->func.isinit = ips_isinit_copperhead;
 624                ha->func.init = ips_init_copperhead;
 625                ha->func.statupd = ips_statupd_copperhead;
 626                ha->func.statinit = ips_statinit;
 627                ha->func.reset = ips_reset_copperhead;
 628                ha->func.intr = ips_intr_copperhead;
 629                ha->func.erasebios = ips_erase_bios;
 630                ha->func.programbios = ips_program_bios;
 631                ha->func.verifybios = ips_verify_bios;
 632                ha->func.enableint = ips_enable_int_copperhead;
 633
 634                if (IPS_USE_I2O_DELIVER(ha))
 635                        ha->func.issue = ips_issue_i2o;
 636                else
 637                        ha->func.issue = ips_issue_copperhead;
 638        }
 639}
 640
 641/****************************************************************************/
 642/*                                                                          */
 643/* Routine Name: ips_release                                                */
 644/*                                                                          */
 645/* Routine Description:                                                     */
 646/*                                                                          */
 647/*   Remove a driver                                                        */
 648/*                                                                          */
 649/****************************************************************************/
 650static int
 651ips_release(struct Scsi_Host *sh)
 652{
 653        ips_scb_t *scb;
 654        ips_ha_t *ha;
 655        int i;
 656
 657        METHOD_TRACE("ips_release", 1);
 658
 659        scsi_remove_host(sh);
 660
 661        for (i = 0; i < IPS_MAX_ADAPTERS && ips_sh[i] != sh; i++) ;
 662
 663        if (i == IPS_MAX_ADAPTERS) {
 664                printk(KERN_WARNING
 665                       "(%s) release, invalid Scsi_Host pointer.\n", ips_name);
 666                BUG();
 667                return (FALSE);
 668        }
 669
 670        ha = IPS_HA(sh);
 671
 672        if (!ha)
 673                return (FALSE);
 674
 675        /* flush the cache on the controller */
 676        scb = &ha->scbs[ha->max_cmds - 1];
 677
 678        ips_init_scb(ha, scb);
 679
 680        scb->timeout = ips_cmd_timeout;
 681        scb->cdb[0] = IPS_CMD_FLUSH;
 682
 683        scb->cmd.flush_cache.op_code = IPS_CMD_FLUSH;
 684        scb->cmd.flush_cache.command_id = IPS_COMMAND_ID(ha, scb);
 685        scb->cmd.flush_cache.state = IPS_NORM_STATE;
 686        scb->cmd.flush_cache.reserved = 0;
 687        scb->cmd.flush_cache.reserved2 = 0;
 688        scb->cmd.flush_cache.reserved3 = 0;
 689        scb->cmd.flush_cache.reserved4 = 0;
 690
 691        IPS_PRINTK(KERN_WARNING, ha->pcidev, "Flushing Cache.\n");
 692
 693        /* send command */
 694        if (ips_send_wait(ha, scb, ips_cmd_timeout, IPS_INTR_ON) == IPS_FAILURE)
 695                IPS_PRINTK(KERN_WARNING, ha->pcidev, "Incomplete Flush.\n");
 696
 697        IPS_PRINTK(KERN_WARNING, ha->pcidev, "Flushing Complete.\n");
 698
 699        ips_sh[i] = NULL;
 700        ips_ha[i] = NULL;
 701
 702        /* free extra memory */
 703        ips_free(ha);
 704
 705        /* free IRQ */
 706        free_irq(ha->pcidev->irq, ha);
 707
 708        scsi_host_put(sh);
 709
 710        ips_released_controllers++;
 711
 712        return (FALSE);
 713}
 714
 715/****************************************************************************/
 716/*                                                                          */
 717/* Routine Name: ips_halt                                                   */
 718/*                                                                          */
 719/* Routine Description:                                                     */
 720/*                                                                          */
 721/*   Perform cleanup when the system reboots                                */
 722/*                                                                          */
 723/****************************************************************************/
 724static int
 725ips_halt(struct notifier_block *nb, ulong event, void *buf)
 726{
 727        ips_scb_t *scb;
 728        ips_ha_t *ha;
 729        int i;
 730
 731        if ((event != SYS_RESTART) && (event != SYS_HALT) &&
 732            (event != SYS_POWER_OFF))
 733                return (NOTIFY_DONE);
 734
 735        for (i = 0; i < ips_next_controller; i++) {
 736                ha = (ips_ha_t *) ips_ha[i];
 737
 738                if (!ha)
 739                        continue;
 740
 741                if (!ha->active)
 742                        continue;
 743
 744                /* flush the cache on the controller */
 745                scb = &ha->scbs[ha->max_cmds - 1];
 746
 747                ips_init_scb(ha, scb);
 748
 749                scb->timeout = ips_cmd_timeout;
 750                scb->cdb[0] = IPS_CMD_FLUSH;
 751
 752                scb->cmd.flush_cache.op_code = IPS_CMD_FLUSH;
 753                scb->cmd.flush_cache.command_id = IPS_COMMAND_ID(ha, scb);
 754                scb->cmd.flush_cache.state = IPS_NORM_STATE;
 755                scb->cmd.flush_cache.reserved = 0;
 756                scb->cmd.flush_cache.reserved2 = 0;
 757                scb->cmd.flush_cache.reserved3 = 0;
 758                scb->cmd.flush_cache.reserved4 = 0;
 759
 760                IPS_PRINTK(KERN_WARNING, ha->pcidev, "Flushing Cache.\n");
 761
 762                /* send command */
 763                if (ips_send_wait(ha, scb, ips_cmd_timeout, IPS_INTR_ON) ==
 764                    IPS_FAILURE)
 765                        IPS_PRINTK(KERN_WARNING, ha->pcidev,
 766                                   "Incomplete Flush.\n");
 767                else
 768                        IPS_PRINTK(KERN_WARNING, ha->pcidev,
 769                                   "Flushing Complete.\n");
 770        }
 771
 772        return (NOTIFY_OK);
 773}
 774
 775/****************************************************************************/
 776/*                                                                          */
 777/* Routine Name: ips_eh_abort                                               */
 778/*                                                                          */
 779/* Routine Description:                                                     */
 780/*                                                                          */
 781/*   Abort a command (using the new error code stuff)                       */
 782/* Note: this routine is called under the io_request_lock                   */
 783/****************************************************************************/
 784int ips_eh_abort(struct scsi_cmnd *SC)
 785{
 786        ips_ha_t *ha;
 787        ips_copp_wait_item_t *item;
 788        int ret;
 789        struct Scsi_Host *host;
 790
 791        METHOD_TRACE("ips_eh_abort", 1);
 792
 793        if (!SC)
 794                return (FAILED);
 795
 796        host = SC->device->host;
 797        ha = (ips_ha_t *) SC->device->host->hostdata;
 798
 799        if (!ha)
 800                return (FAILED);
 801
 802        if (!ha->active)
 803                return (FAILED);
 804
 805        spin_lock(host->host_lock);
 806
 807        /* See if the command is on the copp queue */
 808        item = ha->copp_waitlist.head;
 809        while ((item) && (item->scsi_cmd != SC))
 810                item = item->next;
 811
 812        if (item) {
 813                /* Found it */
 814                ips_removeq_copp(&ha->copp_waitlist, item);
 815                ret = (SUCCESS);
 816
 817                /* See if the command is on the wait queue */
 818        } else if (ips_removeq_wait(&ha->scb_waitlist, SC)) {
 819                /* command not sent yet */
 820                ret = (SUCCESS);
 821        } else {
 822                /* command must have already been sent */
 823                ret = (FAILED);
 824        }
 825
 826        spin_unlock(host->host_lock);
 827        return ret;
 828}
 829
 830/****************************************************************************/
 831/*                                                                          */
 832/* Routine Name: ips_eh_reset                                               */
 833/*                                                                          */
 834/* Routine Description:                                                     */
 835/*                                                                          */
 836/*   Reset the controller (with new eh error code)                          */
 837/*                                                                          */
 838/* NOTE: this routine is called under the io_request_lock spinlock          */
 839/*                                                                          */
 840/****************************************************************************/
 841static int __ips_eh_reset(struct scsi_cmnd *SC)
 842{
 843        int ret;
 844        int i;
 845        ips_ha_t *ha;
 846        ips_scb_t *scb;
 847        ips_copp_wait_item_t *item;
 848
 849        METHOD_TRACE("ips_eh_reset", 1);
 850
 851#ifdef NO_IPS_RESET
 852        return (FAILED);
 853#else
 854
 855        if (!SC) {
 856                DEBUG(1, "Reset called with NULL scsi command");
 857
 858                return (FAILED);
 859        }
 860
 861        ha = (ips_ha_t *) SC->device->host->hostdata;
 862
 863        if (!ha) {
 864                DEBUG(1, "Reset called with NULL ha struct");
 865
 866                return (FAILED);
 867        }
 868
 869        if (!ha->active)
 870                return (FAILED);
 871
 872        /* See if the command is on the copp queue */
 873        item = ha->copp_waitlist.head;
 874        while ((item) && (item->scsi_cmd != SC))
 875                item = item->next;
 876
 877        if (item) {
 878                /* Found it */
 879                ips_removeq_copp(&ha->copp_waitlist, item);
 880                return (SUCCESS);
 881        }
 882
 883        /* See if the command is on the wait queue */
 884        if (ips_removeq_wait(&ha->scb_waitlist, SC)) {
 885                /* command not sent yet */
 886                return (SUCCESS);
 887        }
 888
 889        /* An explanation for the casual observer:                              */
 890        /* Part of the function of a RAID controller is automatic error         */
 891        /* detection and recovery.  As such, the only problem that physically   */
 892        /* resetting an adapter will ever fix is when, for some reason,         */
 893        /* the driver is not successfully communicating with the adapter.       */
 894        /* Therefore, we will attempt to flush this adapter.  If that succeeds, */
 895        /* then there's no real purpose in a physical reset. This will complete */
 896        /* much faster and avoids any problems that might be caused by a        */
 897        /* physical reset ( such as having to fail all the outstanding I/O's ). */
 898
 899        if (ha->ioctl_reset == 0) {     /* IF Not an IOCTL Requested Reset */
 900                scb = &ha->scbs[ha->max_cmds - 1];
 901
 902                ips_init_scb(ha, scb);
 903
 904                scb->timeout = ips_cmd_timeout;
 905                scb->cdb[0] = IPS_CMD_FLUSH;
 906
 907                scb->cmd.flush_cache.op_code = IPS_CMD_FLUSH;
 908                scb->cmd.flush_cache.command_id = IPS_COMMAND_ID(ha, scb);
 909                scb->cmd.flush_cache.state = IPS_NORM_STATE;
 910                scb->cmd.flush_cache.reserved = 0;
 911                scb->cmd.flush_cache.reserved2 = 0;
 912                scb->cmd.flush_cache.reserved3 = 0;
 913                scb->cmd.flush_cache.reserved4 = 0;
 914
 915                /* Attempt the flush command */
 916                ret = ips_send_wait(ha, scb, ips_cmd_timeout, IPS_INTR_IORL);
 917                if (ret == IPS_SUCCESS) {
 918                        IPS_PRINTK(KERN_NOTICE, ha->pcidev,
 919                                   "Reset Request - Flushed Cache\n");
 920                        return (SUCCESS);
 921                }
 922        }
 923
 924        /* Either we can't communicate with the adapter or it's an IOCTL request */
 925        /* from a utility.  A physical reset is needed at this point.            */
 926
 927        ha->ioctl_reset = 0;    /* Reset the IOCTL Requested Reset Flag */
 928
 929        /*
 930         * command must have already been sent
 931         * reset the controller
 932         */
 933        IPS_PRINTK(KERN_NOTICE, ha->pcidev, "Resetting controller.\n");
 934        ret = (*ha->func.reset) (ha);
 935
 936        if (!ret) {
 937                struct scsi_cmnd *scsi_cmd;
 938
 939                IPS_PRINTK(KERN_NOTICE, ha->pcidev,
 940                           "Controller reset failed - controller now offline.\n");
 941
 942                /* Now fail all of the active commands */
 943                DEBUG_VAR(1, "(%s%d) Failing active commands",
 944                          ips_name, ha->host_num);
 945
 946                while ((scb = ips_removeq_scb_head(&ha->scb_activelist))) {
 947                        scb->scsi_cmd->result = DID_ERROR << 16;
 948                        scb->scsi_cmd->scsi_done(scb->scsi_cmd);
 949                        ips_freescb(ha, scb);
 950                }
 951
 952                /* Now fail all of the pending commands */
 953                DEBUG_VAR(1, "(%s%d) Failing pending commands",
 954                          ips_name, ha->host_num);
 955
 956                while ((scsi_cmd = ips_removeq_wait_head(&ha->scb_waitlist))) {
 957                        scsi_cmd->result = DID_ERROR;
 958                        scsi_cmd->scsi_done(scsi_cmd);
 959                }
 960
 961                ha->active = FALSE;
 962                return (FAILED);
 963        }
 964
 965        if (!ips_clear_adapter(ha, IPS_INTR_IORL)) {
 966                struct scsi_cmnd *scsi_cmd;
 967
 968                IPS_PRINTK(KERN_NOTICE, ha->pcidev,
 969                           "Controller reset failed - controller now offline.\n");
 970
 971                /* Now fail all of the active commands */
 972                DEBUG_VAR(1, "(%s%d) Failing active commands",
 973                          ips_name, ha->host_num);
 974
 975                while ((scb = ips_removeq_scb_head(&ha->scb_activelist))) {
 976                        scb->scsi_cmd->result = DID_ERROR << 16;
 977                        scb->scsi_cmd->scsi_done(scb->scsi_cmd);
 978                        ips_freescb(ha, scb);
 979                }
 980
 981                /* Now fail all of the pending commands */
 982                DEBUG_VAR(1, "(%s%d) Failing pending commands",
 983                          ips_name, ha->host_num);
 984
 985                while ((scsi_cmd = ips_removeq_wait_head(&ha->scb_waitlist))) {
 986                        scsi_cmd->result = DID_ERROR << 16;
 987                        scsi_cmd->scsi_done(scsi_cmd);
 988                }
 989
 990                ha->active = FALSE;
 991                return (FAILED);
 992        }
 993
 994        /* FFDC */
 995        if (le32_to_cpu(ha->subsys->param[3]) & 0x300000) {
 996                struct timeval tv;
 997
 998                do_gettimeofday(&tv);
 999                ha->last_ffdc = tv.tv_sec;
1000                ha->reset_count++;
1001                ips_ffdc_reset(ha, IPS_INTR_IORL);
1002        }
1003
1004        /* Now fail all of the active commands */
1005        DEBUG_VAR(1, "(%s%d) Failing active commands", ips_name, ha->host_num);
1006
1007        while ((scb = ips_removeq_scb_head(&ha->scb_activelist))) {
1008                scb->scsi_cmd->result = DID_RESET << 16;
1009                scb->scsi_cmd->scsi_done(scb->scsi_cmd);
1010                ips_freescb(ha, scb);
1011        }
1012
1013        /* Reset DCDB active command bits */
1014        for (i = 1; i < ha->nbus; i++)
1015                ha->dcdb_active[i - 1] = 0;
1016
1017        /* Reset the number of active IOCTLs */
1018        ha->num_ioctl = 0;
1019
1020        ips_next(ha, IPS_INTR_IORL);
1021
1022        return (SUCCESS);
1023#endif                          /* NO_IPS_RESET */
1024
1025}
1026
1027static int ips_eh_reset(struct scsi_cmnd *SC)
1028{
1029        int rc;
1030
1031        spin_lock_irq(SC->device->host->host_lock);
1032        rc = __ips_eh_reset(SC);
1033        spin_unlock_irq(SC->device->host->host_lock);
1034
1035        return rc;
1036}
1037
1038/****************************************************************************/
1039/*                                                                          */
1040/* Routine Name: ips_queue                                                  */
1041/*                                                                          */
1042/* Routine Description:                                                     */
1043/*                                                                          */
1044/*   Send a command to the controller                                       */
1045/*                                                                          */
1046/* NOTE:                                                                    */
1047/*    Linux obtains io_request_lock before calling this function            */
1048/*                                                                          */
1049/****************************************************************************/
1050static int ips_queue_lck(struct scsi_cmnd *SC, void (*done) (struct scsi_cmnd *))
1051{
1052        ips_ha_t *ha;
1053        ips_passthru_t *pt;
1054
1055        METHOD_TRACE("ips_queue", 1);
1056
1057        ha = (ips_ha_t *) SC->device->host->hostdata;
1058
1059        if (!ha)
1060                return (1);
1061
1062        if (!ha->active)
1063                return (DID_ERROR);
1064
1065        if (ips_is_passthru(SC)) {
1066                if (ha->copp_waitlist.count == IPS_MAX_IOCTL_QUEUE) {
1067                        SC->result = DID_BUS_BUSY << 16;
1068                        done(SC);
1069
1070                        return (0);
1071                }
1072        } else if (ha->scb_waitlist.count == IPS_MAX_QUEUE) {
1073                SC->result = DID_BUS_BUSY << 16;
1074                done(SC);
1075
1076                return (0);
1077        }
1078
1079        SC->scsi_done = done;
1080
1081        DEBUG_VAR(2, "(%s%d): ips_queue: cmd 0x%X (%d %d %d)",
1082                  ips_name,
1083                  ha->host_num,
1084                  SC->cmnd[0],
1085                  SC->device->channel, SC->device->id, SC->device->lun);
1086
1087        /* Check for command to initiator IDs */
1088        if ((scmd_channel(SC) > 0)
1089            && (scmd_id(SC) == ha->ha_id[scmd_channel(SC)])) {
1090                SC->result = DID_NO_CONNECT << 16;
1091                done(SC);
1092
1093                return (0);
1094        }
1095
1096        if (ips_is_passthru(SC)) {
1097
1098                ips_copp_wait_item_t *scratch;
1099
1100                /* A Reset IOCTL is only sent by the boot CD in extreme cases.           */
1101                /* There can never be any system activity ( network or disk ), but check */
1102                /* anyway just as a good practice.                                       */
1103                pt = (ips_passthru_t *) scsi_sglist(SC);
1104                if ((pt->CoppCP.cmd.reset.op_code == IPS_CMD_RESET_CHANNEL) &&
1105                    (pt->CoppCP.cmd.reset.adapter_flag == 1)) {
1106                        if (ha->scb_activelist.count != 0) {
1107                                SC->result = DID_BUS_BUSY << 16;
1108                                done(SC);
1109                                return (0);
1110                        }
1111                        ha->ioctl_reset = 1;    /* This reset request is from an IOCTL */
1112                        __ips_eh_reset(SC);
1113                        SC->result = DID_OK << 16;
1114                        SC->scsi_done(SC);
1115                        return (0);
1116                }
1117
1118                /* allocate space for the scribble */
1119                scratch = kmalloc(sizeof (ips_copp_wait_item_t), GFP_ATOMIC);
1120
1121                if (!scratch) {
1122                        SC->result = DID_ERROR << 16;
1123                        done(SC);
1124
1125                        return (0);
1126                }
1127
1128                scratch->scsi_cmd = SC;
1129                scratch->next = NULL;
1130
1131                ips_putq_copp_tail(&ha->copp_waitlist, scratch);
1132        } else {
1133                ips_putq_wait_tail(&ha->scb_waitlist, SC);
1134        }
1135
1136        ips_next(ha, IPS_INTR_IORL);
1137
1138        return (0);
1139}
1140
1141static DEF_SCSI_QCMD(ips_queue)
1142
1143/****************************************************************************/
1144/*                                                                          */
1145/* Routine Name: ips_biosparam                                              */
1146/*                                                                          */
1147/* Routine Description:                                                     */
1148/*                                                                          */
1149/*   Set bios geometry for the controller                                   */
1150/*                                                                          */
1151/****************************************************************************/
1152static int ips_biosparam(struct scsi_device *sdev, struct block_device *bdev,
1153                         sector_t capacity, int geom[])
1154{
1155        ips_ha_t *ha = (ips_ha_t *) sdev->host->hostdata;
1156        int heads;
1157        int sectors;
1158        int cylinders;
1159
1160        METHOD_TRACE("ips_biosparam", 1);
1161
1162        if (!ha)
1163                /* ?!?! host adater info invalid */
1164                return (0);
1165
1166        if (!ha->active)
1167                return (0);
1168
1169        if (!ips_read_adapter_status(ha, IPS_INTR_ON))
1170                /* ?!?! Enquiry command failed */
1171                return (0);
1172
1173        if ((capacity > 0x400000) && ((ha->enq->ucMiscFlag & 0x8) == 0)) {
1174                heads = IPS_NORM_HEADS;
1175                sectors = IPS_NORM_SECTORS;
1176        } else {
1177                heads = IPS_COMP_HEADS;
1178                sectors = IPS_COMP_SECTORS;
1179        }
1180
1181        cylinders = (unsigned long) capacity / (heads * sectors);
1182
1183        DEBUG_VAR(2, "Geometry: heads: %d, sectors: %d, cylinders: %d",
1184                  heads, sectors, cylinders);
1185
1186        geom[0] = heads;
1187        geom[1] = sectors;
1188        geom[2] = cylinders;
1189
1190        return (0);
1191}
1192
1193/****************************************************************************/
1194/*                                                                          */
1195/* Routine Name: ips_slave_configure                                        */
1196/*                                                                          */
1197/* Routine Description:                                                     */
1198/*                                                                          */
1199/*   Set queue depths on devices once scan is complete                      */
1200/*                                                                          */
1201/****************************************************************************/
1202static int
1203ips_slave_configure(struct scsi_device * SDptr)
1204{
1205        ips_ha_t *ha;
1206        int min;
1207
1208        ha = IPS_HA(SDptr->host);
1209        if (SDptr->tagged_supported && SDptr->type == TYPE_DISK) {
1210                min = ha->max_cmds / 2;
1211                if (ha->enq->ucLogDriveCount <= 2)
1212                        min = ha->max_cmds - 1;
1213                scsi_change_queue_depth(SDptr, min);
1214        }
1215
1216        SDptr->skip_ms_page_8 = 1;
1217        SDptr->skip_ms_page_3f = 1;
1218        return 0;
1219}
1220
1221/****************************************************************************/
1222/*                                                                          */
1223/* Routine Name: do_ipsintr                                                 */
1224/*                                                                          */
1225/* Routine Description:                                                     */
1226/*                                                                          */
1227/*   Wrapper for the interrupt handler                                      */
1228/*                                                                          */
1229/****************************************************************************/
1230static irqreturn_t
1231do_ipsintr(int irq, void *dev_id)
1232{
1233        ips_ha_t *ha;
1234        struct Scsi_Host *host;
1235        int irqstatus;
1236
1237        METHOD_TRACE("do_ipsintr", 2);
1238
1239        ha = (ips_ha_t *) dev_id;
1240        if (!ha)
1241                return IRQ_NONE;
1242        host = ips_sh[ha->host_num];
1243        /* interrupt during initialization */
1244        if (!host) {
1245                (*ha->func.intr) (ha);
1246                return IRQ_HANDLED;
1247        }
1248
1249        spin_lock(host->host_lock);
1250
1251        if (!ha->active) {
1252                spin_unlock(host->host_lock);
1253                return IRQ_HANDLED;
1254        }
1255
1256        irqstatus = (*ha->func.intr) (ha);
1257
1258        spin_unlock(host->host_lock);
1259
1260        /* start the next command */
1261        ips_next(ha, IPS_INTR_ON);
1262        return IRQ_RETVAL(irqstatus);
1263}
1264
1265/****************************************************************************/
1266/*                                                                          */
1267/* Routine Name: ips_intr_copperhead                                        */
1268/*                                                                          */
1269/* Routine Description:                                                     */
1270/*                                                                          */
1271/*   Polling interrupt handler                                              */
1272/*                                                                          */
1273/*   ASSUMES interrupts are disabled                                        */
1274/*                                                                          */
1275/****************************************************************************/
1276int
1277ips_intr_copperhead(ips_ha_t * ha)
1278{
1279        ips_stat_t *sp;
1280        ips_scb_t *scb;
1281        IPS_STATUS cstatus;
1282        int intrstatus;
1283
1284        METHOD_TRACE("ips_intr", 2);
1285
1286        if (!ha)
1287                return 0;
1288
1289        if (!ha->active)
1290                return 0;
1291
1292        intrstatus = (*ha->func.isintr) (ha);
1293
1294        if (!intrstatus) {
1295                /*
1296                 * Unexpected/Shared interrupt
1297                 */
1298
1299                return 0;
1300        }
1301
1302        while (TRUE) {
1303                sp = &ha->sp;
1304
1305                intrstatus = (*ha->func.isintr) (ha);
1306
1307                if (!intrstatus)
1308                        break;
1309                else
1310                        cstatus.value = (*ha->func.statupd) (ha);
1311
1312                if (cstatus.fields.command_id > (IPS_MAX_CMDS - 1)) {
1313                        /* Spurious Interrupt ? */
1314                        continue;
1315                }
1316
1317                ips_chkstatus(ha, &cstatus);
1318                scb = (ips_scb_t *) sp->scb_addr;
1319
1320                /*
1321                 * use the callback function to finish things up
1322                 * NOTE: interrupts are OFF for this
1323                 */
1324                (*scb->callback) (ha, scb);
1325        }                       /* end while */
1326        return 1;
1327}
1328
1329/****************************************************************************/
1330/*                                                                          */
1331/* Routine Name: ips_intr_morpheus                                          */
1332/*                                                                          */
1333/* Routine Description:                                                     */
1334/*                                                                          */
1335/*   Polling interrupt handler                                              */
1336/*                                                                          */
1337/*   ASSUMES interrupts are disabled                                        */
1338/*                                                                          */
1339/****************************************************************************/
1340int
1341ips_intr_morpheus(ips_ha_t * ha)
1342{
1343        ips_stat_t *sp;
1344        ips_scb_t *scb;
1345        IPS_STATUS cstatus;
1346        int intrstatus;
1347
1348        METHOD_TRACE("ips_intr_morpheus", 2);
1349
1350        if (!ha)
1351                return 0;
1352
1353        if (!ha->active)
1354                return 0;
1355
1356        intrstatus = (*ha->func.isintr) (ha);
1357
1358        if (!intrstatus) {
1359                /*
1360                 * Unexpected/Shared interrupt
1361                 */
1362
1363                return 0;
1364        }
1365
1366        while (TRUE) {
1367                sp = &ha->sp;
1368
1369                intrstatus = (*ha->func.isintr) (ha);
1370
1371                if (!intrstatus)
1372                        break;
1373                else
1374                        cstatus.value = (*ha->func.statupd) (ha);
1375
1376                if (cstatus.value == 0xffffffff)
1377                        /* No more to process */
1378                        break;
1379
1380                if (cstatus.fields.command_id > (IPS_MAX_CMDS - 1)) {
1381                        IPS_PRINTK(KERN_WARNING, ha->pcidev,
1382                                   "Spurious interrupt; no ccb.\n");
1383
1384                        continue;
1385                }
1386
1387                ips_chkstatus(ha, &cstatus);
1388                scb = (ips_scb_t *) sp->scb_addr;
1389
1390                /*
1391                 * use the callback function to finish things up
1392                 * NOTE: interrupts are OFF for this
1393                 */
1394                (*scb->callback) (ha, scb);
1395        }                       /* end while */
1396        return 1;
1397}
1398
1399/****************************************************************************/
1400/*                                                                          */
1401/* Routine Name: ips_info                                                   */
1402/*                                                                          */
1403/* Routine Description:                                                     */
1404/*                                                                          */
1405/*   Return info about the driver                                           */
1406/*                                                                          */
1407/****************************************************************************/
1408static const char *
1409ips_info(struct Scsi_Host *SH)
1410{
1411        static char buffer[256];
1412        char *bp;
1413        ips_ha_t *ha;
1414
1415        METHOD_TRACE("ips_info", 1);
1416
1417        ha = IPS_HA(SH);
1418
1419        if (!ha)
1420                return (NULL);
1421
1422        bp = &buffer[0];
1423        memset(bp, 0, sizeof (buffer));
1424
1425        sprintf(bp, "%s%s%s Build %d", "IBM PCI ServeRAID ",
1426                IPS_VERSION_HIGH, IPS_VERSION_LOW, IPS_BUILD_IDENT);
1427
1428        if (ha->ad_type > 0 && ha->ad_type <= MAX_ADAPTER_NAME) {
1429                strcat(bp, " <");
1430                strcat(bp, ips_adapter_name[ha->ad_type - 1]);
1431                strcat(bp, ">");
1432        }
1433
1434        return (bp);
1435}
1436
1437static int
1438ips_write_info(struct Scsi_Host *host, char *buffer, int length)
1439{
1440        int i;
1441        ips_ha_t *ha = NULL;
1442
1443        /* Find our host structure */
1444        for (i = 0; i < ips_next_controller; i++) {
1445                if (ips_sh[i]) {
1446                        if (ips_sh[i] == host) {
1447                                ha = (ips_ha_t *) ips_sh[i]->hostdata;
1448                                break;
1449                        }
1450                }
1451        }
1452
1453        if (!ha)
1454                return (-EINVAL);
1455
1456        return 0;
1457}
1458
1459static int
1460ips_show_info(struct seq_file *m, struct Scsi_Host *host)
1461{
1462        int i;
1463        ips_ha_t *ha = NULL;
1464
1465        /* Find our host structure */
1466        for (i = 0; i < ips_next_controller; i++) {
1467                if (ips_sh[i]) {
1468                        if (ips_sh[i] == host) {
1469                                ha = (ips_ha_t *) ips_sh[i]->hostdata;
1470                                break;
1471                        }
1472                }
1473        }
1474
1475        if (!ha)
1476                return (-EINVAL);
1477
1478        return ips_host_info(ha, m);
1479}
1480
1481/*--------------------------------------------------------------------------*/
1482/* Helper Functions                                                         */
1483/*--------------------------------------------------------------------------*/
1484
1485/****************************************************************************/
1486/*                                                                          */
1487/* Routine Name: ips_is_passthru                                            */
1488/*                                                                          */
1489/* Routine Description:                                                     */
1490/*                                                                          */
1491/*   Determine if the specified SCSI command is really a passthru command   */
1492/*                                                                          */
1493/****************************************************************************/
1494static int ips_is_passthru(struct scsi_cmnd *SC)
1495{
1496        unsigned long flags;
1497
1498        METHOD_TRACE("ips_is_passthru", 1);
1499
1500        if (!SC)
1501                return (0);
1502
1503        if ((SC->cmnd[0] == IPS_IOCTL_COMMAND) &&
1504            (SC->device->channel == 0) &&
1505            (SC->device->id == IPS_ADAPTER_ID) &&
1506            (SC->device->lun == 0) && scsi_sglist(SC)) {
1507                struct scatterlist *sg = scsi_sglist(SC);
1508                char  *buffer;
1509
1510                /* kmap_atomic() ensures addressability of the user buffer.*/
1511                /* local_irq_save() protects the KM_IRQ0 address slot.     */
1512                local_irq_save(flags);
1513                buffer = kmap_atomic(sg_page(sg)) + sg->offset;
1514                if (buffer && buffer[0] == 'C' && buffer[1] == 'O' &&
1515                    buffer[2] == 'P' && buffer[3] == 'P') {
1516                        kunmap_atomic(buffer - sg->offset);
1517                        local_irq_restore(flags);
1518                        return 1;
1519                }
1520                kunmap_atomic(buffer - sg->offset);
1521                local_irq_restore(flags);
1522        }
1523        return 0;
1524}
1525
1526/****************************************************************************/
1527/*                                                                          */
1528/* Routine Name: ips_alloc_passthru_buffer                                  */
1529/*                                                                          */
1530/* Routine Description:                                                     */
1531/*   allocate a buffer large enough for the ioctl data if the ioctl buffer  */
1532/*   is too small or doesn't exist                                          */
1533/****************************************************************************/
1534static int
1535ips_alloc_passthru_buffer(ips_ha_t * ha, int length)
1536{
1537        void *bigger_buf;
1538        dma_addr_t dma_busaddr;
1539
1540        if (ha->ioctl_data && length <= ha->ioctl_len)
1541                return 0;
1542        /* there is no buffer or it's not big enough, allocate a new one */
1543        bigger_buf = pci_alloc_consistent(ha->pcidev, length, &dma_busaddr);
1544        if (bigger_buf) {
1545                /* free the old memory */
1546                pci_free_consistent(ha->pcidev, ha->ioctl_len, ha->ioctl_data,
1547                                    ha->ioctl_busaddr);
1548                /* use the new memory */
1549                ha->ioctl_data = (char *) bigger_buf;
1550                ha->ioctl_len = length;
1551                ha->ioctl_busaddr = dma_busaddr;
1552        } else {
1553                return -1;
1554        }
1555        return 0;
1556}
1557
1558/****************************************************************************/
1559/*                                                                          */
1560/* Routine Name: ips_make_passthru                                          */
1561/*                                                                          */
1562/* Routine Description:                                                     */
1563/*                                                                          */
1564/*   Make a passthru command out of the info in the Scsi block              */
1565/*                                                                          */
1566/****************************************************************************/
1567static int
1568ips_make_passthru(ips_ha_t *ha, struct scsi_cmnd *SC, ips_scb_t *scb, int intr)
1569{
1570        ips_passthru_t *pt;
1571        int length = 0;
1572        int i, ret;
1573        struct scatterlist *sg = scsi_sglist(SC);
1574
1575        METHOD_TRACE("ips_make_passthru", 1);
1576
1577        scsi_for_each_sg(SC, sg, scsi_sg_count(SC), i)
1578                length += sg->length;
1579
1580        if (length < sizeof (ips_passthru_t)) {
1581                /* wrong size */
1582                DEBUG_VAR(1, "(%s%d) Passthru structure wrong size",
1583                          ips_name, ha->host_num);
1584                return (IPS_FAILURE);
1585        }
1586        if (ips_alloc_passthru_buffer(ha, length)) {
1587                /* allocation failure!  If ha->ioctl_data exists, use it to return
1588                   some error codes.  Return a failed command to the scsi layer. */
1589                if (ha->ioctl_data) {
1590                        pt = (ips_passthru_t *) ha->ioctl_data;
1591                        ips_scmd_buf_read(SC, pt, sizeof (ips_passthru_t));
1592                        pt->BasicStatus = 0x0B;
1593                        pt->ExtendedStatus = 0x00;
1594                        ips_scmd_buf_write(SC, pt, sizeof (ips_passthru_t));
1595                }
1596                return IPS_FAILURE;
1597        }
1598        ha->ioctl_datasize = length;
1599
1600        ips_scmd_buf_read(SC, ha->ioctl_data, ha->ioctl_datasize);
1601        pt = (ips_passthru_t *) ha->ioctl_data;
1602
1603        /*
1604         * Some notes about the passthru interface used
1605         *
1606         * IF the scsi op_code == 0x0d then we assume
1607         * that the data came along with/goes with the
1608         * packet we received from the sg driver. In this
1609         * case the CmdBSize field of the pt structure is
1610         * used for the size of the buffer.
1611         */
1612
1613        switch (pt->CoppCmd) {
1614        case IPS_NUMCTRLS:
1615                memcpy(ha->ioctl_data + sizeof (ips_passthru_t),
1616                       &ips_num_controllers, sizeof (int));
1617                ips_scmd_buf_write(SC, ha->ioctl_data,
1618                                   sizeof (ips_passthru_t) + sizeof (int));
1619                SC->result = DID_OK << 16;
1620
1621                return (IPS_SUCCESS_IMM);
1622
1623        case IPS_COPPUSRCMD:
1624        case IPS_COPPIOCCMD:
1625                if (SC->cmnd[0] == IPS_IOCTL_COMMAND) {
1626                        if (length < (sizeof (ips_passthru_t) + pt->CmdBSize)) {
1627                                /* wrong size */
1628                                DEBUG_VAR(1,
1629                                          "(%s%d) Passthru structure wrong size",
1630                                          ips_name, ha->host_num);
1631
1632                                return (IPS_FAILURE);
1633                        }
1634
1635                        if (ha->pcidev->device == IPS_DEVICEID_COPPERHEAD &&
1636                            pt->CoppCP.cmd.flashfw.op_code ==
1637                            IPS_CMD_RW_BIOSFW) {
1638                                ret = ips_flash_copperhead(ha, pt, scb);
1639                                ips_scmd_buf_write(SC, ha->ioctl_data,
1640                                                   sizeof (ips_passthru_t));
1641                                return ret;
1642                        }
1643                        if (ips_usrcmd(ha, pt, scb))
1644                                return (IPS_SUCCESS);
1645                        else
1646                                return (IPS_FAILURE);
1647                }
1648
1649                break;
1650
1651        }                       /* end switch */
1652
1653        return (IPS_FAILURE);
1654}
1655
1656/****************************************************************************/
1657/* Routine Name: ips_flash_copperhead                                       */
1658/* Routine Description:                                                     */
1659/*   Flash the BIOS/FW on a Copperhead style controller                     */
1660/****************************************************************************/
1661static int
1662ips_flash_copperhead(ips_ha_t * ha, ips_passthru_t * pt, ips_scb_t * scb)
1663{
1664        int datasize;
1665
1666        /* Trombone is the only copperhead that can do packet flash, but only
1667         * for firmware. No one said it had to make sense. */
1668        if (IPS_IS_TROMBONE(ha) && pt->CoppCP.cmd.flashfw.type == IPS_FW_IMAGE) {
1669                if (ips_usrcmd(ha, pt, scb))
1670                        return IPS_SUCCESS;
1671                else
1672                        return IPS_FAILURE;
1673        }
1674        pt->BasicStatus = 0x0B;
1675        pt->ExtendedStatus = 0;
1676        scb->scsi_cmd->result = DID_OK << 16;
1677        /* IF it's OK to Use the "CD BOOT" Flash Buffer, then you can     */
1678        /* avoid allocating a huge buffer per adapter ( which can fail ). */
1679        if (pt->CoppCP.cmd.flashfw.type == IPS_BIOS_IMAGE &&
1680            pt->CoppCP.cmd.flashfw.direction == IPS_ERASE_BIOS) {
1681                pt->BasicStatus = 0;
1682                return ips_flash_bios(ha, pt, scb);
1683        } else if (pt->CoppCP.cmd.flashfw.packet_num == 0) {
1684                if (ips_FlashData && !test_and_set_bit(0, &ips_FlashDataInUse)){
1685                        ha->flash_data = ips_FlashData;
1686                        ha->flash_busaddr = ips_flashbusaddr;
1687                        ha->flash_len = PAGE_SIZE << 7;
1688                        ha->flash_datasize = 0;
1689                } else if (!ha->flash_data) {
1690                        datasize = pt->CoppCP.cmd.flashfw.total_packets *
1691                            pt->CoppCP.cmd.flashfw.count;
1692                        ha->flash_data = pci_alloc_consistent(ha->pcidev,
1693                                                              datasize,
1694                                                              &ha->flash_busaddr);
1695                        if (!ha->flash_data){
1696                                printk(KERN_WARNING "Unable to allocate a flash buffer\n");
1697                                return IPS_FAILURE;
1698                        }
1699                        ha->flash_datasize = 0;
1700                        ha->flash_len = datasize;
1701                } else
1702                        return IPS_FAILURE;
1703        } else {
1704                if (pt->CoppCP.cmd.flashfw.count + ha->flash_datasize >
1705                    ha->flash_len) {
1706                        ips_free_flash_copperhead(ha);
1707                        IPS_PRINTK(KERN_WARNING, ha->pcidev,
1708                                   "failed size sanity check\n");
1709                        return IPS_FAILURE;
1710                }
1711        }
1712        if (!ha->flash_data)
1713                return IPS_FAILURE;
1714        pt->BasicStatus = 0;
1715        memcpy(&ha->flash_data[ha->flash_datasize], pt + 1,
1716               pt->CoppCP.cmd.flashfw.count);
1717        ha->flash_datasize += pt->CoppCP.cmd.flashfw.count;
1718        if (pt->CoppCP.cmd.flashfw.packet_num ==
1719            pt->CoppCP.cmd.flashfw.total_packets - 1) {
1720                if (pt->CoppCP.cmd.flashfw.type == IPS_BIOS_IMAGE)
1721                        return ips_flash_bios(ha, pt, scb);
1722                else if (pt->CoppCP.cmd.flashfw.type == IPS_FW_IMAGE)
1723                        return ips_flash_firmware(ha, pt, scb);
1724        }
1725        return IPS_SUCCESS_IMM;
1726}
1727
1728/****************************************************************************/
1729/* Routine Name: ips_flash_bios                                             */
1730/* Routine Description:                                                     */
1731/*   flashes the bios of a copperhead adapter                               */
1732/****************************************************************************/
1733static int
1734ips_flash_bios(ips_ha_t * ha, ips_passthru_t * pt, ips_scb_t * scb)
1735{
1736
1737        if (pt->CoppCP.cmd.flashfw.type == IPS_BIOS_IMAGE &&
1738            pt->CoppCP.cmd.flashfw.direction == IPS_WRITE_BIOS) {
1739                if ((!ha->func.programbios) || (!ha->func.erasebios) ||
1740                    (!ha->func.verifybios))
1741                        goto error;
1742                if ((*ha->func.erasebios) (ha)) {
1743                        DEBUG_VAR(1,
1744                                  "(%s%d) flash bios failed - unable to erase flash",
1745                                  ips_name, ha->host_num);
1746                        goto error;
1747                } else
1748                    if ((*ha->func.programbios) (ha,
1749                                                 ha->flash_data +
1750                                                 IPS_BIOS_HEADER,
1751                                                 ha->flash_datasize -
1752                                                 IPS_BIOS_HEADER, 0)) {
1753                        DEBUG_VAR(1,
1754                                  "(%s%d) flash bios failed - unable to flash",
1755                                  ips_name, ha->host_num);
1756                        goto error;
1757                } else
1758                    if ((*ha->func.verifybios) (ha,
1759                                                ha->flash_data +
1760                                                IPS_BIOS_HEADER,
1761                                                ha->flash_datasize -
1762                                                IPS_BIOS_HEADER, 0)) {
1763                        DEBUG_VAR(1,
1764                                  "(%s%d) flash bios failed - unable to verify flash",
1765                                  ips_name, ha->host_num);
1766                        goto error;
1767                }
1768                ips_free_flash_copperhead(ha);
1769                return IPS_SUCCESS_IMM;
1770        } else if (pt->CoppCP.cmd.flashfw.type == IPS_BIOS_IMAGE &&
1771                   pt->CoppCP.cmd.flashfw.direction == IPS_ERASE_BIOS) {
1772                if (!ha->func.erasebios)
1773                        goto error;
1774                if ((*ha->func.erasebios) (ha)) {
1775                        DEBUG_VAR(1,
1776                                  "(%s%d) flash bios failed - unable to erase flash",
1777                                  ips_name, ha->host_num);
1778                        goto error;
1779                }
1780                return IPS_SUCCESS_IMM;
1781        }
1782      error:
1783        pt->BasicStatus = 0x0B;
1784        pt->ExtendedStatus = 0x00;
1785        ips_free_flash_copperhead(ha);
1786        return IPS_FAILURE;
1787}
1788
1789/****************************************************************************/
1790/*                                                                          */
1791/* Routine Name: ips_fill_scb_sg_single                                     */
1792/*                                                                          */
1793/* Routine Description:                                                     */
1794/*   Fill in a single scb sg_list element from an address                   */
1795/*   return a -1 if a breakup occurred                                      */
1796/****************************************************************************/
1797static int
1798ips_fill_scb_sg_single(ips_ha_t * ha, dma_addr_t busaddr,
1799                       ips_scb_t * scb, int indx, unsigned int e_len)
1800{
1801
1802        int ret_val = 0;
1803
1804        if ((scb->data_len + e_len) > ha->max_xfer) {
1805                e_len = ha->max_xfer - scb->data_len;
1806                scb->breakup = indx;
1807                ++scb->sg_break;
1808                ret_val = -1;
1809        } else {
1810                scb->breakup = 0;
1811                scb->sg_break = 0;
1812        }
1813        if (IPS_USE_ENH_SGLIST(ha)) {
1814                scb->sg_list.enh_list[indx].address_lo =
1815                    cpu_to_le32(pci_dma_lo32(busaddr));
1816                scb->sg_list.enh_list[indx].address_hi =
1817                    cpu_to_le32(pci_dma_hi32(busaddr));
1818                scb->sg_list.enh_list[indx].length = cpu_to_le32(e_len);
1819        } else {
1820                scb->sg_list.std_list[indx].address =
1821                    cpu_to_le32(pci_dma_lo32(busaddr));
1822                scb->sg_list.std_list[indx].length = cpu_to_le32(e_len);
1823        }
1824
1825        ++scb->sg_len;
1826        scb->data_len += e_len;
1827        return ret_val;
1828}
1829
1830/****************************************************************************/
1831/* Routine Name: ips_flash_firmware                                         */
1832/* Routine Description:                                                     */
1833/*   flashes the firmware of a copperhead adapter                           */
1834/****************************************************************************/
1835static int
1836ips_flash_firmware(ips_ha_t * ha, ips_passthru_t * pt, ips_scb_t * scb)
1837{
1838        IPS_SG_LIST sg_list;
1839        uint32_t cmd_busaddr;
1840
1841        if (pt->CoppCP.cmd.flashfw.type == IPS_FW_IMAGE &&
1842            pt->CoppCP.cmd.flashfw.direction == IPS_WRITE_FW) {
1843                memset(&pt->CoppCP.cmd, 0, sizeof (IPS_HOST_COMMAND));
1844                pt->CoppCP.cmd.flashfw.op_code = IPS_CMD_DOWNLOAD;
1845                pt->CoppCP.cmd.flashfw.count = cpu_to_le32(ha->flash_datasize);
1846        } else {
1847                pt->BasicStatus = 0x0B;
1848                pt->ExtendedStatus = 0x00;
1849                ips_free_flash_copperhead(ha);
1850                return IPS_FAILURE;
1851        }
1852        /* Save the S/G list pointer so it doesn't get clobbered */
1853        sg_list.list = scb->sg_list.list;
1854        cmd_busaddr = scb->scb_busaddr;
1855        /* copy in the CP */
1856        memcpy(&scb->cmd, &pt->CoppCP.cmd, sizeof (IPS_IOCTL_CMD));
1857        /* FIX stuff that might be wrong */
1858        scb->sg_list.list = sg_list.list;
1859        scb->scb_busaddr = cmd_busaddr;
1860        scb->bus = scb->scsi_cmd->device->channel;
1861        scb->target_id = scb->scsi_cmd->device->id;
1862        scb->lun = scb->scsi_cmd->device->lun;
1863        scb->sg_len = 0;
1864        scb->data_len = 0;
1865        scb->flags = 0;
1866        scb->op_code = 0;
1867        scb->callback = ipsintr_done;
1868        scb->timeout = ips_cmd_timeout;
1869
1870        scb->data_len = ha->flash_datasize;
1871        scb->data_busaddr =
1872            pci_map_single(ha->pcidev, ha->flash_data, scb->data_len,
1873                           IPS_DMA_DIR(scb));
1874        scb->flags |= IPS_SCB_MAP_SINGLE;
1875        scb->cmd.flashfw.command_id = IPS_COMMAND_ID(ha, scb);
1876        scb->cmd.flashfw.buffer_addr = cpu_to_le32(scb->data_busaddr);
1877        if (pt->TimeOut)
1878                scb->timeout = pt->TimeOut;
1879        scb->scsi_cmd->result = DID_OK << 16;
1880        return IPS_SUCCESS;
1881}
1882
1883/****************************************************************************/
1884/* Routine Name: ips_free_flash_copperhead                                  */
1885/* Routine Description:                                                     */
1886/*   release the memory resources used to hold the flash image              */
1887/****************************************************************************/
1888static void
1889ips_free_flash_copperhead(ips_ha_t * ha)
1890{
1891        if (ha->flash_data == ips_FlashData)
1892                test_and_clear_bit(0, &ips_FlashDataInUse);
1893        else if (ha->flash_data)
1894                pci_free_consistent(ha->pcidev, ha->flash_len, ha->flash_data,
1895                                    ha->flash_busaddr);
1896        ha->flash_data = NULL;
1897}
1898
1899/****************************************************************************/
1900/*                                                                          */
1901/* Routine Name: ips_usrcmd                                                 */
1902/*                                                                          */
1903/* Routine Description:                                                     */
1904/*                                                                          */
1905/*   Process a user command and make it ready to send                       */
1906/*                                                                          */
1907/****************************************************************************/
1908static int
1909ips_usrcmd(ips_ha_t * ha, ips_passthru_t * pt, ips_scb_t * scb)
1910{
1911        IPS_SG_LIST sg_list;
1912        uint32_t cmd_busaddr;
1913
1914        METHOD_TRACE("ips_usrcmd", 1);
1915
1916        if ((!scb) || (!pt) || (!ha))
1917                return (0);
1918
1919        /* Save the S/G list pointer so it doesn't get clobbered */
1920        sg_list.list = scb->sg_list.list;
1921        cmd_busaddr = scb->scb_busaddr;
1922        /* copy in the CP */
1923        memcpy(&scb->cmd, &pt->CoppCP.cmd, sizeof (IPS_IOCTL_CMD));
1924        memcpy(&scb->dcdb, &pt->CoppCP.dcdb, sizeof (IPS_DCDB_TABLE));
1925
1926        /* FIX stuff that might be wrong */
1927        scb->sg_list.list = sg_list.list;
1928        scb->scb_busaddr = cmd_busaddr;
1929        scb->bus = scb->scsi_cmd->device->channel;
1930        scb->target_id = scb->scsi_cmd->device->id;
1931        scb->lun = scb->scsi_cmd->device->lun;
1932        scb->sg_len = 0;
1933        scb->data_len = 0;
1934        scb->flags = 0;
1935        scb->op_code = 0;
1936        scb->callback = ipsintr_done;
1937        scb->timeout = ips_cmd_timeout;
1938        scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
1939
1940        /* we don't support DCDB/READ/WRITE Scatter Gather */
1941        if ((scb->cmd.basic_io.op_code == IPS_CMD_READ_SG) ||
1942            (scb->cmd.basic_io.op_code == IPS_CMD_WRITE_SG) ||
1943            (scb->cmd.basic_io.op_code == IPS_CMD_DCDB_SG))
1944                return (0);
1945
1946        if (pt->CmdBSize) {
1947                scb->data_len = pt->CmdBSize;
1948                scb->data_busaddr = ha->ioctl_busaddr + sizeof (ips_passthru_t);
1949        } else {
1950                scb->data_busaddr = 0L;
1951        }
1952
1953        if (scb->cmd.dcdb.op_code == IPS_CMD_DCDB)
1954                scb->cmd.dcdb.dcdb_address = cpu_to_le32(scb->scb_busaddr +
1955                                                         (unsigned long) &scb->
1956                                                         dcdb -
1957                                                         (unsigned long) scb);
1958
1959        if (pt->CmdBSize) {
1960                if (scb->cmd.dcdb.op_code == IPS_CMD_DCDB)
1961                        scb->dcdb.buffer_pointer =
1962                            cpu_to_le32(scb->data_busaddr);
1963                else
1964                        scb->cmd.basic_io.sg_addr =
1965                            cpu_to_le32(scb->data_busaddr);
1966        }
1967
1968        /* set timeouts */
1969        if (pt->TimeOut) {
1970                scb->timeout = pt->TimeOut;
1971
1972                if (pt->TimeOut <= 10)
1973                        scb->dcdb.cmd_attribute |= IPS_TIMEOUT10;
1974                else if (pt->TimeOut <= 60)
1975                        scb->dcdb.cmd_attribute |= IPS_TIMEOUT60;
1976                else
1977                        scb->dcdb.cmd_attribute |= IPS_TIMEOUT20M;
1978        }
1979
1980        /* assume success */
1981        scb->scsi_cmd->result = DID_OK << 16;
1982
1983        /* success */
1984        return (1);
1985}
1986
1987/****************************************************************************/
1988/*                                                                          */
1989/* Routine Name: ips_cleanup_passthru                                       */
1990/*                                                                          */
1991/* Routine Description:                                                     */
1992/*                                                                          */
1993/*   Cleanup after a passthru command                                       */
1994/*                                                                          */
1995/****************************************************************************/
1996static void
1997ips_cleanup_passthru(ips_ha_t * ha, ips_scb_t * scb)
1998{
1999        ips_passthru_t *pt;
2000
2001        METHOD_TRACE("ips_cleanup_passthru", 1);
2002
2003        if ((!scb) || (!scb->scsi_cmd) || (!scsi_sglist(scb->scsi_cmd))) {
2004                DEBUG_VAR(1, "(%s%d) couldn't cleanup after passthru",
2005                          ips_name, ha->host_num);
2006
2007                return;
2008        }
2009        pt = (ips_passthru_t *) ha->ioctl_data;
2010
2011        /* Copy data back to the user */
2012        if (scb->cmd.dcdb.op_code == IPS_CMD_DCDB)      /* Copy DCDB Back to Caller's Area */
2013                memcpy(&pt->CoppCP.dcdb, &scb->dcdb, sizeof (IPS_DCDB_TABLE));
2014
2015        pt->BasicStatus = scb->basic_status;
2016        pt->ExtendedStatus = scb->extended_status;
2017        pt->AdapterType = ha->ad_type;
2018
2019        if (ha->pcidev->device == IPS_DEVICEID_COPPERHEAD &&
2020            (scb->cmd.flashfw.op_code == IPS_CMD_DOWNLOAD ||
2021             scb->cmd.flashfw.op_code == IPS_CMD_RW_BIOSFW))
2022                ips_free_flash_copperhead(ha);
2023
2024        ips_scmd_buf_write(scb->scsi_cmd, ha->ioctl_data, ha->ioctl_datasize);
2025}
2026
2027/****************************************************************************/
2028/*                                                                          */
2029/* Routine Name: ips_host_info                                              */
2030/*                                                                          */
2031/* Routine Description:                                                     */
2032/*                                                                          */
2033/*   The passthru interface for the driver                                  */
2034/*                                                                          */
2035/****************************************************************************/
2036static int
2037ips_host_info(ips_ha_t *ha, struct seq_file *m)
2038{
2039        METHOD_TRACE("ips_host_info", 1);
2040
2041        seq_puts(m, "\nIBM ServeRAID General Information:\n\n");
2042
2043        if ((le32_to_cpu(ha->nvram->signature) == IPS_NVRAM_P5_SIG) &&
2044            (le16_to_cpu(ha->nvram->adapter_type) != 0))
2045                seq_printf(m, "\tController Type                   : %s\n",
2046                          ips_adapter_name[ha->ad_type - 1]);
2047        else
2048                seq_puts(m, "\tController Type                   : Unknown\n");
2049
2050        if (ha->io_addr)
2051                seq_printf(m,
2052                          "\tIO region                         : 0x%x (%d bytes)\n",
2053                          ha->io_addr, ha->io_len);
2054
2055        if (ha->mem_addr) {
2056                seq_printf(m,
2057                          "\tMemory region                     : 0x%x (%d bytes)\n",
2058                          ha->mem_addr, ha->mem_len);
2059                seq_printf(m,
2060                          "\tShared memory address             : 0x%lx\n",
2061                          (unsigned long)ha->mem_ptr);
2062        }
2063
2064        seq_printf(m, "\tIRQ number                        : %d\n", ha->pcidev->irq);
2065
2066    /* For the Next 3 lines Check for Binary 0 at the end and don't include it if it's there. */
2067    /* That keeps everything happy for "text" operations on the proc file.                    */
2068
2069        if (le32_to_cpu(ha->nvram->signature) == IPS_NVRAM_P5_SIG) {
2070        if (ha->nvram->bios_low[3] == 0) {
2071                seq_printf(m,
2072                          "\tBIOS Version                      : %c%c%c%c%c%c%c\n",
2073                          ha->nvram->bios_high[0], ha->nvram->bios_high[1],
2074                          ha->nvram->bios_high[2], ha->nvram->bios_high[3],
2075                          ha->nvram->bios_low[0], ha->nvram->bios_low[1],
2076                          ha->nvram->bios_low[2]);
2077
2078        } else {
2079                seq_printf(m,
2080                          "\tBIOS Version                      : %c%c%c%c%c%c%c%c\n",
2081                          ha->nvram->bios_high[0], ha->nvram->bios_high[1],
2082                          ha->nvram->bios_high[2], ha->nvram->bios_high[3],
2083                          ha->nvram->bios_low[0], ha->nvram->bios_low[1],
2084                          ha->nvram->bios_low[2], ha->nvram->bios_low[3]);
2085        }
2086
2087    }
2088
2089    if (ha->enq->CodeBlkVersion[7] == 0) {
2090        seq_printf(m,
2091                  "\tFirmware Version                  : %c%c%c%c%c%c%c\n",
2092                  ha->enq->CodeBlkVersion[0], ha->enq->CodeBlkVersion[1],
2093                  ha->enq->CodeBlkVersion[2], ha->enq->CodeBlkVersion[3],
2094                  ha->enq->CodeBlkVersion[4], ha->enq->CodeBlkVersion[5],
2095                  ha->enq->CodeBlkVersion[6]);
2096    } else {
2097        seq_printf(m,
2098                  "\tFirmware Version                  : %c%c%c%c%c%c%c%c\n",
2099                  ha->enq->CodeBlkVersion[0], ha->enq->CodeBlkVersion[1],
2100                  ha->enq->CodeBlkVersion[2], ha->enq->CodeBlkVersion[3],
2101                  ha->enq->CodeBlkVersion[4], ha->enq->CodeBlkVersion[5],
2102                  ha->enq->CodeBlkVersion[6], ha->enq->CodeBlkVersion[7]);
2103    }
2104
2105    if (ha->enq->BootBlkVersion[7] == 0) {
2106        seq_printf(m,
2107                  "\tBoot Block Version                : %c%c%c%c%c%c%c\n",
2108                  ha->enq->BootBlkVersion[0], ha->enq->BootBlkVersion[1],
2109                  ha->enq->BootBlkVersion[2], ha->enq->BootBlkVersion[3],
2110                  ha->enq->BootBlkVersion[4], ha->enq->BootBlkVersion[5],
2111                  ha->enq->BootBlkVersion[6]);
2112    } else {
2113        seq_printf(m,
2114                  "\tBoot Block Version                : %c%c%c%c%c%c%c%c\n",
2115                  ha->enq->BootBlkVersion[0], ha->enq->BootBlkVersion[1],
2116                  ha->enq->BootBlkVersion[2], ha->enq->BootBlkVersion[3],
2117                  ha->enq->BootBlkVersion[4], ha->enq->BootBlkVersion[5],
2118                  ha->enq->BootBlkVersion[6], ha->enq->BootBlkVersion[7]);
2119    }
2120
2121        seq_printf(m, "\tDriver Version                    : %s%s\n",
2122                  IPS_VERSION_HIGH, IPS_VERSION_LOW);
2123
2124        seq_printf(m, "\tDriver Build                      : %d\n",
2125                  IPS_BUILD_IDENT);
2126
2127        seq_printf(m, "\tMax Physical Devices              : %d\n",
2128                  ha->enq->ucMaxPhysicalDevices);
2129        seq_printf(m, "\tMax Active Commands               : %d\n",
2130                  ha->max_cmds);
2131        seq_printf(m, "\tCurrent Queued Commands           : %d\n",
2132                  ha->scb_waitlist.count);
2133        seq_printf(m, "\tCurrent Active Commands           : %d\n",
2134                  ha->scb_activelist.count - ha->num_ioctl);
2135        seq_printf(m, "\tCurrent Queued PT Commands        : %d\n",
2136                  ha->copp_waitlist.count);
2137        seq_printf(m, "\tCurrent Active PT Commands        : %d\n",
2138                  ha->num_ioctl);
2139
2140        seq_putc(m, '\n');
2141
2142        return 0;
2143}
2144
2145/****************************************************************************/
2146/*                                                                          */
2147/* Routine Name: ips_identify_controller                                    */
2148/*                                                                          */
2149/* Routine Description:                                                     */
2150/*                                                                          */
2151/*   Identify this controller                                               */
2152/*                                                                          */
2153/****************************************************************************/
2154static void
2155ips_identify_controller(ips_ha_t * ha)
2156{
2157        METHOD_TRACE("ips_identify_controller", 1);
2158
2159        switch (ha->pcidev->device) {
2160        case IPS_DEVICEID_COPPERHEAD:
2161                if (ha->pcidev->revision <= IPS_REVID_SERVERAID) {
2162                        ha->ad_type = IPS_ADTYPE_SERVERAID;
2163                } else if (ha->pcidev->revision == IPS_REVID_SERVERAID2) {
2164                        ha->ad_type = IPS_ADTYPE_SERVERAID2;
2165                } else if (ha->pcidev->revision == IPS_REVID_NAVAJO) {
2166                        ha->ad_type = IPS_ADTYPE_NAVAJO;
2167                } else if ((ha->pcidev->revision == IPS_REVID_SERVERAID2)
2168                           && (ha->slot_num == 0)) {
2169                        ha->ad_type = IPS_ADTYPE_KIOWA;
2170                } else if ((ha->pcidev->revision >= IPS_REVID_CLARINETP1) &&
2171                           (ha->pcidev->revision <= IPS_REVID_CLARINETP3)) {
2172                        if (ha->enq->ucMaxPhysicalDevices == 15)
2173                                ha->ad_type = IPS_ADTYPE_SERVERAID3L;
2174                        else
2175                                ha->ad_type = IPS_ADTYPE_SERVERAID3;
2176                } else if ((ha->pcidev->revision >= IPS_REVID_TROMBONE32) &&
2177                           (ha->pcidev->revision <= IPS_REVID_TROMBONE64)) {
2178                        ha->ad_type = IPS_ADTYPE_SERVERAID4H;
2179                }
2180                break;
2181
2182        case IPS_DEVICEID_MORPHEUS:
2183                switch (ha->pcidev->subsystem_device) {
2184                case IPS_SUBDEVICEID_4L:
2185                        ha->ad_type = IPS_ADTYPE_SERVERAID4L;
2186                        break;
2187
2188                case IPS_SUBDEVICEID_4M:
2189                        ha->ad_type = IPS_ADTYPE_SERVERAID4M;
2190                        break;
2191
2192                case IPS_SUBDEVICEID_4MX:
2193                        ha->ad_type = IPS_ADTYPE_SERVERAID4MX;
2194                        break;
2195
2196                case IPS_SUBDEVICEID_4LX:
2197                        ha->ad_type = IPS_ADTYPE_SERVERAID4LX;
2198                        break;
2199
2200                case IPS_SUBDEVICEID_5I2:
2201                        ha->ad_type = IPS_ADTYPE_SERVERAID5I2;
2202                        break;
2203
2204                case IPS_SUBDEVICEID_5I1:
2205                        ha->ad_type = IPS_ADTYPE_SERVERAID5I1;
2206                        break;
2207                }
2208
2209                break;
2210
2211        case IPS_DEVICEID_MARCO:
2212                switch (ha->pcidev->subsystem_device) {
2213                case IPS_SUBDEVICEID_6M:
2214                        ha->ad_type = IPS_ADTYPE_SERVERAID6M;
2215                        break;
2216                case IPS_SUBDEVICEID_6I:
2217                        ha->ad_type = IPS_ADTYPE_SERVERAID6I;
2218                        break;
2219                case IPS_SUBDEVICEID_7k:
2220                        ha->ad_type = IPS_ADTYPE_SERVERAID7k;
2221                        break;
2222                case IPS_SUBDEVICEID_7M:
2223                        ha->ad_type = IPS_ADTYPE_SERVERAID7M;
2224                        break;
2225                }
2226                break;
2227        }
2228}
2229
2230/****************************************************************************/
2231/*                                                                          */
2232/* Routine Name: ips_get_bios_version                                       */
2233/*                                                                          */
2234/* Routine Description:                                                     */
2235/*                                                                          */
2236/*   Get the BIOS revision number                                           */
2237/*                                                                          */
2238/****************************************************************************/
2239static void
2240ips_get_bios_version(ips_ha_t * ha, int intr)
2241{
2242        ips_scb_t *scb;
2243        int ret;
2244        uint8_t major;
2245        uint8_t minor;
2246        uint8_t subminor;
2247        uint8_t *buffer;
2248        char hexDigits[] =
2249            { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C',
2250     'D', 'E', 'F' };
2251
2252        METHOD_TRACE("ips_get_bios_version", 1);
2253
2254        major = 0;
2255        minor = 0;
2256
2257        strncpy(ha->bios_version, "       ?", 8);
2258
2259        if (ha->pcidev->device == IPS_DEVICEID_COPPERHEAD) {
2260                if (IPS_USE_MEMIO(ha)) {
2261                        /* Memory Mapped I/O */
2262
2263                        /* test 1st byte */
2264                        writel(0, ha->mem_ptr + IPS_REG_FLAP);
2265                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2266                                udelay(25);     /* 25 us */
2267
2268                        if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0x55)
2269                                return;
2270
2271                        writel(1, ha->mem_ptr + IPS_REG_FLAP);
2272                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2273                                udelay(25);     /* 25 us */
2274
2275                        if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0xAA)
2276                                return;
2277
2278                        /* Get Major version */
2279                        writel(0x1FF, ha->mem_ptr + IPS_REG_FLAP);
2280                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2281                                udelay(25);     /* 25 us */
2282
2283                        major = readb(ha->mem_ptr + IPS_REG_FLDP);
2284
2285                        /* Get Minor version */
2286                        writel(0x1FE, ha->mem_ptr + IPS_REG_FLAP);
2287                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2288                                udelay(25);     /* 25 us */
2289                        minor = readb(ha->mem_ptr + IPS_REG_FLDP);
2290
2291                        /* Get SubMinor version */
2292                        writel(0x1FD, ha->mem_ptr + IPS_REG_FLAP);
2293                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2294                                udelay(25);     /* 25 us */
2295                        subminor = readb(ha->mem_ptr + IPS_REG_FLDP);
2296
2297                } else {
2298                        /* Programmed I/O */
2299
2300                        /* test 1st byte */
2301                        outl(0, ha->io_addr + IPS_REG_FLAP);
2302                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2303                                udelay(25);     /* 25 us */
2304
2305                        if (inb(ha->io_addr + IPS_REG_FLDP) != 0x55)
2306                                return;
2307
2308                        outl(1, ha->io_addr + IPS_REG_FLAP);
2309                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2310                                udelay(25);     /* 25 us */
2311
2312                        if (inb(ha->io_addr + IPS_REG_FLDP) != 0xAA)
2313                                return;
2314
2315                        /* Get Major version */
2316                        outl(0x1FF, ha->io_addr + IPS_REG_FLAP);
2317                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2318                                udelay(25);     /* 25 us */
2319
2320                        major = inb(ha->io_addr + IPS_REG_FLDP);
2321
2322                        /* Get Minor version */
2323                        outl(0x1FE, ha->io_addr + IPS_REG_FLAP);
2324                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2325                                udelay(25);     /* 25 us */
2326
2327                        minor = inb(ha->io_addr + IPS_REG_FLDP);
2328
2329                        /* Get SubMinor version */
2330                        outl(0x1FD, ha->io_addr + IPS_REG_FLAP);
2331                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2332                                udelay(25);     /* 25 us */
2333
2334                        subminor = inb(ha->io_addr + IPS_REG_FLDP);
2335
2336                }
2337        } else {
2338                /* Morpheus Family - Send Command to the card */
2339
2340                buffer = ha->ioctl_data;
2341
2342                memset(buffer, 0, 0x1000);
2343
2344                scb = &ha->scbs[ha->max_cmds - 1];
2345
2346                ips_init_scb(ha, scb);
2347
2348                scb->timeout = ips_cmd_timeout;
2349                scb->cdb[0] = IPS_CMD_RW_BIOSFW;
2350
2351                scb->cmd.flashfw.op_code = IPS_CMD_RW_BIOSFW;
2352                scb->cmd.flashfw.command_id = IPS_COMMAND_ID(ha, scb);
2353                scb->cmd.flashfw.type = 1;
2354                scb->cmd.flashfw.direction = 0;
2355                scb->cmd.flashfw.count = cpu_to_le32(0x800);
2356                scb->cmd.flashfw.total_packets = 1;
2357                scb->cmd.flashfw.packet_num = 0;
2358                scb->data_len = 0x1000;
2359                scb->cmd.flashfw.buffer_addr = ha->ioctl_busaddr;
2360
2361                /* issue the command */
2362                if (((ret =
2363                      ips_send_wait(ha, scb, ips_cmd_timeout,
2364                                    intr)) == IPS_FAILURE)
2365                    || (ret == IPS_SUCCESS_IMM)
2366                    || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) {
2367                        /* Error occurred */
2368
2369                        return;
2370                }
2371
2372                if ((buffer[0xC0] == 0x55) && (buffer[0xC1] == 0xAA)) {
2373                        major = buffer[0x1ff + 0xC0];   /* Offset 0x1ff after the header (0xc0) */
2374                        minor = buffer[0x1fe + 0xC0];   /* Offset 0x1fe after the header (0xc0) */
2375                        subminor = buffer[0x1fd + 0xC0];        /* Offset 0x1fd after the header (0xc0) */
2376                } else {
2377                        return;
2378                }
2379        }
2380
2381        ha->bios_version[0] = hexDigits[(major & 0xF0) >> 4];
2382        ha->bios_version[1] = '.';
2383        ha->bios_version[2] = hexDigits[major & 0x0F];
2384        ha->bios_version[3] = hexDigits[subminor];
2385        ha->bios_version[4] = '.';
2386        ha->bios_version[5] = hexDigits[(minor & 0xF0) >> 4];
2387        ha->bios_version[6] = hexDigits[minor & 0x0F];
2388        ha->bios_version[7] = 0;
2389}
2390
2391/****************************************************************************/
2392/*                                                                          */
2393/* Routine Name: ips_hainit                                                 */
2394/*                                                                          */
2395/* Routine Description:                                                     */
2396/*                                                                          */
2397/*   Initialize the controller                                              */
2398/*                                                                          */
2399/* NOTE: Assumes to be called from with a lock                              */
2400/*                                                                          */
2401/****************************************************************************/
2402static int
2403ips_hainit(ips_ha_t * ha)
2404{
2405        int i;
2406        struct timeval tv;
2407
2408        METHOD_TRACE("ips_hainit", 1);
2409
2410        if (!ha)
2411                return (0);
2412
2413        if (ha->func.statinit)
2414                (*ha->func.statinit) (ha);
2415
2416        if (ha->func.enableint)
2417                (*ha->func.enableint) (ha);
2418
2419        /* Send FFDC */
2420        ha->reset_count = 1;
2421        do_gettimeofday(&tv);
2422        ha->last_ffdc = tv.tv_sec;
2423        ips_ffdc_reset(ha, IPS_INTR_IORL);
2424
2425        if (!ips_read_config(ha, IPS_INTR_IORL)) {
2426                IPS_PRINTK(KERN_WARNING, ha->pcidev,
2427                           "unable to read config from controller.\n");
2428
2429                return (0);
2430        }
2431        /* end if */
2432        if (!ips_read_adapter_status(ha, IPS_INTR_IORL)) {
2433                IPS_PRINTK(KERN_WARNING, ha->pcidev,
2434                           "unable to read controller status.\n");
2435
2436                return (0);
2437        }
2438
2439        /* Identify this controller */
2440        ips_identify_controller(ha);
2441
2442        if (!ips_read_subsystem_parameters(ha, IPS_INTR_IORL)) {
2443                IPS_PRINTK(KERN_WARNING, ha->pcidev,
2444                           "unable to read subsystem parameters.\n");
2445
2446                return (0);
2447        }
2448
2449        /* write nvram user page 5 */
2450        if (!ips_write_driver_status(ha, IPS_INTR_IORL)) {
2451                IPS_PRINTK(KERN_WARNING, ha->pcidev,
2452                           "unable to write driver info to controller.\n");
2453
2454                return (0);
2455        }
2456
2457        /* If there are Logical Drives and a Reset Occurred, then an EraseStripeLock is Needed */
2458        if ((ha->conf->ucLogDriveCount > 0) && (ha->requires_esl == 1))
2459                ips_clear_adapter(ha, IPS_INTR_IORL);
2460
2461        /* set limits on SID, LUN, BUS */
2462        ha->ntargets = IPS_MAX_TARGETS + 1;
2463        ha->nlun = 1;
2464        ha->nbus = (ha->enq->ucMaxPhysicalDevices / IPS_MAX_TARGETS) + 1;
2465
2466        switch (ha->conf->logical_drive[0].ucStripeSize) {
2467        case 4:
2468                ha->max_xfer = 0x10000;
2469                break;
2470
2471        case 5:
2472                ha->max_xfer = 0x20000;
2473                break;
2474
2475        case 6:
2476                ha->max_xfer = 0x40000;
2477                break;
2478
2479        case 7:
2480        default:
2481                ha->max_xfer = 0x80000;
2482                break;
2483        }
2484
2485        /* setup max concurrent commands */
2486        if (le32_to_cpu(ha->subsys->param[4]) & 0x1) {
2487                /* Use the new method */
2488                ha->max_cmds = ha->enq->ucConcurrentCmdCount;
2489        } else {
2490                /* use the old method */
2491                switch (ha->conf->logical_drive[0].ucStripeSize) {
2492                case 4:
2493                        ha->max_cmds = 32;
2494                        break;
2495
2496                case 5:
2497                        ha->max_cmds = 16;
2498                        break;
2499
2500                case 6:
2501                        ha->max_cmds = 8;
2502                        break;
2503
2504                case 7:
2505                default:
2506                        ha->max_cmds = 4;
2507                        break;
2508                }
2509        }
2510
2511        /* Limit the Active Commands on a Lite Adapter */
2512        if ((ha->ad_type == IPS_ADTYPE_SERVERAID3L) ||
2513            (ha->ad_type == IPS_ADTYPE_SERVERAID4L) ||
2514            (ha->ad_type == IPS_ADTYPE_SERVERAID4LX)) {
2515                if ((ha->max_cmds > MaxLiteCmds) && (MaxLiteCmds))
2516                        ha->max_cmds = MaxLiteCmds;
2517        }
2518
2519        /* set controller IDs */
2520        ha->ha_id[0] = IPS_ADAPTER_ID;
2521        for (i = 1; i < ha->nbus; i++) {
2522                ha->ha_id[i] = ha->conf->init_id[i - 1] & 0x1f;
2523                ha->dcdb_active[i - 1] = 0;
2524        }
2525
2526        return (1);
2527}
2528
2529/****************************************************************************/
2530/*                                                                          */
2531/* Routine Name: ips_next                                                   */
2532/*                                                                          */
2533/* Routine Description:                                                     */
2534/*                                                                          */
2535/*   Take the next command off the queue and send it to the controller      */
2536/*                                                                          */
2537/****************************************************************************/
2538static void
2539ips_next(ips_ha_t * ha, int intr)
2540{
2541        ips_scb_t *scb;
2542        struct scsi_cmnd *SC;
2543        struct scsi_cmnd *p;
2544        struct scsi_cmnd *q;
2545        ips_copp_wait_item_t *item;
2546        int ret;
2547        struct Scsi_Host *host;
2548        METHOD_TRACE("ips_next", 1);
2549
2550        if (!ha)
2551                return;
2552        host = ips_sh[ha->host_num];
2553        /*
2554         * Block access to the queue function so
2555         * this command won't time out
2556         */
2557        if (intr == IPS_INTR_ON)
2558                spin_lock(host->host_lock);
2559
2560        if ((ha->subsys->param[3] & 0x300000)
2561            && (ha->scb_activelist.count == 0)) {
2562                struct timeval tv;
2563
2564                do_gettimeofday(&tv);
2565
2566                if (tv.tv_sec - ha->last_ffdc > IPS_SECS_8HOURS) {
2567                        ha->last_ffdc = tv.tv_sec;
2568                        ips_ffdc_time(ha);
2569                }
2570        }
2571
2572        /*
2573         * Send passthru commands
2574         * These have priority over normal I/O
2575         * but shouldn't affect performance too much
2576         * since we limit the number that can be active
2577         * on the card at any one time
2578         */
2579        while ((ha->num_ioctl < IPS_MAX_IOCTL) &&
2580               (ha->copp_waitlist.head) && (scb = ips_getscb(ha))) {
2581
2582                item = ips_removeq_copp_head(&ha->copp_waitlist);
2583                ha->num_ioctl++;
2584                if (intr == IPS_INTR_ON)
2585                        spin_unlock(host->host_lock);
2586                scb->scsi_cmd = item->scsi_cmd;
2587                kfree(item);
2588
2589                ret = ips_make_passthru(ha, scb->scsi_cmd, scb, intr);
2590
2591                if (intr == IPS_INTR_ON)
2592                        spin_lock(host->host_lock);
2593                switch (ret) {
2594                case IPS_FAILURE:
2595                        if (scb->scsi_cmd) {
2596                                scb->scsi_cmd->result = DID_ERROR << 16;
2597                                scb->scsi_cmd->scsi_done(scb->scsi_cmd);
2598                        }
2599
2600                        ips_freescb(ha, scb);
2601                        break;
2602                case IPS_SUCCESS_IMM:
2603                        if (scb->scsi_cmd) {
2604                                scb->scsi_cmd->result = DID_OK << 16;
2605                                scb->scsi_cmd->scsi_done(scb->scsi_cmd);
2606                        }
2607
2608                        ips_freescb(ha, scb);
2609                        break;
2610                default:
2611                        break;
2612                }               /* end case */
2613
2614                if (ret != IPS_SUCCESS) {
2615                        ha->num_ioctl--;
2616                        continue;
2617                }
2618
2619                ret = ips_send_cmd(ha, scb);
2620
2621                if (ret == IPS_SUCCESS)
2622                        ips_putq_scb_head(&ha->scb_activelist, scb);
2623                else
2624                        ha->num_ioctl--;
2625
2626                switch (ret) {
2627                case IPS_FAILURE:
2628                        if (scb->scsi_cmd) {
2629                                scb->scsi_cmd->result = DID_ERROR << 16;
2630                        }
2631
2632                        ips_freescb(ha, scb);
2633                        break;
2634                case IPS_SUCCESS_IMM:
2635                        ips_freescb(ha, scb);
2636                        break;
2637                default:
2638                        break;
2639                }               /* end case */
2640
2641        }
2642
2643        /*
2644         * Send "Normal" I/O commands
2645         */
2646
2647        p = ha->scb_waitlist.head;
2648        while ((p) && (scb = ips_getscb(ha))) {
2649                if ((scmd_channel(p) > 0)
2650                    && (ha->
2651                        dcdb_active[scmd_channel(p) -
2652                                    1] & (1 << scmd_id(p)))) {
2653                        ips_freescb(ha, scb);
2654                        p = (struct scsi_cmnd *) p->host_scribble;
2655                        continue;
2656                }
2657
2658                q = p;
2659                SC = ips_removeq_wait(&ha->scb_waitlist, q);
2660
2661                if (intr == IPS_INTR_ON)
2662                        spin_unlock(host->host_lock);   /* Unlock HA after command is taken off queue */
2663
2664                SC->result = DID_OK;
2665                SC->host_scribble = NULL;
2666
2667                scb->target_id = SC->device->id;
2668                scb->lun = SC->device->lun;
2669                scb->bus = SC->device->channel;
2670                scb->scsi_cmd = SC;
2671                scb->breakup = 0;
2672                scb->data_len = 0;
2673                scb->callback = ipsintr_done;
2674                scb->timeout = ips_cmd_timeout;
2675                memset(&scb->cmd, 0, 16);
2676
2677                /* copy in the CDB */
2678                memcpy(scb->cdb, SC->cmnd, SC->cmd_len);
2679
2680                scb->sg_count = scsi_dma_map(SC);
2681                BUG_ON(scb->sg_count < 0);
2682                if (scb->sg_count) {
2683                        struct scatterlist *sg;
2684                        int i;
2685
2686                        scb->flags |= IPS_SCB_MAP_SG;
2687
2688                        scsi_for_each_sg(SC, sg, scb->sg_count, i) {
2689                                if (ips_fill_scb_sg_single
2690                                    (ha, sg_dma_address(sg), scb, i,
2691                                     sg_dma_len(sg)) < 0)
2692                                        break;
2693                        }
2694                        scb->dcdb.transfer_length = scb->data_len;
2695                } else {
2696                        scb->data_busaddr = 0L;
2697                        scb->sg_len = 0;
2698                        scb->data_len = 0;
2699                        scb->dcdb.transfer_length = 0;
2700                }
2701
2702                scb->dcdb.cmd_attribute =
2703                    ips_command_direction[scb->scsi_cmd->cmnd[0]];
2704
2705                /* Allow a WRITE BUFFER Command to Have no Data */
2706                /* This is Used by Tape Flash Utilites          */
2707                if ((scb->scsi_cmd->cmnd[0] == WRITE_BUFFER) &&
2708                                (scb->data_len == 0))
2709                        scb->dcdb.cmd_attribute = 0;
2710
2711                if (!(scb->dcdb.cmd_attribute & 0x3))
2712                        scb->dcdb.transfer_length = 0;
2713
2714                if (scb->data_len >= IPS_MAX_XFER) {
2715                        scb->dcdb.cmd_attribute |= IPS_TRANSFER64K;
2716                        scb->dcdb.transfer_length = 0;
2717                }
2718                if (intr == IPS_INTR_ON)
2719                        spin_lock(host->host_lock);
2720
2721                ret = ips_send_cmd(ha, scb);
2722
2723                switch (ret) {
2724                case IPS_SUCCESS:
2725                        ips_putq_scb_head(&ha->scb_activelist, scb);
2726                        break;
2727                case IPS_FAILURE:
2728                        if (scb->scsi_cmd) {
2729                                scb->scsi_cmd->result = DID_ERROR << 16;
2730                                scb->scsi_cmd->scsi_done(scb->scsi_cmd);
2731                        }
2732
2733                        if (scb->bus)
2734                                ha->dcdb_active[scb->bus - 1] &=
2735                                    ~(1 << scb->target_id);
2736
2737                        ips_freescb(ha, scb);
2738                        break;
2739                case IPS_SUCCESS_IMM:
2740                        if (scb->scsi_cmd)
2741                                scb->scsi_cmd->scsi_done(scb->scsi_cmd);
2742
2743                        if (scb->bus)
2744                                ha->dcdb_active[scb->bus - 1] &=
2745                                    ~(1 << scb->target_id);
2746
2747                        ips_freescb(ha, scb);
2748                        break;
2749                default:
2750                        break;
2751                }               /* end case */
2752
2753                p = (struct scsi_cmnd *) p->host_scribble;
2754
2755        }                       /* end while */
2756
2757        if (intr == IPS_INTR_ON)
2758                spin_unlock(host->host_lock);
2759}
2760
2761/****************************************************************************/
2762/*                                                                          */
2763/* Routine Name: ips_putq_scb_head                                          */
2764/*                                                                          */
2765/* Routine Description:                                                     */
2766/*                                                                          */
2767/*   Add an item to the head of the queue                                   */
2768/*                                                                          */
2769/* ASSUMED to be called from within the HA lock                             */
2770/*                                                                          */
2771/****************************************************************************/
2772static void
2773ips_putq_scb_head(ips_scb_queue_t * queue, ips_scb_t * item)
2774{
2775        METHOD_TRACE("ips_putq_scb_head", 1);
2776
2777        if (!item)
2778                return;
2779
2780        item->q_next = queue->head;
2781        queue->head = item;
2782
2783        if (!queue->tail)
2784                queue->tail = item;
2785
2786        queue->count++;
2787}
2788
2789/****************************************************************************/
2790/*                                                                          */
2791/* Routine Name: ips_removeq_scb_head                                       */
2792/*                                                                          */
2793/* Routine Description:                                                     */
2794/*                                                                          */
2795/*   Remove the head of the queue                                           */
2796/*                                                                          */
2797/* ASSUMED to be called from within the HA lock                             */
2798/*                                                                          */
2799/****************************************************************************/
2800static ips_scb_t *
2801ips_removeq_scb_head(ips_scb_queue_t * queue)
2802{
2803        ips_scb_t *item;
2804
2805        METHOD_TRACE("ips_removeq_scb_head", 1);
2806
2807        item = queue->head;
2808
2809        if (!item) {
2810                return (NULL);
2811        }
2812
2813        queue->head = item->q_next;
2814        item->q_next = NULL;
2815
2816        if (queue->tail == item)
2817                queue->tail = NULL;
2818
2819        queue->count--;
2820
2821        return (item);
2822}
2823
2824/****************************************************************************/
2825/*                                                                          */
2826/* Routine Name: ips_removeq_scb                                            */
2827/*                                                                          */
2828/* Routine Description:                                                     */
2829/*                                                                          */
2830/*   Remove an item from a queue                                            */
2831/*                                                                          */
2832/* ASSUMED to be called from within the HA lock                             */
2833/*                                                                          */
2834/****************************************************************************/
2835static ips_scb_t *
2836ips_removeq_scb(ips_scb_queue_t * queue, ips_scb_t * item)
2837{
2838        ips_scb_t *p;
2839
2840        METHOD_TRACE("ips_removeq_scb", 1);
2841
2842        if (!item)
2843                return (NULL);
2844
2845        if (item == queue->head) {
2846                return (ips_removeq_scb_head(queue));
2847        }
2848
2849        p = queue->head;
2850
2851        while ((p) && (item != p->q_next))
2852                p = p->q_next;
2853
2854        if (p) {
2855                /* found a match */
2856                p->q_next = item->q_next;
2857
2858                if (!item->q_next)
2859                        queue->tail = p;
2860
2861                item->q_next = NULL;
2862                queue->count--;
2863
2864                return (item);
2865        }
2866
2867        return (NULL);
2868}
2869
2870/****************************************************************************/
2871/*                                                                          */
2872/* Routine Name: ips_putq_wait_tail                                         */
2873/*                                                                          */
2874/* Routine Description:                                                     */
2875/*                                                                          */
2876/*   Add an item to the tail of the queue                                   */
2877/*                                                                          */
2878/* ASSUMED to be called from within the HA lock                             */
2879/*                                                                          */
2880/****************************************************************************/
2881static void ips_putq_wait_tail(ips_wait_queue_t *queue, struct scsi_cmnd *item)
2882{
2883        METHOD_TRACE("ips_putq_wait_tail", 1);
2884
2885        if (!item)
2886                return;
2887
2888        item->host_scribble = NULL;
2889
2890        if (queue->tail)
2891                queue->tail->host_scribble = (char *) item;
2892
2893        queue->tail = item;
2894
2895        if (!queue->head)
2896                queue->head = item;
2897
2898        queue->count++;
2899}
2900
2901/****************************************************************************/
2902/*                                                                          */
2903/* Routine Name: ips_removeq_wait_head                                      */
2904/*                                                                          */
2905/* Routine Description:                                                     */
2906/*                                                                          */
2907/*   Remove the head of the queue                                           */
2908/*                                                                          */
2909/* ASSUMED to be called from within the HA lock                             */
2910/*                                                                          */
2911/****************************************************************************/
2912static struct scsi_cmnd *ips_removeq_wait_head(ips_wait_queue_t *queue)
2913{
2914        struct scsi_cmnd *item;
2915
2916        METHOD_TRACE("ips_removeq_wait_head", 1);
2917
2918        item = queue->head;
2919
2920        if (!item) {
2921                return (NULL);
2922        }
2923
2924        queue->head = (struct scsi_cmnd *) item->host_scribble;
2925        item->host_scribble = NULL;
2926
2927        if (queue->tail == item)
2928                queue->tail = NULL;
2929
2930        queue->count--;
2931
2932        return (item);
2933}
2934
2935/****************************************************************************/
2936/*                                                                          */
2937/* Routine Name: ips_removeq_wait                                           */
2938/*                                                                          */
2939/* Routine Description:                                                     */
2940/*                                                                          */
2941/*   Remove an item from a queue                                            */
2942/*                                                                          */
2943/* ASSUMED to be called from within the HA lock                             */
2944/*                                                                          */
2945/****************************************************************************/
2946static struct scsi_cmnd *ips_removeq_wait(ips_wait_queue_t *queue,
2947                                          struct scsi_cmnd *item)
2948{
2949        struct scsi_cmnd *p;
2950
2951        METHOD_TRACE("ips_removeq_wait", 1);
2952
2953        if (!item)
2954                return (NULL);
2955
2956        if (item == queue->head) {
2957                return (ips_removeq_wait_head(queue));
2958        }
2959
2960        p = queue->head;
2961
2962        while ((p) && (item != (struct scsi_cmnd *) p->host_scribble))
2963                p = (struct scsi_cmnd *) p->host_scribble;
2964
2965        if (p) {
2966                /* found a match */
2967                p->host_scribble = item->host_scribble;
2968
2969                if (!item->host_scribble)
2970                        queue->tail = p;
2971
2972                item->host_scribble = NULL;
2973                queue->count--;
2974
2975                return (item);
2976        }
2977
2978        return (NULL);
2979}
2980
2981/****************************************************************************/
2982/*                                                                          */
2983/* Routine Name: ips_putq_copp_tail                                         */
2984/*                                                                          */
2985/* Routine Description:                                                     */
2986/*                                                                          */
2987/*   Add an item to the tail of the queue                                   */
2988/*                                                                          */
2989/* ASSUMED to be called from within the HA lock                             */
2990/*                                                                          */
2991/****************************************************************************/
2992static void
2993ips_putq_copp_tail(ips_copp_queue_t * queue, ips_copp_wait_item_t * item)
2994{
2995        METHOD_TRACE("ips_putq_copp_tail", 1);
2996
2997        if (!item)
2998                return;
2999
3000        item->next = NULL;
3001
3002        if (queue->tail)
3003                queue->tail->next = item;
3004
3005        queue->tail = item;
3006
3007        if (!queue->head)
3008                queue->head = item;
3009
3010        queue->count++;
3011}
3012
3013/****************************************************************************/
3014/*                                                                          */
3015/* Routine Name: ips_removeq_copp_head                                      */
3016/*                                                                          */
3017/* Routine Description:                                                     */
3018/*                                                                          */
3019/*   Remove the head of the queue                                           */
3020/*                                                                          */
3021/* ASSUMED to be called from within the HA lock                             */
3022/*                                                                          */
3023/****************************************************************************/
3024static ips_copp_wait_item_t *
3025ips_removeq_copp_head(ips_copp_queue_t * queue)
3026{
3027        ips_copp_wait_item_t *item;
3028
3029        METHOD_TRACE("ips_removeq_copp_head", 1);
3030
3031        item = queue->head;
3032
3033        if (!item) {
3034                return (NULL);
3035        }
3036
3037        queue->head = item->next;
3038        item->next = NULL;
3039
3040        if (queue->tail == item)
3041                queue->tail = NULL;
3042
3043        queue->count--;
3044
3045        return (item);
3046}
3047
3048/****************************************************************************/
3049/*                                                                          */
3050/* Routine Name: ips_removeq_copp                                           */
3051/*                                                                          */
3052/* Routine Description:                                                     */
3053/*                                                                          */
3054/*   Remove an item from a queue                                            */
3055/*                                                                          */
3056/* ASSUMED to be called from within the HA lock                             */
3057/*                                                                          */
3058/****************************************************************************/
3059static ips_copp_wait_item_t *
3060ips_removeq_copp(ips_copp_queue_t * queue, ips_copp_wait_item_t * item)
3061{
3062        ips_copp_wait_item_t *p;
3063
3064        METHOD_TRACE("ips_removeq_copp", 1);
3065
3066        if (!item)
3067                return (NULL);
3068
3069        if (item == queue->head) {
3070                return (ips_removeq_copp_head(queue));
3071        }
3072
3073        p = queue->head;
3074
3075        while ((p) && (item != p->next))
3076                p = p->next;
3077
3078        if (p) {
3079                /* found a match */
3080                p->next = item->next;
3081
3082                if (!item->next)
3083                        queue->tail = p;
3084
3085                item->next = NULL;
3086                queue->count--;
3087
3088                return (item);
3089        }
3090
3091        return (NULL);
3092}
3093
3094/****************************************************************************/
3095/*                                                                          */
3096/* Routine Name: ipsintr_blocking                                           */
3097/*                                                                          */
3098/* Routine Description:                                                     */
3099/*                                                                          */
3100/*   Finalize an interrupt for internal commands                            */
3101/*                                                                          */
3102/****************************************************************************/
3103static void
3104ipsintr_blocking(ips_ha_t * ha, ips_scb_t * scb)
3105{
3106        METHOD_TRACE("ipsintr_blocking", 2);
3107
3108        ips_freescb(ha, scb);
3109        if ((ha->waitflag == TRUE) && (ha->cmd_in_progress == scb->cdb[0])) {
3110                ha->waitflag = FALSE;
3111
3112                return;
3113        }
3114}
3115
3116/****************************************************************************/
3117/*                                                                          */
3118/* Routine Name: ipsintr_done                                               */
3119/*                                                                          */
3120/* Routine Description:                                                     */
3121/*                                                                          */
3122/*   Finalize an interrupt for non-internal commands                        */
3123/*                                                                          */
3124/****************************************************************************/
3125static void
3126ipsintr_done(ips_ha_t * ha, ips_scb_t * scb)
3127{
3128        METHOD_TRACE("ipsintr_done", 2);
3129
3130        if (!scb) {
3131                IPS_PRINTK(KERN_WARNING, ha->pcidev,
3132                           "Spurious interrupt; scb NULL.\n");
3133
3134                return;
3135        }
3136
3137        if (scb->scsi_cmd == NULL) {
3138                /* unexpected interrupt */
3139                IPS_PRINTK(KERN_WARNING, ha->pcidev,
3140                           "Spurious interrupt; scsi_cmd not set.\n");
3141
3142                return;
3143        }
3144
3145        ips_done(ha, scb);
3146}
3147
3148/****************************************************************************/
3149/*                                                                          */
3150/* Routine Name: ips_done                                                   */
3151/*                                                                          */
3152/* Routine Description:                                                     */
3153/*                                                                          */
3154/*   Do housekeeping on completed commands                                  */
3155/*  ASSUMED to be called form within the request lock                       */
3156/****************************************************************************/
3157static void
3158ips_done(ips_ha_t * ha, ips_scb_t * scb)
3159{
3160        int ret;
3161
3162        METHOD_TRACE("ips_done", 1);
3163
3164        if (!scb)
3165                return;
3166
3167        if ((scb->scsi_cmd) && (ips_is_passthru(scb->scsi_cmd))) {
3168                ips_cleanup_passthru(ha, scb);
3169                ha->num_ioctl--;
3170        } else {
3171                /*
3172                 * Check to see if this command had too much
3173                 * data and had to be broke up.  If so, queue
3174                 * the rest of the data and continue.
3175                 */
3176                if ((scb->breakup) || (scb->sg_break)) {
3177                        struct scatterlist *sg;
3178                        int i, sg_dma_index, ips_sg_index = 0;
3179
3180                        /* we had a data breakup */
3181                        scb->data_len = 0;
3182
3183                        sg = scsi_sglist(scb->scsi_cmd);
3184
3185                        /* Spin forward to last dma chunk */
3186                        sg_dma_index = scb->breakup;
3187                        for (i = 0; i < scb->breakup; i++)
3188                                sg = sg_next(sg);
3189
3190                        /* Take care of possible partial on last chunk */
3191                        ips_fill_scb_sg_single(ha,
3192                                               sg_dma_address(sg),
3193                                               scb, ips_sg_index++,
3194                                               sg_dma_len(sg));
3195
3196                        for (; sg_dma_index < scsi_sg_count(scb->scsi_cmd);
3197                             sg_dma_index++, sg = sg_next(sg)) {
3198                                if (ips_fill_scb_sg_single
3199                                    (ha,
3200                                     sg_dma_address(sg),
3201                                     scb, ips_sg_index++,
3202                                     sg_dma_len(sg)) < 0)
3203                                        break;
3204                        }
3205
3206                        scb->dcdb.transfer_length = scb->data_len;
3207                        scb->dcdb.cmd_attribute |=
3208                            ips_command_direction[scb->scsi_cmd->cmnd[0]];
3209
3210                        if (!(scb->dcdb.cmd_attribute & 0x3))
3211                                scb->dcdb.transfer_length = 0;
3212
3213                        if (scb->data_len >= IPS_MAX_XFER) {
3214                                scb->dcdb.cmd_attribute |= IPS_TRANSFER64K;
3215                                scb->dcdb.transfer_length = 0;
3216                        }
3217
3218                        ret = ips_send_cmd(ha, scb);
3219
3220                        switch (ret) {
3221                        case IPS_FAILURE:
3222                                if (scb->scsi_cmd) {
3223                                        scb->scsi_cmd->result = DID_ERROR << 16;
3224                                        scb->scsi_cmd->scsi_done(scb->scsi_cmd);
3225                                }
3226
3227                                ips_freescb(ha, scb);
3228                                break;
3229                        case IPS_SUCCESS_IMM:
3230                                if (scb->scsi_cmd) {
3231                                        scb->scsi_cmd->result = DID_ERROR << 16;
3232                                        scb->scsi_cmd->scsi_done(scb->scsi_cmd);
3233                                }
3234
3235                                ips_freescb(ha, scb);
3236                                break;
3237                        default:
3238                                break;
3239                        }       /* end case */
3240
3241                        return;
3242                }
3243        }                       /* end if passthru */
3244
3245        if (scb->bus) {
3246                ha->dcdb_active[scb->bus - 1] &= ~(1 << scb->target_id);
3247        }
3248
3249        scb->scsi_cmd->scsi_done(scb->scsi_cmd);
3250
3251        ips_freescb(ha, scb);
3252}
3253
3254/****************************************************************************/
3255/*                                                                          */
3256/* Routine Name: ips_map_status                                             */
3257/*                                                                          */
3258/* Routine Description:                                                     */
3259/*                                                                          */
3260/*   Map Controller Error codes to Linux Error Codes                        */
3261/*                                                                          */
3262/****************************************************************************/
3263static int
3264ips_map_status(ips_ha_t * ha, ips_scb_t * scb, ips_stat_t * sp)
3265{
3266        int errcode;
3267        int device_error;
3268        uint32_t transfer_len;
3269        IPS_DCDB_TABLE_TAPE *tapeDCDB;
3270        IPS_SCSI_INQ_DATA inquiryData;
3271
3272        METHOD_TRACE("ips_map_status", 1);
3273
3274        if (scb->bus) {
3275                DEBUG_VAR(2,
3276                          "(%s%d) Physical device error (%d %d %d): %x %x, Sense Key: %x, ASC: %x, ASCQ: %x",
3277                          ips_name, ha->host_num,
3278                          scb->scsi_cmd->device->channel,
3279                          scb->scsi_cmd->device->id, scb->scsi_cmd->device->lun,
3280                          scb->basic_status, scb->extended_status,
3281                          scb->extended_status ==
3282                          IPS_ERR_CKCOND ? scb->dcdb.sense_info[2] & 0xf : 0,
3283                          scb->extended_status ==
3284                          IPS_ERR_CKCOND ? scb->dcdb.sense_info[12] : 0,
3285                          scb->extended_status ==
3286                          IPS_ERR_CKCOND ? scb->dcdb.sense_info[13] : 0);
3287        }
3288
3289        /* default driver error */
3290        errcode = DID_ERROR;
3291        device_error = 0;
3292
3293        switch (scb->basic_status & IPS_GSC_STATUS_MASK) {
3294        case IPS_CMD_TIMEOUT:
3295                errcode = DID_TIME_OUT;
3296                break;
3297
3298        case IPS_INVAL_OPCO:
3299        case IPS_INVAL_CMD_BLK:
3300        case IPS_INVAL_PARM_BLK:
3301        case IPS_LD_ERROR:
3302        case IPS_CMD_CMPLT_WERROR:
3303                break;
3304
3305        case IPS_PHYS_DRV_ERROR:
3306                switch (scb->extended_status) {
3307                case IPS_ERR_SEL_TO:
3308                        if (scb->bus)
3309                                errcode = DID_NO_CONNECT;
3310
3311                        break;
3312
3313                case IPS_ERR_OU_RUN:
3314                        if ((scb->cmd.dcdb.op_code == IPS_CMD_EXTENDED_DCDB) ||
3315                            (scb->cmd.dcdb.op_code ==
3316                             IPS_CMD_EXTENDED_DCDB_SG)) {
3317                                tapeDCDB = (IPS_DCDB_TABLE_TAPE *) & scb->dcdb;
3318                                transfer_len = tapeDCDB->transfer_length;
3319                        } else {
3320                                transfer_len =
3321                                    (uint32_t) scb->dcdb.transfer_length;
3322                        }
3323
3324                        if ((scb->bus) && (transfer_len < scb->data_len)) {
3325                                /* Underrun - set default to no error */
3326                                errcode = DID_OK;
3327
3328                                /* Restrict access to physical DASD */
3329                                if (scb->scsi_cmd->cmnd[0] == INQUIRY) {
3330                                    ips_scmd_buf_read(scb->scsi_cmd,
3331                                      &inquiryData, sizeof (inquiryData));
3332                                    if ((inquiryData.DeviceType & 0x1f) == TYPE_DISK) {
3333                                        errcode = DID_TIME_OUT;
3334                                        break;
3335                                    }
3336                                }
3337                        } else
3338                                errcode = DID_ERROR;
3339
3340                        break;
3341
3342                case IPS_ERR_RECOVERY:
3343                        /* don't fail recovered errors */
3344                        if (scb->bus)
3345                                errcode = DID_OK;
3346
3347                        break;
3348
3349                case IPS_ERR_HOST_RESET:
3350                case IPS_ERR_DEV_RESET:
3351                        errcode = DID_RESET;
3352                        break;
3353
3354                case IPS_ERR_CKCOND:
3355                        if (scb->bus) {
3356                                if ((scb->cmd.dcdb.op_code ==
3357                                     IPS_CMD_EXTENDED_DCDB)
3358                                    || (scb->cmd.dcdb.op_code ==
3359                                        IPS_CMD_EXTENDED_DCDB_SG)) {
3360                                        tapeDCDB =
3361                                            (IPS_DCDB_TABLE_TAPE *) & scb->dcdb;
3362                                        memcpy(scb->scsi_cmd->sense_buffer,
3363                                               tapeDCDB->sense_info,
3364                                               SCSI_SENSE_BUFFERSIZE);
3365                                } else {
3366                                        memcpy(scb->scsi_cmd->sense_buffer,
3367                                               scb->dcdb.sense_info,
3368                                               SCSI_SENSE_BUFFERSIZE);
3369                                }
3370                                device_error = 2;       /* check condition */
3371                        }
3372
3373                        errcode = DID_OK;
3374
3375                        break;
3376
3377                default:
3378                        errcode = DID_ERROR;
3379                        break;
3380
3381                }               /* end switch */
3382        }                       /* end switch */
3383
3384        scb->scsi_cmd->result = device_error | (errcode << 16);
3385
3386        return (1);
3387}
3388
3389/****************************************************************************/
3390/*                                                                          */
3391/* Routine Name: ips_send_wait                                              */
3392/*                                                                          */
3393/* Routine Description:                                                     */
3394/*                                                                          */
3395/*   Send a command to the controller and wait for it to return             */
3396/*                                                                          */
3397/*   The FFDC Time Stamp use this function for the callback, but doesn't    */
3398/*   actually need to wait.                                                 */
3399/****************************************************************************/
3400static int
3401ips_send_wait(ips_ha_t * ha, ips_scb_t * scb, int timeout, int intr)
3402{
3403        int ret;
3404
3405        METHOD_TRACE("ips_send_wait", 1);
3406
3407        if (intr != IPS_FFDC) { /* Won't be Waiting if this is a Time Stamp */
3408                ha->waitflag = TRUE;
3409                ha->cmd_in_progress = scb->cdb[0];
3410        }
3411        scb->callback = ipsintr_blocking;
3412        ret = ips_send_cmd(ha, scb);
3413
3414        if ((ret == IPS_FAILURE) || (ret == IPS_SUCCESS_IMM))
3415                return (ret);
3416
3417        if (intr != IPS_FFDC)   /* Don't Wait around if this is a Time Stamp */
3418                ret = ips_wait(ha, timeout, intr);
3419
3420        return (ret);
3421}
3422
3423/****************************************************************************/
3424/*                                                                          */
3425/* Routine Name: ips_scmd_buf_write                                         */
3426/*                                                                          */
3427/* Routine Description:                                                     */
3428/*  Write data to struct scsi_cmnd request_buffer at proper offsets         */
3429/****************************************************************************/
3430static void
3431ips_scmd_buf_write(struct scsi_cmnd *scmd, void *data, unsigned int count)
3432{
3433        unsigned long flags;
3434
3435        local_irq_save(flags);
3436        scsi_sg_copy_from_buffer(scmd, data, count);
3437        local_irq_restore(flags);
3438}
3439
3440/****************************************************************************/
3441/*                                                                          */
3442/* Routine Name: ips_scmd_buf_read                                          */
3443/*                                                                          */
3444/* Routine Description:                                                     */
3445/*  Copy data from a struct scsi_cmnd to a new, linear buffer               */
3446/****************************************************************************/
3447static void
3448ips_scmd_buf_read(struct scsi_cmnd *scmd, void *data, unsigned int count)
3449{
3450        unsigned long flags;
3451
3452        local_irq_save(flags);
3453        scsi_sg_copy_to_buffer(scmd, data, count);
3454        local_irq_restore(flags);
3455}
3456
3457/****************************************************************************/
3458/*                                                                          */
3459/* Routine Name: ips_send_cmd                                               */
3460/*                                                                          */
3461/* Routine Description:                                                     */
3462/*                                                                          */
3463/*   Map SCSI commands to ServeRAID commands for logical drives             */
3464/*                                                                          */
3465/****************************************************************************/
3466static int
3467ips_send_cmd(ips_ha_t * ha, ips_scb_t * scb)
3468{
3469        int ret;
3470        char *sp;
3471        int device_error;
3472        IPS_DCDB_TABLE_TAPE *tapeDCDB;
3473        int TimeOut;
3474
3475        METHOD_TRACE("ips_send_cmd", 1);
3476
3477        ret = IPS_SUCCESS;
3478
3479        if (!scb->scsi_cmd) {
3480                /* internal command */
3481
3482                if (scb->bus > 0) {
3483                        /* Controller commands can't be issued */
3484                        /* to real devices -- fail them        */
3485                        if ((ha->waitflag == TRUE) &&
3486                            (ha->cmd_in_progress == scb->cdb[0])) {
3487                                ha->waitflag = FALSE;
3488                        }
3489
3490                        return (1);
3491                }
3492        } else if ((scb->bus == 0) && (!ips_is_passthru(scb->scsi_cmd))) {
3493                /* command to logical bus -- interpret */
3494                ret = IPS_SUCCESS_IMM;
3495
3496                switch (scb->scsi_cmd->cmnd[0]) {
3497                case ALLOW_MEDIUM_REMOVAL:
3498                case REZERO_UNIT:
3499                case ERASE:
3500                case WRITE_FILEMARKS:
3501                case SPACE:
3502                        scb->scsi_cmd->result = DID_ERROR << 16;
3503                        break;
3504
3505                case START_STOP:
3506                        scb->scsi_cmd->result = DID_OK << 16;
3507
3508                case TEST_UNIT_READY:
3509                case INQUIRY:
3510                        if (scb->target_id == IPS_ADAPTER_ID) {
3511                                /*
3512                                 * Either we have a TUR
3513                                 * or we have a SCSI inquiry
3514                                 */
3515                                if (scb->scsi_cmd->cmnd[0] == TEST_UNIT_READY)
3516                                        scb->scsi_cmd->result = DID_OK << 16;
3517
3518                                if (scb->scsi_cmd->cmnd[0] == INQUIRY) {
3519                                        IPS_SCSI_INQ_DATA inquiry;
3520
3521                                        memset(&inquiry, 0,
3522                                               sizeof (IPS_SCSI_INQ_DATA));
3523
3524                                        inquiry.DeviceType =
3525                                            IPS_SCSI_INQ_TYPE_PROCESSOR;
3526                                        inquiry.DeviceTypeQualifier =
3527                                            IPS_SCSI_INQ_LU_CONNECTED;
3528                                        inquiry.Version = IPS_SCSI_INQ_REV2;
3529                                        inquiry.ResponseDataFormat =
3530                                            IPS_SCSI_INQ_RD_REV2;
3531                                        inquiry.AdditionalLength = 31;
3532                                        inquiry.Flags[0] =
3533                                            IPS_SCSI_INQ_Address16;
3534                                        inquiry.Flags[1] =
3535                                            IPS_SCSI_INQ_WBus16 |
3536                                            IPS_SCSI_INQ_Sync;
3537                                        strncpy(inquiry.VendorId, "IBM     ",
3538                                                8);
3539                                        strncpy(inquiry.ProductId,
3540                                                "SERVERAID       ", 16);
3541                                        strncpy(inquiry.ProductRevisionLevel,
3542                                                "1.00", 4);
3543
3544                                        ips_scmd_buf_write(scb->scsi_cmd,
3545                                                           &inquiry,
3546                                                           sizeof (inquiry));
3547
3548                                        scb->scsi_cmd->result = DID_OK << 16;
3549                                }
3550                        } else {
3551                                scb->cmd.logical_info.op_code = IPS_CMD_GET_LD_INFO;
3552                                scb->cmd.logical_info.command_id = IPS_COMMAND_ID(ha, scb);
3553                                scb->cmd.logical_info.reserved = 0;
3554                                scb->cmd.logical_info.reserved2 = 0;
3555                                scb->data_len = sizeof (IPS_LD_INFO);
3556                                scb->data_busaddr = ha->logical_drive_info_dma_addr;
3557                                scb->flags = 0;
3558                                scb->cmd.logical_info.buffer_addr = scb->data_busaddr;
3559                                ret = IPS_SUCCESS;
3560                        }
3561
3562                        break;
3563
3564                case REQUEST_SENSE:
3565                        ips_reqsen(ha, scb);
3566                        scb->scsi_cmd->result = DID_OK << 16;
3567                        break;
3568
3569                case READ_6:
3570                case WRITE_6:
3571                        if (!scb->sg_len) {
3572                                scb->cmd.basic_io.op_code =
3573                                    (scb->scsi_cmd->cmnd[0] ==
3574                                     READ_6) ? IPS_CMD_READ : IPS_CMD_WRITE;
3575                                scb->cmd.basic_io.enhanced_sg = 0;
3576                                scb->cmd.basic_io.sg_addr =
3577                                    cpu_to_le32(scb->data_busaddr);
3578                        } else {
3579                                scb->cmd.basic_io.op_code =
3580                                    (scb->scsi_cmd->cmnd[0] ==
3581                                     READ_6) ? IPS_CMD_READ_SG :
3582                                    IPS_CMD_WRITE_SG;
3583                                scb->cmd.basic_io.enhanced_sg =
3584                                    IPS_USE_ENH_SGLIST(ha) ? 0xFF : 0;
3585                                scb->cmd.basic_io.sg_addr =
3586                                    cpu_to_le32(scb->sg_busaddr);
3587                        }
3588
3589                        scb->cmd.basic_io.segment_4G = 0;
3590                        scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
3591                        scb->cmd.basic_io.log_drv = scb->target_id;
3592                        scb->cmd.basic_io.sg_count = scb->sg_len;
3593
3594                        if (scb->cmd.basic_io.lba)
3595                                le32_add_cpu(&scb->cmd.basic_io.lba,
3596                                                le16_to_cpu(scb->cmd.basic_io.
3597                                                            sector_count));
3598                        else
3599                                scb->cmd.basic_io.lba =
3600                                    (((scb->scsi_cmd->
3601                                       cmnd[1] & 0x1f) << 16) | (scb->scsi_cmd->
3602                                                                 cmnd[2] << 8) |
3603                                     (scb->scsi_cmd->cmnd[3]));
3604
3605                        scb->cmd.basic_io.sector_count =
3606                            cpu_to_le16(scb->data_len / IPS_BLKSIZE);
3607
3608                        if (le16_to_cpu(scb->cmd.basic_io.sector_count) == 0)
3609                                scb->cmd.basic_io.sector_count =
3610                                    cpu_to_le16(256);
3611
3612                        ret = IPS_SUCCESS;
3613                        break;
3614
3615                case READ_10:
3616                case WRITE_10:
3617                        if (!scb->sg_len) {
3618                                scb->cmd.basic_io.op_code =
3619                                    (scb->scsi_cmd->cmnd[0] ==
3620                                     READ_10) ? IPS_CMD_READ : IPS_CMD_WRITE;
3621                                scb->cmd.basic_io.enhanced_sg = 0;
3622                                scb->cmd.basic_io.sg_addr =
3623                                    cpu_to_le32(scb->data_busaddr);
3624                        } else {
3625                                scb->cmd.basic_io.op_code =
3626                                    (scb->scsi_cmd->cmnd[0] ==
3627                                     READ_10) ? IPS_CMD_READ_SG :
3628                                    IPS_CMD_WRITE_SG;
3629                                scb->cmd.basic_io.enhanced_sg =
3630                                    IPS_USE_ENH_SGLIST(ha) ? 0xFF : 0;
3631                                scb->cmd.basic_io.sg_addr =
3632                                    cpu_to_le32(scb->sg_busaddr);
3633                        }
3634
3635                        scb->cmd.basic_io.segment_4G = 0;
3636                        scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
3637                        scb->cmd.basic_io.log_drv = scb->target_id;
3638                        scb->cmd.basic_io.sg_count = scb->sg_len;
3639
3640                        if (scb->cmd.basic_io.lba)
3641                                le32_add_cpu(&scb->cmd.basic_io.lba,
3642                                                le16_to_cpu(scb->cmd.basic_io.
3643                                                            sector_count));
3644                        else
3645                                scb->cmd.basic_io.lba =
3646                                    ((scb->scsi_cmd->cmnd[2] << 24) | (scb->
3647                                                                       scsi_cmd->
3648                                                                       cmnd[3]
3649                                                                       << 16) |
3650                                     (scb->scsi_cmd->cmnd[4] << 8) | scb->
3651                                     scsi_cmd->cmnd[5]);
3652
3653                        scb->cmd.basic_io.sector_count =
3654                            cpu_to_le16(scb->data_len / IPS_BLKSIZE);
3655
3656                        if (cpu_to_le16(scb->cmd.basic_io.sector_count) == 0) {
3657                                /*
3658                                 * This is a null condition
3659                                 * we don't have to do anything
3660                                 * so just return
3661                                 */
3662                                scb->scsi_cmd->result = DID_OK << 16;
3663                        } else
3664                                ret = IPS_SUCCESS;
3665
3666                        break;
3667
3668                case RESERVE:
3669                case RELEASE:
3670                        scb->scsi_cmd->result = DID_OK << 16;
3671                        break;
3672
3673                case MODE_SENSE:
3674                        scb->cmd.basic_io.op_code = IPS_CMD_ENQUIRY;
3675                        scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
3676                        scb->cmd.basic_io.segment_4G = 0;
3677                        scb->cmd.basic_io.enhanced_sg = 0;
3678                        scb->data_len = sizeof (*ha->enq);
3679                        scb->cmd.basic_io.sg_addr = ha->enq_busaddr;
3680                        ret = IPS_SUCCESS;
3681                        break;
3682
3683                case READ_CAPACITY:
3684                        scb->cmd.logical_info.op_code = IPS_CMD_GET_LD_INFO;
3685                        scb->cmd.logical_info.command_id = IPS_COMMAND_ID(ha, scb);
3686                        scb->cmd.logical_info.reserved = 0;
3687                        scb->cmd.logical_info.reserved2 = 0;
3688                        scb->cmd.logical_info.reserved3 = 0;
3689                        scb->data_len = sizeof (IPS_LD_INFO);
3690                        scb->data_busaddr = ha->logical_drive_info_dma_addr;
3691                        scb->flags = 0;
3692                        scb->cmd.logical_info.buffer_addr = scb->data_busaddr;
3693                        ret = IPS_SUCCESS;
3694                        break;
3695
3696                case SEND_DIAGNOSTIC:
3697                case REASSIGN_BLOCKS:
3698                case FORMAT_UNIT:
3699                case SEEK_10:
3700                case VERIFY:
3701                case READ_DEFECT_DATA:
3702                case READ_BUFFER:
3703                case WRITE_BUFFER:
3704                        scb->scsi_cmd->result = DID_OK << 16;
3705                        break;
3706
3707                default:
3708                        /* Set the Return Info to appear like the Command was */
3709                        /* attempted, a Check Condition occurred, and Sense   */
3710                        /* Data indicating an Invalid CDB OpCode is returned. */
3711                        sp = (char *) scb->scsi_cmd->sense_buffer;
3712
3713                        sp[0] = 0x70;   /* Error Code               */
3714                        sp[2] = ILLEGAL_REQUEST;        /* Sense Key 5 Illegal Req. */
3715                        sp[7] = 0x0A;   /* Additional Sense Length  */
3716                        sp[12] = 0x20;  /* ASC = Invalid OpCode     */
3717                        sp[13] = 0x00;  /* ASCQ                     */
3718
3719                        device_error = 2;       /* Indicate Check Condition */
3720                        scb->scsi_cmd->result = device_error | (DID_OK << 16);
3721                        break;
3722                }               /* end switch */
3723        }
3724        /* end if */
3725        if (ret == IPS_SUCCESS_IMM)
3726                return (ret);
3727
3728        /* setup DCDB */
3729        if (scb->bus > 0) {
3730
3731                /* If we already know the Device is Not there, no need to attempt a Command   */
3732                /* This also protects an NT FailOver Controller from getting CDB's sent to it */
3733                if (ha->conf->dev[scb->bus - 1][scb->target_id].ucState == 0) {
3734                        scb->scsi_cmd->result = DID_NO_CONNECT << 16;
3735                        return (IPS_SUCCESS_IMM);
3736                }
3737
3738                ha->dcdb_active[scb->bus - 1] |= (1 << scb->target_id);
3739                scb->cmd.dcdb.command_id = IPS_COMMAND_ID(ha, scb);
3740                scb->cmd.dcdb.dcdb_address = cpu_to_le32(scb->scb_busaddr +
3741                                                         (unsigned long) &scb->
3742                                                         dcdb -
3743                                                         (unsigned long) scb);
3744                scb->cmd.dcdb.reserved = 0;
3745                scb->cmd.dcdb.reserved2 = 0;
3746                scb->cmd.dcdb.reserved3 = 0;
3747                scb->cmd.dcdb.segment_4G = 0;
3748                scb->cmd.dcdb.enhanced_sg = 0;
3749
3750                TimeOut = scb->scsi_cmd->request->timeout;
3751
3752                if (ha->subsys->param[4] & 0x00100000) {        /* If NEW Tape DCDB is Supported */
3753                        if (!scb->sg_len) {
3754                                scb->cmd.dcdb.op_code = IPS_CMD_EXTENDED_DCDB;
3755                        } else {
3756                                scb->cmd.dcdb.op_code =
3757                                    IPS_CMD_EXTENDED_DCDB_SG;
3758                                scb->cmd.dcdb.enhanced_sg =
3759                                    IPS_USE_ENH_SGLIST(ha) ? 0xFF : 0;
3760                        }
3761
3762                        tapeDCDB = (IPS_DCDB_TABLE_TAPE *) & scb->dcdb; /* Use Same Data Area as Old DCDB Struct */
3763                        tapeDCDB->device_address =
3764                            ((scb->bus - 1) << 4) | scb->target_id;
3765                        tapeDCDB->cmd_attribute |= IPS_DISCONNECT_ALLOWED;
3766                        tapeDCDB->cmd_attribute &= ~IPS_TRANSFER64K;    /* Always Turn OFF 64K Size Flag */
3767
3768                        if (TimeOut) {
3769                                if (TimeOut < (10 * HZ))
3770                                        tapeDCDB->cmd_attribute |= IPS_TIMEOUT10;       /* TimeOut is 10 Seconds */
3771                                else if (TimeOut < (60 * HZ))
3772                                        tapeDCDB->cmd_attribute |= IPS_TIMEOUT60;       /* TimeOut is 60 Seconds */
3773                                else if (TimeOut < (1200 * HZ))
3774                                        tapeDCDB->cmd_attribute |= IPS_TIMEOUT20M;      /* TimeOut is 20 Minutes */
3775                        }
3776
3777                        tapeDCDB->cdb_length = scb->scsi_cmd->cmd_len;
3778                        tapeDCDB->reserved_for_LUN = 0;
3779                        tapeDCDB->transfer_length = scb->data_len;
3780                        if (scb->cmd.dcdb.op_code == IPS_CMD_EXTENDED_DCDB_SG)
3781                                tapeDCDB->buffer_pointer =
3782                                    cpu_to_le32(scb->sg_busaddr);
3783                        else
3784                                tapeDCDB->buffer_pointer =
3785                                    cpu_to_le32(scb->data_busaddr);
3786                        tapeDCDB->sg_count = scb->sg_len;
3787                        tapeDCDB->sense_length = sizeof (tapeDCDB->sense_info);
3788                        tapeDCDB->scsi_status = 0;
3789                        tapeDCDB->reserved = 0;
3790                        memcpy(tapeDCDB->scsi_cdb, scb->scsi_cmd->cmnd,
3791                               scb->scsi_cmd->cmd_len);
3792                } else {
3793                        if (!scb->sg_len) {
3794                                scb->cmd.dcdb.op_code = IPS_CMD_DCDB;
3795                        } else {
3796                                scb->cmd.dcdb.op_code = IPS_CMD_DCDB_SG;
3797                                scb->cmd.dcdb.enhanced_sg =
3798                                    IPS_USE_ENH_SGLIST(ha) ? 0xFF : 0;
3799                        }
3800
3801                        scb->dcdb.device_address =
3802                            ((scb->bus - 1) << 4) | scb->target_id;
3803                        scb->dcdb.cmd_attribute |= IPS_DISCONNECT_ALLOWED;
3804
3805                        if (TimeOut) {
3806                                if (TimeOut < (10 * HZ))
3807                                        scb->dcdb.cmd_attribute |= IPS_TIMEOUT10;       /* TimeOut is 10 Seconds */
3808                                else if (TimeOut < (60 * HZ))
3809                                        scb->dcdb.cmd_attribute |= IPS_TIMEOUT60;       /* TimeOut is 60 Seconds */
3810                                else if (TimeOut < (1200 * HZ))
3811                                        scb->dcdb.cmd_attribute |= IPS_TIMEOUT20M;      /* TimeOut is 20 Minutes */
3812                        }
3813
3814                        scb->dcdb.transfer_length = scb->data_len;
3815                        if (scb->dcdb.cmd_attribute & IPS_TRANSFER64K)
3816                                scb->dcdb.transfer_length = 0;
3817                        if (scb->cmd.dcdb.op_code == IPS_CMD_DCDB_SG)
3818                                scb->dcdb.buffer_pointer =
3819                                    cpu_to_le32(scb->sg_busaddr);
3820                        else
3821                                scb->dcdb.buffer_pointer =
3822                                    cpu_to_le32(scb->data_busaddr);
3823                        scb->dcdb.cdb_length = scb->scsi_cmd->cmd_len;
3824                        scb->dcdb.sense_length = sizeof (scb->dcdb.sense_info);
3825                        scb->dcdb.sg_count = scb->sg_len;
3826                        scb->dcdb.reserved = 0;
3827                        memcpy(scb->dcdb.scsi_cdb, scb->scsi_cmd->cmnd,
3828                               scb->scsi_cmd->cmd_len);
3829                        scb->dcdb.scsi_status = 0;
3830                        scb->dcdb.reserved2[0] = 0;
3831                        scb->dcdb.reserved2[1] = 0;
3832                        scb->dcdb.reserved2[2] = 0;
3833                }
3834        }
3835
3836        return ((*ha->func.issue) (ha, scb));
3837}
3838
3839/****************************************************************************/
3840/*                                                                          */
3841/* Routine Name: ips_chk_status                                             */
3842/*                                                                          */
3843/* Routine Description:                                                     */
3844/*                                                                          */
3845/*   Check the status of commands to logical drives                         */
3846/*   Assumed to be called with the HA lock                                  */
3847/****************************************************************************/
3848static void
3849ips_chkstatus(ips_ha_t * ha, IPS_STATUS * pstatus)
3850{
3851        ips_scb_t *scb;
3852        ips_stat_t *sp;
3853        uint8_t basic_status;
3854        uint8_t ext_status;
3855        int errcode;
3856        IPS_SCSI_INQ_DATA inquiryData;
3857
3858        METHOD_TRACE("ips_chkstatus", 1);
3859
3860        scb = &ha->scbs[pstatus->fields.command_id];
3861        scb->basic_status = basic_status =
3862            pstatus->fields.basic_status & IPS_BASIC_STATUS_MASK;
3863        scb->extended_status = ext_status = pstatus->fields.extended_status;
3864
3865        sp = &ha->sp;
3866        sp->residue_len = 0;
3867        sp->scb_addr = (void *) scb;
3868
3869        /* Remove the item from the active queue */
3870        ips_removeq_scb(&ha->scb_activelist, scb);
3871
3872        if (!scb->scsi_cmd)
3873                /* internal commands are handled in do_ipsintr */
3874                return;
3875
3876        DEBUG_VAR(2, "(%s%d) ips_chkstatus: cmd 0x%X id %d (%d %d %d)",
3877                  ips_name,
3878                  ha->host_num,
3879                  scb->cdb[0],
3880                  scb->cmd.basic_io.command_id,
3881                  scb->bus, scb->target_id, scb->lun);
3882
3883        if ((scb->scsi_cmd) && (ips_is_passthru(scb->scsi_cmd)))
3884                /* passthru - just returns the raw result */
3885                return;
3886
3887        errcode = DID_OK;
3888
3889        if (((basic_status & IPS_GSC_STATUS_MASK) == IPS_CMD_SUCCESS) ||
3890            ((basic_status & IPS_GSC_STATUS_MASK) == IPS_CMD_RECOVERED_ERROR)) {
3891
3892                if (scb->bus == 0) {
3893                        if ((basic_status & IPS_GSC_STATUS_MASK) ==
3894                            IPS_CMD_RECOVERED_ERROR) {
3895                                DEBUG_VAR(1,
3896                                          "(%s%d) Recovered Logical Drive Error OpCode: %x, BSB: %x, ESB: %x",
3897                                          ips_name, ha->host_num,
3898                                          scb->cmd.basic_io.op_code,
3899                                          basic_status, ext_status);
3900                        }
3901
3902                        switch (scb->scsi_cmd->cmnd[0]) {
3903                        case ALLOW_MEDIUM_REMOVAL:
3904                        case REZERO_UNIT:
3905                        case ERASE:
3906                        case WRITE_FILEMARKS:
3907                        case SPACE:
3908                                errcode = DID_ERROR;
3909                                break;
3910
3911                        case START_STOP:
3912                                break;
3913
3914                        case TEST_UNIT_READY:
3915                                if (!ips_online(ha, scb)) {
3916                                        errcode = DID_TIME_OUT;
3917                                }
3918                                break;
3919
3920                        case INQUIRY:
3921                                if (ips_online(ha, scb)) {
3922                                        ips_inquiry(ha, scb);
3923                                } else {
3924                                        errcode = DID_TIME_OUT;
3925                                }
3926                                break;
3927
3928                        case REQUEST_SENSE:
3929                                ips_reqsen(ha, scb);
3930                                break;
3931
3932                        case READ_6:
3933                        case WRITE_6:
3934                        case READ_10:
3935                        case WRITE_10:
3936                        case RESERVE:
3937                        case RELEASE:
3938                                break;
3939
3940                        case MODE_SENSE:
3941                                if (!ips_online(ha, scb)
3942                                    || !ips_msense(ha, scb)) {
3943                                        errcode = DID_ERROR;
3944                                }
3945                                break;
3946
3947                        case READ_CAPACITY:
3948                                if (ips_online(ha, scb))
3949                                        ips_rdcap(ha, scb);
3950                                else {
3951                                        errcode = DID_TIME_OUT;
3952                                }
3953                                break;
3954
3955                        case SEND_DIAGNOSTIC:
3956                        case REASSIGN_BLOCKS:
3957                                break;
3958
3959                        case FORMAT_UNIT:
3960                                errcode = DID_ERROR;
3961                                break;
3962
3963                        case SEEK_10:
3964                        case VERIFY:
3965                        case READ_DEFECT_DATA:
3966                        case READ_BUFFER:
3967                        case WRITE_BUFFER:
3968                                break;
3969
3970                        default:
3971                                errcode = DID_ERROR;
3972                        }       /* end switch */
3973
3974                        scb->scsi_cmd->result = errcode << 16;
3975                } else {        /* bus == 0 */
3976                        /* restrict access to physical drives */
3977                        if (scb->scsi_cmd->cmnd[0] == INQUIRY) {
3978                            ips_scmd_buf_read(scb->scsi_cmd,
3979                                  &inquiryData, sizeof (inquiryData));
3980                            if ((inquiryData.DeviceType & 0x1f) == TYPE_DISK)
3981                                scb->scsi_cmd->result = DID_TIME_OUT << 16;
3982                        }
3983                }               /* else */
3984        } else {                /* recovered error / success */
3985                if (scb->bus == 0) {
3986                        DEBUG_VAR(1,
3987                                  "(%s%d) Unrecovered Logical Drive Error OpCode: %x, BSB: %x, ESB: %x",
3988                                  ips_name, ha->host_num,
3989                                  scb->cmd.basic_io.op_code, basic_status,
3990                                  ext_status);
3991                }
3992
3993                ips_map_status(ha, scb, sp);
3994        }                       /* else */
3995}
3996
3997/****************************************************************************/
3998/*                                                                          */
3999/* Routine Name: ips_online                                                 */
4000/*                                                                          */
4001/* Routine Description:                                                     */
4002/*                                                                          */
4003/*   Determine if a logical drive is online                                 */
4004/*                                                                          */
4005/****************************************************************************/
4006static int
4007ips_online(ips_ha_t * ha, ips_scb_t * scb)
4008{
4009        METHOD_TRACE("ips_online", 1);
4010
4011        if (scb->target_id >= IPS_MAX_LD)
4012                return (0);
4013
4014        if ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1) {
4015                memset(ha->logical_drive_info, 0, sizeof (IPS_LD_INFO));
4016                return (0);
4017        }
4018
4019        if (ha->logical_drive_info->drive_info[scb->target_id].state !=
4020            IPS_LD_OFFLINE
4021            && ha->logical_drive_info->drive_info[scb->target_id].state !=
4022            IPS_LD_FREE
4023            && ha->logical_drive_info->drive_info[scb->target_id].state !=
4024            IPS_LD_CRS
4025            && ha->logical_drive_info->drive_info[scb->target_id].state !=
4026            IPS_LD_SYS)
4027                return (1);
4028        else
4029                return (0);
4030}
4031
4032/****************************************************************************/
4033/*                                                                          */
4034/* Routine Name: ips_inquiry                                                */
4035/*                                                                          */
4036/* Routine Description:                                                     */
4037/*                                                                          */
4038/*   Simulate an inquiry command to a logical drive                         */
4039/*                                                                          */
4040/****************************************************************************/
4041static int
4042ips_inquiry(ips_ha_t * ha, ips_scb_t * scb)
4043{
4044        IPS_SCSI_INQ_DATA inquiry;
4045
4046        METHOD_TRACE("ips_inquiry", 1);
4047
4048        memset(&inquiry, 0, sizeof (IPS_SCSI_INQ_DATA));
4049
4050        inquiry.DeviceType = IPS_SCSI_INQ_TYPE_DASD;
4051        inquiry.DeviceTypeQualifier = IPS_SCSI_INQ_LU_CONNECTED;
4052        inquiry.Version = IPS_SCSI_INQ_REV2;
4053        inquiry.ResponseDataFormat = IPS_SCSI_INQ_RD_REV2;
4054        inquiry.AdditionalLength = 31;
4055        inquiry.Flags[0] = IPS_SCSI_INQ_Address16;
4056        inquiry.Flags[1] =
4057            IPS_SCSI_INQ_WBus16 | IPS_SCSI_INQ_Sync | IPS_SCSI_INQ_CmdQue;
4058        strncpy(inquiry.VendorId, "IBM     ", 8);
4059        strncpy(inquiry.ProductId, "SERVERAID       ", 16);
4060        strncpy(inquiry.ProductRevisionLevel, "1.00", 4);
4061
4062        ips_scmd_buf_write(scb->scsi_cmd, &inquiry, sizeof (inquiry));
4063
4064        return (1);
4065}
4066
4067/****************************************************************************/
4068/*                                                                          */
4069/* Routine Name: ips_rdcap                                                  */
4070/*                                                                          */
4071/* Routine Description:                                                     */
4072/*                                                                          */
4073/*   Simulate a read capacity command to a logical drive                    */
4074/*                                                                          */
4075/****************************************************************************/
4076static int
4077ips_rdcap(ips_ha_t * ha, ips_scb_t * scb)
4078{
4079        IPS_SCSI_CAPACITY cap;
4080
4081        METHOD_TRACE("ips_rdcap", 1);
4082
4083        if (scsi_bufflen(scb->scsi_cmd) < 8)
4084                return (0);
4085
4086        cap.lba =
4087            cpu_to_be32(le32_to_cpu
4088                        (ha->logical_drive_info->
4089                         drive_info[scb->target_id].sector_count) - 1);
4090        cap.len = cpu_to_be32((uint32_t) IPS_BLKSIZE);
4091
4092        ips_scmd_buf_write(scb->scsi_cmd, &cap, sizeof (cap));
4093
4094        return (1);
4095}
4096
4097/****************************************************************************/
4098/*                                                                          */
4099/* Routine Name: ips_msense                                                 */
4100/*                                                                          */
4101/* Routine Description:                                                     */
4102/*                                                                          */
4103/*   Simulate a mode sense command to a logical drive                       */
4104/*                                                                          */
4105/****************************************************************************/
4106static int
4107ips_msense(ips_ha_t * ha, ips_scb_t * scb)
4108{
4109        uint16_t heads;
4110        uint16_t sectors;
4111        uint32_t cylinders;
4112        IPS_SCSI_MODE_PAGE_DATA mdata;
4113
4114        METHOD_TRACE("ips_msense", 1);
4115
4116        if (le32_to_cpu(ha->enq->ulDriveSize[scb->target_id]) > 0x400000 &&
4117            (ha->enq->ucMiscFlag & 0x8) == 0) {
4118                heads = IPS_NORM_HEADS;
4119                sectors = IPS_NORM_SECTORS;
4120        } else {
4121                heads = IPS_COMP_HEADS;
4122                sectors = IPS_COMP_SECTORS;
4123        }
4124
4125        cylinders =
4126            (le32_to_cpu(ha->enq->ulDriveSize[scb->target_id]) -
4127             1) / (heads * sectors);
4128
4129        memset(&mdata, 0, sizeof (IPS_SCSI_MODE_PAGE_DATA));
4130
4131        mdata.hdr.BlockDescLength = 8;
4132
4133        switch (scb->scsi_cmd->cmnd[2] & 0x3f) {
4134        case 0x03:              /* page 3 */
4135                mdata.pdata.pg3.PageCode = 3;
4136                mdata.pdata.pg3.PageLength = sizeof (IPS_SCSI_MODE_PAGE3);
4137                mdata.hdr.DataLength =
4138                    3 + mdata.hdr.BlockDescLength + mdata.pdata.pg3.PageLength;
4139                mdata.pdata.pg3.TracksPerZone = 0;
4140                mdata.pdata.pg3.AltSectorsPerZone = 0;
4141                mdata.pdata.pg3.AltTracksPerZone = 0;
4142                mdata.pdata.pg3.AltTracksPerVolume = 0;
4143                mdata.pdata.pg3.SectorsPerTrack = cpu_to_be16(sectors);
4144                mdata.pdata.pg3.BytesPerSector = cpu_to_be16(IPS_BLKSIZE);
4145                mdata.pdata.pg3.Interleave = cpu_to_be16(1);
4146                mdata.pdata.pg3.TrackSkew = 0;
4147                mdata.pdata.pg3.CylinderSkew = 0;
4148                mdata.pdata.pg3.flags = IPS_SCSI_MP3_SoftSector;
4149                break;
4150
4151        case 0x4:
4152                mdata.pdata.pg4.PageCode = 4;
4153                mdata.pdata.pg4.PageLength = sizeof (IPS_SCSI_MODE_PAGE4);
4154                mdata.hdr.DataLength =
4155                    3 + mdata.hdr.BlockDescLength + mdata.pdata.pg4.PageLength;
4156                mdata.pdata.pg4.CylindersHigh =
4157                    cpu_to_be16((cylinders >> 8) & 0xFFFF);
4158                mdata.pdata.pg4.CylindersLow = (cylinders & 0xFF);
4159                mdata.pdata.pg4.Heads = heads;
4160                mdata.pdata.pg4.WritePrecompHigh = 0;
4161                mdata.pdata.pg4.WritePrecompLow = 0;
4162                mdata.pdata.pg4.ReducedWriteCurrentHigh = 0;
4163                mdata.pdata.pg4.ReducedWriteCurrentLow = 0;
4164                mdata.pdata.pg4.StepRate = cpu_to_be16(1);
4165                mdata.pdata.pg4.LandingZoneHigh = 0;
4166                mdata.pdata.pg4.LandingZoneLow = 0;
4167                mdata.pdata.pg4.flags = 0;
4168                mdata.pdata.pg4.RotationalOffset = 0;
4169                mdata.pdata.pg4.MediumRotationRate = 0;
4170                break;
4171        case 0x8:
4172                mdata.pdata.pg8.PageCode = 8;
4173                mdata.pdata.pg8.PageLength = sizeof (IPS_SCSI_MODE_PAGE8);
4174                mdata.hdr.DataLength =
4175                    3 + mdata.hdr.BlockDescLength + mdata.pdata.pg8.PageLength;
4176                /* everything else is left set to 0 */
4177                break;
4178
4179        default:
4180                return (0);
4181        }                       /* end switch */
4182
4183        ips_scmd_buf_write(scb->scsi_cmd, &mdata, sizeof (mdata));
4184
4185        return (1);
4186}
4187
4188/****************************************************************************/
4189/*                                                                          */
4190/* Routine Name: ips_reqsen                                                 */
4191/*                                                                          */
4192/* Routine Description:                                                     */
4193/*                                                                          */
4194/*   Simulate a request sense command to a logical drive                    */
4195/*                                                                          */
4196/****************************************************************************/
4197static int
4198ips_reqsen(ips_ha_t * ha, ips_scb_t * scb)
4199{
4200        IPS_SCSI_REQSEN reqsen;
4201
4202        METHOD_TRACE("ips_reqsen", 1);
4203
4204        memset(&reqsen, 0, sizeof (IPS_SCSI_REQSEN));
4205
4206        reqsen.ResponseCode =
4207            IPS_SCSI_REQSEN_VALID | IPS_SCSI_REQSEN_CURRENT_ERR;
4208        reqsen.AdditionalLength = 10;
4209        reqsen.AdditionalSenseCode = IPS_SCSI_REQSEN_NO_SENSE;
4210        reqsen.AdditionalSenseCodeQual = IPS_SCSI_REQSEN_NO_SENSE;
4211
4212        ips_scmd_buf_write(scb->scsi_cmd, &reqsen, sizeof (reqsen));
4213
4214        return (1);
4215}
4216
4217/****************************************************************************/
4218/*                                                                          */
4219/* Routine Name: ips_free                                                   */
4220/*                                                                          */
4221/* Routine Description:                                                     */
4222/*                                                                          */
4223/*   Free any allocated space for this controller                           */
4224/*                                                                          */
4225/****************************************************************************/
4226static void
4227ips_free(ips_ha_t * ha)
4228{
4229
4230        METHOD_TRACE("ips_free", 1);
4231
4232        if (ha) {
4233                if (ha->enq) {
4234                        pci_free_consistent(ha->pcidev, sizeof(IPS_ENQ),
4235                                            ha->enq, ha->enq_busaddr);
4236                        ha->enq = NULL;
4237                }
4238
4239                kfree(ha->conf);
4240                ha->conf = NULL;
4241
4242                if (ha->adapt) {
4243                        pci_free_consistent(ha->pcidev,
4244                                            sizeof (IPS_ADAPTER) +
4245                                            sizeof (IPS_IO_CMD), ha->adapt,
4246                                            ha->adapt->hw_status_start);
4247                        ha->adapt = NULL;
4248                }
4249
4250                if (ha->logical_drive_info) {
4251                        pci_free_consistent(ha->pcidev,
4252                                            sizeof (IPS_LD_INFO),
4253                                            ha->logical_drive_info,
4254                                            ha->logical_drive_info_dma_addr);
4255                        ha->logical_drive_info = NULL;
4256                }
4257
4258                kfree(ha->nvram);
4259                ha->nvram = NULL;
4260
4261                kfree(ha->subsys);
4262                ha->subsys = NULL;
4263
4264                if (ha->ioctl_data) {
4265                        pci_free_consistent(ha->pcidev, ha->ioctl_len,
4266                                            ha->ioctl_data, ha->ioctl_busaddr);
4267                        ha->ioctl_data = NULL;
4268                        ha->ioctl_datasize = 0;
4269                        ha->ioctl_len = 0;
4270                }
4271                ips_deallocatescbs(ha, ha->max_cmds);
4272
4273                /* free memory mapped (if applicable) */
4274                if (ha->mem_ptr) {
4275                        iounmap(ha->ioremap_ptr);
4276                        ha->ioremap_ptr = NULL;
4277                        ha->mem_ptr = NULL;
4278                }
4279
4280                ha->mem_addr = 0;
4281
4282        }
4283}
4284
4285/****************************************************************************/
4286/*                                                                          */
4287/* Routine Name: ips_deallocatescbs                                         */
4288/*                                                                          */
4289/* Routine Description:                                                     */
4290/*                                                                          */
4291/*   Free the command blocks                                                */
4292/*                                                                          */
4293/****************************************************************************/
4294static int
4295ips_deallocatescbs(ips_ha_t * ha, int cmds)
4296{
4297        if (ha->scbs) {
4298                pci_free_consistent(ha->pcidev,
4299                                    IPS_SGLIST_SIZE(ha) * IPS_MAX_SG * cmds,
4300                                    ha->scbs->sg_list.list,
4301                                    ha->scbs->sg_busaddr);
4302                pci_free_consistent(ha->pcidev, sizeof (ips_scb_t) * cmds,
4303                                    ha->scbs, ha->scbs->scb_busaddr);
4304                ha->scbs = NULL;
4305        }                       /* end if */
4306        return 1;
4307}
4308
4309/****************************************************************************/
4310/*                                                                          */
4311/* Routine Name: ips_allocatescbs                                           */
4312/*                                                                          */
4313/* Routine Description:                                                     */
4314/*                                                                          */
4315/*   Allocate the command blocks                                            */
4316/*                                                                          */
4317/****************************************************************************/
4318static int
4319ips_allocatescbs(ips_ha_t * ha)
4320{
4321        ips_scb_t *scb_p;
4322        IPS_SG_LIST ips_sg;
4323        int i;
4324        dma_addr_t command_dma, sg_dma;
4325
4326        METHOD_TRACE("ips_allocatescbs", 1);
4327
4328        /* Allocate memory for the SCBs */
4329        ha->scbs =
4330            pci_alloc_consistent(ha->pcidev, ha->max_cmds * sizeof (ips_scb_t),
4331                                 &command_dma);
4332        if (ha->scbs == NULL)
4333                return 0;
4334        ips_sg.list =
4335            pci_alloc_consistent(ha->pcidev,
4336                                 IPS_SGLIST_SIZE(ha) * IPS_MAX_SG *
4337                                 ha->max_cmds, &sg_dma);
4338        if (ips_sg.list == NULL) {
4339                pci_free_consistent(ha->pcidev,
4340                                    ha->max_cmds * sizeof (ips_scb_t), ha->scbs,
4341                                    command_dma);
4342                return 0;
4343        }
4344
4345        memset(ha->scbs, 0, ha->max_cmds * sizeof (ips_scb_t));
4346
4347        for (i = 0; i < ha->max_cmds; i++) {
4348                scb_p = &ha->scbs[i];
4349                scb_p->scb_busaddr = command_dma + sizeof (ips_scb_t) * i;
4350                /* set up S/G list */
4351                if (IPS_USE_ENH_SGLIST(ha)) {
4352                        scb_p->sg_list.enh_list =
4353                            ips_sg.enh_list + i * IPS_MAX_SG;
4354                        scb_p->sg_busaddr =
4355                            sg_dma + IPS_SGLIST_SIZE(ha) * IPS_MAX_SG * i;
4356                } else {
4357                        scb_p->sg_list.std_list =
4358                            ips_sg.std_list + i * IPS_MAX_SG;
4359                        scb_p->sg_busaddr =
4360                            sg_dma + IPS_SGLIST_SIZE(ha) * IPS_MAX_SG * i;
4361                }
4362
4363                /* add to the free list */
4364                if (i < ha->max_cmds - 1) {
4365                        scb_p->q_next = ha->scb_freelist;
4366                        ha->scb_freelist = scb_p;
4367                }
4368        }
4369
4370        /* success */
4371        return (1);
4372}
4373
4374/****************************************************************************/
4375/*                                                                          */
4376/* Routine Name: ips_init_scb                                               */
4377/*                                                                          */
4378/* Routine Description:                                                     */
4379/*                                                                          */
4380/*   Initialize a CCB to default values                                     */
4381/*                                                                          */
4382/****************************************************************************/
4383static void
4384ips_init_scb(ips_ha_t * ha, ips_scb_t * scb)
4385{
4386        IPS_SG_LIST sg_list;
4387        uint32_t cmd_busaddr, sg_busaddr;
4388        METHOD_TRACE("ips_init_scb", 1);
4389
4390        if (scb == NULL)
4391                return;
4392
4393        sg_list.list = scb->sg_list.list;
4394        cmd_busaddr = scb->scb_busaddr;
4395        sg_busaddr = scb->sg_busaddr;
4396        /* zero fill */
4397        memset(scb, 0, sizeof (ips_scb_t));
4398        memset(ha->dummy, 0, sizeof (IPS_IO_CMD));
4399
4400        /* Initialize dummy command bucket */
4401        ha->dummy->op_code = 0xFF;
4402        ha->dummy->ccsar = cpu_to_le32(ha->adapt->hw_status_start
4403                                       + sizeof (IPS_ADAPTER));
4404        ha->dummy->command_id = IPS_MAX_CMDS;
4405
4406        /* set bus address of scb */
4407        scb->scb_busaddr = cmd_busaddr;
4408        scb->sg_busaddr = sg_busaddr;
4409        scb->sg_list.list = sg_list.list;
4410
4411        /* Neptune Fix */
4412        scb->cmd.basic_io.cccr = cpu_to_le32((uint32_t) IPS_BIT_ILE);
4413        scb->cmd.basic_io.ccsar = cpu_to_le32(ha->adapt->hw_status_start
4414                                              + sizeof (IPS_ADAPTER));
4415}
4416
4417/****************************************************************************/
4418/*                                                                          */
4419/* Routine Name: ips_get_scb                                                */
4420/*                                                                          */
4421/* Routine Description:                                                     */
4422/*                                                                          */
4423/*   Initialize a CCB to default values                                     */
4424/*                                                                          */
4425/* ASSUMED to be called from within a lock                                 */
4426/*                                                                          */
4427/****************************************************************************/
4428static ips_scb_t *
4429ips_getscb(ips_ha_t * ha)
4430{
4431        ips_scb_t *scb;
4432
4433        METHOD_TRACE("ips_getscb", 1);
4434
4435        if ((scb = ha->scb_freelist) == NULL) {
4436
4437                return (NULL);
4438        }
4439
4440        ha->scb_freelist = scb->q_next;
4441        scb->flags = 0;
4442        scb->q_next = NULL;
4443
4444        ips_init_scb(ha, scb);
4445
4446        return (scb);
4447}
4448
4449/****************************************************************************/
4450/*                                                                          */
4451/* Routine Name: ips_free_scb                                               */
4452/*                                                                          */
4453/* Routine Description:                                                     */
4454/*                                                                          */
4455/*   Return an unused CCB back to the free list                             */
4456/*                                                                          */
4457/* ASSUMED to be called from within a lock                                  */
4458/*                                                                          */
4459/****************************************************************************/
4460static void
4461ips_freescb(ips_ha_t * ha, ips_scb_t * scb)
4462{
4463
4464        METHOD_TRACE("ips_freescb", 1);
4465        if (scb->flags & IPS_SCB_MAP_SG)
4466                scsi_dma_unmap(scb->scsi_cmd);
4467        else if (scb->flags & IPS_SCB_MAP_SINGLE)
4468                pci_unmap_single(ha->pcidev, scb->data_busaddr, scb->data_len,
4469                                 IPS_DMA_DIR(scb));
4470
4471        /* check to make sure this is not our "special" scb */
4472        if (IPS_COMMAND_ID(ha, scb) < (ha->max_cmds - 1)) {
4473                scb->q_next = ha->scb_freelist;
4474                ha->scb_freelist = scb;
4475        }
4476}
4477
4478/****************************************************************************/
4479/*                                                                          */
4480/* Routine Name: ips_isinit_copperhead                                      */
4481/*                                                                          */
4482/* Routine Description:                                                     */
4483/*                                                                          */
4484/*   Is controller initialized ?                                            */
4485/*                                                                          */
4486/****************************************************************************/
4487static int
4488ips_isinit_copperhead(ips_ha_t * ha)
4489{
4490        uint8_t scpr;
4491        uint8_t isr;
4492
4493        METHOD_TRACE("ips_isinit_copperhead", 1);
4494
4495        isr = inb(ha->io_addr + IPS_REG_HISR);
4496        scpr = inb(ha->io_addr + IPS_REG_SCPR);
4497
4498        if (((isr & IPS_BIT_EI) == 0) && ((scpr & IPS_BIT_EBM) == 0))
4499                return (0);
4500        else
4501                return (1);
4502}
4503
4504/****************************************************************************/
4505/*                                                                          */
4506/* Routine Name: ips_isinit_copperhead_memio                                */
4507/*                                                                          */
4508/* Routine Description:                                                     */
4509/*                                                                          */
4510/*   Is controller initialized ?                                            */
4511/*                                                                          */
4512/****************************************************************************/
4513static int
4514ips_isinit_copperhead_memio(ips_ha_t * ha)
4515{
4516        uint8_t isr = 0;
4517        uint8_t scpr;
4518
4519        METHOD_TRACE("ips_is_init_copperhead_memio", 1);
4520
4521        isr = readb(ha->mem_ptr + IPS_REG_HISR);
4522        scpr = readb(ha->mem_ptr + IPS_REG_SCPR);
4523
4524        if (((isr & IPS_BIT_EI) == 0) && ((scpr & IPS_BIT_EBM) == 0))
4525                return (0);
4526        else
4527                return (1);
4528}
4529
4530/****************************************************************************/
4531/*                                                                          */
4532/* Routine Name: ips_isinit_morpheus                                        */
4533/*                                                                          */
4534/* Routine Description:                                                     */
4535/*                                                                          */
4536/*   Is controller initialized ?                                            */
4537/*                                                                          */
4538/****************************************************************************/
4539static int
4540ips_isinit_morpheus(ips_ha_t * ha)
4541{
4542        uint32_t post;
4543        uint32_t bits;
4544
4545        METHOD_TRACE("ips_is_init_morpheus", 1);
4546
4547        if (ips_isintr_morpheus(ha))
4548            ips_flush_and_reset(ha);
4549
4550        post = readl(ha->mem_ptr + IPS_REG_I960_MSG0);
4551        bits = readl(ha->mem_ptr + IPS_REG_I2O_HIR);
4552
4553        if (post == 0)
4554                return (0);
4555        else if (bits & 0x3)
4556                return (0);
4557        else
4558                return (1);
4559}
4560
4561/****************************************************************************/
4562/*                                                                          */
4563/* Routine Name: ips_flush_and_reset                                        */
4564/*                                                                          */
4565/* Routine Description:                                                     */
4566/*                                                                          */
4567/*   Perform cleanup ( FLUSH and RESET ) when the adapter is in an unknown  */
4568/*   state ( was trying to INIT and an interrupt was already pending ) ...  */
4569/*                                                                          */
4570/****************************************************************************/
4571static void
4572ips_flush_and_reset(ips_ha_t *ha)
4573{
4574        ips_scb_t *scb;
4575        int  ret;
4576        int  time;
4577        int  done;
4578        dma_addr_t command_dma;
4579
4580        /* Create a usuable SCB */
4581        scb = pci_alloc_consistent(ha->pcidev, sizeof(ips_scb_t), &command_dma);
4582        if (scb) {
4583            memset(scb, 0, sizeof(ips_scb_t));
4584            ips_init_scb(ha, scb);
4585            scb->scb_busaddr = command_dma;
4586
4587            scb->timeout = ips_cmd_timeout;
4588            scb->cdb[0] = IPS_CMD_FLUSH;
4589
4590            scb->cmd.flush_cache.op_code = IPS_CMD_FLUSH;
4591            scb->cmd.flush_cache.command_id = IPS_MAX_CMDS;   /* Use an ID that would otherwise not exist */
4592            scb->cmd.flush_cache.state = IPS_NORM_STATE;
4593            scb->cmd.flush_cache.reserved = 0;
4594            scb->cmd.flush_cache.reserved2 = 0;
4595            scb->cmd.flush_cache.reserved3 = 0;
4596            scb->cmd.flush_cache.reserved4 = 0;
4597
4598            ret = ips_send_cmd(ha, scb);                      /* Send the Flush Command */
4599
4600            if (ret == IPS_SUCCESS) {
4601                time = 60 * IPS_ONE_SEC;                      /* Max Wait time is 60 seconds */
4602                done = 0;
4603
4604                while ((time > 0) && (!done)) {
4605                   done = ips_poll_for_flush_complete(ha);
4606                   /* This may look evil, but it's only done during extremely rare start-up conditions ! */
4607                   udelay(1000);
4608                   time--;
4609                }
4610        }
4611        }
4612
4613        /* Now RESET and INIT the adapter */
4614        (*ha->func.reset) (ha);
4615
4616        pci_free_consistent(ha->pcidev, sizeof(ips_scb_t), scb, command_dma);
4617        return;
4618}
4619
4620/****************************************************************************/
4621/*                                                                          */
4622/* Routine Name: ips_poll_for_flush_complete                                */
4623/*                                                                          */
4624/* Routine Description:                                                     */
4625/*                                                                          */
4626/*   Poll for the Flush Command issued by ips_flush_and_reset() to complete */
4627/*   All other responses are just taken off the queue and ignored           */
4628/*                                                                          */
4629/****************************************************************************/
4630static int
4631ips_poll_for_flush_complete(ips_ha_t * ha)
4632{
4633        IPS_STATUS cstatus;
4634
4635        while (TRUE) {
4636            cstatus.value = (*ha->func.statupd) (ha);
4637
4638            if (cstatus.value == 0xffffffff)      /* If No Interrupt to process */
4639                        break;
4640
4641            /* Success is when we see the Flush Command ID */
4642            if (cstatus.fields.command_id == IPS_MAX_CMDS)
4643                return 1;
4644         }
4645
4646        return 0;
4647}
4648
4649/****************************************************************************/
4650/*                                                                          */
4651/* Routine Name: ips_enable_int_copperhead                                  */
4652/*                                                                          */
4653/* Routine Description:                                                     */
4654/*   Turn on interrupts                                                     */
4655/*                                                                          */
4656/****************************************************************************/
4657static void
4658ips_enable_int_copperhead(ips_ha_t * ha)
4659{
4660        METHOD_TRACE("ips_enable_int_copperhead", 1);
4661
4662        outb(ha->io_addr + IPS_REG_HISR, IPS_BIT_EI);
4663        inb(ha->io_addr + IPS_REG_HISR);        /*Ensure PCI Posting Completes*/
4664}
4665
4666/****************************************************************************/
4667/*                                                                          */
4668/* Routine Name: ips_enable_int_copperhead_memio                            */
4669/*                                                                          */
4670/* Routine Description:                                                     */
4671/*   Turn on interrupts                                                     */
4672/*                                                                          */
4673/****************************************************************************/
4674static void
4675ips_enable_int_copperhead_memio(ips_ha_t * ha)
4676{
4677        METHOD_TRACE("ips_enable_int_copperhead_memio", 1);
4678
4679        writeb(IPS_BIT_EI, ha->mem_ptr + IPS_REG_HISR);
4680        readb(ha->mem_ptr + IPS_REG_HISR);      /*Ensure PCI Posting Completes*/
4681}
4682
4683/****************************************************************************/
4684/*                                                                          */
4685/* Routine Name: ips_enable_int_morpheus                                    */
4686/*                                                                          */
4687/* Routine Description:                                                     */
4688/*   Turn on interrupts                                                     */
4689/*                                                                          */
4690/****************************************************************************/
4691static void
4692ips_enable_int_morpheus(ips_ha_t * ha)
4693{
4694        uint32_t Oimr;
4695
4696        METHOD_TRACE("ips_enable_int_morpheus", 1);
4697
4698        Oimr = readl(ha->mem_ptr + IPS_REG_I960_OIMR);
4699        Oimr &= ~0x08;
4700        writel(Oimr, ha->mem_ptr + IPS_REG_I960_OIMR);
4701        readl(ha->mem_ptr + IPS_REG_I960_OIMR); /*Ensure PCI Posting Completes*/
4702}
4703
4704/****************************************************************************/
4705/*                                                                          */
4706/* Routine Name: ips_init_copperhead                                        */
4707/*                                                                          */
4708/* Routine Description:                                                     */
4709/*                                                                          */
4710/*   Initialize a copperhead controller                                     */
4711/*                                                                          */
4712/****************************************************************************/
4713static int
4714ips_init_copperhead(ips_ha_t * ha)
4715{
4716        uint8_t Isr;
4717        uint8_t Cbsp;
4718        uint8_t PostByte[IPS_MAX_POST_BYTES];
4719        uint8_t ConfigByte[IPS_MAX_CONFIG_BYTES];
4720        int i, j;
4721
4722        METHOD_TRACE("ips_init_copperhead", 1);
4723
4724        for (i = 0; i < IPS_MAX_POST_BYTES; i++) {
4725                for (j = 0; j < 45; j++) {
4726                        Isr = inb(ha->io_addr + IPS_REG_HISR);
4727                        if (Isr & IPS_BIT_GHI)
4728                                break;
4729
4730                        /* Delay for 1 Second */
4731                        MDELAY(IPS_ONE_SEC);
4732                }
4733
4734                if (j >= 45)
4735                        /* error occurred */
4736                        return (0);
4737
4738                PostByte[i] = inb(ha->io_addr + IPS_REG_ISPR);
4739                outb(Isr, ha->io_addr + IPS_REG_HISR);
4740        }
4741
4742        if (PostByte[0] < IPS_GOOD_POST_STATUS) {
4743                IPS_PRINTK(KERN_WARNING, ha->pcidev,
4744                           "reset controller fails (post status %x %x).\n",
4745                           PostByte[0], PostByte[1]);
4746
4747                return (0);
4748        }
4749
4750        for (i = 0; i < IPS_MAX_CONFIG_BYTES; i++) {
4751                for (j = 0; j < 240; j++) {
4752                        Isr = inb(ha->io_addr + IPS_REG_HISR);
4753                        if (Isr & IPS_BIT_GHI)
4754                                break;
4755
4756                        /* Delay for 1 Second */
4757                        MDELAY(IPS_ONE_SEC);
4758                }
4759
4760                if (j >= 240)
4761                        /* error occurred */
4762                        return (0);
4763
4764                ConfigByte[i] = inb(ha->io_addr + IPS_REG_ISPR);
4765                outb(Isr, ha->io_addr + IPS_REG_HISR);
4766        }
4767
4768        for (i = 0; i < 240; i++) {
4769                Cbsp = inb(ha->io_addr + IPS_REG_CBSP);
4770
4771                if ((Cbsp & IPS_BIT_OP) == 0)
4772                        break;
4773
4774                /* Delay for 1 Second */
4775                MDELAY(IPS_ONE_SEC);
4776        }
4777
4778        if (i >= 240)
4779                /* reset failed */
4780                return (0);
4781
4782        /* setup CCCR */
4783        outl(0x1010, ha->io_addr + IPS_REG_CCCR);
4784
4785        /* Enable busmastering */
4786        outb(IPS_BIT_EBM, ha->io_addr + IPS_REG_SCPR);
4787
4788        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
4789                /* fix for anaconda64 */
4790                outl(0, ha->io_addr + IPS_REG_NDAE);
4791
4792        /* Enable interrupts */
4793        outb(IPS_BIT_EI, ha->io_addr + IPS_REG_HISR);
4794
4795        return (1);
4796}
4797
4798/****************************************************************************/
4799/*                                                                          */
4800/* Routine Name: ips_init_copperhead_memio                                  */
4801/*                                                                          */
4802/* Routine Description:                                                     */
4803/*                                                                          */
4804/*   Initialize a copperhead controller with memory mapped I/O              */
4805/*                                                                          */
4806/****************************************************************************/
4807static int
4808ips_init_copperhead_memio(ips_ha_t * ha)
4809{
4810        uint8_t Isr = 0;
4811        uint8_t Cbsp;
4812        uint8_t PostByte[IPS_MAX_POST_BYTES];
4813        uint8_t ConfigByte[IPS_MAX_CONFIG_BYTES];
4814        int i, j;
4815
4816        METHOD_TRACE("ips_init_copperhead_memio", 1);
4817
4818        for (i = 0; i < IPS_MAX_POST_BYTES; i++) {
4819                for (j = 0; j < 45; j++) {
4820                        Isr = readb(ha->mem_ptr + IPS_REG_HISR);
4821                        if (Isr & IPS_BIT_GHI)
4822                                break;
4823
4824                        /* Delay for 1 Second */
4825                        MDELAY(IPS_ONE_SEC);
4826                }
4827
4828                if (j >= 45)
4829                        /* error occurred */
4830                        return (0);
4831
4832                PostByte[i] = readb(ha->mem_ptr + IPS_REG_ISPR);
4833                writeb(Isr, ha->mem_ptr + IPS_REG_HISR);
4834        }
4835
4836        if (PostByte[0] < IPS_GOOD_POST_STATUS) {
4837                IPS_PRINTK(KERN_WARNING, ha->pcidev,
4838                           "reset controller fails (post status %x %x).\n",
4839                           PostByte[0], PostByte[1]);
4840
4841                return (0);
4842        }
4843
4844        for (i = 0; i < IPS_MAX_CONFIG_BYTES; i++) {
4845                for (j = 0; j < 240; j++) {
4846                        Isr = readb(ha->mem_ptr + IPS_REG_HISR);
4847                        if (Isr & IPS_BIT_GHI)
4848                                break;
4849
4850                        /* Delay for 1 Second */
4851                        MDELAY(IPS_ONE_SEC);
4852                }
4853
4854                if (j >= 240)
4855                        /* error occurred */
4856                        return (0);
4857
4858                ConfigByte[i] = readb(ha->mem_ptr + IPS_REG_ISPR);
4859                writeb(Isr, ha->mem_ptr + IPS_REG_HISR);
4860        }
4861
4862        for (i = 0; i < 240; i++) {
4863                Cbsp = readb(ha->mem_ptr + IPS_REG_CBSP);
4864
4865                if ((Cbsp & IPS_BIT_OP) == 0)
4866                        break;
4867
4868                /* Delay for 1 Second */
4869                MDELAY(IPS_ONE_SEC);
4870        }
4871
4872        if (i >= 240)
4873                /* error occurred */
4874                return (0);
4875
4876        /* setup CCCR */
4877        writel(0x1010, ha->mem_ptr + IPS_REG_CCCR);
4878
4879        /* Enable busmastering */
4880        writeb(IPS_BIT_EBM, ha->mem_ptr + IPS_REG_SCPR);
4881
4882        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
4883                /* fix for anaconda64 */
4884                writel(0, ha->mem_ptr + IPS_REG_NDAE);
4885
4886        /* Enable interrupts */
4887        writeb(IPS_BIT_EI, ha->mem_ptr + IPS_REG_HISR);
4888
4889        /* if we get here then everything went OK */
4890        return (1);
4891}
4892
4893/****************************************************************************/
4894/*                                                                          */
4895/* Routine Name: ips_init_morpheus                                          */
4896/*                                                                          */
4897/* Routine Description:                                                     */
4898/*                                                                          */
4899/*   Initialize a morpheus controller                                       */
4900/*                                                                          */
4901/****************************************************************************/
4902static int
4903ips_init_morpheus(ips_ha_t * ha)
4904{
4905        uint32_t Post;
4906        uint32_t Config;
4907        uint32_t Isr;
4908        uint32_t Oimr;
4909        int i;
4910
4911        METHOD_TRACE("ips_init_morpheus", 1);
4912
4913        /* Wait up to 45 secs for Post */
4914        for (i = 0; i < 45; i++) {
4915                Isr = readl(ha->mem_ptr + IPS_REG_I2O_HIR);
4916
4917                if (Isr & IPS_BIT_I960_MSG0I)
4918                        break;
4919
4920                /* Delay for 1 Second */
4921                MDELAY(IPS_ONE_SEC);
4922        }
4923
4924        if (i >= 45) {
4925                /* error occurred */
4926                IPS_PRINTK(KERN_WARNING, ha->pcidev,
4927                           "timeout waiting for post.\n");
4928
4929                return (0);
4930        }
4931
4932        Post = readl(ha->mem_ptr + IPS_REG_I960_MSG0);
4933
4934        if (Post == 0x4F00) {   /* If Flashing the Battery PIC         */
4935                IPS_PRINTK(KERN_WARNING, ha->pcidev,
4936                           "Flashing Battery PIC, Please wait ...\n");
4937
4938                /* Clear the interrupt bit */
4939                Isr = (uint32_t) IPS_BIT_I960_MSG0I;
4940                writel(Isr, ha->mem_ptr + IPS_REG_I2O_HIR);
4941
4942                for (i = 0; i < 120; i++) {     /*    Wait Up to 2 Min. for Completion */
4943                        Post = readl(ha->mem_ptr + IPS_REG_I960_MSG0);
4944                        if (Post != 0x4F00)
4945                                break;
4946                        /* Delay for 1 Second */
4947                        MDELAY(IPS_ONE_SEC);
4948                }
4949
4950                if (i >= 120) {
4951                        IPS_PRINTK(KERN_WARNING, ha->pcidev,
4952                                   "timeout waiting for Battery PIC Flash\n");
4953                        return (0);
4954                }
4955
4956        }
4957
4958        /* Clear the interrupt bit */
4959        Isr = (uint32_t) IPS_BIT_I960_MSG0I;
4960        writel(Isr, ha->mem_ptr + IPS_REG_I2O_HIR);
4961
4962        if (Post < (IPS_GOOD_POST_STATUS << 8)) {
4963                IPS_PRINTK(KERN_WARNING, ha->pcidev,
4964                           "reset controller fails (post status %x).\n", Post);
4965
4966                return (0);
4967        }
4968
4969        /* Wait up to 240 secs for config bytes */
4970        for (i = 0; i < 240; i++) {
4971                Isr = readl(ha->mem_ptr + IPS_REG_I2O_HIR);
4972
4973                if (Isr & IPS_BIT_I960_MSG1I)
4974                        break;
4975
4976                /* Delay for 1 Second */
4977                MDELAY(IPS_ONE_SEC);
4978        }
4979
4980        if (i >= 240) {
4981                /* error occurred */
4982                IPS_PRINTK(KERN_WARNING, ha->pcidev,
4983                           "timeout waiting for config.\n");
4984
4985                return (0);
4986        }
4987
4988        Config = readl(ha->mem_ptr + IPS_REG_I960_MSG1);
4989
4990        /* Clear interrupt bit */
4991        Isr = (uint32_t) IPS_BIT_I960_MSG1I;
4992        writel(Isr, ha->mem_ptr + IPS_REG_I2O_HIR);
4993
4994        /* Turn on the interrupts */
4995        Oimr = readl(ha->mem_ptr + IPS_REG_I960_OIMR);
4996        Oimr &= ~0x8;
4997        writel(Oimr, ha->mem_ptr + IPS_REG_I960_OIMR);
4998
4999        /* if we get here then everything went OK */
5000
5001        /* Since we did a RESET, an EraseStripeLock may be needed */
5002        if (Post == 0xEF10) {
5003                if ((Config == 0x000F) || (Config == 0x0009))
5004                        ha->requires_esl = 1;
5005        }
5006
5007        return (1);
5008}
5009
5010/****************************************************************************/
5011/*                                                                          */
5012/* Routine Name: ips_reset_copperhead                                       */
5013/*                                                                          */
5014/* Routine Description:                                                     */
5015/*                                                                          */
5016/*   Reset the controller                                                   */
5017/*                                                                          */
5018/****************************************************************************/
5019static int
5020ips_reset_copperhead(ips_ha_t * ha)
5021{
5022        int reset_counter;
5023
5024        METHOD_TRACE("ips_reset_copperhead", 1);
5025
5026        DEBUG_VAR(1, "(%s%d) ips_reset_copperhead: io addr: %x, irq: %d",
5027                  ips_name, ha->host_num, ha->io_addr, ha->pcidev->irq);
5028
5029        reset_counter = 0;
5030
5031        while (reset_counter < 2) {
5032                reset_counter++;
5033
5034                outb(IPS_BIT_RST, ha->io_addr + IPS_REG_SCPR);
5035
5036                /* Delay for 1 Second */
5037                MDELAY(IPS_ONE_SEC);
5038
5039                outb(0, ha->io_addr + IPS_REG_SCPR);
5040
5041                /* Delay for 1 Second */
5042                MDELAY(IPS_ONE_SEC);
5043
5044                if ((*ha->func.init) (ha))
5045                        break;
5046                else if (reset_counter >= 2) {
5047
5048                        return (0);
5049                }
5050        }
5051
5052        return (1);
5053}
5054
5055/****************************************************************************/
5056/*                                                                          */
5057/* Routine Name: ips_reset_copperhead_memio                                 */
5058/*                                                                          */
5059/* Routine Description:                                                     */
5060/*                                                                          */
5061/*   Reset the controller                                                   */
5062/*                                                                          */
5063/****************************************************************************/
5064static int
5065ips_reset_copperhead_memio(ips_ha_t * ha)
5066{
5067        int reset_counter;
5068
5069        METHOD_TRACE("ips_reset_copperhead_memio", 1);
5070
5071        DEBUG_VAR(1, "(%s%d) ips_reset_copperhead_memio: mem addr: %x, irq: %d",
5072                  ips_name, ha->host_num, ha->mem_addr, ha->pcidev->irq);
5073
5074        reset_counter = 0;
5075
5076        while (reset_counter < 2) {
5077                reset_counter++;
5078
5079                writeb(IPS_BIT_RST, ha->mem_ptr + IPS_REG_SCPR);
5080
5081                /* Delay for 1 Second */
5082                MDELAY(IPS_ONE_SEC);
5083
5084                writeb(0, ha->mem_ptr + IPS_REG_SCPR);
5085
5086                /* Delay for 1 Second */
5087                MDELAY(IPS_ONE_SEC);
5088
5089                if ((*ha->func.init) (ha))
5090                        break;
5091                else if (reset_counter >= 2) {
5092
5093                        return (0);
5094                }
5095        }
5096
5097        return (1);
5098}
5099
5100/****************************************************************************/
5101/*                                                                          */
5102/* Routine Name: ips_reset_morpheus                                         */
5103/*                                                                          */
5104/* Routine Description:                                                     */
5105/*                                                                          */
5106/*   Reset the controller                                                   */
5107/*                                                                          */
5108/****************************************************************************/
5109static int
5110ips_reset_morpheus(ips_ha_t * ha)
5111{
5112        int reset_counter;
5113        uint8_t junk;
5114
5115        METHOD_TRACE("ips_reset_morpheus", 1);
5116
5117        DEBUG_VAR(1, "(%s%d) ips_reset_morpheus: mem addr: %x, irq: %d",
5118                  ips_name, ha->host_num, ha->mem_addr, ha->pcidev->irq);
5119
5120        reset_counter = 0;
5121
5122        while (reset_counter < 2) {
5123                reset_counter++;
5124
5125                writel(0x80000000, ha->mem_ptr + IPS_REG_I960_IDR);
5126
5127                /* Delay for 5 Seconds */
5128                MDELAY(5 * IPS_ONE_SEC);
5129
5130                /* Do a PCI config read to wait for adapter */
5131                pci_read_config_byte(ha->pcidev, 4, &junk);
5132
5133                if ((*ha->func.init) (ha))
5134                        break;
5135                else if (reset_counter >= 2) {
5136
5137                        return (0);
5138                }
5139        }
5140
5141        return (1);
5142}
5143
5144/****************************************************************************/
5145/*                                                                          */
5146/* Routine Name: ips_statinit                                               */
5147/*                                                                          */
5148/* Routine Description:                                                     */
5149/*                                                                          */
5150/*   Initialize the status queues on the controller                         */
5151/*                                                                          */
5152/****************************************************************************/
5153static void
5154ips_statinit(ips_ha_t * ha)
5155{
5156        uint32_t phys_status_start;
5157
5158        METHOD_TRACE("ips_statinit", 1);
5159
5160        ha->adapt->p_status_start = ha->adapt->status;
5161        ha->adapt->p_status_end = ha->adapt->status + IPS_MAX_CMDS;
5162        ha->adapt->p_status_tail = ha->adapt->status;
5163
5164        phys_status_start = ha->adapt->hw_status_start;
5165        outl(phys_status_start, ha->io_addr + IPS_REG_SQSR);
5166        outl(phys_status_start + IPS_STATUS_Q_SIZE,
5167             ha->io_addr + IPS_REG_SQER);
5168        outl(phys_status_start + IPS_STATUS_SIZE,
5169             ha->io_addr + IPS_REG_SQHR);
5170        outl(phys_status_start, ha->io_addr + IPS_REG_SQTR);
5171
5172        ha->adapt->hw_status_tail = phys_status_start;
5173}
5174
5175/****************************************************************************/
5176/*                                                                          */
5177/* Routine Name: ips_statinit_memio                                         */
5178/*                                                                          */
5179/* Routine Description:                                                     */
5180/*                                                                          */
5181/*   Initialize the status queues on the controller                         */
5182/*                                                                          */
5183/****************************************************************************/
5184static void
5185ips_statinit_memio(ips_ha_t * ha)
5186{
5187        uint32_t phys_status_start;
5188
5189        METHOD_TRACE("ips_statinit_memio", 1);
5190
5191        ha->adapt->p_status_start = ha->adapt->status;
5192        ha->adapt->p_status_end = ha->adapt->status + IPS_MAX_CMDS;
5193        ha->adapt->p_status_tail = ha->adapt->status;
5194
5195        phys_status_start = ha->adapt->hw_status_start;
5196        writel(phys_status_start, ha->mem_ptr + IPS_REG_SQSR);
5197        writel(phys_status_start + IPS_STATUS_Q_SIZE,
5198               ha->mem_ptr + IPS_REG_SQER);
5199        writel(phys_status_start + IPS_STATUS_SIZE, ha->mem_ptr + IPS_REG_SQHR);
5200        writel(phys_status_start, ha->mem_ptr + IPS_REG_SQTR);
5201
5202        ha->adapt->hw_status_tail = phys_status_start;
5203}
5204
5205/****************************************************************************/
5206/*                                                                          */
5207/* Routine Name: ips_statupd_copperhead                                     */
5208/*                                                                          */
5209/* Routine Description:                                                     */
5210/*                                                                          */
5211/*   Remove an element from the status queue                                */
5212/*                                                                          */
5213/****************************************************************************/
5214static uint32_t
5215ips_statupd_copperhead(ips_ha_t * ha)
5216{
5217        METHOD_TRACE("ips_statupd_copperhead", 1);
5218
5219        if (ha->adapt->p_status_tail != ha->adapt->p_status_end) {
5220                ha->adapt->p_status_tail++;
5221                ha->adapt->hw_status_tail += sizeof (IPS_STATUS);
5222        } else {
5223                ha->adapt->p_status_tail = ha->adapt->p_status_start;
5224                ha->adapt->hw_status_tail = ha->adapt->hw_status_start;
5225        }
5226
5227        outl(ha->adapt->hw_status_tail,
5228             ha->io_addr + IPS_REG_SQTR);
5229
5230        return (ha->adapt->p_status_tail->value);
5231}
5232
5233/****************************************************************************/
5234/*                                                                          */
5235/* Routine Name: ips_statupd_copperhead_memio                               */
5236/*                                                                          */
5237/* Routine Description:                                                     */
5238/*                                                                          */
5239/*   Remove an element from the status queue                                */
5240/*                                                                          */
5241/****************************************************************************/
5242static uint32_t
5243ips_statupd_copperhead_memio(ips_ha_t * ha)
5244{
5245        METHOD_TRACE("ips_statupd_copperhead_memio", 1);
5246
5247        if (ha->adapt->p_status_tail != ha->adapt->p_status_end) {
5248                ha->adapt->p_status_tail++;
5249                ha->adapt->hw_status_tail += sizeof (IPS_STATUS);
5250        } else {
5251                ha->adapt->p_status_tail = ha->adapt->p_status_start;
5252                ha->adapt->hw_status_tail = ha->adapt->hw_status_start;
5253        }
5254
5255        writel(ha->adapt->hw_status_tail, ha->mem_ptr + IPS_REG_SQTR);
5256
5257        return (ha->adapt->p_status_tail->value);
5258}
5259
5260/****************************************************************************/
5261/*                                                                          */
5262/* Routine Name: ips_statupd_morpheus                                       */
5263/*                                                                          */
5264/* Routine Description:                                                     */
5265/*                                                                          */
5266/*   Remove an element from the status queue                                */
5267/*                                                                          */
5268/****************************************************************************/
5269static uint32_t
5270ips_statupd_morpheus(ips_ha_t * ha)
5271{
5272        uint32_t val;
5273
5274        METHOD_TRACE("ips_statupd_morpheus", 1);
5275
5276        val = readl(ha->mem_ptr + IPS_REG_I2O_OUTMSGQ);
5277
5278        return (val);
5279}
5280
5281/****************************************************************************/
5282/*                                                                          */
5283/* Routine Name: ips_issue_copperhead                                       */
5284/*                                                                          */
5285/* Routine Description:                                                     */
5286/*                                                                          */
5287/*   Send a command down to the controller                                  */
5288/*                                                                          */
5289/****************************************************************************/
5290static int
5291ips_issue_copperhead(ips_ha_t * ha, ips_scb_t * scb)
5292{
5293        uint32_t TimeOut;
5294        uint32_t val;
5295
5296        METHOD_TRACE("ips_issue_copperhead", 1);
5297
5298        if (scb->scsi_cmd) {
5299                DEBUG_VAR(2, "(%s%d) ips_issue: cmd 0x%X id %d (%d %d %d)",
5300                          ips_name,
5301                          ha->host_num,
5302                          scb->cdb[0],
5303                          scb->cmd.basic_io.command_id,
5304                          scb->bus, scb->target_id, scb->lun);
5305        } else {
5306                DEBUG_VAR(2, KERN_NOTICE "(%s%d) ips_issue: logical cmd id %d",
5307                          ips_name, ha->host_num, scb->cmd.basic_io.command_id);
5308        }
5309
5310        TimeOut = 0;
5311
5312        while ((val =
5313                le32_to_cpu(inl(ha->io_addr + IPS_REG_CCCR))) & IPS_BIT_SEM) {
5314                udelay(1000);
5315
5316                if (++TimeOut >= IPS_SEM_TIMEOUT) {
5317                        if (!(val & IPS_BIT_START_STOP))
5318                                break;
5319
5320                        IPS_PRINTK(KERN_WARNING, ha->pcidev,
5321                                   "ips_issue val [0x%x].\n", val);
5322                        IPS_PRINTK(KERN_WARNING, ha->pcidev,
5323                                   "ips_issue semaphore chk timeout.\n");
5324
5325                        return (IPS_FAILURE);
5326                }               /* end if */
5327        }                       /* end while */
5328
5329        outl(scb->scb_busaddr, ha->io_addr + IPS_REG_CCSAR);
5330        outw(IPS_BIT_START_CMD, ha->io_addr + IPS_REG_CCCR);
5331
5332        return (IPS_SUCCESS);
5333}
5334
5335/****************************************************************************/
5336/*                                                                          */
5337/* Routine Name: ips_issue_copperhead_memio                                 */
5338/*                                                                          */
5339/* Routine Description:                                                     */
5340/*                                                                          */
5341/*   Send a command down to the controller                                  */
5342/*                                                                          */
5343/****************************************************************************/
5344static int
5345ips_issue_copperhead_memio(ips_ha_t * ha, ips_scb_t * scb)
5346{
5347        uint32_t TimeOut;
5348        uint32_t val;
5349
5350        METHOD_TRACE("ips_issue_copperhead_memio", 1);
5351
5352        if (scb->scsi_cmd) {
5353                DEBUG_VAR(2, "(%s%d) ips_issue: cmd 0x%X id %d (%d %d %d)",
5354                          ips_name,
5355                          ha->host_num,
5356                          scb->cdb[0],
5357                          scb->cmd.basic_io.command_id,
5358                          scb->bus, scb->target_id, scb->lun);
5359        } else {
5360                DEBUG_VAR(2, "(%s%d) ips_issue: logical cmd id %d",
5361                          ips_name, ha->host_num, scb->cmd.basic_io.command_id);
5362        }
5363
5364        TimeOut = 0;
5365
5366        while ((val = readl(ha->mem_ptr + IPS_REG_CCCR)) & IPS_BIT_SEM) {
5367                udelay(1000);
5368
5369                if (++TimeOut >= IPS_SEM_TIMEOUT) {
5370                        if (!(val & IPS_BIT_START_STOP))
5371                                break;
5372
5373                        IPS_PRINTK(KERN_WARNING, ha->pcidev,
5374                                   "ips_issue val [0x%x].\n", val);
5375                        IPS_PRINTK(KERN_WARNING, ha->pcidev,
5376                                   "ips_issue semaphore chk timeout.\n");
5377
5378                        return (IPS_FAILURE);
5379                }               /* end if */
5380        }                       /* end while */
5381
5382        writel(scb->scb_busaddr, ha->mem_ptr + IPS_REG_CCSAR);
5383        writel(IPS_BIT_START_CMD, ha->mem_ptr + IPS_REG_CCCR);
5384
5385        return (IPS_SUCCESS);
5386}
5387
5388/****************************************************************************/
5389/*                                                                          */
5390/* Routine Name: ips_issue_i2o                                              */
5391/*                                                                          */
5392/* Routine Description:                                                     */
5393/*                                                                          */
5394/*   Send a command down to the controller                                  */
5395/*                                                                          */
5396/****************************************************************************/
5397static int
5398ips_issue_i2o(ips_ha_t * ha, ips_scb_t * scb)
5399{
5400
5401        METHOD_TRACE("ips_issue_i2o", 1);
5402
5403        if (scb->scsi_cmd) {
5404                DEBUG_VAR(2, "(%s%d) ips_issue: cmd 0x%X id %d (%d %d %d)",
5405                          ips_name,
5406                          ha->host_num,
5407                          scb->cdb[0],
5408                          scb->cmd.basic_io.command_id,
5409                          scb->bus, scb->target_id, scb->lun);
5410        } else {
5411                DEBUG_VAR(2, "(%s%d) ips_issue: logical cmd id %d",
5412                          ips_name, ha->host_num, scb->cmd.basic_io.command_id);
5413        }
5414
5415        outl(scb->scb_busaddr, ha->io_addr + IPS_REG_I2O_INMSGQ);
5416
5417        return (IPS_SUCCESS);
5418}
5419
5420/****************************************************************************/
5421/*                                                                          */
5422/* Routine Name: ips_issue_i2o_memio                                        */
5423/*                                                                          */
5424/* Routine Description:                                                     */
5425/*                                                                          */
5426/*   Send a command down to the controller                                  */
5427/*                                                                          */
5428/****************************************************************************/
5429static int
5430ips_issue_i2o_memio(ips_ha_t * ha, ips_scb_t * scb)
5431{
5432
5433        METHOD_TRACE("ips_issue_i2o_memio", 1);
5434
5435        if (scb->scsi_cmd) {
5436                DEBUG_VAR(2, "(%s%d) ips_issue: cmd 0x%X id %d (%d %d %d)",
5437                          ips_name,
5438                          ha->host_num,
5439                          scb->cdb[0],
5440                          scb->cmd.basic_io.command_id,
5441                          scb->bus, scb->target_id, scb->lun);
5442        } else {
5443                DEBUG_VAR(2, "(%s%d) ips_issue: logical cmd id %d",
5444                          ips_name, ha->host_num, scb->cmd.basic_io.command_id);
5445        }
5446
5447        writel(scb->scb_busaddr, ha->mem_ptr + IPS_REG_I2O_INMSGQ);
5448
5449        return (IPS_SUCCESS);
5450}
5451
5452/****************************************************************************/
5453/*                                                                          */
5454/* Routine Name: ips_isintr_copperhead                                      */
5455/*                                                                          */
5456/* Routine Description:                                                     */
5457/*                                                                          */
5458/*   Test to see if an interrupt is for us                                  */
5459/*                                                                          */
5460/****************************************************************************/
5461static int
5462ips_isintr_copperhead(ips_ha_t * ha)
5463{
5464        uint8_t Isr;
5465
5466        METHOD_TRACE("ips_isintr_copperhead", 2);
5467
5468        Isr = inb(ha->io_addr + IPS_REG_HISR);
5469
5470        if (Isr == 0xFF)
5471                /* ?!?! Nothing really there */
5472                return (0);
5473
5474        if (Isr & IPS_BIT_SCE)
5475                return (1);
5476        else if (Isr & (IPS_BIT_SQO | IPS_BIT_GHI)) {
5477                /* status queue overflow or GHI */
5478                /* just clear the interrupt */
5479                outb(Isr, ha->io_addr + IPS_REG_HISR);
5480        }
5481
5482        return (0);
5483}
5484
5485/****************************************************************************/
5486/*                                                                          */
5487/* Routine Name: ips_isintr_copperhead_memio                                */
5488/*                                                                          */
5489/* Routine Description:                                                     */
5490/*                                                                          */
5491/*   Test to see if an interrupt is for us                                  */
5492/*                                                                          */
5493/****************************************************************************/
5494static int
5495ips_isintr_copperhead_memio(ips_ha_t * ha)
5496{
5497        uint8_t Isr;
5498
5499        METHOD_TRACE("ips_isintr_memio", 2);
5500
5501        Isr = readb(ha->mem_ptr + IPS_REG_HISR);
5502
5503        if (Isr == 0xFF)
5504                /* ?!?! Nothing really there */
5505                return (0);
5506
5507        if (Isr & IPS_BIT_SCE)
5508                return (1);
5509        else if (Isr & (IPS_BIT_SQO | IPS_BIT_GHI)) {
5510                /* status queue overflow or GHI */
5511                /* just clear the interrupt */
5512                writeb(Isr, ha->mem_ptr + IPS_REG_HISR);
5513        }
5514
5515        return (0);
5516}
5517
5518/****************************************************************************/
5519/*                                                                          */
5520/* Routine Name: ips_isintr_morpheus                                        */
5521/*                                                                          */
5522/* Routine Description:                                                     */
5523/*                                                                          */
5524/*   Test to see if an interrupt is for us                                  */
5525/*                                                                          */
5526/****************************************************************************/
5527static int
5528ips_isintr_morpheus(ips_ha_t * ha)
5529{
5530        uint32_t Isr;
5531
5532        METHOD_TRACE("ips_isintr_morpheus", 2);
5533
5534        Isr = readl(ha->mem_ptr + IPS_REG_I2O_HIR);
5535
5536        if (Isr & IPS_BIT_I2O_OPQI)
5537                return (1);
5538        else
5539                return (0);
5540}
5541
5542/****************************************************************************/
5543/*                                                                          */
5544/* Routine Name: ips_wait                                                   */
5545/*                                                                          */
5546/* Routine Description:                                                     */
5547/*                                                                          */
5548/*   Wait for a command to complete                                         */
5549/*                                                                          */
5550/****************************************************************************/
5551static int
5552ips_wait(ips_ha_t * ha, int time, int intr)
5553{
5554        int ret;
5555        int done;
5556
5557        METHOD_TRACE("ips_wait", 1);
5558
5559        ret = IPS_FAILURE;
5560        done = FALSE;
5561
5562        time *= IPS_ONE_SEC;    /* convert seconds */
5563
5564        while ((time > 0) && (!done)) {
5565                if (intr == IPS_INTR_ON) {
5566                        if (ha->waitflag == FALSE) {
5567                                ret = IPS_SUCCESS;
5568                                done = TRUE;
5569                                break;
5570                        }
5571                } else if (intr == IPS_INTR_IORL) {
5572                        if (ha->waitflag == FALSE) {
5573                                /*
5574                                 * controller generated an interrupt to
5575                                 * acknowledge completion of the command
5576                                 * and ips_intr() has serviced the interrupt.
5577                                 */
5578                                ret = IPS_SUCCESS;
5579                                done = TRUE;
5580                                break;
5581                        }
5582
5583                        /*
5584                         * NOTE: we already have the io_request_lock so
5585                         * even if we get an interrupt it won't get serviced
5586                         * until after we finish.
5587                         */
5588
5589                        (*ha->func.intr) (ha);
5590                }
5591
5592                /* This looks like a very evil loop, but it only does this during start-up */
5593                udelay(1000);
5594                time--;
5595        }
5596
5597        return (ret);
5598}
5599
5600/****************************************************************************/
5601/*                                                                          */
5602/* Routine Name: ips_write_driver_status                                    */
5603/*                                                                          */
5604/* Routine Description:                                                     */
5605/*                                                                          */
5606/*   Write OS/Driver version to Page 5 of the nvram on the controller       */
5607/*                                                                          */
5608/****************************************************************************/
5609static int
5610ips_write_driver_status(ips_ha_t * ha, int intr)
5611{
5612        METHOD_TRACE("ips_write_driver_status", 1);
5613
5614        if (!ips_readwrite_page5(ha, FALSE, intr)) {
5615                IPS_PRINTK(KERN_WARNING, ha->pcidev,
5616                           "unable to read NVRAM page 5.\n");
5617
5618                return (0);
5619        }
5620
5621        /* check to make sure the page has a valid */
5622        /* signature */
5623        if (le32_to_cpu(ha->nvram->signature) != IPS_NVRAM_P5_SIG) {
5624                DEBUG_VAR(1,
5625                          "(%s%d) NVRAM page 5 has an invalid signature: %X.",
5626                          ips_name, ha->host_num, ha->nvram->signature);
5627                ha->nvram->signature = IPS_NVRAM_P5_SIG;
5628        }
5629
5630        DEBUG_VAR(2,
5631                  "(%s%d) Ad Type: %d, Ad Slot: %d, BIOS: %c%c%c%c %c%c%c%c.",
5632                  ips_name, ha->host_num, le16_to_cpu(ha->nvram->adapter_type),
5633                  ha->nvram->adapter_slot, ha->nvram->bios_high[0],
5634                  ha->nvram->bios_high[1], ha->nvram->bios_high[2],
5635                  ha->nvram->bios_high[3], ha->nvram->bios_low[0],
5636                  ha->nvram->bios_low[1], ha->nvram->bios_low[2],
5637                  ha->nvram->bios_low[3]);
5638
5639        ips_get_bios_version(ha, intr);
5640
5641        /* change values (as needed) */
5642        ha->nvram->operating_system = IPS_OS_LINUX;
5643        ha->nvram->adapter_type = ha->ad_type;
5644        strncpy((char *) ha->nvram->driver_high, IPS_VERSION_HIGH, 4);
5645        strncpy((char *) ha->nvram->driver_low, IPS_VERSION_LOW, 4);
5646        strncpy((char *) ha->nvram->bios_high, ha->bios_version, 4);
5647        strncpy((char *) ha->nvram->bios_low, ha->bios_version + 4, 4);
5648
5649        ha->nvram->versioning = 0;      /* Indicate the Driver Does Not Support Versioning */
5650
5651        /* now update the page */
5652        if (!ips_readwrite_page5(ha, TRUE, intr)) {
5653                IPS_PRINTK(KERN_WARNING, ha->pcidev,
5654                           "unable to write NVRAM page 5.\n");
5655
5656                return (0);
5657        }
5658
5659        /* IF NVRAM Page 5 is OK, Use it for Slot Number Info Because Linux Doesn't Do Slots */
5660        ha->slot_num = ha->nvram->adapter_slot;
5661
5662        return (1);
5663}
5664
5665/****************************************************************************/
5666/*                                                                          */
5667/* Routine Name: ips_read_adapter_status                                    */
5668/*                                                                          */
5669/* Routine Description:                                                     */
5670/*                                                                          */
5671/*   Do an Inquiry command to the adapter                                   */
5672/*                                                                          */
5673/****************************************************************************/
5674static int
5675ips_read_adapter_status(ips_ha_t * ha, int intr)
5676{
5677        ips_scb_t *scb;
5678        int ret;
5679
5680        METHOD_TRACE("ips_read_adapter_status", 1);
5681
5682        scb = &ha->scbs[ha->max_cmds - 1];
5683
5684        ips_init_scb(ha, scb);
5685
5686        scb->timeout = ips_cmd_timeout;
5687        scb->cdb[0] = IPS_CMD_ENQUIRY;
5688
5689        scb->cmd.basic_io.op_code = IPS_CMD_ENQUIRY;
5690        scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
5691        scb->cmd.basic_io.sg_count = 0;
5692        scb->cmd.basic_io.lba = 0;
5693        scb->cmd.basic_io.sector_count = 0;
5694        scb->cmd.basic_io.log_drv = 0;
5695        scb->data_len = sizeof (*ha->enq);
5696        scb->cmd.basic_io.sg_addr = ha->enq_busaddr;
5697
5698        /* send command */
5699        if (((ret =
5700              ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE)
5701            || (ret == IPS_SUCCESS_IMM)
5702            || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1))
5703                return (0);
5704
5705        return (1);
5706}
5707
5708/****************************************************************************/
5709/*                                                                          */
5710/* Routine Name: ips_read_subsystem_parameters                              */
5711/*                                                                          */
5712/* Routine Description:                                                     */
5713/*                                                                          */
5714/*   Read subsystem parameters from the adapter                             */
5715/*                                                                          */
5716/****************************************************************************/
5717static int
5718ips_read_subsystem_parameters(ips_ha_t * ha, int intr)
5719{
5720        ips_scb_t *scb;
5721        int ret;
5722
5723        METHOD_TRACE("ips_read_subsystem_parameters", 1);
5724
5725        scb = &ha->scbs[ha->max_cmds - 1];
5726
5727        ips_init_scb(ha, scb);
5728
5729        scb->timeout = ips_cmd_timeout;
5730        scb->cdb[0] = IPS_CMD_GET_SUBSYS;
5731
5732        scb->cmd.basic_io.op_code = IPS_CMD_GET_SUBSYS;
5733        scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
5734        scb->cmd.basic_io.sg_count = 0;
5735        scb->cmd.basic_io.lba = 0;
5736        scb->cmd.basic_io.sector_count = 0;
5737        scb->cmd.basic_io.log_drv = 0;
5738        scb->data_len = sizeof (*ha->subsys);
5739        scb->cmd.basic_io.sg_addr = ha->ioctl_busaddr;
5740
5741        /* send command */
5742        if (((ret =
5743              ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE)
5744            || (ret == IPS_SUCCESS_IMM)
5745            || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1))
5746                return (0);
5747
5748        memcpy(ha->subsys, ha->ioctl_data, sizeof(*ha->subsys));
5749        return (1);
5750}
5751
5752/****************************************************************************/
5753/*                                                                          */
5754/* Routine Name: ips_read_config                                            */
5755/*                                                                          */
5756/* Routine Description:                                                     */
5757/*                                                                          */
5758/*   Read the configuration on the adapter                                  */
5759/*                                                                          */
5760/****************************************************************************/
5761static int
5762ips_read_config(ips_ha_t * ha, int intr)
5763{
5764        ips_scb_t *scb;
5765        int i;
5766        int ret;
5767
5768        METHOD_TRACE("ips_read_config", 1);
5769
5770        /* set defaults for initiator IDs */
5771        for (i = 0; i < 4; i++)
5772                ha->conf->init_id[i] = 7;
5773
5774        scb = &ha->scbs[ha->max_cmds - 1];
5775
5776        ips_init_scb(ha, scb);
5777
5778        scb->timeout = ips_cmd_timeout;
5779        scb->cdb[0] = IPS_CMD_READ_CONF;
5780
5781        scb->cmd.basic_io.op_code = IPS_CMD_READ_CONF;
5782        scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
5783        scb->data_len = sizeof (*ha->conf);
5784        scb->cmd.basic_io.sg_addr = ha->ioctl_busaddr;
5785
5786        /* send command */
5787        if (((ret =
5788              ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE)
5789            || (ret == IPS_SUCCESS_IMM)
5790            || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) {
5791
5792                memset(ha->conf, 0, sizeof (IPS_CONF));
5793
5794                /* reset initiator IDs */
5795                for (i = 0; i < 4; i++)
5796                        ha->conf->init_id[i] = 7;
5797
5798                /* Allow Completed with Errors, so JCRM can access the Adapter to fix the problems */
5799                if ((scb->basic_status & IPS_GSC_STATUS_MASK) ==
5800                    IPS_CMD_CMPLT_WERROR)
5801                        return (1);
5802
5803                return (0);
5804        }
5805
5806        memcpy(ha->conf, ha->ioctl_data, sizeof(*ha->conf));
5807        return (1);
5808}
5809
5810/****************************************************************************/
5811/*                                                                          */
5812/* Routine Name: ips_readwrite_page5                                        */
5813/*                                                                          */
5814/* Routine Description:                                                     */
5815/*                                                                          */
5816/*   Read nvram page 5 from the adapter                                     */
5817/*                                                                          */
5818/****************************************************************************/
5819static int
5820ips_readwrite_page5(ips_ha_t * ha, int write, int intr)
5821{
5822        ips_scb_t *scb;
5823        int ret;
5824
5825        METHOD_TRACE("ips_readwrite_page5", 1);
5826
5827        scb = &ha->scbs[ha->max_cmds - 1];
5828
5829        ips_init_scb(ha, scb);
5830
5831        scb->timeout = ips_cmd_timeout;
5832        scb->cdb[0] = IPS_CMD_RW_NVRAM_PAGE;
5833
5834        scb->cmd.nvram.op_code = IPS_CMD_RW_NVRAM_PAGE;
5835        scb->cmd.nvram.command_id = IPS_COMMAND_ID(ha, scb);
5836        scb->cmd.nvram.page = 5;
5837        scb->cmd.nvram.write = write;
5838        scb->cmd.nvram.reserved = 0;
5839        scb->cmd.nvram.reserved2 = 0;
5840        scb->data_len = sizeof (*ha->nvram);
5841        scb->cmd.nvram.buffer_addr = ha->ioctl_busaddr;
5842        if (write)
5843                memcpy(ha->ioctl_data, ha->nvram, sizeof(*ha->nvram));
5844
5845        /* issue the command */
5846        if (((ret =
5847              ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE)
5848            || (ret == IPS_SUCCESS_IMM)
5849            || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) {
5850
5851                memset(ha->nvram, 0, sizeof (IPS_NVRAM_P5));
5852
5853                return (0);
5854        }
5855        if (!write)
5856                memcpy(ha->nvram, ha->ioctl_data, sizeof(*ha->nvram));
5857        return (1);
5858}
5859
5860/****************************************************************************/
5861/*                                                                          */
5862/* Routine Name: ips_clear_adapter                                          */
5863/*                                                                          */
5864/* Routine Description:                                                     */
5865/*                                                                          */
5866/*   Clear the stripe lock tables                                           */
5867/*                                                                          */
5868/****************************************************************************/
5869static int
5870ips_clear_adapter(ips_ha_t * ha, int intr)
5871{
5872        ips_scb_t *scb;
5873        int ret;
5874
5875        METHOD_TRACE("ips_clear_adapter", 1);
5876
5877        scb = &ha->scbs[ha->max_cmds - 1];
5878
5879        ips_init_scb(ha, scb);
5880
5881        scb->timeout = ips_reset_timeout;
5882        scb->cdb[0] = IPS_CMD_CONFIG_SYNC;
5883
5884        scb->cmd.config_sync.op_code = IPS_CMD_CONFIG_SYNC;
5885        scb->cmd.config_sync.command_id = IPS_COMMAND_ID(ha, scb);
5886        scb->cmd.config_sync.channel = 0;
5887        scb->cmd.config_sync.source_target = IPS_POCL;
5888        scb->cmd.config_sync.reserved = 0;
5889        scb->cmd.config_sync.reserved2 = 0;
5890        scb->cmd.config_sync.reserved3 = 0;
5891
5892        /* issue command */
5893        if (((ret =
5894              ips_send_wait(ha, scb, ips_reset_timeout, intr)) == IPS_FAILURE)
5895            || (ret == IPS_SUCCESS_IMM)
5896            || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1))
5897                return (0);
5898
5899        /* send unlock stripe command */
5900        ips_init_scb(ha, scb);
5901
5902        scb->cdb[0] = IPS_CMD_ERROR_TABLE;
5903        scb->timeout = ips_reset_timeout;
5904
5905        scb->cmd.unlock_stripe.op_code = IPS_CMD_ERROR_TABLE;
5906        scb->cmd.unlock_stripe.command_id = IPS_COMMAND_ID(ha, scb);
5907        scb->cmd.unlock_stripe.log_drv = 0;
5908        scb->cmd.unlock_stripe.control = IPS_CSL;
5909        scb->cmd.unlock_stripe.reserved = 0;
5910        scb->cmd.unlock_stripe.reserved2 = 0;
5911        scb->cmd.unlock_stripe.reserved3 = 0;
5912
5913        /* issue command */
5914        if (((ret =
5915              ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE)
5916            || (ret == IPS_SUCCESS_IMM)
5917            || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1))
5918                return (0);
5919
5920        return (1);
5921}
5922
5923/****************************************************************************/
5924/*                                                                          */
5925/* Routine Name: ips_ffdc_reset                                             */
5926/*                                                                          */
5927/* Routine Description:                                                     */
5928/*                                                                          */
5929/*   FFDC: write reset info                                                 */
5930/*                                                                          */
5931/****************************************************************************/
5932static void
5933ips_ffdc_reset(ips_ha_t * ha, int intr)
5934{
5935        ips_scb_t *scb;
5936
5937        METHOD_TRACE("ips_ffdc_reset", 1);
5938
5939        scb = &ha->scbs[ha->max_cmds - 1];
5940
5941        ips_init_scb(ha, scb);
5942
5943        scb->timeout = ips_cmd_timeout;
5944        scb->cdb[0] = IPS_CMD_FFDC;
5945        scb->cmd.ffdc.op_code = IPS_CMD_FFDC;
5946        scb->cmd.ffdc.command_id = IPS_COMMAND_ID(ha, scb);
5947        scb->cmd.ffdc.reset_count = ha->reset_count;
5948        scb->cmd.ffdc.reset_type = 0x80;
5949
5950        /* convert time to what the card wants */
5951        ips_fix_ffdc_time(ha, scb, ha->last_ffdc);
5952
5953        /* issue command */
5954        ips_send_wait(ha, scb, ips_cmd_timeout, intr);
5955}
5956
5957/****************************************************************************/
5958/*                                                                          */
5959/* Routine Name: ips_ffdc_time                                              */
5960/*                                                                          */
5961/* Routine Description:                                                     */
5962/*                                                                          */
5963/*   FFDC: write time info                                                  */
5964/*                                                                          */
5965/****************************************************************************/
5966static void
5967ips_ffdc_time(ips_ha_t * ha)
5968{
5969        ips_scb_t *scb;
5970
5971        METHOD_TRACE("ips_ffdc_time", 1);
5972
5973        DEBUG_VAR(1, "(%s%d) Sending time update.", ips_name, ha->host_num);
5974
5975        scb = &ha->scbs[ha->max_cmds - 1];
5976
5977        ips_init_scb(ha, scb);
5978
5979        scb->timeout = ips_cmd_timeout;
5980        scb->cdb[0] = IPS_CMD_FFDC;
5981        scb->cmd.ffdc.op_code = IPS_CMD_FFDC;
5982        scb->cmd.ffdc.command_id = IPS_COMMAND_ID(ha, scb);
5983        scb->cmd.ffdc.reset_count = 0;
5984        scb->cmd.ffdc.reset_type = 0;
5985
5986        /* convert time to what the card wants */
5987        ips_fix_ffdc_time(ha, scb, ha->last_ffdc);
5988
5989        /* issue command */
5990        ips_send_wait(ha, scb, ips_cmd_timeout, IPS_FFDC);
5991}
5992
5993/****************************************************************************/
5994/*                                                                          */
5995/* Routine Name: ips_fix_ffdc_time                                          */
5996/*                                                                          */
5997/* Routine Description:                                                     */
5998/*   Adjust time_t to what the card wants                                   */
5999/*                                                                          */
6000/****************************************************************************/
6001static void
6002ips_fix_ffdc_time(ips_ha_t * ha, ips_scb_t * scb, time_t current_time)
6003{
6004        long days;
6005        long rem;
6006        int i;
6007        int year;
6008        int yleap;
6009        int year_lengths[2] = { IPS_DAYS_NORMAL_YEAR, IPS_DAYS_LEAP_YEAR };
6010        int month_lengths[12][2] = { {31, 31},
6011        {28, 29},
6012        {31, 31},
6013        {30, 30},
6014        {31, 31},
6015        {30, 30},
6016        {31, 31},
6017        {31, 31},
6018        {30, 30},
6019        {31, 31},
6020        {30, 30},
6021        {31, 31}
6022        };
6023
6024        METHOD_TRACE("ips_fix_ffdc_time", 1);
6025
6026        days = current_time / IPS_SECS_DAY;
6027        rem = current_time % IPS_SECS_DAY;
6028
6029        scb->cmd.ffdc.hour = (rem / IPS_SECS_HOUR);
6030        rem = rem % IPS_SECS_HOUR;
6031        scb->cmd.ffdc.minute = (rem / IPS_SECS_MIN);
6032        scb->cmd.ffdc.second = (rem % IPS_SECS_MIN);
6033
6034        year = IPS_EPOCH_YEAR;
6035        while (days < 0 || days >= year_lengths[yleap = IPS_IS_LEAP_YEAR(year)]) {
6036                int newy;
6037
6038                newy = year + (days / IPS_DAYS_NORMAL_YEAR);
6039                if (days < 0)
6040                        --newy;
6041                days -= (newy - year) * IPS_DAYS_NORMAL_YEAR +
6042                    IPS_NUM_LEAP_YEARS_THROUGH(newy - 1) -
6043                    IPS_NUM_LEAP_YEARS_THROUGH(year - 1);
6044                year = newy;
6045        }
6046
6047        scb->cmd.ffdc.yearH = year / 100;
6048        scb->cmd.ffdc.yearL = year % 100;
6049
6050        for (i = 0; days >= month_lengths[i][yleap]; ++i)
6051                days -= month_lengths[i][yleap];
6052
6053        scb->cmd.ffdc.month = i + 1;
6054        scb->cmd.ffdc.day = days + 1;
6055}
6056
6057/****************************************************************************
6058 * BIOS Flash Routines                                                      *
6059 ****************************************************************************/
6060
6061/****************************************************************************/
6062/*                                                                          */
6063/* Routine Name: ips_erase_bios                                             */
6064/*                                                                          */
6065/* Routine Description:                                                     */
6066/*   Erase the BIOS on the adapter                                          */
6067/*                                                                          */
6068/****************************************************************************/
6069static int
6070ips_erase_bios(ips_ha_t * ha)
6071{
6072        int timeout;
6073        uint8_t status = 0;
6074
6075        METHOD_TRACE("ips_erase_bios", 1);
6076
6077        status = 0;
6078
6079        /* Clear the status register */
6080        outl(0, ha->io_addr + IPS_REG_FLAP);
6081        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6082                udelay(25);     /* 25 us */
6083
6084        outb(0x50, ha->io_addr + IPS_REG_FLDP);
6085        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6086                udelay(25);     /* 25 us */
6087
6088        /* Erase Setup */
6089        outb(0x20, ha->io_addr + IPS_REG_FLDP);
6090        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6091                udelay(25);     /* 25 us */
6092
6093        /* Erase Confirm */
6094        outb(0xD0, ha->io_addr + IPS_REG_FLDP);
6095        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6096                udelay(25);     /* 25 us */
6097
6098        /* Erase Status */
6099        outb(0x70, ha->io_addr + IPS_REG_FLDP);
6100        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6101                udelay(25);     /* 25 us */
6102
6103        timeout = 80000;        /* 80 seconds */
6104
6105        while (timeout > 0) {
6106                if (ha->pcidev->revision == IPS_REVID_TROMBONE64) {
6107                        outl(0, ha->io_addr + IPS_REG_FLAP);
6108                        udelay(25);     /* 25 us */
6109                }
6110
6111                status = inb(ha->io_addr + IPS_REG_FLDP);
6112
6113                if (status & 0x80)
6114                        break;
6115
6116                MDELAY(1);
6117                timeout--;
6118        }
6119
6120        /* check for timeout */
6121        if (timeout <= 0) {
6122                /* timeout */
6123
6124                /* try to suspend the erase */
6125                outb(0xB0, ha->io_addr + IPS_REG_FLDP);
6126                if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6127                        udelay(25);     /* 25 us */
6128
6129                /* wait for 10 seconds */
6130                timeout = 10000;
6131                while (timeout > 0) {
6132                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64) {
6133                                outl(0, ha->io_addr + IPS_REG_FLAP);
6134                                udelay(25);     /* 25 us */
6135                        }
6136
6137                        status = inb(ha->io_addr + IPS_REG_FLDP);
6138
6139                        if (status & 0xC0)
6140                                break;
6141
6142                        MDELAY(1);
6143                        timeout--;
6144                }
6145
6146                return (1);
6147        }
6148
6149        /* check for valid VPP */
6150        if (status & 0x08)
6151                /* VPP failure */
6152                return (1);
6153
6154        /* check for successful flash */
6155        if (status & 0x30)
6156                /* sequence error */
6157                return (1);
6158
6159        /* Otherwise, we were successful */
6160        /* clear status */
6161        outb(0x50, ha->io_addr + IPS_REG_FLDP);
6162        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6163                udelay(25);     /* 25 us */
6164
6165        /* enable reads */
6166        outb(0xFF, ha->io_addr + IPS_REG_FLDP);
6167        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6168                udelay(25);     /* 25 us */
6169
6170        return (0);
6171}
6172
6173/****************************************************************************/
6174/*                                                                          */
6175/* Routine Name: ips_erase_bios_memio                                       */
6176/*                                                                          */
6177/* Routine Description:                                                     */
6178/*   Erase the BIOS on the adapter                                          */
6179/*                                                                          */
6180/****************************************************************************/
6181static int
6182ips_erase_bios_memio(ips_ha_t * ha)
6183{
6184        int timeout;
6185        uint8_t status;
6186
6187        METHOD_TRACE("ips_erase_bios_memio", 1);
6188
6189        status = 0;
6190
6191        /* Clear the status register */
6192        writel(0, ha->mem_ptr + IPS_REG_FLAP);
6193        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6194                udelay(25);     /* 25 us */
6195
6196        writeb(0x50, ha->mem_ptr + IPS_REG_FLDP);
6197        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6198                udelay(25);     /* 25 us */
6199
6200        /* Erase Setup */
6201        writeb(0x20, ha->mem_ptr + IPS_REG_FLDP);
6202        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6203                udelay(25);     /* 25 us */
6204
6205        /* Erase Confirm */
6206        writeb(0xD0, ha->mem_ptr + IPS_REG_FLDP);
6207        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6208                udelay(25);     /* 25 us */
6209
6210        /* Erase Status */
6211        writeb(0x70, ha->mem_ptr + IPS_REG_FLDP);
6212        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6213                udelay(25);     /* 25 us */
6214
6215        timeout = 80000;        /* 80 seconds */
6216
6217        while (timeout > 0) {
6218                if (ha->pcidev->revision == IPS_REVID_TROMBONE64) {
6219                        writel(0, ha->mem_ptr + IPS_REG_FLAP);
6220                        udelay(25);     /* 25 us */
6221                }
6222
6223                status = readb(ha->mem_ptr + IPS_REG_FLDP);
6224
6225                if (status & 0x80)
6226                        break;
6227
6228                MDELAY(1);
6229                timeout--;
6230        }
6231
6232        /* check for timeout */
6233        if (timeout <= 0) {
6234                /* timeout */
6235
6236                /* try to suspend the erase */
6237                writeb(0xB0, ha->mem_ptr + IPS_REG_FLDP);
6238                if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6239                        udelay(25);     /* 25 us */
6240
6241                /* wait for 10 seconds */
6242                timeout = 10000;
6243                while (timeout > 0) {
6244                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64) {
6245                                writel(0, ha->mem_ptr + IPS_REG_FLAP);
6246                                udelay(25);     /* 25 us */
6247                        }
6248
6249                        status = readb(ha->mem_ptr + IPS_REG_FLDP);
6250
6251                        if (status & 0xC0)
6252                                break;
6253
6254                        MDELAY(1);
6255                        timeout--;
6256                }
6257
6258                return (1);
6259        }
6260
6261        /* check for valid VPP */
6262        if (status & 0x08)
6263                /* VPP failure */
6264                return (1);
6265
6266        /* check for successful flash */
6267        if (status & 0x30)
6268                /* sequence error */
6269                return (1);
6270
6271        /* Otherwise, we were successful */
6272        /* clear status */
6273        writeb(0x50, ha->mem_ptr + IPS_REG_FLDP);
6274        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6275                udelay(25);     /* 25 us */
6276
6277        /* enable reads */
6278        writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP);
6279        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6280                udelay(25);     /* 25 us */
6281
6282        return (0);
6283}
6284
6285/****************************************************************************/
6286/*                                                                          */
6287/* Routine Name: ips_program_bios                                           */
6288/*                                                                          */
6289/* Routine Description:                                                     */
6290/*   Program the BIOS on the adapter                                        */
6291/*                                                                          */
6292/****************************************************************************/
6293static int
6294ips_program_bios(ips_ha_t * ha, char *buffer, uint32_t buffersize,
6295                 uint32_t offset)
6296{
6297        int i;
6298        int timeout;
6299        uint8_t status = 0;
6300
6301        METHOD_TRACE("ips_program_bios", 1);
6302
6303        status = 0;
6304
6305        for (i = 0; i < buffersize; i++) {
6306                /* write a byte */
6307                outl(i + offset, ha->io_addr + IPS_REG_FLAP);
6308                if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6309                        udelay(25);     /* 25 us */
6310
6311                outb(0x40, ha->io_addr + IPS_REG_FLDP);
6312                if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6313                        udelay(25);     /* 25 us */
6314
6315                outb(buffer[i], ha->io_addr + IPS_REG_FLDP);
6316                if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6317                        udelay(25);     /* 25 us */
6318
6319                /* wait up to one second */
6320                timeout = 1000;
6321                while (timeout > 0) {
6322                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64) {
6323                                outl(0, ha->io_addr + IPS_REG_FLAP);
6324                                udelay(25);     /* 25 us */
6325                        }
6326
6327                        status = inb(ha->io_addr + IPS_REG_FLDP);
6328
6329                        if (status & 0x80)
6330                                break;
6331
6332                        MDELAY(1);
6333                        timeout--;
6334                }
6335
6336                if (timeout == 0) {
6337                        /* timeout error */
6338                        outl(0, ha->io_addr + IPS_REG_FLAP);
6339                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6340                                udelay(25);     /* 25 us */
6341
6342                        outb(0xFF, ha->io_addr + IPS_REG_FLDP);
6343                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6344                                udelay(25);     /* 25 us */
6345
6346                        return (1);
6347                }
6348
6349                /* check the status */
6350                if (status & 0x18) {
6351                        /* programming error */
6352                        outl(0, ha->io_addr + IPS_REG_FLAP);
6353                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6354                                udelay(25);     /* 25 us */
6355
6356                        outb(0xFF, ha->io_addr + IPS_REG_FLDP);
6357                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6358                                udelay(25);     /* 25 us */
6359
6360                        return (1);
6361                }
6362        }                       /* end for */
6363
6364        /* Enable reading */
6365        outl(0, ha->io_addr + IPS_REG_FLAP);
6366        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6367                udelay(25);     /* 25 us */
6368
6369        outb(0xFF, ha->io_addr + IPS_REG_FLDP);
6370        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6371                udelay(25);     /* 25 us */
6372
6373        return (0);
6374}
6375
6376/****************************************************************************/
6377/*                                                                          */
6378/* Routine Name: ips_program_bios_memio                                     */
6379/*                                                                          */
6380/* Routine Description:                                                     */
6381/*   Program the BIOS on the adapter                                        */
6382/*                                                                          */
6383/****************************************************************************/
6384static int
6385ips_program_bios_memio(ips_ha_t * ha, char *buffer, uint32_t buffersize,
6386                       uint32_t offset)
6387{
6388        int i;
6389        int timeout;
6390        uint8_t status = 0;
6391
6392        METHOD_TRACE("ips_program_bios_memio", 1);
6393
6394        status = 0;
6395
6396        for (i = 0; i < buffersize; i++) {
6397                /* write a byte */
6398                writel(i + offset, ha->mem_ptr + IPS_REG_FLAP);
6399                if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6400                        udelay(25);     /* 25 us */
6401
6402                writeb(0x40, ha->mem_ptr + IPS_REG_FLDP);
6403                if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6404                        udelay(25);     /* 25 us */
6405
6406                writeb(buffer[i], ha->mem_ptr + IPS_REG_FLDP);
6407                if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6408                        udelay(25);     /* 25 us */
6409
6410                /* wait up to one second */
6411                timeout = 1000;
6412                while (timeout > 0) {
6413                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64) {
6414                                writel(0, ha->mem_ptr + IPS_REG_FLAP);
6415                                udelay(25);     /* 25 us */
6416                        }
6417
6418                        status = readb(ha->mem_ptr + IPS_REG_FLDP);
6419
6420                        if (status & 0x80)
6421                                break;
6422
6423                        MDELAY(1);
6424                        timeout--;
6425                }
6426
6427                if (timeout == 0) {
6428                        /* timeout error */
6429                        writel(0, ha->mem_ptr + IPS_REG_FLAP);
6430                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6431                                udelay(25);     /* 25 us */
6432
6433                        writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP);
6434                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6435                                udelay(25);     /* 25 us */
6436
6437                        return (1);
6438                }
6439
6440                /* check the status */
6441                if (status & 0x18) {
6442                        /* programming error */
6443                        writel(0, ha->mem_ptr + IPS_REG_FLAP);
6444                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6445                                udelay(25);     /* 25 us */
6446
6447                        writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP);
6448                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6449                                udelay(25);     /* 25 us */
6450
6451                        return (1);
6452                }
6453        }                       /* end for */
6454
6455        /* Enable reading */
6456        writel(0, ha->mem_ptr + IPS_REG_FLAP);
6457        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6458                udelay(25);     /* 25 us */
6459
6460        writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP);
6461        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6462                udelay(25);     /* 25 us */
6463
6464        return (0);
6465}
6466
6467/****************************************************************************/
6468/*                                                                          */
6469/* Routine Name: ips_verify_bios                                            */
6470/*                                                                          */
6471/* Routine Description:                                                     */
6472/*   Verify the BIOS on the adapter                                         */
6473/*                                                                          */
6474/****************************************************************************/
6475static int
6476ips_verify_bios(ips_ha_t * ha, char *buffer, uint32_t buffersize,
6477                uint32_t offset)
6478{
6479        uint8_t checksum;
6480        int i;
6481
6482        METHOD_TRACE("ips_verify_bios", 1);
6483
6484        /* test 1st byte */
6485        outl(0, ha->io_addr + IPS_REG_FLAP);
6486        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6487                udelay(25);     /* 25 us */
6488
6489        if (inb(ha->io_addr + IPS_REG_FLDP) != 0x55)
6490                return (1);
6491
6492        outl(1, ha->io_addr + IPS_REG_FLAP);
6493        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6494                udelay(25);     /* 25 us */
6495        if (inb(ha->io_addr + IPS_REG_FLDP) != 0xAA)
6496                return (1);
6497
6498        checksum = 0xff;
6499        for (i = 2; i < buffersize; i++) {
6500
6501                outl(i + offset, ha->io_addr + IPS_REG_FLAP);
6502                if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6503                        udelay(25);     /* 25 us */
6504
6505                checksum = (uint8_t) checksum + inb(ha->io_addr + IPS_REG_FLDP);
6506        }
6507
6508        if (checksum != 0)
6509                /* failure */
6510                return (1);
6511        else
6512                /* success */
6513                return (0);
6514}
6515
6516/****************************************************************************/
6517/*                                                                          */
6518/* Routine Name: ips_verify_bios_memio                                      */
6519/*                                                                          */
6520/* Routine Description:                                                     */
6521/*   Verify the BIOS on the adapter                                         */
6522/*                                                                          */
6523/****************************************************************************/
6524static int
6525ips_verify_bios_memio(ips_ha_t * ha, char *buffer, uint32_t buffersize,
6526                      uint32_t offset)
6527{
6528        uint8_t checksum;
6529        int i;
6530
6531        METHOD_TRACE("ips_verify_bios_memio", 1);
6532
6533        /* test 1st byte */
6534        writel(0, ha->mem_ptr + IPS_REG_FLAP);
6535        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6536                udelay(25);     /* 25 us */
6537
6538        if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0x55)
6539                return (1);
6540
6541        writel(1, ha->mem_ptr + IPS_REG_FLAP);
6542        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6543                udelay(25);     /* 25 us */
6544        if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0xAA)
6545                return (1);
6546
6547        checksum = 0xff;
6548        for (i = 2; i < buffersize; i++) {
6549
6550                writel(i + offset, ha->mem_ptr + IPS_REG_FLAP);
6551                if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6552                        udelay(25);     /* 25 us */
6553
6554                checksum =
6555                    (uint8_t) checksum + readb(ha->mem_ptr + IPS_REG_FLDP);
6556        }
6557
6558        if (checksum != 0)
6559                /* failure */
6560                return (1);
6561        else
6562                /* success */
6563                return (0);
6564}
6565
6566/****************************************************************************/
6567/*                                                                          */
6568/* Routine Name: ips_abort_init                                             */
6569/*                                                                          */
6570/* Routine Description:                                                     */
6571/*   cleanup routine for a failed adapter initialization                    */
6572/****************************************************************************/
6573static int
6574ips_abort_init(ips_ha_t * ha, int index)
6575{
6576        ha->active = 0;
6577        ips_free(ha);
6578        ips_ha[index] = NULL;
6579        ips_sh[index] = NULL;
6580        return -1;
6581}
6582
6583/****************************************************************************/
6584/*                                                                          */
6585/* Routine Name: ips_shift_controllers                                      */
6586/*                                                                          */
6587/* Routine Description:                                                     */
6588/*   helper function for ordering adapters                                  */
6589/****************************************************************************/
6590static void
6591ips_shift_controllers(int lowindex, int highindex)
6592{
6593        ips_ha_t *ha_sav = ips_ha[highindex];
6594        struct Scsi_Host *sh_sav = ips_sh[highindex];
6595        int i;
6596
6597        for (i = highindex; i > lowindex; i--) {
6598                ips_ha[i] = ips_ha[i - 1];
6599                ips_sh[i] = ips_sh[i - 1];
6600                ips_ha[i]->host_num = i;
6601        }
6602        ha_sav->host_num = lowindex;
6603        ips_ha[lowindex] = ha_sav;
6604        ips_sh[lowindex] = sh_sav;
6605}
6606
6607/****************************************************************************/
6608/*                                                                          */
6609/* Routine Name: ips_order_controllers                                      */
6610/*                                                                          */
6611/* Routine Description:                                                     */
6612/*   place controllers is the "proper" boot order                           */
6613/****************************************************************************/
6614static void
6615ips_order_controllers(void)
6616{
6617        int i, j, tmp, position = 0;
6618        IPS_NVRAM_P5 *nvram;
6619        if (!ips_ha[0])
6620                return;
6621        nvram = ips_ha[0]->nvram;
6622
6623        if (nvram->adapter_order[0]) {
6624                for (i = 1; i <= nvram->adapter_order[0]; i++) {
6625                        for (j = position; j < ips_num_controllers; j++) {
6626                                switch (ips_ha[j]->ad_type) {
6627                                case IPS_ADTYPE_SERVERAID6M:
6628                                case IPS_ADTYPE_SERVERAID7M:
6629                                        if (nvram->adapter_order[i] == 'M') {
6630                                                ips_shift_controllers(position,
6631                                                                      j);
6632                                                position++;
6633                                        }
6634                                        break;
6635                                case IPS_ADTYPE_SERVERAID4L:
6636                                case IPS_ADTYPE_SERVERAID4M:
6637                                case IPS_ADTYPE_SERVERAID4MX:
6638                                case IPS_ADTYPE_SERVERAID4LX:
6639                                        if (nvram->adapter_order[i] == 'N') {
6640                                                ips_shift_controllers(position,
6641                                                                      j);
6642                                                position++;
6643                                        }
6644                                        break;
6645                                case IPS_ADTYPE_SERVERAID6I:
6646                                case IPS_ADTYPE_SERVERAID5I2:
6647                                case IPS_ADTYPE_SERVERAID5I1:
6648                                case IPS_ADTYPE_SERVERAID7k:
6649                                        if (nvram->adapter_order[i] == 'S') {
6650                                                ips_shift_controllers(position,
6651                                                                      j);
6652                                                position++;
6653                                        }
6654                                        break;
6655                                case IPS_ADTYPE_SERVERAID:
6656                                case IPS_ADTYPE_SERVERAID2:
6657                                case IPS_ADTYPE_NAVAJO:
6658                                case IPS_ADTYPE_KIOWA:
6659                                case IPS_ADTYPE_SERVERAID3L:
6660                                case IPS_ADTYPE_SERVERAID3:
6661                                case IPS_ADTYPE_SERVERAID4H:
6662                                        if (nvram->adapter_order[i] == 'A') {
6663                                                ips_shift_controllers(position,
6664                                                                      j);
6665                                                position++;
6666                                        }
6667                                        break;
6668                                default:
6669                                        break;
6670                                }
6671                        }
6672                }
6673                /* if adapter_order[0], then ordering is complete */
6674                return;
6675        }
6676        /* old bios, use older ordering */
6677        tmp = 0;
6678        for (i = position; i < ips_num_controllers; i++) {
6679                if (ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID5I2 ||
6680                    ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID5I1) {
6681                        ips_shift_controllers(position, i);
6682                        position++;
6683                        tmp = 1;
6684                }
6685        }
6686        /* if there were no 5I cards, then don't do any extra ordering */
6687        if (!tmp)
6688                return;
6689        for (i = position; i < ips_num_controllers; i++) {
6690                if (ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID4L ||
6691                    ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID4M ||
6692                    ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID4LX ||
6693                    ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID4MX) {
6694                        ips_shift_controllers(position, i);
6695                        position++;
6696                }
6697        }
6698
6699        return;
6700}
6701
6702/****************************************************************************/
6703/*                                                                          */
6704/* Routine Name: ips_register_scsi                                          */
6705/*                                                                          */
6706/* Routine Description:                                                     */
6707/*   perform any registration and setup with the scsi layer                 */
6708/****************************************************************************/
6709static int
6710ips_register_scsi(int index)
6711{
6712        struct Scsi_Host *sh;
6713        ips_ha_t *ha, *oldha = ips_ha[index];
6714        sh = scsi_host_alloc(&ips_driver_template, sizeof (ips_ha_t));
6715        if (!sh) {
6716                IPS_PRINTK(KERN_WARNING, oldha->pcidev,
6717                           "Unable to register controller with SCSI subsystem\n");
6718                return -1;
6719        }
6720        ha = IPS_HA(sh);
6721        memcpy(ha, oldha, sizeof (ips_ha_t));
6722        free_irq(oldha->pcidev->irq, oldha);
6723        /* Install the interrupt handler with the new ha */
6724        if (request_irq(ha->pcidev->irq, do_ipsintr, IRQF_SHARED, ips_name, ha)) {
6725                IPS_PRINTK(KERN_WARNING, ha->pcidev,
6726                           "Unable to install interrupt handler\n");
6727                goto err_out_sh;
6728        }
6729
6730        kfree(oldha);
6731
6732        /* Store away needed values for later use */
6733        sh->unique_id = (ha->io_addr) ? ha->io_addr : ha->mem_addr;
6734        sh->sg_tablesize = sh->hostt->sg_tablesize;
6735        sh->can_queue = sh->hostt->can_queue;
6736        sh->cmd_per_lun = sh->hostt->cmd_per_lun;
6737        sh->use_clustering = sh->hostt->use_clustering;
6738        sh->max_sectors = 128;
6739
6740        sh->max_id = ha->ntargets;
6741        sh->max_lun = ha->nlun;
6742        sh->max_channel = ha->nbus - 1;
6743        sh->can_queue = ha->max_cmds - 1;
6744
6745        if (scsi_add_host(sh, &ha->pcidev->dev))
6746                goto err_out;
6747
6748        ips_sh[index] = sh;
6749        ips_ha[index] = ha;
6750
6751        scsi_scan_host(sh);
6752
6753        return 0;
6754
6755err_out:
6756        free_irq(ha->pcidev->irq, ha);
6757err_out_sh:
6758        scsi_host_put(sh);
6759        return -1;
6760}
6761
6762/*---------------------------------------------------------------------------*/
6763/*   Routine Name: ips_remove_device                                         */
6764/*                                                                           */
6765/*   Routine Description:                                                    */
6766/*     Remove one Adapter ( Hot Plugging )                                   */
6767/*---------------------------------------------------------------------------*/
6768static void
6769ips_remove_device(struct pci_dev *pci_dev)
6770{
6771        struct Scsi_Host *sh = pci_get_drvdata(pci_dev);
6772
6773        pci_set_drvdata(pci_dev, NULL);
6774
6775        ips_release(sh);
6776
6777        pci_release_regions(pci_dev);
6778        pci_disable_device(pci_dev);
6779}
6780
6781/****************************************************************************/
6782/*                                                                          */
6783/* Routine Name: ips_module_init                                            */
6784/*                                                                          */
6785/* Routine Description:                                                     */
6786/*   function called on module load                                         */
6787/****************************************************************************/
6788static int __init
6789ips_module_init(void)
6790{
6791        if (pci_register_driver(&ips_pci_driver) < 0)
6792                return -ENODEV;
6793        ips_driver_template.module = THIS_MODULE;
6794        ips_order_controllers();
6795        if (!ips_detect(&ips_driver_template)) {
6796                pci_unregister_driver(&ips_pci_driver);
6797                return -ENODEV;
6798        }
6799        register_reboot_notifier(&ips_notifier);
6800        return 0;
6801}
6802
6803/****************************************************************************/
6804/*                                                                          */
6805/* Routine Name: ips_module_exit                                            */
6806/*                                                                          */
6807/* Routine Description:                                                     */
6808/*   function called on module unload                                       */
6809/****************************************************************************/
6810static void __exit
6811ips_module_exit(void)
6812{
6813        pci_unregister_driver(&ips_pci_driver);
6814        unregister_reboot_notifier(&ips_notifier);
6815}
6816
6817module_init(ips_module_init);
6818module_exit(ips_module_exit);
6819
6820/*---------------------------------------------------------------------------*/
6821/*   Routine Name: ips_insert_device                                         */
6822/*                                                                           */
6823/*   Routine Description:                                                    */
6824/*     Add One Adapter ( Hot Plug )                                          */
6825/*                                                                           */
6826/*   Return Value:                                                           */
6827/*     0 if Successful, else non-zero                                        */
6828/*---------------------------------------------------------------------------*/
6829static int
6830ips_insert_device(struct pci_dev *pci_dev, const struct pci_device_id *ent)
6831{
6832        int index = -1;
6833        int rc;
6834
6835        METHOD_TRACE("ips_insert_device", 1);
6836        rc = pci_enable_device(pci_dev);
6837        if (rc)
6838                return rc;
6839
6840        rc = pci_request_regions(pci_dev, "ips");
6841        if (rc)
6842                goto err_out;
6843
6844        rc = ips_init_phase1(pci_dev, &index);
6845        if (rc == SUCCESS)
6846                rc = ips_init_phase2(index);
6847
6848        if (ips_hotplug)
6849                if (ips_register_scsi(index)) {
6850                        ips_free(ips_ha[index]);
6851                        rc = -1;
6852                }
6853
6854        if (rc == SUCCESS)
6855                ips_num_controllers++;
6856
6857        ips_next_controller = ips_num_controllers;
6858
6859        if (rc < 0) {
6860                rc = -ENODEV;
6861                goto err_out_regions;
6862        }
6863
6864        pci_set_drvdata(pci_dev, ips_sh[index]);
6865        return 0;
6866
6867err_out_regions:
6868        pci_release_regions(pci_dev);
6869err_out:
6870        pci_disable_device(pci_dev);
6871        return rc;
6872}
6873
6874/*---------------------------------------------------------------------------*/
6875/*   Routine Name: ips_init_phase1                                           */
6876/*                                                                           */
6877/*   Routine Description:                                                    */
6878/*     Adapter Initialization                                                */
6879/*                                                                           */
6880/*   Return Value:                                                           */
6881/*     0 if Successful, else non-zero                                        */
6882/*---------------------------------------------------------------------------*/
6883static int
6884ips_init_phase1(struct pci_dev *pci_dev, int *indexPtr)
6885{
6886        ips_ha_t *ha;
6887        uint32_t io_addr;
6888        uint32_t mem_addr;
6889        uint32_t io_len;
6890        uint32_t mem_len;
6891        uint8_t bus;
6892        uint8_t func;
6893        int j;
6894        int index;
6895        dma_addr_t dma_address;
6896        char __iomem *ioremap_ptr;
6897        char __iomem *mem_ptr;
6898        uint32_t IsDead;
6899
6900        METHOD_TRACE("ips_init_phase1", 1);
6901        index = IPS_MAX_ADAPTERS;
6902        for (j = 0; j < IPS_MAX_ADAPTERS; j++) {
6903                if (ips_ha[j] == NULL) {
6904                        index = j;
6905                        break;
6906                }
6907        }
6908
6909        if (index >= IPS_MAX_ADAPTERS)
6910                return -1;
6911
6912        /* stuff that we get in dev */
6913        bus = pci_dev->bus->number;
6914        func = pci_dev->devfn;
6915
6916        /* Init MEM/IO addresses to 0 */
6917        mem_addr = 0;
6918        io_addr = 0;
6919        mem_len = 0;
6920        io_len = 0;
6921
6922        for (j = 0; j < 2; j++) {
6923                if (!pci_resource_start(pci_dev, j))
6924                        break;
6925
6926                if (pci_resource_flags(pci_dev, j) & IORESOURCE_IO) {
6927                        io_addr = pci_resource_start(pci_dev, j);
6928                        io_len = pci_resource_len(pci_dev, j);
6929                } else {
6930                        mem_addr = pci_resource_start(pci_dev, j);
6931                        mem_len = pci_resource_len(pci_dev, j);
6932                }
6933        }
6934
6935        /* setup memory mapped area (if applicable) */
6936        if (mem_addr) {
6937                uint32_t base;
6938                uint32_t offs;
6939
6940                base = mem_addr & PAGE_MASK;
6941                offs = mem_addr - base;
6942                ioremap_ptr = ioremap(base, PAGE_SIZE);
6943                if (!ioremap_ptr)
6944                        return -1;
6945                mem_ptr = ioremap_ptr + offs;
6946        } else {
6947                ioremap_ptr = NULL;
6948                mem_ptr = NULL;
6949        }
6950
6951        /* found a controller */
6952        ha = kzalloc(sizeof (ips_ha_t), GFP_KERNEL);
6953        if (ha == NULL) {
6954                IPS_PRINTK(KERN_WARNING, pci_dev,
6955                           "Unable to allocate temporary ha struct\n");
6956                return -1;
6957        }
6958
6959        ips_sh[index] = NULL;
6960        ips_ha[index] = ha;
6961        ha->active = 1;
6962
6963        /* Store info in HA structure */
6964        ha->io_addr = io_addr;
6965        ha->io_len = io_len;
6966        ha->mem_addr = mem_addr;
6967        ha->mem_len = mem_len;
6968        ha->mem_ptr = mem_ptr;
6969        ha->ioremap_ptr = ioremap_ptr;
6970        ha->host_num = (uint32_t) index;
6971        ha->slot_num = PCI_SLOT(pci_dev->devfn);
6972        ha->pcidev = pci_dev;
6973
6974        /*
6975         * Set the pci_dev's dma_mask.  Not all adapters support 64bit
6976         * addressing so don't enable it if the adapter can't support
6977         * it!  Also, don't use 64bit addressing if dma addresses
6978         * are guaranteed to be < 4G.
6979         */
6980        if (IPS_ENABLE_DMA64 && IPS_HAS_ENH_SGLIST(ha) &&
6981            !pci_set_dma_mask(ha->pcidev, DMA_BIT_MASK(64))) {
6982                (ha)->flags |= IPS_HA_ENH_SG;
6983        } else {
6984                if (pci_set_dma_mask(ha->pcidev, DMA_BIT_MASK(32)) != 0) {
6985                        printk(KERN_WARNING "Unable to set DMA Mask\n");
6986                        return ips_abort_init(ha, index);
6987                }
6988        }
6989        if(ips_cd_boot && !ips_FlashData){
6990                ips_FlashData = pci_alloc_consistent(pci_dev, PAGE_SIZE << 7,
6991                                                     &ips_flashbusaddr);
6992        }
6993
6994        ha->enq = pci_alloc_consistent(pci_dev, sizeof (IPS_ENQ),
6995                                       &ha->enq_busaddr);
6996        if (!ha->enq) {
6997                IPS_PRINTK(KERN_WARNING, pci_dev,
6998                           "Unable to allocate host inquiry structure\n");
6999                return ips_abort_init(ha, index);
7000        }
7001
7002        ha->adapt = pci_alloc_consistent(pci_dev, sizeof (IPS_ADAPTER) +
7003                                         sizeof (IPS_IO_CMD), &dma_address);
7004        if (!ha->adapt) {
7005                IPS_PRINTK(KERN_WARNING, pci_dev,
7006                           "Unable to allocate host adapt & dummy structures\n");
7007                return ips_abort_init(ha, index);
7008        }
7009        ha->adapt->hw_status_start = dma_address;
7010        ha->dummy = (void *) (ha->adapt + 1);
7011
7012
7013
7014        ha->logical_drive_info = pci_alloc_consistent(pci_dev, sizeof (IPS_LD_INFO), &dma_address);
7015        if (!ha->logical_drive_info) {
7016                IPS_PRINTK(KERN_WARNING, pci_dev,
7017                           "Unable to allocate logical drive info structure\n");
7018                return ips_abort_init(ha, index);
7019        }
7020        ha->logical_drive_info_dma_addr = dma_address;
7021
7022
7023        ha->conf = kmalloc(sizeof (IPS_CONF), GFP_KERNEL);
7024
7025        if (!ha->conf) {
7026                IPS_PRINTK(KERN_WARNING, pci_dev,
7027                           "Unable to allocate host conf structure\n");
7028                return ips_abort_init(ha, index);
7029        }
7030
7031        ha->nvram = kmalloc(sizeof (IPS_NVRAM_P5), GFP_KERNEL);
7032
7033        if (!ha->nvram) {
7034                IPS_PRINTK(KERN_WARNING, pci_dev,
7035                           "Unable to allocate host NVRAM structure\n");
7036                return ips_abort_init(ha, index);
7037        }
7038
7039        ha->subsys = kmalloc(sizeof (IPS_SUBSYS), GFP_KERNEL);
7040
7041        if (!ha->subsys) {
7042                IPS_PRINTK(KERN_WARNING, pci_dev,
7043                           "Unable to allocate host subsystem structure\n");
7044                return ips_abort_init(ha, index);
7045        }
7046
7047        /* the ioctl buffer is now used during adapter initialization, so its
7048         * successful allocation is now required */
7049        if (ips_ioctlsize < PAGE_SIZE)
7050                ips_ioctlsize = PAGE_SIZE;
7051
7052        ha->ioctl_data = pci_alloc_consistent(pci_dev, ips_ioctlsize,
7053                                              &ha->ioctl_busaddr);
7054        ha->ioctl_len = ips_ioctlsize;
7055        if (!ha->ioctl_data) {
7056                IPS_PRINTK(KERN_WARNING, pci_dev,
7057                           "Unable to allocate IOCTL data\n");
7058                return ips_abort_init(ha, index);
7059        }
7060
7061        /*
7062         * Setup Functions
7063         */
7064        ips_setup_funclist(ha);
7065
7066        if ((IPS_IS_MORPHEUS(ha)) || (IPS_IS_MARCO(ha))) {
7067                /* If Morpheus appears dead, reset it */
7068                IsDead = readl(ha->mem_ptr + IPS_REG_I960_MSG1);
7069                if (IsDead == 0xDEADBEEF) {
7070                        ips_reset_morpheus(ha);
7071                }
7072        }
7073
7074        /*
7075         * Initialize the card if it isn't already
7076         */
7077
7078        if (!(*ha->func.isinit) (ha)) {
7079                if (!(*ha->func.init) (ha)) {
7080                        /*
7081                         * Initialization failed
7082                         */
7083                        IPS_PRINTK(KERN_WARNING, pci_dev,
7084                                   "Unable to initialize controller\n");
7085                        return ips_abort_init(ha, index);
7086                }
7087        }
7088
7089        *indexPtr = index;
7090        return SUCCESS;
7091}
7092
7093/*---------------------------------------------------------------------------*/
7094/*   Routine Name: ips_init_phase2                                           */
7095/*                                                                           */
7096/*   Routine Description:                                                    */
7097/*     Adapter Initialization Phase 2                                        */
7098/*                                                                           */
7099/*   Return Value:                                                           */
7100/*     0 if Successful, else non-zero                                        */
7101/*---------------------------------------------------------------------------*/
7102static int
7103ips_init_phase2(int index)
7104{
7105        ips_ha_t *ha;
7106
7107        ha = ips_ha[index];
7108
7109        METHOD_TRACE("ips_init_phase2", 1);
7110        if (!ha->active) {
7111                ips_ha[index] = NULL;
7112                return -1;
7113        }
7114
7115        /* Install the interrupt handler */
7116        if (request_irq(ha->pcidev->irq, do_ipsintr, IRQF_SHARED, ips_name, ha)) {
7117                IPS_PRINTK(KERN_WARNING, ha->pcidev,
7118                           "Unable to install interrupt handler\n");
7119                return ips_abort_init(ha, index);
7120        }
7121
7122        /*
7123         * Allocate a temporary SCB for initialization
7124         */
7125        ha->max_cmds = 1;
7126        if (!ips_allocatescbs(ha)) {
7127                IPS_PRINTK(KERN_WARNING, ha->pcidev,
7128                           "Unable to allocate a CCB\n");
7129                free_irq(ha->pcidev->irq, ha);
7130                return ips_abort_init(ha, index);
7131        }
7132
7133        if (!ips_hainit(ha)) {
7134                IPS_PRINTK(KERN_WARNING, ha->pcidev,
7135                           "Unable to initialize controller\n");
7136                free_irq(ha->pcidev->irq, ha);
7137                return ips_abort_init(ha, index);
7138        }
7139        /* Free the temporary SCB */
7140        ips_deallocatescbs(ha, 1);
7141
7142        /* allocate CCBs */
7143        if (!ips_allocatescbs(ha)) {
7144                IPS_PRINTK(KERN_WARNING, ha->pcidev,
7145                           "Unable to allocate CCBs\n");
7146                free_irq(ha->pcidev->irq, ha);
7147                return ips_abort_init(ha, index);
7148        }
7149
7150        return SUCCESS;
7151}
7152
7153MODULE_LICENSE("GPL");
7154MODULE_DESCRIPTION("IBM ServeRAID Adapter Driver " IPS_VER_STRING);
7155MODULE_VERSION(IPS_VER_STRING);
7156
7157
7158/*
7159 * Overrides for Emacs so that we almost follow Linus's tabbing style.
7160 * Emacs will notice this stuff at the end of the file and automatically
7161 * adjust the settings for this buffer only.  This must remain at the end
7162 * of the file.
7163 * ---------------------------------------------------------------------------
7164 * Local variables:
7165 * c-indent-level: 2
7166 * c-brace-imaginary-offset: 0
7167 * c-brace-offset: -2
7168 * c-argdecl-indent: 2
7169 * c-label-offset: -2
7170 * c-continued-statement-offset: 2
7171 * c-continued-brace-offset: 0
7172 * indent-tabs-mode: nil
7173 * tab-width: 8
7174 * End:
7175 */
7176