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 (strnicmp
 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_adjust_queue_depth(SDptr, MSG_ORDERED_TAG, 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_printf(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_printf(m,
2049                          "\tController Type                   : Unknown\n");
2050
2051        if (ha->io_addr)
2052                seq_printf(m,
2053                          "\tIO region                         : 0x%x (%d bytes)\n",
2054                          ha->io_addr, ha->io_len);
2055
2056        if (ha->mem_addr) {
2057                seq_printf(m,
2058                          "\tMemory region                     : 0x%x (%d bytes)\n",
2059                          ha->mem_addr, ha->mem_len);
2060                seq_printf(m,
2061                          "\tShared memory address             : 0x%lx\n",
2062                          (unsigned long)ha->mem_ptr);
2063        }
2064
2065        seq_printf(m, "\tIRQ number                        : %d\n", ha->pcidev->irq);
2066
2067    /* For the Next 3 lines Check for Binary 0 at the end and don't include it if it's there. */
2068    /* That keeps everything happy for "text" operations on the proc file.                    */
2069
2070        if (le32_to_cpu(ha->nvram->signature) == IPS_NVRAM_P5_SIG) {
2071        if (ha->nvram->bios_low[3] == 0) {
2072                seq_printf(m,
2073                          "\tBIOS Version                      : %c%c%c%c%c%c%c\n",
2074                          ha->nvram->bios_high[0], ha->nvram->bios_high[1],
2075                          ha->nvram->bios_high[2], ha->nvram->bios_high[3],
2076                          ha->nvram->bios_low[0], ha->nvram->bios_low[1],
2077                          ha->nvram->bios_low[2]);
2078
2079        } else {
2080                seq_printf(m,
2081                          "\tBIOS Version                      : %c%c%c%c%c%c%c%c\n",
2082                          ha->nvram->bios_high[0], ha->nvram->bios_high[1],
2083                          ha->nvram->bios_high[2], ha->nvram->bios_high[3],
2084                          ha->nvram->bios_low[0], ha->nvram->bios_low[1],
2085                          ha->nvram->bios_low[2], ha->nvram->bios_low[3]);
2086        }
2087
2088    }
2089
2090    if (ha->enq->CodeBlkVersion[7] == 0) {
2091        seq_printf(m,
2092                  "\tFirmware Version                  : %c%c%c%c%c%c%c\n",
2093                  ha->enq->CodeBlkVersion[0], ha->enq->CodeBlkVersion[1],
2094                  ha->enq->CodeBlkVersion[2], ha->enq->CodeBlkVersion[3],
2095                  ha->enq->CodeBlkVersion[4], ha->enq->CodeBlkVersion[5],
2096                  ha->enq->CodeBlkVersion[6]);
2097    } else {
2098        seq_printf(m,
2099                  "\tFirmware Version                  : %c%c%c%c%c%c%c%c\n",
2100                  ha->enq->CodeBlkVersion[0], ha->enq->CodeBlkVersion[1],
2101                  ha->enq->CodeBlkVersion[2], ha->enq->CodeBlkVersion[3],
2102                  ha->enq->CodeBlkVersion[4], ha->enq->CodeBlkVersion[5],
2103                  ha->enq->CodeBlkVersion[6], ha->enq->CodeBlkVersion[7]);
2104    }
2105
2106    if (ha->enq->BootBlkVersion[7] == 0) {
2107        seq_printf(m,
2108                  "\tBoot Block Version                : %c%c%c%c%c%c%c\n",
2109                  ha->enq->BootBlkVersion[0], ha->enq->BootBlkVersion[1],
2110                  ha->enq->BootBlkVersion[2], ha->enq->BootBlkVersion[3],
2111                  ha->enq->BootBlkVersion[4], ha->enq->BootBlkVersion[5],
2112                  ha->enq->BootBlkVersion[6]);
2113    } else {
2114        seq_printf(m,
2115                  "\tBoot Block Version                : %c%c%c%c%c%c%c%c\n",
2116                  ha->enq->BootBlkVersion[0], ha->enq->BootBlkVersion[1],
2117                  ha->enq->BootBlkVersion[2], ha->enq->BootBlkVersion[3],
2118                  ha->enq->BootBlkVersion[4], ha->enq->BootBlkVersion[5],
2119                  ha->enq->BootBlkVersion[6], ha->enq->BootBlkVersion[7]);
2120    }
2121
2122        seq_printf(m, "\tDriver Version                    : %s%s\n",
2123                  IPS_VERSION_HIGH, IPS_VERSION_LOW);
2124
2125        seq_printf(m, "\tDriver Build                      : %d\n",
2126                  IPS_BUILD_IDENT);
2127
2128        seq_printf(m, "\tMax Physical Devices              : %d\n",
2129                  ha->enq->ucMaxPhysicalDevices);
2130        seq_printf(m, "\tMax Active Commands               : %d\n",
2131                  ha->max_cmds);
2132        seq_printf(m, "\tCurrent Queued Commands           : %d\n",
2133                  ha->scb_waitlist.count);
2134        seq_printf(m, "\tCurrent Active Commands           : %d\n",
2135                  ha->scb_activelist.count - ha->num_ioctl);
2136        seq_printf(m, "\tCurrent Queued PT Commands        : %d\n",
2137                  ha->copp_waitlist.count);
2138        seq_printf(m, "\tCurrent Active PT Commands        : %d\n",
2139                  ha->num_ioctl);
2140
2141        seq_printf(m, "\n");
2142
2143        return 0;
2144}
2145
2146/****************************************************************************/
2147/*                                                                          */
2148/* Routine Name: ips_identify_controller                                    */
2149/*                                                                          */
2150/* Routine Description:                                                     */
2151/*                                                                          */
2152/*   Identify this controller                                               */
2153/*                                                                          */
2154/****************************************************************************/
2155static void
2156ips_identify_controller(ips_ha_t * ha)
2157{
2158        METHOD_TRACE("ips_identify_controller", 1);
2159
2160        switch (ha->pcidev->device) {
2161        case IPS_DEVICEID_COPPERHEAD:
2162                if (ha->pcidev->revision <= IPS_REVID_SERVERAID) {
2163                        ha->ad_type = IPS_ADTYPE_SERVERAID;
2164                } else if (ha->pcidev->revision == IPS_REVID_SERVERAID2) {
2165                        ha->ad_type = IPS_ADTYPE_SERVERAID2;
2166                } else if (ha->pcidev->revision == IPS_REVID_NAVAJO) {
2167                        ha->ad_type = IPS_ADTYPE_NAVAJO;
2168                } else if ((ha->pcidev->revision == IPS_REVID_SERVERAID2)
2169                           && (ha->slot_num == 0)) {
2170                        ha->ad_type = IPS_ADTYPE_KIOWA;
2171                } else if ((ha->pcidev->revision >= IPS_REVID_CLARINETP1) &&
2172                           (ha->pcidev->revision <= IPS_REVID_CLARINETP3)) {
2173                        if (ha->enq->ucMaxPhysicalDevices == 15)
2174                                ha->ad_type = IPS_ADTYPE_SERVERAID3L;
2175                        else
2176                                ha->ad_type = IPS_ADTYPE_SERVERAID3;
2177                } else if ((ha->pcidev->revision >= IPS_REVID_TROMBONE32) &&
2178                           (ha->pcidev->revision <= IPS_REVID_TROMBONE64)) {
2179                        ha->ad_type = IPS_ADTYPE_SERVERAID4H;
2180                }
2181                break;
2182
2183        case IPS_DEVICEID_MORPHEUS:
2184                switch (ha->pcidev->subsystem_device) {
2185                case IPS_SUBDEVICEID_4L:
2186                        ha->ad_type = IPS_ADTYPE_SERVERAID4L;
2187                        break;
2188
2189                case IPS_SUBDEVICEID_4M:
2190                        ha->ad_type = IPS_ADTYPE_SERVERAID4M;
2191                        break;
2192
2193                case IPS_SUBDEVICEID_4MX:
2194                        ha->ad_type = IPS_ADTYPE_SERVERAID4MX;
2195                        break;
2196
2197                case IPS_SUBDEVICEID_4LX:
2198                        ha->ad_type = IPS_ADTYPE_SERVERAID4LX;
2199                        break;
2200
2201                case IPS_SUBDEVICEID_5I2:
2202                        ha->ad_type = IPS_ADTYPE_SERVERAID5I2;
2203                        break;
2204
2205                case IPS_SUBDEVICEID_5I1:
2206                        ha->ad_type = IPS_ADTYPE_SERVERAID5I1;
2207                        break;
2208                }
2209
2210                break;
2211
2212        case IPS_DEVICEID_MARCO:
2213                switch (ha->pcidev->subsystem_device) {
2214                case IPS_SUBDEVICEID_6M:
2215                        ha->ad_type = IPS_ADTYPE_SERVERAID6M;
2216                        break;
2217                case IPS_SUBDEVICEID_6I:
2218                        ha->ad_type = IPS_ADTYPE_SERVERAID6I;
2219                        break;
2220                case IPS_SUBDEVICEID_7k:
2221                        ha->ad_type = IPS_ADTYPE_SERVERAID7k;
2222                        break;
2223                case IPS_SUBDEVICEID_7M:
2224                        ha->ad_type = IPS_ADTYPE_SERVERAID7M;
2225                        break;
2226                }
2227                break;
2228        }
2229}
2230
2231/****************************************************************************/
2232/*                                                                          */
2233/* Routine Name: ips_get_bios_version                                       */
2234/*                                                                          */
2235/* Routine Description:                                                     */
2236/*                                                                          */
2237/*   Get the BIOS revision number                                           */
2238/*                                                                          */
2239/****************************************************************************/
2240static void
2241ips_get_bios_version(ips_ha_t * ha, int intr)
2242{
2243        ips_scb_t *scb;
2244        int ret;
2245        uint8_t major;
2246        uint8_t minor;
2247        uint8_t subminor;
2248        uint8_t *buffer;
2249        char hexDigits[] =
2250            { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C',
2251     'D', 'E', 'F' };
2252
2253        METHOD_TRACE("ips_get_bios_version", 1);
2254
2255        major = 0;
2256        minor = 0;
2257
2258        strncpy(ha->bios_version, "       ?", 8);
2259
2260        if (ha->pcidev->device == IPS_DEVICEID_COPPERHEAD) {
2261                if (IPS_USE_MEMIO(ha)) {
2262                        /* Memory Mapped I/O */
2263
2264                        /* test 1st byte */
2265                        writel(0, ha->mem_ptr + IPS_REG_FLAP);
2266                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2267                                udelay(25);     /* 25 us */
2268
2269                        if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0x55)
2270                                return;
2271
2272                        writel(1, ha->mem_ptr + IPS_REG_FLAP);
2273                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2274                                udelay(25);     /* 25 us */
2275
2276                        if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0xAA)
2277                                return;
2278
2279                        /* Get Major version */
2280                        writel(0x1FF, ha->mem_ptr + IPS_REG_FLAP);
2281                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2282                                udelay(25);     /* 25 us */
2283
2284                        major = readb(ha->mem_ptr + IPS_REG_FLDP);
2285
2286                        /* Get Minor version */
2287                        writel(0x1FE, ha->mem_ptr + IPS_REG_FLAP);
2288                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2289                                udelay(25);     /* 25 us */
2290                        minor = readb(ha->mem_ptr + IPS_REG_FLDP);
2291
2292                        /* Get SubMinor version */
2293                        writel(0x1FD, ha->mem_ptr + IPS_REG_FLAP);
2294                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2295                                udelay(25);     /* 25 us */
2296                        subminor = readb(ha->mem_ptr + IPS_REG_FLDP);
2297
2298                } else {
2299                        /* Programmed I/O */
2300
2301                        /* test 1st byte */
2302                        outl(0, ha->io_addr + IPS_REG_FLAP);
2303                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2304                                udelay(25);     /* 25 us */
2305
2306                        if (inb(ha->io_addr + IPS_REG_FLDP) != 0x55)
2307                                return;
2308
2309                        outl(1, ha->io_addr + IPS_REG_FLAP);
2310                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2311                                udelay(25);     /* 25 us */
2312
2313                        if (inb(ha->io_addr + IPS_REG_FLDP) != 0xAA)
2314                                return;
2315
2316                        /* Get Major version */
2317                        outl(0x1FF, ha->io_addr + IPS_REG_FLAP);
2318                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2319                                udelay(25);     /* 25 us */
2320
2321                        major = inb(ha->io_addr + IPS_REG_FLDP);
2322
2323                        /* Get Minor version */
2324                        outl(0x1FE, ha->io_addr + IPS_REG_FLAP);
2325                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2326                                udelay(25);     /* 25 us */
2327
2328                        minor = inb(ha->io_addr + IPS_REG_FLDP);
2329
2330                        /* Get SubMinor version */
2331                        outl(0x1FD, ha->io_addr + IPS_REG_FLAP);
2332                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2333                                udelay(25);     /* 25 us */
2334
2335                        subminor = inb(ha->io_addr + IPS_REG_FLDP);
2336
2337                }
2338        } else {
2339                /* Morpheus Family - Send Command to the card */
2340
2341                buffer = ha->ioctl_data;
2342
2343                memset(buffer, 0, 0x1000);
2344
2345                scb = &ha->scbs[ha->max_cmds - 1];
2346
2347                ips_init_scb(ha, scb);
2348
2349                scb->timeout = ips_cmd_timeout;
2350                scb->cdb[0] = IPS_CMD_RW_BIOSFW;
2351
2352                scb->cmd.flashfw.op_code = IPS_CMD_RW_BIOSFW;
2353                scb->cmd.flashfw.command_id = IPS_COMMAND_ID(ha, scb);
2354                scb->cmd.flashfw.type = 1;
2355                scb->cmd.flashfw.direction = 0;
2356                scb->cmd.flashfw.count = cpu_to_le32(0x800);
2357                scb->cmd.flashfw.total_packets = 1;
2358                scb->cmd.flashfw.packet_num = 0;
2359                scb->data_len = 0x1000;
2360                scb->cmd.flashfw.buffer_addr = ha->ioctl_busaddr;
2361
2362                /* issue the command */
2363                if (((ret =
2364                      ips_send_wait(ha, scb, ips_cmd_timeout,
2365                                    intr)) == IPS_FAILURE)
2366                    || (ret == IPS_SUCCESS_IMM)
2367                    || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) {
2368                        /* Error occurred */
2369
2370                        return;
2371                }
2372
2373                if ((buffer[0xC0] == 0x55) && (buffer[0xC1] == 0xAA)) {
2374                        major = buffer[0x1ff + 0xC0];   /* Offset 0x1ff after the header (0xc0) */
2375                        minor = buffer[0x1fe + 0xC0];   /* Offset 0x1fe after the header (0xc0) */
2376                        subminor = buffer[0x1fd + 0xC0];        /* Offset 0x1fd after the header (0xc0) */
2377                } else {
2378                        return;
2379                }
2380        }
2381
2382        ha->bios_version[0] = hexDigits[(major & 0xF0) >> 4];
2383        ha->bios_version[1] = '.';
2384        ha->bios_version[2] = hexDigits[major & 0x0F];
2385        ha->bios_version[3] = hexDigits[subminor];
2386        ha->bios_version[4] = '.';
2387        ha->bios_version[5] = hexDigits[(minor & 0xF0) >> 4];
2388        ha->bios_version[6] = hexDigits[minor & 0x0F];
2389        ha->bios_version[7] = 0;
2390}
2391
2392/****************************************************************************/
2393/*                                                                          */
2394/* Routine Name: ips_hainit                                                 */
2395/*                                                                          */
2396/* Routine Description:                                                     */
2397/*                                                                          */
2398/*   Initialize the controller                                              */
2399/*                                                                          */
2400/* NOTE: Assumes to be called from with a lock                              */
2401/*                                                                          */
2402/****************************************************************************/
2403static int
2404ips_hainit(ips_ha_t * ha)
2405{
2406        int i;
2407        struct timeval tv;
2408
2409        METHOD_TRACE("ips_hainit", 1);
2410
2411        if (!ha)
2412                return (0);
2413
2414        if (ha->func.statinit)
2415                (*ha->func.statinit) (ha);
2416
2417        if (ha->func.enableint)
2418                (*ha->func.enableint) (ha);
2419
2420        /* Send FFDC */
2421        ha->reset_count = 1;
2422        do_gettimeofday(&tv);
2423        ha->last_ffdc = tv.tv_sec;
2424        ips_ffdc_reset(ha, IPS_INTR_IORL);
2425
2426        if (!ips_read_config(ha, IPS_INTR_IORL)) {
2427                IPS_PRINTK(KERN_WARNING, ha->pcidev,
2428                           "unable to read config from controller.\n");
2429
2430                return (0);
2431        }
2432        /* end if */
2433        if (!ips_read_adapter_status(ha, IPS_INTR_IORL)) {
2434                IPS_PRINTK(KERN_WARNING, ha->pcidev,
2435                           "unable to read controller status.\n");
2436
2437                return (0);
2438        }
2439
2440        /* Identify this controller */
2441        ips_identify_controller(ha);
2442
2443        if (!ips_read_subsystem_parameters(ha, IPS_INTR_IORL)) {
2444                IPS_PRINTK(KERN_WARNING, ha->pcidev,
2445                           "unable to read subsystem parameters.\n");
2446
2447                return (0);
2448        }
2449
2450        /* write nvram user page 5 */
2451        if (!ips_write_driver_status(ha, IPS_INTR_IORL)) {
2452                IPS_PRINTK(KERN_WARNING, ha->pcidev,
2453                           "unable to write driver info to controller.\n");
2454
2455                return (0);
2456        }
2457
2458        /* If there are Logical Drives and a Reset Occurred, then an EraseStripeLock is Needed */
2459        if ((ha->conf->ucLogDriveCount > 0) && (ha->requires_esl == 1))
2460                ips_clear_adapter(ha, IPS_INTR_IORL);
2461
2462        /* set limits on SID, LUN, BUS */
2463        ha->ntargets = IPS_MAX_TARGETS + 1;
2464        ha->nlun = 1;
2465        ha->nbus = (ha->enq->ucMaxPhysicalDevices / IPS_MAX_TARGETS) + 1;
2466
2467        switch (ha->conf->logical_drive[0].ucStripeSize) {
2468        case 4:
2469                ha->max_xfer = 0x10000;
2470                break;
2471
2472        case 5:
2473                ha->max_xfer = 0x20000;
2474                break;
2475
2476        case 6:
2477                ha->max_xfer = 0x40000;
2478                break;
2479
2480        case 7:
2481        default:
2482                ha->max_xfer = 0x80000;
2483                break;
2484        }
2485
2486        /* setup max concurrent commands */
2487        if (le32_to_cpu(ha->subsys->param[4]) & 0x1) {
2488                /* Use the new method */
2489                ha->max_cmds = ha->enq->ucConcurrentCmdCount;
2490        } else {
2491                /* use the old method */
2492                switch (ha->conf->logical_drive[0].ucStripeSize) {
2493                case 4:
2494                        ha->max_cmds = 32;
2495                        break;
2496
2497                case 5:
2498                        ha->max_cmds = 16;
2499                        break;
2500
2501                case 6:
2502                        ha->max_cmds = 8;
2503                        break;
2504
2505                case 7:
2506                default:
2507                        ha->max_cmds = 4;
2508                        break;
2509                }
2510        }
2511
2512        /* Limit the Active Commands on a Lite Adapter */
2513        if ((ha->ad_type == IPS_ADTYPE_SERVERAID3L) ||
2514            (ha->ad_type == IPS_ADTYPE_SERVERAID4L) ||
2515            (ha->ad_type == IPS_ADTYPE_SERVERAID4LX)) {
2516                if ((ha->max_cmds > MaxLiteCmds) && (MaxLiteCmds))
2517                        ha->max_cmds = MaxLiteCmds;
2518        }
2519
2520        /* set controller IDs */
2521        ha->ha_id[0] = IPS_ADAPTER_ID;
2522        for (i = 1; i < ha->nbus; i++) {
2523                ha->ha_id[i] = ha->conf->init_id[i - 1] & 0x1f;
2524                ha->dcdb_active[i - 1] = 0;
2525        }
2526
2527        return (1);
2528}
2529
2530/****************************************************************************/
2531/*                                                                          */
2532/* Routine Name: ips_next                                                   */
2533/*                                                                          */
2534/* Routine Description:                                                     */
2535/*                                                                          */
2536/*   Take the next command off the queue and send it to the controller      */
2537/*                                                                          */
2538/****************************************************************************/
2539static void
2540ips_next(ips_ha_t * ha, int intr)
2541{
2542        ips_scb_t *scb;
2543        struct scsi_cmnd *SC;
2544        struct scsi_cmnd *p;
2545        struct scsi_cmnd *q;
2546        ips_copp_wait_item_t *item;
2547        int ret;
2548        struct Scsi_Host *host;
2549        METHOD_TRACE("ips_next", 1);
2550
2551        if (!ha)
2552                return;
2553        host = ips_sh[ha->host_num];
2554        /*
2555         * Block access to the queue function so
2556         * this command won't time out
2557         */
2558        if (intr == IPS_INTR_ON)
2559                spin_lock(host->host_lock);
2560
2561        if ((ha->subsys->param[3] & 0x300000)
2562            && (ha->scb_activelist.count == 0)) {
2563                struct timeval tv;
2564
2565                do_gettimeofday(&tv);
2566
2567                if (tv.tv_sec - ha->last_ffdc > IPS_SECS_8HOURS) {
2568                        ha->last_ffdc = tv.tv_sec;
2569                        ips_ffdc_time(ha);
2570                }
2571        }
2572
2573        /*
2574         * Send passthru commands
2575         * These have priority over normal I/O
2576         * but shouldn't affect performance too much
2577         * since we limit the number that can be active
2578         * on the card at any one time
2579         */
2580        while ((ha->num_ioctl < IPS_MAX_IOCTL) &&
2581               (ha->copp_waitlist.head) && (scb = ips_getscb(ha))) {
2582
2583                item = ips_removeq_copp_head(&ha->copp_waitlist);
2584                ha->num_ioctl++;
2585                if (intr == IPS_INTR_ON)
2586                        spin_unlock(host->host_lock);
2587                scb->scsi_cmd = item->scsi_cmd;
2588                kfree(item);
2589
2590                ret = ips_make_passthru(ha, scb->scsi_cmd, scb, intr);
2591
2592                if (intr == IPS_INTR_ON)
2593                        spin_lock(host->host_lock);
2594                switch (ret) {
2595                case IPS_FAILURE:
2596                        if (scb->scsi_cmd) {
2597                                scb->scsi_cmd->result = DID_ERROR << 16;
2598                                scb->scsi_cmd->scsi_done(scb->scsi_cmd);
2599                        }
2600
2601                        ips_freescb(ha, scb);
2602                        break;
2603                case IPS_SUCCESS_IMM:
2604                        if (scb->scsi_cmd) {
2605                                scb->scsi_cmd->result = DID_OK << 16;
2606                                scb->scsi_cmd->scsi_done(scb->scsi_cmd);
2607                        }
2608
2609                        ips_freescb(ha, scb);
2610                        break;
2611                default:
2612                        break;
2613                }               /* end case */
2614
2615                if (ret != IPS_SUCCESS) {
2616                        ha->num_ioctl--;
2617                        continue;
2618                }
2619
2620                ret = ips_send_cmd(ha, scb);
2621
2622                if (ret == IPS_SUCCESS)
2623                        ips_putq_scb_head(&ha->scb_activelist, scb);
2624                else
2625                        ha->num_ioctl--;
2626
2627                switch (ret) {
2628                case IPS_FAILURE:
2629                        if (scb->scsi_cmd) {
2630                                scb->scsi_cmd->result = DID_ERROR << 16;
2631                        }
2632
2633                        ips_freescb(ha, scb);
2634                        break;
2635                case IPS_SUCCESS_IMM:
2636                        ips_freescb(ha, scb);
2637                        break;
2638                default:
2639                        break;
2640                }               /* end case */
2641
2642        }
2643
2644        /*
2645         * Send "Normal" I/O commands
2646         */
2647
2648        p = ha->scb_waitlist.head;
2649        while ((p) && (scb = ips_getscb(ha))) {
2650                if ((scmd_channel(p) > 0)
2651                    && (ha->
2652                        dcdb_active[scmd_channel(p) -
2653                                    1] & (1 << scmd_id(p)))) {
2654                        ips_freescb(ha, scb);
2655                        p = (struct scsi_cmnd *) p->host_scribble;
2656                        continue;
2657                }
2658
2659                q = p;
2660                SC = ips_removeq_wait(&ha->scb_waitlist, q);
2661
2662                if (intr == IPS_INTR_ON)
2663                        spin_unlock(host->host_lock);   /* Unlock HA after command is taken off queue */
2664
2665                SC->result = DID_OK;
2666                SC->host_scribble = NULL;
2667
2668                scb->target_id = SC->device->id;
2669                scb->lun = SC->device->lun;
2670                scb->bus = SC->device->channel;
2671                scb->scsi_cmd = SC;
2672                scb->breakup = 0;
2673                scb->data_len = 0;
2674                scb->callback = ipsintr_done;
2675                scb->timeout = ips_cmd_timeout;
2676                memset(&scb->cmd, 0, 16);
2677
2678                /* copy in the CDB */
2679                memcpy(scb->cdb, SC->cmnd, SC->cmd_len);
2680
2681                scb->sg_count = scsi_dma_map(SC);
2682                BUG_ON(scb->sg_count < 0);
2683                if (scb->sg_count) {
2684                        struct scatterlist *sg;
2685                        int i;
2686
2687                        scb->flags |= IPS_SCB_MAP_SG;
2688
2689                        scsi_for_each_sg(SC, sg, scb->sg_count, i) {
2690                                if (ips_fill_scb_sg_single
2691                                    (ha, sg_dma_address(sg), scb, i,
2692                                     sg_dma_len(sg)) < 0)
2693                                        break;
2694                        }
2695                        scb->dcdb.transfer_length = scb->data_len;
2696                } else {
2697                        scb->data_busaddr = 0L;
2698                        scb->sg_len = 0;
2699                        scb->data_len = 0;
2700                        scb->dcdb.transfer_length = 0;
2701                }
2702
2703                scb->dcdb.cmd_attribute =
2704                    ips_command_direction[scb->scsi_cmd->cmnd[0]];
2705
2706                /* Allow a WRITE BUFFER Command to Have no Data */
2707                /* This is Used by Tape Flash Utilites          */
2708                if ((scb->scsi_cmd->cmnd[0] == WRITE_BUFFER) &&
2709                                (scb->data_len == 0))
2710                        scb->dcdb.cmd_attribute = 0;
2711
2712                if (!(scb->dcdb.cmd_attribute & 0x3))
2713                        scb->dcdb.transfer_length = 0;
2714
2715                if (scb->data_len >= IPS_MAX_XFER) {
2716                        scb->dcdb.cmd_attribute |= IPS_TRANSFER64K;
2717                        scb->dcdb.transfer_length = 0;
2718                }
2719                if (intr == IPS_INTR_ON)
2720                        spin_lock(host->host_lock);
2721
2722                ret = ips_send_cmd(ha, scb);
2723
2724                switch (ret) {
2725                case IPS_SUCCESS:
2726                        ips_putq_scb_head(&ha->scb_activelist, scb);
2727                        break;
2728                case IPS_FAILURE:
2729                        if (scb->scsi_cmd) {
2730                                scb->scsi_cmd->result = DID_ERROR << 16;
2731                                scb->scsi_cmd->scsi_done(scb->scsi_cmd);
2732                        }
2733
2734                        if (scb->bus)
2735                                ha->dcdb_active[scb->bus - 1] &=
2736                                    ~(1 << scb->target_id);
2737
2738                        ips_freescb(ha, scb);
2739                        break;
2740                case IPS_SUCCESS_IMM:
2741                        if (scb->scsi_cmd)
2742                                scb->scsi_cmd->scsi_done(scb->scsi_cmd);
2743
2744                        if (scb->bus)
2745                                ha->dcdb_active[scb->bus - 1] &=
2746                                    ~(1 << scb->target_id);
2747
2748                        ips_freescb(ha, scb);
2749                        break;
2750                default:
2751                        break;
2752                }               /* end case */
2753
2754                p = (struct scsi_cmnd *) p->host_scribble;
2755
2756        }                       /* end while */
2757
2758        if (intr == IPS_INTR_ON)
2759                spin_unlock(host->host_lock);
2760}
2761
2762/****************************************************************************/
2763/*                                                                          */
2764/* Routine Name: ips_putq_scb_head                                          */
2765/*                                                                          */
2766/* Routine Description:                                                     */
2767/*                                                                          */
2768/*   Add an item to the head of the queue                                   */
2769/*                                                                          */
2770/* ASSUMED to be called from within the HA lock                             */
2771/*                                                                          */
2772/****************************************************************************/
2773static void
2774ips_putq_scb_head(ips_scb_queue_t * queue, ips_scb_t * item)
2775{
2776        METHOD_TRACE("ips_putq_scb_head", 1);
2777
2778        if (!item)
2779                return;
2780
2781        item->q_next = queue->head;
2782        queue->head = item;
2783
2784        if (!queue->tail)
2785                queue->tail = item;
2786
2787        queue->count++;
2788}
2789
2790/****************************************************************************/
2791/*                                                                          */
2792/* Routine Name: ips_removeq_scb_head                                       */
2793/*                                                                          */
2794/* Routine Description:                                                     */
2795/*                                                                          */
2796/*   Remove the head of the queue                                           */
2797/*                                                                          */
2798/* ASSUMED to be called from within the HA lock                             */
2799/*                                                                          */
2800/****************************************************************************/
2801static ips_scb_t *
2802ips_removeq_scb_head(ips_scb_queue_t * queue)
2803{
2804        ips_scb_t *item;
2805
2806        METHOD_TRACE("ips_removeq_scb_head", 1);
2807
2808        item = queue->head;
2809
2810        if (!item) {
2811                return (NULL);
2812        }
2813
2814        queue->head = item->q_next;
2815        item->q_next = NULL;
2816
2817        if (queue->tail == item)
2818                queue->tail = NULL;
2819
2820        queue->count--;
2821
2822        return (item);
2823}
2824
2825/****************************************************************************/
2826/*                                                                          */
2827/* Routine Name: ips_removeq_scb                                            */
2828/*                                                                          */
2829/* Routine Description:                                                     */
2830/*                                                                          */
2831/*   Remove an item from a queue                                            */
2832/*                                                                          */
2833/* ASSUMED to be called from within the HA lock                             */
2834/*                                                                          */
2835/****************************************************************************/
2836static ips_scb_t *
2837ips_removeq_scb(ips_scb_queue_t * queue, ips_scb_t * item)
2838{
2839        ips_scb_t *p;
2840
2841        METHOD_TRACE("ips_removeq_scb", 1);
2842
2843        if (!item)
2844                return (NULL);
2845
2846        if (item == queue->head) {
2847                return (ips_removeq_scb_head(queue));
2848        }
2849
2850        p = queue->head;
2851
2852        while ((p) && (item != p->q_next))
2853                p = p->q_next;
2854
2855        if (p) {
2856                /* found a match */
2857                p->q_next = item->q_next;
2858
2859                if (!item->q_next)
2860                        queue->tail = p;
2861
2862                item->q_next = NULL;
2863                queue->count--;
2864
2865                return (item);
2866        }
2867
2868        return (NULL);
2869}
2870
2871/****************************************************************************/
2872/*                                                                          */
2873/* Routine Name: ips_putq_wait_tail                                         */
2874/*                                                                          */
2875/* Routine Description:                                                     */
2876/*                                                                          */
2877/*   Add an item to the tail of the queue                                   */
2878/*                                                                          */
2879/* ASSUMED to be called from within the HA lock                             */
2880/*                                                                          */
2881/****************************************************************************/
2882static void ips_putq_wait_tail(ips_wait_queue_t *queue, struct scsi_cmnd *item)
2883{
2884        METHOD_TRACE("ips_putq_wait_tail", 1);
2885
2886        if (!item)
2887                return;
2888
2889        item->host_scribble = NULL;
2890
2891        if (queue->tail)
2892                queue->tail->host_scribble = (char *) item;
2893
2894        queue->tail = item;
2895
2896        if (!queue->head)
2897                queue->head = item;
2898
2899        queue->count++;
2900}
2901
2902/****************************************************************************/
2903/*                                                                          */
2904/* Routine Name: ips_removeq_wait_head                                      */
2905/*                                                                          */
2906/* Routine Description:                                                     */
2907/*                                                                          */
2908/*   Remove the head of the queue                                           */
2909/*                                                                          */
2910/* ASSUMED to be called from within the HA lock                             */
2911/*                                                                          */
2912/****************************************************************************/
2913static struct scsi_cmnd *ips_removeq_wait_head(ips_wait_queue_t *queue)
2914{
2915        struct scsi_cmnd *item;
2916
2917        METHOD_TRACE("ips_removeq_wait_head", 1);
2918
2919        item = queue->head;
2920
2921        if (!item) {
2922                return (NULL);
2923        }
2924
2925        queue->head = (struct scsi_cmnd *) item->host_scribble;
2926        item->host_scribble = NULL;
2927
2928        if (queue->tail == item)
2929                queue->tail = NULL;
2930
2931        queue->count--;
2932
2933        return (item);
2934}
2935
2936/****************************************************************************/
2937/*                                                                          */
2938/* Routine Name: ips_removeq_wait                                           */
2939/*                                                                          */
2940/* Routine Description:                                                     */
2941/*                                                                          */
2942/*   Remove an item from a queue                                            */
2943/*                                                                          */
2944/* ASSUMED to be called from within the HA lock                             */
2945/*                                                                          */
2946/****************************************************************************/
2947static struct scsi_cmnd *ips_removeq_wait(ips_wait_queue_t *queue,
2948                                          struct scsi_cmnd *item)
2949{
2950        struct scsi_cmnd *p;
2951
2952        METHOD_TRACE("ips_removeq_wait", 1);
2953
2954        if (!item)
2955                return (NULL);
2956
2957        if (item == queue->head) {
2958                return (ips_removeq_wait_head(queue));
2959        }
2960
2961        p = queue->head;
2962
2963        while ((p) && (item != (struct scsi_cmnd *) p->host_scribble))
2964                p = (struct scsi_cmnd *) p->host_scribble;
2965
2966        if (p) {
2967                /* found a match */
2968                p->host_scribble = item->host_scribble;
2969
2970                if (!item->host_scribble)
2971                        queue->tail = p;
2972
2973                item->host_scribble = NULL;
2974                queue->count--;
2975
2976                return (item);
2977        }
2978
2979        return (NULL);
2980}
2981
2982/****************************************************************************/
2983/*                                                                          */
2984/* Routine Name: ips_putq_copp_tail                                         */
2985/*                                                                          */
2986/* Routine Description:                                                     */
2987/*                                                                          */
2988/*   Add an item to the tail of the queue                                   */
2989/*                                                                          */
2990/* ASSUMED to be called from within the HA lock                             */
2991/*                                                                          */
2992/****************************************************************************/
2993static void
2994ips_putq_copp_tail(ips_copp_queue_t * queue, ips_copp_wait_item_t * item)
2995{
2996        METHOD_TRACE("ips_putq_copp_tail", 1);
2997
2998        if (!item)
2999                return;
3000
3001        item->next = NULL;
3002
3003        if (queue->tail)
3004                queue->tail->next = item;
3005
3006        queue->tail = item;
3007
3008        if (!queue->head)
3009                queue->head = item;
3010
3011        queue->count++;
3012}
3013
3014/****************************************************************************/
3015/*                                                                          */
3016/* Routine Name: ips_removeq_copp_head                                      */
3017/*                                                                          */
3018/* Routine Description:                                                     */
3019/*                                                                          */
3020/*   Remove the head of the queue                                           */
3021/*                                                                          */
3022/* ASSUMED to be called from within the HA lock                             */
3023/*                                                                          */
3024/****************************************************************************/
3025static ips_copp_wait_item_t *
3026ips_removeq_copp_head(ips_copp_queue_t * queue)
3027{
3028        ips_copp_wait_item_t *item;
3029
3030        METHOD_TRACE("ips_removeq_copp_head", 1);
3031
3032        item = queue->head;
3033
3034        if (!item) {
3035                return (NULL);
3036        }
3037
3038        queue->head = item->next;
3039        item->next = NULL;
3040
3041        if (queue->tail == item)
3042                queue->tail = NULL;
3043
3044        queue->count--;
3045
3046        return (item);
3047}
3048
3049/****************************************************************************/
3050/*                                                                          */
3051/* Routine Name: ips_removeq_copp                                           */
3052/*                                                                          */
3053/* Routine Description:                                                     */
3054/*                                                                          */
3055/*   Remove an item from a queue                                            */
3056/*                                                                          */
3057/* ASSUMED to be called from within the HA lock                             */
3058/*                                                                          */
3059/****************************************************************************/
3060static ips_copp_wait_item_t *
3061ips_removeq_copp(ips_copp_queue_t * queue, ips_copp_wait_item_t * item)
3062{
3063        ips_copp_wait_item_t *p;
3064
3065        METHOD_TRACE("ips_removeq_copp", 1);
3066
3067        if (!item)
3068                return (NULL);
3069
3070        if (item == queue->head) {
3071                return (ips_removeq_copp_head(queue));
3072        }
3073
3074        p = queue->head;
3075
3076        while ((p) && (item != p->next))
3077                p = p->next;
3078
3079        if (p) {
3080                /* found a match */
3081                p->next = item->next;
3082
3083                if (!item->next)
3084                        queue->tail = p;
3085
3086                item->next = NULL;
3087                queue->count--;
3088
3089                return (item);
3090        }
3091
3092        return (NULL);
3093}
3094
3095/****************************************************************************/
3096/*                                                                          */
3097/* Routine Name: ipsintr_blocking                                           */
3098/*                                                                          */
3099/* Routine Description:                                                     */
3100/*                                                                          */
3101/*   Finalize an interrupt for internal commands                            */
3102/*                                                                          */
3103/****************************************************************************/
3104static void
3105ipsintr_blocking(ips_ha_t * ha, ips_scb_t * scb)
3106{
3107        METHOD_TRACE("ipsintr_blocking", 2);
3108
3109        ips_freescb(ha, scb);
3110        if ((ha->waitflag == TRUE) && (ha->cmd_in_progress == scb->cdb[0])) {
3111                ha->waitflag = FALSE;
3112
3113                return;
3114        }
3115}
3116
3117/****************************************************************************/
3118/*                                                                          */
3119/* Routine Name: ipsintr_done                                               */
3120/*                                                                          */
3121/* Routine Description:                                                     */
3122/*                                                                          */
3123/*   Finalize an interrupt for non-internal commands                        */
3124/*                                                                          */
3125/****************************************************************************/
3126static void
3127ipsintr_done(ips_ha_t * ha, ips_scb_t * scb)
3128{
3129        METHOD_TRACE("ipsintr_done", 2);
3130
3131        if (!scb) {
3132                IPS_PRINTK(KERN_WARNING, ha->pcidev,
3133                           "Spurious interrupt; scb NULL.\n");
3134
3135                return;
3136        }
3137
3138        if (scb->scsi_cmd == NULL) {
3139                /* unexpected interrupt */
3140                IPS_PRINTK(KERN_WARNING, ha->pcidev,
3141                           "Spurious interrupt; scsi_cmd not set.\n");
3142
3143                return;
3144        }
3145
3146        ips_done(ha, scb);
3147}
3148
3149/****************************************************************************/
3150/*                                                                          */
3151/* Routine Name: ips_done                                                   */
3152/*                                                                          */
3153/* Routine Description:                                                     */
3154/*                                                                          */
3155/*   Do housekeeping on completed commands                                  */
3156/*  ASSUMED to be called form within the request lock                       */
3157/****************************************************************************/
3158static void
3159ips_done(ips_ha_t * ha, ips_scb_t * scb)
3160{
3161        int ret;
3162
3163        METHOD_TRACE("ips_done", 1);
3164
3165        if (!scb)
3166                return;
3167
3168        if ((scb->scsi_cmd) && (ips_is_passthru(scb->scsi_cmd))) {
3169                ips_cleanup_passthru(ha, scb);
3170                ha->num_ioctl--;
3171        } else {
3172                /*
3173                 * Check to see if this command had too much
3174                 * data and had to be broke up.  If so, queue
3175                 * the rest of the data and continue.
3176                 */
3177                if ((scb->breakup) || (scb->sg_break)) {
3178                        struct scatterlist *sg;
3179                        int i, sg_dma_index, ips_sg_index = 0;
3180
3181                        /* we had a data breakup */
3182                        scb->data_len = 0;
3183
3184                        sg = scsi_sglist(scb->scsi_cmd);
3185
3186                        /* Spin forward to last dma chunk */
3187                        sg_dma_index = scb->breakup;
3188                        for (i = 0; i < scb->breakup; i++)
3189                                sg = sg_next(sg);
3190
3191                        /* Take care of possible partial on last chunk */
3192                        ips_fill_scb_sg_single(ha,
3193                                               sg_dma_address(sg),
3194                                               scb, ips_sg_index++,
3195                                               sg_dma_len(sg));
3196
3197                        for (; sg_dma_index < scsi_sg_count(scb->scsi_cmd);
3198                             sg_dma_index++, sg = sg_next(sg)) {
3199                                if (ips_fill_scb_sg_single
3200                                    (ha,
3201                                     sg_dma_address(sg),
3202                                     scb, ips_sg_index++,
3203                                     sg_dma_len(sg)) < 0)
3204                                        break;
3205                        }
3206
3207                        scb->dcdb.transfer_length = scb->data_len;
3208                        scb->dcdb.cmd_attribute |=
3209                            ips_command_direction[scb->scsi_cmd->cmnd[0]];
3210
3211                        if (!(scb->dcdb.cmd_attribute & 0x3))
3212                                scb->dcdb.transfer_length = 0;
3213
3214                        if (scb->data_len >= IPS_MAX_XFER) {
3215                                scb->dcdb.cmd_attribute |= IPS_TRANSFER64K;
3216                                scb->dcdb.transfer_length = 0;
3217                        }
3218
3219                        ret = ips_send_cmd(ha, scb);
3220
3221                        switch (ret) {
3222                        case IPS_FAILURE:
3223                                if (scb->scsi_cmd) {
3224                                        scb->scsi_cmd->result = DID_ERROR << 16;
3225                                        scb->scsi_cmd->scsi_done(scb->scsi_cmd);
3226                                }
3227
3228                                ips_freescb(ha, scb);
3229                                break;
3230                        case IPS_SUCCESS_IMM:
3231                                if (scb->scsi_cmd) {
3232                                        scb->scsi_cmd->result = DID_ERROR << 16;
3233                                        scb->scsi_cmd->scsi_done(scb->scsi_cmd);
3234                                }
3235
3236                                ips_freescb(ha, scb);
3237                                break;
3238                        default:
3239                                break;
3240                        }       /* end case */
3241
3242                        return;
3243                }
3244        }                       /* end if passthru */
3245
3246        if (scb->bus) {
3247                ha->dcdb_active[scb->bus - 1] &= ~(1 << scb->target_id);
3248        }
3249
3250        scb->scsi_cmd->scsi_done(scb->scsi_cmd);
3251
3252        ips_freescb(ha, scb);
3253}
3254
3255/****************************************************************************/
3256/*                                                                          */
3257/* Routine Name: ips_map_status                                             */
3258/*                                                                          */
3259/* Routine Description:                                                     */
3260/*                                                                          */
3261/*   Map Controller Error codes to Linux Error Codes                        */
3262/*                                                                          */
3263/****************************************************************************/
3264static int
3265ips_map_status(ips_ha_t * ha, ips_scb_t * scb, ips_stat_t * sp)
3266{
3267        int errcode;
3268        int device_error;
3269        uint32_t transfer_len;
3270        IPS_DCDB_TABLE_TAPE *tapeDCDB;
3271        IPS_SCSI_INQ_DATA inquiryData;
3272
3273        METHOD_TRACE("ips_map_status", 1);
3274
3275        if (scb->bus) {
3276                DEBUG_VAR(2,
3277                          "(%s%d) Physical device error (%d %d %d): %x %x, Sense Key: %x, ASC: %x, ASCQ: %x",
3278                          ips_name, ha->host_num,
3279                          scb->scsi_cmd->device->channel,
3280                          scb->scsi_cmd->device->id, scb->scsi_cmd->device->lun,
3281                          scb->basic_status, scb->extended_status,
3282                          scb->extended_status ==
3283                          IPS_ERR_CKCOND ? scb->dcdb.sense_info[2] & 0xf : 0,
3284                          scb->extended_status ==
3285                          IPS_ERR_CKCOND ? scb->dcdb.sense_info[12] : 0,
3286                          scb->extended_status ==
3287                          IPS_ERR_CKCOND ? scb->dcdb.sense_info[13] : 0);
3288        }
3289
3290        /* default driver error */
3291        errcode = DID_ERROR;
3292        device_error = 0;
3293
3294        switch (scb->basic_status & IPS_GSC_STATUS_MASK) {
3295        case IPS_CMD_TIMEOUT:
3296                errcode = DID_TIME_OUT;
3297                break;
3298
3299        case IPS_INVAL_OPCO:
3300        case IPS_INVAL_CMD_BLK:
3301        case IPS_INVAL_PARM_BLK:
3302        case IPS_LD_ERROR:
3303        case IPS_CMD_CMPLT_WERROR:
3304                break;
3305
3306        case IPS_PHYS_DRV_ERROR:
3307                switch (scb->extended_status) {
3308                case IPS_ERR_SEL_TO:
3309                        if (scb->bus)
3310                                errcode = DID_NO_CONNECT;
3311
3312                        break;
3313
3314                case IPS_ERR_OU_RUN:
3315                        if ((scb->cmd.dcdb.op_code == IPS_CMD_EXTENDED_DCDB) ||
3316                            (scb->cmd.dcdb.op_code ==
3317                             IPS_CMD_EXTENDED_DCDB_SG)) {
3318                                tapeDCDB = (IPS_DCDB_TABLE_TAPE *) & scb->dcdb;
3319                                transfer_len = tapeDCDB->transfer_length;
3320                        } else {
3321                                transfer_len =
3322                                    (uint32_t) scb->dcdb.transfer_length;
3323                        }
3324
3325                        if ((scb->bus) && (transfer_len < scb->data_len)) {
3326                                /* Underrun - set default to no error */
3327                                errcode = DID_OK;
3328
3329                                /* Restrict access to physical DASD */
3330                                if (scb->scsi_cmd->cmnd[0] == INQUIRY) {
3331                                    ips_scmd_buf_read(scb->scsi_cmd,
3332                                      &inquiryData, sizeof (inquiryData));
3333                                    if ((inquiryData.DeviceType & 0x1f) == TYPE_DISK) {
3334                                        errcode = DID_TIME_OUT;
3335                                        break;
3336                                    }
3337                                }
3338                        } else
3339                                errcode = DID_ERROR;
3340
3341                        break;
3342
3343                case IPS_ERR_RECOVERY:
3344                        /* don't fail recovered errors */
3345                        if (scb->bus)
3346                                errcode = DID_OK;
3347
3348                        break;
3349
3350                case IPS_ERR_HOST_RESET:
3351                case IPS_ERR_DEV_RESET:
3352                        errcode = DID_RESET;
3353                        break;
3354
3355                case IPS_ERR_CKCOND:
3356                        if (scb->bus) {
3357                                if ((scb->cmd.dcdb.op_code ==
3358                                     IPS_CMD_EXTENDED_DCDB)
3359                                    || (scb->cmd.dcdb.op_code ==
3360                                        IPS_CMD_EXTENDED_DCDB_SG)) {
3361                                        tapeDCDB =
3362                                            (IPS_DCDB_TABLE_TAPE *) & scb->dcdb;
3363                                        memcpy(scb->scsi_cmd->sense_buffer,
3364                                               tapeDCDB->sense_info,
3365                                               SCSI_SENSE_BUFFERSIZE);
3366                                } else {
3367                                        memcpy(scb->scsi_cmd->sense_buffer,
3368                                               scb->dcdb.sense_info,
3369                                               SCSI_SENSE_BUFFERSIZE);
3370                                }
3371                                device_error = 2;       /* check condition */
3372                        }
3373
3374                        errcode = DID_OK;
3375
3376                        break;
3377
3378                default:
3379                        errcode = DID_ERROR;
3380                        break;
3381
3382                }               /* end switch */
3383        }                       /* end switch */
3384
3385        scb->scsi_cmd->result = device_error | (errcode << 16);
3386
3387        return (1);
3388}
3389
3390/****************************************************************************/
3391/*                                                                          */
3392/* Routine Name: ips_send_wait                                              */
3393/*                                                                          */
3394/* Routine Description:                                                     */
3395/*                                                                          */
3396/*   Send a command to the controller and wait for it to return             */
3397/*                                                                          */
3398/*   The FFDC Time Stamp use this function for the callback, but doesn't    */
3399/*   actually need to wait.                                                 */
3400/****************************************************************************/
3401static int
3402ips_send_wait(ips_ha_t * ha, ips_scb_t * scb, int timeout, int intr)
3403{
3404        int ret;
3405
3406        METHOD_TRACE("ips_send_wait", 1);
3407
3408        if (intr != IPS_FFDC) { /* Won't be Waiting if this is a Time Stamp */
3409                ha->waitflag = TRUE;
3410                ha->cmd_in_progress = scb->cdb[0];
3411        }
3412        scb->callback = ipsintr_blocking;
3413        ret = ips_send_cmd(ha, scb);
3414
3415        if ((ret == IPS_FAILURE) || (ret == IPS_SUCCESS_IMM))
3416                return (ret);
3417
3418        if (intr != IPS_FFDC)   /* Don't Wait around if this is a Time Stamp */
3419                ret = ips_wait(ha, timeout, intr);
3420
3421        return (ret);
3422}
3423
3424/****************************************************************************/
3425/*                                                                          */
3426/* Routine Name: ips_scmd_buf_write                                         */
3427/*                                                                          */
3428/* Routine Description:                                                     */
3429/*  Write data to struct scsi_cmnd request_buffer at proper offsets         */
3430/****************************************************************************/
3431static void
3432ips_scmd_buf_write(struct scsi_cmnd *scmd, void *data, unsigned int count)
3433{
3434        unsigned long flags;
3435
3436        local_irq_save(flags);
3437        scsi_sg_copy_from_buffer(scmd, data, count);
3438        local_irq_restore(flags);
3439}
3440
3441/****************************************************************************/
3442/*                                                                          */
3443/* Routine Name: ips_scmd_buf_read                                          */
3444/*                                                                          */
3445/* Routine Description:                                                     */
3446/*  Copy data from a struct scsi_cmnd to a new, linear buffer               */
3447/****************************************************************************/
3448static void
3449ips_scmd_buf_read(struct scsi_cmnd *scmd, void *data, unsigned int count)
3450{
3451        unsigned long flags;
3452
3453        local_irq_save(flags);
3454        scsi_sg_copy_to_buffer(scmd, data, count);
3455        local_irq_restore(flags);
3456}
3457
3458/****************************************************************************/
3459/*                                                                          */
3460/* Routine Name: ips_send_cmd                                               */
3461/*                                                                          */
3462/* Routine Description:                                                     */
3463/*                                                                          */
3464/*   Map SCSI commands to ServeRAID commands for logical drives             */
3465/*                                                                          */
3466/****************************************************************************/
3467static int
3468ips_send_cmd(ips_ha_t * ha, ips_scb_t * scb)
3469{
3470        int ret;
3471        char *sp;
3472        int device_error;
3473        IPS_DCDB_TABLE_TAPE *tapeDCDB;
3474        int TimeOut;
3475
3476        METHOD_TRACE("ips_send_cmd", 1);
3477
3478        ret = IPS_SUCCESS;
3479
3480        if (!scb->scsi_cmd) {
3481                /* internal command */
3482
3483                if (scb->bus > 0) {
3484                        /* Controller commands can't be issued */
3485                        /* to real devices -- fail them        */
3486                        if ((ha->waitflag == TRUE) &&
3487                            (ha->cmd_in_progress == scb->cdb[0])) {
3488                                ha->waitflag = FALSE;
3489                        }
3490
3491                        return (1);
3492                }
3493        } else if ((scb->bus == 0) && (!ips_is_passthru(scb->scsi_cmd))) {
3494                /* command to logical bus -- interpret */
3495                ret = IPS_SUCCESS_IMM;
3496
3497                switch (scb->scsi_cmd->cmnd[0]) {
3498                case ALLOW_MEDIUM_REMOVAL:
3499                case REZERO_UNIT:
3500                case ERASE:
3501                case WRITE_FILEMARKS:
3502                case SPACE:
3503                        scb->scsi_cmd->result = DID_ERROR << 16;
3504                        break;
3505
3506                case START_STOP:
3507                        scb->scsi_cmd->result = DID_OK << 16;
3508
3509                case TEST_UNIT_READY:
3510                case INQUIRY:
3511                        if (scb->target_id == IPS_ADAPTER_ID) {
3512                                /*
3513                                 * Either we have a TUR
3514                                 * or we have a SCSI inquiry
3515                                 */
3516                                if (scb->scsi_cmd->cmnd[0] == TEST_UNIT_READY)
3517                                        scb->scsi_cmd->result = DID_OK << 16;
3518
3519                                if (scb->scsi_cmd->cmnd[0] == INQUIRY) {
3520                                        IPS_SCSI_INQ_DATA inquiry;
3521
3522                                        memset(&inquiry, 0,
3523                                               sizeof (IPS_SCSI_INQ_DATA));
3524
3525                                        inquiry.DeviceType =
3526                                            IPS_SCSI_INQ_TYPE_PROCESSOR;
3527                                        inquiry.DeviceTypeQualifier =
3528                                            IPS_SCSI_INQ_LU_CONNECTED;
3529                                        inquiry.Version = IPS_SCSI_INQ_REV2;
3530                                        inquiry.ResponseDataFormat =
3531                                            IPS_SCSI_INQ_RD_REV2;
3532                                        inquiry.AdditionalLength = 31;
3533                                        inquiry.Flags[0] =
3534                                            IPS_SCSI_INQ_Address16;
3535                                        inquiry.Flags[1] =
3536                                            IPS_SCSI_INQ_WBus16 |
3537                                            IPS_SCSI_INQ_Sync;
3538                                        strncpy(inquiry.VendorId, "IBM     ",
3539                                                8);
3540                                        strncpy(inquiry.ProductId,
3541                                                "SERVERAID       ", 16);
3542                                        strncpy(inquiry.ProductRevisionLevel,
3543                                                "1.00", 4);
3544
3545                                        ips_scmd_buf_write(scb->scsi_cmd,
3546                                                           &inquiry,
3547                                                           sizeof (inquiry));
3548
3549                                        scb->scsi_cmd->result = DID_OK << 16;
3550                                }
3551                        } else {
3552                                scb->cmd.logical_info.op_code = IPS_CMD_GET_LD_INFO;
3553                                scb->cmd.logical_info.command_id = IPS_COMMAND_ID(ha, scb);
3554                                scb->cmd.logical_info.reserved = 0;
3555                                scb->cmd.logical_info.reserved2 = 0;
3556                                scb->data_len = sizeof (IPS_LD_INFO);
3557                                scb->data_busaddr = ha->logical_drive_info_dma_addr;
3558                                scb->flags = 0;
3559                                scb->cmd.logical_info.buffer_addr = scb->data_busaddr;
3560                                ret = IPS_SUCCESS;
3561                        }
3562
3563                        break;
3564
3565                case REQUEST_SENSE:
3566                        ips_reqsen(ha, scb);
3567                        scb->scsi_cmd->result = DID_OK << 16;
3568                        break;
3569
3570                case READ_6:
3571                case WRITE_6:
3572                        if (!scb->sg_len) {
3573                                scb->cmd.basic_io.op_code =
3574                                    (scb->scsi_cmd->cmnd[0] ==
3575                                     READ_6) ? IPS_CMD_READ : IPS_CMD_WRITE;
3576                                scb->cmd.basic_io.enhanced_sg = 0;
3577                                scb->cmd.basic_io.sg_addr =
3578                                    cpu_to_le32(scb->data_busaddr);
3579                        } else {
3580                                scb->cmd.basic_io.op_code =
3581                                    (scb->scsi_cmd->cmnd[0] ==
3582                                     READ_6) ? IPS_CMD_READ_SG :
3583                                    IPS_CMD_WRITE_SG;
3584                                scb->cmd.basic_io.enhanced_sg =
3585                                    IPS_USE_ENH_SGLIST(ha) ? 0xFF : 0;
3586                                scb->cmd.basic_io.sg_addr =
3587                                    cpu_to_le32(scb->sg_busaddr);
3588                        }
3589
3590                        scb->cmd.basic_io.segment_4G = 0;
3591                        scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
3592                        scb->cmd.basic_io.log_drv = scb->target_id;
3593                        scb->cmd.basic_io.sg_count = scb->sg_len;
3594
3595                        if (scb->cmd.basic_io.lba)
3596                                le32_add_cpu(&scb->cmd.basic_io.lba,
3597                                                le16_to_cpu(scb->cmd.basic_io.
3598                                                            sector_count));
3599                        else
3600                                scb->cmd.basic_io.lba =
3601                                    (((scb->scsi_cmd->
3602                                       cmnd[1] & 0x1f) << 16) | (scb->scsi_cmd->
3603                                                                 cmnd[2] << 8) |
3604                                     (scb->scsi_cmd->cmnd[3]));
3605
3606                        scb->cmd.basic_io.sector_count =
3607                            cpu_to_le16(scb->data_len / IPS_BLKSIZE);
3608
3609                        if (le16_to_cpu(scb->cmd.basic_io.sector_count) == 0)
3610                                scb->cmd.basic_io.sector_count =
3611                                    cpu_to_le16(256);
3612
3613                        ret = IPS_SUCCESS;
3614                        break;
3615
3616                case READ_10:
3617                case WRITE_10:
3618                        if (!scb->sg_len) {
3619                                scb->cmd.basic_io.op_code =
3620                                    (scb->scsi_cmd->cmnd[0] ==
3621                                     READ_10) ? IPS_CMD_READ : IPS_CMD_WRITE;
3622                                scb->cmd.basic_io.enhanced_sg = 0;
3623                                scb->cmd.basic_io.sg_addr =
3624                                    cpu_to_le32(scb->data_busaddr);
3625                        } else {
3626                                scb->cmd.basic_io.op_code =
3627                                    (scb->scsi_cmd->cmnd[0] ==
3628                                     READ_10) ? IPS_CMD_READ_SG :
3629                                    IPS_CMD_WRITE_SG;
3630                                scb->cmd.basic_io.enhanced_sg =
3631                                    IPS_USE_ENH_SGLIST(ha) ? 0xFF : 0;
3632                                scb->cmd.basic_io.sg_addr =
3633                                    cpu_to_le32(scb->sg_busaddr);
3634                        }
3635
3636                        scb->cmd.basic_io.segment_4G = 0;
3637                        scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
3638                        scb->cmd.basic_io.log_drv = scb->target_id;
3639                        scb->cmd.basic_io.sg_count = scb->sg_len;
3640
3641                        if (scb->cmd.basic_io.lba)
3642                                le32_add_cpu(&scb->cmd.basic_io.lba,
3643                                                le16_to_cpu(scb->cmd.basic_io.
3644                                                            sector_count));
3645                        else
3646                                scb->cmd.basic_io.lba =
3647                                    ((scb->scsi_cmd->cmnd[2] << 24) | (scb->
3648                                                                       scsi_cmd->
3649                                                                       cmnd[3]
3650                                                                       << 16) |
3651                                     (scb->scsi_cmd->cmnd[4] << 8) | scb->
3652                                     scsi_cmd->cmnd[5]);
3653
3654                        scb->cmd.basic_io.sector_count =
3655                            cpu_to_le16(scb->data_len / IPS_BLKSIZE);
3656
3657                        if (cpu_to_le16(scb->cmd.basic_io.sector_count) == 0) {
3658                                /*
3659                                 * This is a null condition
3660                                 * we don't have to do anything
3661                                 * so just return
3662                                 */
3663                                scb->scsi_cmd->result = DID_OK << 16;
3664                        } else
3665                                ret = IPS_SUCCESS;
3666
3667                        break;
3668
3669                case RESERVE:
3670                case RELEASE:
3671                        scb->scsi_cmd->result = DID_OK << 16;
3672                        break;
3673
3674                case MODE_SENSE:
3675                        scb->cmd.basic_io.op_code = IPS_CMD_ENQUIRY;
3676                        scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
3677                        scb->cmd.basic_io.segment_4G = 0;
3678                        scb->cmd.basic_io.enhanced_sg = 0;
3679                        scb->data_len = sizeof (*ha->enq);
3680                        scb->cmd.basic_io.sg_addr = ha->enq_busaddr;
3681                        ret = IPS_SUCCESS;
3682                        break;
3683
3684                case READ_CAPACITY:
3685                        scb->cmd.logical_info.op_code = IPS_CMD_GET_LD_INFO;
3686                        scb->cmd.logical_info.command_id = IPS_COMMAND_ID(ha, scb);
3687                        scb->cmd.logical_info.reserved = 0;
3688                        scb->cmd.logical_info.reserved2 = 0;
3689                        scb->cmd.logical_info.reserved3 = 0;
3690                        scb->data_len = sizeof (IPS_LD_INFO);
3691                        scb->data_busaddr = ha->logical_drive_info_dma_addr;
3692                        scb->flags = 0;
3693                        scb->cmd.logical_info.buffer_addr = scb->data_busaddr;
3694                        ret = IPS_SUCCESS;
3695                        break;
3696
3697                case SEND_DIAGNOSTIC:
3698                case REASSIGN_BLOCKS:
3699                case FORMAT_UNIT:
3700                case SEEK_10:
3701                case VERIFY:
3702                case READ_DEFECT_DATA:
3703                case READ_BUFFER:
3704                case WRITE_BUFFER:
3705                        scb->scsi_cmd->result = DID_OK << 16;
3706                        break;
3707
3708                default:
3709                        /* Set the Return Info to appear like the Command was */
3710                        /* attempted, a Check Condition occurred, and Sense   */
3711                        /* Data indicating an Invalid CDB OpCode is returned. */
3712                        sp = (char *) scb->scsi_cmd->sense_buffer;
3713
3714                        sp[0] = 0x70;   /* Error Code               */
3715                        sp[2] = ILLEGAL_REQUEST;        /* Sense Key 5 Illegal Req. */
3716                        sp[7] = 0x0A;   /* Additional Sense Length  */
3717                        sp[12] = 0x20;  /* ASC = Invalid OpCode     */
3718                        sp[13] = 0x00;  /* ASCQ                     */
3719
3720                        device_error = 2;       /* Indicate Check Condition */
3721                        scb->scsi_cmd->result = device_error | (DID_OK << 16);
3722                        break;
3723                }               /* end switch */
3724        }
3725        /* end if */
3726        if (ret == IPS_SUCCESS_IMM)
3727                return (ret);
3728
3729        /* setup DCDB */
3730        if (scb->bus > 0) {
3731
3732                /* If we already know the Device is Not there, no need to attempt a Command   */
3733                /* This also protects an NT FailOver Controller from getting CDB's sent to it */
3734                if (ha->conf->dev[scb->bus - 1][scb->target_id].ucState == 0) {
3735                        scb->scsi_cmd->result = DID_NO_CONNECT << 16;
3736                        return (IPS_SUCCESS_IMM);
3737                }
3738
3739                ha->dcdb_active[scb->bus - 1] |= (1 << scb->target_id);
3740                scb->cmd.dcdb.command_id = IPS_COMMAND_ID(ha, scb);
3741                scb->cmd.dcdb.dcdb_address = cpu_to_le32(scb->scb_busaddr +
3742                                                         (unsigned long) &scb->
3743                                                         dcdb -
3744                                                         (unsigned long) scb);
3745                scb->cmd.dcdb.reserved = 0;
3746                scb->cmd.dcdb.reserved2 = 0;
3747                scb->cmd.dcdb.reserved3 = 0;
3748                scb->cmd.dcdb.segment_4G = 0;
3749                scb->cmd.dcdb.enhanced_sg = 0;
3750
3751                TimeOut = scb->scsi_cmd->request->timeout;
3752
3753                if (ha->subsys->param[4] & 0x00100000) {        /* If NEW Tape DCDB is Supported */
3754                        if (!scb->sg_len) {
3755                                scb->cmd.dcdb.op_code = IPS_CMD_EXTENDED_DCDB;
3756                        } else {
3757                                scb->cmd.dcdb.op_code =
3758                                    IPS_CMD_EXTENDED_DCDB_SG;
3759                                scb->cmd.dcdb.enhanced_sg =
3760                                    IPS_USE_ENH_SGLIST(ha) ? 0xFF : 0;
3761                        }
3762
3763                        tapeDCDB = (IPS_DCDB_TABLE_TAPE *) & scb->dcdb; /* Use Same Data Area as Old DCDB Struct */
3764                        tapeDCDB->device_address =
3765                            ((scb->bus - 1) << 4) | scb->target_id;
3766                        tapeDCDB->cmd_attribute |= IPS_DISCONNECT_ALLOWED;
3767                        tapeDCDB->cmd_attribute &= ~IPS_TRANSFER64K;    /* Always Turn OFF 64K Size Flag */
3768
3769                        if (TimeOut) {
3770                                if (TimeOut < (10 * HZ))
3771                                        tapeDCDB->cmd_attribute |= IPS_TIMEOUT10;       /* TimeOut is 10 Seconds */
3772                                else if (TimeOut < (60 * HZ))
3773                                        tapeDCDB->cmd_attribute |= IPS_TIMEOUT60;       /* TimeOut is 60 Seconds */
3774                                else if (TimeOut < (1200 * HZ))
3775                                        tapeDCDB->cmd_attribute |= IPS_TIMEOUT20M;      /* TimeOut is 20 Minutes */
3776                        }
3777
3778                        tapeDCDB->cdb_length = scb->scsi_cmd->cmd_len;
3779                        tapeDCDB->reserved_for_LUN = 0;
3780                        tapeDCDB->transfer_length = scb->data_len;
3781                        if (scb->cmd.dcdb.op_code == IPS_CMD_EXTENDED_DCDB_SG)
3782                                tapeDCDB->buffer_pointer =
3783                                    cpu_to_le32(scb->sg_busaddr);
3784                        else
3785                                tapeDCDB->buffer_pointer =
3786                                    cpu_to_le32(scb->data_busaddr);
3787                        tapeDCDB->sg_count = scb->sg_len;
3788                        tapeDCDB->sense_length = sizeof (tapeDCDB->sense_info);
3789                        tapeDCDB->scsi_status = 0;
3790                        tapeDCDB->reserved = 0;
3791                        memcpy(tapeDCDB->scsi_cdb, scb->scsi_cmd->cmnd,
3792                               scb->scsi_cmd->cmd_len);
3793                } else {
3794                        if (!scb->sg_len) {
3795                                scb->cmd.dcdb.op_code = IPS_CMD_DCDB;
3796                        } else {
3797                                scb->cmd.dcdb.op_code = IPS_CMD_DCDB_SG;
3798                                scb->cmd.dcdb.enhanced_sg =
3799                                    IPS_USE_ENH_SGLIST(ha) ? 0xFF : 0;
3800                        }
3801
3802                        scb->dcdb.device_address =
3803                            ((scb->bus - 1) << 4) | scb->target_id;
3804                        scb->dcdb.cmd_attribute |= IPS_DISCONNECT_ALLOWED;
3805
3806                        if (TimeOut) {
3807                                if (TimeOut < (10 * HZ))
3808                                        scb->dcdb.cmd_attribute |= IPS_TIMEOUT10;       /* TimeOut is 10 Seconds */
3809                                else if (TimeOut < (60 * HZ))
3810                                        scb->dcdb.cmd_attribute |= IPS_TIMEOUT60;       /* TimeOut is 60 Seconds */
3811                                else if (TimeOut < (1200 * HZ))
3812                                        scb->dcdb.cmd_attribute |= IPS_TIMEOUT20M;      /* TimeOut is 20 Minutes */
3813                        }
3814
3815                        scb->dcdb.transfer_length = scb->data_len;
3816                        if (scb->dcdb.cmd_attribute & IPS_TRANSFER64K)
3817                                scb->dcdb.transfer_length = 0;
3818                        if (scb->cmd.dcdb.op_code == IPS_CMD_DCDB_SG)
3819                                scb->dcdb.buffer_pointer =
3820                                    cpu_to_le32(scb->sg_busaddr);
3821                        else
3822                                scb->dcdb.buffer_pointer =
3823                                    cpu_to_le32(scb->data_busaddr);
3824                        scb->dcdb.cdb_length = scb->scsi_cmd->cmd_len;
3825                        scb->dcdb.sense_length = sizeof (scb->dcdb.sense_info);
3826                        scb->dcdb.sg_count = scb->sg_len;
3827                        scb->dcdb.reserved = 0;
3828                        memcpy(scb->dcdb.scsi_cdb, scb->scsi_cmd->cmnd,
3829                               scb->scsi_cmd->cmd_len);
3830                        scb->dcdb.scsi_status = 0;
3831                        scb->dcdb.reserved2[0] = 0;
3832                        scb->dcdb.reserved2[1] = 0;
3833                        scb->dcdb.reserved2[2] = 0;
3834                }
3835        }
3836
3837        return ((*ha->func.issue) (ha, scb));
3838}
3839
3840/****************************************************************************/
3841/*                                                                          */
3842/* Routine Name: ips_chk_status                                             */
3843/*                                                                          */
3844/* Routine Description:                                                     */
3845/*                                                                          */
3846/*   Check the status of commands to logical drives                         */
3847/*   Assumed to be called with the HA lock                                  */
3848/****************************************************************************/
3849static void
3850ips_chkstatus(ips_ha_t * ha, IPS_STATUS * pstatus)
3851{
3852        ips_scb_t *scb;
3853        ips_stat_t *sp;
3854        uint8_t basic_status;
3855        uint8_t ext_status;
3856        int errcode;
3857        IPS_SCSI_INQ_DATA inquiryData;
3858
3859        METHOD_TRACE("ips_chkstatus", 1);
3860
3861        scb = &ha->scbs[pstatus->fields.command_id];
3862        scb->basic_status = basic_status =
3863            pstatus->fields.basic_status & IPS_BASIC_STATUS_MASK;
3864        scb->extended_status = ext_status = pstatus->fields.extended_status;
3865
3866        sp = &ha->sp;
3867        sp->residue_len = 0;
3868        sp->scb_addr = (void *) scb;
3869
3870        /* Remove the item from the active queue */
3871        ips_removeq_scb(&ha->scb_activelist, scb);
3872
3873        if (!scb->scsi_cmd)
3874                /* internal commands are handled in do_ipsintr */
3875                return;
3876
3877        DEBUG_VAR(2, "(%s%d) ips_chkstatus: cmd 0x%X id %d (%d %d %d)",
3878                  ips_name,
3879                  ha->host_num,
3880                  scb->cdb[0],
3881                  scb->cmd.basic_io.command_id,
3882                  scb->bus, scb->target_id, scb->lun);
3883
3884        if ((scb->scsi_cmd) && (ips_is_passthru(scb->scsi_cmd)))
3885                /* passthru - just returns the raw result */
3886                return;
3887
3888        errcode = DID_OK;
3889
3890        if (((basic_status & IPS_GSC_STATUS_MASK) == IPS_CMD_SUCCESS) ||
3891            ((basic_status & IPS_GSC_STATUS_MASK) == IPS_CMD_RECOVERED_ERROR)) {
3892
3893                if (scb->bus == 0) {
3894                        if ((basic_status & IPS_GSC_STATUS_MASK) ==
3895                            IPS_CMD_RECOVERED_ERROR) {
3896                                DEBUG_VAR(1,
3897                                          "(%s%d) Recovered Logical Drive Error OpCode: %x, BSB: %x, ESB: %x",
3898                                          ips_name, ha->host_num,
3899                                          scb->cmd.basic_io.op_code,
3900                                          basic_status, ext_status);
3901                        }
3902
3903                        switch (scb->scsi_cmd->cmnd[0]) {
3904                        case ALLOW_MEDIUM_REMOVAL:
3905                        case REZERO_UNIT:
3906                        case ERASE:
3907                        case WRITE_FILEMARKS:
3908                        case SPACE:
3909                                errcode = DID_ERROR;
3910                                break;
3911
3912                        case START_STOP:
3913                                break;
3914
3915                        case TEST_UNIT_READY:
3916                                if (!ips_online(ha, scb)) {
3917                                        errcode = DID_TIME_OUT;
3918                                }
3919                                break;
3920
3921                        case INQUIRY:
3922                                if (ips_online(ha, scb)) {
3923                                        ips_inquiry(ha, scb);
3924                                } else {
3925                                        errcode = DID_TIME_OUT;
3926                                }
3927                                break;
3928
3929                        case REQUEST_SENSE:
3930                                ips_reqsen(ha, scb);
3931                                break;
3932
3933                        case READ_6:
3934                        case WRITE_6:
3935                        case READ_10:
3936                        case WRITE_10:
3937                        case RESERVE:
3938                        case RELEASE:
3939                                break;
3940
3941                        case MODE_SENSE:
3942                                if (!ips_online(ha, scb)
3943                                    || !ips_msense(ha, scb)) {
3944                                        errcode = DID_ERROR;
3945                                }
3946                                break;
3947
3948                        case READ_CAPACITY:
3949                                if (ips_online(ha, scb))
3950                                        ips_rdcap(ha, scb);
3951                                else {
3952                                        errcode = DID_TIME_OUT;
3953                                }
3954                                break;
3955
3956                        case SEND_DIAGNOSTIC:
3957                        case REASSIGN_BLOCKS:
3958                                break;
3959
3960                        case FORMAT_UNIT:
3961                                errcode = DID_ERROR;
3962                                break;
3963
3964                        case SEEK_10:
3965                        case VERIFY:
3966                        case READ_DEFECT_DATA:
3967                        case READ_BUFFER:
3968                        case WRITE_BUFFER:
3969                                break;
3970
3971                        default:
3972                                errcode = DID_ERROR;
3973                        }       /* end switch */
3974
3975                        scb->scsi_cmd->result = errcode << 16;
3976                } else {        /* bus == 0 */
3977                        /* restrict access to physical drives */
3978                        if (scb->scsi_cmd->cmnd[0] == INQUIRY) {
3979                            ips_scmd_buf_read(scb->scsi_cmd,
3980                                  &inquiryData, sizeof (inquiryData));
3981                            if ((inquiryData.DeviceType & 0x1f) == TYPE_DISK)
3982                                scb->scsi_cmd->result = DID_TIME_OUT << 16;
3983                        }
3984                }               /* else */
3985        } else {                /* recovered error / success */
3986                if (scb->bus == 0) {
3987                        DEBUG_VAR(1,
3988                                  "(%s%d) Unrecovered Logical Drive Error OpCode: %x, BSB: %x, ESB: %x",
3989                                  ips_name, ha->host_num,
3990                                  scb->cmd.basic_io.op_code, basic_status,
3991                                  ext_status);
3992                }
3993
3994                ips_map_status(ha, scb, sp);
3995        }                       /* else */
3996}
3997
3998/****************************************************************************/
3999/*                                                                          */
4000/* Routine Name: ips_online                                                 */
4001/*                                                                          */
4002/* Routine Description:                                                     */
4003/*                                                                          */
4004/*   Determine if a logical drive is online                                 */
4005/*                                                                          */
4006/****************************************************************************/
4007static int
4008ips_online(ips_ha_t * ha, ips_scb_t * scb)
4009{
4010        METHOD_TRACE("ips_online", 1);
4011
4012        if (scb->target_id >= IPS_MAX_LD)
4013                return (0);
4014
4015        if ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1) {
4016                memset(ha->logical_drive_info, 0, sizeof (IPS_LD_INFO));
4017                return (0);
4018        }
4019
4020        if (ha->logical_drive_info->drive_info[scb->target_id].state !=
4021            IPS_LD_OFFLINE
4022            && ha->logical_drive_info->drive_info[scb->target_id].state !=
4023            IPS_LD_FREE
4024            && ha->logical_drive_info->drive_info[scb->target_id].state !=
4025            IPS_LD_CRS
4026            && ha->logical_drive_info->drive_info[scb->target_id].state !=
4027            IPS_LD_SYS)
4028                return (1);
4029        else
4030                return (0);
4031}
4032
4033/****************************************************************************/
4034/*                                                                          */
4035/* Routine Name: ips_inquiry                                                */
4036/*                                                                          */
4037/* Routine Description:                                                     */
4038/*                                                                          */
4039/*   Simulate an inquiry command to a logical drive                         */
4040/*                                                                          */
4041/****************************************************************************/
4042static int
4043ips_inquiry(ips_ha_t * ha, ips_scb_t * scb)
4044{
4045        IPS_SCSI_INQ_DATA inquiry;
4046
4047        METHOD_TRACE("ips_inquiry", 1);
4048
4049        memset(&inquiry, 0, sizeof (IPS_SCSI_INQ_DATA));
4050
4051        inquiry.DeviceType = IPS_SCSI_INQ_TYPE_DASD;
4052        inquiry.DeviceTypeQualifier = IPS_SCSI_INQ_LU_CONNECTED;
4053        inquiry.Version = IPS_SCSI_INQ_REV2;
4054        inquiry.ResponseDataFormat = IPS_SCSI_INQ_RD_REV2;
4055        inquiry.AdditionalLength = 31;
4056        inquiry.Flags[0] = IPS_SCSI_INQ_Address16;
4057        inquiry.Flags[1] =
4058            IPS_SCSI_INQ_WBus16 | IPS_SCSI_INQ_Sync | IPS_SCSI_INQ_CmdQue;
4059        strncpy(inquiry.VendorId, "IBM     ", 8);
4060        strncpy(inquiry.ProductId, "SERVERAID       ", 16);
4061        strncpy(inquiry.ProductRevisionLevel, "1.00", 4);
4062
4063        ips_scmd_buf_write(scb->scsi_cmd, &inquiry, sizeof (inquiry));
4064
4065        return (1);
4066}
4067
4068/****************************************************************************/
4069/*                                                                          */
4070/* Routine Name: ips_rdcap                                                  */
4071/*                                                                          */
4072/* Routine Description:                                                     */
4073/*                                                                          */
4074/*   Simulate a read capacity command to a logical drive                    */
4075/*                                                                          */
4076/****************************************************************************/
4077static int
4078ips_rdcap(ips_ha_t * ha, ips_scb_t * scb)
4079{
4080        IPS_SCSI_CAPACITY cap;
4081
4082        METHOD_TRACE("ips_rdcap", 1);
4083
4084        if (scsi_bufflen(scb->scsi_cmd) < 8)
4085                return (0);
4086
4087        cap.lba =
4088            cpu_to_be32(le32_to_cpu
4089                        (ha->logical_drive_info->
4090                         drive_info[scb->target_id].sector_count) - 1);
4091        cap.len = cpu_to_be32((uint32_t) IPS_BLKSIZE);
4092
4093        ips_scmd_buf_write(scb->scsi_cmd, &cap, sizeof (cap));
4094
4095        return (1);
4096}
4097
4098/****************************************************************************/
4099/*                                                                          */
4100/* Routine Name: ips_msense                                                 */
4101/*                                                                          */
4102/* Routine Description:                                                     */
4103/*                                                                          */
4104/*   Simulate a mode sense command to a logical drive                       */
4105/*                                                                          */
4106/****************************************************************************/
4107static int
4108ips_msense(ips_ha_t * ha, ips_scb_t * scb)
4109{
4110        uint16_t heads;
4111        uint16_t sectors;
4112        uint32_t cylinders;
4113        IPS_SCSI_MODE_PAGE_DATA mdata;
4114
4115        METHOD_TRACE("ips_msense", 1);
4116
4117        if (le32_to_cpu(ha->enq->ulDriveSize[scb->target_id]) > 0x400000 &&
4118            (ha->enq->ucMiscFlag & 0x8) == 0) {
4119                heads = IPS_NORM_HEADS;
4120                sectors = IPS_NORM_SECTORS;
4121        } else {
4122                heads = IPS_COMP_HEADS;
4123                sectors = IPS_COMP_SECTORS;
4124        }
4125
4126        cylinders =
4127            (le32_to_cpu(ha->enq->ulDriveSize[scb->target_id]) -
4128             1) / (heads * sectors);
4129
4130        memset(&mdata, 0, sizeof (IPS_SCSI_MODE_PAGE_DATA));
4131
4132        mdata.hdr.BlockDescLength = 8;
4133
4134        switch (scb->scsi_cmd->cmnd[2] & 0x3f) {
4135        case 0x03:              /* page 3 */
4136                mdata.pdata.pg3.PageCode = 3;
4137                mdata.pdata.pg3.PageLength = sizeof (IPS_SCSI_MODE_PAGE3);
4138                mdata.hdr.DataLength =
4139                    3 + mdata.hdr.BlockDescLength + mdata.pdata.pg3.PageLength;
4140                mdata.pdata.pg3.TracksPerZone = 0;
4141                mdata.pdata.pg3.AltSectorsPerZone = 0;
4142                mdata.pdata.pg3.AltTracksPerZone = 0;
4143                mdata.pdata.pg3.AltTracksPerVolume = 0;
4144                mdata.pdata.pg3.SectorsPerTrack = cpu_to_be16(sectors);
4145                mdata.pdata.pg3.BytesPerSector = cpu_to_be16(IPS_BLKSIZE);
4146                mdata.pdata.pg3.Interleave = cpu_to_be16(1);
4147                mdata.pdata.pg3.TrackSkew = 0;
4148                mdata.pdata.pg3.CylinderSkew = 0;
4149                mdata.pdata.pg3.flags = IPS_SCSI_MP3_SoftSector;
4150                break;
4151
4152        case 0x4:
4153                mdata.pdata.pg4.PageCode = 4;
4154                mdata.pdata.pg4.PageLength = sizeof (IPS_SCSI_MODE_PAGE4);
4155                mdata.hdr.DataLength =
4156                    3 + mdata.hdr.BlockDescLength + mdata.pdata.pg4.PageLength;
4157                mdata.pdata.pg4.CylindersHigh =
4158                    cpu_to_be16((cylinders >> 8) & 0xFFFF);
4159                mdata.pdata.pg4.CylindersLow = (cylinders & 0xFF);
4160                mdata.pdata.pg4.Heads = heads;
4161                mdata.pdata.pg4.WritePrecompHigh = 0;
4162                mdata.pdata.pg4.WritePrecompLow = 0;
4163                mdata.pdata.pg4.ReducedWriteCurrentHigh = 0;
4164                mdata.pdata.pg4.ReducedWriteCurrentLow = 0;
4165                mdata.pdata.pg4.StepRate = cpu_to_be16(1);
4166                mdata.pdata.pg4.LandingZoneHigh = 0;
4167                mdata.pdata.pg4.LandingZoneLow = 0;
4168                mdata.pdata.pg4.flags = 0;
4169                mdata.pdata.pg4.RotationalOffset = 0;
4170                mdata.pdata.pg4.MediumRotationRate = 0;
4171                break;
4172        case 0x8:
4173                mdata.pdata.pg8.PageCode = 8;
4174                mdata.pdata.pg8.PageLength = sizeof (IPS_SCSI_MODE_PAGE8);
4175                mdata.hdr.DataLength =
4176                    3 + mdata.hdr.BlockDescLength + mdata.pdata.pg8.PageLength;
4177                /* everything else is left set to 0 */
4178                break;
4179
4180        default:
4181                return (0);
4182        }                       /* end switch */
4183
4184        ips_scmd_buf_write(scb->scsi_cmd, &mdata, sizeof (mdata));
4185
4186        return (1);
4187}
4188
4189/****************************************************************************/
4190/*                                                                          */
4191/* Routine Name: ips_reqsen                                                 */
4192/*                                                                          */
4193/* Routine Description:                                                     */
4194/*                                                                          */
4195/*   Simulate a request sense command to a logical drive                    */
4196/*                                                                          */
4197/****************************************************************************/
4198static int
4199ips_reqsen(ips_ha_t * ha, ips_scb_t * scb)
4200{
4201        IPS_SCSI_REQSEN reqsen;
4202
4203        METHOD_TRACE("ips_reqsen", 1);
4204
4205        memset(&reqsen, 0, sizeof (IPS_SCSI_REQSEN));
4206
4207        reqsen.ResponseCode =
4208            IPS_SCSI_REQSEN_VALID | IPS_SCSI_REQSEN_CURRENT_ERR;
4209        reqsen.AdditionalLength = 10;
4210        reqsen.AdditionalSenseCode = IPS_SCSI_REQSEN_NO_SENSE;
4211        reqsen.AdditionalSenseCodeQual = IPS_SCSI_REQSEN_NO_SENSE;
4212
4213        ips_scmd_buf_write(scb->scsi_cmd, &reqsen, sizeof (reqsen));
4214
4215        return (1);
4216}
4217
4218/****************************************************************************/
4219/*                                                                          */
4220/* Routine Name: ips_free                                                   */
4221/*                                                                          */
4222/* Routine Description:                                                     */
4223/*                                                                          */
4224/*   Free any allocated space for this controller                           */
4225/*                                                                          */
4226/****************************************************************************/
4227static void
4228ips_free(ips_ha_t * ha)
4229{
4230
4231        METHOD_TRACE("ips_free", 1);
4232
4233        if (ha) {
4234                if (ha->enq) {
4235                        pci_free_consistent(ha->pcidev, sizeof(IPS_ENQ),
4236                                            ha->enq, ha->enq_busaddr);
4237                        ha->enq = NULL;
4238                }
4239
4240                kfree(ha->conf);
4241                ha->conf = NULL;
4242
4243                if (ha->adapt) {
4244                        pci_free_consistent(ha->pcidev,
4245                                            sizeof (IPS_ADAPTER) +
4246                                            sizeof (IPS_IO_CMD), ha->adapt,
4247                                            ha->adapt->hw_status_start);
4248                        ha->adapt = NULL;
4249                }
4250
4251                if (ha->logical_drive_info) {
4252                        pci_free_consistent(ha->pcidev,
4253                                            sizeof (IPS_LD_INFO),
4254                                            ha->logical_drive_info,
4255                                            ha->logical_drive_info_dma_addr);
4256                        ha->logical_drive_info = NULL;
4257                }
4258
4259                kfree(ha->nvram);
4260                ha->nvram = NULL;
4261
4262                kfree(ha->subsys);
4263                ha->subsys = NULL;
4264
4265                if (ha->ioctl_data) {
4266                        pci_free_consistent(ha->pcidev, ha->ioctl_len,
4267                                            ha->ioctl_data, ha->ioctl_busaddr);
4268                        ha->ioctl_data = NULL;
4269                        ha->ioctl_datasize = 0;
4270                        ha->ioctl_len = 0;
4271                }
4272                ips_deallocatescbs(ha, ha->max_cmds);
4273
4274                /* free memory mapped (if applicable) */
4275                if (ha->mem_ptr) {
4276                        iounmap(ha->ioremap_ptr);
4277                        ha->ioremap_ptr = NULL;
4278                        ha->mem_ptr = NULL;
4279                }
4280
4281                ha->mem_addr = 0;
4282
4283        }
4284}
4285
4286/****************************************************************************/
4287/*                                                                          */
4288/* Routine Name: ips_deallocatescbs                                         */
4289/*                                                                          */
4290/* Routine Description:                                                     */
4291/*                                                                          */
4292/*   Free the command blocks                                                */
4293/*                                                                          */
4294/****************************************************************************/
4295static int
4296ips_deallocatescbs(ips_ha_t * ha, int cmds)
4297{
4298        if (ha->scbs) {
4299                pci_free_consistent(ha->pcidev,
4300                                    IPS_SGLIST_SIZE(ha) * IPS_MAX_SG * cmds,
4301                                    ha->scbs->sg_list.list,
4302                                    ha->scbs->sg_busaddr);
4303                pci_free_consistent(ha->pcidev, sizeof (ips_scb_t) * cmds,
4304                                    ha->scbs, ha->scbs->scb_busaddr);
4305                ha->scbs = NULL;
4306        }                       /* end if */
4307        return 1;
4308}
4309
4310/****************************************************************************/
4311/*                                                                          */
4312/* Routine Name: ips_allocatescbs                                           */
4313/*                                                                          */
4314/* Routine Description:                                                     */
4315/*                                                                          */
4316/*   Allocate the command blocks                                            */
4317/*                                                                          */
4318/****************************************************************************/
4319static int
4320ips_allocatescbs(ips_ha_t * ha)
4321{
4322        ips_scb_t *scb_p;
4323        IPS_SG_LIST ips_sg;
4324        int i;
4325        dma_addr_t command_dma, sg_dma;
4326
4327        METHOD_TRACE("ips_allocatescbs", 1);
4328
4329        /* Allocate memory for the SCBs */
4330        ha->scbs =
4331            pci_alloc_consistent(ha->pcidev, ha->max_cmds * sizeof (ips_scb_t),
4332                                 &command_dma);
4333        if (ha->scbs == NULL)
4334                return 0;
4335        ips_sg.list =
4336            pci_alloc_consistent(ha->pcidev,
4337                                 IPS_SGLIST_SIZE(ha) * IPS_MAX_SG *
4338                                 ha->max_cmds, &sg_dma);
4339        if (ips_sg.list == NULL) {
4340                pci_free_consistent(ha->pcidev,
4341                                    ha->max_cmds * sizeof (ips_scb_t), ha->scbs,
4342                                    command_dma);
4343                return 0;
4344        }
4345
4346        memset(ha->scbs, 0, ha->max_cmds * sizeof (ips_scb_t));
4347
4348        for (i = 0; i < ha->max_cmds; i++) {
4349                scb_p = &ha->scbs[i];
4350                scb_p->scb_busaddr = command_dma + sizeof (ips_scb_t) * i;
4351                /* set up S/G list */
4352                if (IPS_USE_ENH_SGLIST(ha)) {
4353                        scb_p->sg_list.enh_list =
4354                            ips_sg.enh_list + i * IPS_MAX_SG;
4355                        scb_p->sg_busaddr =
4356                            sg_dma + IPS_SGLIST_SIZE(ha) * IPS_MAX_SG * i;
4357                } else {
4358                        scb_p->sg_list.std_list =
4359                            ips_sg.std_list + i * IPS_MAX_SG;
4360                        scb_p->sg_busaddr =
4361                            sg_dma + IPS_SGLIST_SIZE(ha) * IPS_MAX_SG * i;
4362                }
4363
4364                /* add to the free list */
4365                if (i < ha->max_cmds - 1) {
4366                        scb_p->q_next = ha->scb_freelist;
4367                        ha->scb_freelist = scb_p;
4368                }
4369        }
4370
4371        /* success */
4372        return (1);
4373}
4374
4375/****************************************************************************/
4376/*                                                                          */
4377/* Routine Name: ips_init_scb                                               */
4378/*                                                                          */
4379/* Routine Description:                                                     */
4380/*                                                                          */
4381/*   Initialize a CCB to default values                                     */
4382/*                                                                          */
4383/****************************************************************************/
4384static void
4385ips_init_scb(ips_ha_t * ha, ips_scb_t * scb)
4386{
4387        IPS_SG_LIST sg_list;
4388        uint32_t cmd_busaddr, sg_busaddr;
4389        METHOD_TRACE("ips_init_scb", 1);
4390
4391        if (scb == NULL)
4392                return;
4393
4394        sg_list.list = scb->sg_list.list;
4395        cmd_busaddr = scb->scb_busaddr;
4396        sg_busaddr = scb->sg_busaddr;
4397        /* zero fill */
4398        memset(scb, 0, sizeof (ips_scb_t));
4399        memset(ha->dummy, 0, sizeof (IPS_IO_CMD));
4400
4401        /* Initialize dummy command bucket */
4402        ha->dummy->op_code = 0xFF;
4403        ha->dummy->ccsar = cpu_to_le32(ha->adapt->hw_status_start
4404                                       + sizeof (IPS_ADAPTER));
4405        ha->dummy->command_id = IPS_MAX_CMDS;
4406
4407        /* set bus address of scb */
4408        scb->scb_busaddr = cmd_busaddr;
4409        scb->sg_busaddr = sg_busaddr;
4410        scb->sg_list.list = sg_list.list;
4411
4412        /* Neptune Fix */
4413        scb->cmd.basic_io.cccr = cpu_to_le32((uint32_t) IPS_BIT_ILE);
4414        scb->cmd.basic_io.ccsar = cpu_to_le32(ha->adapt->hw_status_start
4415                                              + sizeof (IPS_ADAPTER));
4416}
4417
4418/****************************************************************************/
4419/*                                                                          */
4420/* Routine Name: ips_get_scb                                                */
4421/*                                                                          */
4422/* Routine Description:                                                     */
4423/*                                                                          */
4424/*   Initialize a CCB to default values                                     */
4425/*                                                                          */
4426/* ASSUMED to be called from within a lock                                 */
4427/*                                                                          */
4428/****************************************************************************/
4429static ips_scb_t *
4430ips_getscb(ips_ha_t * ha)
4431{
4432        ips_scb_t *scb;
4433
4434        METHOD_TRACE("ips_getscb", 1);
4435
4436        if ((scb = ha->scb_freelist) == NULL) {
4437
4438                return (NULL);
4439        }
4440
4441        ha->scb_freelist = scb->q_next;
4442        scb->flags = 0;
4443        scb->q_next = NULL;
4444
4445        ips_init_scb(ha, scb);
4446
4447        return (scb);
4448}
4449
4450/****************************************************************************/
4451/*                                                                          */
4452/* Routine Name: ips_free_scb                                               */
4453/*                                                                          */
4454/* Routine Description:                                                     */
4455/*                                                                          */
4456/*   Return an unused CCB back to the free list                             */
4457/*                                                                          */
4458/* ASSUMED to be called from within a lock                                  */
4459/*                                                                          */
4460/****************************************************************************/
4461static void
4462ips_freescb(ips_ha_t * ha, ips_scb_t * scb)
4463{
4464
4465        METHOD_TRACE("ips_freescb", 1);
4466        if (scb->flags & IPS_SCB_MAP_SG)
4467                scsi_dma_unmap(scb->scsi_cmd);
4468        else if (scb->flags & IPS_SCB_MAP_SINGLE)
4469                pci_unmap_single(ha->pcidev, scb->data_busaddr, scb->data_len,
4470                                 IPS_DMA_DIR(scb));
4471
4472        /* check to make sure this is not our "special" scb */
4473        if (IPS_COMMAND_ID(ha, scb) < (ha->max_cmds - 1)) {
4474                scb->q_next = ha->scb_freelist;
4475                ha->scb_freelist = scb;
4476        }
4477}
4478
4479/****************************************************************************/
4480/*                                                                          */
4481/* Routine Name: ips_isinit_copperhead                                      */
4482/*                                                                          */
4483/* Routine Description:                                                     */
4484/*                                                                          */
4485/*   Is controller initialized ?                                            */
4486/*                                                                          */
4487/****************************************************************************/
4488static int
4489ips_isinit_copperhead(ips_ha_t * ha)
4490{
4491        uint8_t scpr;
4492        uint8_t isr;
4493
4494        METHOD_TRACE("ips_isinit_copperhead", 1);
4495
4496        isr = inb(ha->io_addr + IPS_REG_HISR);
4497        scpr = inb(ha->io_addr + IPS_REG_SCPR);
4498
4499        if (((isr & IPS_BIT_EI) == 0) && ((scpr & IPS_BIT_EBM) == 0))
4500                return (0);
4501        else
4502                return (1);
4503}
4504
4505/****************************************************************************/
4506/*                                                                          */
4507/* Routine Name: ips_isinit_copperhead_memio                                */
4508/*                                                                          */
4509/* Routine Description:                                                     */
4510/*                                                                          */
4511/*   Is controller initialized ?                                            */
4512/*                                                                          */
4513/****************************************************************************/
4514static int
4515ips_isinit_copperhead_memio(ips_ha_t * ha)
4516{
4517        uint8_t isr = 0;
4518        uint8_t scpr;
4519
4520        METHOD_TRACE("ips_is_init_copperhead_memio", 1);
4521
4522        isr = readb(ha->mem_ptr + IPS_REG_HISR);
4523        scpr = readb(ha->mem_ptr + IPS_REG_SCPR);
4524
4525        if (((isr & IPS_BIT_EI) == 0) && ((scpr & IPS_BIT_EBM) == 0))
4526                return (0);
4527        else
4528                return (1);
4529}
4530
4531/****************************************************************************/
4532/*                                                                          */
4533/* Routine Name: ips_isinit_morpheus                                        */
4534/*                                                                          */
4535/* Routine Description:                                                     */
4536/*                                                                          */
4537/*   Is controller initialized ?                                            */
4538/*                                                                          */
4539/****************************************************************************/
4540static int
4541ips_isinit_morpheus(ips_ha_t * ha)
4542{
4543        uint32_t post;
4544        uint32_t bits;
4545
4546        METHOD_TRACE("ips_is_init_morpheus", 1);
4547
4548        if (ips_isintr_morpheus(ha))
4549            ips_flush_and_reset(ha);
4550
4551        post = readl(ha->mem_ptr + IPS_REG_I960_MSG0);
4552        bits = readl(ha->mem_ptr + IPS_REG_I2O_HIR);
4553
4554        if (post == 0)
4555                return (0);
4556        else if (bits & 0x3)
4557                return (0);
4558        else
4559                return (1);
4560}
4561
4562/****************************************************************************/
4563/*                                                                          */
4564/* Routine Name: ips_flush_and_reset                                        */
4565/*                                                                          */
4566/* Routine Description:                                                     */
4567/*                                                                          */
4568/*   Perform cleanup ( FLUSH and RESET ) when the adapter is in an unknown  */
4569/*   state ( was trying to INIT and an interrupt was already pending ) ...  */
4570/*                                                                          */
4571/****************************************************************************/
4572static void
4573ips_flush_and_reset(ips_ha_t *ha)
4574{
4575        ips_scb_t *scb;
4576        int  ret;
4577        int  time;
4578        int  done;
4579        dma_addr_t command_dma;
4580
4581        /* Create a usuable SCB */
4582        scb = pci_alloc_consistent(ha->pcidev, sizeof(ips_scb_t), &command_dma);
4583        if (scb) {
4584            memset(scb, 0, sizeof(ips_scb_t));
4585            ips_init_scb(ha, scb);
4586            scb->scb_busaddr = command_dma;
4587
4588            scb->timeout = ips_cmd_timeout;
4589            scb->cdb[0] = IPS_CMD_FLUSH;
4590
4591            scb->cmd.flush_cache.op_code = IPS_CMD_FLUSH;
4592            scb->cmd.flush_cache.command_id = IPS_MAX_CMDS;   /* Use an ID that would otherwise not exist */
4593            scb->cmd.flush_cache.state = IPS_NORM_STATE;
4594            scb->cmd.flush_cache.reserved = 0;
4595            scb->cmd.flush_cache.reserved2 = 0;
4596            scb->cmd.flush_cache.reserved3 = 0;
4597            scb->cmd.flush_cache.reserved4 = 0;
4598
4599            ret = ips_send_cmd(ha, scb);                      /* Send the Flush Command */
4600
4601            if (ret == IPS_SUCCESS) {
4602                time = 60 * IPS_ONE_SEC;                      /* Max Wait time is 60 seconds */
4603                done = 0;
4604
4605                while ((time > 0) && (!done)) {
4606                   done = ips_poll_for_flush_complete(ha);
4607                   /* This may look evil, but it's only done during extremely rare start-up conditions ! */
4608                   udelay(1000);
4609                   time--;
4610                }
4611        }
4612        }
4613
4614        /* Now RESET and INIT the adapter */
4615        (*ha->func.reset) (ha);
4616
4617        pci_free_consistent(ha->pcidev, sizeof(ips_scb_t), scb, command_dma);
4618        return;
4619}
4620
4621/****************************************************************************/
4622/*                                                                          */
4623/* Routine Name: ips_poll_for_flush_complete                                */
4624/*                                                                          */
4625/* Routine Description:                                                     */
4626/*                                                                          */
4627/*   Poll for the Flush Command issued by ips_flush_and_reset() to complete */
4628/*   All other responses are just taken off the queue and ignored           */
4629/*                                                                          */
4630/****************************************************************************/
4631static int
4632ips_poll_for_flush_complete(ips_ha_t * ha)
4633{
4634        IPS_STATUS cstatus;
4635
4636        while (TRUE) {
4637            cstatus.value = (*ha->func.statupd) (ha);
4638
4639            if (cstatus.value == 0xffffffff)      /* If No Interrupt to process */
4640                        break;
4641
4642            /* Success is when we see the Flush Command ID */
4643            if (cstatus.fields.command_id == IPS_MAX_CMDS)
4644                return 1;
4645         }
4646
4647        return 0;
4648}
4649
4650/****************************************************************************/
4651/*                                                                          */
4652/* Routine Name: ips_enable_int_copperhead                                  */
4653/*                                                                          */
4654/* Routine Description:                                                     */
4655/*   Turn on interrupts                                                     */
4656/*                                                                          */
4657/****************************************************************************/
4658static void
4659ips_enable_int_copperhead(ips_ha_t * ha)
4660{
4661        METHOD_TRACE("ips_enable_int_copperhead", 1);
4662
4663        outb(ha->io_addr + IPS_REG_HISR, IPS_BIT_EI);
4664        inb(ha->io_addr + IPS_REG_HISR);        /*Ensure PCI Posting Completes*/
4665}
4666
4667/****************************************************************************/
4668/*                                                                          */
4669/* Routine Name: ips_enable_int_copperhead_memio                            */
4670/*                                                                          */
4671/* Routine Description:                                                     */
4672/*   Turn on interrupts                                                     */
4673/*                                                                          */
4674/****************************************************************************/
4675static void
4676ips_enable_int_copperhead_memio(ips_ha_t * ha)
4677{
4678        METHOD_TRACE("ips_enable_int_copperhead_memio", 1);
4679
4680        writeb(IPS_BIT_EI, ha->mem_ptr + IPS_REG_HISR);
4681        readb(ha->mem_ptr + IPS_REG_HISR);      /*Ensure PCI Posting Completes*/
4682}
4683
4684/****************************************************************************/
4685/*                                                                          */
4686/* Routine Name: ips_enable_int_morpheus                                    */
4687/*                                                                          */
4688/* Routine Description:                                                     */
4689/*   Turn on interrupts                                                     */
4690/*                                                                          */
4691/****************************************************************************/
4692static void
4693ips_enable_int_morpheus(ips_ha_t * ha)
4694{
4695        uint32_t Oimr;
4696
4697        METHOD_TRACE("ips_enable_int_morpheus", 1);
4698
4699        Oimr = readl(ha->mem_ptr + IPS_REG_I960_OIMR);
4700        Oimr &= ~0x08;
4701        writel(Oimr, ha->mem_ptr + IPS_REG_I960_OIMR);
4702        readl(ha->mem_ptr + IPS_REG_I960_OIMR); /*Ensure PCI Posting Completes*/
4703}
4704
4705/****************************************************************************/
4706/*                                                                          */
4707/* Routine Name: ips_init_copperhead                                        */
4708/*                                                                          */
4709/* Routine Description:                                                     */
4710/*                                                                          */
4711/*   Initialize a copperhead controller                                     */
4712/*                                                                          */
4713/****************************************************************************/
4714static int
4715ips_init_copperhead(ips_ha_t * ha)
4716{
4717        uint8_t Isr;
4718        uint8_t Cbsp;
4719        uint8_t PostByte[IPS_MAX_POST_BYTES];
4720        uint8_t ConfigByte[IPS_MAX_CONFIG_BYTES];
4721        int i, j;
4722
4723        METHOD_TRACE("ips_init_copperhead", 1);
4724
4725        for (i = 0; i < IPS_MAX_POST_BYTES; i++) {
4726                for (j = 0; j < 45; j++) {
4727                        Isr = inb(ha->io_addr + IPS_REG_HISR);
4728                        if (Isr & IPS_BIT_GHI)
4729                                break;
4730
4731                        /* Delay for 1 Second */
4732                        MDELAY(IPS_ONE_SEC);
4733                }
4734
4735                if (j >= 45)
4736                        /* error occurred */
4737                        return (0);
4738
4739                PostByte[i] = inb(ha->io_addr + IPS_REG_ISPR);
4740                outb(Isr, ha->io_addr + IPS_REG_HISR);
4741        }
4742
4743        if (PostByte[0] < IPS_GOOD_POST_STATUS) {
4744                IPS_PRINTK(KERN_WARNING, ha->pcidev,
4745                           "reset controller fails (post status %x %x).\n",
4746                           PostByte[0], PostByte[1]);
4747
4748                return (0);
4749        }
4750
4751        for (i = 0; i < IPS_MAX_CONFIG_BYTES; i++) {
4752                for (j = 0; j < 240; j++) {
4753                        Isr = inb(ha->io_addr + IPS_REG_HISR);
4754                        if (Isr & IPS_BIT_GHI)
4755                                break;
4756
4757                        /* Delay for 1 Second */
4758                        MDELAY(IPS_ONE_SEC);
4759                }
4760
4761                if (j >= 240)
4762                        /* error occurred */
4763                        return (0);
4764
4765                ConfigByte[i] = inb(ha->io_addr + IPS_REG_ISPR);
4766                outb(Isr, ha->io_addr + IPS_REG_HISR);
4767        }
4768
4769        for (i = 0; i < 240; i++) {
4770                Cbsp = inb(ha->io_addr + IPS_REG_CBSP);
4771
4772                if ((Cbsp & IPS_BIT_OP) == 0)
4773                        break;
4774
4775                /* Delay for 1 Second */
4776                MDELAY(IPS_ONE_SEC);
4777        }
4778
4779        if (i >= 240)
4780                /* reset failed */
4781                return (0);
4782
4783        /* setup CCCR */
4784        outl(0x1010, ha->io_addr + IPS_REG_CCCR);
4785
4786        /* Enable busmastering */
4787        outb(IPS_BIT_EBM, ha->io_addr + IPS_REG_SCPR);
4788
4789        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
4790                /* fix for anaconda64 */
4791                outl(0, ha->io_addr + IPS_REG_NDAE);
4792
4793        /* Enable interrupts */
4794        outb(IPS_BIT_EI, ha->io_addr + IPS_REG_HISR);
4795
4796        return (1);
4797}
4798
4799/****************************************************************************/
4800/*                                                                          */
4801/* Routine Name: ips_init_copperhead_memio                                  */
4802/*                                                                          */
4803/* Routine Description:                                                     */
4804/*                                                                          */
4805/*   Initialize a copperhead controller with memory mapped I/O              */
4806/*                                                                          */
4807/****************************************************************************/
4808static int
4809ips_init_copperhead_memio(ips_ha_t * ha)
4810{
4811        uint8_t Isr = 0;
4812        uint8_t Cbsp;
4813        uint8_t PostByte[IPS_MAX_POST_BYTES];
4814        uint8_t ConfigByte[IPS_MAX_CONFIG_BYTES];
4815        int i, j;
4816
4817        METHOD_TRACE("ips_init_copperhead_memio", 1);
4818
4819        for (i = 0; i < IPS_MAX_POST_BYTES; i++) {
4820                for (j = 0; j < 45; j++) {
4821                        Isr = readb(ha->mem_ptr + IPS_REG_HISR);
4822                        if (Isr & IPS_BIT_GHI)
4823                                break;
4824
4825                        /* Delay for 1 Second */
4826                        MDELAY(IPS_ONE_SEC);
4827                }
4828
4829                if (j >= 45)
4830                        /* error occurred */
4831                        return (0);
4832
4833                PostByte[i] = readb(ha->mem_ptr + IPS_REG_ISPR);
4834                writeb(Isr, ha->mem_ptr + IPS_REG_HISR);
4835        }
4836
4837        if (PostByte[0] < IPS_GOOD_POST_STATUS) {
4838                IPS_PRINTK(KERN_WARNING, ha->pcidev,
4839                           "reset controller fails (post status %x %x).\n",
4840                           PostByte[0], PostByte[1]);
4841
4842                return (0);
4843        }
4844
4845        for (i = 0; i < IPS_MAX_CONFIG_BYTES; i++) {
4846                for (j = 0; j < 240; j++) {
4847                        Isr = readb(ha->mem_ptr + IPS_REG_HISR);
4848                        if (Isr & IPS_BIT_GHI)
4849                                break;
4850
4851                        /* Delay for 1 Second */
4852                        MDELAY(IPS_ONE_SEC);
4853                }
4854
4855                if (j >= 240)
4856                        /* error occurred */
4857                        return (0);
4858
4859                ConfigByte[i] = readb(ha->mem_ptr + IPS_REG_ISPR);
4860                writeb(Isr, ha->mem_ptr + IPS_REG_HISR);
4861        }
4862
4863        for (i = 0; i < 240; i++) {
4864                Cbsp = readb(ha->mem_ptr + IPS_REG_CBSP);
4865
4866                if ((Cbsp & IPS_BIT_OP) == 0)
4867                        break;
4868
4869                /* Delay for 1 Second */
4870                MDELAY(IPS_ONE_SEC);
4871        }
4872
4873        if (i >= 240)
4874                /* error occurred */
4875                return (0);
4876
4877        /* setup CCCR */
4878        writel(0x1010, ha->mem_ptr + IPS_REG_CCCR);
4879
4880        /* Enable busmastering */
4881        writeb(IPS_BIT_EBM, ha->mem_ptr + IPS_REG_SCPR);
4882
4883        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
4884                /* fix for anaconda64 */
4885                writel(0, ha->mem_ptr + IPS_REG_NDAE);
4886
4887        /* Enable interrupts */
4888        writeb(IPS_BIT_EI, ha->mem_ptr + IPS_REG_HISR);
4889
4890        /* if we get here then everything went OK */
4891        return (1);
4892}
4893
4894/****************************************************************************/
4895/*                                                                          */
4896/* Routine Name: ips_init_morpheus                                          */
4897/*                                                                          */
4898/* Routine Description:                                                     */
4899/*                                                                          */
4900/*   Initialize a morpheus controller                                       */
4901/*                                                                          */
4902/****************************************************************************/
4903static int
4904ips_init_morpheus(ips_ha_t * ha)
4905{
4906        uint32_t Post;
4907        uint32_t Config;
4908        uint32_t Isr;
4909        uint32_t Oimr;
4910        int i;
4911
4912        METHOD_TRACE("ips_init_morpheus", 1);
4913
4914        /* Wait up to 45 secs for Post */
4915        for (i = 0; i < 45; i++) {
4916                Isr = readl(ha->mem_ptr + IPS_REG_I2O_HIR);
4917
4918                if (Isr & IPS_BIT_I960_MSG0I)
4919                        break;
4920
4921                /* Delay for 1 Second */
4922                MDELAY(IPS_ONE_SEC);
4923        }
4924
4925        if (i >= 45) {
4926                /* error occurred */
4927                IPS_PRINTK(KERN_WARNING, ha->pcidev,
4928                           "timeout waiting for post.\n");
4929
4930                return (0);
4931        }
4932
4933        Post = readl(ha->mem_ptr + IPS_REG_I960_MSG0);
4934
4935        if (Post == 0x4F00) {   /* If Flashing the Battery PIC         */
4936                IPS_PRINTK(KERN_WARNING, ha->pcidev,
4937                           "Flashing Battery PIC, Please wait ...\n");
4938
4939                /* Clear the interrupt bit */
4940                Isr = (uint32_t) IPS_BIT_I960_MSG0I;
4941                writel(Isr, ha->mem_ptr + IPS_REG_I2O_HIR);
4942
4943                for (i = 0; i < 120; i++) {     /*    Wait Up to 2 Min. for Completion */
4944                        Post = readl(ha->mem_ptr + IPS_REG_I960_MSG0);
4945                        if (Post != 0x4F00)
4946                                break;
4947                        /* Delay for 1 Second */
4948                        MDELAY(IPS_ONE_SEC);
4949                }
4950
4951                if (i >= 120) {
4952                        IPS_PRINTK(KERN_WARNING, ha->pcidev,
4953                                   "timeout waiting for Battery PIC Flash\n");
4954                        return (0);
4955                }
4956
4957        }
4958
4959        /* Clear the interrupt bit */
4960        Isr = (uint32_t) IPS_BIT_I960_MSG0I;
4961        writel(Isr, ha->mem_ptr + IPS_REG_I2O_HIR);
4962
4963        if (Post < (IPS_GOOD_POST_STATUS << 8)) {
4964                IPS_PRINTK(KERN_WARNING, ha->pcidev,
4965                           "reset controller fails (post status %x).\n", Post);
4966
4967                return (0);
4968        }
4969
4970        /* Wait up to 240 secs for config bytes */
4971        for (i = 0; i < 240; i++) {
4972                Isr = readl(ha->mem_ptr + IPS_REG_I2O_HIR);
4973
4974                if (Isr & IPS_BIT_I960_MSG1I)
4975                        break;
4976
4977                /* Delay for 1 Second */
4978                MDELAY(IPS_ONE_SEC);
4979        }
4980
4981        if (i >= 240) {
4982                /* error occurred */
4983                IPS_PRINTK(KERN_WARNING, ha->pcidev,
4984                           "timeout waiting for config.\n");
4985
4986                return (0);
4987        }
4988
4989        Config = readl(ha->mem_ptr + IPS_REG_I960_MSG1);
4990
4991        /* Clear interrupt bit */
4992        Isr = (uint32_t) IPS_BIT_I960_MSG1I;
4993        writel(Isr, ha->mem_ptr + IPS_REG_I2O_HIR);
4994
4995        /* Turn on the interrupts */
4996        Oimr = readl(ha->mem_ptr + IPS_REG_I960_OIMR);
4997        Oimr &= ~0x8;
4998        writel(Oimr, ha->mem_ptr + IPS_REG_I960_OIMR);
4999
5000        /* if we get here then everything went OK */
5001
5002        /* Since we did a RESET, an EraseStripeLock may be needed */
5003        if (Post == 0xEF10) {
5004                if ((Config == 0x000F) || (Config == 0x0009))
5005                        ha->requires_esl = 1;
5006        }
5007
5008        return (1);
5009}
5010
5011/****************************************************************************/
5012/*                                                                          */
5013/* Routine Name: ips_reset_copperhead                                       */
5014/*                                                                          */
5015/* Routine Description:                                                     */
5016/*                                                                          */
5017/*   Reset the controller                                                   */
5018/*                                                                          */
5019/****************************************************************************/
5020static int
5021ips_reset_copperhead(ips_ha_t * ha)
5022{
5023        int reset_counter;
5024
5025        METHOD_TRACE("ips_reset_copperhead", 1);
5026
5027        DEBUG_VAR(1, "(%s%d) ips_reset_copperhead: io addr: %x, irq: %d",
5028                  ips_name, ha->host_num, ha->io_addr, ha->pcidev->irq);
5029
5030        reset_counter = 0;
5031
5032        while (reset_counter < 2) {
5033                reset_counter++;
5034
5035                outb(IPS_BIT_RST, ha->io_addr + IPS_REG_SCPR);
5036
5037                /* Delay for 1 Second */
5038                MDELAY(IPS_ONE_SEC);
5039
5040                outb(0, ha->io_addr + IPS_REG_SCPR);
5041
5042                /* Delay for 1 Second */
5043                MDELAY(IPS_ONE_SEC);
5044
5045                if ((*ha->func.init) (ha))
5046                        break;
5047                else if (reset_counter >= 2) {
5048
5049                        return (0);
5050                }
5051        }
5052
5053        return (1);
5054}
5055
5056/****************************************************************************/
5057/*                                                                          */
5058/* Routine Name: ips_reset_copperhead_memio                                 */
5059/*                                                                          */
5060/* Routine Description:                                                     */
5061/*                                                                          */
5062/*   Reset the controller                                                   */
5063/*                                                                          */
5064/****************************************************************************/
5065static int
5066ips_reset_copperhead_memio(ips_ha_t * ha)
5067{
5068        int reset_counter;
5069
5070        METHOD_TRACE("ips_reset_copperhead_memio", 1);
5071
5072        DEBUG_VAR(1, "(%s%d) ips_reset_copperhead_memio: mem addr: %x, irq: %d",
5073                  ips_name, ha->host_num, ha->mem_addr, ha->pcidev->irq);
5074
5075        reset_counter = 0;
5076
5077        while (reset_counter < 2) {
5078                reset_counter++;
5079
5080                writeb(IPS_BIT_RST, ha->mem_ptr + IPS_REG_SCPR);
5081
5082                /* Delay for 1 Second */
5083                MDELAY(IPS_ONE_SEC);
5084
5085                writeb(0, ha->mem_ptr + IPS_REG_SCPR);
5086
5087                /* Delay for 1 Second */
5088                MDELAY(IPS_ONE_SEC);
5089
5090                if ((*ha->func.init) (ha))
5091                        break;
5092                else if (reset_counter >= 2) {
5093
5094                        return (0);
5095                }
5096        }
5097
5098        return (1);
5099}
5100
5101/****************************************************************************/
5102/*                                                                          */
5103/* Routine Name: ips_reset_morpheus                                         */
5104/*                                                                          */
5105/* Routine Description:                                                     */
5106/*                                                                          */
5107/*   Reset the controller                                                   */
5108/*                                                                          */
5109/****************************************************************************/
5110static int
5111ips_reset_morpheus(ips_ha_t * ha)
5112{
5113        int reset_counter;
5114        uint8_t junk;
5115
5116        METHOD_TRACE("ips_reset_morpheus", 1);
5117
5118        DEBUG_VAR(1, "(%s%d) ips_reset_morpheus: mem addr: %x, irq: %d",
5119                  ips_name, ha->host_num, ha->mem_addr, ha->pcidev->irq);
5120
5121        reset_counter = 0;
5122
5123        while (reset_counter < 2) {
5124                reset_counter++;
5125
5126                writel(0x80000000, ha->mem_ptr + IPS_REG_I960_IDR);
5127
5128                /* Delay for 5 Seconds */
5129                MDELAY(5 * IPS_ONE_SEC);
5130
5131                /* Do a PCI config read to wait for adapter */
5132                pci_read_config_byte(ha->pcidev, 4, &junk);
5133
5134                if ((*ha->func.init) (ha))
5135                        break;
5136                else if (reset_counter >= 2) {
5137
5138                        return (0);
5139                }
5140        }
5141
5142        return (1);
5143}
5144
5145/****************************************************************************/
5146/*                                                                          */
5147/* Routine Name: ips_statinit                                               */
5148/*                                                                          */
5149/* Routine Description:                                                     */
5150/*                                                                          */
5151/*   Initialize the status queues on the controller                         */
5152/*                                                                          */
5153/****************************************************************************/
5154static void
5155ips_statinit(ips_ha_t * ha)
5156{
5157        uint32_t phys_status_start;
5158
5159        METHOD_TRACE("ips_statinit", 1);
5160
5161        ha->adapt->p_status_start = ha->adapt->status;
5162        ha->adapt->p_status_end = ha->adapt->status + IPS_MAX_CMDS;
5163        ha->adapt->p_status_tail = ha->adapt->status;
5164
5165        phys_status_start = ha->adapt->hw_status_start;
5166        outl(phys_status_start, ha->io_addr + IPS_REG_SQSR);
5167        outl(phys_status_start + IPS_STATUS_Q_SIZE,
5168             ha->io_addr + IPS_REG_SQER);
5169        outl(phys_status_start + IPS_STATUS_SIZE,
5170             ha->io_addr + IPS_REG_SQHR);
5171        outl(phys_status_start, ha->io_addr + IPS_REG_SQTR);
5172
5173        ha->adapt->hw_status_tail = phys_status_start;
5174}
5175
5176/****************************************************************************/
5177/*                                                                          */
5178/* Routine Name: ips_statinit_memio                                         */
5179/*                                                                          */
5180/* Routine Description:                                                     */
5181/*                                                                          */
5182/*   Initialize the status queues on the controller                         */
5183/*                                                                          */
5184/****************************************************************************/
5185static void
5186ips_statinit_memio(ips_ha_t * ha)
5187{
5188        uint32_t phys_status_start;
5189
5190        METHOD_TRACE("ips_statinit_memio", 1);
5191
5192        ha->adapt->p_status_start = ha->adapt->status;
5193        ha->adapt->p_status_end = ha->adapt->status + IPS_MAX_CMDS;
5194        ha->adapt->p_status_tail = ha->adapt->status;
5195
5196        phys_status_start = ha->adapt->hw_status_start;
5197        writel(phys_status_start, ha->mem_ptr + IPS_REG_SQSR);
5198        writel(phys_status_start + IPS_STATUS_Q_SIZE,
5199               ha->mem_ptr + IPS_REG_SQER);
5200        writel(phys_status_start + IPS_STATUS_SIZE, ha->mem_ptr + IPS_REG_SQHR);
5201        writel(phys_status_start, ha->mem_ptr + IPS_REG_SQTR);
5202
5203        ha->adapt->hw_status_tail = phys_status_start;
5204}
5205
5206/****************************************************************************/
5207/*                                                                          */
5208/* Routine Name: ips_statupd_copperhead                                     */
5209/*                                                                          */
5210/* Routine Description:                                                     */
5211/*                                                                          */
5212/*   Remove an element from the status queue                                */
5213/*                                                                          */
5214/****************************************************************************/
5215static uint32_t
5216ips_statupd_copperhead(ips_ha_t * ha)
5217{
5218        METHOD_TRACE("ips_statupd_copperhead", 1);
5219
5220        if (ha->adapt->p_status_tail != ha->adapt->p_status_end) {
5221                ha->adapt->p_status_tail++;
5222                ha->adapt->hw_status_tail += sizeof (IPS_STATUS);
5223        } else {
5224                ha->adapt->p_status_tail = ha->adapt->p_status_start;
5225                ha->adapt->hw_status_tail = ha->adapt->hw_status_start;
5226        }
5227
5228        outl(ha->adapt->hw_status_tail,
5229             ha->io_addr + IPS_REG_SQTR);
5230
5231        return (ha->adapt->p_status_tail->value);
5232}
5233
5234/****************************************************************************/
5235/*                                                                          */
5236/* Routine Name: ips_statupd_copperhead_memio                               */
5237/*                                                                          */
5238/* Routine Description:                                                     */
5239/*                                                                          */
5240/*   Remove an element from the status queue                                */
5241/*                                                                          */
5242/****************************************************************************/
5243static uint32_t
5244ips_statupd_copperhead_memio(ips_ha_t * ha)
5245{
5246        METHOD_TRACE("ips_statupd_copperhead_memio", 1);
5247
5248        if (ha->adapt->p_status_tail != ha->adapt->p_status_end) {
5249                ha->adapt->p_status_tail++;
5250                ha->adapt->hw_status_tail += sizeof (IPS_STATUS);
5251        } else {
5252                ha->adapt->p_status_tail = ha->adapt->p_status_start;
5253                ha->adapt->hw_status_tail = ha->adapt->hw_status_start;
5254        }
5255
5256        writel(ha->adapt->hw_status_tail, ha->mem_ptr + IPS_REG_SQTR);
5257
5258        return (ha->adapt->p_status_tail->value);
5259}
5260
5261/****************************************************************************/
5262/*                                                                          */
5263/* Routine Name: ips_statupd_morpheus                                       */
5264/*                                                                          */
5265/* Routine Description:                                                     */
5266/*                                                                          */
5267/*   Remove an element from the status queue                                */
5268/*                                                                          */
5269/****************************************************************************/
5270static uint32_t
5271ips_statupd_morpheus(ips_ha_t * ha)
5272{
5273        uint32_t val;
5274
5275        METHOD_TRACE("ips_statupd_morpheus", 1);
5276
5277        val = readl(ha->mem_ptr + IPS_REG_I2O_OUTMSGQ);
5278
5279        return (val);
5280}
5281
5282/****************************************************************************/
5283/*                                                                          */
5284/* Routine Name: ips_issue_copperhead                                       */
5285/*                                                                          */
5286/* Routine Description:                                                     */
5287/*                                                                          */
5288/*   Send a command down to the controller                                  */
5289/*                                                                          */
5290/****************************************************************************/
5291static int
5292ips_issue_copperhead(ips_ha_t * ha, ips_scb_t * scb)
5293{
5294        uint32_t TimeOut;
5295        uint32_t val;
5296
5297        METHOD_TRACE("ips_issue_copperhead", 1);
5298
5299        if (scb->scsi_cmd) {
5300                DEBUG_VAR(2, "(%s%d) ips_issue: cmd 0x%X id %d (%d %d %d)",
5301                          ips_name,
5302                          ha->host_num,
5303                          scb->cdb[0],
5304                          scb->cmd.basic_io.command_id,
5305                          scb->bus, scb->target_id, scb->lun);
5306        } else {
5307                DEBUG_VAR(2, KERN_NOTICE "(%s%d) ips_issue: logical cmd id %d",
5308                          ips_name, ha->host_num, scb->cmd.basic_io.command_id);
5309        }
5310
5311        TimeOut = 0;
5312
5313        while ((val =
5314                le32_to_cpu(inl(ha->io_addr + IPS_REG_CCCR))) & IPS_BIT_SEM) {
5315                udelay(1000);
5316
5317                if (++TimeOut >= IPS_SEM_TIMEOUT) {
5318                        if (!(val & IPS_BIT_START_STOP))
5319                                break;
5320
5321                        IPS_PRINTK(KERN_WARNING, ha->pcidev,
5322                                   "ips_issue val [0x%x].\n", val);
5323                        IPS_PRINTK(KERN_WARNING, ha->pcidev,
5324                                   "ips_issue semaphore chk timeout.\n");
5325
5326                        return (IPS_FAILURE);
5327                }               /* end if */
5328        }                       /* end while */
5329
5330        outl(scb->scb_busaddr, ha->io_addr + IPS_REG_CCSAR);
5331        outw(IPS_BIT_START_CMD, ha->io_addr + IPS_REG_CCCR);
5332
5333        return (IPS_SUCCESS);
5334}
5335
5336/****************************************************************************/
5337/*                                                                          */
5338/* Routine Name: ips_issue_copperhead_memio                                 */
5339/*                                                                          */
5340/* Routine Description:                                                     */
5341/*                                                                          */
5342/*   Send a command down to the controller                                  */
5343/*                                                                          */
5344/****************************************************************************/
5345static int
5346ips_issue_copperhead_memio(ips_ha_t * ha, ips_scb_t * scb)
5347{
5348        uint32_t TimeOut;
5349        uint32_t val;
5350
5351        METHOD_TRACE("ips_issue_copperhead_memio", 1);
5352
5353        if (scb->scsi_cmd) {
5354                DEBUG_VAR(2, "(%s%d) ips_issue: cmd 0x%X id %d (%d %d %d)",
5355                          ips_name,
5356                          ha->host_num,
5357                          scb->cdb[0],
5358                          scb->cmd.basic_io.command_id,
5359                          scb->bus, scb->target_id, scb->lun);
5360        } else {
5361                DEBUG_VAR(2, "(%s%d) ips_issue: logical cmd id %d",
5362                          ips_name, ha->host_num, scb->cmd.basic_io.command_id);
5363        }
5364
5365        TimeOut = 0;
5366
5367        while ((val = readl(ha->mem_ptr + IPS_REG_CCCR)) & IPS_BIT_SEM) {
5368                udelay(1000);
5369
5370                if (++TimeOut >= IPS_SEM_TIMEOUT) {
5371                        if (!(val & IPS_BIT_START_STOP))
5372                                break;
5373
5374                        IPS_PRINTK(KERN_WARNING, ha->pcidev,
5375                                   "ips_issue val [0x%x].\n", val);
5376                        IPS_PRINTK(KERN_WARNING, ha->pcidev,
5377                                   "ips_issue semaphore chk timeout.\n");
5378
5379                        return (IPS_FAILURE);
5380                }               /* end if */
5381        }                       /* end while */
5382
5383        writel(scb->scb_busaddr, ha->mem_ptr + IPS_REG_CCSAR);
5384        writel(IPS_BIT_START_CMD, ha->mem_ptr + IPS_REG_CCCR);
5385
5386        return (IPS_SUCCESS);
5387}
5388
5389/****************************************************************************/
5390/*                                                                          */
5391/* Routine Name: ips_issue_i2o                                              */
5392/*                                                                          */
5393/* Routine Description:                                                     */
5394/*                                                                          */
5395/*   Send a command down to the controller                                  */
5396/*                                                                          */
5397/****************************************************************************/
5398static int
5399ips_issue_i2o(ips_ha_t * ha, ips_scb_t * scb)
5400{
5401
5402        METHOD_TRACE("ips_issue_i2o", 1);
5403
5404        if (scb->scsi_cmd) {
5405                DEBUG_VAR(2, "(%s%d) ips_issue: cmd 0x%X id %d (%d %d %d)",
5406                          ips_name,
5407                          ha->host_num,
5408                          scb->cdb[0],
5409                          scb->cmd.basic_io.command_id,
5410                          scb->bus, scb->target_id, scb->lun);
5411        } else {
5412                DEBUG_VAR(2, "(%s%d) ips_issue: logical cmd id %d",
5413                          ips_name, ha->host_num, scb->cmd.basic_io.command_id);
5414        }
5415
5416        outl(scb->scb_busaddr, ha->io_addr + IPS_REG_I2O_INMSGQ);
5417
5418        return (IPS_SUCCESS);
5419}
5420
5421/****************************************************************************/
5422/*                                                                          */
5423/* Routine Name: ips_issue_i2o_memio                                        */
5424/*                                                                          */
5425/* Routine Description:                                                     */
5426/*                                                                          */
5427/*   Send a command down to the controller                                  */
5428/*                                                                          */
5429/****************************************************************************/
5430static int
5431ips_issue_i2o_memio(ips_ha_t * ha, ips_scb_t * scb)
5432{
5433
5434        METHOD_TRACE("ips_issue_i2o_memio", 1);
5435
5436        if (scb->scsi_cmd) {
5437                DEBUG_VAR(2, "(%s%d) ips_issue: cmd 0x%X id %d (%d %d %d)",
5438                          ips_name,
5439                          ha->host_num,
5440                          scb->cdb[0],
5441                          scb->cmd.basic_io.command_id,
5442                          scb->bus, scb->target_id, scb->lun);
5443        } else {
5444                DEBUG_VAR(2, "(%s%d) ips_issue: logical cmd id %d",
5445                          ips_name, ha->host_num, scb->cmd.basic_io.command_id);
5446        }
5447
5448        writel(scb->scb_busaddr, ha->mem_ptr + IPS_REG_I2O_INMSGQ);
5449
5450        return (IPS_SUCCESS);
5451}
5452
5453/****************************************************************************/
5454/*                                                                          */
5455/* Routine Name: ips_isintr_copperhead                                      */
5456/*                                                                          */
5457/* Routine Description:                                                     */
5458/*                                                                          */
5459/*   Test to see if an interrupt is for us                                  */
5460/*                                                                          */
5461/****************************************************************************/
5462static int
5463ips_isintr_copperhead(ips_ha_t * ha)
5464{
5465        uint8_t Isr;
5466
5467        METHOD_TRACE("ips_isintr_copperhead", 2);
5468
5469        Isr = inb(ha->io_addr + IPS_REG_HISR);
5470
5471        if (Isr == 0xFF)
5472                /* ?!?! Nothing really there */
5473                return (0);
5474
5475        if (Isr & IPS_BIT_SCE)
5476                return (1);
5477        else if (Isr & (IPS_BIT_SQO | IPS_BIT_GHI)) {
5478                /* status queue overflow or GHI */
5479                /* just clear the interrupt */
5480                outb(Isr, ha->io_addr + IPS_REG_HISR);
5481        }
5482
5483        return (0);
5484}
5485
5486/****************************************************************************/
5487/*                                                                          */
5488/* Routine Name: ips_isintr_copperhead_memio                                */
5489/*                                                                          */
5490/* Routine Description:                                                     */
5491/*                                                                          */
5492/*   Test to see if an interrupt is for us                                  */
5493/*                                                                          */
5494/****************************************************************************/
5495static int
5496ips_isintr_copperhead_memio(ips_ha_t * ha)
5497{
5498        uint8_t Isr;
5499
5500        METHOD_TRACE("ips_isintr_memio", 2);
5501
5502        Isr = readb(ha->mem_ptr + IPS_REG_HISR);
5503
5504        if (Isr == 0xFF)
5505                /* ?!?! Nothing really there */
5506                return (0);
5507
5508        if (Isr & IPS_BIT_SCE)
5509                return (1);
5510        else if (Isr & (IPS_BIT_SQO | IPS_BIT_GHI)) {
5511                /* status queue overflow or GHI */
5512                /* just clear the interrupt */
5513                writeb(Isr, ha->mem_ptr + IPS_REG_HISR);
5514        }
5515
5516        return (0);
5517}
5518
5519/****************************************************************************/
5520/*                                                                          */
5521/* Routine Name: ips_isintr_morpheus                                        */
5522/*                                                                          */
5523/* Routine Description:                                                     */
5524/*                                                                          */
5525/*   Test to see if an interrupt is for us                                  */
5526/*                                                                          */
5527/****************************************************************************/
5528static int
5529ips_isintr_morpheus(ips_ha_t * ha)
5530{
5531        uint32_t Isr;
5532
5533        METHOD_TRACE("ips_isintr_morpheus", 2);
5534
5535        Isr = readl(ha->mem_ptr + IPS_REG_I2O_HIR);
5536
5537        if (Isr & IPS_BIT_I2O_OPQI)
5538                return (1);
5539        else
5540                return (0);
5541}
5542
5543/****************************************************************************/
5544/*                                                                          */
5545/* Routine Name: ips_wait                                                   */
5546/*                                                                          */
5547/* Routine Description:                                                     */
5548/*                                                                          */
5549/*   Wait for a command to complete                                         */
5550/*                                                                          */
5551/****************************************************************************/
5552static int
5553ips_wait(ips_ha_t * ha, int time, int intr)
5554{
5555        int ret;
5556        int done;
5557
5558        METHOD_TRACE("ips_wait", 1);
5559
5560        ret = IPS_FAILURE;
5561        done = FALSE;
5562
5563        time *= IPS_ONE_SEC;    /* convert seconds */
5564
5565        while ((time > 0) && (!done)) {
5566                if (intr == IPS_INTR_ON) {
5567                        if (ha->waitflag == FALSE) {
5568                                ret = IPS_SUCCESS;
5569                                done = TRUE;
5570                                break;
5571                        }
5572                } else if (intr == IPS_INTR_IORL) {
5573                        if (ha->waitflag == FALSE) {
5574                                /*
5575                                 * controller generated an interrupt to
5576                                 * acknowledge completion of the command
5577                                 * and ips_intr() has serviced the interrupt.
5578                                 */
5579                                ret = IPS_SUCCESS;
5580                                done = TRUE;
5581                                break;
5582                        }
5583
5584                        /*
5585                         * NOTE: we already have the io_request_lock so
5586                         * even if we get an interrupt it won't get serviced
5587                         * until after we finish.
5588                         */
5589
5590                        (*ha->func.intr) (ha);
5591                }
5592
5593                /* This looks like a very evil loop, but it only does this during start-up */
5594                udelay(1000);
5595                time--;
5596        }
5597
5598        return (ret);
5599}
5600
5601/****************************************************************************/
5602/*                                                                          */
5603/* Routine Name: ips_write_driver_status                                    */
5604/*                                                                          */
5605/* Routine Description:                                                     */
5606/*                                                                          */
5607/*   Write OS/Driver version to Page 5 of the nvram on the controller       */
5608/*                                                                          */
5609/****************************************************************************/
5610static int
5611ips_write_driver_status(ips_ha_t * ha, int intr)
5612{
5613        METHOD_TRACE("ips_write_driver_status", 1);
5614
5615        if (!ips_readwrite_page5(ha, FALSE, intr)) {
5616                IPS_PRINTK(KERN_WARNING, ha->pcidev,
5617                           "unable to read NVRAM page 5.\n");
5618
5619                return (0);
5620        }
5621
5622        /* check to make sure the page has a valid */
5623        /* signature */
5624        if (le32_to_cpu(ha->nvram->signature) != IPS_NVRAM_P5_SIG) {
5625                DEBUG_VAR(1,
5626                          "(%s%d) NVRAM page 5 has an invalid signature: %X.",
5627                          ips_name, ha->host_num, ha->nvram->signature);
5628                ha->nvram->signature = IPS_NVRAM_P5_SIG;
5629        }
5630
5631        DEBUG_VAR(2,
5632                  "(%s%d) Ad Type: %d, Ad Slot: %d, BIOS: %c%c%c%c %c%c%c%c.",
5633                  ips_name, ha->host_num, le16_to_cpu(ha->nvram->adapter_type),
5634                  ha->nvram->adapter_slot, ha->nvram->bios_high[0],
5635                  ha->nvram->bios_high[1], ha->nvram->bios_high[2],
5636                  ha->nvram->bios_high[3], ha->nvram->bios_low[0],
5637                  ha->nvram->bios_low[1], ha->nvram->bios_low[2],
5638                  ha->nvram->bios_low[3]);
5639
5640        ips_get_bios_version(ha, intr);
5641
5642        /* change values (as needed) */
5643        ha->nvram->operating_system = IPS_OS_LINUX;
5644        ha->nvram->adapter_type = ha->ad_type;
5645        strncpy((char *) ha->nvram->driver_high, IPS_VERSION_HIGH, 4);
5646        strncpy((char *) ha->nvram->driver_low, IPS_VERSION_LOW, 4);
5647        strncpy((char *) ha->nvram->bios_high, ha->bios_version, 4);
5648        strncpy((char *) ha->nvram->bios_low, ha->bios_version + 4, 4);
5649
5650        ha->nvram->versioning = 0;      /* Indicate the Driver Does Not Support Versioning */
5651
5652        /* now update the page */
5653        if (!ips_readwrite_page5(ha, TRUE, intr)) {
5654                IPS_PRINTK(KERN_WARNING, ha->pcidev,
5655                           "unable to write NVRAM page 5.\n");
5656
5657                return (0);
5658        }
5659
5660        /* IF NVRAM Page 5 is OK, Use it for Slot Number Info Because Linux Doesn't Do Slots */
5661        ha->slot_num = ha->nvram->adapter_slot;
5662
5663        return (1);
5664}
5665
5666/****************************************************************************/
5667/*                                                                          */
5668/* Routine Name: ips_read_adapter_status                                    */
5669/*                                                                          */
5670/* Routine Description:                                                     */
5671/*                                                                          */
5672/*   Do an Inquiry command to the adapter                                   */
5673/*                                                                          */
5674/****************************************************************************/
5675static int
5676ips_read_adapter_status(ips_ha_t * ha, int intr)
5677{
5678        ips_scb_t *scb;
5679        int ret;
5680
5681        METHOD_TRACE("ips_read_adapter_status", 1);
5682
5683        scb = &ha->scbs[ha->max_cmds - 1];
5684
5685        ips_init_scb(ha, scb);
5686
5687        scb->timeout = ips_cmd_timeout;
5688        scb->cdb[0] = IPS_CMD_ENQUIRY;
5689
5690        scb->cmd.basic_io.op_code = IPS_CMD_ENQUIRY;
5691        scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
5692        scb->cmd.basic_io.sg_count = 0;
5693        scb->cmd.basic_io.lba = 0;
5694        scb->cmd.basic_io.sector_count = 0;
5695        scb->cmd.basic_io.log_drv = 0;
5696        scb->data_len = sizeof (*ha->enq);
5697        scb->cmd.basic_io.sg_addr = ha->enq_busaddr;
5698
5699        /* send command */
5700        if (((ret =
5701              ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE)
5702            || (ret == IPS_SUCCESS_IMM)
5703            || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1))
5704                return (0);
5705
5706        return (1);
5707}
5708
5709/****************************************************************************/
5710/*                                                                          */
5711/* Routine Name: ips_read_subsystem_parameters                              */
5712/*                                                                          */
5713/* Routine Description:                                                     */
5714/*                                                                          */
5715/*   Read subsystem parameters from the adapter                             */
5716/*                                                                          */
5717/****************************************************************************/
5718static int
5719ips_read_subsystem_parameters(ips_ha_t * ha, int intr)
5720{
5721        ips_scb_t *scb;
5722        int ret;
5723
5724        METHOD_TRACE("ips_read_subsystem_parameters", 1);
5725
5726        scb = &ha->scbs[ha->max_cmds - 1];
5727
5728        ips_init_scb(ha, scb);
5729
5730        scb->timeout = ips_cmd_timeout;
5731        scb->cdb[0] = IPS_CMD_GET_SUBSYS;
5732
5733        scb->cmd.basic_io.op_code = IPS_CMD_GET_SUBSYS;
5734        scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
5735        scb->cmd.basic_io.sg_count = 0;
5736        scb->cmd.basic_io.lba = 0;
5737        scb->cmd.basic_io.sector_count = 0;
5738        scb->cmd.basic_io.log_drv = 0;
5739        scb->data_len = sizeof (*ha->subsys);
5740        scb->cmd.basic_io.sg_addr = ha->ioctl_busaddr;
5741
5742        /* send command */
5743        if (((ret =
5744              ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE)
5745            || (ret == IPS_SUCCESS_IMM)
5746            || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1))
5747                return (0);
5748
5749        memcpy(ha->subsys, ha->ioctl_data, sizeof(*ha->subsys));
5750        return (1);
5751}
5752
5753/****************************************************************************/
5754/*                                                                          */
5755/* Routine Name: ips_read_config                                            */
5756/*                                                                          */
5757/* Routine Description:                                                     */
5758/*                                                                          */
5759/*   Read the configuration on the adapter                                  */
5760/*                                                                          */
5761/****************************************************************************/
5762static int
5763ips_read_config(ips_ha_t * ha, int intr)
5764{
5765        ips_scb_t *scb;
5766        int i;
5767        int ret;
5768
5769        METHOD_TRACE("ips_read_config", 1);
5770
5771        /* set defaults for initiator IDs */
5772        for (i = 0; i < 4; i++)
5773                ha->conf->init_id[i] = 7;
5774
5775        scb = &ha->scbs[ha->max_cmds - 1];
5776
5777        ips_init_scb(ha, scb);
5778
5779        scb->timeout = ips_cmd_timeout;
5780        scb->cdb[0] = IPS_CMD_READ_CONF;
5781
5782        scb->cmd.basic_io.op_code = IPS_CMD_READ_CONF;
5783        scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
5784        scb->data_len = sizeof (*ha->conf);
5785        scb->cmd.basic_io.sg_addr = ha->ioctl_busaddr;
5786
5787        /* send command */
5788        if (((ret =
5789              ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE)
5790            || (ret == IPS_SUCCESS_IMM)
5791            || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) {
5792
5793                memset(ha->conf, 0, sizeof (IPS_CONF));
5794
5795                /* reset initiator IDs */
5796                for (i = 0; i < 4; i++)
5797                        ha->conf->init_id[i] = 7;
5798
5799                /* Allow Completed with Errors, so JCRM can access the Adapter to fix the problems */
5800                if ((scb->basic_status & IPS_GSC_STATUS_MASK) ==
5801                    IPS_CMD_CMPLT_WERROR)
5802                        return (1);
5803
5804                return (0);
5805        }
5806
5807        memcpy(ha->conf, ha->ioctl_data, sizeof(*ha->conf));
5808        return (1);
5809}
5810
5811/****************************************************************************/
5812/*                                                                          */
5813/* Routine Name: ips_readwrite_page5                                        */
5814/*                                                                          */
5815/* Routine Description:                                                     */
5816/*                                                                          */
5817/*   Read nvram page 5 from the adapter                                     */
5818/*                                                                          */
5819/****************************************************************************/
5820static int
5821ips_readwrite_page5(ips_ha_t * ha, int write, int intr)
5822{
5823        ips_scb_t *scb;
5824        int ret;
5825
5826        METHOD_TRACE("ips_readwrite_page5", 1);
5827
5828        scb = &ha->scbs[ha->max_cmds - 1];
5829
5830        ips_init_scb(ha, scb);
5831
5832        scb->timeout = ips_cmd_timeout;
5833        scb->cdb[0] = IPS_CMD_RW_NVRAM_PAGE;
5834
5835        scb->cmd.nvram.op_code = IPS_CMD_RW_NVRAM_PAGE;
5836        scb->cmd.nvram.command_id = IPS_COMMAND_ID(ha, scb);
5837        scb->cmd.nvram.page = 5;
5838        scb->cmd.nvram.write = write;
5839        scb->cmd.nvram.reserved = 0;
5840        scb->cmd.nvram.reserved2 = 0;
5841        scb->data_len = sizeof (*ha->nvram);
5842        scb->cmd.nvram.buffer_addr = ha->ioctl_busaddr;
5843        if (write)
5844                memcpy(ha->ioctl_data, ha->nvram, sizeof(*ha->nvram));
5845
5846        /* issue the command */
5847        if (((ret =
5848              ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE)
5849            || (ret == IPS_SUCCESS_IMM)
5850            || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) {
5851
5852                memset(ha->nvram, 0, sizeof (IPS_NVRAM_P5));
5853
5854                return (0);
5855        }
5856        if (!write)
5857                memcpy(ha->nvram, ha->ioctl_data, sizeof(*ha->nvram));
5858        return (1);
5859}
5860
5861/****************************************************************************/
5862/*                                                                          */
5863/* Routine Name: ips_clear_adapter                                          */
5864/*                                                                          */
5865/* Routine Description:                                                     */
5866/*                                                                          */
5867/*   Clear the stripe lock tables                                           */
5868/*                                                                          */
5869/****************************************************************************/
5870static int
5871ips_clear_adapter(ips_ha_t * ha, int intr)
5872{
5873        ips_scb_t *scb;
5874        int ret;
5875
5876        METHOD_TRACE("ips_clear_adapter", 1);
5877
5878        scb = &ha->scbs[ha->max_cmds - 1];
5879
5880        ips_init_scb(ha, scb);
5881
5882        scb->timeout = ips_reset_timeout;
5883        scb->cdb[0] = IPS_CMD_CONFIG_SYNC;
5884
5885        scb->cmd.config_sync.op_code = IPS_CMD_CONFIG_SYNC;
5886        scb->cmd.config_sync.command_id = IPS_COMMAND_ID(ha, scb);
5887        scb->cmd.config_sync.channel = 0;
5888        scb->cmd.config_sync.source_target = IPS_POCL;
5889        scb->cmd.config_sync.reserved = 0;
5890        scb->cmd.config_sync.reserved2 = 0;
5891        scb->cmd.config_sync.reserved3 = 0;
5892
5893        /* issue command */
5894        if (((ret =
5895              ips_send_wait(ha, scb, ips_reset_timeout, intr)) == IPS_FAILURE)
5896            || (ret == IPS_SUCCESS_IMM)
5897            || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1))
5898                return (0);
5899
5900        /* send unlock stripe command */
5901        ips_init_scb(ha, scb);
5902
5903        scb->cdb[0] = IPS_CMD_ERROR_TABLE;
5904        scb->timeout = ips_reset_timeout;
5905
5906        scb->cmd.unlock_stripe.op_code = IPS_CMD_ERROR_TABLE;
5907        scb->cmd.unlock_stripe.command_id = IPS_COMMAND_ID(ha, scb);
5908        scb->cmd.unlock_stripe.log_drv = 0;
5909        scb->cmd.unlock_stripe.control = IPS_CSL;
5910        scb->cmd.unlock_stripe.reserved = 0;
5911        scb->cmd.unlock_stripe.reserved2 = 0;
5912        scb->cmd.unlock_stripe.reserved3 = 0;
5913
5914        /* issue command */
5915        if (((ret =
5916              ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE)
5917            || (ret == IPS_SUCCESS_IMM)
5918            || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1))
5919                return (0);
5920
5921        return (1);
5922}
5923
5924/****************************************************************************/
5925/*                                                                          */
5926/* Routine Name: ips_ffdc_reset                                             */
5927/*                                                                          */
5928/* Routine Description:                                                     */
5929/*                                                                          */
5930/*   FFDC: write reset info                                                 */
5931/*                                                                          */
5932/****************************************************************************/
5933static void
5934ips_ffdc_reset(ips_ha_t * ha, int intr)
5935{
5936        ips_scb_t *scb;
5937
5938        METHOD_TRACE("ips_ffdc_reset", 1);
5939
5940        scb = &ha->scbs[ha->max_cmds - 1];
5941
5942        ips_init_scb(ha, scb);
5943
5944        scb->timeout = ips_cmd_timeout;
5945        scb->cdb[0] = IPS_CMD_FFDC;
5946        scb->cmd.ffdc.op_code = IPS_CMD_FFDC;
5947        scb->cmd.ffdc.command_id = IPS_COMMAND_ID(ha, scb);
5948        scb->cmd.ffdc.reset_count = ha->reset_count;
5949        scb->cmd.ffdc.reset_type = 0x80;
5950
5951        /* convert time to what the card wants */
5952        ips_fix_ffdc_time(ha, scb, ha->last_ffdc);
5953
5954        /* issue command */
5955        ips_send_wait(ha, scb, ips_cmd_timeout, intr);
5956}
5957
5958/****************************************************************************/
5959/*                                                                          */
5960/* Routine Name: ips_ffdc_time                                              */
5961/*                                                                          */
5962/* Routine Description:                                                     */
5963/*                                                                          */
5964/*   FFDC: write time info                                                  */
5965/*                                                                          */
5966/****************************************************************************/
5967static void
5968ips_ffdc_time(ips_ha_t * ha)
5969{
5970        ips_scb_t *scb;
5971
5972        METHOD_TRACE("ips_ffdc_time", 1);
5973
5974        DEBUG_VAR(1, "(%s%d) Sending time update.", ips_name, ha->host_num);
5975
5976        scb = &ha->scbs[ha->max_cmds - 1];
5977
5978        ips_init_scb(ha, scb);
5979
5980        scb->timeout = ips_cmd_timeout;
5981        scb->cdb[0] = IPS_CMD_FFDC;
5982        scb->cmd.ffdc.op_code = IPS_CMD_FFDC;
5983        scb->cmd.ffdc.command_id = IPS_COMMAND_ID(ha, scb);
5984        scb->cmd.ffdc.reset_count = 0;
5985        scb->cmd.ffdc.reset_type = 0;
5986
5987        /* convert time to what the card wants */
5988        ips_fix_ffdc_time(ha, scb, ha->last_ffdc);
5989
5990        /* issue command */
5991        ips_send_wait(ha, scb, ips_cmd_timeout, IPS_FFDC);
5992}
5993
5994/****************************************************************************/
5995/*                                                                          */
5996/* Routine Name: ips_fix_ffdc_time                                          */
5997/*                                                                          */
5998/* Routine Description:                                                     */
5999/*   Adjust time_t to what the card wants                                   */
6000/*                                                                          */
6001/****************************************************************************/
6002static void
6003ips_fix_ffdc_time(ips_ha_t * ha, ips_scb_t * scb, time_t current_time)
6004{
6005        long days;
6006        long rem;
6007        int i;
6008        int year;
6009        int yleap;
6010        int year_lengths[2] = { IPS_DAYS_NORMAL_YEAR, IPS_DAYS_LEAP_YEAR };
6011        int month_lengths[12][2] = { {31, 31},
6012        {28, 29},
6013        {31, 31},
6014        {30, 30},
6015        {31, 31},
6016        {30, 30},
6017        {31, 31},
6018        {31, 31},
6019        {30, 30},
6020        {31, 31},
6021        {30, 30},
6022        {31, 31}
6023        };
6024
6025        METHOD_TRACE("ips_fix_ffdc_time", 1);
6026
6027        days = current_time / IPS_SECS_DAY;
6028        rem = current_time % IPS_SECS_DAY;
6029
6030        scb->cmd.ffdc.hour = (rem / IPS_SECS_HOUR);
6031        rem = rem % IPS_SECS_HOUR;
6032        scb->cmd.ffdc.minute = (rem / IPS_SECS_MIN);
6033        scb->cmd.ffdc.second = (rem % IPS_SECS_MIN);
6034
6035        year = IPS_EPOCH_YEAR;
6036        while (days < 0 || days >= year_lengths[yleap = IPS_IS_LEAP_YEAR(year)]) {
6037                int newy;
6038
6039                newy = year + (days / IPS_DAYS_NORMAL_YEAR);
6040                if (days < 0)
6041                        --newy;
6042                days -= (newy - year) * IPS_DAYS_NORMAL_YEAR +
6043                    IPS_NUM_LEAP_YEARS_THROUGH(newy - 1) -
6044                    IPS_NUM_LEAP_YEARS_THROUGH(year - 1);
6045                year = newy;
6046        }
6047
6048        scb->cmd.ffdc.yearH = year / 100;
6049        scb->cmd.ffdc.yearL = year % 100;
6050
6051        for (i = 0; days >= month_lengths[i][yleap]; ++i)
6052                days -= month_lengths[i][yleap];
6053
6054        scb->cmd.ffdc.month = i + 1;
6055        scb->cmd.ffdc.day = days + 1;
6056}
6057
6058/****************************************************************************
6059 * BIOS Flash Routines                                                      *
6060 ****************************************************************************/
6061
6062/****************************************************************************/
6063/*                                                                          */
6064/* Routine Name: ips_erase_bios                                             */
6065/*                                                                          */
6066/* Routine Description:                                                     */
6067/*   Erase the BIOS on the adapter                                          */
6068/*                                                                          */
6069/****************************************************************************/
6070static int
6071ips_erase_bios(ips_ha_t * ha)
6072{
6073        int timeout;
6074        uint8_t status = 0;
6075
6076        METHOD_TRACE("ips_erase_bios", 1);
6077
6078        status = 0;
6079
6080        /* Clear the status register */
6081        outl(0, ha->io_addr + IPS_REG_FLAP);
6082        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6083                udelay(25);     /* 25 us */
6084
6085        outb(0x50, ha->io_addr + IPS_REG_FLDP);
6086        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6087                udelay(25);     /* 25 us */
6088
6089        /* Erase Setup */
6090        outb(0x20, ha->io_addr + IPS_REG_FLDP);
6091        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6092                udelay(25);     /* 25 us */
6093
6094        /* Erase Confirm */
6095        outb(0xD0, ha->io_addr + IPS_REG_FLDP);
6096        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6097                udelay(25);     /* 25 us */
6098
6099        /* Erase Status */
6100        outb(0x70, ha->io_addr + IPS_REG_FLDP);
6101        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6102                udelay(25);     /* 25 us */
6103
6104        timeout = 80000;        /* 80 seconds */
6105
6106        while (timeout > 0) {
6107                if (ha->pcidev->revision == IPS_REVID_TROMBONE64) {
6108                        outl(0, ha->io_addr + IPS_REG_FLAP);
6109                        udelay(25);     /* 25 us */
6110                }
6111
6112                status = inb(ha->io_addr + IPS_REG_FLDP);
6113
6114                if (status & 0x80)
6115                        break;
6116
6117                MDELAY(1);
6118                timeout--;
6119        }
6120
6121        /* check for timeout */
6122        if (timeout <= 0) {
6123                /* timeout */
6124
6125                /* try to suspend the erase */
6126                outb(0xB0, ha->io_addr + IPS_REG_FLDP);
6127                if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6128                        udelay(25);     /* 25 us */
6129
6130                /* wait for 10 seconds */
6131                timeout = 10000;
6132                while (timeout > 0) {
6133                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64) {
6134                                outl(0, ha->io_addr + IPS_REG_FLAP);
6135                                udelay(25);     /* 25 us */
6136                        }
6137
6138                        status = inb(ha->io_addr + IPS_REG_FLDP);
6139
6140                        if (status & 0xC0)
6141                                break;
6142
6143                        MDELAY(1);
6144                        timeout--;
6145                }
6146
6147                return (1);
6148        }
6149
6150        /* check for valid VPP */
6151        if (status & 0x08)
6152                /* VPP failure */
6153                return (1);
6154
6155        /* check for successful flash */
6156        if (status & 0x30)
6157                /* sequence error */
6158                return (1);
6159
6160        /* Otherwise, we were successful */
6161        /* clear status */
6162        outb(0x50, ha->io_addr + IPS_REG_FLDP);
6163        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6164                udelay(25);     /* 25 us */
6165
6166        /* enable reads */
6167        outb(0xFF, ha->io_addr + IPS_REG_FLDP);
6168        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6169                udelay(25);     /* 25 us */
6170
6171        return (0);
6172}
6173
6174/****************************************************************************/
6175/*                                                                          */
6176/* Routine Name: ips_erase_bios_memio                                       */
6177/*                                                                          */
6178/* Routine Description:                                                     */
6179/*   Erase the BIOS on the adapter                                          */
6180/*                                                                          */
6181/****************************************************************************/
6182static int
6183ips_erase_bios_memio(ips_ha_t * ha)
6184{
6185        int timeout;
6186        uint8_t status;
6187
6188        METHOD_TRACE("ips_erase_bios_memio", 1);
6189
6190        status = 0;
6191
6192        /* Clear the status register */
6193        writel(0, ha->mem_ptr + IPS_REG_FLAP);
6194        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6195                udelay(25);     /* 25 us */
6196
6197        writeb(0x50, ha->mem_ptr + IPS_REG_FLDP);
6198        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6199                udelay(25);     /* 25 us */
6200
6201        /* Erase Setup */
6202        writeb(0x20, ha->mem_ptr + IPS_REG_FLDP);
6203        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6204                udelay(25);     /* 25 us */
6205
6206        /* Erase Confirm */
6207        writeb(0xD0, ha->mem_ptr + IPS_REG_FLDP);
6208        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6209                udelay(25);     /* 25 us */
6210
6211        /* Erase Status */
6212        writeb(0x70, ha->mem_ptr + IPS_REG_FLDP);
6213        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6214                udelay(25);     /* 25 us */
6215
6216        timeout = 80000;        /* 80 seconds */
6217
6218        while (timeout > 0) {
6219                if (ha->pcidev->revision == IPS_REVID_TROMBONE64) {
6220                        writel(0, ha->mem_ptr + IPS_REG_FLAP);
6221                        udelay(25);     /* 25 us */
6222                }
6223
6224                status = readb(ha->mem_ptr + IPS_REG_FLDP);
6225
6226                if (status & 0x80)
6227                        break;
6228
6229                MDELAY(1);
6230                timeout--;
6231        }
6232
6233        /* check for timeout */
6234        if (timeout <= 0) {
6235                /* timeout */
6236
6237                /* try to suspend the erase */
6238                writeb(0xB0, ha->mem_ptr + IPS_REG_FLDP);
6239                if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6240                        udelay(25);     /* 25 us */
6241
6242                /* wait for 10 seconds */
6243                timeout = 10000;
6244                while (timeout > 0) {
6245                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64) {
6246                                writel(0, ha->mem_ptr + IPS_REG_FLAP);
6247                                udelay(25);     /* 25 us */
6248                        }
6249
6250                        status = readb(ha->mem_ptr + IPS_REG_FLDP);
6251
6252                        if (status & 0xC0)
6253                                break;
6254
6255                        MDELAY(1);
6256                        timeout--;
6257                }
6258
6259                return (1);
6260        }
6261
6262        /* check for valid VPP */
6263        if (status & 0x08)
6264                /* VPP failure */
6265                return (1);
6266
6267        /* check for successful flash */
6268        if (status & 0x30)
6269                /* sequence error */
6270                return (1);
6271
6272        /* Otherwise, we were successful */
6273        /* clear status */
6274        writeb(0x50, ha->mem_ptr + IPS_REG_FLDP);
6275        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6276                udelay(25);     /* 25 us */
6277
6278        /* enable reads */
6279        writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP);
6280        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6281                udelay(25);     /* 25 us */
6282
6283        return (0);
6284}
6285
6286/****************************************************************************/
6287/*                                                                          */
6288/* Routine Name: ips_program_bios                                           */
6289/*                                                                          */
6290/* Routine Description:                                                     */
6291/*   Program the BIOS on the adapter                                        */
6292/*                                                                          */
6293/****************************************************************************/
6294static int
6295ips_program_bios(ips_ha_t * ha, char *buffer, uint32_t buffersize,
6296                 uint32_t offset)
6297{
6298        int i;
6299        int timeout;
6300        uint8_t status = 0;
6301
6302        METHOD_TRACE("ips_program_bios", 1);
6303
6304        status = 0;
6305
6306        for (i = 0; i < buffersize; i++) {
6307                /* write a byte */
6308                outl(i + offset, ha->io_addr + IPS_REG_FLAP);
6309                if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6310                        udelay(25);     /* 25 us */
6311
6312                outb(0x40, ha->io_addr + IPS_REG_FLDP);
6313                if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6314                        udelay(25);     /* 25 us */
6315
6316                outb(buffer[i], ha->io_addr + IPS_REG_FLDP);
6317                if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6318                        udelay(25);     /* 25 us */
6319
6320                /* wait up to one second */
6321                timeout = 1000;
6322                while (timeout > 0) {
6323                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64) {
6324                                outl(0, ha->io_addr + IPS_REG_FLAP);
6325                                udelay(25);     /* 25 us */
6326                        }
6327
6328                        status = inb(ha->io_addr + IPS_REG_FLDP);
6329
6330                        if (status & 0x80)
6331                                break;
6332
6333                        MDELAY(1);
6334                        timeout--;
6335                }
6336
6337                if (timeout == 0) {
6338                        /* timeout error */
6339                        outl(0, ha->io_addr + IPS_REG_FLAP);
6340                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6341                                udelay(25);     /* 25 us */
6342
6343                        outb(0xFF, ha->io_addr + IPS_REG_FLDP);
6344                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6345                                udelay(25);     /* 25 us */
6346
6347                        return (1);
6348                }
6349
6350                /* check the status */
6351                if (status & 0x18) {
6352                        /* programming error */
6353                        outl(0, ha->io_addr + IPS_REG_FLAP);
6354                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6355                                udelay(25);     /* 25 us */
6356
6357                        outb(0xFF, ha->io_addr + IPS_REG_FLDP);
6358                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6359                                udelay(25);     /* 25 us */
6360
6361                        return (1);
6362                }
6363        }                       /* end for */
6364
6365        /* Enable reading */
6366        outl(0, ha->io_addr + IPS_REG_FLAP);
6367        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6368                udelay(25);     /* 25 us */
6369
6370        outb(0xFF, ha->io_addr + IPS_REG_FLDP);
6371        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6372                udelay(25);     /* 25 us */
6373
6374        return (0);
6375}
6376
6377/****************************************************************************/
6378/*                                                                          */
6379/* Routine Name: ips_program_bios_memio                                     */
6380/*                                                                          */
6381/* Routine Description:                                                     */
6382/*   Program the BIOS on the adapter                                        */
6383/*                                                                          */
6384/****************************************************************************/
6385static int
6386ips_program_bios_memio(ips_ha_t * ha, char *buffer, uint32_t buffersize,
6387                       uint32_t offset)
6388{
6389        int i;
6390        int timeout;
6391        uint8_t status = 0;
6392
6393        METHOD_TRACE("ips_program_bios_memio", 1);
6394
6395        status = 0;
6396
6397        for (i = 0; i < buffersize; i++) {
6398                /* write a byte */
6399                writel(i + offset, ha->mem_ptr + IPS_REG_FLAP);
6400                if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6401                        udelay(25);     /* 25 us */
6402
6403                writeb(0x40, ha->mem_ptr + IPS_REG_FLDP);
6404                if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6405                        udelay(25);     /* 25 us */
6406
6407                writeb(buffer[i], ha->mem_ptr + IPS_REG_FLDP);
6408                if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6409                        udelay(25);     /* 25 us */
6410
6411                /* wait up to one second */
6412                timeout = 1000;
6413                while (timeout > 0) {
6414                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64) {
6415                                writel(0, ha->mem_ptr + IPS_REG_FLAP);
6416                                udelay(25);     /* 25 us */
6417                        }
6418
6419                        status = readb(ha->mem_ptr + IPS_REG_FLDP);
6420
6421                        if (status & 0x80)
6422                                break;
6423
6424                        MDELAY(1);
6425                        timeout--;
6426                }
6427
6428                if (timeout == 0) {
6429                        /* timeout error */
6430                        writel(0, ha->mem_ptr + IPS_REG_FLAP);
6431                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6432                                udelay(25);     /* 25 us */
6433
6434                        writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP);
6435                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6436                                udelay(25);     /* 25 us */
6437
6438                        return (1);
6439                }
6440
6441                /* check the status */
6442                if (status & 0x18) {
6443                        /* programming error */
6444                        writel(0, ha->mem_ptr + IPS_REG_FLAP);
6445                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6446                                udelay(25);     /* 25 us */
6447
6448                        writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP);
6449                        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6450                                udelay(25);     /* 25 us */
6451
6452                        return (1);
6453                }
6454        }                       /* end for */
6455
6456        /* Enable reading */
6457        writel(0, ha->mem_ptr + IPS_REG_FLAP);
6458        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6459                udelay(25);     /* 25 us */
6460
6461        writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP);
6462        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6463                udelay(25);     /* 25 us */
6464
6465        return (0);
6466}
6467
6468/****************************************************************************/
6469/*                                                                          */
6470/* Routine Name: ips_verify_bios                                            */
6471/*                                                                          */
6472/* Routine Description:                                                     */
6473/*   Verify the BIOS on the adapter                                         */
6474/*                                                                          */
6475/****************************************************************************/
6476static int
6477ips_verify_bios(ips_ha_t * ha, char *buffer, uint32_t buffersize,
6478                uint32_t offset)
6479{
6480        uint8_t checksum;
6481        int i;
6482
6483        METHOD_TRACE("ips_verify_bios", 1);
6484
6485        /* test 1st byte */
6486        outl(0, ha->io_addr + IPS_REG_FLAP);
6487        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6488                udelay(25);     /* 25 us */
6489
6490        if (inb(ha->io_addr + IPS_REG_FLDP) != 0x55)
6491                return (1);
6492
6493        outl(1, ha->io_addr + IPS_REG_FLAP);
6494        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6495                udelay(25);     /* 25 us */
6496        if (inb(ha->io_addr + IPS_REG_FLDP) != 0xAA)
6497                return (1);
6498
6499        checksum = 0xff;
6500        for (i = 2; i < buffersize; i++) {
6501
6502                outl(i + offset, ha->io_addr + IPS_REG_FLAP);
6503                if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6504                        udelay(25);     /* 25 us */
6505
6506                checksum = (uint8_t) checksum + inb(ha->io_addr + IPS_REG_FLDP);
6507        }
6508
6509        if (checksum != 0)
6510                /* failure */
6511                return (1);
6512        else
6513                /* success */
6514                return (0);
6515}
6516
6517/****************************************************************************/
6518/*                                                                          */
6519/* Routine Name: ips_verify_bios_memio                                      */
6520/*                                                                          */
6521/* Routine Description:                                                     */
6522/*   Verify the BIOS on the adapter                                         */
6523/*                                                                          */
6524/****************************************************************************/
6525static int
6526ips_verify_bios_memio(ips_ha_t * ha, char *buffer, uint32_t buffersize,
6527                      uint32_t offset)
6528{
6529        uint8_t checksum;
6530        int i;
6531
6532        METHOD_TRACE("ips_verify_bios_memio", 1);
6533
6534        /* test 1st byte */
6535        writel(0, ha->mem_ptr + IPS_REG_FLAP);
6536        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6537                udelay(25);     /* 25 us */
6538
6539        if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0x55)
6540                return (1);
6541
6542        writel(1, ha->mem_ptr + IPS_REG_FLAP);
6543        if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6544                udelay(25);     /* 25 us */
6545        if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0xAA)
6546                return (1);
6547
6548        checksum = 0xff;
6549        for (i = 2; i < buffersize; i++) {
6550
6551                writel(i + offset, ha->mem_ptr + IPS_REG_FLAP);
6552                if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6553                        udelay(25);     /* 25 us */
6554
6555                checksum =
6556                    (uint8_t) checksum + readb(ha->mem_ptr + IPS_REG_FLDP);
6557        }
6558
6559        if (checksum != 0)
6560                /* failure */
6561                return (1);
6562        else
6563                /* success */
6564                return (0);
6565}
6566
6567/****************************************************************************/
6568/*                                                                          */
6569/* Routine Name: ips_abort_init                                             */
6570/*                                                                          */
6571/* Routine Description:                                                     */
6572/*   cleanup routine for a failed adapter initialization                    */
6573/****************************************************************************/
6574static int
6575ips_abort_init(ips_ha_t * ha, int index)
6576{
6577        ha->active = 0;
6578        ips_free(ha);
6579        ips_ha[index] = NULL;
6580        ips_sh[index] = NULL;
6581        return -1;
6582}
6583
6584/****************************************************************************/
6585/*                                                                          */
6586/* Routine Name: ips_shift_controllers                                      */
6587/*                                                                          */
6588/* Routine Description:                                                     */
6589/*   helper function for ordering adapters                                  */
6590/****************************************************************************/
6591static void
6592ips_shift_controllers(int lowindex, int highindex)
6593{
6594        ips_ha_t *ha_sav = ips_ha[highindex];
6595        struct Scsi_Host *sh_sav = ips_sh[highindex];
6596        int i;
6597
6598        for (i = highindex; i > lowindex; i--) {
6599                ips_ha[i] = ips_ha[i - 1];
6600                ips_sh[i] = ips_sh[i - 1];
6601                ips_ha[i]->host_num = i;
6602        }
6603        ha_sav->host_num = lowindex;
6604        ips_ha[lowindex] = ha_sav;
6605        ips_sh[lowindex] = sh_sav;
6606}
6607
6608/****************************************************************************/
6609/*                                                                          */
6610/* Routine Name: ips_order_controllers                                      */
6611/*                                                                          */
6612/* Routine Description:                                                     */
6613/*   place controllers is the "proper" boot order                           */
6614/****************************************************************************/
6615static void
6616ips_order_controllers(void)
6617{
6618        int i, j, tmp, position = 0;
6619        IPS_NVRAM_P5 *nvram;
6620        if (!ips_ha[0])
6621                return;
6622        nvram = ips_ha[0]->nvram;
6623
6624        if (nvram->adapter_order[0]) {
6625                for (i = 1; i <= nvram->adapter_order[0]; i++) {
6626                        for (j = position; j < ips_num_controllers; j++) {
6627                                switch (ips_ha[j]->ad_type) {
6628                                case IPS_ADTYPE_SERVERAID6M:
6629                                case IPS_ADTYPE_SERVERAID7M:
6630                                        if (nvram->adapter_order[i] == 'M') {
6631                                                ips_shift_controllers(position,
6632                                                                      j);
6633                                                position++;
6634                                        }
6635                                        break;
6636                                case IPS_ADTYPE_SERVERAID4L:
6637                                case IPS_ADTYPE_SERVERAID4M:
6638                                case IPS_ADTYPE_SERVERAID4MX:
6639                                case IPS_ADTYPE_SERVERAID4LX:
6640                                        if (nvram->adapter_order[i] == 'N') {
6641                                                ips_shift_controllers(position,
6642                                                                      j);
6643                                                position++;
6644                                        }
6645                                        break;
6646                                case IPS_ADTYPE_SERVERAID6I:
6647                                case IPS_ADTYPE_SERVERAID5I2:
6648                                case IPS_ADTYPE_SERVERAID5I1:
6649                                case IPS_ADTYPE_SERVERAID7k:
6650                                        if (nvram->adapter_order[i] == 'S') {
6651                                                ips_shift_controllers(position,
6652                                                                      j);
6653                                                position++;
6654                                        }
6655                                        break;
6656                                case IPS_ADTYPE_SERVERAID:
6657                                case IPS_ADTYPE_SERVERAID2:
6658                                case IPS_ADTYPE_NAVAJO:
6659                                case IPS_ADTYPE_KIOWA:
6660                                case IPS_ADTYPE_SERVERAID3L:
6661                                case IPS_ADTYPE_SERVERAID3:
6662                                case IPS_ADTYPE_SERVERAID4H:
6663                                        if (nvram->adapter_order[i] == 'A') {
6664                                                ips_shift_controllers(position,
6665                                                                      j);
6666                                                position++;
6667                                        }
6668                                        break;
6669                                default:
6670                                        break;
6671                                }
6672                        }
6673                }
6674                /* if adapter_order[0], then ordering is complete */
6675                return;
6676        }
6677        /* old bios, use older ordering */
6678        tmp = 0;
6679        for (i = position; i < ips_num_controllers; i++) {
6680                if (ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID5I2 ||
6681                    ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID5I1) {
6682                        ips_shift_controllers(position, i);
6683                        position++;
6684                        tmp = 1;
6685                }
6686        }
6687        /* if there were no 5I cards, then don't do any extra ordering */
6688        if (!tmp)
6689                return;
6690        for (i = position; i < ips_num_controllers; i++) {
6691                if (ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID4L ||
6692                    ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID4M ||
6693                    ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID4LX ||
6694                    ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID4MX) {
6695                        ips_shift_controllers(position, i);
6696                        position++;
6697                }
6698        }
6699
6700        return;
6701}
6702
6703/****************************************************************************/
6704/*                                                                          */
6705/* Routine Name: ips_register_scsi                                          */
6706/*                                                                          */
6707/* Routine Description:                                                     */
6708/*   perform any registration and setup with the scsi layer                 */
6709/****************************************************************************/
6710static int
6711ips_register_scsi(int index)
6712{
6713        struct Scsi_Host *sh;
6714        ips_ha_t *ha, *oldha = ips_ha[index];
6715        sh = scsi_host_alloc(&ips_driver_template, sizeof (ips_ha_t));
6716        if (!sh) {
6717                IPS_PRINTK(KERN_WARNING, oldha->pcidev,
6718                           "Unable to register controller with SCSI subsystem\n");
6719                return -1;
6720        }
6721        ha = IPS_HA(sh);
6722        memcpy(ha, oldha, sizeof (ips_ha_t));
6723        free_irq(oldha->pcidev->irq, oldha);
6724        /* Install the interrupt handler with the new ha */
6725        if (request_irq(ha->pcidev->irq, do_ipsintr, IRQF_SHARED, ips_name, ha)) {
6726                IPS_PRINTK(KERN_WARNING, ha->pcidev,
6727                           "Unable to install interrupt handler\n");
6728                goto err_out_sh;
6729        }
6730
6731        kfree(oldha);
6732
6733        /* Store away needed values for later use */
6734        sh->unique_id = (ha->io_addr) ? ha->io_addr : ha->mem_addr;
6735        sh->sg_tablesize = sh->hostt->sg_tablesize;
6736        sh->can_queue = sh->hostt->can_queue;
6737        sh->cmd_per_lun = sh->hostt->cmd_per_lun;
6738        sh->use_clustering = sh->hostt->use_clustering;
6739        sh->max_sectors = 128;
6740
6741        sh->max_id = ha->ntargets;
6742        sh->max_lun = ha->nlun;
6743        sh->max_channel = ha->nbus - 1;
6744        sh->can_queue = ha->max_cmds - 1;
6745
6746        if (scsi_add_host(sh, &ha->pcidev->dev))
6747                goto err_out;
6748
6749        ips_sh[index] = sh;
6750        ips_ha[index] = ha;
6751
6752        scsi_scan_host(sh);
6753
6754        return 0;
6755
6756err_out:
6757        free_irq(ha->pcidev->irq, ha);
6758err_out_sh:
6759        scsi_host_put(sh);
6760        return -1;
6761}
6762
6763/*---------------------------------------------------------------------------*/
6764/*   Routine Name: ips_remove_device                                         */
6765/*                                                                           */
6766/*   Routine Description:                                                    */
6767/*     Remove one Adapter ( Hot Plugging )                                   */
6768/*---------------------------------------------------------------------------*/
6769static void
6770ips_remove_device(struct pci_dev *pci_dev)
6771{
6772        struct Scsi_Host *sh = pci_get_drvdata(pci_dev);
6773
6774        pci_set_drvdata(pci_dev, NULL);
6775
6776        ips_release(sh);
6777
6778        pci_release_regions(pci_dev);
6779        pci_disable_device(pci_dev);
6780}
6781
6782/****************************************************************************/
6783/*                                                                          */
6784/* Routine Name: ips_module_init                                            */
6785/*                                                                          */
6786/* Routine Description:                                                     */
6787/*   function called on module load                                         */
6788/****************************************************************************/
6789static int __init
6790ips_module_init(void)
6791{
6792        if (pci_register_driver(&ips_pci_driver) < 0)
6793                return -ENODEV;
6794        ips_driver_template.module = THIS_MODULE;
6795        ips_order_controllers();
6796        if (!ips_detect(&ips_driver_template)) {
6797                pci_unregister_driver(&ips_pci_driver);
6798                return -ENODEV;
6799        }
6800        register_reboot_notifier(&ips_notifier);
6801        return 0;
6802}
6803
6804/****************************************************************************/
6805/*                                                                          */
6806/* Routine Name: ips_module_exit                                            */
6807/*                                                                          */
6808/* Routine Description:                                                     */
6809/*   function called on module unload                                       */
6810/****************************************************************************/
6811static void __exit
6812ips_module_exit(void)
6813{
6814        pci_unregister_driver(&ips_pci_driver);
6815        unregister_reboot_notifier(&ips_notifier);
6816}
6817
6818module_init(ips_module_init);
6819module_exit(ips_module_exit);
6820
6821/*---------------------------------------------------------------------------*/
6822/*   Routine Name: ips_insert_device                                         */
6823/*                                                                           */
6824/*   Routine Description:                                                    */
6825/*     Add One Adapter ( Hot Plug )                                          */
6826/*                                                                           */
6827/*   Return Value:                                                           */
6828/*     0 if Successful, else non-zero                                        */
6829/*---------------------------------------------------------------------------*/
6830static int
6831ips_insert_device(struct pci_dev *pci_dev, const struct pci_device_id *ent)
6832{
6833        int index = -1;
6834        int rc;
6835
6836        METHOD_TRACE("ips_insert_device", 1);
6837        rc = pci_enable_device(pci_dev);
6838        if (rc)
6839                return rc;
6840
6841        rc = pci_request_regions(pci_dev, "ips");
6842        if (rc)
6843                goto err_out;
6844
6845        rc = ips_init_phase1(pci_dev, &index);
6846        if (rc == SUCCESS)
6847                rc = ips_init_phase2(index);
6848
6849        if (ips_hotplug)
6850                if (ips_register_scsi(index)) {
6851                        ips_free(ips_ha[index]);
6852                        rc = -1;
6853                }
6854
6855        if (rc == SUCCESS)
6856                ips_num_controllers++;
6857
6858        ips_next_controller = ips_num_controllers;
6859
6860        if (rc < 0) {
6861                rc = -ENODEV;
6862                goto err_out_regions;
6863        }
6864
6865        pci_set_drvdata(pci_dev, ips_sh[index]);
6866        return 0;
6867
6868err_out_regions:
6869        pci_release_regions(pci_dev);
6870err_out:
6871        pci_disable_device(pci_dev);
6872        return rc;
6873}
6874
6875/*---------------------------------------------------------------------------*/
6876/*   Routine Name: ips_init_phase1                                           */
6877/*                                                                           */
6878/*   Routine Description:                                                    */
6879/*     Adapter Initialization                                                */
6880/*                                                                           */
6881/*   Return Value:                                                           */
6882/*     0 if Successful, else non-zero                                        */
6883/*---------------------------------------------------------------------------*/
6884static int
6885ips_init_phase1(struct pci_dev *pci_dev, int *indexPtr)
6886{
6887        ips_ha_t *ha;
6888        uint32_t io_addr;
6889        uint32_t mem_addr;
6890        uint32_t io_len;
6891        uint32_t mem_len;
6892        uint8_t bus;
6893        uint8_t func;
6894        int j;
6895        int index;
6896        dma_addr_t dma_address;
6897        char __iomem *ioremap_ptr;
6898        char __iomem *mem_ptr;
6899        uint32_t IsDead;
6900
6901        METHOD_TRACE("ips_init_phase1", 1);
6902        index = IPS_MAX_ADAPTERS;
6903        for (j = 0; j < IPS_MAX_ADAPTERS; j++) {
6904                if (ips_ha[j] == NULL) {
6905                        index = j;
6906                        break;
6907                }
6908        }
6909
6910        if (index >= IPS_MAX_ADAPTERS)
6911                return -1;
6912
6913        /* stuff that we get in dev */
6914        bus = pci_dev->bus->number;
6915        func = pci_dev->devfn;
6916
6917        /* Init MEM/IO addresses to 0 */
6918        mem_addr = 0;
6919        io_addr = 0;
6920        mem_len = 0;
6921        io_len = 0;
6922
6923        for (j = 0; j < 2; j++) {
6924                if (!pci_resource_start(pci_dev, j))
6925                        break;
6926
6927                if (pci_resource_flags(pci_dev, j) & IORESOURCE_IO) {
6928                        io_addr = pci_resource_start(pci_dev, j);
6929                        io_len = pci_resource_len(pci_dev, j);
6930                } else {
6931                        mem_addr = pci_resource_start(pci_dev, j);
6932                        mem_len = pci_resource_len(pci_dev, j);
6933                }
6934        }
6935
6936        /* setup memory mapped area (if applicable) */
6937        if (mem_addr) {
6938                uint32_t base;
6939                uint32_t offs;
6940
6941                base = mem_addr & PAGE_MASK;
6942                offs = mem_addr - base;
6943                ioremap_ptr = ioremap(base, PAGE_SIZE);
6944                if (!ioremap_ptr)
6945                        return -1;
6946                mem_ptr = ioremap_ptr + offs;
6947        } else {
6948                ioremap_ptr = NULL;
6949                mem_ptr = NULL;
6950        }
6951
6952        /* found a controller */
6953        ha = kzalloc(sizeof (ips_ha_t), GFP_KERNEL);
6954        if (ha == NULL) {
6955                IPS_PRINTK(KERN_WARNING, pci_dev,
6956                           "Unable to allocate temporary ha struct\n");
6957                return -1;
6958        }
6959
6960        ips_sh[index] = NULL;
6961        ips_ha[index] = ha;
6962        ha->active = 1;
6963
6964        /* Store info in HA structure */
6965        ha->io_addr = io_addr;
6966        ha->io_len = io_len;
6967        ha->mem_addr = mem_addr;
6968        ha->mem_len = mem_len;
6969        ha->mem_ptr = mem_ptr;
6970        ha->ioremap_ptr = ioremap_ptr;
6971        ha->host_num = (uint32_t) index;
6972        ha->slot_num = PCI_SLOT(pci_dev->devfn);
6973        ha->pcidev = pci_dev;
6974
6975        /*
6976         * Set the pci_dev's dma_mask.  Not all adapters support 64bit
6977         * addressing so don't enable it if the adapter can't support
6978         * it!  Also, don't use 64bit addressing if dma addresses
6979         * are guaranteed to be < 4G.
6980         */
6981        if (IPS_ENABLE_DMA64 && IPS_HAS_ENH_SGLIST(ha) &&
6982            !pci_set_dma_mask(ha->pcidev, DMA_BIT_MASK(64))) {
6983                (ha)->flags |= IPS_HA_ENH_SG;
6984        } else {
6985                if (pci_set_dma_mask(ha->pcidev, DMA_BIT_MASK(32)) != 0) {
6986                        printk(KERN_WARNING "Unable to set DMA Mask\n");
6987                        return ips_abort_init(ha, index);
6988                }
6989        }
6990        if(ips_cd_boot && !ips_FlashData){
6991                ips_FlashData = pci_alloc_consistent(pci_dev, PAGE_SIZE << 7,
6992                                                     &ips_flashbusaddr);
6993        }
6994
6995        ha->enq = pci_alloc_consistent(pci_dev, sizeof (IPS_ENQ),
6996                                       &ha->enq_busaddr);
6997        if (!ha->enq) {
6998                IPS_PRINTK(KERN_WARNING, pci_dev,
6999                           "Unable to allocate host inquiry structure\n");
7000                return ips_abort_init(ha, index);
7001        }
7002
7003        ha->adapt = pci_alloc_consistent(pci_dev, sizeof (IPS_ADAPTER) +
7004                                         sizeof (IPS_IO_CMD), &dma_address);
7005        if (!ha->adapt) {
7006                IPS_PRINTK(KERN_WARNING, pci_dev,
7007                           "Unable to allocate host adapt & dummy structures\n");
7008                return ips_abort_init(ha, index);
7009        }
7010        ha->adapt->hw_status_start = dma_address;
7011        ha->dummy = (void *) (ha->adapt + 1);
7012
7013
7014
7015        ha->logical_drive_info = pci_alloc_consistent(pci_dev, sizeof (IPS_LD_INFO), &dma_address);
7016        if (!ha->logical_drive_info) {
7017                IPS_PRINTK(KERN_WARNING, pci_dev,
7018                           "Unable to allocate logical drive info structure\n");
7019                return ips_abort_init(ha, index);
7020        }
7021        ha->logical_drive_info_dma_addr = dma_address;
7022
7023
7024        ha->conf = kmalloc(sizeof (IPS_CONF), GFP_KERNEL);
7025
7026        if (!ha->conf) {
7027                IPS_PRINTK(KERN_WARNING, pci_dev,
7028                           "Unable to allocate host conf structure\n");
7029                return ips_abort_init(ha, index);
7030        }
7031
7032        ha->nvram = kmalloc(sizeof (IPS_NVRAM_P5), GFP_KERNEL);
7033
7034        if (!ha->nvram) {
7035                IPS_PRINTK(KERN_WARNING, pci_dev,
7036                           "Unable to allocate host NVRAM structure\n");
7037                return ips_abort_init(ha, index);
7038        }
7039
7040        ha->subsys = kmalloc(sizeof (IPS_SUBSYS), GFP_KERNEL);
7041
7042        if (!ha->subsys) {
7043                IPS_PRINTK(KERN_WARNING, pci_dev,
7044                           "Unable to allocate host subsystem structure\n");
7045                return ips_abort_init(ha, index);
7046        }
7047
7048        /* the ioctl buffer is now used during adapter initialization, so its
7049         * successful allocation is now required */
7050        if (ips_ioctlsize < PAGE_SIZE)
7051                ips_ioctlsize = PAGE_SIZE;
7052
7053        ha->ioctl_data = pci_alloc_consistent(pci_dev, ips_ioctlsize,
7054                                              &ha->ioctl_busaddr);
7055        ha->ioctl_len = ips_ioctlsize;
7056        if (!ha->ioctl_data) {
7057                IPS_PRINTK(KERN_WARNING, pci_dev,
7058                           "Unable to allocate IOCTL data\n");
7059                return ips_abort_init(ha, index);
7060        }
7061
7062        /*
7063         * Setup Functions
7064         */
7065        ips_setup_funclist(ha);
7066
7067        if ((IPS_IS_MORPHEUS(ha)) || (IPS_IS_MARCO(ha))) {
7068                /* If Morpheus appears dead, reset it */
7069                IsDead = readl(ha->mem_ptr + IPS_REG_I960_MSG1);
7070                if (IsDead == 0xDEADBEEF) {
7071                        ips_reset_morpheus(ha);
7072                }
7073        }
7074
7075        /*
7076         * Initialize the card if it isn't already
7077         */
7078
7079        if (!(*ha->func.isinit) (ha)) {
7080                if (!(*ha->func.init) (ha)) {
7081                        /*
7082                         * Initialization failed
7083                         */
7084                        IPS_PRINTK(KERN_WARNING, pci_dev,
7085                                   "Unable to initialize controller\n");
7086                        return ips_abort_init(ha, index);
7087                }
7088        }
7089
7090        *indexPtr = index;
7091        return SUCCESS;
7092}
7093
7094/*---------------------------------------------------------------------------*/
7095/*   Routine Name: ips_init_phase2                                           */
7096/*                                                                           */
7097/*   Routine Description:                                                    */
7098/*     Adapter Initialization Phase 2                                        */
7099/*                                                                           */
7100/*   Return Value:                                                           */
7101/*     0 if Successful, else non-zero                                        */
7102/*---------------------------------------------------------------------------*/
7103static int
7104ips_init_phase2(int index)
7105{
7106        ips_ha_t *ha;
7107
7108        ha = ips_ha[index];
7109
7110        METHOD_TRACE("ips_init_phase2", 1);
7111        if (!ha->active) {
7112                ips_ha[index] = NULL;
7113                return -1;
7114        }
7115
7116        /* Install the interrupt handler */
7117        if (request_irq(ha->pcidev->irq, do_ipsintr, IRQF_SHARED, ips_name, ha)) {
7118                IPS_PRINTK(KERN_WARNING, ha->pcidev,
7119                           "Unable to install interrupt handler\n");
7120                return ips_abort_init(ha, index);
7121        }
7122
7123        /*
7124         * Allocate a temporary SCB for initialization
7125         */
7126        ha->max_cmds = 1;
7127        if (!ips_allocatescbs(ha)) {
7128                IPS_PRINTK(KERN_WARNING, ha->pcidev,
7129                           "Unable to allocate a CCB\n");
7130                free_irq(ha->pcidev->irq, ha);
7131                return ips_abort_init(ha, index);
7132        }
7133
7134        if (!ips_hainit(ha)) {
7135                IPS_PRINTK(KERN_WARNING, ha->pcidev,
7136                           "Unable to initialize controller\n");
7137                free_irq(ha->pcidev->irq, ha);
7138                return ips_abort_init(ha, index);
7139        }
7140        /* Free the temporary SCB */
7141        ips_deallocatescbs(ha, 1);
7142
7143        /* allocate CCBs */
7144        if (!ips_allocatescbs(ha)) {
7145                IPS_PRINTK(KERN_WARNING, ha->pcidev,
7146                           "Unable to allocate CCBs\n");
7147                free_irq(ha->pcidev->irq, ha);
7148                return ips_abort_init(ha, index);
7149        }
7150
7151        return SUCCESS;
7152}
7153
7154MODULE_LICENSE("GPL");
7155MODULE_DESCRIPTION("IBM ServeRAID Adapter Driver " IPS_VER_STRING);
7156MODULE_VERSION(IPS_VER_STRING);
7157
7158
7159/*
7160 * Overrides for Emacs so that we almost follow Linus's tabbing style.
7161 * Emacs will notice this stuff at the end of the file and automatically
7162 * adjust the settings for this buffer only.  This must remain at the end
7163 * of the file.
7164 * ---------------------------------------------------------------------------
7165 * Local variables:
7166 * c-indent-level: 2
7167 * c-brace-imaginary-offset: 0
7168 * c-brace-offset: -2
7169 * c-argdecl-indent: 2
7170 * c-label-offset: -2
7171 * c-continued-statement-offset: 2
7172 * c-continued-brace-offset: 0
7173 * indent-tabs-mode: nil
7174 * tab-width: 8
7175 * End:
7176 */
7177