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