Linux Audio

Check our new training course

Loading...
v6.9.4
   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/scsi.h>
 184#include <scsi/scsi_cmnd.h>
 185#include <scsi/scsi_device.h>
 186#include <scsi/scsi_eh.h>
 187#include <scsi/scsi_host.h>
 188#include <scsi/scsi_tcq.h>
 189#include <scsi/sg.h>
 
 
 190
 191#include "ips.h"
 192
 193#include <linux/module.h>
 194
 195#include <linux/stat.h>
 196
 197#include <linux/spinlock.h>
 198#include <linux/init.h>
 199
 200#include <linux/smp.h>
 201
 202#ifdef MODULE
 203static char *ips = NULL;
 204module_param(ips, charp, 0);
 205#endif
 206
 207/*
 208 * DRIVER_VER
 209 */
 210#define IPS_VERSION_HIGH        IPS_VER_MAJOR_STRING "." IPS_VER_MINOR_STRING
 211#define IPS_VERSION_LOW         "." IPS_VER_BUILD_STRING " "
 212
 
 
 
 
 213#define IPS_DMA_DIR(scb) ((!scb->scsi_cmd || ips_is_passthru(scb->scsi_cmd) || \
 214                         DMA_NONE == scb->scsi_cmd->sc_data_direction) ? \
 215                         DMA_BIDIRECTIONAL : \
 216                         scb->scsi_cmd->sc_data_direction)
 217
 218#ifdef IPS_DEBUG
 219#define METHOD_TRACE(s, i)    if (ips_debug >= (i+10)) printk(KERN_NOTICE s "\n");
 220#define DEBUG(i, s)           if (ips_debug >= i) printk(KERN_NOTICE s "\n");
 221#define DEBUG_VAR(i, s, v...) if (ips_debug >= i) printk(KERN_NOTICE s "\n", v);
 222#else
 223#define METHOD_TRACE(s, i)
 224#define DEBUG(i, s)
 225#define DEBUG_VAR(i, s, v...)
 226#endif
 227
 228/*
 229 * Function prototypes
 230 */
 
 
 231static int ips_eh_abort(struct scsi_cmnd *);
 232static int ips_eh_reset(struct scsi_cmnd *);
 233static int ips_queue(struct Scsi_Host *, struct scsi_cmnd *);
 234static const char *ips_info(struct Scsi_Host *);
 235static irqreturn_t do_ipsintr(int, void *);
 236static int ips_hainit(ips_ha_t *);
 237static int ips_map_status(ips_ha_t *, ips_scb_t *, ips_stat_t *);
 238static int ips_send_wait(ips_ha_t *, ips_scb_t *, int, int);
 239static int ips_send_cmd(ips_ha_t *, ips_scb_t *);
 240static int ips_online(ips_ha_t *, ips_scb_t *);
 241static int ips_inquiry(ips_ha_t *, ips_scb_t *);
 242static int ips_rdcap(ips_ha_t *, ips_scb_t *);
 243static int ips_msense(ips_ha_t *, ips_scb_t *);
 244static int ips_reqsen(ips_ha_t *, ips_scb_t *);
 245static int ips_deallocatescbs(ips_ha_t *, int);
 246static int ips_allocatescbs(ips_ha_t *);
 247static int ips_reset_copperhead(ips_ha_t *);
 248static int ips_reset_copperhead_memio(ips_ha_t *);
 249static int ips_reset_morpheus(ips_ha_t *);
 250static int ips_issue_copperhead(ips_ha_t *, ips_scb_t *);
 251static int ips_issue_copperhead_memio(ips_ha_t *, ips_scb_t *);
 252static int ips_issue_i2o(ips_ha_t *, ips_scb_t *);
 253static int ips_issue_i2o_memio(ips_ha_t *, ips_scb_t *);
 254static int ips_isintr_copperhead(ips_ha_t *);
 255static int ips_isintr_copperhead_memio(ips_ha_t *);
 256static int ips_isintr_morpheus(ips_ha_t *);
 257static int ips_wait(ips_ha_t *, int, int);
 258static int ips_write_driver_status(ips_ha_t *, int);
 259static int ips_read_adapter_status(ips_ha_t *, int);
 260static int ips_read_subsystem_parameters(ips_ha_t *, int);
 261static int ips_read_config(ips_ha_t *, int);
 262static int ips_clear_adapter(ips_ha_t *, int);
 263static int ips_readwrite_page5(ips_ha_t *, int, int);
 264static int ips_init_copperhead(ips_ha_t *);
 265static int ips_init_copperhead_memio(ips_ha_t *);
 266static int ips_init_morpheus(ips_ha_t *);
 267static int ips_isinit_copperhead(ips_ha_t *);
 268static int ips_isinit_copperhead_memio(ips_ha_t *);
 269static int ips_isinit_morpheus(ips_ha_t *);
 270static int ips_erase_bios(ips_ha_t *);
 271static int ips_program_bios(ips_ha_t *, char *, uint32_t, uint32_t);
 272static int ips_verify_bios(ips_ha_t *, char *, uint32_t, uint32_t);
 273static int ips_erase_bios_memio(ips_ha_t *);
 274static int ips_program_bios_memio(ips_ha_t *, char *, uint32_t, uint32_t);
 275static int ips_verify_bios_memio(ips_ha_t *, char *, uint32_t, uint32_t);
 276static int ips_flash_copperhead(ips_ha_t *, ips_passthru_t *, ips_scb_t *);
 277static int ips_flash_bios(ips_ha_t *, ips_passthru_t *, ips_scb_t *);
 278static int ips_flash_firmware(ips_ha_t *, ips_passthru_t *, ips_scb_t *);
 279static void ips_free_flash_copperhead(ips_ha_t * ha);
 280static void ips_get_bios_version(ips_ha_t *, int);
 281static void ips_identify_controller(ips_ha_t *);
 282static void ips_chkstatus(ips_ha_t *, IPS_STATUS *);
 283static void ips_enable_int_copperhead(ips_ha_t *);
 284static void ips_enable_int_copperhead_memio(ips_ha_t *);
 285static void ips_enable_int_morpheus(ips_ha_t *);
 286static int ips_intr_copperhead(ips_ha_t *);
 287static int ips_intr_morpheus(ips_ha_t *);
 288static void ips_next(ips_ha_t *, int);
 289static void ipsintr_blocking(ips_ha_t *, struct ips_scb *);
 290static void ipsintr_done(ips_ha_t *, struct ips_scb *);
 291static void ips_done(ips_ha_t *, ips_scb_t *);
 292static void ips_free(ips_ha_t *);
 293static void ips_init_scb(ips_ha_t *, ips_scb_t *);
 294static void ips_freescb(ips_ha_t *, ips_scb_t *);
 295static void ips_setup_funclist(ips_ha_t *);
 296static void ips_statinit(ips_ha_t *);
 297static void ips_statinit_memio(ips_ha_t *);
 298static void ips_fix_ffdc_time(ips_ha_t *, ips_scb_t *, time64_t);
 299static void ips_ffdc_reset(ips_ha_t *, int);
 300static void ips_ffdc_time(ips_ha_t *);
 301static uint32_t ips_statupd_copperhead(ips_ha_t *);
 302static uint32_t ips_statupd_copperhead_memio(ips_ha_t *);
 303static uint32_t ips_statupd_morpheus(ips_ha_t *);
 304static ips_scb_t *ips_getscb(ips_ha_t *);
 305static void ips_putq_scb_head(ips_scb_queue_t *, ips_scb_t *);
 306static void ips_putq_wait_tail(ips_wait_queue_entry_t *, struct scsi_cmnd *);
 307static void ips_putq_copp_tail(ips_copp_queue_t *,
 308				      ips_copp_wait_item_t *);
 309static ips_scb_t *ips_removeq_scb_head(ips_scb_queue_t *);
 310static ips_scb_t *ips_removeq_scb(ips_scb_queue_t *, ips_scb_t *);
 311static struct scsi_cmnd *ips_removeq_wait_head(ips_wait_queue_entry_t *);
 312static struct scsi_cmnd *ips_removeq_wait(ips_wait_queue_entry_t *,
 313					  struct scsi_cmnd *);
 314static ips_copp_wait_item_t *ips_removeq_copp(ips_copp_queue_t *,
 315						     ips_copp_wait_item_t *);
 316static ips_copp_wait_item_t *ips_removeq_copp_head(ips_copp_queue_t *);
 317
 318static int ips_is_passthru(struct scsi_cmnd *);
 319static int ips_make_passthru(ips_ha_t *, struct scsi_cmnd *, ips_scb_t *, int);
 320static int ips_usrcmd(ips_ha_t *, ips_passthru_t *, ips_scb_t *);
 321static void ips_cleanup_passthru(ips_ha_t *, ips_scb_t *);
 322static void ips_scmd_buf_write(struct scsi_cmnd * scmd, void *data,
 323			       unsigned int count);
 324static void ips_scmd_buf_read(struct scsi_cmnd * scmd, void *data,
 325			      unsigned int count);
 326
 327static int ips_write_info(struct Scsi_Host *, char *, int);
 328static int ips_show_info(struct seq_file *, struct Scsi_Host *);
 329static int ips_host_info(ips_ha_t *, struct seq_file *);
 330static int ips_abort_init(ips_ha_t * ha, int index);
 331static int ips_init_phase2(int index);
 332
 333static int ips_init_phase1(struct pci_dev *pci_dev, int *indexPtr);
 334static int ips_register_scsi(int index);
 335
 336static int  ips_poll_for_flush_complete(ips_ha_t * ha);
 337static void ips_flush_and_reset(ips_ha_t *ha);
 338
 339/*
 340 * global variables
 341 */
 342static const char ips_name[] = "ips";
 343static struct Scsi_Host *ips_sh[IPS_MAX_ADAPTERS];	/* Array of host controller structures */
 344static ips_ha_t *ips_ha[IPS_MAX_ADAPTERS];	/* Array of HA structures */
 345static unsigned int ips_next_controller;
 346static unsigned int ips_num_controllers;
 347static unsigned int ips_released_controllers;
 348static int ips_hotplug;
 349static int ips_cmd_timeout = 60;
 350static int ips_reset_timeout = 60 * 5;
 351static int ips_force_memio = 1;		/* Always use Memory Mapped I/O    */
 352static int ips_force_i2o = 1;	/* Always use I2O command delivery */
 353static int ips_ioctlsize = IPS_IOCTL_SIZE;	/* Size of the ioctl buffer        */
 354static int ips_cd_boot;			/* Booting from Manager CD         */
 355static char *ips_FlashData = NULL;	/* CD Boot - Flash Data Buffer      */
 356static dma_addr_t ips_flashbusaddr;
 357static long ips_FlashDataInUse;		/* CD Boot - Flash Data In Use Flag */
 358static uint32_t MaxLiteCmds = 32;	/* Max Active Cmds for a Lite Adapter */
 359static struct scsi_host_template ips_driver_template = {
 
 
 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	.no_write_same		= 1,
 373};
 374
 375
 376/* This table describes all ServeRAID Adapters */
 377static struct  pci_device_id  ips_pci_table[] = {
 378	{ 0x1014, 0x002E, PCI_ANY_ID, PCI_ANY_ID, 0, 0 },
 379	{ 0x1014, 0x01BD, PCI_ANY_ID, PCI_ANY_ID, 0, 0 },
 380	{ 0x9005, 0x0250, PCI_ANY_ID, PCI_ANY_ID, 0, 0 },
 381	{ 0, }
 382};
 383
 384MODULE_DEVICE_TABLE( pci, ips_pci_table );
 385
 386static char ips_hot_plug_name[] = "ips";
 387
 388static int  ips_insert_device(struct pci_dev *pci_dev, const struct pci_device_id *ent);
 389static void ips_remove_device(struct pci_dev *pci_dev);
 390
 391static struct pci_driver ips_pci_driver = {
 392	.name		= ips_hot_plug_name,
 393	.id_table	= ips_pci_table,
 394	.probe		= ips_insert_device,
 395	.remove		= ips_remove_device,
 396};
 397
 398
 399/*
 400 * Necessary forward function protoypes
 401 */
 402static int ips_halt(struct notifier_block *nb, ulong event, void *buf);
 403
 404#define MAX_ADAPTER_NAME 15
 405
 406static char ips_adapter_name[][30] = {
 407	"ServeRAID",
 408	"ServeRAID II",
 409	"ServeRAID on motherboard",
 410	"ServeRAID on motherboard",
 411	"ServeRAID 3H",
 412	"ServeRAID 3L",
 413	"ServeRAID 4H",
 414	"ServeRAID 4M",
 415	"ServeRAID 4L",
 416	"ServeRAID 4Mx",
 417	"ServeRAID 4Lx",
 418	"ServeRAID 5i",
 419	"ServeRAID 5i",
 420	"ServeRAID 6M",
 421	"ServeRAID 6i",
 422	"ServeRAID 7t",
 423	"ServeRAID 7k",
 424	"ServeRAID 7M"
 425};
 426
 427static struct notifier_block ips_notifier = {
 428	ips_halt, NULL, 0
 429};
 430
 431/*
 432 * Direction table
 433 */
 434static char ips_command_direction[] = {
 435	IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_OUT,
 436	IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_UNK,
 437	IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 438	IPS_DATA_IN, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_OUT,
 439	IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_OUT,
 440	IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_OUT,
 441	IPS_DATA_NONE, IPS_DATA_UNK, IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_IN,
 442	IPS_DATA_UNK, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_UNK,
 443	IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_NONE, IPS_DATA_UNK,
 444	IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT,
 445	IPS_DATA_OUT, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_NONE, IPS_DATA_NONE,
 446	IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT,
 447	IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_OUT,
 448	IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_NONE,
 449	IPS_DATA_UNK, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_UNK,
 450	IPS_DATA_NONE, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_UNK,
 451	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 452	IPS_DATA_OUT, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 453	IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 454	IPS_DATA_UNK, 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_NONE, IPS_DATA_NONE, IPS_DATA_UNK, IPS_DATA_IN, IPS_DATA_NONE,
 469	IPS_DATA_OUT, IPS_DATA_UNK, IPS_DATA_NONE, IPS_DATA_UNK, IPS_DATA_OUT,
 470	IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_NONE,
 471	IPS_DATA_UNK, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_IN,
 472	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 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_OUT,
 482	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 483	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 484	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 485	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK
 486};
 487
 488
 489/****************************************************************************/
 490/*                                                                          */
 491/* Routine Name: ips_setup                                                  */
 492/*                                                                          */
 493/* Routine Description:                                                     */
 494/*                                                                          */
 495/*   setup parameters to the driver                                         */
 496/*                                                                          */
 497/****************************************************************************/
 498static int
 499ips_setup(char *ips_str)
 500{
 501
 502	int i;
 503	char *key;
 504	char *value;
 505	static const IPS_OPTION options[] = {
 506		{"noi2o", &ips_force_i2o, 0},
 507		{"nommap", &ips_force_memio, 0},
 508		{"ioctlsize", &ips_ioctlsize, IPS_IOCTL_SIZE},
 509		{"cdboot", &ips_cd_boot, 0},
 510		{"maxcmds", &MaxLiteCmds, 32},
 511	};
 512
 513	/* Don't use strtok() anymore ( if 2.4 Kernel or beyond ) */
 514	/* Search for value */
 515	while ((key = strsep(&ips_str, ",."))) {
 516		if (!*key)
 517			continue;
 518		value = strchr(key, ':');
 519		if (value)
 520			*value++ = '\0';
 521		/*
 522		 * We now have key/value pairs.
 523		 * Update the variables
 524		 */
 525		for (i = 0; i < ARRAY_SIZE(options); i++) {
 526			if (strncasecmp
 527			    (key, options[i].option_name,
 528			     strlen(options[i].option_name)) == 0) {
 529				if (value)
 530					*options[i].option_flag =
 531					    simple_strtoul(value, NULL, 0);
 532				else
 533					*options[i].option_flag =
 534					    options[i].option_value;
 535				break;
 536			}
 537		}
 538	}
 539
 540	return (1);
 541}
 542
 543__setup("ips=", ips_setup);
 544
 545/****************************************************************************/
 546/*                                                                          */
 547/* Routine Name: ips_detect                                                 */
 548/*                                                                          */
 549/* Routine Description:                                                     */
 550/*                                                                          */
 551/*   Detect and initialize the driver                                       */
 552/*                                                                          */
 553/* NOTE: this routine is called under the io_request_lock spinlock          */
 554/*                                                                          */
 555/****************************************************************************/
 556static int
 557ips_detect(struct scsi_host_template * SHT)
 558{
 559	int i;
 560
 561	METHOD_TRACE("ips_detect", 1);
 562
 563#ifdef MODULE
 564	if (ips)
 565		ips_setup(ips);
 566#endif
 567
 568	for (i = 0; i < ips_num_controllers; i++) {
 569		if (ips_register_scsi(i))
 570			ips_free(ips_ha[i]);
 571		ips_released_controllers++;
 572	}
 573	ips_hotplug = 1;
 574	return (ips_num_controllers);
 575}
 576
 577/****************************************************************************/
 578/*   configure the function pointers to use the functions that will work    */
 579/*   with the found version of the adapter                                  */
 580/****************************************************************************/
 581static void
 582ips_setup_funclist(ips_ha_t * ha)
 583{
 584
 585	/*
 586	 * Setup Functions
 587	 */
 588	if (IPS_IS_MORPHEUS(ha) || IPS_IS_MARCO(ha)) {
 589		/* morpheus / marco / sebring */
 590		ha->func.isintr = ips_isintr_morpheus;
 591		ha->func.isinit = ips_isinit_morpheus;
 592		ha->func.issue = ips_issue_i2o_memio;
 593		ha->func.init = ips_init_morpheus;
 594		ha->func.statupd = ips_statupd_morpheus;
 595		ha->func.reset = ips_reset_morpheus;
 596		ha->func.intr = ips_intr_morpheus;
 597		ha->func.enableint = ips_enable_int_morpheus;
 598	} else if (IPS_USE_MEMIO(ha)) {
 599		/* copperhead w/MEMIO */
 600		ha->func.isintr = ips_isintr_copperhead_memio;
 601		ha->func.isinit = ips_isinit_copperhead_memio;
 602		ha->func.init = ips_init_copperhead_memio;
 603		ha->func.statupd = ips_statupd_copperhead_memio;
 604		ha->func.statinit = ips_statinit_memio;
 605		ha->func.reset = ips_reset_copperhead_memio;
 606		ha->func.intr = ips_intr_copperhead;
 607		ha->func.erasebios = ips_erase_bios_memio;
 608		ha->func.programbios = ips_program_bios_memio;
 609		ha->func.verifybios = ips_verify_bios_memio;
 610		ha->func.enableint = ips_enable_int_copperhead_memio;
 611		if (IPS_USE_I2O_DELIVER(ha))
 612			ha->func.issue = ips_issue_i2o_memio;
 613		else
 614			ha->func.issue = ips_issue_copperhead_memio;
 615	} else {
 616		/* copperhead */
 617		ha->func.isintr = ips_isintr_copperhead;
 618		ha->func.isinit = ips_isinit_copperhead;
 619		ha->func.init = ips_init_copperhead;
 620		ha->func.statupd = ips_statupd_copperhead;
 621		ha->func.statinit = ips_statinit;
 622		ha->func.reset = ips_reset_copperhead;
 623		ha->func.intr = ips_intr_copperhead;
 624		ha->func.erasebios = ips_erase_bios;
 625		ha->func.programbios = ips_program_bios;
 626		ha->func.verifybios = ips_verify_bios;
 627		ha->func.enableint = ips_enable_int_copperhead;
 628
 629		if (IPS_USE_I2O_DELIVER(ha))
 630			ha->func.issue = ips_issue_i2o;
 631		else
 632			ha->func.issue = ips_issue_copperhead;
 633	}
 634}
 635
 636/****************************************************************************/
 637/*                                                                          */
 638/* Routine Name: ips_release                                                */
 639/*                                                                          */
 640/* Routine Description:                                                     */
 641/*                                                                          */
 642/*   Remove a driver                                                        */
 643/*                                                                          */
 644/****************************************************************************/
 645static void ips_release(struct Scsi_Host *sh)
 
 646{
 647	ips_scb_t *scb;
 648	ips_ha_t *ha;
 649	int i;
 650
 651	METHOD_TRACE("ips_release", 1);
 652
 653	scsi_remove_host(sh);
 654
 655	for (i = 0; i < IPS_MAX_ADAPTERS && ips_sh[i] != sh; i++) ;
 656
 657	if (i == IPS_MAX_ADAPTERS) {
 658		printk(KERN_WARNING
 659		       "(%s) release, invalid Scsi_Host pointer.\n", ips_name);
 660		BUG();
 
 661	}
 662
 663	ha = IPS_HA(sh);
 664
 665	if (!ha)
 666		return;
 667
 668	/* flush the cache on the controller */
 669	scb = &ha->scbs[ha->max_cmds - 1];
 670
 671	ips_init_scb(ha, scb);
 672
 673	scb->timeout = ips_cmd_timeout;
 674	scb->cdb[0] = IPS_CMD_FLUSH;
 675
 676	scb->cmd.flush_cache.op_code = IPS_CMD_FLUSH;
 677	scb->cmd.flush_cache.command_id = IPS_COMMAND_ID(ha, scb);
 678	scb->cmd.flush_cache.state = IPS_NORM_STATE;
 679	scb->cmd.flush_cache.reserved = 0;
 680	scb->cmd.flush_cache.reserved2 = 0;
 681	scb->cmd.flush_cache.reserved3 = 0;
 682	scb->cmd.flush_cache.reserved4 = 0;
 683
 684	IPS_PRINTK(KERN_WARNING, ha->pcidev, "Flushing Cache.\n");
 685
 686	/* send command */
 687	if (ips_send_wait(ha, scb, ips_cmd_timeout, IPS_INTR_ON) == IPS_FAILURE)
 688		IPS_PRINTK(KERN_WARNING, ha->pcidev, "Incomplete Flush.\n");
 689
 690	IPS_PRINTK(KERN_WARNING, ha->pcidev, "Flushing Complete.\n");
 691
 692	ips_sh[i] = NULL;
 693	ips_ha[i] = NULL;
 694
 695	/* free extra memory */
 696	ips_free(ha);
 697
 698	/* free IRQ */
 699	free_irq(ha->pcidev->irq, ha);
 700
 701	scsi_host_put(sh);
 702
 703	ips_released_controllers++;
 
 
 704}
 705
 706/****************************************************************************/
 707/*                                                                          */
 708/* Routine Name: ips_halt                                                   */
 709/*                                                                          */
 710/* Routine Description:                                                     */
 711/*                                                                          */
 712/*   Perform cleanup when the system reboots                                */
 713/*                                                                          */
 714/****************************************************************************/
 715static int
 716ips_halt(struct notifier_block *nb, ulong event, void *buf)
 717{
 718	ips_scb_t *scb;
 719	ips_ha_t *ha;
 720	int i;
 721
 722	if ((event != SYS_RESTART) && (event != SYS_HALT) &&
 723	    (event != SYS_POWER_OFF))
 724		return (NOTIFY_DONE);
 725
 726	for (i = 0; i < ips_next_controller; i++) {
 727		ha = (ips_ha_t *) ips_ha[i];
 728
 729		if (!ha)
 730			continue;
 731
 732		if (!ha->active)
 733			continue;
 734
 735		/* flush the cache on the controller */
 736		scb = &ha->scbs[ha->max_cmds - 1];
 737
 738		ips_init_scb(ha, scb);
 739
 740		scb->timeout = ips_cmd_timeout;
 741		scb->cdb[0] = IPS_CMD_FLUSH;
 742
 743		scb->cmd.flush_cache.op_code = IPS_CMD_FLUSH;
 744		scb->cmd.flush_cache.command_id = IPS_COMMAND_ID(ha, scb);
 745		scb->cmd.flush_cache.state = IPS_NORM_STATE;
 746		scb->cmd.flush_cache.reserved = 0;
 747		scb->cmd.flush_cache.reserved2 = 0;
 748		scb->cmd.flush_cache.reserved3 = 0;
 749		scb->cmd.flush_cache.reserved4 = 0;
 750
 751		IPS_PRINTK(KERN_WARNING, ha->pcidev, "Flushing Cache.\n");
 752
 753		/* send command */
 754		if (ips_send_wait(ha, scb, ips_cmd_timeout, IPS_INTR_ON) ==
 755		    IPS_FAILURE)
 756			IPS_PRINTK(KERN_WARNING, ha->pcidev,
 757				   "Incomplete Flush.\n");
 758		else
 759			IPS_PRINTK(KERN_WARNING, ha->pcidev,
 760				   "Flushing Complete.\n");
 761	}
 762
 763	return (NOTIFY_OK);
 764}
 765
 766/****************************************************************************/
 767/*                                                                          */
 768/* Routine Name: ips_eh_abort                                               */
 769/*                                                                          */
 770/* Routine Description:                                                     */
 771/*                                                                          */
 772/*   Abort a command (using the new error code stuff)                       */
 773/* Note: this routine is called under the io_request_lock                   */
 774/****************************************************************************/
 775int ips_eh_abort(struct scsi_cmnd *SC)
 776{
 777	ips_ha_t *ha;
 778	ips_copp_wait_item_t *item;
 779	int ret;
 780	struct Scsi_Host *host;
 781
 782	METHOD_TRACE("ips_eh_abort", 1);
 783
 784	if (!SC)
 785		return (FAILED);
 786
 787	host = SC->device->host;
 788	ha = (ips_ha_t *) SC->device->host->hostdata;
 789
 790	if (!ha)
 791		return (FAILED);
 792
 793	if (!ha->active)
 794		return (FAILED);
 795
 796	spin_lock(host->host_lock);
 797
 798	/* See if the command is on the copp queue */
 799	item = ha->copp_waitlist.head;
 800	while ((item) && (item->scsi_cmd != SC))
 801		item = item->next;
 802
 803	if (item) {
 804		/* Found it */
 805		ips_removeq_copp(&ha->copp_waitlist, item);
 806		ret = (SUCCESS);
 807
 808		/* See if the command is on the wait queue */
 809	} else if (ips_removeq_wait(&ha->scb_waitlist, SC)) {
 810		/* command not sent yet */
 811		ret = (SUCCESS);
 812	} else {
 813		/* command must have already been sent */
 814		ret = (FAILED);
 815	}
 816
 817	spin_unlock(host->host_lock);
 818	return ret;
 819}
 820
 821/****************************************************************************/
 822/*                                                                          */
 823/* Routine Name: ips_eh_reset                                               */
 824/*                                                                          */
 825/* Routine Description:                                                     */
 826/*                                                                          */
 827/*   Reset the controller (with new eh error code)                          */
 828/*                                                                          */
 829/* NOTE: this routine is called under the io_request_lock spinlock          */
 830/*                                                                          */
 831/****************************************************************************/
 832static int __ips_eh_reset(struct scsi_cmnd *SC)
 833{
 834	int ret;
 835	int i;
 836	ips_ha_t *ha;
 837	ips_scb_t *scb;
 
 838
 839	METHOD_TRACE("ips_eh_reset", 1);
 840
 841#ifdef NO_IPS_RESET
 842	return (FAILED);
 843#else
 844
 845	if (!SC) {
 846		DEBUG(1, "Reset called with NULL scsi command");
 847
 848		return (FAILED);
 849	}
 850
 851	ha = (ips_ha_t *) SC->device->host->hostdata;
 852
 853	if (!ha) {
 854		DEBUG(1, "Reset called with NULL ha struct");
 855
 856		return (FAILED);
 857	}
 858
 859	if (!ha->active)
 860		return (FAILED);
 861
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 862	/* An explanation for the casual observer:                              */
 863	/* Part of the function of a RAID controller is automatic error         */
 864	/* detection and recovery.  As such, the only problem that physically   */
 865	/* resetting an adapter will ever fix is when, for some reason,         */
 866	/* the driver is not successfully communicating with the adapter.       */
 867	/* Therefore, we will attempt to flush this adapter.  If that succeeds, */
 868	/* then there's no real purpose in a physical reset. This will complete */
 869	/* much faster and avoids any problems that might be caused by a        */
 870	/* physical reset ( such as having to fail all the outstanding I/O's ). */
 871
 872	if (ha->ioctl_reset == 0) {	/* IF Not an IOCTL Requested Reset */
 873		scb = &ha->scbs[ha->max_cmds - 1];
 874
 875		ips_init_scb(ha, scb);
 876
 877		scb->timeout = ips_cmd_timeout;
 878		scb->cdb[0] = IPS_CMD_FLUSH;
 879
 880		scb->cmd.flush_cache.op_code = IPS_CMD_FLUSH;
 881		scb->cmd.flush_cache.command_id = IPS_COMMAND_ID(ha, scb);
 882		scb->cmd.flush_cache.state = IPS_NORM_STATE;
 883		scb->cmd.flush_cache.reserved = 0;
 884		scb->cmd.flush_cache.reserved2 = 0;
 885		scb->cmd.flush_cache.reserved3 = 0;
 886		scb->cmd.flush_cache.reserved4 = 0;
 887
 888		/* Attempt the flush command */
 889		ret = ips_send_wait(ha, scb, ips_cmd_timeout, IPS_INTR_IORL);
 890		if (ret == IPS_SUCCESS) {
 891			IPS_PRINTK(KERN_NOTICE, ha->pcidev,
 892				   "Reset Request - Flushed Cache\n");
 893			return (SUCCESS);
 894		}
 895	}
 896
 897	/* Either we can't communicate with the adapter or it's an IOCTL request */
 898	/* from a utility.  A physical reset is needed at this point.            */
 899
 900	ha->ioctl_reset = 0;	/* Reset the IOCTL Requested Reset Flag */
 901
 902	/*
 903	 * command must have already been sent
 904	 * reset the controller
 905	 */
 906	IPS_PRINTK(KERN_NOTICE, ha->pcidev, "Resetting controller.\n");
 907	ret = (*ha->func.reset) (ha);
 908
 909	if (!ret) {
 910		struct scsi_cmnd *scsi_cmd;
 911
 912		IPS_PRINTK(KERN_NOTICE, ha->pcidev,
 913			   "Controller reset failed - controller now offline.\n");
 914
 915		/* Now fail all of the active commands */
 916		DEBUG_VAR(1, "(%s%d) Failing active commands",
 917			  ips_name, ha->host_num);
 918
 919		while ((scb = ips_removeq_scb_head(&ha->scb_activelist))) {
 920			scb->scsi_cmd->result = DID_ERROR << 16;
 921			scsi_done(scb->scsi_cmd);
 922			ips_freescb(ha, scb);
 923		}
 924
 925		/* Now fail all of the pending commands */
 926		DEBUG_VAR(1, "(%s%d) Failing pending commands",
 927			  ips_name, ha->host_num);
 928
 929		while ((scsi_cmd = ips_removeq_wait_head(&ha->scb_waitlist))) {
 930			scsi_cmd->result = DID_ERROR;
 931			scsi_done(scsi_cmd);
 932		}
 933
 934		ha->active = false;
 935		return (FAILED);
 936	}
 937
 938	if (!ips_clear_adapter(ha, IPS_INTR_IORL)) {
 939		struct scsi_cmnd *scsi_cmd;
 940
 941		IPS_PRINTK(KERN_NOTICE, ha->pcidev,
 942			   "Controller reset failed - controller now offline.\n");
 943
 944		/* Now fail all of the active commands */
 945		DEBUG_VAR(1, "(%s%d) Failing active commands",
 946			  ips_name, ha->host_num);
 947
 948		while ((scb = ips_removeq_scb_head(&ha->scb_activelist))) {
 949			scb->scsi_cmd->result = DID_ERROR << 16;
 950			scsi_done(scb->scsi_cmd);
 951			ips_freescb(ha, scb);
 952		}
 953
 954		/* Now fail all of the pending commands */
 955		DEBUG_VAR(1, "(%s%d) Failing pending commands",
 956			  ips_name, ha->host_num);
 957
 958		while ((scsi_cmd = ips_removeq_wait_head(&ha->scb_waitlist))) {
 959			scsi_cmd->result = DID_ERROR << 16;
 960			scsi_done(scsi_cmd);
 961		}
 962
 963		ha->active = false;
 964		return (FAILED);
 965	}
 966
 967	/* FFDC */
 968	if (le32_to_cpu(ha->subsys->param[3]) & 0x300000) {
 969		ha->last_ffdc = ktime_get_real_seconds();
 
 
 
 970		ha->reset_count++;
 971		ips_ffdc_reset(ha, IPS_INTR_IORL);
 972	}
 973
 974	/* Now fail all of the active commands */
 975	DEBUG_VAR(1, "(%s%d) Failing active commands", ips_name, ha->host_num);
 976
 977	while ((scb = ips_removeq_scb_head(&ha->scb_activelist))) {
 978		scb->scsi_cmd->result = DID_RESET << 16;
 979		scsi_done(scb->scsi_cmd);
 980		ips_freescb(ha, scb);
 981	}
 982
 983	/* Reset DCDB active command bits */
 984	for (i = 1; i < ha->nbus; i++)
 985		ha->dcdb_active[i - 1] = 0;
 986
 987	/* Reset the number of active IOCTLs */
 988	ha->num_ioctl = 0;
 989
 990	ips_next(ha, IPS_INTR_IORL);
 991
 992	return (SUCCESS);
 993#endif				/* NO_IPS_RESET */
 994
 995}
 996
 997static int ips_eh_reset(struct scsi_cmnd *SC)
 998{
 999	int rc;
1000
1001	spin_lock_irq(SC->device->host->host_lock);
1002	rc = __ips_eh_reset(SC);
1003	spin_unlock_irq(SC->device->host->host_lock);
1004
1005	return rc;
1006}
1007
1008/****************************************************************************/
1009/*                                                                          */
1010/* Routine Name: ips_queue                                                  */
1011/*                                                                          */
1012/* Routine Description:                                                     */
1013/*                                                                          */
1014/*   Send a command to the controller                                       */
1015/*                                                                          */
1016/* NOTE:                                                                    */
1017/*    Linux obtains io_request_lock before calling this function            */
1018/*                                                                          */
1019/****************************************************************************/
1020static int ips_queue_lck(struct scsi_cmnd *SC)
1021{
1022	void (*done)(struct scsi_cmnd *) = scsi_done;
1023	ips_ha_t *ha;
1024	ips_passthru_t *pt;
1025
1026	METHOD_TRACE("ips_queue", 1);
1027
1028	ha = (ips_ha_t *) SC->device->host->hostdata;
1029
1030	if (!ha)
1031		goto out_error;
1032
1033	if (!ha->active)
1034		goto out_error;
1035
1036	if (ips_is_passthru(SC)) {
1037		if (ha->copp_waitlist.count == IPS_MAX_IOCTL_QUEUE) {
1038			SC->result = DID_BUS_BUSY << 16;
1039			done(SC);
1040
1041			return (0);
1042		}
1043	} else if (ha->scb_waitlist.count == IPS_MAX_QUEUE) {
1044		SC->result = DID_BUS_BUSY << 16;
1045		done(SC);
1046
1047		return (0);
1048	}
1049
 
 
1050	DEBUG_VAR(2, "(%s%d): ips_queue: cmd 0x%X (%d %d %d)",
1051		  ips_name,
1052		  ha->host_num,
1053		  SC->cmnd[0],
1054		  SC->device->channel, SC->device->id, SC->device->lun);
1055
1056	/* Check for command to initiator IDs */
1057	if ((scmd_channel(SC) > 0)
1058	    && (scmd_id(SC) == ha->ha_id[scmd_channel(SC)])) {
1059		SC->result = DID_NO_CONNECT << 16;
1060		done(SC);
1061
1062		return (0);
1063	}
1064
1065	if (ips_is_passthru(SC)) {
1066
1067		ips_copp_wait_item_t *scratch;
1068
1069		/* A Reset IOCTL is only sent by the boot CD in extreme cases.           */
1070		/* There can never be any system activity ( network or disk ), but check */
1071		/* anyway just as a good practice.                                       */
1072		pt = (ips_passthru_t *) scsi_sglist(SC);
1073		if ((pt->CoppCP.cmd.reset.op_code == IPS_CMD_RESET_CHANNEL) &&
1074		    (pt->CoppCP.cmd.reset.adapter_flag == 1)) {
1075			if (ha->scb_activelist.count != 0) {
1076				SC->result = DID_BUS_BUSY << 16;
1077				done(SC);
1078				return (0);
1079			}
1080			ha->ioctl_reset = 1;	/* This reset request is from an IOCTL */
1081			__ips_eh_reset(SC);
1082			SC->result = DID_OK << 16;
1083			scsi_done(SC);
1084			return (0);
1085		}
1086
1087		/* allocate space for the scribble */
1088		scratch = kmalloc(sizeof (ips_copp_wait_item_t), GFP_ATOMIC);
1089
1090		if (!scratch) {
1091			SC->result = DID_ERROR << 16;
1092			done(SC);
1093
1094			return (0);
1095		}
1096
1097		scratch->scsi_cmd = SC;
1098		scratch->next = NULL;
1099
1100		ips_putq_copp_tail(&ha->copp_waitlist, scratch);
1101	} else {
1102		ips_putq_wait_tail(&ha->scb_waitlist, SC);
1103	}
1104
1105	ips_next(ha, IPS_INTR_IORL);
1106
1107	return (0);
1108out_error:
1109	SC->result = DID_ERROR << 16;
1110	done(SC);
1111
1112	return (0);
1113}
1114
1115static DEF_SCSI_QCMD(ips_queue)
1116
1117/****************************************************************************/
1118/*                                                                          */
1119/* Routine Name: ips_biosparam                                              */
1120/*                                                                          */
1121/* Routine Description:                                                     */
1122/*                                                                          */
1123/*   Set bios geometry for the controller                                   */
1124/*                                                                          */
1125/****************************************************************************/
1126static int ips_biosparam(struct scsi_device *sdev, struct block_device *bdev,
1127			 sector_t capacity, int geom[])
1128{
1129	ips_ha_t *ha = (ips_ha_t *) sdev->host->hostdata;
1130	int heads;
1131	int sectors;
1132	int cylinders;
1133
1134	METHOD_TRACE("ips_biosparam", 1);
1135
1136	if (!ha)
1137		/* ?!?! host adater info invalid */
1138		return (0);
1139
1140	if (!ha->active)
1141		return (0);
1142
1143	if (!ips_read_adapter_status(ha, IPS_INTR_ON))
1144		/* ?!?! Enquiry command failed */
1145		return (0);
1146
1147	if ((capacity > 0x400000) && ((ha->enq->ucMiscFlag & 0x8) == 0)) {
1148		heads = IPS_NORM_HEADS;
1149		sectors = IPS_NORM_SECTORS;
1150	} else {
1151		heads = IPS_COMP_HEADS;
1152		sectors = IPS_COMP_SECTORS;
1153	}
1154
1155	cylinders = (unsigned long) capacity / (heads * sectors);
1156
1157	DEBUG_VAR(2, "Geometry: heads: %d, sectors: %d, cylinders: %d",
1158		  heads, sectors, cylinders);
1159
1160	geom[0] = heads;
1161	geom[1] = sectors;
1162	geom[2] = cylinders;
1163
1164	return (0);
1165}
1166
1167/****************************************************************************/
1168/*                                                                          */
1169/* Routine Name: ips_slave_configure                                        */
1170/*                                                                          */
1171/* Routine Description:                                                     */
1172/*                                                                          */
1173/*   Set queue depths on devices once scan is complete                      */
1174/*                                                                          */
1175/****************************************************************************/
1176static int
1177ips_slave_configure(struct scsi_device * SDptr)
1178{
1179	ips_ha_t *ha;
1180	int min;
1181
1182	ha = IPS_HA(SDptr->host);
1183	if (SDptr->tagged_supported && SDptr->type == TYPE_DISK) {
1184		min = ha->max_cmds / 2;
1185		if (ha->enq->ucLogDriveCount <= 2)
1186			min = ha->max_cmds - 1;
1187		scsi_change_queue_depth(SDptr, min);
1188	}
1189
1190	SDptr->skip_ms_page_8 = 1;
1191	SDptr->skip_ms_page_3f = 1;
1192	return 0;
1193}
1194
1195/****************************************************************************/
1196/*                                                                          */
1197/* Routine Name: do_ipsintr                                                 */
1198/*                                                                          */
1199/* Routine Description:                                                     */
1200/*                                                                          */
1201/*   Wrapper for the interrupt handler                                      */
1202/*                                                                          */
1203/****************************************************************************/
1204static irqreturn_t
1205do_ipsintr(int irq, void *dev_id)
1206{
1207	ips_ha_t *ha;
1208	struct Scsi_Host *host;
1209	int irqstatus;
1210
1211	METHOD_TRACE("do_ipsintr", 2);
1212
1213	ha = (ips_ha_t *) dev_id;
1214	if (!ha)
1215		return IRQ_NONE;
1216	host = ips_sh[ha->host_num];
1217	/* interrupt during initialization */
1218	if (!host) {
1219		(*ha->func.intr) (ha);
1220		return IRQ_HANDLED;
1221	}
1222
1223	spin_lock(host->host_lock);
1224
1225	if (!ha->active) {
1226		spin_unlock(host->host_lock);
1227		return IRQ_HANDLED;
1228	}
1229
1230	irqstatus = (*ha->func.intr) (ha);
1231
1232	spin_unlock(host->host_lock);
1233
1234	/* start the next command */
1235	ips_next(ha, IPS_INTR_ON);
1236	return IRQ_RETVAL(irqstatus);
1237}
1238
1239/****************************************************************************/
1240/*                                                                          */
1241/* Routine Name: ips_intr_copperhead                                        */
1242/*                                                                          */
1243/* Routine Description:                                                     */
1244/*                                                                          */
1245/*   Polling interrupt handler                                              */
1246/*                                                                          */
1247/*   ASSUMES interrupts are disabled                                        */
1248/*                                                                          */
1249/****************************************************************************/
1250int
1251ips_intr_copperhead(ips_ha_t * ha)
1252{
1253	ips_stat_t *sp;
1254	ips_scb_t *scb;
1255	IPS_STATUS cstatus;
1256	int intrstatus;
1257
1258	METHOD_TRACE("ips_intr", 2);
1259
1260	if (!ha)
1261		return 0;
1262
1263	if (!ha->active)
1264		return 0;
1265
1266	intrstatus = (*ha->func.isintr) (ha);
1267
1268	if (!intrstatus) {
1269		/*
1270		 * Unexpected/Shared interrupt
1271		 */
1272
1273		return 0;
1274	}
1275
1276	while (true) {
1277		sp = &ha->sp;
1278
1279		intrstatus = (*ha->func.isintr) (ha);
1280
1281		if (!intrstatus)
1282			break;
1283		else
1284			cstatus.value = (*ha->func.statupd) (ha);
1285
1286		if (cstatus.fields.command_id > (IPS_MAX_CMDS - 1)) {
1287			/* Spurious Interrupt ? */
1288			continue;
1289		}
1290
1291		ips_chkstatus(ha, &cstatus);
1292		scb = (ips_scb_t *) sp->scb_addr;
1293
1294		/*
1295		 * use the callback function to finish things up
1296		 * NOTE: interrupts are OFF for this
1297		 */
1298		(*scb->callback) (ha, scb);
1299	}			/* end while */
1300	return 1;
1301}
1302
1303/****************************************************************************/
1304/*                                                                          */
1305/* Routine Name: ips_intr_morpheus                                          */
1306/*                                                                          */
1307/* Routine Description:                                                     */
1308/*                                                                          */
1309/*   Polling interrupt handler                                              */
1310/*                                                                          */
1311/*   ASSUMES interrupts are disabled                                        */
1312/*                                                                          */
1313/****************************************************************************/
1314int
1315ips_intr_morpheus(ips_ha_t * ha)
1316{
1317	ips_stat_t *sp;
1318	ips_scb_t *scb;
1319	IPS_STATUS cstatus;
1320	int intrstatus;
1321
1322	METHOD_TRACE("ips_intr_morpheus", 2);
1323
1324	if (!ha)
1325		return 0;
1326
1327	if (!ha->active)
1328		return 0;
1329
1330	intrstatus = (*ha->func.isintr) (ha);
1331
1332	if (!intrstatus) {
1333		/*
1334		 * Unexpected/Shared interrupt
1335		 */
1336
1337		return 0;
1338	}
1339
1340	while (true) {
1341		sp = &ha->sp;
1342
1343		intrstatus = (*ha->func.isintr) (ha);
1344
1345		if (!intrstatus)
1346			break;
1347		else
1348			cstatus.value = (*ha->func.statupd) (ha);
1349
1350		if (cstatus.value == 0xffffffff)
1351			/* No more to process */
1352			break;
1353
1354		if (cstatus.fields.command_id > (IPS_MAX_CMDS - 1)) {
1355			IPS_PRINTK(KERN_WARNING, ha->pcidev,
1356				   "Spurious interrupt; no ccb.\n");
1357
1358			continue;
1359		}
1360
1361		ips_chkstatus(ha, &cstatus);
1362		scb = (ips_scb_t *) sp->scb_addr;
1363
1364		/*
1365		 * use the callback function to finish things up
1366		 * NOTE: interrupts are OFF for this
1367		 */
1368		(*scb->callback) (ha, scb);
1369	}			/* end while */
1370	return 1;
1371}
1372
1373/****************************************************************************/
1374/*                                                                          */
1375/* Routine Name: ips_info                                                   */
1376/*                                                                          */
1377/* Routine Description:                                                     */
1378/*                                                                          */
1379/*   Return info about the driver                                           */
1380/*                                                                          */
1381/****************************************************************************/
1382static const char *
1383ips_info(struct Scsi_Host *SH)
1384{
1385	static char buffer[256];
1386	char *bp;
1387	ips_ha_t *ha;
1388
1389	METHOD_TRACE("ips_info", 1);
1390
1391	ha = IPS_HA(SH);
1392
1393	if (!ha)
1394		return (NULL);
1395
1396	bp = &buffer[0];
1397	memset(bp, 0, sizeof (buffer));
1398
1399	sprintf(bp, "%s%s%s Build %d", "IBM PCI ServeRAID ",
1400		IPS_VERSION_HIGH, IPS_VERSION_LOW, IPS_BUILD_IDENT);
1401
1402	if (ha->ad_type > 0 && ha->ad_type <= MAX_ADAPTER_NAME) {
1403		strcat(bp, " <");
1404		strcat(bp, ips_adapter_name[ha->ad_type - 1]);
1405		strcat(bp, ">");
1406	}
1407
1408	return (bp);
1409}
1410
1411static int
1412ips_write_info(struct Scsi_Host *host, char *buffer, int length)
1413{
1414	int i;
1415	ips_ha_t *ha = NULL;
1416
1417	/* Find our host structure */
1418	for (i = 0; i < ips_next_controller; i++) {
1419		if (ips_sh[i]) {
1420			if (ips_sh[i] == host) {
1421				ha = (ips_ha_t *) ips_sh[i]->hostdata;
1422				break;
1423			}
1424		}
1425	}
1426
1427	if (!ha)
1428		return (-EINVAL);
1429
1430	return 0;
1431}
1432
1433static int
1434ips_show_info(struct seq_file *m, struct Scsi_Host *host)
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 ips_host_info(ha, m);
1453}
1454
1455/*--------------------------------------------------------------------------*/
1456/* Helper Functions                                                         */
1457/*--------------------------------------------------------------------------*/
1458
1459/****************************************************************************/
1460/*                                                                          */
1461/* Routine Name: ips_is_passthru                                            */
1462/*                                                                          */
1463/* Routine Description:                                                     */
1464/*                                                                          */
1465/*   Determine if the specified SCSI command is really a passthru command   */
1466/*                                                                          */
1467/****************************************************************************/
1468static int ips_is_passthru(struct scsi_cmnd *SC)
1469{
1470	unsigned long flags;
1471
1472	METHOD_TRACE("ips_is_passthru", 1);
1473
1474	if (!SC)
1475		return (0);
1476
1477	if ((SC->cmnd[0] == IPS_IOCTL_COMMAND) &&
1478	    (SC->device->channel == 0) &&
1479	    (SC->device->id == IPS_ADAPTER_ID) &&
1480	    (SC->device->lun == 0) && scsi_sglist(SC)) {
1481                struct scatterlist *sg = scsi_sglist(SC);
1482                char  *buffer;
1483
 
1484                /* local_irq_save() protects the KM_IRQ0 address slot.     */
1485                local_irq_save(flags);
1486		buffer = kmap_local_page(sg_page(sg)) + sg->offset;
1487		if (buffer && buffer[0] == 'C' && buffer[1] == 'O' &&
1488		    buffer[2] == 'P' && buffer[3] == 'P') {
1489			kunmap_local(buffer);
1490                        local_irq_restore(flags);
1491                        return 1;
1492                }
1493		kunmap_local(buffer);
1494                local_irq_restore(flags);
1495	}
1496	return 0;
1497}
1498
1499/****************************************************************************/
1500/*                                                                          */
1501/* Routine Name: ips_alloc_passthru_buffer                                  */
1502/*                                                                          */
1503/* Routine Description:                                                     */
1504/*   allocate a buffer large enough for the ioctl data if the ioctl buffer  */
1505/*   is too small or doesn't exist                                          */
1506/****************************************************************************/
1507static int
1508ips_alloc_passthru_buffer(ips_ha_t * ha, int length)
1509{
1510	void *bigger_buf;
1511	dma_addr_t dma_busaddr;
1512
1513	if (ha->ioctl_data && length <= ha->ioctl_len)
1514		return 0;
1515	/* there is no buffer or it's not big enough, allocate a new one */
1516	bigger_buf = dma_alloc_coherent(&ha->pcidev->dev, length, &dma_busaddr,
1517			GFP_KERNEL);
1518	if (bigger_buf) {
1519		/* free the old memory */
1520		dma_free_coherent(&ha->pcidev->dev, ha->ioctl_len,
1521				  ha->ioctl_data, ha->ioctl_busaddr);
1522		/* use the new memory */
1523		ha->ioctl_data = (char *) bigger_buf;
1524		ha->ioctl_len = length;
1525		ha->ioctl_busaddr = dma_busaddr;
1526	} else {
1527		return -1;
1528	}
1529	return 0;
1530}
1531
1532/****************************************************************************/
1533/*                                                                          */
1534/* Routine Name: ips_make_passthru                                          */
1535/*                                                                          */
1536/* Routine Description:                                                     */
1537/*                                                                          */
1538/*   Make a passthru command out of the info in the Scsi block              */
1539/*                                                                          */
1540/****************************************************************************/
1541static int
1542ips_make_passthru(ips_ha_t *ha, struct scsi_cmnd *SC, ips_scb_t *scb, int intr)
1543{
1544	ips_passthru_t *pt;
1545	int length = 0;
1546	int i, ret;
1547        struct scatterlist *sg = scsi_sglist(SC);
1548
1549	METHOD_TRACE("ips_make_passthru", 1);
1550
1551        scsi_for_each_sg(SC, sg, scsi_sg_count(SC), i)
1552		length += sg->length;
1553
1554	if (length < sizeof (ips_passthru_t)) {
1555		/* wrong size */
1556		DEBUG_VAR(1, "(%s%d) Passthru structure wrong size",
1557			  ips_name, ha->host_num);
1558		return (IPS_FAILURE);
1559	}
1560	if (ips_alloc_passthru_buffer(ha, length)) {
1561		/* allocation failure!  If ha->ioctl_data exists, use it to return
1562		   some error codes.  Return a failed command to the scsi layer. */
1563		if (ha->ioctl_data) {
1564			pt = (ips_passthru_t *) ha->ioctl_data;
1565			ips_scmd_buf_read(SC, pt, sizeof (ips_passthru_t));
1566			pt->BasicStatus = 0x0B;
1567			pt->ExtendedStatus = 0x00;
1568			ips_scmd_buf_write(SC, pt, sizeof (ips_passthru_t));
1569		}
1570		return IPS_FAILURE;
1571	}
1572	ha->ioctl_datasize = length;
1573
1574	ips_scmd_buf_read(SC, ha->ioctl_data, ha->ioctl_datasize);
1575	pt = (ips_passthru_t *) ha->ioctl_data;
1576
1577	/*
1578	 * Some notes about the passthru interface used
1579	 *
1580	 * IF the scsi op_code == 0x0d then we assume
1581	 * that the data came along with/goes with the
1582	 * packet we received from the sg driver. In this
1583	 * case the CmdBSize field of the pt structure is
1584	 * used for the size of the buffer.
1585	 */
1586
1587	switch (pt->CoppCmd) {
1588	case IPS_NUMCTRLS:
1589		memcpy(ha->ioctl_data + sizeof (ips_passthru_t),
1590		       &ips_num_controllers, sizeof (int));
1591		ips_scmd_buf_write(SC, ha->ioctl_data,
1592				   sizeof (ips_passthru_t) + sizeof (int));
1593		SC->result = DID_OK << 16;
1594
1595		return (IPS_SUCCESS_IMM);
1596
1597	case IPS_COPPUSRCMD:
1598	case IPS_COPPIOCCMD:
1599		if (SC->cmnd[0] == IPS_IOCTL_COMMAND) {
1600			if (length < (sizeof (ips_passthru_t) + pt->CmdBSize)) {
1601				/* wrong size */
1602				DEBUG_VAR(1,
1603					  "(%s%d) Passthru structure wrong size",
1604					  ips_name, ha->host_num);
1605
1606				return (IPS_FAILURE);
1607			}
1608
1609			if (ha->pcidev->device == IPS_DEVICEID_COPPERHEAD &&
1610			    pt->CoppCP.cmd.flashfw.op_code ==
1611			    IPS_CMD_RW_BIOSFW) {
1612				ret = ips_flash_copperhead(ha, pt, scb);
1613				ips_scmd_buf_write(SC, ha->ioctl_data,
1614						   sizeof (ips_passthru_t));
1615				return ret;
1616			}
1617			if (ips_usrcmd(ha, pt, scb))
1618				return (IPS_SUCCESS);
1619			else
1620				return (IPS_FAILURE);
1621		}
1622
1623		break;
1624
1625	}			/* end switch */
1626
1627	return (IPS_FAILURE);
1628}
1629
1630/****************************************************************************/
1631/* Routine Name: ips_flash_copperhead                                       */
1632/* Routine Description:                                                     */
1633/*   Flash the BIOS/FW on a Copperhead style controller                     */
1634/****************************************************************************/
1635static int
1636ips_flash_copperhead(ips_ha_t * ha, ips_passthru_t * pt, ips_scb_t * scb)
1637{
1638	int datasize;
1639
1640	/* Trombone is the only copperhead that can do packet flash, but only
1641	 * for firmware. No one said it had to make sense. */
1642	if (IPS_IS_TROMBONE(ha) && pt->CoppCP.cmd.flashfw.type == IPS_FW_IMAGE) {
1643		if (ips_usrcmd(ha, pt, scb))
1644			return IPS_SUCCESS;
1645		else
1646			return IPS_FAILURE;
1647	}
1648	pt->BasicStatus = 0x0B;
1649	pt->ExtendedStatus = 0;
1650	scb->scsi_cmd->result = DID_OK << 16;
1651	/* IF it's OK to Use the "CD BOOT" Flash Buffer, then you can     */
1652	/* avoid allocating a huge buffer per adapter ( which can fail ). */
1653	if (pt->CoppCP.cmd.flashfw.type == IPS_BIOS_IMAGE &&
1654	    pt->CoppCP.cmd.flashfw.direction == IPS_ERASE_BIOS) {
1655		pt->BasicStatus = 0;
1656		return ips_flash_bios(ha, pt, scb);
1657	} else if (pt->CoppCP.cmd.flashfw.packet_num == 0) {
1658		if (ips_FlashData && !test_and_set_bit(0, &ips_FlashDataInUse)){
1659			ha->flash_data = ips_FlashData;
1660			ha->flash_busaddr = ips_flashbusaddr;
1661			ha->flash_len = PAGE_SIZE << 7;
1662			ha->flash_datasize = 0;
1663		} else if (!ha->flash_data) {
1664			datasize = pt->CoppCP.cmd.flashfw.total_packets *
1665			    pt->CoppCP.cmd.flashfw.count;
1666			ha->flash_data = dma_alloc_coherent(&ha->pcidev->dev,
1667					datasize, &ha->flash_busaddr, GFP_KERNEL);
 
1668			if (!ha->flash_data){
1669				printk(KERN_WARNING "Unable to allocate a flash buffer\n");
1670				return IPS_FAILURE;
1671			}
1672			ha->flash_datasize = 0;
1673			ha->flash_len = datasize;
1674		} else
1675			return IPS_FAILURE;
1676	} else {
1677		if (pt->CoppCP.cmd.flashfw.count + ha->flash_datasize >
1678		    ha->flash_len) {
1679			ips_free_flash_copperhead(ha);
1680			IPS_PRINTK(KERN_WARNING, ha->pcidev,
1681				   "failed size sanity check\n");
1682			return IPS_FAILURE;
1683		}
1684	}
1685	if (!ha->flash_data)
1686		return IPS_FAILURE;
1687	pt->BasicStatus = 0;
1688	memcpy(&ha->flash_data[ha->flash_datasize], pt + 1,
1689	       pt->CoppCP.cmd.flashfw.count);
1690	ha->flash_datasize += pt->CoppCP.cmd.flashfw.count;
1691	if (pt->CoppCP.cmd.flashfw.packet_num ==
1692	    pt->CoppCP.cmd.flashfw.total_packets - 1) {
1693		if (pt->CoppCP.cmd.flashfw.type == IPS_BIOS_IMAGE)
1694			return ips_flash_bios(ha, pt, scb);
1695		else if (pt->CoppCP.cmd.flashfw.type == IPS_FW_IMAGE)
1696			return ips_flash_firmware(ha, pt, scb);
1697	}
1698	return IPS_SUCCESS_IMM;
1699}
1700
1701/****************************************************************************/
1702/* Routine Name: ips_flash_bios                                             */
1703/* Routine Description:                                                     */
1704/*   flashes the bios of a copperhead adapter                               */
1705/****************************************************************************/
1706static int
1707ips_flash_bios(ips_ha_t * ha, ips_passthru_t * pt, ips_scb_t * scb)
1708{
1709
1710	if (pt->CoppCP.cmd.flashfw.type == IPS_BIOS_IMAGE &&
1711	    pt->CoppCP.cmd.flashfw.direction == IPS_WRITE_BIOS) {
1712		if ((!ha->func.programbios) || (!ha->func.erasebios) ||
1713		    (!ha->func.verifybios))
1714			goto error;
1715		if ((*ha->func.erasebios) (ha)) {
1716			DEBUG_VAR(1,
1717				  "(%s%d) flash bios failed - unable to erase flash",
1718				  ips_name, ha->host_num);
1719			goto error;
1720		} else
1721		    if ((*ha->func.programbios) (ha,
1722						 ha->flash_data +
1723						 IPS_BIOS_HEADER,
1724						 ha->flash_datasize -
1725						 IPS_BIOS_HEADER, 0)) {
1726			DEBUG_VAR(1,
1727				  "(%s%d) flash bios failed - unable to flash",
1728				  ips_name, ha->host_num);
1729			goto error;
1730		} else
1731		    if ((*ha->func.verifybios) (ha,
1732						ha->flash_data +
1733						IPS_BIOS_HEADER,
1734						ha->flash_datasize -
1735						IPS_BIOS_HEADER, 0)) {
1736			DEBUG_VAR(1,
1737				  "(%s%d) flash bios failed - unable to verify flash",
1738				  ips_name, ha->host_num);
1739			goto error;
1740		}
1741		ips_free_flash_copperhead(ha);
1742		return IPS_SUCCESS_IMM;
1743	} else if (pt->CoppCP.cmd.flashfw.type == IPS_BIOS_IMAGE &&
1744		   pt->CoppCP.cmd.flashfw.direction == IPS_ERASE_BIOS) {
1745		if (!ha->func.erasebios)
1746			goto error;
1747		if ((*ha->func.erasebios) (ha)) {
1748			DEBUG_VAR(1,
1749				  "(%s%d) flash bios failed - unable to erase flash",
1750				  ips_name, ha->host_num);
1751			goto error;
1752		}
1753		return IPS_SUCCESS_IMM;
1754	}
1755      error:
1756	pt->BasicStatus = 0x0B;
1757	pt->ExtendedStatus = 0x00;
1758	ips_free_flash_copperhead(ha);
1759	return IPS_FAILURE;
1760}
1761
1762/****************************************************************************/
1763/*                                                                          */
1764/* Routine Name: ips_fill_scb_sg_single                                     */
1765/*                                                                          */
1766/* Routine Description:                                                     */
1767/*   Fill in a single scb sg_list element from an address                   */
1768/*   return a -1 if a breakup occurred                                      */
1769/****************************************************************************/
1770static int
1771ips_fill_scb_sg_single(ips_ha_t * ha, dma_addr_t busaddr,
1772		       ips_scb_t * scb, int indx, unsigned int e_len)
1773{
1774
1775	int ret_val = 0;
1776
1777	if ((scb->data_len + e_len) > ha->max_xfer) {
1778		e_len = ha->max_xfer - scb->data_len;
1779		scb->breakup = indx;
1780		++scb->sg_break;
1781		ret_val = -1;
1782	} else {
1783		scb->breakup = 0;
1784		scb->sg_break = 0;
1785	}
1786	if (IPS_USE_ENH_SGLIST(ha)) {
1787		scb->sg_list.enh_list[indx].address_lo =
1788		    cpu_to_le32(lower_32_bits(busaddr));
1789		scb->sg_list.enh_list[indx].address_hi =
1790		    cpu_to_le32(upper_32_bits(busaddr));
1791		scb->sg_list.enh_list[indx].length = cpu_to_le32(e_len);
1792	} else {
1793		scb->sg_list.std_list[indx].address =
1794		    cpu_to_le32(lower_32_bits(busaddr));
1795		scb->sg_list.std_list[indx].length = cpu_to_le32(e_len);
1796	}
1797
1798	++scb->sg_len;
1799	scb->data_len += e_len;
1800	return ret_val;
1801}
1802
1803/****************************************************************************/
1804/* Routine Name: ips_flash_firmware                                         */
1805/* Routine Description:                                                     */
1806/*   flashes the firmware of a copperhead adapter                           */
1807/****************************************************************************/
1808static int
1809ips_flash_firmware(ips_ha_t * ha, ips_passthru_t * pt, ips_scb_t * scb)
1810{
1811	IPS_SG_LIST sg_list;
1812	uint32_t cmd_busaddr;
1813
1814	if (pt->CoppCP.cmd.flashfw.type == IPS_FW_IMAGE &&
1815	    pt->CoppCP.cmd.flashfw.direction == IPS_WRITE_FW) {
1816		memset(&pt->CoppCP.cmd, 0, sizeof (IPS_HOST_COMMAND));
1817		pt->CoppCP.cmd.flashfw.op_code = IPS_CMD_DOWNLOAD;
1818		pt->CoppCP.cmd.flashfw.count = cpu_to_le32(ha->flash_datasize);
1819	} else {
1820		pt->BasicStatus = 0x0B;
1821		pt->ExtendedStatus = 0x00;
1822		ips_free_flash_copperhead(ha);
1823		return IPS_FAILURE;
1824	}
1825	/* Save the S/G list pointer so it doesn't get clobbered */
1826	sg_list.list = scb->sg_list.list;
1827	cmd_busaddr = scb->scb_busaddr;
1828	/* copy in the CP */
1829	memcpy(&scb->cmd, &pt->CoppCP.cmd, sizeof (IPS_IOCTL_CMD));
1830	/* FIX stuff that might be wrong */
1831	scb->sg_list.list = sg_list.list;
1832	scb->scb_busaddr = cmd_busaddr;
1833	scb->bus = scb->scsi_cmd->device->channel;
1834	scb->target_id = scb->scsi_cmd->device->id;
1835	scb->lun = scb->scsi_cmd->device->lun;
1836	scb->sg_len = 0;
1837	scb->data_len = 0;
1838	scb->flags = 0;
1839	scb->op_code = 0;
1840	scb->callback = ipsintr_done;
1841	scb->timeout = ips_cmd_timeout;
1842
1843	scb->data_len = ha->flash_datasize;
1844	scb->data_busaddr =
1845	    dma_map_single(&ha->pcidev->dev, ha->flash_data, scb->data_len,
1846			   IPS_DMA_DIR(scb));
1847	scb->flags |= IPS_SCB_MAP_SINGLE;
1848	scb->cmd.flashfw.command_id = IPS_COMMAND_ID(ha, scb);
1849	scb->cmd.flashfw.buffer_addr = cpu_to_le32(scb->data_busaddr);
1850	if (pt->TimeOut)
1851		scb->timeout = pt->TimeOut;
1852	scb->scsi_cmd->result = DID_OK << 16;
1853	return IPS_SUCCESS;
1854}
1855
1856/****************************************************************************/
1857/* Routine Name: ips_free_flash_copperhead                                  */
1858/* Routine Description:                                                     */
1859/*   release the memory resources used to hold the flash image              */
1860/****************************************************************************/
1861static void
1862ips_free_flash_copperhead(ips_ha_t * ha)
1863{
1864	if (ha->flash_data == ips_FlashData)
1865		test_and_clear_bit(0, &ips_FlashDataInUse);
1866	else if (ha->flash_data)
1867		dma_free_coherent(&ha->pcidev->dev, ha->flash_len,
1868				  ha->flash_data, ha->flash_busaddr);
1869	ha->flash_data = NULL;
1870}
1871
1872/****************************************************************************/
1873/*                                                                          */
1874/* Routine Name: ips_usrcmd                                                 */
1875/*                                                                          */
1876/* Routine Description:                                                     */
1877/*                                                                          */
1878/*   Process a user command and make it ready to send                       */
1879/*                                                                          */
1880/****************************************************************************/
1881static int
1882ips_usrcmd(ips_ha_t * ha, ips_passthru_t * pt, ips_scb_t * scb)
1883{
1884	IPS_SG_LIST sg_list;
1885	uint32_t cmd_busaddr;
1886
1887	METHOD_TRACE("ips_usrcmd", 1);
1888
1889	if ((!scb) || (!pt) || (!ha))
1890		return (0);
1891
1892	/* Save the S/G list pointer so it doesn't get clobbered */
1893	sg_list.list = scb->sg_list.list;
1894	cmd_busaddr = scb->scb_busaddr;
1895	/* copy in the CP */
1896	memcpy(&scb->cmd, &pt->CoppCP.cmd, sizeof (IPS_IOCTL_CMD));
1897	memcpy(&scb->dcdb, &pt->CoppCP.dcdb, sizeof (IPS_DCDB_TABLE));
1898
1899	/* FIX stuff that might be wrong */
1900	scb->sg_list.list = sg_list.list;
1901	scb->scb_busaddr = cmd_busaddr;
1902	scb->bus = scb->scsi_cmd->device->channel;
1903	scb->target_id = scb->scsi_cmd->device->id;
1904	scb->lun = scb->scsi_cmd->device->lun;
1905	scb->sg_len = 0;
1906	scb->data_len = 0;
1907	scb->flags = 0;
1908	scb->op_code = 0;
1909	scb->callback = ipsintr_done;
1910	scb->timeout = ips_cmd_timeout;
1911	scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
1912
1913	/* we don't support DCDB/READ/WRITE Scatter Gather */
1914	if ((scb->cmd.basic_io.op_code == IPS_CMD_READ_SG) ||
1915	    (scb->cmd.basic_io.op_code == IPS_CMD_WRITE_SG) ||
1916	    (scb->cmd.basic_io.op_code == IPS_CMD_DCDB_SG))
1917		return (0);
1918
1919	if (pt->CmdBSize) {
1920		scb->data_len = pt->CmdBSize;
1921		scb->data_busaddr = ha->ioctl_busaddr + sizeof (ips_passthru_t);
1922	} else {
1923		scb->data_busaddr = 0L;
1924	}
1925
1926	if (scb->cmd.dcdb.op_code == IPS_CMD_DCDB)
1927		scb->cmd.dcdb.dcdb_address = cpu_to_le32(scb->scb_busaddr +
1928							 (unsigned long) &scb->
1929							 dcdb -
1930							 (unsigned long) scb);
1931
1932	if (pt->CmdBSize) {
1933		if (scb->cmd.dcdb.op_code == IPS_CMD_DCDB)
1934			scb->dcdb.buffer_pointer =
1935			    cpu_to_le32(scb->data_busaddr);
1936		else
1937			scb->cmd.basic_io.sg_addr =
1938			    cpu_to_le32(scb->data_busaddr);
1939	}
1940
1941	/* set timeouts */
1942	if (pt->TimeOut) {
1943		scb->timeout = pt->TimeOut;
1944
1945		if (pt->TimeOut <= 10)
1946			scb->dcdb.cmd_attribute |= IPS_TIMEOUT10;
1947		else if (pt->TimeOut <= 60)
1948			scb->dcdb.cmd_attribute |= IPS_TIMEOUT60;
1949		else
1950			scb->dcdb.cmd_attribute |= IPS_TIMEOUT20M;
1951	}
1952
1953	/* assume success */
1954	scb->scsi_cmd->result = DID_OK << 16;
1955
1956	/* success */
1957	return (1);
1958}
1959
1960/****************************************************************************/
1961/*                                                                          */
1962/* Routine Name: ips_cleanup_passthru                                       */
1963/*                                                                          */
1964/* Routine Description:                                                     */
1965/*                                                                          */
1966/*   Cleanup after a passthru command                                       */
1967/*                                                                          */
1968/****************************************************************************/
1969static void
1970ips_cleanup_passthru(ips_ha_t * ha, ips_scb_t * scb)
1971{
1972	ips_passthru_t *pt;
1973
1974	METHOD_TRACE("ips_cleanup_passthru", 1);
1975
1976	if ((!scb) || (!scb->scsi_cmd) || (!scsi_sglist(scb->scsi_cmd))) {
1977		DEBUG_VAR(1, "(%s%d) couldn't cleanup after passthru",
1978			  ips_name, ha->host_num);
1979
1980		return;
1981	}
1982	pt = (ips_passthru_t *) ha->ioctl_data;
1983
1984	/* Copy data back to the user */
1985	if (scb->cmd.dcdb.op_code == IPS_CMD_DCDB)	/* Copy DCDB Back to Caller's Area */
1986		memcpy(&pt->CoppCP.dcdb, &scb->dcdb, sizeof (IPS_DCDB_TABLE));
1987
1988	pt->BasicStatus = scb->basic_status;
1989	pt->ExtendedStatus = scb->extended_status;
1990	pt->AdapterType = ha->ad_type;
1991
1992	if (ha->pcidev->device == IPS_DEVICEID_COPPERHEAD &&
1993	    (scb->cmd.flashfw.op_code == IPS_CMD_DOWNLOAD ||
1994	     scb->cmd.flashfw.op_code == IPS_CMD_RW_BIOSFW))
1995		ips_free_flash_copperhead(ha);
1996
1997	ips_scmd_buf_write(scb->scsi_cmd, ha->ioctl_data, ha->ioctl_datasize);
1998}
1999
2000/****************************************************************************/
2001/*                                                                          */
2002/* Routine Name: ips_host_info                                              */
2003/*                                                                          */
2004/* Routine Description:                                                     */
2005/*                                                                          */
2006/*   The passthru interface for the driver                                  */
2007/*                                                                          */
2008/****************************************************************************/
2009static int
2010ips_host_info(ips_ha_t *ha, struct seq_file *m)
2011{
2012	METHOD_TRACE("ips_host_info", 1);
2013
2014	seq_puts(m, "\nIBM ServeRAID General Information:\n\n");
2015
2016	if ((le32_to_cpu(ha->nvram->signature) == IPS_NVRAM_P5_SIG) &&
2017	    (le16_to_cpu(ha->nvram->adapter_type) != 0))
2018		seq_printf(m, "\tController Type                   : %s\n",
2019			  ips_adapter_name[ha->ad_type - 1]);
2020	else
2021		seq_puts(m, "\tController Type                   : Unknown\n");
 
2022
2023	if (ha->io_addr)
2024		seq_printf(m,
2025			  "\tIO region                         : 0x%x (%d bytes)\n",
2026			  ha->io_addr, ha->io_len);
2027
2028	if (ha->mem_addr) {
2029		seq_printf(m,
2030			  "\tMemory region                     : 0x%x (%d bytes)\n",
2031			  ha->mem_addr, ha->mem_len);
2032		seq_printf(m,
2033			  "\tShared memory address             : 0x%lx\n",
2034			  (unsigned long)ha->mem_ptr);
2035	}
2036
2037	seq_printf(m, "\tIRQ number                        : %d\n", ha->pcidev->irq);
2038
2039    /* For the Next 3 lines Check for Binary 0 at the end and don't include it if it's there. */
2040    /* That keeps everything happy for "text" operations on the proc file.                    */
2041
2042	if (le32_to_cpu(ha->nvram->signature) == IPS_NVRAM_P5_SIG) {
2043	if (ha->nvram->bios_low[3] == 0) {
2044		seq_printf(m,
2045			  "\tBIOS Version                      : %c%c%c%c%c%c%c\n",
2046			  ha->nvram->bios_high[0], ha->nvram->bios_high[1],
2047			  ha->nvram->bios_high[2], ha->nvram->bios_high[3],
2048			  ha->nvram->bios_low[0], ha->nvram->bios_low[1],
2049			  ha->nvram->bios_low[2]);
2050
2051        } else {
2052		seq_printf(m,
2053			  "\tBIOS Version                      : %c%c%c%c%c%c%c%c\n",
2054			  ha->nvram->bios_high[0], ha->nvram->bios_high[1],
2055			  ha->nvram->bios_high[2], ha->nvram->bios_high[3],
2056			  ha->nvram->bios_low[0], ha->nvram->bios_low[1],
2057			  ha->nvram->bios_low[2], ha->nvram->bios_low[3]);
2058        }
2059
2060    }
2061
2062    if (ha->enq->CodeBlkVersion[7] == 0) {
2063        seq_printf(m,
2064		  "\tFirmware Version                  : %c%c%c%c%c%c%c\n",
2065		  ha->enq->CodeBlkVersion[0], ha->enq->CodeBlkVersion[1],
2066		  ha->enq->CodeBlkVersion[2], ha->enq->CodeBlkVersion[3],
2067		  ha->enq->CodeBlkVersion[4], ha->enq->CodeBlkVersion[5],
2068		  ha->enq->CodeBlkVersion[6]);
2069    } else {
2070	seq_printf(m,
2071		  "\tFirmware Version                  : %c%c%c%c%c%c%c%c\n",
2072		  ha->enq->CodeBlkVersion[0], ha->enq->CodeBlkVersion[1],
2073		  ha->enq->CodeBlkVersion[2], ha->enq->CodeBlkVersion[3],
2074		  ha->enq->CodeBlkVersion[4], ha->enq->CodeBlkVersion[5],
2075		  ha->enq->CodeBlkVersion[6], ha->enq->CodeBlkVersion[7]);
2076    }
2077
2078    if (ha->enq->BootBlkVersion[7] == 0) {
2079        seq_printf(m,
2080		  "\tBoot Block Version                : %c%c%c%c%c%c%c\n",
2081		  ha->enq->BootBlkVersion[0], ha->enq->BootBlkVersion[1],
2082		  ha->enq->BootBlkVersion[2], ha->enq->BootBlkVersion[3],
2083		  ha->enq->BootBlkVersion[4], ha->enq->BootBlkVersion[5],
2084		  ha->enq->BootBlkVersion[6]);
2085    } else {
2086        seq_printf(m,
2087		  "\tBoot Block Version                : %c%c%c%c%c%c%c%c\n",
2088		  ha->enq->BootBlkVersion[0], ha->enq->BootBlkVersion[1],
2089		  ha->enq->BootBlkVersion[2], ha->enq->BootBlkVersion[3],
2090		  ha->enq->BootBlkVersion[4], ha->enq->BootBlkVersion[5],
2091		  ha->enq->BootBlkVersion[6], ha->enq->BootBlkVersion[7]);
2092    }
2093
2094	seq_printf(m, "\tDriver Version                    : %s%s\n",
2095		  IPS_VERSION_HIGH, IPS_VERSION_LOW);
2096
2097	seq_printf(m, "\tDriver Build                      : %d\n",
2098		  IPS_BUILD_IDENT);
2099
2100	seq_printf(m, "\tMax Physical Devices              : %d\n",
2101		  ha->enq->ucMaxPhysicalDevices);
2102	seq_printf(m, "\tMax Active Commands               : %d\n",
2103		  ha->max_cmds);
2104	seq_printf(m, "\tCurrent Queued Commands           : %d\n",
2105		  ha->scb_waitlist.count);
2106	seq_printf(m, "\tCurrent Active Commands           : %d\n",
2107		  ha->scb_activelist.count - ha->num_ioctl);
2108	seq_printf(m, "\tCurrent Queued PT Commands        : %d\n",
2109		  ha->copp_waitlist.count);
2110	seq_printf(m, "\tCurrent Active PT Commands        : %d\n",
2111		  ha->num_ioctl);
2112
2113	seq_putc(m, '\n');
2114
2115	return 0;
2116}
2117
2118/****************************************************************************/
2119/*                                                                          */
2120/* Routine Name: ips_identify_controller                                    */
2121/*                                                                          */
2122/* Routine Description:                                                     */
2123/*                                                                          */
2124/*   Identify this controller                                               */
2125/*                                                                          */
2126/****************************************************************************/
2127static void
2128ips_identify_controller(ips_ha_t * ha)
2129{
2130	METHOD_TRACE("ips_identify_controller", 1);
2131
2132	switch (ha->pcidev->device) {
2133	case IPS_DEVICEID_COPPERHEAD:
2134		if (ha->pcidev->revision <= IPS_REVID_SERVERAID) {
2135			ha->ad_type = IPS_ADTYPE_SERVERAID;
2136		} else if (ha->pcidev->revision == IPS_REVID_SERVERAID2) {
2137			ha->ad_type = IPS_ADTYPE_SERVERAID2;
2138		} else if (ha->pcidev->revision == IPS_REVID_NAVAJO) {
2139			ha->ad_type = IPS_ADTYPE_NAVAJO;
2140		} else if ((ha->pcidev->revision == IPS_REVID_SERVERAID2)
2141			   && (ha->slot_num == 0)) {
2142			ha->ad_type = IPS_ADTYPE_KIOWA;
2143		} else if ((ha->pcidev->revision >= IPS_REVID_CLARINETP1) &&
2144			   (ha->pcidev->revision <= IPS_REVID_CLARINETP3)) {
2145			if (ha->enq->ucMaxPhysicalDevices == 15)
2146				ha->ad_type = IPS_ADTYPE_SERVERAID3L;
2147			else
2148				ha->ad_type = IPS_ADTYPE_SERVERAID3;
2149		} else if ((ha->pcidev->revision >= IPS_REVID_TROMBONE32) &&
2150			   (ha->pcidev->revision <= IPS_REVID_TROMBONE64)) {
2151			ha->ad_type = IPS_ADTYPE_SERVERAID4H;
2152		}
2153		break;
2154
2155	case IPS_DEVICEID_MORPHEUS:
2156		switch (ha->pcidev->subsystem_device) {
2157		case IPS_SUBDEVICEID_4L:
2158			ha->ad_type = IPS_ADTYPE_SERVERAID4L;
2159			break;
2160
2161		case IPS_SUBDEVICEID_4M:
2162			ha->ad_type = IPS_ADTYPE_SERVERAID4M;
2163			break;
2164
2165		case IPS_SUBDEVICEID_4MX:
2166			ha->ad_type = IPS_ADTYPE_SERVERAID4MX;
2167			break;
2168
2169		case IPS_SUBDEVICEID_4LX:
2170			ha->ad_type = IPS_ADTYPE_SERVERAID4LX;
2171			break;
2172
2173		case IPS_SUBDEVICEID_5I2:
2174			ha->ad_type = IPS_ADTYPE_SERVERAID5I2;
2175			break;
2176
2177		case IPS_SUBDEVICEID_5I1:
2178			ha->ad_type = IPS_ADTYPE_SERVERAID5I1;
2179			break;
2180		}
2181
2182		break;
2183
2184	case IPS_DEVICEID_MARCO:
2185		switch (ha->pcidev->subsystem_device) {
2186		case IPS_SUBDEVICEID_6M:
2187			ha->ad_type = IPS_ADTYPE_SERVERAID6M;
2188			break;
2189		case IPS_SUBDEVICEID_6I:
2190			ha->ad_type = IPS_ADTYPE_SERVERAID6I;
2191			break;
2192		case IPS_SUBDEVICEID_7k:
2193			ha->ad_type = IPS_ADTYPE_SERVERAID7k;
2194			break;
2195		case IPS_SUBDEVICEID_7M:
2196			ha->ad_type = IPS_ADTYPE_SERVERAID7M;
2197			break;
2198		}
2199		break;
2200	}
2201}
2202
2203/****************************************************************************/
2204/*                                                                          */
2205/* Routine Name: ips_get_bios_version                                       */
2206/*                                                                          */
2207/* Routine Description:                                                     */
2208/*                                                                          */
2209/*   Get the BIOS revision number                                           */
2210/*                                                                          */
2211/****************************************************************************/
2212static void
2213ips_get_bios_version(ips_ha_t * ha, int intr)
2214{
2215	ips_scb_t *scb;
2216	int ret;
2217	uint8_t major;
2218	uint8_t minor;
2219	uint8_t subminor;
2220	uint8_t *buffer;
 
 
 
2221
2222	METHOD_TRACE("ips_get_bios_version", 1);
2223
2224	major = 0;
2225	minor = 0;
2226
2227	memcpy(ha->bios_version, "       ?", 8);
2228
2229	if (ha->pcidev->device == IPS_DEVICEID_COPPERHEAD) {
2230		if (IPS_USE_MEMIO(ha)) {
2231			/* Memory Mapped I/O */
2232
2233			/* test 1st byte */
2234			writel(0, ha->mem_ptr + IPS_REG_FLAP);
2235			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2236				udelay(25);	/* 25 us */
2237
2238			if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0x55)
2239				return;
2240
2241			writel(1, ha->mem_ptr + IPS_REG_FLAP);
2242			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2243				udelay(25);	/* 25 us */
2244
2245			if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0xAA)
2246				return;
2247
2248			/* Get Major version */
2249			writel(0x1FF, ha->mem_ptr + IPS_REG_FLAP);
2250			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2251				udelay(25);	/* 25 us */
2252
2253			major = readb(ha->mem_ptr + IPS_REG_FLDP);
2254
2255			/* Get Minor version */
2256			writel(0x1FE, ha->mem_ptr + IPS_REG_FLAP);
2257			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2258				udelay(25);	/* 25 us */
2259			minor = readb(ha->mem_ptr + IPS_REG_FLDP);
2260
2261			/* Get SubMinor version */
2262			writel(0x1FD, ha->mem_ptr + IPS_REG_FLAP);
2263			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2264				udelay(25);	/* 25 us */
2265			subminor = readb(ha->mem_ptr + IPS_REG_FLDP);
2266
2267		} else {
2268			/* Programmed I/O */
2269
2270			/* test 1st byte */
2271			outl(0, ha->io_addr + IPS_REG_FLAP);
2272			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2273				udelay(25);	/* 25 us */
2274
2275			if (inb(ha->io_addr + IPS_REG_FLDP) != 0x55)
2276				return;
2277
2278			outl(1, ha->io_addr + IPS_REG_FLAP);
2279			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2280				udelay(25);	/* 25 us */
2281
2282			if (inb(ha->io_addr + IPS_REG_FLDP) != 0xAA)
2283				return;
2284
2285			/* Get Major version */
2286			outl(0x1FF, ha->io_addr + IPS_REG_FLAP);
2287			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2288				udelay(25);	/* 25 us */
2289
2290			major = inb(ha->io_addr + IPS_REG_FLDP);
2291
2292			/* Get Minor version */
2293			outl(0x1FE, ha->io_addr + IPS_REG_FLAP);
2294			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2295				udelay(25);	/* 25 us */
2296
2297			minor = inb(ha->io_addr + IPS_REG_FLDP);
2298
2299			/* Get SubMinor version */
2300			outl(0x1FD, ha->io_addr + IPS_REG_FLAP);
2301			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2302				udelay(25);	/* 25 us */
2303
2304			subminor = inb(ha->io_addr + IPS_REG_FLDP);
2305
2306		}
2307	} else {
2308		/* Morpheus Family - Send Command to the card */
2309
2310		buffer = ha->ioctl_data;
2311
2312		memset(buffer, 0, 0x1000);
2313
2314		scb = &ha->scbs[ha->max_cmds - 1];
2315
2316		ips_init_scb(ha, scb);
2317
2318		scb->timeout = ips_cmd_timeout;
2319		scb->cdb[0] = IPS_CMD_RW_BIOSFW;
2320
2321		scb->cmd.flashfw.op_code = IPS_CMD_RW_BIOSFW;
2322		scb->cmd.flashfw.command_id = IPS_COMMAND_ID(ha, scb);
2323		scb->cmd.flashfw.type = 1;
2324		scb->cmd.flashfw.direction = 0;
2325		scb->cmd.flashfw.count = cpu_to_le32(0x800);
2326		scb->cmd.flashfw.total_packets = 1;
2327		scb->cmd.flashfw.packet_num = 0;
2328		scb->data_len = 0x1000;
2329		scb->cmd.flashfw.buffer_addr = ha->ioctl_busaddr;
2330
2331		/* issue the command */
2332		if (((ret =
2333		      ips_send_wait(ha, scb, ips_cmd_timeout,
2334				    intr)) == IPS_FAILURE)
2335		    || (ret == IPS_SUCCESS_IMM)
2336		    || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) {
2337			/* Error occurred */
2338
2339			return;
2340		}
2341
2342		if ((buffer[0xC0] == 0x55) && (buffer[0xC1] == 0xAA)) {
2343			major = buffer[0x1ff + 0xC0];	/* Offset 0x1ff after the header (0xc0) */
2344			minor = buffer[0x1fe + 0xC0];	/* Offset 0x1fe after the header (0xc0) */
2345			subminor = buffer[0x1fd + 0xC0];	/* Offset 0x1fd after the header (0xc0) */
2346		} else {
2347			return;
2348		}
2349	}
2350
2351	ha->bios_version[0] = hex_asc_upper_hi(major);
2352	ha->bios_version[1] = '.';
2353	ha->bios_version[2] = hex_asc_upper_lo(major);
2354	ha->bios_version[3] = hex_asc_upper_lo(subminor);
2355	ha->bios_version[4] = '.';
2356	ha->bios_version[5] = hex_asc_upper_hi(minor);
2357	ha->bios_version[6] = hex_asc_upper_lo(minor);
2358	ha->bios_version[7] = 0;
2359}
2360
2361/****************************************************************************/
2362/*                                                                          */
2363/* Routine Name: ips_hainit                                                 */
2364/*                                                                          */
2365/* Routine Description:                                                     */
2366/*                                                                          */
2367/*   Initialize the controller                                              */
2368/*                                                                          */
2369/* NOTE: Assumes to be called from with a lock                              */
2370/*                                                                          */
2371/****************************************************************************/
2372static int
2373ips_hainit(ips_ha_t * ha)
2374{
2375	int i;
 
2376
2377	METHOD_TRACE("ips_hainit", 1);
2378
2379	if (!ha)
2380		return (0);
2381
2382	if (ha->func.statinit)
2383		(*ha->func.statinit) (ha);
2384
2385	if (ha->func.enableint)
2386		(*ha->func.enableint) (ha);
2387
2388	/* Send FFDC */
2389	ha->reset_count = 1;
2390	ha->last_ffdc = ktime_get_real_seconds();
 
2391	ips_ffdc_reset(ha, IPS_INTR_IORL);
2392
2393	if (!ips_read_config(ha, IPS_INTR_IORL)) {
2394		IPS_PRINTK(KERN_WARNING, ha->pcidev,
2395			   "unable to read config from controller.\n");
2396
2397		return (0);
2398	}
2399	/* end if */
2400	if (!ips_read_adapter_status(ha, IPS_INTR_IORL)) {
2401		IPS_PRINTK(KERN_WARNING, ha->pcidev,
2402			   "unable to read controller status.\n");
2403
2404		return (0);
2405	}
2406
2407	/* Identify this controller */
2408	ips_identify_controller(ha);
2409
2410	if (!ips_read_subsystem_parameters(ha, IPS_INTR_IORL)) {
2411		IPS_PRINTK(KERN_WARNING, ha->pcidev,
2412			   "unable to read subsystem parameters.\n");
2413
2414		return (0);
2415	}
2416
2417	/* write nvram user page 5 */
2418	if (!ips_write_driver_status(ha, IPS_INTR_IORL)) {
2419		IPS_PRINTK(KERN_WARNING, ha->pcidev,
2420			   "unable to write driver info to controller.\n");
2421
2422		return (0);
2423	}
2424
2425	/* If there are Logical Drives and a Reset Occurred, then an EraseStripeLock is Needed */
2426	if ((ha->conf->ucLogDriveCount > 0) && (ha->requires_esl == 1))
2427		ips_clear_adapter(ha, IPS_INTR_IORL);
2428
2429	/* set limits on SID, LUN, BUS */
2430	ha->ntargets = IPS_MAX_TARGETS + 1;
2431	ha->nlun = 1;
2432	ha->nbus = (ha->enq->ucMaxPhysicalDevices / IPS_MAX_TARGETS) + 1;
2433
2434	switch (ha->conf->logical_drive[0].ucStripeSize) {
2435	case 4:
2436		ha->max_xfer = 0x10000;
2437		break;
2438
2439	case 5:
2440		ha->max_xfer = 0x20000;
2441		break;
2442
2443	case 6:
2444		ha->max_xfer = 0x40000;
2445		break;
2446
2447	case 7:
2448	default:
2449		ha->max_xfer = 0x80000;
2450		break;
2451	}
2452
2453	/* setup max concurrent commands */
2454	if (le32_to_cpu(ha->subsys->param[4]) & 0x1) {
2455		/* Use the new method */
2456		ha->max_cmds = ha->enq->ucConcurrentCmdCount;
2457	} else {
2458		/* use the old method */
2459		switch (ha->conf->logical_drive[0].ucStripeSize) {
2460		case 4:
2461			ha->max_cmds = 32;
2462			break;
2463
2464		case 5:
2465			ha->max_cmds = 16;
2466			break;
2467
2468		case 6:
2469			ha->max_cmds = 8;
2470			break;
2471
2472		case 7:
2473		default:
2474			ha->max_cmds = 4;
2475			break;
2476		}
2477	}
2478
2479	/* Limit the Active Commands on a Lite Adapter */
2480	if ((ha->ad_type == IPS_ADTYPE_SERVERAID3L) ||
2481	    (ha->ad_type == IPS_ADTYPE_SERVERAID4L) ||
2482	    (ha->ad_type == IPS_ADTYPE_SERVERAID4LX)) {
2483		if ((ha->max_cmds > MaxLiteCmds) && (MaxLiteCmds))
2484			ha->max_cmds = MaxLiteCmds;
2485	}
2486
2487	/* set controller IDs */
2488	ha->ha_id[0] = IPS_ADAPTER_ID;
2489	for (i = 1; i < ha->nbus; i++) {
2490		ha->ha_id[i] = ha->conf->init_id[i - 1] & 0x1f;
2491		ha->dcdb_active[i - 1] = 0;
2492	}
2493
2494	return (1);
2495}
2496
2497/****************************************************************************/
2498/*                                                                          */
2499/* Routine Name: ips_next                                                   */
2500/*                                                                          */
2501/* Routine Description:                                                     */
2502/*                                                                          */
2503/*   Take the next command off the queue and send it to the controller      */
2504/*                                                                          */
2505/****************************************************************************/
2506static void
2507ips_next(ips_ha_t * ha, int intr)
2508{
2509	ips_scb_t *scb;
2510	struct scsi_cmnd *SC;
2511	struct scsi_cmnd *p;
2512	struct scsi_cmnd *q;
2513	ips_copp_wait_item_t *item;
2514	int ret;
2515	struct Scsi_Host *host;
2516	METHOD_TRACE("ips_next", 1);
2517
2518	if (!ha)
2519		return;
2520	host = ips_sh[ha->host_num];
2521	/*
2522	 * Block access to the queue function so
2523	 * this command won't time out
2524	 */
2525	if (intr == IPS_INTR_ON)
2526		spin_lock(host->host_lock);
2527
2528	if ((ha->subsys->param[3] & 0x300000)
2529	    && (ha->scb_activelist.count == 0)) {
2530		time64_t now = ktime_get_real_seconds();
2531		if (now - ha->last_ffdc > IPS_SECS_8HOURS) {
2532			ha->last_ffdc = now;
 
 
 
2533			ips_ffdc_time(ha);
2534		}
2535	}
2536
2537	/*
2538	 * Send passthru commands
2539	 * These have priority over normal I/O
2540	 * but shouldn't affect performance too much
2541	 * since we limit the number that can be active
2542	 * on the card at any one time
2543	 */
2544	while ((ha->num_ioctl < IPS_MAX_IOCTL) &&
2545	       (ha->copp_waitlist.head) && (scb = ips_getscb(ha))) {
2546
2547		item = ips_removeq_copp_head(&ha->copp_waitlist);
2548		ha->num_ioctl++;
2549		if (intr == IPS_INTR_ON)
2550			spin_unlock(host->host_lock);
2551		scb->scsi_cmd = item->scsi_cmd;
2552		kfree(item);
2553
2554		ret = ips_make_passthru(ha, scb->scsi_cmd, scb, intr);
2555
2556		if (intr == IPS_INTR_ON)
2557			spin_lock(host->host_lock);
2558		switch (ret) {
2559		case IPS_FAILURE:
2560			if (scb->scsi_cmd) {
2561				scb->scsi_cmd->result = DID_ERROR << 16;
2562				scsi_done(scb->scsi_cmd);
2563			}
2564
2565			ips_freescb(ha, scb);
2566			break;
2567		case IPS_SUCCESS_IMM:
2568			if (scb->scsi_cmd) {
2569				scb->scsi_cmd->result = DID_OK << 16;
2570				scsi_done(scb->scsi_cmd);
2571			}
2572
2573			ips_freescb(ha, scb);
2574			break;
2575		default:
2576			break;
2577		}		/* end case */
2578
2579		if (ret != IPS_SUCCESS) {
2580			ha->num_ioctl--;
2581			continue;
2582		}
2583
2584		ret = ips_send_cmd(ha, scb);
2585
2586		if (ret == IPS_SUCCESS)
2587			ips_putq_scb_head(&ha->scb_activelist, scb);
2588		else
2589			ha->num_ioctl--;
2590
2591		switch (ret) {
2592		case IPS_FAILURE:
2593			if (scb->scsi_cmd) {
2594				scb->scsi_cmd->result = DID_ERROR << 16;
2595			}
2596
2597			ips_freescb(ha, scb);
2598			break;
2599		case IPS_SUCCESS_IMM:
2600			ips_freescb(ha, scb);
2601			break;
2602		default:
2603			break;
2604		}		/* end case */
2605
2606	}
2607
2608	/*
2609	 * Send "Normal" I/O commands
2610	 */
2611
2612	p = ha->scb_waitlist.head;
2613	while ((p) && (scb = ips_getscb(ha))) {
2614		if ((scmd_channel(p) > 0)
2615		    && (ha->
2616			dcdb_active[scmd_channel(p) -
2617				    1] & (1 << scmd_id(p)))) {
2618			ips_freescb(ha, scb);
2619			p = (struct scsi_cmnd *) p->host_scribble;
2620			continue;
2621		}
2622
2623		q = p;
2624		SC = ips_removeq_wait(&ha->scb_waitlist, q);
2625
2626		if (intr == IPS_INTR_ON)
2627			spin_unlock(host->host_lock);	/* Unlock HA after command is taken off queue */
2628
2629		SC->result = DID_OK;
2630		SC->host_scribble = NULL;
2631
2632		scb->target_id = SC->device->id;
2633		scb->lun = SC->device->lun;
2634		scb->bus = SC->device->channel;
2635		scb->scsi_cmd = SC;
2636		scb->breakup = 0;
2637		scb->data_len = 0;
2638		scb->callback = ipsintr_done;
2639		scb->timeout = ips_cmd_timeout;
2640		memset(&scb->cmd, 0, 16);
2641
2642		/* copy in the CDB */
2643		memcpy(scb->cdb, SC->cmnd, SC->cmd_len);
2644
2645                scb->sg_count = scsi_dma_map(SC);
2646                BUG_ON(scb->sg_count < 0);
2647		if (scb->sg_count) {
2648			struct scatterlist *sg;
2649			int i;
2650
2651			scb->flags |= IPS_SCB_MAP_SG;
2652
2653                        scsi_for_each_sg(SC, sg, scb->sg_count, i) {
2654				if (ips_fill_scb_sg_single
2655				    (ha, sg_dma_address(sg), scb, i,
2656				     sg_dma_len(sg)) < 0)
2657					break;
2658			}
2659			scb->dcdb.transfer_length = scb->data_len;
2660		} else {
2661                        scb->data_busaddr = 0L;
2662                        scb->sg_len = 0;
2663                        scb->data_len = 0;
2664                        scb->dcdb.transfer_length = 0;
2665		}
2666
2667		scb->dcdb.cmd_attribute =
2668		    ips_command_direction[scb->scsi_cmd->cmnd[0]];
2669
2670		/* Allow a WRITE BUFFER Command to Have no Data */
2671		/* This is Used by Tape Flash Utilites          */
2672		if ((scb->scsi_cmd->cmnd[0] == WRITE_BUFFER) &&
2673				(scb->data_len == 0))
2674			scb->dcdb.cmd_attribute = 0;
2675
2676		if (!(scb->dcdb.cmd_attribute & 0x3))
2677			scb->dcdb.transfer_length = 0;
2678
2679		if (scb->data_len >= IPS_MAX_XFER) {
2680			scb->dcdb.cmd_attribute |= IPS_TRANSFER64K;
2681			scb->dcdb.transfer_length = 0;
2682		}
2683		if (intr == IPS_INTR_ON)
2684			spin_lock(host->host_lock);
2685
2686		ret = ips_send_cmd(ha, scb);
2687
2688		switch (ret) {
2689		case IPS_SUCCESS:
2690			ips_putq_scb_head(&ha->scb_activelist, scb);
2691			break;
2692		case IPS_FAILURE:
2693			if (scb->scsi_cmd) {
2694				scb->scsi_cmd->result = DID_ERROR << 16;
2695				scsi_done(scb->scsi_cmd);
2696			}
2697
2698			if (scb->bus)
2699				ha->dcdb_active[scb->bus - 1] &=
2700				    ~(1 << scb->target_id);
2701
2702			ips_freescb(ha, scb);
2703			break;
2704		case IPS_SUCCESS_IMM:
2705			if (scb->scsi_cmd)
2706				scsi_done(scb->scsi_cmd);
2707
2708			if (scb->bus)
2709				ha->dcdb_active[scb->bus - 1] &=
2710				    ~(1 << scb->target_id);
2711
2712			ips_freescb(ha, scb);
2713			break;
2714		default:
2715			break;
2716		}		/* end case */
2717
2718		p = (struct scsi_cmnd *) p->host_scribble;
2719
2720	}			/* end while */
2721
2722	if (intr == IPS_INTR_ON)
2723		spin_unlock(host->host_lock);
2724}
2725
2726/****************************************************************************/
2727/*                                                                          */
2728/* Routine Name: ips_putq_scb_head                                          */
2729/*                                                                          */
2730/* Routine Description:                                                     */
2731/*                                                                          */
2732/*   Add an item to the head of the queue                                   */
2733/*                                                                          */
2734/* ASSUMED to be called from within the HA lock                             */
2735/*                                                                          */
2736/****************************************************************************/
2737static void
2738ips_putq_scb_head(ips_scb_queue_t * queue, ips_scb_t * item)
2739{
2740	METHOD_TRACE("ips_putq_scb_head", 1);
2741
2742	if (!item)
2743		return;
2744
2745	item->q_next = queue->head;
2746	queue->head = item;
2747
2748	if (!queue->tail)
2749		queue->tail = item;
2750
2751	queue->count++;
2752}
2753
2754/****************************************************************************/
2755/*                                                                          */
2756/* Routine Name: ips_removeq_scb_head                                       */
2757/*                                                                          */
2758/* Routine Description:                                                     */
2759/*                                                                          */
2760/*   Remove the head of the queue                                           */
2761/*                                                                          */
2762/* ASSUMED to be called from within the HA lock                             */
2763/*                                                                          */
2764/****************************************************************************/
2765static ips_scb_t *
2766ips_removeq_scb_head(ips_scb_queue_t * queue)
2767{
2768	ips_scb_t *item;
2769
2770	METHOD_TRACE("ips_removeq_scb_head", 1);
2771
2772	item = queue->head;
2773
2774	if (!item) {
2775		return (NULL);
2776	}
2777
2778	queue->head = item->q_next;
2779	item->q_next = NULL;
2780
2781	if (queue->tail == item)
2782		queue->tail = NULL;
2783
2784	queue->count--;
2785
2786	return (item);
2787}
2788
2789/****************************************************************************/
2790/*                                                                          */
2791/* Routine Name: ips_removeq_scb                                            */
2792/*                                                                          */
2793/* Routine Description:                                                     */
2794/*                                                                          */
2795/*   Remove an item from a queue                                            */
2796/*                                                                          */
2797/* ASSUMED to be called from within the HA lock                             */
2798/*                                                                          */
2799/****************************************************************************/
2800static ips_scb_t *
2801ips_removeq_scb(ips_scb_queue_t * queue, ips_scb_t * item)
2802{
2803	ips_scb_t *p;
2804
2805	METHOD_TRACE("ips_removeq_scb", 1);
2806
2807	if (!item)
2808		return (NULL);
2809
2810	if (item == queue->head) {
2811		return (ips_removeq_scb_head(queue));
2812	}
2813
2814	p = queue->head;
2815
2816	while ((p) && (item != p->q_next))
2817		p = p->q_next;
2818
2819	if (p) {
2820		/* found a match */
2821		p->q_next = item->q_next;
2822
2823		if (!item->q_next)
2824			queue->tail = p;
2825
2826		item->q_next = NULL;
2827		queue->count--;
2828
2829		return (item);
2830	}
2831
2832	return (NULL);
2833}
2834
2835/****************************************************************************/
2836/*                                                                          */
2837/* Routine Name: ips_putq_wait_tail                                         */
2838/*                                                                          */
2839/* Routine Description:                                                     */
2840/*                                                                          */
2841/*   Add an item to the tail of the queue                                   */
2842/*                                                                          */
2843/* ASSUMED to be called from within the HA lock                             */
2844/*                                                                          */
2845/****************************************************************************/
2846static void ips_putq_wait_tail(ips_wait_queue_entry_t *queue, struct scsi_cmnd *item)
2847{
2848	METHOD_TRACE("ips_putq_wait_tail", 1);
2849
2850	if (!item)
2851		return;
2852
2853	item->host_scribble = NULL;
2854
2855	if (queue->tail)
2856		queue->tail->host_scribble = (char *) item;
2857
2858	queue->tail = item;
2859
2860	if (!queue->head)
2861		queue->head = item;
2862
2863	queue->count++;
2864}
2865
2866/****************************************************************************/
2867/*                                                                          */
2868/* Routine Name: ips_removeq_wait_head                                      */
2869/*                                                                          */
2870/* Routine Description:                                                     */
2871/*                                                                          */
2872/*   Remove the head of the queue                                           */
2873/*                                                                          */
2874/* ASSUMED to be called from within the HA lock                             */
2875/*                                                                          */
2876/****************************************************************************/
2877static struct scsi_cmnd *ips_removeq_wait_head(ips_wait_queue_entry_t *queue)
2878{
2879	struct scsi_cmnd *item;
2880
2881	METHOD_TRACE("ips_removeq_wait_head", 1);
2882
2883	item = queue->head;
2884
2885	if (!item) {
2886		return (NULL);
2887	}
2888
2889	queue->head = (struct scsi_cmnd *) item->host_scribble;
2890	item->host_scribble = NULL;
2891
2892	if (queue->tail == item)
2893		queue->tail = NULL;
2894
2895	queue->count--;
2896
2897	return (item);
2898}
2899
2900/****************************************************************************/
2901/*                                                                          */
2902/* Routine Name: ips_removeq_wait                                           */
2903/*                                                                          */
2904/* Routine Description:                                                     */
2905/*                                                                          */
2906/*   Remove an item from a queue                                            */
2907/*                                                                          */
2908/* ASSUMED to be called from within the HA lock                             */
2909/*                                                                          */
2910/****************************************************************************/
2911static struct scsi_cmnd *ips_removeq_wait(ips_wait_queue_entry_t *queue,
2912					  struct scsi_cmnd *item)
2913{
2914	struct scsi_cmnd *p;
2915
2916	METHOD_TRACE("ips_removeq_wait", 1);
2917
2918	if (!item)
2919		return (NULL);
2920
2921	if (item == queue->head) {
2922		return (ips_removeq_wait_head(queue));
2923	}
2924
2925	p = queue->head;
2926
2927	while ((p) && (item != (struct scsi_cmnd *) p->host_scribble))
2928		p = (struct scsi_cmnd *) p->host_scribble;
2929
2930	if (p) {
2931		/* found a match */
2932		p->host_scribble = item->host_scribble;
2933
2934		if (!item->host_scribble)
2935			queue->tail = p;
2936
2937		item->host_scribble = NULL;
2938		queue->count--;
2939
2940		return (item);
2941	}
2942
2943	return (NULL);
2944}
2945
2946/****************************************************************************/
2947/*                                                                          */
2948/* Routine Name: ips_putq_copp_tail                                         */
2949/*                                                                          */
2950/* Routine Description:                                                     */
2951/*                                                                          */
2952/*   Add an item to the tail of the queue                                   */
2953/*                                                                          */
2954/* ASSUMED to be called from within the HA lock                             */
2955/*                                                                          */
2956/****************************************************************************/
2957static void
2958ips_putq_copp_tail(ips_copp_queue_t * queue, ips_copp_wait_item_t * item)
2959{
2960	METHOD_TRACE("ips_putq_copp_tail", 1);
2961
2962	if (!item)
2963		return;
2964
2965	item->next = NULL;
2966
2967	if (queue->tail)
2968		queue->tail->next = item;
2969
2970	queue->tail = item;
2971
2972	if (!queue->head)
2973		queue->head = item;
2974
2975	queue->count++;
2976}
2977
2978/****************************************************************************/
2979/*                                                                          */
2980/* Routine Name: ips_removeq_copp_head                                      */
2981/*                                                                          */
2982/* Routine Description:                                                     */
2983/*                                                                          */
2984/*   Remove the head of the queue                                           */
2985/*                                                                          */
2986/* ASSUMED to be called from within the HA lock                             */
2987/*                                                                          */
2988/****************************************************************************/
2989static ips_copp_wait_item_t *
2990ips_removeq_copp_head(ips_copp_queue_t * queue)
2991{
2992	ips_copp_wait_item_t *item;
2993
2994	METHOD_TRACE("ips_removeq_copp_head", 1);
2995
2996	item = queue->head;
2997
2998	if (!item) {
2999		return (NULL);
3000	}
3001
3002	queue->head = item->next;
3003	item->next = NULL;
3004
3005	if (queue->tail == item)
3006		queue->tail = NULL;
3007
3008	queue->count--;
3009
3010	return (item);
3011}
3012
3013/****************************************************************************/
3014/*                                                                          */
3015/* Routine Name: ips_removeq_copp                                           */
3016/*                                                                          */
3017/* Routine Description:                                                     */
3018/*                                                                          */
3019/*   Remove an item from a queue                                            */
3020/*                                                                          */
3021/* ASSUMED to be called from within the HA lock                             */
3022/*                                                                          */
3023/****************************************************************************/
3024static ips_copp_wait_item_t *
3025ips_removeq_copp(ips_copp_queue_t * queue, ips_copp_wait_item_t * item)
3026{
3027	ips_copp_wait_item_t *p;
3028
3029	METHOD_TRACE("ips_removeq_copp", 1);
3030
3031	if (!item)
3032		return (NULL);
3033
3034	if (item == queue->head) {
3035		return (ips_removeq_copp_head(queue));
3036	}
3037
3038	p = queue->head;
3039
3040	while ((p) && (item != p->next))
3041		p = p->next;
3042
3043	if (p) {
3044		/* found a match */
3045		p->next = item->next;
3046
3047		if (!item->next)
3048			queue->tail = p;
3049
3050		item->next = NULL;
3051		queue->count--;
3052
3053		return (item);
3054	}
3055
3056	return (NULL);
3057}
3058
3059/****************************************************************************/
3060/*                                                                          */
3061/* Routine Name: ipsintr_blocking                                           */
3062/*                                                                          */
3063/* Routine Description:                                                     */
3064/*                                                                          */
3065/*   Finalize an interrupt for internal commands                            */
3066/*                                                                          */
3067/****************************************************************************/
3068static void
3069ipsintr_blocking(ips_ha_t * ha, ips_scb_t * scb)
3070{
3071	METHOD_TRACE("ipsintr_blocking", 2);
3072
3073	ips_freescb(ha, scb);
3074	if (ha->waitflag && ha->cmd_in_progress == scb->cdb[0]) {
3075		ha->waitflag = false;
3076
3077		return;
3078	}
3079}
3080
3081/****************************************************************************/
3082/*                                                                          */
3083/* Routine Name: ipsintr_done                                               */
3084/*                                                                          */
3085/* Routine Description:                                                     */
3086/*                                                                          */
3087/*   Finalize an interrupt for non-internal commands                        */
3088/*                                                                          */
3089/****************************************************************************/
3090static void
3091ipsintr_done(ips_ha_t * ha, ips_scb_t * scb)
3092{
3093	METHOD_TRACE("ipsintr_done", 2);
3094
3095	if (!scb) {
3096		IPS_PRINTK(KERN_WARNING, ha->pcidev,
3097			   "Spurious interrupt; scb NULL.\n");
3098
3099		return;
3100	}
3101
3102	if (scb->scsi_cmd == NULL) {
3103		/* unexpected interrupt */
3104		IPS_PRINTK(KERN_WARNING, ha->pcidev,
3105			   "Spurious interrupt; scsi_cmd not set.\n");
3106
3107		return;
3108	}
3109
3110	ips_done(ha, scb);
3111}
3112
3113/****************************************************************************/
3114/*                                                                          */
3115/* Routine Name: ips_done                                                   */
3116/*                                                                          */
3117/* Routine Description:                                                     */
3118/*                                                                          */
3119/*   Do housekeeping on completed commands                                  */
3120/*  ASSUMED to be called form within the request lock                       */
3121/****************************************************************************/
3122static void
3123ips_done(ips_ha_t * ha, ips_scb_t * scb)
3124{
3125	int ret;
3126
3127	METHOD_TRACE("ips_done", 1);
3128
3129	if (!scb)
3130		return;
3131
3132	if ((scb->scsi_cmd) && (ips_is_passthru(scb->scsi_cmd))) {
3133		ips_cleanup_passthru(ha, scb);
3134		ha->num_ioctl--;
3135	} else {
3136		/*
3137		 * Check to see if this command had too much
3138		 * data and had to be broke up.  If so, queue
3139		 * the rest of the data and continue.
3140		 */
3141		if ((scb->breakup) || (scb->sg_break)) {
3142                        struct scatterlist *sg;
3143                        int i, sg_dma_index, ips_sg_index = 0;
3144
3145			/* we had a data breakup */
3146			scb->data_len = 0;
3147
3148                        sg = scsi_sglist(scb->scsi_cmd);
3149
3150                        /* Spin forward to last dma chunk */
3151                        sg_dma_index = scb->breakup;
3152                        for (i = 0; i < scb->breakup; i++)
3153                                sg = sg_next(sg);
3154
3155			/* Take care of possible partial on last chunk */
3156                        ips_fill_scb_sg_single(ha,
3157                                               sg_dma_address(sg),
3158                                               scb, ips_sg_index++,
3159                                               sg_dma_len(sg));
3160
3161                        for (; sg_dma_index < scsi_sg_count(scb->scsi_cmd);
3162                             sg_dma_index++, sg = sg_next(sg)) {
3163                                if (ips_fill_scb_sg_single
3164                                    (ha,
3165                                     sg_dma_address(sg),
3166                                     scb, ips_sg_index++,
3167                                     sg_dma_len(sg)) < 0)
3168                                        break;
3169                        }
3170
3171			scb->dcdb.transfer_length = scb->data_len;
3172			scb->dcdb.cmd_attribute |=
3173			    ips_command_direction[scb->scsi_cmd->cmnd[0]];
3174
3175			if (!(scb->dcdb.cmd_attribute & 0x3))
3176				scb->dcdb.transfer_length = 0;
3177
3178			if (scb->data_len >= IPS_MAX_XFER) {
3179				scb->dcdb.cmd_attribute |= IPS_TRANSFER64K;
3180				scb->dcdb.transfer_length = 0;
3181			}
3182
3183			ret = ips_send_cmd(ha, scb);
3184
3185			switch (ret) {
3186			case IPS_FAILURE:
3187				if (scb->scsi_cmd) {
3188					scb->scsi_cmd->result = DID_ERROR << 16;
3189					scsi_done(scb->scsi_cmd);
3190				}
3191
3192				ips_freescb(ha, scb);
3193				break;
3194			case IPS_SUCCESS_IMM:
3195				if (scb->scsi_cmd) {
3196					scb->scsi_cmd->result = DID_ERROR << 16;
3197					scsi_done(scb->scsi_cmd);
3198				}
3199
3200				ips_freescb(ha, scb);
3201				break;
3202			default:
3203				break;
3204			}	/* end case */
3205
3206			return;
3207		}
3208	}			/* end if passthru */
3209
3210	if (scb->bus) {
3211		ha->dcdb_active[scb->bus - 1] &= ~(1 << scb->target_id);
3212	}
3213
3214	scsi_done(scb->scsi_cmd);
3215
3216	ips_freescb(ha, scb);
3217}
3218
3219/****************************************************************************/
3220/*                                                                          */
3221/* Routine Name: ips_map_status                                             */
3222/*                                                                          */
3223/* Routine Description:                                                     */
3224/*                                                                          */
3225/*   Map Controller Error codes to Linux Error Codes                        */
3226/*                                                                          */
3227/****************************************************************************/
3228static int
3229ips_map_status(ips_ha_t * ha, ips_scb_t * scb, ips_stat_t * sp)
3230{
3231	int errcode;
3232	int device_error;
3233	uint32_t transfer_len;
3234	IPS_DCDB_TABLE_TAPE *tapeDCDB;
3235	IPS_SCSI_INQ_DATA inquiryData;
3236
3237	METHOD_TRACE("ips_map_status", 1);
3238
3239	if (scb->bus) {
3240		DEBUG_VAR(2,
3241			  "(%s%d) Physical device error (%d %d %d): %x %x, Sense Key: %x, ASC: %x, ASCQ: %x",
3242			  ips_name, ha->host_num,
3243			  scb->scsi_cmd->device->channel,
3244			  scb->scsi_cmd->device->id, scb->scsi_cmd->device->lun,
3245			  scb->basic_status, scb->extended_status,
3246			  scb->extended_status ==
3247			  IPS_ERR_CKCOND ? scb->dcdb.sense_info[2] & 0xf : 0,
3248			  scb->extended_status ==
3249			  IPS_ERR_CKCOND ? scb->dcdb.sense_info[12] : 0,
3250			  scb->extended_status ==
3251			  IPS_ERR_CKCOND ? scb->dcdb.sense_info[13] : 0);
3252	}
3253
3254	/* default driver error */
3255	errcode = DID_ERROR;
3256	device_error = 0;
3257
3258	switch (scb->basic_status & IPS_GSC_STATUS_MASK) {
3259	case IPS_CMD_TIMEOUT:
3260		errcode = DID_TIME_OUT;
3261		break;
3262
3263	case IPS_INVAL_OPCO:
3264	case IPS_INVAL_CMD_BLK:
3265	case IPS_INVAL_PARM_BLK:
3266	case IPS_LD_ERROR:
3267	case IPS_CMD_CMPLT_WERROR:
3268		break;
3269
3270	case IPS_PHYS_DRV_ERROR:
3271		switch (scb->extended_status) {
3272		case IPS_ERR_SEL_TO:
3273			if (scb->bus)
3274				errcode = DID_NO_CONNECT;
3275
3276			break;
3277
3278		case IPS_ERR_OU_RUN:
3279			if ((scb->cmd.dcdb.op_code == IPS_CMD_EXTENDED_DCDB) ||
3280			    (scb->cmd.dcdb.op_code ==
3281			     IPS_CMD_EXTENDED_DCDB_SG)) {
3282				tapeDCDB = (IPS_DCDB_TABLE_TAPE *) & scb->dcdb;
3283				transfer_len = tapeDCDB->transfer_length;
3284			} else {
3285				transfer_len =
3286				    (uint32_t) scb->dcdb.transfer_length;
3287			}
3288
3289			if ((scb->bus) && (transfer_len < scb->data_len)) {
3290				/* Underrun - set default to no error */
3291				errcode = DID_OK;
3292
3293				/* Restrict access to physical DASD */
3294				if (scb->scsi_cmd->cmnd[0] == INQUIRY) {
3295				    ips_scmd_buf_read(scb->scsi_cmd,
3296                                      &inquiryData, sizeof (inquiryData));
3297 				    if ((inquiryData.DeviceType & 0x1f) == TYPE_DISK) {
3298				        errcode = DID_TIME_OUT;
3299				        break;
3300				    }
3301				}
3302			} else
3303				errcode = DID_ERROR;
3304
3305			break;
3306
3307		case IPS_ERR_RECOVERY:
3308			/* don't fail recovered errors */
3309			if (scb->bus)
3310				errcode = DID_OK;
3311
3312			break;
3313
3314		case IPS_ERR_HOST_RESET:
3315		case IPS_ERR_DEV_RESET:
3316			errcode = DID_RESET;
3317			break;
3318
3319		case IPS_ERR_CKCOND:
3320			if (scb->bus) {
3321				if ((scb->cmd.dcdb.op_code ==
3322				     IPS_CMD_EXTENDED_DCDB)
3323				    || (scb->cmd.dcdb.op_code ==
3324					IPS_CMD_EXTENDED_DCDB_SG)) {
3325					tapeDCDB =
3326					    (IPS_DCDB_TABLE_TAPE *) & scb->dcdb;
3327					memcpy_and_pad(scb->scsi_cmd->sense_buffer,
3328					       SCSI_SENSE_BUFFERSIZE,
3329					       tapeDCDB->sense_info,
3330					       sizeof(tapeDCDB->sense_info), 0);
3331				} else {
3332					memcpy_and_pad(scb->scsi_cmd->sense_buffer,
3333					       SCSI_SENSE_BUFFERSIZE,
3334					       scb->dcdb.sense_info,
3335					       sizeof(scb->dcdb.sense_info), 0);
3336				}
3337				device_error = 2;	/* check condition */
3338			}
3339
3340			errcode = DID_OK;
3341
3342			break;
3343
3344		default:
3345			errcode = DID_ERROR;
3346			break;
3347
3348		}		/* end switch */
3349	}			/* end switch */
3350
3351	scb->scsi_cmd->result = device_error | (errcode << 16);
3352
3353	return (1);
3354}
3355
3356/****************************************************************************/
3357/*                                                                          */
3358/* Routine Name: ips_send_wait                                              */
3359/*                                                                          */
3360/* Routine Description:                                                     */
3361/*                                                                          */
3362/*   Send a command to the controller and wait for it to return             */
3363/*                                                                          */
3364/*   The FFDC Time Stamp use this function for the callback, but doesn't    */
3365/*   actually need to wait.                                                 */
3366/****************************************************************************/
3367static int
3368ips_send_wait(ips_ha_t * ha, ips_scb_t * scb, int timeout, int intr)
3369{
3370	int ret;
3371
3372	METHOD_TRACE("ips_send_wait", 1);
3373
3374	if (intr != IPS_FFDC) {	/* Won't be Waiting if this is a Time Stamp */
3375		ha->waitflag = true;
3376		ha->cmd_in_progress = scb->cdb[0];
3377	}
3378	scb->callback = ipsintr_blocking;
3379	ret = ips_send_cmd(ha, scb);
3380
3381	if ((ret == IPS_FAILURE) || (ret == IPS_SUCCESS_IMM))
3382		return (ret);
3383
3384	if (intr != IPS_FFDC)	/* Don't Wait around if this is a Time Stamp */
3385		ret = ips_wait(ha, timeout, intr);
3386
3387	return (ret);
3388}
3389
3390/****************************************************************************/
3391/*                                                                          */
3392/* Routine Name: ips_scmd_buf_write                                         */
3393/*                                                                          */
3394/* Routine Description:                                                     */
3395/*  Write data to struct scsi_cmnd request_buffer at proper offsets	    */
3396/****************************************************************************/
3397static void
3398ips_scmd_buf_write(struct scsi_cmnd *scmd, void *data, unsigned int count)
3399{
3400	unsigned long flags;
3401
3402	local_irq_save(flags);
3403	scsi_sg_copy_from_buffer(scmd, data, count);
3404	local_irq_restore(flags);
3405}
3406
3407/****************************************************************************/
3408/*                                                                          */
3409/* Routine Name: ips_scmd_buf_read                                          */
3410/*                                                                          */
3411/* Routine Description:                                                     */
3412/*  Copy data from a struct scsi_cmnd to a new, linear buffer		    */
3413/****************************************************************************/
3414static void
3415ips_scmd_buf_read(struct scsi_cmnd *scmd, void *data, unsigned int count)
3416{
3417	unsigned long flags;
3418
3419	local_irq_save(flags);
3420	scsi_sg_copy_to_buffer(scmd, data, count);
3421	local_irq_restore(flags);
3422}
3423
3424/****************************************************************************/
3425/*                                                                          */
3426/* Routine Name: ips_send_cmd                                               */
3427/*                                                                          */
3428/* Routine Description:                                                     */
3429/*                                                                          */
3430/*   Map SCSI commands to ServeRAID commands for logical drives             */
3431/*                                                                          */
3432/****************************************************************************/
3433static int
3434ips_send_cmd(ips_ha_t * ha, ips_scb_t * scb)
3435{
3436	int ret;
3437	char *sp;
3438	int device_error;
3439	IPS_DCDB_TABLE_TAPE *tapeDCDB;
3440	int TimeOut;
3441
3442	METHOD_TRACE("ips_send_cmd", 1);
3443
3444	ret = IPS_SUCCESS;
3445
3446	if (!scb->scsi_cmd) {
3447		/* internal command */
3448
3449		if (scb->bus > 0) {
3450			/* Controller commands can't be issued */
3451			/* to real devices -- fail them        */
3452			if (ha->waitflag && ha->cmd_in_progress == scb->cdb[0])
3453				ha->waitflag = false;
 
 
3454
3455			return (1);
3456		}
3457	} else if ((scb->bus == 0) && (!ips_is_passthru(scb->scsi_cmd))) {
3458		/* command to logical bus -- interpret */
3459		ret = IPS_SUCCESS_IMM;
3460
3461		switch (scb->scsi_cmd->cmnd[0]) {
3462		case ALLOW_MEDIUM_REMOVAL:
3463		case REZERO_UNIT:
3464		case ERASE:
3465		case WRITE_FILEMARKS:
3466		case SPACE:
3467			scb->scsi_cmd->result = DID_ERROR << 16;
3468			break;
3469
3470		case START_STOP:
3471			scb->scsi_cmd->result = DID_OK << 16;
3472			break;
3473
3474		case TEST_UNIT_READY:
3475		case INQUIRY:
3476			if (scb->target_id == IPS_ADAPTER_ID) {
3477				/*
3478				 * Either we have a TUR
3479				 * or we have a SCSI inquiry
3480				 */
3481				if (scb->scsi_cmd->cmnd[0] == TEST_UNIT_READY)
3482					scb->scsi_cmd->result = DID_OK << 16;
3483
3484				if (scb->scsi_cmd->cmnd[0] == INQUIRY) {
3485					IPS_SCSI_INQ_DATA inquiry;
3486
3487					memset(&inquiry, 0,
3488					       sizeof (IPS_SCSI_INQ_DATA));
3489
3490					inquiry.DeviceType =
3491					    IPS_SCSI_INQ_TYPE_PROCESSOR;
3492					inquiry.DeviceTypeQualifier =
3493					    IPS_SCSI_INQ_LU_CONNECTED;
3494					inquiry.Version = IPS_SCSI_INQ_REV2;
3495					inquiry.ResponseDataFormat =
3496					    IPS_SCSI_INQ_RD_REV2;
3497					inquiry.AdditionalLength = 31;
3498					inquiry.Flags[0] =
3499					    IPS_SCSI_INQ_Address16;
3500					inquiry.Flags[1] =
3501					    IPS_SCSI_INQ_WBus16 |
3502					    IPS_SCSI_INQ_Sync;
3503					memcpy(inquiry.VendorId, "IBM     ",
3504						8);
3505					memcpy(inquiry.ProductId,
3506						"SERVERAID       ", 16);
3507					memcpy(inquiry.ProductRevisionLevel,
3508						"1.00", 4);
3509
3510					ips_scmd_buf_write(scb->scsi_cmd,
3511							   &inquiry,
3512							   sizeof (inquiry));
3513
3514					scb->scsi_cmd->result = DID_OK << 16;
3515				}
3516			} else {
3517				scb->cmd.logical_info.op_code = IPS_CMD_GET_LD_INFO;
3518				scb->cmd.logical_info.command_id = IPS_COMMAND_ID(ha, scb);
3519				scb->cmd.logical_info.reserved = 0;
3520				scb->cmd.logical_info.reserved2 = 0;
3521				scb->data_len = sizeof (IPS_LD_INFO);
3522				scb->data_busaddr = ha->logical_drive_info_dma_addr;
3523				scb->flags = 0;
3524				scb->cmd.logical_info.buffer_addr = scb->data_busaddr;
3525				ret = IPS_SUCCESS;
3526			}
3527
3528			break;
3529
3530		case REQUEST_SENSE:
3531			ips_reqsen(ha, scb);
3532			scb->scsi_cmd->result = DID_OK << 16;
3533			break;
3534
3535		case READ_6:
3536		case WRITE_6:
3537			if (!scb->sg_len) {
3538				scb->cmd.basic_io.op_code =
3539				    (scb->scsi_cmd->cmnd[0] ==
3540				     READ_6) ? IPS_CMD_READ : IPS_CMD_WRITE;
3541				scb->cmd.basic_io.enhanced_sg = 0;
3542				scb->cmd.basic_io.sg_addr =
3543				    cpu_to_le32(scb->data_busaddr);
3544			} else {
3545				scb->cmd.basic_io.op_code =
3546				    (scb->scsi_cmd->cmnd[0] ==
3547				     READ_6) ? IPS_CMD_READ_SG :
3548				    IPS_CMD_WRITE_SG;
3549				scb->cmd.basic_io.enhanced_sg =
3550				    IPS_USE_ENH_SGLIST(ha) ? 0xFF : 0;
3551				scb->cmd.basic_io.sg_addr =
3552				    cpu_to_le32(scb->sg_busaddr);
3553			}
3554
3555			scb->cmd.basic_io.segment_4G = 0;
3556			scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
3557			scb->cmd.basic_io.log_drv = scb->target_id;
3558			scb->cmd.basic_io.sg_count = scb->sg_len;
3559
3560			if (scb->cmd.basic_io.lba)
3561				le32_add_cpu(&scb->cmd.basic_io.lba,
3562						le16_to_cpu(scb->cmd.basic_io.
3563							    sector_count));
3564			else
3565				scb->cmd.basic_io.lba =
3566				    (((scb->scsi_cmd->
3567				       cmnd[1] & 0x1f) << 16) | (scb->scsi_cmd->
3568								 cmnd[2] << 8) |
3569				     (scb->scsi_cmd->cmnd[3]));
3570
3571			scb->cmd.basic_io.sector_count =
3572			    cpu_to_le16(scb->data_len / IPS_BLKSIZE);
3573
3574			if (le16_to_cpu(scb->cmd.basic_io.sector_count) == 0)
3575				scb->cmd.basic_io.sector_count =
3576				    cpu_to_le16(256);
3577
3578			ret = IPS_SUCCESS;
3579			break;
3580
3581		case READ_10:
3582		case WRITE_10:
3583			if (!scb->sg_len) {
3584				scb->cmd.basic_io.op_code =
3585				    (scb->scsi_cmd->cmnd[0] ==
3586				     READ_10) ? IPS_CMD_READ : IPS_CMD_WRITE;
3587				scb->cmd.basic_io.enhanced_sg = 0;
3588				scb->cmd.basic_io.sg_addr =
3589				    cpu_to_le32(scb->data_busaddr);
3590			} else {
3591				scb->cmd.basic_io.op_code =
3592				    (scb->scsi_cmd->cmnd[0] ==
3593				     READ_10) ? IPS_CMD_READ_SG :
3594				    IPS_CMD_WRITE_SG;
3595				scb->cmd.basic_io.enhanced_sg =
3596				    IPS_USE_ENH_SGLIST(ha) ? 0xFF : 0;
3597				scb->cmd.basic_io.sg_addr =
3598				    cpu_to_le32(scb->sg_busaddr);
3599			}
3600
3601			scb->cmd.basic_io.segment_4G = 0;
3602			scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
3603			scb->cmd.basic_io.log_drv = scb->target_id;
3604			scb->cmd.basic_io.sg_count = scb->sg_len;
3605
3606			if (scb->cmd.basic_io.lba)
3607				le32_add_cpu(&scb->cmd.basic_io.lba,
3608						le16_to_cpu(scb->cmd.basic_io.
3609							    sector_count));
3610			else
3611				scb->cmd.basic_io.lba =
3612				    ((scb->scsi_cmd->cmnd[2] << 24) | (scb->
3613								       scsi_cmd->
3614								       cmnd[3]
3615								       << 16) |
3616				     (scb->scsi_cmd->cmnd[4] << 8) | scb->
3617				     scsi_cmd->cmnd[5]);
3618
3619			scb->cmd.basic_io.sector_count =
3620			    cpu_to_le16(scb->data_len / IPS_BLKSIZE);
3621
3622			if (cpu_to_le16(scb->cmd.basic_io.sector_count) == 0) {
3623				/*
3624				 * This is a null condition
3625				 * we don't have to do anything
3626				 * so just return
3627				 */
3628				scb->scsi_cmd->result = DID_OK << 16;
3629			} else
3630				ret = IPS_SUCCESS;
3631
3632			break;
3633
3634		case RESERVE:
3635		case RELEASE:
3636			scb->scsi_cmd->result = DID_OK << 16;
3637			break;
3638
3639		case MODE_SENSE:
3640			scb->cmd.basic_io.op_code = IPS_CMD_ENQUIRY;
3641			scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
3642			scb->cmd.basic_io.segment_4G = 0;
3643			scb->cmd.basic_io.enhanced_sg = 0;
3644			scb->data_len = sizeof (*ha->enq);
3645			scb->cmd.basic_io.sg_addr = ha->enq_busaddr;
3646			ret = IPS_SUCCESS;
3647			break;
3648
3649		case READ_CAPACITY:
3650			scb->cmd.logical_info.op_code = IPS_CMD_GET_LD_INFO;
3651			scb->cmd.logical_info.command_id = IPS_COMMAND_ID(ha, scb);
3652			scb->cmd.logical_info.reserved = 0;
3653			scb->cmd.logical_info.reserved2 = 0;
3654			scb->cmd.logical_info.reserved3 = 0;
3655			scb->data_len = sizeof (IPS_LD_INFO);
3656			scb->data_busaddr = ha->logical_drive_info_dma_addr;
3657			scb->flags = 0;
3658			scb->cmd.logical_info.buffer_addr = scb->data_busaddr;
3659			ret = IPS_SUCCESS;
3660			break;
3661
3662		case SEND_DIAGNOSTIC:
3663		case REASSIGN_BLOCKS:
3664		case FORMAT_UNIT:
3665		case SEEK_10:
3666		case VERIFY:
3667		case READ_DEFECT_DATA:
3668		case READ_BUFFER:
3669		case WRITE_BUFFER:
3670			scb->scsi_cmd->result = DID_OK << 16;
3671			break;
3672
3673		default:
3674			/* Set the Return Info to appear like the Command was */
3675			/* attempted, a Check Condition occurred, and Sense   */
3676			/* Data indicating an Invalid CDB OpCode is returned. */
3677			sp = (char *) scb->scsi_cmd->sense_buffer;
3678
3679			sp[0] = 0x70;	/* Error Code               */
3680			sp[2] = ILLEGAL_REQUEST;	/* Sense Key 5 Illegal Req. */
3681			sp[7] = 0x0A;	/* Additional Sense Length  */
3682			sp[12] = 0x20;	/* ASC = Invalid OpCode     */
3683			sp[13] = 0x00;	/* ASCQ                     */
3684
3685			device_error = 2;	/* Indicate Check Condition */
3686			scb->scsi_cmd->result = device_error | (DID_OK << 16);
3687			break;
3688		}		/* end switch */
3689	}
3690	/* end if */
3691	if (ret == IPS_SUCCESS_IMM)
3692		return (ret);
3693
3694	/* setup DCDB */
3695	if (scb->bus > 0) {
3696
3697		/* If we already know the Device is Not there, no need to attempt a Command   */
3698		/* This also protects an NT FailOver Controller from getting CDB's sent to it */
3699		if (ha->conf->dev[scb->bus - 1][scb->target_id].ucState == 0) {
3700			scb->scsi_cmd->result = DID_NO_CONNECT << 16;
3701			return (IPS_SUCCESS_IMM);
3702		}
3703
3704		ha->dcdb_active[scb->bus - 1] |= (1 << scb->target_id);
3705		scb->cmd.dcdb.command_id = IPS_COMMAND_ID(ha, scb);
3706		scb->cmd.dcdb.dcdb_address = cpu_to_le32(scb->scb_busaddr +
3707							 (unsigned long) &scb->
3708							 dcdb -
3709							 (unsigned long) scb);
3710		scb->cmd.dcdb.reserved = 0;
3711		scb->cmd.dcdb.reserved2 = 0;
3712		scb->cmd.dcdb.reserved3 = 0;
3713		scb->cmd.dcdb.segment_4G = 0;
3714		scb->cmd.dcdb.enhanced_sg = 0;
3715
3716		TimeOut = scsi_cmd_to_rq(scb->scsi_cmd)->timeout;
3717
3718		if (ha->subsys->param[4] & 0x00100000) {	/* If NEW Tape DCDB is Supported */
3719			if (!scb->sg_len) {
3720				scb->cmd.dcdb.op_code = IPS_CMD_EXTENDED_DCDB;
3721			} else {
3722				scb->cmd.dcdb.op_code =
3723				    IPS_CMD_EXTENDED_DCDB_SG;
3724				scb->cmd.dcdb.enhanced_sg =
3725				    IPS_USE_ENH_SGLIST(ha) ? 0xFF : 0;
3726			}
3727
3728			tapeDCDB = (IPS_DCDB_TABLE_TAPE *) & scb->dcdb;	/* Use Same Data Area as Old DCDB Struct */
3729			tapeDCDB->device_address =
3730			    ((scb->bus - 1) << 4) | scb->target_id;
3731			tapeDCDB->cmd_attribute |= IPS_DISCONNECT_ALLOWED;
3732			tapeDCDB->cmd_attribute &= ~IPS_TRANSFER64K;	/* Always Turn OFF 64K Size Flag */
3733
3734			if (TimeOut) {
3735				if (TimeOut < (10 * HZ))
3736					tapeDCDB->cmd_attribute |= IPS_TIMEOUT10;	/* TimeOut is 10 Seconds */
3737				else if (TimeOut < (60 * HZ))
3738					tapeDCDB->cmd_attribute |= IPS_TIMEOUT60;	/* TimeOut is 60 Seconds */
3739				else if (TimeOut < (1200 * HZ))
3740					tapeDCDB->cmd_attribute |= IPS_TIMEOUT20M;	/* TimeOut is 20 Minutes */
3741			}
3742
3743			tapeDCDB->cdb_length = scb->scsi_cmd->cmd_len;
3744			tapeDCDB->reserved_for_LUN = 0;
3745			tapeDCDB->transfer_length = scb->data_len;
3746			if (scb->cmd.dcdb.op_code == IPS_CMD_EXTENDED_DCDB_SG)
3747				tapeDCDB->buffer_pointer =
3748				    cpu_to_le32(scb->sg_busaddr);
3749			else
3750				tapeDCDB->buffer_pointer =
3751				    cpu_to_le32(scb->data_busaddr);
3752			tapeDCDB->sg_count = scb->sg_len;
3753			tapeDCDB->sense_length = sizeof (tapeDCDB->sense_info);
3754			tapeDCDB->scsi_status = 0;
3755			tapeDCDB->reserved = 0;
3756			memcpy(tapeDCDB->scsi_cdb, scb->scsi_cmd->cmnd,
3757			       scb->scsi_cmd->cmd_len);
3758		} else {
3759			if (!scb->sg_len) {
3760				scb->cmd.dcdb.op_code = IPS_CMD_DCDB;
3761			} else {
3762				scb->cmd.dcdb.op_code = IPS_CMD_DCDB_SG;
3763				scb->cmd.dcdb.enhanced_sg =
3764				    IPS_USE_ENH_SGLIST(ha) ? 0xFF : 0;
3765			}
3766
3767			scb->dcdb.device_address =
3768			    ((scb->bus - 1) << 4) | scb->target_id;
3769			scb->dcdb.cmd_attribute |= IPS_DISCONNECT_ALLOWED;
3770
3771			if (TimeOut) {
3772				if (TimeOut < (10 * HZ))
3773					scb->dcdb.cmd_attribute |= IPS_TIMEOUT10;	/* TimeOut is 10 Seconds */
3774				else if (TimeOut < (60 * HZ))
3775					scb->dcdb.cmd_attribute |= IPS_TIMEOUT60;	/* TimeOut is 60 Seconds */
3776				else if (TimeOut < (1200 * HZ))
3777					scb->dcdb.cmd_attribute |= IPS_TIMEOUT20M;	/* TimeOut is 20 Minutes */
3778			}
3779
3780			scb->dcdb.transfer_length = scb->data_len;
3781			if (scb->dcdb.cmd_attribute & IPS_TRANSFER64K)
3782				scb->dcdb.transfer_length = 0;
3783			if (scb->cmd.dcdb.op_code == IPS_CMD_DCDB_SG)
3784				scb->dcdb.buffer_pointer =
3785				    cpu_to_le32(scb->sg_busaddr);
3786			else
3787				scb->dcdb.buffer_pointer =
3788				    cpu_to_le32(scb->data_busaddr);
3789			scb->dcdb.cdb_length = scb->scsi_cmd->cmd_len;
3790			scb->dcdb.sense_length = sizeof (scb->dcdb.sense_info);
3791			scb->dcdb.sg_count = scb->sg_len;
3792			scb->dcdb.reserved = 0;
3793			memcpy(scb->dcdb.scsi_cdb, scb->scsi_cmd->cmnd,
3794			       scb->scsi_cmd->cmd_len);
3795			scb->dcdb.scsi_status = 0;
3796			scb->dcdb.reserved2[0] = 0;
3797			scb->dcdb.reserved2[1] = 0;
3798			scb->dcdb.reserved2[2] = 0;
3799		}
3800	}
3801
3802	return ((*ha->func.issue) (ha, scb));
3803}
3804
3805/****************************************************************************/
3806/*                                                                          */
3807/* Routine Name: ips_chk_status                                             */
3808/*                                                                          */
3809/* Routine Description:                                                     */
3810/*                                                                          */
3811/*   Check the status of commands to logical drives                         */
3812/*   Assumed to be called with the HA lock                                  */
3813/****************************************************************************/
3814static void
3815ips_chkstatus(ips_ha_t * ha, IPS_STATUS * pstatus)
3816{
3817	ips_scb_t *scb;
3818	ips_stat_t *sp;
3819	uint8_t basic_status;
3820	uint8_t ext_status;
3821	int errcode;
3822	IPS_SCSI_INQ_DATA inquiryData;
3823
3824	METHOD_TRACE("ips_chkstatus", 1);
3825
3826	scb = &ha->scbs[pstatus->fields.command_id];
3827	scb->basic_status = basic_status =
3828	    pstatus->fields.basic_status & IPS_BASIC_STATUS_MASK;
3829	scb->extended_status = ext_status = pstatus->fields.extended_status;
3830
3831	sp = &ha->sp;
3832	sp->residue_len = 0;
3833	sp->scb_addr = (void *) scb;
3834
3835	/* Remove the item from the active queue */
3836	ips_removeq_scb(&ha->scb_activelist, scb);
3837
3838	if (!scb->scsi_cmd)
3839		/* internal commands are handled in do_ipsintr */
3840		return;
3841
3842	DEBUG_VAR(2, "(%s%d) ips_chkstatus: cmd 0x%X id %d (%d %d %d)",
3843		  ips_name,
3844		  ha->host_num,
3845		  scb->cdb[0],
3846		  scb->cmd.basic_io.command_id,
3847		  scb->bus, scb->target_id, scb->lun);
3848
3849	if ((scb->scsi_cmd) && (ips_is_passthru(scb->scsi_cmd)))
3850		/* passthru - just returns the raw result */
3851		return;
3852
3853	errcode = DID_OK;
3854
3855	if (((basic_status & IPS_GSC_STATUS_MASK) == IPS_CMD_SUCCESS) ||
3856	    ((basic_status & IPS_GSC_STATUS_MASK) == IPS_CMD_RECOVERED_ERROR)) {
3857
3858		if (scb->bus == 0) {
3859			if ((basic_status & IPS_GSC_STATUS_MASK) ==
3860			    IPS_CMD_RECOVERED_ERROR) {
3861				DEBUG_VAR(1,
3862					  "(%s%d) Recovered Logical Drive Error OpCode: %x, BSB: %x, ESB: %x",
3863					  ips_name, ha->host_num,
3864					  scb->cmd.basic_io.op_code,
3865					  basic_status, ext_status);
3866			}
3867
3868			switch (scb->scsi_cmd->cmnd[0]) {
3869			case ALLOW_MEDIUM_REMOVAL:
3870			case REZERO_UNIT:
3871			case ERASE:
3872			case WRITE_FILEMARKS:
3873			case SPACE:
3874				errcode = DID_ERROR;
3875				break;
3876
3877			case START_STOP:
3878				break;
3879
3880			case TEST_UNIT_READY:
3881				if (!ips_online(ha, scb)) {
3882					errcode = DID_TIME_OUT;
3883				}
3884				break;
3885
3886			case INQUIRY:
3887				if (ips_online(ha, scb)) {
3888					ips_inquiry(ha, scb);
3889				} else {
3890					errcode = DID_TIME_OUT;
3891				}
3892				break;
3893
3894			case REQUEST_SENSE:
3895				ips_reqsen(ha, scb);
3896				break;
3897
3898			case READ_6:
3899			case WRITE_6:
3900			case READ_10:
3901			case WRITE_10:
3902			case RESERVE:
3903			case RELEASE:
3904				break;
3905
3906			case MODE_SENSE:
3907				if (!ips_online(ha, scb)
3908				    || !ips_msense(ha, scb)) {
3909					errcode = DID_ERROR;
3910				}
3911				break;
3912
3913			case READ_CAPACITY:
3914				if (ips_online(ha, scb))
3915					ips_rdcap(ha, scb);
3916				else {
3917					errcode = DID_TIME_OUT;
3918				}
3919				break;
3920
3921			case SEND_DIAGNOSTIC:
3922			case REASSIGN_BLOCKS:
3923				break;
3924
3925			case FORMAT_UNIT:
3926				errcode = DID_ERROR;
3927				break;
3928
3929			case SEEK_10:
3930			case VERIFY:
3931			case READ_DEFECT_DATA:
3932			case READ_BUFFER:
3933			case WRITE_BUFFER:
3934				break;
3935
3936			default:
3937				errcode = DID_ERROR;
3938			}	/* end switch */
3939
3940			scb->scsi_cmd->result = errcode << 16;
3941		} else {	/* bus == 0 */
3942			/* restrict access to physical drives */
3943			if (scb->scsi_cmd->cmnd[0] == INQUIRY) {
3944			    ips_scmd_buf_read(scb->scsi_cmd,
3945                                  &inquiryData, sizeof (inquiryData));
3946			    if ((inquiryData.DeviceType & 0x1f) == TYPE_DISK)
3947			        scb->scsi_cmd->result = DID_TIME_OUT << 16;
3948			}
3949		}		/* else */
3950	} else {		/* recovered error / success */
3951		if (scb->bus == 0) {
3952			DEBUG_VAR(1,
3953				  "(%s%d) Unrecovered Logical Drive Error OpCode: %x, BSB: %x, ESB: %x",
3954				  ips_name, ha->host_num,
3955				  scb->cmd.basic_io.op_code, basic_status,
3956				  ext_status);
3957		}
3958
3959		ips_map_status(ha, scb, sp);
3960	}			/* else */
3961}
3962
3963/****************************************************************************/
3964/*                                                                          */
3965/* Routine Name: ips_online                                                 */
3966/*                                                                          */
3967/* Routine Description:                                                     */
3968/*                                                                          */
3969/*   Determine if a logical drive is online                                 */
3970/*                                                                          */
3971/****************************************************************************/
3972static int
3973ips_online(ips_ha_t * ha, ips_scb_t * scb)
3974{
3975	METHOD_TRACE("ips_online", 1);
3976
3977	if (scb->target_id >= IPS_MAX_LD)
3978		return (0);
3979
3980	if ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1) {
3981		memset(ha->logical_drive_info, 0, sizeof (IPS_LD_INFO));
3982		return (0);
3983	}
3984
3985	if (ha->logical_drive_info->drive_info[scb->target_id].state !=
3986	    IPS_LD_OFFLINE
3987	    && ha->logical_drive_info->drive_info[scb->target_id].state !=
3988	    IPS_LD_FREE
3989	    && ha->logical_drive_info->drive_info[scb->target_id].state !=
3990	    IPS_LD_CRS
3991	    && ha->logical_drive_info->drive_info[scb->target_id].state !=
3992	    IPS_LD_SYS)
3993		return (1);
3994	else
3995		return (0);
3996}
3997
3998/****************************************************************************/
3999/*                                                                          */
4000/* Routine Name: ips_inquiry                                                */
4001/*                                                                          */
4002/* Routine Description:                                                     */
4003/*                                                                          */
4004/*   Simulate an inquiry command to a logical drive                         */
4005/*                                                                          */
4006/****************************************************************************/
4007static int
4008ips_inquiry(ips_ha_t * ha, ips_scb_t * scb)
4009{
4010	IPS_SCSI_INQ_DATA inquiry;
4011
4012	METHOD_TRACE("ips_inquiry", 1);
4013
4014	memset(&inquiry, 0, sizeof (IPS_SCSI_INQ_DATA));
4015
4016	inquiry.DeviceType = IPS_SCSI_INQ_TYPE_DASD;
4017	inquiry.DeviceTypeQualifier = IPS_SCSI_INQ_LU_CONNECTED;
4018	inquiry.Version = IPS_SCSI_INQ_REV2;
4019	inquiry.ResponseDataFormat = IPS_SCSI_INQ_RD_REV2;
4020	inquiry.AdditionalLength = 31;
4021	inquiry.Flags[0] = IPS_SCSI_INQ_Address16;
4022	inquiry.Flags[1] =
4023	    IPS_SCSI_INQ_WBus16 | IPS_SCSI_INQ_Sync | IPS_SCSI_INQ_CmdQue;
4024	memcpy(inquiry.VendorId, "IBM     ", 8);
4025	memcpy(inquiry.ProductId, "SERVERAID       ", 16);
4026	memcpy(inquiry.ProductRevisionLevel, "1.00", 4);
4027
4028	ips_scmd_buf_write(scb->scsi_cmd, &inquiry, sizeof (inquiry));
4029
4030	return (1);
4031}
4032
4033/****************************************************************************/
4034/*                                                                          */
4035/* Routine Name: ips_rdcap                                                  */
4036/*                                                                          */
4037/* Routine Description:                                                     */
4038/*                                                                          */
4039/*   Simulate a read capacity command to a logical drive                    */
4040/*                                                                          */
4041/****************************************************************************/
4042static int
4043ips_rdcap(ips_ha_t * ha, ips_scb_t * scb)
4044{
4045	IPS_SCSI_CAPACITY cap;
4046
4047	METHOD_TRACE("ips_rdcap", 1);
4048
4049	if (scsi_bufflen(scb->scsi_cmd) < 8)
4050		return (0);
4051
4052	cap.lba =
4053	    cpu_to_be32(le32_to_cpu
4054			(ha->logical_drive_info->
4055			 drive_info[scb->target_id].sector_count) - 1);
4056	cap.len = cpu_to_be32((uint32_t) IPS_BLKSIZE);
4057
4058	ips_scmd_buf_write(scb->scsi_cmd, &cap, sizeof (cap));
4059
4060	return (1);
4061}
4062
4063/****************************************************************************/
4064/*                                                                          */
4065/* Routine Name: ips_msense                                                 */
4066/*                                                                          */
4067/* Routine Description:                                                     */
4068/*                                                                          */
4069/*   Simulate a mode sense command to a logical drive                       */
4070/*                                                                          */
4071/****************************************************************************/
4072static int
4073ips_msense(ips_ha_t * ha, ips_scb_t * scb)
4074{
4075	uint16_t heads;
4076	uint16_t sectors;
4077	uint32_t cylinders;
4078	IPS_SCSI_MODE_PAGE_DATA mdata;
4079
4080	METHOD_TRACE("ips_msense", 1);
4081
4082	if (le32_to_cpu(ha->enq->ulDriveSize[scb->target_id]) > 0x400000 &&
4083	    (ha->enq->ucMiscFlag & 0x8) == 0) {
4084		heads = IPS_NORM_HEADS;
4085		sectors = IPS_NORM_SECTORS;
4086	} else {
4087		heads = IPS_COMP_HEADS;
4088		sectors = IPS_COMP_SECTORS;
4089	}
4090
4091	cylinders =
4092	    (le32_to_cpu(ha->enq->ulDriveSize[scb->target_id]) -
4093	     1) / (heads * sectors);
4094
4095	memset(&mdata, 0, sizeof (IPS_SCSI_MODE_PAGE_DATA));
4096
4097	mdata.hdr.BlockDescLength = 8;
4098
4099	switch (scb->scsi_cmd->cmnd[2] & 0x3f) {
4100	case 0x03:		/* page 3 */
4101		mdata.pdata.pg3.PageCode = 3;
4102		mdata.pdata.pg3.PageLength = sizeof (IPS_SCSI_MODE_PAGE3);
4103		mdata.hdr.DataLength =
4104		    3 + mdata.hdr.BlockDescLength + mdata.pdata.pg3.PageLength;
4105		mdata.pdata.pg3.TracksPerZone = 0;
4106		mdata.pdata.pg3.AltSectorsPerZone = 0;
4107		mdata.pdata.pg3.AltTracksPerZone = 0;
4108		mdata.pdata.pg3.AltTracksPerVolume = 0;
4109		mdata.pdata.pg3.SectorsPerTrack = cpu_to_be16(sectors);
4110		mdata.pdata.pg3.BytesPerSector = cpu_to_be16(IPS_BLKSIZE);
4111		mdata.pdata.pg3.Interleave = cpu_to_be16(1);
4112		mdata.pdata.pg3.TrackSkew = 0;
4113		mdata.pdata.pg3.CylinderSkew = 0;
4114		mdata.pdata.pg3.flags = IPS_SCSI_MP3_SoftSector;
4115		break;
4116
4117	case 0x4:
4118		mdata.pdata.pg4.PageCode = 4;
4119		mdata.pdata.pg4.PageLength = sizeof (IPS_SCSI_MODE_PAGE4);
4120		mdata.hdr.DataLength =
4121		    3 + mdata.hdr.BlockDescLength + mdata.pdata.pg4.PageLength;
4122		mdata.pdata.pg4.CylindersHigh =
4123		    cpu_to_be16((cylinders >> 8) & 0xFFFF);
4124		mdata.pdata.pg4.CylindersLow = (cylinders & 0xFF);
4125		mdata.pdata.pg4.Heads = heads;
4126		mdata.pdata.pg4.WritePrecompHigh = 0;
4127		mdata.pdata.pg4.WritePrecompLow = 0;
4128		mdata.pdata.pg4.ReducedWriteCurrentHigh = 0;
4129		mdata.pdata.pg4.ReducedWriteCurrentLow = 0;
4130		mdata.pdata.pg4.StepRate = cpu_to_be16(1);
4131		mdata.pdata.pg4.LandingZoneHigh = 0;
4132		mdata.pdata.pg4.LandingZoneLow = 0;
4133		mdata.pdata.pg4.flags = 0;
4134		mdata.pdata.pg4.RotationalOffset = 0;
4135		mdata.pdata.pg4.MediumRotationRate = 0;
4136		break;
4137	case 0x8:
4138		mdata.pdata.pg8.PageCode = 8;
4139		mdata.pdata.pg8.PageLength = sizeof (IPS_SCSI_MODE_PAGE8);
4140		mdata.hdr.DataLength =
4141		    3 + mdata.hdr.BlockDescLength + mdata.pdata.pg8.PageLength;
4142		/* everything else is left set to 0 */
4143		break;
4144
4145	default:
4146		return (0);
4147	}			/* end switch */
4148
4149	ips_scmd_buf_write(scb->scsi_cmd, &mdata, sizeof (mdata));
4150
4151	return (1);
4152}
4153
4154/****************************************************************************/
4155/*                                                                          */
4156/* Routine Name: ips_reqsen                                                 */
4157/*                                                                          */
4158/* Routine Description:                                                     */
4159/*                                                                          */
4160/*   Simulate a request sense command to a logical drive                    */
4161/*                                                                          */
4162/****************************************************************************/
4163static int
4164ips_reqsen(ips_ha_t * ha, ips_scb_t * scb)
4165{
4166	IPS_SCSI_REQSEN reqsen;
4167
4168	METHOD_TRACE("ips_reqsen", 1);
4169
4170	memset(&reqsen, 0, sizeof (IPS_SCSI_REQSEN));
4171
4172	reqsen.ResponseCode =
4173	    IPS_SCSI_REQSEN_VALID | IPS_SCSI_REQSEN_CURRENT_ERR;
4174	reqsen.AdditionalLength = 10;
4175	reqsen.AdditionalSenseCode = IPS_SCSI_REQSEN_NO_SENSE;
4176	reqsen.AdditionalSenseCodeQual = IPS_SCSI_REQSEN_NO_SENSE;
4177
4178	ips_scmd_buf_write(scb->scsi_cmd, &reqsen, sizeof (reqsen));
4179
4180	return (1);
4181}
4182
4183/****************************************************************************/
4184/*                                                                          */
4185/* Routine Name: ips_free                                                   */
4186/*                                                                          */
4187/* Routine Description:                                                     */
4188/*                                                                          */
4189/*   Free any allocated space for this controller                           */
4190/*                                                                          */
4191/****************************************************************************/
4192static void
4193ips_free(ips_ha_t * ha)
4194{
4195
4196	METHOD_TRACE("ips_free", 1);
4197
4198	if (ha) {
4199		if (ha->enq) {
4200			dma_free_coherent(&ha->pcidev->dev, sizeof(IPS_ENQ),
4201					    ha->enq, ha->enq_busaddr);
4202			ha->enq = NULL;
4203		}
4204
4205		kfree(ha->conf);
4206		ha->conf = NULL;
4207
4208		if (ha->adapt) {
4209			dma_free_coherent(&ha->pcidev->dev,
4210					    sizeof (IPS_ADAPTER) +
4211					    sizeof (IPS_IO_CMD), ha->adapt,
4212					    ha->adapt->hw_status_start);
4213			ha->adapt = NULL;
4214		}
4215
4216		if (ha->logical_drive_info) {
4217			dma_free_coherent(&ha->pcidev->dev,
4218					    sizeof (IPS_LD_INFO),
4219					    ha->logical_drive_info,
4220					    ha->logical_drive_info_dma_addr);
4221			ha->logical_drive_info = NULL;
4222		}
4223
4224		kfree(ha->nvram);
4225		ha->nvram = NULL;
4226
4227		kfree(ha->subsys);
4228		ha->subsys = NULL;
4229
4230		if (ha->ioctl_data) {
4231			dma_free_coherent(&ha->pcidev->dev, ha->ioctl_len,
4232					    ha->ioctl_data, ha->ioctl_busaddr);
4233			ha->ioctl_data = NULL;
4234			ha->ioctl_datasize = 0;
4235			ha->ioctl_len = 0;
4236		}
4237		ips_deallocatescbs(ha, ha->max_cmds);
4238
4239		/* free memory mapped (if applicable) */
4240		if (ha->mem_ptr) {
4241			iounmap(ha->ioremap_ptr);
4242			ha->ioremap_ptr = NULL;
4243			ha->mem_ptr = NULL;
4244		}
4245
4246		ha->mem_addr = 0;
4247
4248	}
4249}
4250
4251/****************************************************************************/
4252/*                                                                          */
4253/* Routine Name: ips_deallocatescbs                                         */
4254/*                                                                          */
4255/* Routine Description:                                                     */
4256/*                                                                          */
4257/*   Free the command blocks                                                */
4258/*                                                                          */
4259/****************************************************************************/
4260static int
4261ips_deallocatescbs(ips_ha_t * ha, int cmds)
4262{
4263	if (ha->scbs) {
4264		dma_free_coherent(&ha->pcidev->dev,
4265				    IPS_SGLIST_SIZE(ha) * IPS_MAX_SG * cmds,
4266				    ha->scbs->sg_list.list,
4267				    ha->scbs->sg_busaddr);
4268		dma_free_coherent(&ha->pcidev->dev, sizeof (ips_scb_t) * cmds,
4269				    ha->scbs, ha->scbs->scb_busaddr);
4270		ha->scbs = NULL;
4271	}			/* end if */
4272	return 1;
4273}
4274
4275/****************************************************************************/
4276/*                                                                          */
4277/* Routine Name: ips_allocatescbs                                           */
4278/*                                                                          */
4279/* Routine Description:                                                     */
4280/*                                                                          */
4281/*   Allocate the command blocks                                            */
4282/*                                                                          */
4283/****************************************************************************/
4284static int
4285ips_allocatescbs(ips_ha_t * ha)
4286{
4287	ips_scb_t *scb_p;
4288	IPS_SG_LIST ips_sg;
4289	int i;
4290	dma_addr_t command_dma, sg_dma;
4291
4292	METHOD_TRACE("ips_allocatescbs", 1);
4293
4294	/* Allocate memory for the SCBs */
4295	ha->scbs = dma_alloc_coherent(&ha->pcidev->dev,
4296			ha->max_cmds * sizeof (ips_scb_t),
4297			&command_dma, GFP_KERNEL);
4298	if (ha->scbs == NULL)
4299		return 0;
4300	ips_sg.list = dma_alloc_coherent(&ha->pcidev->dev,
4301			IPS_SGLIST_SIZE(ha) * IPS_MAX_SG * ha->max_cmds,
4302			&sg_dma, GFP_KERNEL);
 
4303	if (ips_sg.list == NULL) {
4304		dma_free_coherent(&ha->pcidev->dev,
4305				    ha->max_cmds * sizeof (ips_scb_t), ha->scbs,
4306				    command_dma);
4307		return 0;
4308	}
4309
4310	memset(ha->scbs, 0, ha->max_cmds * sizeof (ips_scb_t));
4311
4312	for (i = 0; i < ha->max_cmds; i++) {
4313		scb_p = &ha->scbs[i];
4314		scb_p->scb_busaddr = command_dma + sizeof (ips_scb_t) * i;
4315		/* set up S/G list */
4316		if (IPS_USE_ENH_SGLIST(ha)) {
4317			scb_p->sg_list.enh_list =
4318			    ips_sg.enh_list + i * IPS_MAX_SG;
4319			scb_p->sg_busaddr =
4320			    sg_dma + IPS_SGLIST_SIZE(ha) * IPS_MAX_SG * i;
4321		} else {
4322			scb_p->sg_list.std_list =
4323			    ips_sg.std_list + i * IPS_MAX_SG;
4324			scb_p->sg_busaddr =
4325			    sg_dma + IPS_SGLIST_SIZE(ha) * IPS_MAX_SG * i;
4326		}
4327
4328		/* add to the free list */
4329		if (i < ha->max_cmds - 1) {
4330			scb_p->q_next = ha->scb_freelist;
4331			ha->scb_freelist = scb_p;
4332		}
4333	}
4334
4335	/* success */
4336	return (1);
4337}
4338
4339/****************************************************************************/
4340/*                                                                          */
4341/* Routine Name: ips_init_scb                                               */
4342/*                                                                          */
4343/* Routine Description:                                                     */
4344/*                                                                          */
4345/*   Initialize a CCB to default values                                     */
4346/*                                                                          */
4347/****************************************************************************/
4348static void
4349ips_init_scb(ips_ha_t * ha, ips_scb_t * scb)
4350{
4351	IPS_SG_LIST sg_list;
4352	uint32_t cmd_busaddr, sg_busaddr;
4353	METHOD_TRACE("ips_init_scb", 1);
4354
4355	if (scb == NULL)
4356		return;
4357
4358	sg_list.list = scb->sg_list.list;
4359	cmd_busaddr = scb->scb_busaddr;
4360	sg_busaddr = scb->sg_busaddr;
4361	/* zero fill */
4362	memset(scb, 0, sizeof (ips_scb_t));
4363	memset(ha->dummy, 0, sizeof (IPS_IO_CMD));
4364
4365	/* Initialize dummy command bucket */
4366	ha->dummy->op_code = 0xFF;
4367	ha->dummy->ccsar = cpu_to_le32(ha->adapt->hw_status_start
4368				       + sizeof (IPS_ADAPTER));
4369	ha->dummy->command_id = IPS_MAX_CMDS;
4370
4371	/* set bus address of scb */
4372	scb->scb_busaddr = cmd_busaddr;
4373	scb->sg_busaddr = sg_busaddr;
4374	scb->sg_list.list = sg_list.list;
4375
4376	/* Neptune Fix */
4377	scb->cmd.basic_io.cccr = cpu_to_le32((uint32_t) IPS_BIT_ILE);
4378	scb->cmd.basic_io.ccsar = cpu_to_le32(ha->adapt->hw_status_start
4379					      + sizeof (IPS_ADAPTER));
4380}
4381
4382/****************************************************************************/
4383/*                                                                          */
4384/* Routine Name: ips_get_scb                                                */
4385/*                                                                          */
4386/* Routine Description:                                                     */
4387/*                                                                          */
4388/*   Initialize a CCB to default values                                     */
4389/*                                                                          */
4390/* ASSUMED to be called from within a lock                                 */
4391/*                                                                          */
4392/****************************************************************************/
4393static ips_scb_t *
4394ips_getscb(ips_ha_t * ha)
4395{
4396	ips_scb_t *scb;
4397
4398	METHOD_TRACE("ips_getscb", 1);
4399
4400	if ((scb = ha->scb_freelist) == NULL) {
4401
4402		return (NULL);
4403	}
4404
4405	ha->scb_freelist = scb->q_next;
4406	scb->flags = 0;
4407	scb->q_next = NULL;
4408
4409	ips_init_scb(ha, scb);
4410
4411	return (scb);
4412}
4413
4414/****************************************************************************/
4415/*                                                                          */
4416/* Routine Name: ips_free_scb                                               */
4417/*                                                                          */
4418/* Routine Description:                                                     */
4419/*                                                                          */
4420/*   Return an unused CCB back to the free list                             */
4421/*                                                                          */
4422/* ASSUMED to be called from within a lock                                  */
4423/*                                                                          */
4424/****************************************************************************/
4425static void
4426ips_freescb(ips_ha_t * ha, ips_scb_t * scb)
4427{
4428
4429	METHOD_TRACE("ips_freescb", 1);
4430	if (scb->flags & IPS_SCB_MAP_SG)
4431                scsi_dma_unmap(scb->scsi_cmd);
4432	else if (scb->flags & IPS_SCB_MAP_SINGLE)
4433		dma_unmap_single(&ha->pcidev->dev, scb->data_busaddr,
4434				 scb->data_len, IPS_DMA_DIR(scb));
4435
4436	/* check to make sure this is not our "special" scb */
4437	if (IPS_COMMAND_ID(ha, scb) < (ha->max_cmds - 1)) {
4438		scb->q_next = ha->scb_freelist;
4439		ha->scb_freelist = scb;
4440	}
4441}
4442
4443/****************************************************************************/
4444/*                                                                          */
4445/* Routine Name: ips_isinit_copperhead                                      */
4446/*                                                                          */
4447/* Routine Description:                                                     */
4448/*                                                                          */
4449/*   Is controller initialized ?                                            */
4450/*                                                                          */
4451/****************************************************************************/
4452static int
4453ips_isinit_copperhead(ips_ha_t * ha)
4454{
4455	uint8_t scpr;
4456	uint8_t isr;
4457
4458	METHOD_TRACE("ips_isinit_copperhead", 1);
4459
4460	isr = inb(ha->io_addr + IPS_REG_HISR);
4461	scpr = inb(ha->io_addr + IPS_REG_SCPR);
4462
4463	if (((isr & IPS_BIT_EI) == 0) && ((scpr & IPS_BIT_EBM) == 0))
4464		return (0);
4465	else
4466		return (1);
4467}
4468
4469/****************************************************************************/
4470/*                                                                          */
4471/* Routine Name: ips_isinit_copperhead_memio                                */
4472/*                                                                          */
4473/* Routine Description:                                                     */
4474/*                                                                          */
4475/*   Is controller initialized ?                                            */
4476/*                                                                          */
4477/****************************************************************************/
4478static int
4479ips_isinit_copperhead_memio(ips_ha_t * ha)
4480{
4481	uint8_t isr = 0;
4482	uint8_t scpr;
4483
4484	METHOD_TRACE("ips_is_init_copperhead_memio", 1);
4485
4486	isr = readb(ha->mem_ptr + IPS_REG_HISR);
4487	scpr = readb(ha->mem_ptr + IPS_REG_SCPR);
4488
4489	if (((isr & IPS_BIT_EI) == 0) && ((scpr & IPS_BIT_EBM) == 0))
4490		return (0);
4491	else
4492		return (1);
4493}
4494
4495/****************************************************************************/
4496/*                                                                          */
4497/* Routine Name: ips_isinit_morpheus                                        */
4498/*                                                                          */
4499/* Routine Description:                                                     */
4500/*                                                                          */
4501/*   Is controller initialized ?                                            */
4502/*                                                                          */
4503/****************************************************************************/
4504static int
4505ips_isinit_morpheus(ips_ha_t * ha)
4506{
4507	uint32_t post;
4508	uint32_t bits;
4509
4510	METHOD_TRACE("ips_is_init_morpheus", 1);
4511
4512	if (ips_isintr_morpheus(ha))
4513	    ips_flush_and_reset(ha);
4514
4515	post = readl(ha->mem_ptr + IPS_REG_I960_MSG0);
4516	bits = readl(ha->mem_ptr + IPS_REG_I2O_HIR);
4517
4518	if (post == 0)
4519		return (0);
4520	else if (bits & 0x3)
4521		return (0);
4522	else
4523		return (1);
4524}
4525
4526/****************************************************************************/
4527/*                                                                          */
4528/* Routine Name: ips_flush_and_reset                                        */
4529/*                                                                          */
4530/* Routine Description:                                                     */
4531/*                                                                          */
4532/*   Perform cleanup ( FLUSH and RESET ) when the adapter is in an unknown  */
4533/*   state ( was trying to INIT and an interrupt was already pending ) ...  */
4534/*                                                                          */
4535/****************************************************************************/
4536static void
4537ips_flush_and_reset(ips_ha_t *ha)
4538{
4539	ips_scb_t *scb;
4540	int  ret;
4541 	int  time;
4542	int  done;
4543	dma_addr_t command_dma;
4544
4545	/* Create a usuable SCB */
4546	scb = dma_alloc_coherent(&ha->pcidev->dev, sizeof(ips_scb_t),
4547			&command_dma, GFP_KERNEL);
4548	if (scb) {
4549	    memset(scb, 0, sizeof(ips_scb_t));
4550	    ips_init_scb(ha, scb);
4551	    scb->scb_busaddr = command_dma;
4552
4553	    scb->timeout = ips_cmd_timeout;
4554	    scb->cdb[0] = IPS_CMD_FLUSH;
4555
4556	    scb->cmd.flush_cache.op_code = IPS_CMD_FLUSH;
4557	    scb->cmd.flush_cache.command_id = IPS_MAX_CMDS;   /* Use an ID that would otherwise not exist */
4558	    scb->cmd.flush_cache.state = IPS_NORM_STATE;
4559	    scb->cmd.flush_cache.reserved = 0;
4560	    scb->cmd.flush_cache.reserved2 = 0;
4561	    scb->cmd.flush_cache.reserved3 = 0;
4562	    scb->cmd.flush_cache.reserved4 = 0;
4563
4564	    ret = ips_send_cmd(ha, scb);                      /* Send the Flush Command */
4565
4566	    if (ret == IPS_SUCCESS) {
4567	        time = 60 * IPS_ONE_SEC;	              /* Max Wait time is 60 seconds */
4568	        done = 0;
4569
4570	        while ((time > 0) && (!done)) {
4571		   done = ips_poll_for_flush_complete(ha);
4572	           /* This may look evil, but it's only done during extremely rare start-up conditions ! */
4573	           udelay(1000);
4574	           time--;
4575	        }
4576        }
4577	}
4578
4579	/* Now RESET and INIT the adapter */
4580	(*ha->func.reset) (ha);
4581
4582	dma_free_coherent(&ha->pcidev->dev, sizeof(ips_scb_t), scb, command_dma);
4583	return;
4584}
4585
4586/****************************************************************************/
4587/*                                                                          */
4588/* Routine Name: ips_poll_for_flush_complete                                */
4589/*                                                                          */
4590/* Routine Description:                                                     */
4591/*                                                                          */
4592/*   Poll for the Flush Command issued by ips_flush_and_reset() to complete */
4593/*   All other responses are just taken off the queue and ignored           */
4594/*                                                                          */
4595/****************************************************************************/
4596static int
4597ips_poll_for_flush_complete(ips_ha_t * ha)
4598{
4599	IPS_STATUS cstatus;
4600
4601	while (true) {
4602	    cstatus.value = (*ha->func.statupd) (ha);
4603
4604	    if (cstatus.value == 0xffffffff)      /* If No Interrupt to process */
4605			break;
4606
4607	    /* Success is when we see the Flush Command ID */
4608	    if (cstatus.fields.command_id == IPS_MAX_CMDS)
4609	        return 1;
4610	 }
4611
4612	return 0;
4613}
4614
4615/****************************************************************************/
4616/*                                                                          */
4617/* Routine Name: ips_enable_int_copperhead                                  */
4618/*                                                                          */
4619/* Routine Description:                                                     */
4620/*   Turn on interrupts                                                     */
4621/*                                                                          */
4622/****************************************************************************/
4623static void
4624ips_enable_int_copperhead(ips_ha_t * ha)
4625{
4626	METHOD_TRACE("ips_enable_int_copperhead", 1);
4627
4628	outb(ha->io_addr + IPS_REG_HISR, IPS_BIT_EI);
4629	inb(ha->io_addr + IPS_REG_HISR);	/*Ensure PCI Posting Completes*/
4630}
4631
4632/****************************************************************************/
4633/*                                                                          */
4634/* Routine Name: ips_enable_int_copperhead_memio                            */
4635/*                                                                          */
4636/* Routine Description:                                                     */
4637/*   Turn on interrupts                                                     */
4638/*                                                                          */
4639/****************************************************************************/
4640static void
4641ips_enable_int_copperhead_memio(ips_ha_t * ha)
4642{
4643	METHOD_TRACE("ips_enable_int_copperhead_memio", 1);
4644
4645	writeb(IPS_BIT_EI, ha->mem_ptr + IPS_REG_HISR);
4646	readb(ha->mem_ptr + IPS_REG_HISR);	/*Ensure PCI Posting Completes*/
4647}
4648
4649/****************************************************************************/
4650/*                                                                          */
4651/* Routine Name: ips_enable_int_morpheus                                    */
4652/*                                                                          */
4653/* Routine Description:                                                     */
4654/*   Turn on interrupts                                                     */
4655/*                                                                          */
4656/****************************************************************************/
4657static void
4658ips_enable_int_morpheus(ips_ha_t * ha)
4659{
4660	uint32_t Oimr;
4661
4662	METHOD_TRACE("ips_enable_int_morpheus", 1);
4663
4664	Oimr = readl(ha->mem_ptr + IPS_REG_I960_OIMR);
4665	Oimr &= ~0x08;
4666	writel(Oimr, ha->mem_ptr + IPS_REG_I960_OIMR);
4667	readl(ha->mem_ptr + IPS_REG_I960_OIMR);	/*Ensure PCI Posting Completes*/
4668}
4669
4670/****************************************************************************/
4671/*                                                                          */
4672/* Routine Name: ips_init_copperhead                                        */
4673/*                                                                          */
4674/* Routine Description:                                                     */
4675/*                                                                          */
4676/*   Initialize a copperhead controller                                     */
4677/*                                                                          */
4678/****************************************************************************/
4679static int
4680ips_init_copperhead(ips_ha_t * ha)
4681{
4682	uint8_t Isr;
4683	uint8_t Cbsp;
4684	uint8_t PostByte[IPS_MAX_POST_BYTES];
 
4685	int i, j;
4686
4687	METHOD_TRACE("ips_init_copperhead", 1);
4688
4689	for (i = 0; i < IPS_MAX_POST_BYTES; i++) {
4690		for (j = 0; j < 45; j++) {
4691			Isr = inb(ha->io_addr + IPS_REG_HISR);
4692			if (Isr & IPS_BIT_GHI)
4693				break;
4694
4695			/* Delay for 1 Second */
4696			MDELAY(IPS_ONE_SEC);
4697		}
4698
4699		if (j >= 45)
4700			/* error occurred */
4701			return (0);
4702
4703		PostByte[i] = inb(ha->io_addr + IPS_REG_ISPR);
4704		outb(Isr, ha->io_addr + IPS_REG_HISR);
4705	}
4706
4707	if (PostByte[0] < IPS_GOOD_POST_STATUS) {
4708		IPS_PRINTK(KERN_WARNING, ha->pcidev,
4709			   "reset controller fails (post status %x %x).\n",
4710			   PostByte[0], PostByte[1]);
4711
4712		return (0);
4713	}
4714
4715	for (i = 0; i < IPS_MAX_CONFIG_BYTES; i++) {
4716		for (j = 0; j < 240; j++) {
4717			Isr = inb(ha->io_addr + IPS_REG_HISR);
4718			if (Isr & IPS_BIT_GHI)
4719				break;
4720
4721			/* Delay for 1 Second */
4722			MDELAY(IPS_ONE_SEC);
4723		}
4724
4725		if (j >= 240)
4726			/* error occurred */
4727			return (0);
4728
4729		inb(ha->io_addr + IPS_REG_ISPR);
4730		outb(Isr, ha->io_addr + IPS_REG_HISR);
4731	}
4732
4733	for (i = 0; i < 240; i++) {
4734		Cbsp = inb(ha->io_addr + IPS_REG_CBSP);
4735
4736		if ((Cbsp & IPS_BIT_OP) == 0)
4737			break;
4738
4739		/* Delay for 1 Second */
4740		MDELAY(IPS_ONE_SEC);
4741	}
4742
4743	if (i >= 240)
4744		/* reset failed */
4745		return (0);
4746
4747	/* setup CCCR */
4748	outl(0x1010, ha->io_addr + IPS_REG_CCCR);
4749
4750	/* Enable busmastering */
4751	outb(IPS_BIT_EBM, ha->io_addr + IPS_REG_SCPR);
4752
4753	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
4754		/* fix for anaconda64 */
4755		outl(0, ha->io_addr + IPS_REG_NDAE);
4756
4757	/* Enable interrupts */
4758	outb(IPS_BIT_EI, ha->io_addr + IPS_REG_HISR);
4759
4760	return (1);
4761}
4762
4763/****************************************************************************/
4764/*                                                                          */
4765/* Routine Name: ips_init_copperhead_memio                                  */
4766/*                                                                          */
4767/* Routine Description:                                                     */
4768/*                                                                          */
4769/*   Initialize a copperhead controller with memory mapped I/O              */
4770/*                                                                          */
4771/****************************************************************************/
4772static int
4773ips_init_copperhead_memio(ips_ha_t * ha)
4774{
4775	uint8_t Isr = 0;
4776	uint8_t Cbsp;
4777	uint8_t PostByte[IPS_MAX_POST_BYTES];
 
4778	int i, j;
4779
4780	METHOD_TRACE("ips_init_copperhead_memio", 1);
4781
4782	for (i = 0; i < IPS_MAX_POST_BYTES; i++) {
4783		for (j = 0; j < 45; j++) {
4784			Isr = readb(ha->mem_ptr + IPS_REG_HISR);
4785			if (Isr & IPS_BIT_GHI)
4786				break;
4787
4788			/* Delay for 1 Second */
4789			MDELAY(IPS_ONE_SEC);
4790		}
4791
4792		if (j >= 45)
4793			/* error occurred */
4794			return (0);
4795
4796		PostByte[i] = readb(ha->mem_ptr + IPS_REG_ISPR);
4797		writeb(Isr, ha->mem_ptr + IPS_REG_HISR);
4798	}
4799
4800	if (PostByte[0] < IPS_GOOD_POST_STATUS) {
4801		IPS_PRINTK(KERN_WARNING, ha->pcidev,
4802			   "reset controller fails (post status %x %x).\n",
4803			   PostByte[0], PostByte[1]);
4804
4805		return (0);
4806	}
4807
4808	for (i = 0; i < IPS_MAX_CONFIG_BYTES; i++) {
4809		for (j = 0; j < 240; j++) {
4810			Isr = readb(ha->mem_ptr + IPS_REG_HISR);
4811			if (Isr & IPS_BIT_GHI)
4812				break;
4813
4814			/* Delay for 1 Second */
4815			MDELAY(IPS_ONE_SEC);
4816		}
4817
4818		if (j >= 240)
4819			/* error occurred */
4820			return (0);
4821
4822		readb(ha->mem_ptr + IPS_REG_ISPR);
4823		writeb(Isr, ha->mem_ptr + IPS_REG_HISR);
4824	}
4825
4826	for (i = 0; i < 240; i++) {
4827		Cbsp = readb(ha->mem_ptr + IPS_REG_CBSP);
4828
4829		if ((Cbsp & IPS_BIT_OP) == 0)
4830			break;
4831
4832		/* Delay for 1 Second */
4833		MDELAY(IPS_ONE_SEC);
4834	}
4835
4836	if (i >= 240)
4837		/* error occurred */
4838		return (0);
4839
4840	/* setup CCCR */
4841	writel(0x1010, ha->mem_ptr + IPS_REG_CCCR);
4842
4843	/* Enable busmastering */
4844	writeb(IPS_BIT_EBM, ha->mem_ptr + IPS_REG_SCPR);
4845
4846	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
4847		/* fix for anaconda64 */
4848		writel(0, ha->mem_ptr + IPS_REG_NDAE);
4849
4850	/* Enable interrupts */
4851	writeb(IPS_BIT_EI, ha->mem_ptr + IPS_REG_HISR);
4852
4853	/* if we get here then everything went OK */
4854	return (1);
4855}
4856
4857/****************************************************************************/
4858/*                                                                          */
4859/* Routine Name: ips_init_morpheus                                          */
4860/*                                                                          */
4861/* Routine Description:                                                     */
4862/*                                                                          */
4863/*   Initialize a morpheus controller                                       */
4864/*                                                                          */
4865/****************************************************************************/
4866static int
4867ips_init_morpheus(ips_ha_t * ha)
4868{
4869	uint32_t Post;
4870	uint32_t Config;
4871	uint32_t Isr;
4872	uint32_t Oimr;
4873	int i;
4874
4875	METHOD_TRACE("ips_init_morpheus", 1);
4876
4877	/* Wait up to 45 secs for Post */
4878	for (i = 0; i < 45; i++) {
4879		Isr = readl(ha->mem_ptr + IPS_REG_I2O_HIR);
4880
4881		if (Isr & IPS_BIT_I960_MSG0I)
4882			break;
4883
4884		/* Delay for 1 Second */
4885		MDELAY(IPS_ONE_SEC);
4886	}
4887
4888	if (i >= 45) {
4889		/* error occurred */
4890		IPS_PRINTK(KERN_WARNING, ha->pcidev,
4891			   "timeout waiting for post.\n");
4892
4893		return (0);
4894	}
4895
4896	Post = readl(ha->mem_ptr + IPS_REG_I960_MSG0);
4897
4898	if (Post == 0x4F00) {	/* If Flashing the Battery PIC         */
4899		IPS_PRINTK(KERN_WARNING, ha->pcidev,
4900			   "Flashing Battery PIC, Please wait ...\n");
4901
4902		/* Clear the interrupt bit */
4903		Isr = (uint32_t) IPS_BIT_I960_MSG0I;
4904		writel(Isr, ha->mem_ptr + IPS_REG_I2O_HIR);
4905
4906		for (i = 0; i < 120; i++) {	/*    Wait Up to 2 Min. for Completion */
4907			Post = readl(ha->mem_ptr + IPS_REG_I960_MSG0);
4908			if (Post != 0x4F00)
4909				break;
4910			/* Delay for 1 Second */
4911			MDELAY(IPS_ONE_SEC);
4912		}
4913
4914		if (i >= 120) {
4915			IPS_PRINTK(KERN_WARNING, ha->pcidev,
4916				   "timeout waiting for Battery PIC Flash\n");
4917			return (0);
4918		}
4919
4920	}
4921
4922	/* Clear the interrupt bit */
4923	Isr = (uint32_t) IPS_BIT_I960_MSG0I;
4924	writel(Isr, ha->mem_ptr + IPS_REG_I2O_HIR);
4925
4926	if (Post < (IPS_GOOD_POST_STATUS << 8)) {
4927		IPS_PRINTK(KERN_WARNING, ha->pcidev,
4928			   "reset controller fails (post status %x).\n", Post);
4929
4930		return (0);
4931	}
4932
4933	/* Wait up to 240 secs for config bytes */
4934	for (i = 0; i < 240; i++) {
4935		Isr = readl(ha->mem_ptr + IPS_REG_I2O_HIR);
4936
4937		if (Isr & IPS_BIT_I960_MSG1I)
4938			break;
4939
4940		/* Delay for 1 Second */
4941		MDELAY(IPS_ONE_SEC);
4942	}
4943
4944	if (i >= 240) {
4945		/* error occurred */
4946		IPS_PRINTK(KERN_WARNING, ha->pcidev,
4947			   "timeout waiting for config.\n");
4948
4949		return (0);
4950	}
4951
4952	Config = readl(ha->mem_ptr + IPS_REG_I960_MSG1);
4953
4954	/* Clear interrupt bit */
4955	Isr = (uint32_t) IPS_BIT_I960_MSG1I;
4956	writel(Isr, ha->mem_ptr + IPS_REG_I2O_HIR);
4957
4958	/* Turn on the interrupts */
4959	Oimr = readl(ha->mem_ptr + IPS_REG_I960_OIMR);
4960	Oimr &= ~0x8;
4961	writel(Oimr, ha->mem_ptr + IPS_REG_I960_OIMR);
4962
4963	/* if we get here then everything went OK */
4964
4965	/* Since we did a RESET, an EraseStripeLock may be needed */
4966	if (Post == 0xEF10) {
4967		if ((Config == 0x000F) || (Config == 0x0009))
4968			ha->requires_esl = 1;
4969	}
4970
4971	return (1);
4972}
4973
4974/****************************************************************************/
4975/*                                                                          */
4976/* Routine Name: ips_reset_copperhead                                       */
4977/*                                                                          */
4978/* Routine Description:                                                     */
4979/*                                                                          */
4980/*   Reset the controller                                                   */
4981/*                                                                          */
4982/****************************************************************************/
4983static int
4984ips_reset_copperhead(ips_ha_t * ha)
4985{
4986	int reset_counter;
4987
4988	METHOD_TRACE("ips_reset_copperhead", 1);
4989
4990	DEBUG_VAR(1, "(%s%d) ips_reset_copperhead: io addr: %x, irq: %d",
4991		  ips_name, ha->host_num, ha->io_addr, ha->pcidev->irq);
4992
4993	reset_counter = 0;
4994
4995	while (reset_counter < 2) {
4996		reset_counter++;
4997
4998		outb(IPS_BIT_RST, ha->io_addr + IPS_REG_SCPR);
4999
5000		/* Delay for 1 Second */
5001		MDELAY(IPS_ONE_SEC);
5002
5003		outb(0, ha->io_addr + IPS_REG_SCPR);
5004
5005		/* Delay for 1 Second */
5006		MDELAY(IPS_ONE_SEC);
5007
5008		if ((*ha->func.init) (ha))
5009			break;
5010		else if (reset_counter >= 2) {
5011
5012			return (0);
5013		}
5014	}
5015
5016	return (1);
5017}
5018
5019/****************************************************************************/
5020/*                                                                          */
5021/* Routine Name: ips_reset_copperhead_memio                                 */
5022/*                                                                          */
5023/* Routine Description:                                                     */
5024/*                                                                          */
5025/*   Reset the controller                                                   */
5026/*                                                                          */
5027/****************************************************************************/
5028static int
5029ips_reset_copperhead_memio(ips_ha_t * ha)
5030{
5031	int reset_counter;
5032
5033	METHOD_TRACE("ips_reset_copperhead_memio", 1);
5034
5035	DEBUG_VAR(1, "(%s%d) ips_reset_copperhead_memio: mem addr: %x, irq: %d",
5036		  ips_name, ha->host_num, ha->mem_addr, ha->pcidev->irq);
5037
5038	reset_counter = 0;
5039
5040	while (reset_counter < 2) {
5041		reset_counter++;
5042
5043		writeb(IPS_BIT_RST, ha->mem_ptr + IPS_REG_SCPR);
5044
5045		/* Delay for 1 Second */
5046		MDELAY(IPS_ONE_SEC);
5047
5048		writeb(0, ha->mem_ptr + IPS_REG_SCPR);
5049
5050		/* Delay for 1 Second */
5051		MDELAY(IPS_ONE_SEC);
5052
5053		if ((*ha->func.init) (ha))
5054			break;
5055		else if (reset_counter >= 2) {
5056
5057			return (0);
5058		}
5059	}
5060
5061	return (1);
5062}
5063
5064/****************************************************************************/
5065/*                                                                          */
5066/* Routine Name: ips_reset_morpheus                                         */
5067/*                                                                          */
5068/* Routine Description:                                                     */
5069/*                                                                          */
5070/*   Reset the controller                                                   */
5071/*                                                                          */
5072/****************************************************************************/
5073static int
5074ips_reset_morpheus(ips_ha_t * ha)
5075{
5076	int reset_counter;
5077	uint8_t junk;
5078
5079	METHOD_TRACE("ips_reset_morpheus", 1);
5080
5081	DEBUG_VAR(1, "(%s%d) ips_reset_morpheus: mem addr: %x, irq: %d",
5082		  ips_name, ha->host_num, ha->mem_addr, ha->pcidev->irq);
5083
5084	reset_counter = 0;
5085
5086	while (reset_counter < 2) {
5087		reset_counter++;
5088
5089		writel(0x80000000, ha->mem_ptr + IPS_REG_I960_IDR);
5090
5091		/* Delay for 5 Seconds */
5092		MDELAY(5 * IPS_ONE_SEC);
5093
5094		/* Do a PCI config read to wait for adapter */
5095		pci_read_config_byte(ha->pcidev, 4, &junk);
5096
5097		if ((*ha->func.init) (ha))
5098			break;
5099		else if (reset_counter >= 2) {
5100
5101			return (0);
5102		}
5103	}
5104
5105	return (1);
5106}
5107
5108/****************************************************************************/
5109/*                                                                          */
5110/* Routine Name: ips_statinit                                               */
5111/*                                                                          */
5112/* Routine Description:                                                     */
5113/*                                                                          */
5114/*   Initialize the status queues on the controller                         */
5115/*                                                                          */
5116/****************************************************************************/
5117static void
5118ips_statinit(ips_ha_t * ha)
5119{
5120	uint32_t phys_status_start;
5121
5122	METHOD_TRACE("ips_statinit", 1);
5123
5124	ha->adapt->p_status_start = ha->adapt->status;
5125	ha->adapt->p_status_end = ha->adapt->status + IPS_MAX_CMDS;
5126	ha->adapt->p_status_tail = ha->adapt->status;
5127
5128	phys_status_start = ha->adapt->hw_status_start;
5129	outl(phys_status_start, ha->io_addr + IPS_REG_SQSR);
5130	outl(phys_status_start + IPS_STATUS_Q_SIZE,
5131	     ha->io_addr + IPS_REG_SQER);
5132	outl(phys_status_start + IPS_STATUS_SIZE,
5133	     ha->io_addr + IPS_REG_SQHR);
5134	outl(phys_status_start, ha->io_addr + IPS_REG_SQTR);
5135
5136	ha->adapt->hw_status_tail = phys_status_start;
5137}
5138
5139/****************************************************************************/
5140/*                                                                          */
5141/* Routine Name: ips_statinit_memio                                         */
5142/*                                                                          */
5143/* Routine Description:                                                     */
5144/*                                                                          */
5145/*   Initialize the status queues on the controller                         */
5146/*                                                                          */
5147/****************************************************************************/
5148static void
5149ips_statinit_memio(ips_ha_t * ha)
5150{
5151	uint32_t phys_status_start;
5152
5153	METHOD_TRACE("ips_statinit_memio", 1);
5154
5155	ha->adapt->p_status_start = ha->adapt->status;
5156	ha->adapt->p_status_end = ha->adapt->status + IPS_MAX_CMDS;
5157	ha->adapt->p_status_tail = ha->adapt->status;
5158
5159	phys_status_start = ha->adapt->hw_status_start;
5160	writel(phys_status_start, ha->mem_ptr + IPS_REG_SQSR);
5161	writel(phys_status_start + IPS_STATUS_Q_SIZE,
5162	       ha->mem_ptr + IPS_REG_SQER);
5163	writel(phys_status_start + IPS_STATUS_SIZE, ha->mem_ptr + IPS_REG_SQHR);
5164	writel(phys_status_start, ha->mem_ptr + IPS_REG_SQTR);
5165
5166	ha->adapt->hw_status_tail = phys_status_start;
5167}
5168
5169/****************************************************************************/
5170/*                                                                          */
5171/* Routine Name: ips_statupd_copperhead                                     */
5172/*                                                                          */
5173/* Routine Description:                                                     */
5174/*                                                                          */
5175/*   Remove an element from the status queue                                */
5176/*                                                                          */
5177/****************************************************************************/
5178static uint32_t
5179ips_statupd_copperhead(ips_ha_t * ha)
5180{
5181	METHOD_TRACE("ips_statupd_copperhead", 1);
5182
5183	if (ha->adapt->p_status_tail != ha->adapt->p_status_end) {
5184		ha->adapt->p_status_tail++;
5185		ha->adapt->hw_status_tail += sizeof (IPS_STATUS);
5186	} else {
5187		ha->adapt->p_status_tail = ha->adapt->p_status_start;
5188		ha->adapt->hw_status_tail = ha->adapt->hw_status_start;
5189	}
5190
5191	outl(ha->adapt->hw_status_tail,
5192	     ha->io_addr + IPS_REG_SQTR);
5193
5194	return (ha->adapt->p_status_tail->value);
5195}
5196
5197/****************************************************************************/
5198/*                                                                          */
5199/* Routine Name: ips_statupd_copperhead_memio                               */
5200/*                                                                          */
5201/* Routine Description:                                                     */
5202/*                                                                          */
5203/*   Remove an element from the status queue                                */
5204/*                                                                          */
5205/****************************************************************************/
5206static uint32_t
5207ips_statupd_copperhead_memio(ips_ha_t * ha)
5208{
5209	METHOD_TRACE("ips_statupd_copperhead_memio", 1);
5210
5211	if (ha->adapt->p_status_tail != ha->adapt->p_status_end) {
5212		ha->adapt->p_status_tail++;
5213		ha->adapt->hw_status_tail += sizeof (IPS_STATUS);
5214	} else {
5215		ha->adapt->p_status_tail = ha->adapt->p_status_start;
5216		ha->adapt->hw_status_tail = ha->adapt->hw_status_start;
5217	}
5218
5219	writel(ha->adapt->hw_status_tail, ha->mem_ptr + IPS_REG_SQTR);
5220
5221	return (ha->adapt->p_status_tail->value);
5222}
5223
5224/****************************************************************************/
5225/*                                                                          */
5226/* Routine Name: ips_statupd_morpheus                                       */
5227/*                                                                          */
5228/* Routine Description:                                                     */
5229/*                                                                          */
5230/*   Remove an element from the status queue                                */
5231/*                                                                          */
5232/****************************************************************************/
5233static uint32_t
5234ips_statupd_morpheus(ips_ha_t * ha)
5235{
5236	uint32_t val;
5237
5238	METHOD_TRACE("ips_statupd_morpheus", 1);
5239
5240	val = readl(ha->mem_ptr + IPS_REG_I2O_OUTMSGQ);
5241
5242	return (val);
5243}
5244
5245/****************************************************************************/
5246/*                                                                          */
5247/* Routine Name: ips_issue_copperhead                                       */
5248/*                                                                          */
5249/* Routine Description:                                                     */
5250/*                                                                          */
5251/*   Send a command down to the controller                                  */
5252/*                                                                          */
5253/****************************************************************************/
5254static int
5255ips_issue_copperhead(ips_ha_t * ha, ips_scb_t * scb)
5256{
5257	uint32_t TimeOut;
5258	uint32_t val;
5259
5260	METHOD_TRACE("ips_issue_copperhead", 1);
5261
5262	if (scb->scsi_cmd) {
5263		DEBUG_VAR(2, "(%s%d) ips_issue: cmd 0x%X id %d (%d %d %d)",
5264			  ips_name,
5265			  ha->host_num,
5266			  scb->cdb[0],
5267			  scb->cmd.basic_io.command_id,
5268			  scb->bus, scb->target_id, scb->lun);
5269	} else {
5270		DEBUG_VAR(2, KERN_NOTICE "(%s%d) ips_issue: logical cmd id %d",
5271			  ips_name, ha->host_num, scb->cmd.basic_io.command_id);
5272	}
5273
5274	TimeOut = 0;
5275
5276	while ((val =
5277		le32_to_cpu(inl(ha->io_addr + IPS_REG_CCCR))) & IPS_BIT_SEM) {
5278		udelay(1000);
5279
5280		if (++TimeOut >= IPS_SEM_TIMEOUT) {
5281			if (!(val & IPS_BIT_START_STOP))
5282				break;
5283
5284			IPS_PRINTK(KERN_WARNING, ha->pcidev,
5285				   "ips_issue val [0x%x].\n", val);
5286			IPS_PRINTK(KERN_WARNING, ha->pcidev,
5287				   "ips_issue semaphore chk timeout.\n");
5288
5289			return (IPS_FAILURE);
5290		}		/* end if */
5291	}			/* end while */
5292
5293	outl(scb->scb_busaddr, ha->io_addr + IPS_REG_CCSAR);
5294	outw(IPS_BIT_START_CMD, ha->io_addr + IPS_REG_CCCR);
5295
5296	return (IPS_SUCCESS);
5297}
5298
5299/****************************************************************************/
5300/*                                                                          */
5301/* Routine Name: ips_issue_copperhead_memio                                 */
5302/*                                                                          */
5303/* Routine Description:                                                     */
5304/*                                                                          */
5305/*   Send a command down to the controller                                  */
5306/*                                                                          */
5307/****************************************************************************/
5308static int
5309ips_issue_copperhead_memio(ips_ha_t * ha, ips_scb_t * scb)
5310{
5311	uint32_t TimeOut;
5312	uint32_t val;
5313
5314	METHOD_TRACE("ips_issue_copperhead_memio", 1);
5315
5316	if (scb->scsi_cmd) {
5317		DEBUG_VAR(2, "(%s%d) ips_issue: cmd 0x%X id %d (%d %d %d)",
5318			  ips_name,
5319			  ha->host_num,
5320			  scb->cdb[0],
5321			  scb->cmd.basic_io.command_id,
5322			  scb->bus, scb->target_id, scb->lun);
5323	} else {
5324		DEBUG_VAR(2, "(%s%d) ips_issue: logical cmd id %d",
5325			  ips_name, ha->host_num, scb->cmd.basic_io.command_id);
5326	}
5327
5328	TimeOut = 0;
5329
5330	while ((val = readl(ha->mem_ptr + IPS_REG_CCCR)) & IPS_BIT_SEM) {
5331		udelay(1000);
5332
5333		if (++TimeOut >= IPS_SEM_TIMEOUT) {
5334			if (!(val & IPS_BIT_START_STOP))
5335				break;
5336
5337			IPS_PRINTK(KERN_WARNING, ha->pcidev,
5338				   "ips_issue val [0x%x].\n", val);
5339			IPS_PRINTK(KERN_WARNING, ha->pcidev,
5340				   "ips_issue semaphore chk timeout.\n");
5341
5342			return (IPS_FAILURE);
5343		}		/* end if */
5344	}			/* end while */
5345
5346	writel(scb->scb_busaddr, ha->mem_ptr + IPS_REG_CCSAR);
5347	writel(IPS_BIT_START_CMD, ha->mem_ptr + IPS_REG_CCCR);
5348
5349	return (IPS_SUCCESS);
5350}
5351
5352/****************************************************************************/
5353/*                                                                          */
5354/* Routine Name: ips_issue_i2o                                              */
5355/*                                                                          */
5356/* Routine Description:                                                     */
5357/*                                                                          */
5358/*   Send a command down to the controller                                  */
5359/*                                                                          */
5360/****************************************************************************/
5361static int
5362ips_issue_i2o(ips_ha_t * ha, ips_scb_t * scb)
5363{
5364
5365	METHOD_TRACE("ips_issue_i2o", 1);
5366
5367	if (scb->scsi_cmd) {
5368		DEBUG_VAR(2, "(%s%d) ips_issue: cmd 0x%X id %d (%d %d %d)",
5369			  ips_name,
5370			  ha->host_num,
5371			  scb->cdb[0],
5372			  scb->cmd.basic_io.command_id,
5373			  scb->bus, scb->target_id, scb->lun);
5374	} else {
5375		DEBUG_VAR(2, "(%s%d) ips_issue: logical cmd id %d",
5376			  ips_name, ha->host_num, scb->cmd.basic_io.command_id);
5377	}
5378
5379	outl(scb->scb_busaddr, ha->io_addr + IPS_REG_I2O_INMSGQ);
5380
5381	return (IPS_SUCCESS);
5382}
5383
5384/****************************************************************************/
5385/*                                                                          */
5386/* Routine Name: ips_issue_i2o_memio                                        */
5387/*                                                                          */
5388/* Routine Description:                                                     */
5389/*                                                                          */
5390/*   Send a command down to the controller                                  */
5391/*                                                                          */
5392/****************************************************************************/
5393static int
5394ips_issue_i2o_memio(ips_ha_t * ha, ips_scb_t * scb)
5395{
5396
5397	METHOD_TRACE("ips_issue_i2o_memio", 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	writel(scb->scb_busaddr, ha->mem_ptr + IPS_REG_I2O_INMSGQ);
5412
5413	return (IPS_SUCCESS);
5414}
5415
5416/****************************************************************************/
5417/*                                                                          */
5418/* Routine Name: ips_isintr_copperhead                                      */
5419/*                                                                          */
5420/* Routine Description:                                                     */
5421/*                                                                          */
5422/*   Test to see if an interrupt is for us                                  */
5423/*                                                                          */
5424/****************************************************************************/
5425static int
5426ips_isintr_copperhead(ips_ha_t * ha)
5427{
5428	uint8_t Isr;
5429
5430	METHOD_TRACE("ips_isintr_copperhead", 2);
5431
5432	Isr = inb(ha->io_addr + IPS_REG_HISR);
5433
5434	if (Isr == 0xFF)
5435		/* ?!?! Nothing really there */
5436		return (0);
5437
5438	if (Isr & IPS_BIT_SCE)
5439		return (1);
5440	else if (Isr & (IPS_BIT_SQO | IPS_BIT_GHI)) {
5441		/* status queue overflow or GHI */
5442		/* just clear the interrupt */
5443		outb(Isr, ha->io_addr + IPS_REG_HISR);
5444	}
5445
5446	return (0);
5447}
5448
5449/****************************************************************************/
5450/*                                                                          */
5451/* Routine Name: ips_isintr_copperhead_memio                                */
5452/*                                                                          */
5453/* Routine Description:                                                     */
5454/*                                                                          */
5455/*   Test to see if an interrupt is for us                                  */
5456/*                                                                          */
5457/****************************************************************************/
5458static int
5459ips_isintr_copperhead_memio(ips_ha_t * ha)
5460{
5461	uint8_t Isr;
5462
5463	METHOD_TRACE("ips_isintr_memio", 2);
5464
5465	Isr = readb(ha->mem_ptr + IPS_REG_HISR);
5466
5467	if (Isr == 0xFF)
5468		/* ?!?! Nothing really there */
5469		return (0);
5470
5471	if (Isr & IPS_BIT_SCE)
5472		return (1);
5473	else if (Isr & (IPS_BIT_SQO | IPS_BIT_GHI)) {
5474		/* status queue overflow or GHI */
5475		/* just clear the interrupt */
5476		writeb(Isr, ha->mem_ptr + IPS_REG_HISR);
5477	}
5478
5479	return (0);
5480}
5481
5482/****************************************************************************/
5483/*                                                                          */
5484/* Routine Name: ips_isintr_morpheus                                        */
5485/*                                                                          */
5486/* Routine Description:                                                     */
5487/*                                                                          */
5488/*   Test to see if an interrupt is for us                                  */
5489/*                                                                          */
5490/****************************************************************************/
5491static int
5492ips_isintr_morpheus(ips_ha_t * ha)
5493{
5494	uint32_t Isr;
5495
5496	METHOD_TRACE("ips_isintr_morpheus", 2);
5497
5498	Isr = readl(ha->mem_ptr + IPS_REG_I2O_HIR);
5499
5500	if (Isr & IPS_BIT_I2O_OPQI)
5501		return (1);
5502	else
5503		return (0);
5504}
5505
5506/****************************************************************************/
5507/*                                                                          */
5508/* Routine Name: ips_wait                                                   */
5509/*                                                                          */
5510/* Routine Description:                                                     */
5511/*                                                                          */
5512/*   Wait for a command to complete                                         */
5513/*                                                                          */
5514/****************************************************************************/
5515static int
5516ips_wait(ips_ha_t * ha, int time, int intr)
5517{
5518	int ret;
5519	int done;
5520
5521	METHOD_TRACE("ips_wait", 1);
5522
5523	ret = IPS_FAILURE;
5524	done = false;
5525
5526	time *= IPS_ONE_SEC;	/* convert seconds */
5527
5528	while ((time > 0) && (!done)) {
5529		if (intr == IPS_INTR_ON) {
5530			if (!ha->waitflag) {
5531				ret = IPS_SUCCESS;
5532				done = true;
5533				break;
5534			}
5535		} else if (intr == IPS_INTR_IORL) {
5536			if (!ha->waitflag) {
5537				/*
5538				 * controller generated an interrupt to
5539				 * acknowledge completion of the command
5540				 * and ips_intr() has serviced the interrupt.
5541				 */
5542				ret = IPS_SUCCESS;
5543				done = true;
5544				break;
5545			}
5546
5547			/*
5548			 * NOTE: we already have the io_request_lock so
5549			 * even if we get an interrupt it won't get serviced
5550			 * until after we finish.
5551			 */
5552
5553			(*ha->func.intr) (ha);
5554		}
5555
5556		/* This looks like a very evil loop, but it only does this during start-up */
5557		udelay(1000);
5558		time--;
5559	}
5560
5561	return (ret);
5562}
5563
5564/****************************************************************************/
5565/*                                                                          */
5566/* Routine Name: ips_write_driver_status                                    */
5567/*                                                                          */
5568/* Routine Description:                                                     */
5569/*                                                                          */
5570/*   Write OS/Driver version to Page 5 of the nvram on the controller       */
5571/*                                                                          */
5572/****************************************************************************/
5573static int
5574ips_write_driver_status(ips_ha_t * ha, int intr)
5575{
5576	METHOD_TRACE("ips_write_driver_status", 1);
5577
5578	if (!ips_readwrite_page5(ha, false, intr)) {
5579		IPS_PRINTK(KERN_WARNING, ha->pcidev,
5580			   "unable to read NVRAM page 5.\n");
5581
5582		return (0);
5583	}
5584
5585	/* check to make sure the page has a valid */
5586	/* signature */
5587	if (le32_to_cpu(ha->nvram->signature) != IPS_NVRAM_P5_SIG) {
5588		DEBUG_VAR(1,
5589			  "(%s%d) NVRAM page 5 has an invalid signature: %X.",
5590			  ips_name, ha->host_num, ha->nvram->signature);
5591		ha->nvram->signature = IPS_NVRAM_P5_SIG;
5592	}
5593
5594	DEBUG_VAR(2,
5595		  "(%s%d) Ad Type: %d, Ad Slot: %d, BIOS: %c%c%c%c %c%c%c%c.",
5596		  ips_name, ha->host_num, le16_to_cpu(ha->nvram->adapter_type),
5597		  ha->nvram->adapter_slot, ha->nvram->bios_high[0],
5598		  ha->nvram->bios_high[1], ha->nvram->bios_high[2],
5599		  ha->nvram->bios_high[3], ha->nvram->bios_low[0],
5600		  ha->nvram->bios_low[1], ha->nvram->bios_low[2],
5601		  ha->nvram->bios_low[3]);
5602
5603	ips_get_bios_version(ha, intr);
5604
5605	/* change values (as needed) */
5606	ha->nvram->operating_system = IPS_OS_LINUX;
5607	ha->nvram->adapter_type = ha->ad_type;
5608	memcpy((char *) ha->nvram->driver_high, IPS_VERSION_HIGH, 4);
5609	memcpy((char *) ha->nvram->driver_low, IPS_VERSION_LOW, 4);
5610	memcpy((char *) ha->nvram->bios_high, ha->bios_version, 4);
5611	memcpy((char *) ha->nvram->bios_low, ha->bios_version + 4, 4);
5612
5613	ha->nvram->versioning = 0;	/* Indicate the Driver Does Not Support Versioning */
5614
5615	/* now update the page */
5616	if (!ips_readwrite_page5(ha, true, intr)) {
5617		IPS_PRINTK(KERN_WARNING, ha->pcidev,
5618			   "unable to write NVRAM page 5.\n");
5619
5620		return (0);
5621	}
5622
5623	/* IF NVRAM Page 5 is OK, Use it for Slot Number Info Because Linux Doesn't Do Slots */
5624	ha->slot_num = ha->nvram->adapter_slot;
5625
5626	return (1);
5627}
5628
5629/****************************************************************************/
5630/*                                                                          */
5631/* Routine Name: ips_read_adapter_status                                    */
5632/*                                                                          */
5633/* Routine Description:                                                     */
5634/*                                                                          */
5635/*   Do an Inquiry command to the adapter                                   */
5636/*                                                                          */
5637/****************************************************************************/
5638static int
5639ips_read_adapter_status(ips_ha_t * ha, int intr)
5640{
5641	ips_scb_t *scb;
5642	int ret;
5643
5644	METHOD_TRACE("ips_read_adapter_status", 1);
5645
5646	scb = &ha->scbs[ha->max_cmds - 1];
5647
5648	ips_init_scb(ha, scb);
5649
5650	scb->timeout = ips_cmd_timeout;
5651	scb->cdb[0] = IPS_CMD_ENQUIRY;
5652
5653	scb->cmd.basic_io.op_code = IPS_CMD_ENQUIRY;
5654	scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
5655	scb->cmd.basic_io.sg_count = 0;
5656	scb->cmd.basic_io.lba = 0;
5657	scb->cmd.basic_io.sector_count = 0;
5658	scb->cmd.basic_io.log_drv = 0;
5659	scb->data_len = sizeof (*ha->enq);
5660	scb->cmd.basic_io.sg_addr = ha->enq_busaddr;
5661
5662	/* send command */
5663	if (((ret =
5664	      ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE)
5665	    || (ret == IPS_SUCCESS_IMM)
5666	    || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1))
5667		return (0);
5668
5669	return (1);
5670}
5671
5672/****************************************************************************/
5673/*                                                                          */
5674/* Routine Name: ips_read_subsystem_parameters                              */
5675/*                                                                          */
5676/* Routine Description:                                                     */
5677/*                                                                          */
5678/*   Read subsystem parameters from the adapter                             */
5679/*                                                                          */
5680/****************************************************************************/
5681static int
5682ips_read_subsystem_parameters(ips_ha_t * ha, int intr)
5683{
5684	ips_scb_t *scb;
5685	int ret;
5686
5687	METHOD_TRACE("ips_read_subsystem_parameters", 1);
5688
5689	scb = &ha->scbs[ha->max_cmds - 1];
5690
5691	ips_init_scb(ha, scb);
5692
5693	scb->timeout = ips_cmd_timeout;
5694	scb->cdb[0] = IPS_CMD_GET_SUBSYS;
5695
5696	scb->cmd.basic_io.op_code = IPS_CMD_GET_SUBSYS;
5697	scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
5698	scb->cmd.basic_io.sg_count = 0;
5699	scb->cmd.basic_io.lba = 0;
5700	scb->cmd.basic_io.sector_count = 0;
5701	scb->cmd.basic_io.log_drv = 0;
5702	scb->data_len = sizeof (*ha->subsys);
5703	scb->cmd.basic_io.sg_addr = ha->ioctl_busaddr;
5704
5705	/* send command */
5706	if (((ret =
5707	      ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE)
5708	    || (ret == IPS_SUCCESS_IMM)
5709	    || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1))
5710		return (0);
5711
5712	memcpy(ha->subsys, ha->ioctl_data, sizeof(*ha->subsys));
5713	return (1);
5714}
5715
5716/****************************************************************************/
5717/*                                                                          */
5718/* Routine Name: ips_read_config                                            */
5719/*                                                                          */
5720/* Routine Description:                                                     */
5721/*                                                                          */
5722/*   Read the configuration on the adapter                                  */
5723/*                                                                          */
5724/****************************************************************************/
5725static int
5726ips_read_config(ips_ha_t * ha, int intr)
5727{
5728	ips_scb_t *scb;
5729	int i;
5730	int ret;
5731
5732	METHOD_TRACE("ips_read_config", 1);
5733
5734	/* set defaults for initiator IDs */
5735	for (i = 0; i < 4; i++)
5736		ha->conf->init_id[i] = 7;
5737
5738	scb = &ha->scbs[ha->max_cmds - 1];
5739
5740	ips_init_scb(ha, scb);
5741
5742	scb->timeout = ips_cmd_timeout;
5743	scb->cdb[0] = IPS_CMD_READ_CONF;
5744
5745	scb->cmd.basic_io.op_code = IPS_CMD_READ_CONF;
5746	scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
5747	scb->data_len = sizeof (*ha->conf);
5748	scb->cmd.basic_io.sg_addr = ha->ioctl_busaddr;
5749
5750	/* send command */
5751	if (((ret =
5752	      ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE)
5753	    || (ret == IPS_SUCCESS_IMM)
5754	    || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) {
5755
5756		memset(ha->conf, 0, sizeof (IPS_CONF));
5757
5758		/* reset initiator IDs */
5759		for (i = 0; i < 4; i++)
5760			ha->conf->init_id[i] = 7;
5761
5762		/* Allow Completed with Errors, so JCRM can access the Adapter to fix the problems */
5763		if ((scb->basic_status & IPS_GSC_STATUS_MASK) ==
5764		    IPS_CMD_CMPLT_WERROR)
5765			return (1);
5766
5767		return (0);
5768	}
5769
5770	memcpy(ha->conf, ha->ioctl_data, sizeof(*ha->conf));
5771	return (1);
5772}
5773
5774/****************************************************************************/
5775/*                                                                          */
5776/* Routine Name: ips_readwrite_page5                                        */
5777/*                                                                          */
5778/* Routine Description:                                                     */
5779/*                                                                          */
5780/*   Read nvram page 5 from the adapter                                     */
5781/*                                                                          */
5782/****************************************************************************/
5783static int
5784ips_readwrite_page5(ips_ha_t * ha, int write, int intr)
5785{
5786	ips_scb_t *scb;
5787	int ret;
5788
5789	METHOD_TRACE("ips_readwrite_page5", 1);
5790
5791	scb = &ha->scbs[ha->max_cmds - 1];
5792
5793	ips_init_scb(ha, scb);
5794
5795	scb->timeout = ips_cmd_timeout;
5796	scb->cdb[0] = IPS_CMD_RW_NVRAM_PAGE;
5797
5798	scb->cmd.nvram.op_code = IPS_CMD_RW_NVRAM_PAGE;
5799	scb->cmd.nvram.command_id = IPS_COMMAND_ID(ha, scb);
5800	scb->cmd.nvram.page = 5;
5801	scb->cmd.nvram.write = write;
5802	scb->cmd.nvram.reserved = 0;
5803	scb->cmd.nvram.reserved2 = 0;
5804	scb->data_len = sizeof (*ha->nvram);
5805	scb->cmd.nvram.buffer_addr = ha->ioctl_busaddr;
5806	if (write)
5807		memcpy(ha->ioctl_data, ha->nvram, sizeof(*ha->nvram));
5808
5809	/* issue the command */
5810	if (((ret =
5811	      ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE)
5812	    || (ret == IPS_SUCCESS_IMM)
5813	    || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) {
5814
5815		memset(ha->nvram, 0, sizeof (IPS_NVRAM_P5));
5816
5817		return (0);
5818	}
5819	if (!write)
5820		memcpy(ha->nvram, ha->ioctl_data, sizeof(*ha->nvram));
5821	return (1);
5822}
5823
5824/****************************************************************************/
5825/*                                                                          */
5826/* Routine Name: ips_clear_adapter                                          */
5827/*                                                                          */
5828/* Routine Description:                                                     */
5829/*                                                                          */
5830/*   Clear the stripe lock tables                                           */
5831/*                                                                          */
5832/****************************************************************************/
5833static int
5834ips_clear_adapter(ips_ha_t * ha, int intr)
5835{
5836	ips_scb_t *scb;
5837	int ret;
5838
5839	METHOD_TRACE("ips_clear_adapter", 1);
5840
5841	scb = &ha->scbs[ha->max_cmds - 1];
5842
5843	ips_init_scb(ha, scb);
5844
5845	scb->timeout = ips_reset_timeout;
5846	scb->cdb[0] = IPS_CMD_CONFIG_SYNC;
5847
5848	scb->cmd.config_sync.op_code = IPS_CMD_CONFIG_SYNC;
5849	scb->cmd.config_sync.command_id = IPS_COMMAND_ID(ha, scb);
5850	scb->cmd.config_sync.channel = 0;
5851	scb->cmd.config_sync.source_target = IPS_POCL;
5852	scb->cmd.config_sync.reserved = 0;
5853	scb->cmd.config_sync.reserved2 = 0;
5854	scb->cmd.config_sync.reserved3 = 0;
5855
5856	/* issue command */
5857	if (((ret =
5858	      ips_send_wait(ha, scb, ips_reset_timeout, intr)) == IPS_FAILURE)
5859	    || (ret == IPS_SUCCESS_IMM)
5860	    || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1))
5861		return (0);
5862
5863	/* send unlock stripe command */
5864	ips_init_scb(ha, scb);
5865
5866	scb->cdb[0] = IPS_CMD_ERROR_TABLE;
5867	scb->timeout = ips_reset_timeout;
5868
5869	scb->cmd.unlock_stripe.op_code = IPS_CMD_ERROR_TABLE;
5870	scb->cmd.unlock_stripe.command_id = IPS_COMMAND_ID(ha, scb);
5871	scb->cmd.unlock_stripe.log_drv = 0;
5872	scb->cmd.unlock_stripe.control = IPS_CSL;
5873	scb->cmd.unlock_stripe.reserved = 0;
5874	scb->cmd.unlock_stripe.reserved2 = 0;
5875	scb->cmd.unlock_stripe.reserved3 = 0;
5876
5877	/* issue command */
5878	if (((ret =
5879	      ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE)
5880	    || (ret == IPS_SUCCESS_IMM)
5881	    || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1))
5882		return (0);
5883
5884	return (1);
5885}
5886
5887/****************************************************************************/
5888/*                                                                          */
5889/* Routine Name: ips_ffdc_reset                                             */
5890/*                                                                          */
5891/* Routine Description:                                                     */
5892/*                                                                          */
5893/*   FFDC: write reset info                                                 */
5894/*                                                                          */
5895/****************************************************************************/
5896static void
5897ips_ffdc_reset(ips_ha_t * ha, int intr)
5898{
5899	ips_scb_t *scb;
5900
5901	METHOD_TRACE("ips_ffdc_reset", 1);
5902
5903	scb = &ha->scbs[ha->max_cmds - 1];
5904
5905	ips_init_scb(ha, scb);
5906
5907	scb->timeout = ips_cmd_timeout;
5908	scb->cdb[0] = IPS_CMD_FFDC;
5909	scb->cmd.ffdc.op_code = IPS_CMD_FFDC;
5910	scb->cmd.ffdc.command_id = IPS_COMMAND_ID(ha, scb);
5911	scb->cmd.ffdc.reset_count = ha->reset_count;
5912	scb->cmd.ffdc.reset_type = 0x80;
5913
5914	/* convert time to what the card wants */
5915	ips_fix_ffdc_time(ha, scb, ha->last_ffdc);
5916
5917	/* issue command */
5918	ips_send_wait(ha, scb, ips_cmd_timeout, intr);
5919}
5920
5921/****************************************************************************/
5922/*                                                                          */
5923/* Routine Name: ips_ffdc_time                                              */
5924/*                                                                          */
5925/* Routine Description:                                                     */
5926/*                                                                          */
5927/*   FFDC: write time info                                                  */
5928/*                                                                          */
5929/****************************************************************************/
5930static void
5931ips_ffdc_time(ips_ha_t * ha)
5932{
5933	ips_scb_t *scb;
5934
5935	METHOD_TRACE("ips_ffdc_time", 1);
5936
5937	DEBUG_VAR(1, "(%s%d) Sending time update.", ips_name, ha->host_num);
5938
5939	scb = &ha->scbs[ha->max_cmds - 1];
5940
5941	ips_init_scb(ha, scb);
5942
5943	scb->timeout = ips_cmd_timeout;
5944	scb->cdb[0] = IPS_CMD_FFDC;
5945	scb->cmd.ffdc.op_code = IPS_CMD_FFDC;
5946	scb->cmd.ffdc.command_id = IPS_COMMAND_ID(ha, scb);
5947	scb->cmd.ffdc.reset_count = 0;
5948	scb->cmd.ffdc.reset_type = 0;
5949
5950	/* convert time to what the card wants */
5951	ips_fix_ffdc_time(ha, scb, ha->last_ffdc);
5952
5953	/* issue command */
5954	ips_send_wait(ha, scb, ips_cmd_timeout, IPS_FFDC);
5955}
5956
5957/****************************************************************************/
5958/*                                                                          */
5959/* Routine Name: ips_fix_ffdc_time                                          */
5960/*                                                                          */
5961/* Routine Description:                                                     */
5962/*   Adjust time_t to what the card wants                                   */
5963/*                                                                          */
5964/****************************************************************************/
5965static void
5966ips_fix_ffdc_time(ips_ha_t * ha, ips_scb_t * scb, time64_t current_time)
5967{
5968	struct tm tm;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5969
5970	METHOD_TRACE("ips_fix_ffdc_time", 1);
5971
5972	time64_to_tm(current_time, 0, &tm);
 
5973
5974	scb->cmd.ffdc.hour   = tm.tm_hour;
5975	scb->cmd.ffdc.minute = tm.tm_min;
5976	scb->cmd.ffdc.second = tm.tm_sec;
5977	scb->cmd.ffdc.yearH  = (tm.tm_year + 1900) / 100;
5978	scb->cmd.ffdc.yearL  = tm.tm_year % 100;
5979	scb->cmd.ffdc.month  = tm.tm_mon + 1;
5980	scb->cmd.ffdc.day    = tm.tm_mday;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5981}
5982
5983/****************************************************************************
5984 * BIOS Flash Routines                                                      *
5985 ****************************************************************************/
5986
5987/****************************************************************************/
5988/*                                                                          */
5989/* Routine Name: ips_erase_bios                                             */
5990/*                                                                          */
5991/* Routine Description:                                                     */
5992/*   Erase the BIOS on the adapter                                          */
5993/*                                                                          */
5994/****************************************************************************/
5995static int
5996ips_erase_bios(ips_ha_t * ha)
5997{
5998	int timeout;
5999	uint8_t status = 0;
6000
6001	METHOD_TRACE("ips_erase_bios", 1);
6002
6003	status = 0;
6004
6005	/* Clear the status register */
6006	outl(0, ha->io_addr + IPS_REG_FLAP);
6007	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6008		udelay(25);	/* 25 us */
6009
6010	outb(0x50, ha->io_addr + IPS_REG_FLDP);
6011	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6012		udelay(25);	/* 25 us */
6013
6014	/* Erase Setup */
6015	outb(0x20, ha->io_addr + IPS_REG_FLDP);
6016	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6017		udelay(25);	/* 25 us */
6018
6019	/* Erase Confirm */
6020	outb(0xD0, ha->io_addr + IPS_REG_FLDP);
6021	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6022		udelay(25);	/* 25 us */
6023
6024	/* Erase Status */
6025	outb(0x70, ha->io_addr + IPS_REG_FLDP);
6026	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6027		udelay(25);	/* 25 us */
6028
6029	timeout = 80000;	/* 80 seconds */
6030
6031	while (timeout > 0) {
6032		if (ha->pcidev->revision == IPS_REVID_TROMBONE64) {
6033			outl(0, ha->io_addr + IPS_REG_FLAP);
6034			udelay(25);	/* 25 us */
6035		}
6036
6037		status = inb(ha->io_addr + IPS_REG_FLDP);
6038
6039		if (status & 0x80)
6040			break;
6041
6042		MDELAY(1);
6043		timeout--;
6044	}
6045
6046	/* check for timeout */
6047	if (timeout <= 0) {
6048		/* timeout */
6049
6050		/* try to suspend the erase */
6051		outb(0xB0, ha->io_addr + IPS_REG_FLDP);
6052		if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6053			udelay(25);	/* 25 us */
6054
6055		/* wait for 10 seconds */
6056		timeout = 10000;
6057		while (timeout > 0) {
6058			if (ha->pcidev->revision == IPS_REVID_TROMBONE64) {
6059				outl(0, ha->io_addr + IPS_REG_FLAP);
6060				udelay(25);	/* 25 us */
6061			}
6062
6063			status = inb(ha->io_addr + IPS_REG_FLDP);
6064
6065			if (status & 0xC0)
6066				break;
6067
6068			MDELAY(1);
6069			timeout--;
6070		}
6071
6072		return (1);
6073	}
6074
6075	/* check for valid VPP */
6076	if (status & 0x08)
6077		/* VPP failure */
6078		return (1);
6079
6080	/* check for successful flash */
6081	if (status & 0x30)
6082		/* sequence error */
6083		return (1);
6084
6085	/* Otherwise, we were successful */
6086	/* clear status */
6087	outb(0x50, ha->io_addr + IPS_REG_FLDP);
6088	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6089		udelay(25);	/* 25 us */
6090
6091	/* enable reads */
6092	outb(0xFF, ha->io_addr + IPS_REG_FLDP);
6093	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6094		udelay(25);	/* 25 us */
6095
6096	return (0);
6097}
6098
6099/****************************************************************************/
6100/*                                                                          */
6101/* Routine Name: ips_erase_bios_memio                                       */
6102/*                                                                          */
6103/* Routine Description:                                                     */
6104/*   Erase the BIOS on the adapter                                          */
6105/*                                                                          */
6106/****************************************************************************/
6107static int
6108ips_erase_bios_memio(ips_ha_t * ha)
6109{
6110	int timeout;
6111	uint8_t status;
6112
6113	METHOD_TRACE("ips_erase_bios_memio", 1);
6114
6115	status = 0;
6116
6117	/* Clear the status register */
6118	writel(0, ha->mem_ptr + IPS_REG_FLAP);
6119	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6120		udelay(25);	/* 25 us */
6121
6122	writeb(0x50, ha->mem_ptr + IPS_REG_FLDP);
6123	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6124		udelay(25);	/* 25 us */
6125
6126	/* Erase Setup */
6127	writeb(0x20, ha->mem_ptr + IPS_REG_FLDP);
6128	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6129		udelay(25);	/* 25 us */
6130
6131	/* Erase Confirm */
6132	writeb(0xD0, ha->mem_ptr + IPS_REG_FLDP);
6133	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6134		udelay(25);	/* 25 us */
6135
6136	/* Erase Status */
6137	writeb(0x70, ha->mem_ptr + IPS_REG_FLDP);
6138	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6139		udelay(25);	/* 25 us */
6140
6141	timeout = 80000;	/* 80 seconds */
6142
6143	while (timeout > 0) {
6144		if (ha->pcidev->revision == IPS_REVID_TROMBONE64) {
6145			writel(0, ha->mem_ptr + IPS_REG_FLAP);
6146			udelay(25);	/* 25 us */
6147		}
6148
6149		status = readb(ha->mem_ptr + IPS_REG_FLDP);
6150
6151		if (status & 0x80)
6152			break;
6153
6154		MDELAY(1);
6155		timeout--;
6156	}
6157
6158	/* check for timeout */
6159	if (timeout <= 0) {
6160		/* timeout */
6161
6162		/* try to suspend the erase */
6163		writeb(0xB0, ha->mem_ptr + IPS_REG_FLDP);
6164		if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6165			udelay(25);	/* 25 us */
6166
6167		/* wait for 10 seconds */
6168		timeout = 10000;
6169		while (timeout > 0) {
6170			if (ha->pcidev->revision == IPS_REVID_TROMBONE64) {
6171				writel(0, ha->mem_ptr + IPS_REG_FLAP);
6172				udelay(25);	/* 25 us */
6173			}
6174
6175			status = readb(ha->mem_ptr + IPS_REG_FLDP);
6176
6177			if (status & 0xC0)
6178				break;
6179
6180			MDELAY(1);
6181			timeout--;
6182		}
6183
6184		return (1);
6185	}
6186
6187	/* check for valid VPP */
6188	if (status & 0x08)
6189		/* VPP failure */
6190		return (1);
6191
6192	/* check for successful flash */
6193	if (status & 0x30)
6194		/* sequence error */
6195		return (1);
6196
6197	/* Otherwise, we were successful */
6198	/* clear status */
6199	writeb(0x50, ha->mem_ptr + IPS_REG_FLDP);
6200	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6201		udelay(25);	/* 25 us */
6202
6203	/* enable reads */
6204	writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP);
6205	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6206		udelay(25);	/* 25 us */
6207
6208	return (0);
6209}
6210
6211/****************************************************************************/
6212/*                                                                          */
6213/* Routine Name: ips_program_bios                                           */
6214/*                                                                          */
6215/* Routine Description:                                                     */
6216/*   Program the BIOS on the adapter                                        */
6217/*                                                                          */
6218/****************************************************************************/
6219static int
6220ips_program_bios(ips_ha_t * ha, char *buffer, uint32_t buffersize,
6221		 uint32_t offset)
6222{
6223	int i;
6224	int timeout;
6225	uint8_t status = 0;
6226
6227	METHOD_TRACE("ips_program_bios", 1);
6228
6229	status = 0;
6230
6231	for (i = 0; i < buffersize; i++) {
6232		/* write a byte */
6233		outl(i + offset, ha->io_addr + IPS_REG_FLAP);
6234		if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6235			udelay(25);	/* 25 us */
6236
6237		outb(0x40, ha->io_addr + IPS_REG_FLDP);
6238		if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6239			udelay(25);	/* 25 us */
6240
6241		outb(buffer[i], ha->io_addr + IPS_REG_FLDP);
6242		if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6243			udelay(25);	/* 25 us */
6244
6245		/* wait up to one second */
6246		timeout = 1000;
6247		while (timeout > 0) {
6248			if (ha->pcidev->revision == IPS_REVID_TROMBONE64) {
6249				outl(0, ha->io_addr + IPS_REG_FLAP);
6250				udelay(25);	/* 25 us */
6251			}
6252
6253			status = inb(ha->io_addr + IPS_REG_FLDP);
6254
6255			if (status & 0x80)
6256				break;
6257
6258			MDELAY(1);
6259			timeout--;
6260		}
6261
6262		if (timeout == 0) {
6263			/* timeout error */
6264			outl(0, ha->io_addr + IPS_REG_FLAP);
6265			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6266				udelay(25);	/* 25 us */
6267
6268			outb(0xFF, ha->io_addr + IPS_REG_FLDP);
6269			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6270				udelay(25);	/* 25 us */
6271
6272			return (1);
6273		}
6274
6275		/* check the status */
6276		if (status & 0x18) {
6277			/* programming error */
6278			outl(0, ha->io_addr + IPS_REG_FLAP);
6279			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6280				udelay(25);	/* 25 us */
6281
6282			outb(0xFF, ha->io_addr + IPS_REG_FLDP);
6283			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6284				udelay(25);	/* 25 us */
6285
6286			return (1);
6287		}
6288	}			/* end for */
6289
6290	/* Enable reading */
6291	outl(0, ha->io_addr + IPS_REG_FLAP);
6292	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6293		udelay(25);	/* 25 us */
6294
6295	outb(0xFF, ha->io_addr + IPS_REG_FLDP);
6296	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6297		udelay(25);	/* 25 us */
6298
6299	return (0);
6300}
6301
6302/****************************************************************************/
6303/*                                                                          */
6304/* Routine Name: ips_program_bios_memio                                     */
6305/*                                                                          */
6306/* Routine Description:                                                     */
6307/*   Program the BIOS on the adapter                                        */
6308/*                                                                          */
6309/****************************************************************************/
6310static int
6311ips_program_bios_memio(ips_ha_t * ha, char *buffer, uint32_t buffersize,
6312		       uint32_t offset)
6313{
6314	int i;
6315	int timeout;
6316	uint8_t status = 0;
6317
6318	METHOD_TRACE("ips_program_bios_memio", 1);
6319
6320	status = 0;
6321
6322	for (i = 0; i < buffersize; i++) {
6323		/* write a byte */
6324		writel(i + offset, ha->mem_ptr + IPS_REG_FLAP);
6325		if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6326			udelay(25);	/* 25 us */
6327
6328		writeb(0x40, ha->mem_ptr + IPS_REG_FLDP);
6329		if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6330			udelay(25);	/* 25 us */
6331
6332		writeb(buffer[i], ha->mem_ptr + IPS_REG_FLDP);
6333		if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6334			udelay(25);	/* 25 us */
6335
6336		/* wait up to one second */
6337		timeout = 1000;
6338		while (timeout > 0) {
6339			if (ha->pcidev->revision == IPS_REVID_TROMBONE64) {
6340				writel(0, ha->mem_ptr + IPS_REG_FLAP);
6341				udelay(25);	/* 25 us */
6342			}
6343
6344			status = readb(ha->mem_ptr + IPS_REG_FLDP);
6345
6346			if (status & 0x80)
6347				break;
6348
6349			MDELAY(1);
6350			timeout--;
6351		}
6352
6353		if (timeout == 0) {
6354			/* timeout error */
6355			writel(0, ha->mem_ptr + IPS_REG_FLAP);
6356			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6357				udelay(25);	/* 25 us */
6358
6359			writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP);
6360			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6361				udelay(25);	/* 25 us */
6362
6363			return (1);
6364		}
6365
6366		/* check the status */
6367		if (status & 0x18) {
6368			/* programming error */
6369			writel(0, ha->mem_ptr + IPS_REG_FLAP);
6370			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6371				udelay(25);	/* 25 us */
6372
6373			writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP);
6374			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6375				udelay(25);	/* 25 us */
6376
6377			return (1);
6378		}
6379	}			/* end for */
6380
6381	/* Enable reading */
6382	writel(0, ha->mem_ptr + IPS_REG_FLAP);
6383	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6384		udelay(25);	/* 25 us */
6385
6386	writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP);
6387	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6388		udelay(25);	/* 25 us */
6389
6390	return (0);
6391}
6392
6393/****************************************************************************/
6394/*                                                                          */
6395/* Routine Name: ips_verify_bios                                            */
6396/*                                                                          */
6397/* Routine Description:                                                     */
6398/*   Verify the BIOS on the adapter                                         */
6399/*                                                                          */
6400/****************************************************************************/
6401static int
6402ips_verify_bios(ips_ha_t * ha, char *buffer, uint32_t buffersize,
6403		uint32_t offset)
6404{
6405	uint8_t checksum;
6406	int i;
6407
6408	METHOD_TRACE("ips_verify_bios", 1);
6409
6410	/* test 1st byte */
6411	outl(0, ha->io_addr + IPS_REG_FLAP);
6412	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6413		udelay(25);	/* 25 us */
6414
6415	if (inb(ha->io_addr + IPS_REG_FLDP) != 0x55)
6416		return (1);
6417
6418	outl(1, ha->io_addr + IPS_REG_FLAP);
6419	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6420		udelay(25);	/* 25 us */
6421	if (inb(ha->io_addr + IPS_REG_FLDP) != 0xAA)
6422		return (1);
6423
6424	checksum = 0xff;
6425	for (i = 2; i < buffersize; i++) {
6426
6427		outl(i + offset, ha->io_addr + IPS_REG_FLAP);
6428		if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6429			udelay(25);	/* 25 us */
6430
6431		checksum = (uint8_t) checksum + inb(ha->io_addr + IPS_REG_FLDP);
6432	}
6433
6434	if (checksum != 0)
6435		/* failure */
6436		return (1);
6437	else
6438		/* success */
6439		return (0);
6440}
6441
6442/****************************************************************************/
6443/*                                                                          */
6444/* Routine Name: ips_verify_bios_memio                                      */
6445/*                                                                          */
6446/* Routine Description:                                                     */
6447/*   Verify the BIOS on the adapter                                         */
6448/*                                                                          */
6449/****************************************************************************/
6450static int
6451ips_verify_bios_memio(ips_ha_t * ha, char *buffer, uint32_t buffersize,
6452		      uint32_t offset)
6453{
6454	uint8_t checksum;
6455	int i;
6456
6457	METHOD_TRACE("ips_verify_bios_memio", 1);
6458
6459	/* test 1st byte */
6460	writel(0, ha->mem_ptr + IPS_REG_FLAP);
6461	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6462		udelay(25);	/* 25 us */
6463
6464	if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0x55)
6465		return (1);
6466
6467	writel(1, ha->mem_ptr + IPS_REG_FLAP);
6468	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6469		udelay(25);	/* 25 us */
6470	if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0xAA)
6471		return (1);
6472
6473	checksum = 0xff;
6474	for (i = 2; i < buffersize; i++) {
6475
6476		writel(i + offset, ha->mem_ptr + IPS_REG_FLAP);
6477		if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6478			udelay(25);	/* 25 us */
6479
6480		checksum =
6481		    (uint8_t) checksum + readb(ha->mem_ptr + IPS_REG_FLDP);
6482	}
6483
6484	if (checksum != 0)
6485		/* failure */
6486		return (1);
6487	else
6488		/* success */
6489		return (0);
6490}
6491
6492/****************************************************************************/
6493/*                                                                          */
6494/* Routine Name: ips_abort_init                                             */
6495/*                                                                          */
6496/* Routine Description:                                                     */
6497/*   cleanup routine for a failed adapter initialization                    */
6498/****************************************************************************/
6499static int
6500ips_abort_init(ips_ha_t * ha, int index)
6501{
6502	ha->active = 0;
6503	ips_free(ha);
6504	ips_ha[index] = NULL;
6505	ips_sh[index] = NULL;
6506	return -1;
6507}
6508
6509/****************************************************************************/
6510/*                                                                          */
6511/* Routine Name: ips_shift_controllers                                      */
6512/*                                                                          */
6513/* Routine Description:                                                     */
6514/*   helper function for ordering adapters                                  */
6515/****************************************************************************/
6516static void
6517ips_shift_controllers(int lowindex, int highindex)
6518{
6519	ips_ha_t *ha_sav = ips_ha[highindex];
6520	struct Scsi_Host *sh_sav = ips_sh[highindex];
6521	int i;
6522
6523	for (i = highindex; i > lowindex; i--) {
6524		ips_ha[i] = ips_ha[i - 1];
6525		ips_sh[i] = ips_sh[i - 1];
6526		ips_ha[i]->host_num = i;
6527	}
6528	ha_sav->host_num = lowindex;
6529	ips_ha[lowindex] = ha_sav;
6530	ips_sh[lowindex] = sh_sav;
6531}
6532
6533/****************************************************************************/
6534/*                                                                          */
6535/* Routine Name: ips_order_controllers                                      */
6536/*                                                                          */
6537/* Routine Description:                                                     */
6538/*   place controllers is the "proper" boot order                           */
6539/****************************************************************************/
6540static void
6541ips_order_controllers(void)
6542{
6543	int i, j, tmp, position = 0;
6544	IPS_NVRAM_P5 *nvram;
6545	if (!ips_ha[0])
6546		return;
6547	nvram = ips_ha[0]->nvram;
6548
6549	if (nvram->adapter_order[0]) {
6550		for (i = 1; i <= nvram->adapter_order[0]; i++) {
6551			for (j = position; j < ips_num_controllers; j++) {
6552				switch (ips_ha[j]->ad_type) {
6553				case IPS_ADTYPE_SERVERAID6M:
6554				case IPS_ADTYPE_SERVERAID7M:
6555					if (nvram->adapter_order[i] == 'M') {
6556						ips_shift_controllers(position,
6557								      j);
6558						position++;
6559					}
6560					break;
6561				case IPS_ADTYPE_SERVERAID4L:
6562				case IPS_ADTYPE_SERVERAID4M:
6563				case IPS_ADTYPE_SERVERAID4MX:
6564				case IPS_ADTYPE_SERVERAID4LX:
6565					if (nvram->adapter_order[i] == 'N') {
6566						ips_shift_controllers(position,
6567								      j);
6568						position++;
6569					}
6570					break;
6571				case IPS_ADTYPE_SERVERAID6I:
6572				case IPS_ADTYPE_SERVERAID5I2:
6573				case IPS_ADTYPE_SERVERAID5I1:
6574				case IPS_ADTYPE_SERVERAID7k:
6575					if (nvram->adapter_order[i] == 'S') {
6576						ips_shift_controllers(position,
6577								      j);
6578						position++;
6579					}
6580					break;
6581				case IPS_ADTYPE_SERVERAID:
6582				case IPS_ADTYPE_SERVERAID2:
6583				case IPS_ADTYPE_NAVAJO:
6584				case IPS_ADTYPE_KIOWA:
6585				case IPS_ADTYPE_SERVERAID3L:
6586				case IPS_ADTYPE_SERVERAID3:
6587				case IPS_ADTYPE_SERVERAID4H:
6588					if (nvram->adapter_order[i] == 'A') {
6589						ips_shift_controllers(position,
6590								      j);
6591						position++;
6592					}
6593					break;
6594				default:
6595					break;
6596				}
6597			}
6598		}
6599		/* if adapter_order[0], then ordering is complete */
6600		return;
6601	}
6602	/* old bios, use older ordering */
6603	tmp = 0;
6604	for (i = position; i < ips_num_controllers; i++) {
6605		if (ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID5I2 ||
6606		    ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID5I1) {
6607			ips_shift_controllers(position, i);
6608			position++;
6609			tmp = 1;
6610		}
6611	}
6612	/* if there were no 5I cards, then don't do any extra ordering */
6613	if (!tmp)
6614		return;
6615	for (i = position; i < ips_num_controllers; i++) {
6616		if (ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID4L ||
6617		    ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID4M ||
6618		    ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID4LX ||
6619		    ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID4MX) {
6620			ips_shift_controllers(position, i);
6621			position++;
6622		}
6623	}
6624
6625	return;
6626}
6627
6628/****************************************************************************/
6629/*                                                                          */
6630/* Routine Name: ips_register_scsi                                          */
6631/*                                                                          */
6632/* Routine Description:                                                     */
6633/*   perform any registration and setup with the scsi layer                 */
6634/****************************************************************************/
6635static int
6636ips_register_scsi(int index)
6637{
6638	struct Scsi_Host *sh;
6639	ips_ha_t *ha, *oldha = ips_ha[index];
6640	sh = scsi_host_alloc(&ips_driver_template, sizeof (ips_ha_t));
6641	if (!sh) {
6642		IPS_PRINTK(KERN_WARNING, oldha->pcidev,
6643			   "Unable to register controller with SCSI subsystem\n");
6644		return -1;
6645	}
6646	ha = IPS_HA(sh);
6647	memcpy(ha, oldha, sizeof (ips_ha_t));
6648	free_irq(oldha->pcidev->irq, oldha);
6649	/* Install the interrupt handler with the new ha */
6650	if (request_irq(ha->pcidev->irq, do_ipsintr, IRQF_SHARED, ips_name, ha)) {
6651		IPS_PRINTK(KERN_WARNING, ha->pcidev,
6652			   "Unable to install interrupt handler\n");
6653		goto err_out_sh;
6654	}
6655
6656	kfree(oldha);
6657
6658	/* Store away needed values for later use */
6659	sh->unique_id = (ha->io_addr) ? ha->io_addr : ha->mem_addr;
6660	sh->sg_tablesize = sh->hostt->sg_tablesize;
6661	sh->can_queue = sh->hostt->can_queue;
6662	sh->cmd_per_lun = sh->hostt->cmd_per_lun;
 
6663	sh->max_sectors = 128;
6664
6665	sh->max_id = ha->ntargets;
6666	sh->max_lun = ha->nlun;
6667	sh->max_channel = ha->nbus - 1;
6668	sh->can_queue = ha->max_cmds - 1;
6669
6670	if (scsi_add_host(sh, &ha->pcidev->dev))
6671		goto err_out;
6672
6673	ips_sh[index] = sh;
6674	ips_ha[index] = ha;
6675
6676	scsi_scan_host(sh);
6677
6678	return 0;
6679
6680err_out:
6681	free_irq(ha->pcidev->irq, ha);
6682err_out_sh:
6683	scsi_host_put(sh);
6684	return -1;
6685}
6686
6687/*---------------------------------------------------------------------------*/
6688/*   Routine Name: ips_remove_device                                         */
6689/*                                                                           */
6690/*   Routine Description:                                                    */
6691/*     Remove one Adapter ( Hot Plugging )                                   */
6692/*---------------------------------------------------------------------------*/
6693static void
6694ips_remove_device(struct pci_dev *pci_dev)
6695{
6696	struct Scsi_Host *sh = pci_get_drvdata(pci_dev);
6697
6698	pci_set_drvdata(pci_dev, NULL);
6699
6700	ips_release(sh);
6701
6702	pci_release_regions(pci_dev);
6703	pci_disable_device(pci_dev);
6704}
6705
6706/****************************************************************************/
6707/*                                                                          */
6708/* Routine Name: ips_module_init                                            */
6709/*                                                                          */
6710/* Routine Description:                                                     */
6711/*   function called on module load                                         */
6712/****************************************************************************/
6713static int __init
6714ips_module_init(void)
6715{
6716#if !defined(__i386__) && !defined(__ia64__) && !defined(__x86_64__)
6717	printk(KERN_ERR "ips: This driver has only been tested on the x86/ia64/x86_64 platforms\n");
6718	add_taint(TAINT_CPU_OUT_OF_SPEC, LOCKDEP_STILL_OK);
6719#endif
6720
6721	if (pci_register_driver(&ips_pci_driver) < 0)
6722		return -ENODEV;
6723	ips_driver_template.module = THIS_MODULE;
6724	ips_order_controllers();
6725	if (!ips_detect(&ips_driver_template)) {
6726		pci_unregister_driver(&ips_pci_driver);
6727		return -ENODEV;
6728	}
6729	register_reboot_notifier(&ips_notifier);
6730	return 0;
6731}
6732
6733/****************************************************************************/
6734/*                                                                          */
6735/* Routine Name: ips_module_exit                                            */
6736/*                                                                          */
6737/* Routine Description:                                                     */
6738/*   function called on module unload                                       */
6739/****************************************************************************/
6740static void __exit
6741ips_module_exit(void)
6742{
6743	pci_unregister_driver(&ips_pci_driver);
6744	unregister_reboot_notifier(&ips_notifier);
6745}
6746
6747module_init(ips_module_init);
6748module_exit(ips_module_exit);
6749
6750/*---------------------------------------------------------------------------*/
6751/*   Routine Name: ips_insert_device                                         */
6752/*                                                                           */
6753/*   Routine Description:                                                    */
6754/*     Add One Adapter ( Hot Plug )                                          */
6755/*                                                                           */
6756/*   Return Value:                                                           */
6757/*     0 if Successful, else non-zero                                        */
6758/*---------------------------------------------------------------------------*/
6759static int
6760ips_insert_device(struct pci_dev *pci_dev, const struct pci_device_id *ent)
6761{
6762	int index = -1;
6763	int rc;
6764
6765	METHOD_TRACE("ips_insert_device", 1);
6766	rc = pci_enable_device(pci_dev);
6767	if (rc)
6768		return rc;
6769
6770	rc = pci_request_regions(pci_dev, "ips");
6771	if (rc)
6772		goto err_out;
6773
6774	rc = ips_init_phase1(pci_dev, &index);
6775	if (rc == SUCCESS)
6776		rc = ips_init_phase2(index);
6777
6778	if (ips_hotplug)
6779		if (ips_register_scsi(index)) {
6780			ips_free(ips_ha[index]);
6781			rc = -1;
6782		}
6783
6784	if (rc == SUCCESS)
6785		ips_num_controllers++;
6786
6787	ips_next_controller = ips_num_controllers;
6788
6789	if (rc < 0) {
6790		rc = -ENODEV;
6791		goto err_out_regions;
6792	}
6793
6794	pci_set_drvdata(pci_dev, ips_sh[index]);
6795	return 0;
6796
6797err_out_regions:
6798	pci_release_regions(pci_dev);
6799err_out:
6800	pci_disable_device(pci_dev);
6801	return rc;
6802}
6803
6804/*---------------------------------------------------------------------------*/
6805/*   Routine Name: ips_init_phase1                                           */
6806/*                                                                           */
6807/*   Routine Description:                                                    */
6808/*     Adapter Initialization                                                */
6809/*                                                                           */
6810/*   Return Value:                                                           */
6811/*     0 if Successful, else non-zero                                        */
6812/*---------------------------------------------------------------------------*/
6813static int
6814ips_init_phase1(struct pci_dev *pci_dev, int *indexPtr)
6815{
6816	ips_ha_t *ha;
6817	uint32_t io_addr;
6818	uint32_t mem_addr;
6819	uint32_t io_len;
6820	uint32_t mem_len;
 
 
6821	int j;
6822	int index;
6823	dma_addr_t dma_address;
6824	char __iomem *ioremap_ptr;
6825	char __iomem *mem_ptr;
6826	uint32_t IsDead;
6827
6828	METHOD_TRACE("ips_init_phase1", 1);
6829	index = IPS_MAX_ADAPTERS;
6830	for (j = 0; j < IPS_MAX_ADAPTERS; j++) {
6831		if (ips_ha[j] == NULL) {
6832			index = j;
6833			break;
6834		}
6835	}
6836
6837	if (index >= IPS_MAX_ADAPTERS)
6838		return -1;
6839
 
 
 
 
6840	/* Init MEM/IO addresses to 0 */
6841	mem_addr = 0;
6842	io_addr = 0;
6843	mem_len = 0;
6844	io_len = 0;
6845
6846	for (j = 0; j < 2; j++) {
6847		if (!pci_resource_start(pci_dev, j))
6848			break;
6849
6850		if (pci_resource_flags(pci_dev, j) & IORESOURCE_IO) {
6851			io_addr = pci_resource_start(pci_dev, j);
6852			io_len = pci_resource_len(pci_dev, j);
6853		} else {
6854			mem_addr = pci_resource_start(pci_dev, j);
6855			mem_len = pci_resource_len(pci_dev, j);
6856		}
6857	}
6858
6859	/* setup memory mapped area (if applicable) */
6860	if (mem_addr) {
6861		uint32_t base;
6862		uint32_t offs;
6863
6864		base = mem_addr & PAGE_MASK;
6865		offs = mem_addr - base;
6866		ioremap_ptr = ioremap(base, PAGE_SIZE);
6867		if (!ioremap_ptr)
6868			return -1;
6869		mem_ptr = ioremap_ptr + offs;
6870	} else {
6871		ioremap_ptr = NULL;
6872		mem_ptr = NULL;
6873	}
6874
6875	/* found a controller */
6876	ha = kzalloc(sizeof (ips_ha_t), GFP_KERNEL);
6877	if (ha == NULL) {
6878		IPS_PRINTK(KERN_WARNING, pci_dev,
6879			   "Unable to allocate temporary ha struct\n");
6880		return -1;
6881	}
6882
6883	ips_sh[index] = NULL;
6884	ips_ha[index] = ha;
6885	ha->active = 1;
6886
6887	/* Store info in HA structure */
6888	ha->io_addr = io_addr;
6889	ha->io_len = io_len;
6890	ha->mem_addr = mem_addr;
6891	ha->mem_len = mem_len;
6892	ha->mem_ptr = mem_ptr;
6893	ha->ioremap_ptr = ioremap_ptr;
6894	ha->host_num = (uint32_t) index;
6895	ha->slot_num = PCI_SLOT(pci_dev->devfn);
6896	ha->pcidev = pci_dev;
6897
6898	/*
6899	 * Set the pci_dev's dma_mask.  Not all adapters support 64bit
6900	 * addressing so don't enable it if the adapter can't support
6901	 * it!  Also, don't use 64bit addressing if dma addresses
6902	 * are guaranteed to be < 4G.
6903	 */
6904	if (sizeof(dma_addr_t) > 4 && IPS_HAS_ENH_SGLIST(ha) &&
6905	    !dma_set_mask(&ha->pcidev->dev, DMA_BIT_MASK(64))) {
6906		(ha)->flags |= IPS_HA_ENH_SG;
6907	} else {
6908		if (dma_set_mask(&ha->pcidev->dev, DMA_BIT_MASK(32)) != 0) {
6909			printk(KERN_WARNING "Unable to set DMA Mask\n");
6910			return ips_abort_init(ha, index);
6911		}
6912	}
6913	if(ips_cd_boot && !ips_FlashData){
6914		ips_FlashData = dma_alloc_coherent(&pci_dev->dev,
6915				PAGE_SIZE << 7, &ips_flashbusaddr, GFP_KERNEL);
6916	}
6917
6918	ha->enq = dma_alloc_coherent(&pci_dev->dev, sizeof (IPS_ENQ),
6919			&ha->enq_busaddr, GFP_KERNEL);
6920	if (!ha->enq) {
6921		IPS_PRINTK(KERN_WARNING, pci_dev,
6922			   "Unable to allocate host inquiry structure\n");
6923		return ips_abort_init(ha, index);
6924	}
6925
6926	ha->adapt = dma_alloc_coherent(&pci_dev->dev,
6927			sizeof (IPS_ADAPTER) + sizeof (IPS_IO_CMD),
6928			&dma_address, GFP_KERNEL);
6929	if (!ha->adapt) {
6930		IPS_PRINTK(KERN_WARNING, pci_dev,
6931			   "Unable to allocate host adapt & dummy structures\n");
6932		return ips_abort_init(ha, index);
6933	}
6934	ha->adapt->hw_status_start = dma_address;
6935	ha->dummy = (void *) (ha->adapt + 1);
6936
6937
6938
6939	ha->logical_drive_info = dma_alloc_coherent(&pci_dev->dev,
6940			sizeof (IPS_LD_INFO), &dma_address, GFP_KERNEL);
6941	if (!ha->logical_drive_info) {
6942		IPS_PRINTK(KERN_WARNING, pci_dev,
6943			   "Unable to allocate logical drive info structure\n");
6944		return ips_abort_init(ha, index);
6945	}
6946	ha->logical_drive_info_dma_addr = dma_address;
6947
6948
6949	ha->conf = kmalloc(sizeof (IPS_CONF), GFP_KERNEL);
6950
6951	if (!ha->conf) {
6952		IPS_PRINTK(KERN_WARNING, pci_dev,
6953			   "Unable to allocate host conf structure\n");
6954		return ips_abort_init(ha, index);
6955	}
6956
6957	ha->nvram = kmalloc(sizeof (IPS_NVRAM_P5), GFP_KERNEL);
6958
6959	if (!ha->nvram) {
6960		IPS_PRINTK(KERN_WARNING, pci_dev,
6961			   "Unable to allocate host NVRAM structure\n");
6962		return ips_abort_init(ha, index);
6963	}
6964
6965	ha->subsys = kmalloc(sizeof (IPS_SUBSYS), GFP_KERNEL);
6966
6967	if (!ha->subsys) {
6968		IPS_PRINTK(KERN_WARNING, pci_dev,
6969			   "Unable to allocate host subsystem structure\n");
6970		return ips_abort_init(ha, index);
6971	}
6972
6973	/* the ioctl buffer is now used during adapter initialization, so its
6974	 * successful allocation is now required */
6975	if (ips_ioctlsize < PAGE_SIZE)
6976		ips_ioctlsize = PAGE_SIZE;
6977
6978	ha->ioctl_data = dma_alloc_coherent(&pci_dev->dev, ips_ioctlsize,
6979			&ha->ioctl_busaddr, GFP_KERNEL);
6980	ha->ioctl_len = ips_ioctlsize;
6981	if (!ha->ioctl_data) {
6982		IPS_PRINTK(KERN_WARNING, pci_dev,
6983			   "Unable to allocate IOCTL data\n");
6984		return ips_abort_init(ha, index);
6985	}
6986
6987	/*
6988	 * Setup Functions
6989	 */
6990	ips_setup_funclist(ha);
6991
6992	if ((IPS_IS_MORPHEUS(ha)) || (IPS_IS_MARCO(ha))) {
6993		/* If Morpheus appears dead, reset it */
6994		IsDead = readl(ha->mem_ptr + IPS_REG_I960_MSG1);
6995		if (IsDead == 0xDEADBEEF) {
6996			ips_reset_morpheus(ha);
6997		}
6998	}
6999
7000	/*
7001	 * Initialize the card if it isn't already
7002	 */
7003
7004	if (!(*ha->func.isinit) (ha)) {
7005		if (!(*ha->func.init) (ha)) {
7006			/*
7007			 * Initialization failed
7008			 */
7009			IPS_PRINTK(KERN_WARNING, pci_dev,
7010				   "Unable to initialize controller\n");
7011			return ips_abort_init(ha, index);
7012		}
7013	}
7014
7015	*indexPtr = index;
7016	return SUCCESS;
7017}
7018
7019/*---------------------------------------------------------------------------*/
7020/*   Routine Name: ips_init_phase2                                           */
7021/*                                                                           */
7022/*   Routine Description:                                                    */
7023/*     Adapter Initialization Phase 2                                        */
7024/*                                                                           */
7025/*   Return Value:                                                           */
7026/*     0 if Successful, else non-zero                                        */
7027/*---------------------------------------------------------------------------*/
7028static int
7029ips_init_phase2(int index)
7030{
7031	ips_ha_t *ha;
7032
7033	ha = ips_ha[index];
7034
7035	METHOD_TRACE("ips_init_phase2", 1);
7036	if (!ha->active) {
7037		ips_ha[index] = NULL;
7038		return -1;
7039	}
7040
7041	/* Install the interrupt handler */
7042	if (request_irq(ha->pcidev->irq, do_ipsintr, IRQF_SHARED, ips_name, ha)) {
7043		IPS_PRINTK(KERN_WARNING, ha->pcidev,
7044			   "Unable to install interrupt handler\n");
7045		return ips_abort_init(ha, index);
7046	}
7047
7048	/*
7049	 * Allocate a temporary SCB for initialization
7050	 */
7051	ha->max_cmds = 1;
7052	if (!ips_allocatescbs(ha)) {
7053		IPS_PRINTK(KERN_WARNING, ha->pcidev,
7054			   "Unable to allocate a CCB\n");
7055		free_irq(ha->pcidev->irq, ha);
7056		return ips_abort_init(ha, index);
7057	}
7058
7059	if (!ips_hainit(ha)) {
7060		IPS_PRINTK(KERN_WARNING, ha->pcidev,
7061			   "Unable to initialize controller\n");
7062		free_irq(ha->pcidev->irq, ha);
7063		return ips_abort_init(ha, index);
7064	}
7065	/* Free the temporary SCB */
7066	ips_deallocatescbs(ha, 1);
7067
7068	/* allocate CCBs */
7069	if (!ips_allocatescbs(ha)) {
7070		IPS_PRINTK(KERN_WARNING, ha->pcidev,
7071			   "Unable to allocate CCBs\n");
7072		free_irq(ha->pcidev->irq, ha);
7073		return ips_abort_init(ha, index);
7074	}
7075
7076	return SUCCESS;
7077}
7078
7079MODULE_LICENSE("GPL");
7080MODULE_DESCRIPTION("IBM ServeRAID Adapter Driver " IPS_VER_STRING);
7081MODULE_VERSION(IPS_VER_STRING);
v3.15
   1/*****************************************************************************/
   2/* ips.c -- driver for the Adaptec / IBM ServeRAID controller                */
   3/*                                                                           */
   4/* Written By: Keith Mitchell, IBM Corporation                               */
   5/*             Jack Hammer, Adaptec, Inc.                                    */
   6/*             David Jeffery, Adaptec, Inc.                                  */
   7/*                                                                           */
   8/* Copyright (C) 2000 IBM Corporation                                        */
   9/* Copyright (C) 2002,2003 Adaptec, Inc.                                     */
  10/*                                                                           */
  11/* This program is free software; you can redistribute it and/or modify      */
  12/* it under the terms of the GNU General Public License as published by      */
  13/* the Free Software Foundation; either version 2 of the License, or         */
  14/* (at your option) any later version.                                       */
  15/*                                                                           */
  16/* This program is distributed in the hope that it will be useful,           */
  17/* but WITHOUT ANY WARRANTY; without even the implied warranty of            */
  18/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             */
  19/* GNU General Public License for more details.                              */
  20/*                                                                           */
  21/* NO WARRANTY                                                               */
  22/* THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR        */
  23/* CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT      */
  24/* LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,      */
  25/* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is    */
  26/* solely responsible for determining the appropriateness of using and       */
  27/* distributing the Program and assumes all risks associated with its        */
  28/* exercise of rights under this Agreement, including but not limited to     */
  29/* the risks and costs of program errors, damage to or loss of data,         */
  30/* programs or equipment, and unavailability or interruption of operations.  */
  31/*                                                                           */
  32/* DISCLAIMER OF LIABILITY                                                   */
  33/* NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY   */
  34/* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL        */
  35/* DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND   */
  36/* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR     */
  37/* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE    */
  38/* USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED  */
  39/* HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES             */
  40/*                                                                           */
  41/* You should have received a copy of the GNU General Public License         */
  42/* along with this program; if not, write to the Free Software               */
  43/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  44/*                                                                           */
  45/* Bugs/Comments/Suggestions about this driver should be mailed to:          */
  46/*      ipslinux@adaptec.com        	                                     */
  47/*                                                                           */
  48/* For system support issues, contact your local IBM Customer support.       */
  49/* Directions to find IBM Customer Support for each country can be found at: */
  50/*      http://www.ibm.com/planetwide/                                       */
  51/*                                                                           */
  52/*****************************************************************************/
  53
  54/*****************************************************************************/
  55/* Change Log                                                                */
  56/*                                                                           */
  57/* 0.99.02  - Breakup commands that are bigger than 8 * the stripe size      */
  58/* 0.99.03  - Make interrupt routine handle all completed request on the     */
  59/*            adapter not just the first one                                 */
  60/*          - Make sure passthru commands get woken up if we run out of      */
  61/*            SCBs                                                           */
  62/*          - Send all of the commands on the queue at once rather than      */
  63/*            one at a time since the card will support it.                  */
  64/* 0.99.04  - Fix race condition in the passthru mechanism -- this required  */
  65/*            the interface to the utilities to change                       */
  66/*          - Fix error recovery code                                        */
  67/* 0.99.05  - Fix an oops when we get certain passthru commands              */
  68/* 1.00.00  - Initial Public Release                                         */
  69/*            Functionally equivalent to 0.99.05                             */
  70/* 3.60.00  - Bump max commands to 128 for use with firmware 3.60            */
  71/*          - Change version to 3.60 to coincide with release numbering.     */
  72/* 3.60.01  - Remove bogus error check in passthru routine                   */
  73/* 3.60.02  - Make DCDB direction based on lookup table                      */
  74/*          - Only allow one DCDB command to a SCSI ID at a time             */
  75/* 4.00.00  - Add support for ServeRAID 4                                    */
  76/* 4.00.01  - Add support for First Failure Data Capture                     */
  77/* 4.00.02  - Fix problem with PT DCDB with no buffer                        */
  78/* 4.00.03  - Add alternative passthru interface                             */
  79/*          - Add ability to flash BIOS                                      */
  80/* 4.00.04  - Rename structures/constants to be prefixed with IPS_           */
  81/* 4.00.05  - Remove wish_block from init routine                            */
  82/*          - Use linux/spinlock.h instead of asm/spinlock.h for kernels     */
  83/*            2.3.18 and later                                               */
  84/*          - Sync with other changes from the 2.3 kernels                   */
  85/* 4.00.06  - Fix timeout with initial FFDC command                          */
  86/* 4.00.06a - Port to 2.4 (trivial) -- Christoph Hellwig <hch@infradead.org> */
  87/* 4.10.00  - Add support for ServeRAID 4M/4L                                */
  88/* 4.10.13  - Fix for dynamic unload and proc file system                    */
  89/* 4.20.03  - Rename version to coincide with new release schedules          */
  90/*            Performance fixes                                              */
  91/*            Fix truncation of /proc files with cat                         */
  92/*            Merge in changes through kernel 2.4.0test1ac21                 */
  93/* 4.20.13  - Fix some failure cases / reset code                            */
  94/*          - Hook into the reboot_notifier to flush the controller cache    */
  95/* 4.50.01  - Fix problem when there is a hole in logical drive numbering    */
  96/* 4.70.09  - Use a Common ( Large Buffer ) for Flashing from the JCRM CD    */
  97/*          - Add IPSSEND Flash Support                                      */
  98/*          - Set Sense Data for Unknown SCSI Command                        */
  99/*          - Use Slot Number from NVRAM Page 5                              */
 100/*          - Restore caller's DCDB Structure                                */
 101/* 4.70.12  - Corrective actions for bad controller ( during initialization )*/
 102/* 4.70.13  - Don't Send CDB's if we already know the device is not present  */
 103/*          - Don't release HA Lock in ips_next() until SC taken off queue   */
 104/*          - Unregister SCSI device in ips_release()                        */
 105/* 4.70.15  - Fix Breakup for very large ( non-SG ) requests in ips_done()   */
 106/* 4.71.00  - Change all memory allocations to not use GFP_DMA flag          */
 107/*            Code Clean-Up for 2.4.x kernel                                 */
 108/* 4.72.00  - Allow for a Scatter-Gather Element to exceed MAX_XFER Size     */
 109/* 4.72.01  - I/O Mapped Memory release ( so "insmod ips" does not Fail )    */
 110/*          - Don't Issue Internal FFDC Command if there are Active Commands */
 111/*          - Close Window for getting too many IOCTL's active               */
 112/* 4.80.00  - Make ia64 Safe                                                 */
 113/* 4.80.04  - Eliminate calls to strtok() if 2.4.x or greater                */
 114/*          - Adjustments to Device Queue Depth                              */
 115/* 4.80.14  - Take all semaphores off stack                                  */
 116/*          - Clean Up New_IOCTL path                                        */
 117/* 4.80.20  - Set max_sectors in Scsi_Host structure ( if >= 2.4.7 kernel )  */
 118/*          - 5 second delay needed after resetting an i960 adapter          */
 119/* 4.80.26  - Clean up potential code problems ( Arjan's recommendations )   */
 120/* 4.90.01  - Version Matching for FirmWare, BIOS, and Driver                */
 121/* 4.90.05  - Use New PCI Architecture to facilitate Hot Plug Development    */
 122/* 4.90.08  - Increase Delays in Flashing ( Trombone Only - 4H )             */
 123/* 4.90.08  - Data Corruption if First Scatter Gather Element is > 64K       */
 124/* 4.90.11  - Don't actually RESET unless it's physically required           */
 125/*          - Remove unused compile options                                  */
 126/* 5.00.01  - Sarasota ( 5i ) adapters must always be scanned first          */
 127/*          - Get rid on IOCTL_NEW_COMMAND code                              */
 128/*          - Add Extended DCDB Commands for Tape Support in 5I              */
 129/* 5.10.12  - use pci_dma interfaces, update for 2.5 kernel changes          */
 130/* 5.10.15  - remove unused code (sem, macros, etc.)                         */
 131/* 5.30.00  - use __devexit_p()                                              */
 132/* 6.00.00  - Add 6x Adapters and Battery Flash                              */
 133/* 6.10.00  - Remove 1G Addressing Limitations                               */
 134/* 6.11.xx  - Get VersionInfo buffer off the stack !              DDTS 60401 */
 135/* 6.11.xx  - Make Logical Drive Info structure safe for DMA      DDTS 60639 */
 136/* 7.10.18  - Add highmem_io flag in SCSI Templete for 2.4 kernels           */
 137/*          - Fix path/name for scsi_hosts.h include for 2.6 kernels         */
 138/*          - Fix sort order of 7k                                           */
 139/*          - Remove 3 unused "inline" functions                             */
 140/* 7.12.xx  - Use STATIC functions wherever possible                        */
 141/*          - Clean up deprecated MODULE_PARM calls                          */
 142/* 7.12.05  - Remove Version Matching per IBM request                        */
 143/*****************************************************************************/
 144
 145/*
 146 * Conditional Compilation directives for this driver:
 147 *
 148 * IPS_DEBUG            - Turn on debugging info
 149 *
 150 * Parameters:
 151 *
 152 * debug:<number>       - Set debug level to <number>
 153 *                        NOTE: only works when IPS_DEBUG compile directive is used.
 154 *       1              - Normal debug messages
 155 *       2              - Verbose debug messages
 156 *       11             - Method trace (non interrupt)
 157 *       12             - Method trace (includes interrupt)
 158 *
 159 * noi2o                - Don't use I2O Queues (ServeRAID 4 only)
 160 * nommap               - Don't use memory mapped I/O
 161 * ioctlsize            - Initial size of the IOCTL buffer
 162 */
 163
 164#include <asm/io.h>
 165#include <asm/byteorder.h>
 166#include <asm/page.h>
 167#include <linux/stddef.h>
 168#include <linux/string.h>
 169#include <linux/errno.h>
 170#include <linux/kernel.h>
 171#include <linux/ioport.h>
 172#include <linux/slab.h>
 173#include <linux/delay.h>
 174#include <linux/pci.h>
 175#include <linux/proc_fs.h>
 176#include <linux/reboot.h>
 177#include <linux/interrupt.h>
 178
 179#include <linux/blkdev.h>
 180#include <linux/types.h>
 181#include <linux/dma-mapping.h>
 182
 
 
 
 
 
 
 183#include <scsi/sg.h>
 184#include "scsi.h"
 185#include <scsi/scsi_host.h>
 186
 187#include "ips.h"
 188
 189#include <linux/module.h>
 190
 191#include <linux/stat.h>
 192
 193#include <linux/spinlock.h>
 194#include <linux/init.h>
 195
 196#include <linux/smp.h>
 197
 198#ifdef MODULE
 199static char *ips = NULL;
 200module_param(ips, charp, 0);
 201#endif
 202
 203/*
 204 * DRIVER_VER
 205 */
 206#define IPS_VERSION_HIGH        IPS_VER_MAJOR_STRING "." IPS_VER_MINOR_STRING
 207#define IPS_VERSION_LOW         "." IPS_VER_BUILD_STRING " "
 208
 209#if !defined(__i386__) && !defined(__ia64__) && !defined(__x86_64__)
 210#warning "This driver has only been tested on the x86/ia64/x86_64 platforms"
 211#endif
 212
 213#define IPS_DMA_DIR(scb) ((!scb->scsi_cmd || ips_is_passthru(scb->scsi_cmd) || \
 214                         DMA_NONE == scb->scsi_cmd->sc_data_direction) ? \
 215                         PCI_DMA_BIDIRECTIONAL : \
 216                         scb->scsi_cmd->sc_data_direction)
 217
 218#ifdef IPS_DEBUG
 219#define METHOD_TRACE(s, i)    if (ips_debug >= (i+10)) printk(KERN_NOTICE s "\n");
 220#define DEBUG(i, s)           if (ips_debug >= i) printk(KERN_NOTICE s "\n");
 221#define DEBUG_VAR(i, s, v...) if (ips_debug >= i) printk(KERN_NOTICE s "\n", v);
 222#else
 223#define METHOD_TRACE(s, i)
 224#define DEBUG(i, s)
 225#define DEBUG_VAR(i, s, v...)
 226#endif
 227
 228/*
 229 * Function prototypes
 230 */
 231static int ips_detect(struct scsi_host_template *);
 232static int ips_release(struct Scsi_Host *);
 233static int ips_eh_abort(struct scsi_cmnd *);
 234static int ips_eh_reset(struct scsi_cmnd *);
 235static int ips_queue(struct Scsi_Host *, struct scsi_cmnd *);
 236static const char *ips_info(struct Scsi_Host *);
 237static irqreturn_t do_ipsintr(int, void *);
 238static int ips_hainit(ips_ha_t *);
 239static int ips_map_status(ips_ha_t *, ips_scb_t *, ips_stat_t *);
 240static int ips_send_wait(ips_ha_t *, ips_scb_t *, int, int);
 241static int ips_send_cmd(ips_ha_t *, ips_scb_t *);
 242static int ips_online(ips_ha_t *, ips_scb_t *);
 243static int ips_inquiry(ips_ha_t *, ips_scb_t *);
 244static int ips_rdcap(ips_ha_t *, ips_scb_t *);
 245static int ips_msense(ips_ha_t *, ips_scb_t *);
 246static int ips_reqsen(ips_ha_t *, ips_scb_t *);
 247static int ips_deallocatescbs(ips_ha_t *, int);
 248static int ips_allocatescbs(ips_ha_t *);
 249static int ips_reset_copperhead(ips_ha_t *);
 250static int ips_reset_copperhead_memio(ips_ha_t *);
 251static int ips_reset_morpheus(ips_ha_t *);
 252static int ips_issue_copperhead(ips_ha_t *, ips_scb_t *);
 253static int ips_issue_copperhead_memio(ips_ha_t *, ips_scb_t *);
 254static int ips_issue_i2o(ips_ha_t *, ips_scb_t *);
 255static int ips_issue_i2o_memio(ips_ha_t *, ips_scb_t *);
 256static int ips_isintr_copperhead(ips_ha_t *);
 257static int ips_isintr_copperhead_memio(ips_ha_t *);
 258static int ips_isintr_morpheus(ips_ha_t *);
 259static int ips_wait(ips_ha_t *, int, int);
 260static int ips_write_driver_status(ips_ha_t *, int);
 261static int ips_read_adapter_status(ips_ha_t *, int);
 262static int ips_read_subsystem_parameters(ips_ha_t *, int);
 263static int ips_read_config(ips_ha_t *, int);
 264static int ips_clear_adapter(ips_ha_t *, int);
 265static int ips_readwrite_page5(ips_ha_t *, int, int);
 266static int ips_init_copperhead(ips_ha_t *);
 267static int ips_init_copperhead_memio(ips_ha_t *);
 268static int ips_init_morpheus(ips_ha_t *);
 269static int ips_isinit_copperhead(ips_ha_t *);
 270static int ips_isinit_copperhead_memio(ips_ha_t *);
 271static int ips_isinit_morpheus(ips_ha_t *);
 272static int ips_erase_bios(ips_ha_t *);
 273static int ips_program_bios(ips_ha_t *, char *, uint32_t, uint32_t);
 274static int ips_verify_bios(ips_ha_t *, char *, uint32_t, uint32_t);
 275static int ips_erase_bios_memio(ips_ha_t *);
 276static int ips_program_bios_memio(ips_ha_t *, char *, uint32_t, uint32_t);
 277static int ips_verify_bios_memio(ips_ha_t *, char *, uint32_t, uint32_t);
 278static int ips_flash_copperhead(ips_ha_t *, ips_passthru_t *, ips_scb_t *);
 279static int ips_flash_bios(ips_ha_t *, ips_passthru_t *, ips_scb_t *);
 280static int ips_flash_firmware(ips_ha_t *, ips_passthru_t *, ips_scb_t *);
 281static void ips_free_flash_copperhead(ips_ha_t * ha);
 282static void ips_get_bios_version(ips_ha_t *, int);
 283static void ips_identify_controller(ips_ha_t *);
 284static void ips_chkstatus(ips_ha_t *, IPS_STATUS *);
 285static void ips_enable_int_copperhead(ips_ha_t *);
 286static void ips_enable_int_copperhead_memio(ips_ha_t *);
 287static void ips_enable_int_morpheus(ips_ha_t *);
 288static int ips_intr_copperhead(ips_ha_t *);
 289static int ips_intr_morpheus(ips_ha_t *);
 290static void ips_next(ips_ha_t *, int);
 291static void ipsintr_blocking(ips_ha_t *, struct ips_scb *);
 292static void ipsintr_done(ips_ha_t *, struct ips_scb *);
 293static void ips_done(ips_ha_t *, ips_scb_t *);
 294static void ips_free(ips_ha_t *);
 295static void ips_init_scb(ips_ha_t *, ips_scb_t *);
 296static void ips_freescb(ips_ha_t *, ips_scb_t *);
 297static void ips_setup_funclist(ips_ha_t *);
 298static void ips_statinit(ips_ha_t *);
 299static void ips_statinit_memio(ips_ha_t *);
 300static void ips_fix_ffdc_time(ips_ha_t *, ips_scb_t *, time_t);
 301static void ips_ffdc_reset(ips_ha_t *, int);
 302static void ips_ffdc_time(ips_ha_t *);
 303static uint32_t ips_statupd_copperhead(ips_ha_t *);
 304static uint32_t ips_statupd_copperhead_memio(ips_ha_t *);
 305static uint32_t ips_statupd_morpheus(ips_ha_t *);
 306static ips_scb_t *ips_getscb(ips_ha_t *);
 307static void ips_putq_scb_head(ips_scb_queue_t *, ips_scb_t *);
 308static void ips_putq_wait_tail(ips_wait_queue_t *, struct scsi_cmnd *);
 309static void ips_putq_copp_tail(ips_copp_queue_t *,
 310				      ips_copp_wait_item_t *);
 311static ips_scb_t *ips_removeq_scb_head(ips_scb_queue_t *);
 312static ips_scb_t *ips_removeq_scb(ips_scb_queue_t *, ips_scb_t *);
 313static struct scsi_cmnd *ips_removeq_wait_head(ips_wait_queue_t *);
 314static struct scsi_cmnd *ips_removeq_wait(ips_wait_queue_t *,
 315					  struct scsi_cmnd *);
 316static ips_copp_wait_item_t *ips_removeq_copp(ips_copp_queue_t *,
 317						     ips_copp_wait_item_t *);
 318static ips_copp_wait_item_t *ips_removeq_copp_head(ips_copp_queue_t *);
 319
 320static int ips_is_passthru(struct scsi_cmnd *);
 321static int ips_make_passthru(ips_ha_t *, struct scsi_cmnd *, ips_scb_t *, int);
 322static int ips_usrcmd(ips_ha_t *, ips_passthru_t *, ips_scb_t *);
 323static void ips_cleanup_passthru(ips_ha_t *, ips_scb_t *);
 324static void ips_scmd_buf_write(struct scsi_cmnd * scmd, void *data,
 325			       unsigned int count);
 326static void ips_scmd_buf_read(struct scsi_cmnd * scmd, void *data,
 327			      unsigned int count);
 328
 329static int ips_write_info(struct Scsi_Host *, char *, int);
 330static int ips_show_info(struct seq_file *, struct Scsi_Host *);
 331static int ips_host_info(ips_ha_t *, struct seq_file *);
 332static int ips_abort_init(ips_ha_t * ha, int index);
 333static int ips_init_phase2(int index);
 334
 335static int ips_init_phase1(struct pci_dev *pci_dev, int *indexPtr);
 336static int ips_register_scsi(int index);
 337
 338static int  ips_poll_for_flush_complete(ips_ha_t * ha);
 339static void ips_flush_and_reset(ips_ha_t *ha);
 340
 341/*
 342 * global variables
 343 */
 344static const char ips_name[] = "ips";
 345static struct Scsi_Host *ips_sh[IPS_MAX_ADAPTERS];	/* Array of host controller structures */
 346static ips_ha_t *ips_ha[IPS_MAX_ADAPTERS];	/* Array of HA structures */
 347static unsigned int ips_next_controller;
 348static unsigned int ips_num_controllers;
 349static unsigned int ips_released_controllers;
 350static int ips_hotplug;
 351static int ips_cmd_timeout = 60;
 352static int ips_reset_timeout = 60 * 5;
 353static int ips_force_memio = 1;		/* Always use Memory Mapped I/O    */
 354static int ips_force_i2o = 1;	/* Always use I2O command delivery */
 355static int ips_ioctlsize = IPS_IOCTL_SIZE;	/* Size of the ioctl buffer        */
 356static int ips_cd_boot;			/* Booting from Manager CD         */
 357static char *ips_FlashData = NULL;	/* CD Boot - Flash Data Buffer      */
 358static dma_addr_t ips_flashbusaddr;
 359static long ips_FlashDataInUse;		/* CD Boot - Flash Data In Use Flag */
 360static uint32_t MaxLiteCmds = 32;	/* Max Active Cmds for a Lite Adapter */
 361static struct scsi_host_template ips_driver_template = {
 362	.detect			= ips_detect,
 363	.release		= ips_release,
 364	.info			= ips_info,
 365	.queuecommand		= ips_queue,
 366	.eh_abort_handler	= ips_eh_abort,
 367	.eh_host_reset_handler	= ips_eh_reset,
 368	.proc_name		= "ips",
 369	.show_info		= ips_show_info,
 370	.write_info		= ips_write_info,
 371	.slave_configure	= ips_slave_configure,
 372	.bios_param		= ips_biosparam,
 373	.this_id		= -1,
 374	.sg_tablesize		= IPS_MAX_SG,
 375	.cmd_per_lun		= 3,
 376	.use_clustering		= ENABLE_CLUSTERING,
 377	.no_write_same		= 1,
 378};
 379
 380
 381/* This table describes all ServeRAID Adapters */
 382static struct  pci_device_id  ips_pci_table[] = {
 383	{ 0x1014, 0x002E, PCI_ANY_ID, PCI_ANY_ID, 0, 0 },
 384	{ 0x1014, 0x01BD, PCI_ANY_ID, PCI_ANY_ID, 0, 0 },
 385	{ 0x9005, 0x0250, PCI_ANY_ID, PCI_ANY_ID, 0, 0 },
 386	{ 0, }
 387};
 388
 389MODULE_DEVICE_TABLE( pci, ips_pci_table );
 390
 391static char ips_hot_plug_name[] = "ips";
 392
 393static int  ips_insert_device(struct pci_dev *pci_dev, const struct pci_device_id *ent);
 394static void ips_remove_device(struct pci_dev *pci_dev);
 395
 396static struct pci_driver ips_pci_driver = {
 397	.name		= ips_hot_plug_name,
 398	.id_table	= ips_pci_table,
 399	.probe		= ips_insert_device,
 400	.remove		= ips_remove_device,
 401};
 402
 403
 404/*
 405 * Necessary forward function protoypes
 406 */
 407static int ips_halt(struct notifier_block *nb, ulong event, void *buf);
 408
 409#define MAX_ADAPTER_NAME 15
 410
 411static char ips_adapter_name[][30] = {
 412	"ServeRAID",
 413	"ServeRAID II",
 414	"ServeRAID on motherboard",
 415	"ServeRAID on motherboard",
 416	"ServeRAID 3H",
 417	"ServeRAID 3L",
 418	"ServeRAID 4H",
 419	"ServeRAID 4M",
 420	"ServeRAID 4L",
 421	"ServeRAID 4Mx",
 422	"ServeRAID 4Lx",
 423	"ServeRAID 5i",
 424	"ServeRAID 5i",
 425	"ServeRAID 6M",
 426	"ServeRAID 6i",
 427	"ServeRAID 7t",
 428	"ServeRAID 7k",
 429	"ServeRAID 7M"
 430};
 431
 432static struct notifier_block ips_notifier = {
 433	ips_halt, NULL, 0
 434};
 435
 436/*
 437 * Direction table
 438 */
 439static char ips_command_direction[] = {
 440	IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_OUT,
 441	IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_UNK,
 442	IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 443	IPS_DATA_IN, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_OUT,
 444	IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_OUT,
 445	IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_OUT,
 446	IPS_DATA_NONE, IPS_DATA_UNK, IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_IN,
 447	IPS_DATA_UNK, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_UNK,
 448	IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_NONE, IPS_DATA_UNK,
 449	IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT,
 450	IPS_DATA_OUT, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_NONE, IPS_DATA_NONE,
 451	IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT,
 452	IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_OUT,
 453	IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_NONE,
 454	IPS_DATA_UNK, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_UNK,
 455	IPS_DATA_NONE, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_UNK,
 456	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 457	IPS_DATA_OUT, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 458	IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 459	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 460	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 461	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 462	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 463	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 464	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 465	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 466	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 467	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 468	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 469	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 470	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 471	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 472	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 473	IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_UNK, IPS_DATA_IN, IPS_DATA_NONE,
 474	IPS_DATA_OUT, IPS_DATA_UNK, IPS_DATA_NONE, IPS_DATA_UNK, IPS_DATA_OUT,
 475	IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_NONE,
 476	IPS_DATA_UNK, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_IN,
 477	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 478	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 479	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 480	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 481	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 482	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 483	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 484	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 485	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 486	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_OUT,
 487	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 488	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 489	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
 490	IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK
 491};
 492
 493
 494/****************************************************************************/
 495/*                                                                          */
 496/* Routine Name: ips_setup                                                  */
 497/*                                                                          */
 498/* Routine Description:                                                     */
 499/*                                                                          */
 500/*   setup parameters to the driver                                         */
 501/*                                                                          */
 502/****************************************************************************/
 503static int
 504ips_setup(char *ips_str)
 505{
 506
 507	int i;
 508	char *key;
 509	char *value;
 510	IPS_OPTION options[] = {
 511		{"noi2o", &ips_force_i2o, 0},
 512		{"nommap", &ips_force_memio, 0},
 513		{"ioctlsize", &ips_ioctlsize, IPS_IOCTL_SIZE},
 514		{"cdboot", &ips_cd_boot, 0},
 515		{"maxcmds", &MaxLiteCmds, 32},
 516	};
 517
 518	/* Don't use strtok() anymore ( if 2.4 Kernel or beyond ) */
 519	/* Search for value */
 520	while ((key = strsep(&ips_str, ",."))) {
 521		if (!*key)
 522			continue;
 523		value = strchr(key, ':');
 524		if (value)
 525			*value++ = '\0';
 526		/*
 527		 * We now have key/value pairs.
 528		 * Update the variables
 529		 */
 530		for (i = 0; i < ARRAY_SIZE(options); i++) {
 531			if (strnicmp
 532			    (key, options[i].option_name,
 533			     strlen(options[i].option_name)) == 0) {
 534				if (value)
 535					*options[i].option_flag =
 536					    simple_strtoul(value, NULL, 0);
 537				else
 538					*options[i].option_flag =
 539					    options[i].option_value;
 540				break;
 541			}
 542		}
 543	}
 544
 545	return (1);
 546}
 547
 548__setup("ips=", ips_setup);
 549
 550/****************************************************************************/
 551/*                                                                          */
 552/* Routine Name: ips_detect                                                 */
 553/*                                                                          */
 554/* Routine Description:                                                     */
 555/*                                                                          */
 556/*   Detect and initialize the driver                                       */
 557/*                                                                          */
 558/* NOTE: this routine is called under the io_request_lock spinlock          */
 559/*                                                                          */
 560/****************************************************************************/
 561static int
 562ips_detect(struct scsi_host_template * SHT)
 563{
 564	int i;
 565
 566	METHOD_TRACE("ips_detect", 1);
 567
 568#ifdef MODULE
 569	if (ips)
 570		ips_setup(ips);
 571#endif
 572
 573	for (i = 0; i < ips_num_controllers; i++) {
 574		if (ips_register_scsi(i))
 575			ips_free(ips_ha[i]);
 576		ips_released_controllers++;
 577	}
 578	ips_hotplug = 1;
 579	return (ips_num_controllers);
 580}
 581
 582/****************************************************************************/
 583/*   configure the function pointers to use the functions that will work    */
 584/*   with the found version of the adapter                                  */
 585/****************************************************************************/
 586static void
 587ips_setup_funclist(ips_ha_t * ha)
 588{
 589
 590	/*
 591	 * Setup Functions
 592	 */
 593	if (IPS_IS_MORPHEUS(ha) || IPS_IS_MARCO(ha)) {
 594		/* morpheus / marco / sebring */
 595		ha->func.isintr = ips_isintr_morpheus;
 596		ha->func.isinit = ips_isinit_morpheus;
 597		ha->func.issue = ips_issue_i2o_memio;
 598		ha->func.init = ips_init_morpheus;
 599		ha->func.statupd = ips_statupd_morpheus;
 600		ha->func.reset = ips_reset_morpheus;
 601		ha->func.intr = ips_intr_morpheus;
 602		ha->func.enableint = ips_enable_int_morpheus;
 603	} else if (IPS_USE_MEMIO(ha)) {
 604		/* copperhead w/MEMIO */
 605		ha->func.isintr = ips_isintr_copperhead_memio;
 606		ha->func.isinit = ips_isinit_copperhead_memio;
 607		ha->func.init = ips_init_copperhead_memio;
 608		ha->func.statupd = ips_statupd_copperhead_memio;
 609		ha->func.statinit = ips_statinit_memio;
 610		ha->func.reset = ips_reset_copperhead_memio;
 611		ha->func.intr = ips_intr_copperhead;
 612		ha->func.erasebios = ips_erase_bios_memio;
 613		ha->func.programbios = ips_program_bios_memio;
 614		ha->func.verifybios = ips_verify_bios_memio;
 615		ha->func.enableint = ips_enable_int_copperhead_memio;
 616		if (IPS_USE_I2O_DELIVER(ha))
 617			ha->func.issue = ips_issue_i2o_memio;
 618		else
 619			ha->func.issue = ips_issue_copperhead_memio;
 620	} else {
 621		/* copperhead */
 622		ha->func.isintr = ips_isintr_copperhead;
 623		ha->func.isinit = ips_isinit_copperhead;
 624		ha->func.init = ips_init_copperhead;
 625		ha->func.statupd = ips_statupd_copperhead;
 626		ha->func.statinit = ips_statinit;
 627		ha->func.reset = ips_reset_copperhead;
 628		ha->func.intr = ips_intr_copperhead;
 629		ha->func.erasebios = ips_erase_bios;
 630		ha->func.programbios = ips_program_bios;
 631		ha->func.verifybios = ips_verify_bios;
 632		ha->func.enableint = ips_enable_int_copperhead;
 633
 634		if (IPS_USE_I2O_DELIVER(ha))
 635			ha->func.issue = ips_issue_i2o;
 636		else
 637			ha->func.issue = ips_issue_copperhead;
 638	}
 639}
 640
 641/****************************************************************************/
 642/*                                                                          */
 643/* Routine Name: ips_release                                                */
 644/*                                                                          */
 645/* Routine Description:                                                     */
 646/*                                                                          */
 647/*   Remove a driver                                                        */
 648/*                                                                          */
 649/****************************************************************************/
 650static int
 651ips_release(struct Scsi_Host *sh)
 652{
 653	ips_scb_t *scb;
 654	ips_ha_t *ha;
 655	int i;
 656
 657	METHOD_TRACE("ips_release", 1);
 658
 659	scsi_remove_host(sh);
 660
 661	for (i = 0; i < IPS_MAX_ADAPTERS && ips_sh[i] != sh; i++) ;
 662
 663	if (i == IPS_MAX_ADAPTERS) {
 664		printk(KERN_WARNING
 665		       "(%s) release, invalid Scsi_Host pointer.\n", ips_name);
 666		BUG();
 667		return (FALSE);
 668	}
 669
 670	ha = IPS_HA(sh);
 671
 672	if (!ha)
 673		return (FALSE);
 674
 675	/* flush the cache on the controller */
 676	scb = &ha->scbs[ha->max_cmds - 1];
 677
 678	ips_init_scb(ha, scb);
 679
 680	scb->timeout = ips_cmd_timeout;
 681	scb->cdb[0] = IPS_CMD_FLUSH;
 682
 683	scb->cmd.flush_cache.op_code = IPS_CMD_FLUSH;
 684	scb->cmd.flush_cache.command_id = IPS_COMMAND_ID(ha, scb);
 685	scb->cmd.flush_cache.state = IPS_NORM_STATE;
 686	scb->cmd.flush_cache.reserved = 0;
 687	scb->cmd.flush_cache.reserved2 = 0;
 688	scb->cmd.flush_cache.reserved3 = 0;
 689	scb->cmd.flush_cache.reserved4 = 0;
 690
 691	IPS_PRINTK(KERN_WARNING, ha->pcidev, "Flushing Cache.\n");
 692
 693	/* send command */
 694	if (ips_send_wait(ha, scb, ips_cmd_timeout, IPS_INTR_ON) == IPS_FAILURE)
 695		IPS_PRINTK(KERN_WARNING, ha->pcidev, "Incomplete Flush.\n");
 696
 697	IPS_PRINTK(KERN_WARNING, ha->pcidev, "Flushing Complete.\n");
 698
 699	ips_sh[i] = NULL;
 700	ips_ha[i] = NULL;
 701
 702	/* free extra memory */
 703	ips_free(ha);
 704
 705	/* free IRQ */
 706	free_irq(ha->pcidev->irq, ha);
 707
 708	scsi_host_put(sh);
 709
 710	ips_released_controllers++;
 711
 712	return (FALSE);
 713}
 714
 715/****************************************************************************/
 716/*                                                                          */
 717/* Routine Name: ips_halt                                                   */
 718/*                                                                          */
 719/* Routine Description:                                                     */
 720/*                                                                          */
 721/*   Perform cleanup when the system reboots                                */
 722/*                                                                          */
 723/****************************************************************************/
 724static int
 725ips_halt(struct notifier_block *nb, ulong event, void *buf)
 726{
 727	ips_scb_t *scb;
 728	ips_ha_t *ha;
 729	int i;
 730
 731	if ((event != SYS_RESTART) && (event != SYS_HALT) &&
 732	    (event != SYS_POWER_OFF))
 733		return (NOTIFY_DONE);
 734
 735	for (i = 0; i < ips_next_controller; i++) {
 736		ha = (ips_ha_t *) ips_ha[i];
 737
 738		if (!ha)
 739			continue;
 740
 741		if (!ha->active)
 742			continue;
 743
 744		/* flush the cache on the controller */
 745		scb = &ha->scbs[ha->max_cmds - 1];
 746
 747		ips_init_scb(ha, scb);
 748
 749		scb->timeout = ips_cmd_timeout;
 750		scb->cdb[0] = IPS_CMD_FLUSH;
 751
 752		scb->cmd.flush_cache.op_code = IPS_CMD_FLUSH;
 753		scb->cmd.flush_cache.command_id = IPS_COMMAND_ID(ha, scb);
 754		scb->cmd.flush_cache.state = IPS_NORM_STATE;
 755		scb->cmd.flush_cache.reserved = 0;
 756		scb->cmd.flush_cache.reserved2 = 0;
 757		scb->cmd.flush_cache.reserved3 = 0;
 758		scb->cmd.flush_cache.reserved4 = 0;
 759
 760		IPS_PRINTK(KERN_WARNING, ha->pcidev, "Flushing Cache.\n");
 761
 762		/* send command */
 763		if (ips_send_wait(ha, scb, ips_cmd_timeout, IPS_INTR_ON) ==
 764		    IPS_FAILURE)
 765			IPS_PRINTK(KERN_WARNING, ha->pcidev,
 766				   "Incomplete Flush.\n");
 767		else
 768			IPS_PRINTK(KERN_WARNING, ha->pcidev,
 769				   "Flushing Complete.\n");
 770	}
 771
 772	return (NOTIFY_OK);
 773}
 774
 775/****************************************************************************/
 776/*                                                                          */
 777/* Routine Name: ips_eh_abort                                               */
 778/*                                                                          */
 779/* Routine Description:                                                     */
 780/*                                                                          */
 781/*   Abort a command (using the new error code stuff)                       */
 782/* Note: this routine is called under the io_request_lock                   */
 783/****************************************************************************/
 784int ips_eh_abort(struct scsi_cmnd *SC)
 785{
 786	ips_ha_t *ha;
 787	ips_copp_wait_item_t *item;
 788	int ret;
 789	struct Scsi_Host *host;
 790
 791	METHOD_TRACE("ips_eh_abort", 1);
 792
 793	if (!SC)
 794		return (FAILED);
 795
 796	host = SC->device->host;
 797	ha = (ips_ha_t *) SC->device->host->hostdata;
 798
 799	if (!ha)
 800		return (FAILED);
 801
 802	if (!ha->active)
 803		return (FAILED);
 804
 805	spin_lock(host->host_lock);
 806
 807	/* See if the command is on the copp queue */
 808	item = ha->copp_waitlist.head;
 809	while ((item) && (item->scsi_cmd != SC))
 810		item = item->next;
 811
 812	if (item) {
 813		/* Found it */
 814		ips_removeq_copp(&ha->copp_waitlist, item);
 815		ret = (SUCCESS);
 816
 817		/* See if the command is on the wait queue */
 818	} else if (ips_removeq_wait(&ha->scb_waitlist, SC)) {
 819		/* command not sent yet */
 820		ret = (SUCCESS);
 821	} else {
 822		/* command must have already been sent */
 823		ret = (FAILED);
 824	}
 825
 826	spin_unlock(host->host_lock);
 827	return ret;
 828}
 829
 830/****************************************************************************/
 831/*                                                                          */
 832/* Routine Name: ips_eh_reset                                               */
 833/*                                                                          */
 834/* Routine Description:                                                     */
 835/*                                                                          */
 836/*   Reset the controller (with new eh error code)                          */
 837/*                                                                          */
 838/* NOTE: this routine is called under the io_request_lock spinlock          */
 839/*                                                                          */
 840/****************************************************************************/
 841static int __ips_eh_reset(struct scsi_cmnd *SC)
 842{
 843	int ret;
 844	int i;
 845	ips_ha_t *ha;
 846	ips_scb_t *scb;
 847	ips_copp_wait_item_t *item;
 848
 849	METHOD_TRACE("ips_eh_reset", 1);
 850
 851#ifdef NO_IPS_RESET
 852	return (FAILED);
 853#else
 854
 855	if (!SC) {
 856		DEBUG(1, "Reset called with NULL scsi command");
 857
 858		return (FAILED);
 859	}
 860
 861	ha = (ips_ha_t *) SC->device->host->hostdata;
 862
 863	if (!ha) {
 864		DEBUG(1, "Reset called with NULL ha struct");
 865
 866		return (FAILED);
 867	}
 868
 869	if (!ha->active)
 870		return (FAILED);
 871
 872	/* See if the command is on the copp queue */
 873	item = ha->copp_waitlist.head;
 874	while ((item) && (item->scsi_cmd != SC))
 875		item = item->next;
 876
 877	if (item) {
 878		/* Found it */
 879		ips_removeq_copp(&ha->copp_waitlist, item);
 880		return (SUCCESS);
 881	}
 882
 883	/* See if the command is on the wait queue */
 884	if (ips_removeq_wait(&ha->scb_waitlist, SC)) {
 885		/* command not sent yet */
 886		return (SUCCESS);
 887	}
 888
 889	/* An explanation for the casual observer:                              */
 890	/* Part of the function of a RAID controller is automatic error         */
 891	/* detection and recovery.  As such, the only problem that physically   */
 892	/* resetting an adapter will ever fix is when, for some reason,         */
 893	/* the driver is not successfully communicating with the adapter.       */
 894	/* Therefore, we will attempt to flush this adapter.  If that succeeds, */
 895	/* then there's no real purpose in a physical reset. This will complete */
 896	/* much faster and avoids any problems that might be caused by a        */
 897	/* physical reset ( such as having to fail all the outstanding I/O's ). */
 898
 899	if (ha->ioctl_reset == 0) {	/* IF Not an IOCTL Requested Reset */
 900		scb = &ha->scbs[ha->max_cmds - 1];
 901
 902		ips_init_scb(ha, scb);
 903
 904		scb->timeout = ips_cmd_timeout;
 905		scb->cdb[0] = IPS_CMD_FLUSH;
 906
 907		scb->cmd.flush_cache.op_code = IPS_CMD_FLUSH;
 908		scb->cmd.flush_cache.command_id = IPS_COMMAND_ID(ha, scb);
 909		scb->cmd.flush_cache.state = IPS_NORM_STATE;
 910		scb->cmd.flush_cache.reserved = 0;
 911		scb->cmd.flush_cache.reserved2 = 0;
 912		scb->cmd.flush_cache.reserved3 = 0;
 913		scb->cmd.flush_cache.reserved4 = 0;
 914
 915		/* Attempt the flush command */
 916		ret = ips_send_wait(ha, scb, ips_cmd_timeout, IPS_INTR_IORL);
 917		if (ret == IPS_SUCCESS) {
 918			IPS_PRINTK(KERN_NOTICE, ha->pcidev,
 919				   "Reset Request - Flushed Cache\n");
 920			return (SUCCESS);
 921		}
 922	}
 923
 924	/* Either we can't communicate with the adapter or it's an IOCTL request */
 925	/* from a utility.  A physical reset is needed at this point.            */
 926
 927	ha->ioctl_reset = 0;	/* Reset the IOCTL Requested Reset Flag */
 928
 929	/*
 930	 * command must have already been sent
 931	 * reset the controller
 932	 */
 933	IPS_PRINTK(KERN_NOTICE, ha->pcidev, "Resetting controller.\n");
 934	ret = (*ha->func.reset) (ha);
 935
 936	if (!ret) {
 937		struct scsi_cmnd *scsi_cmd;
 938
 939		IPS_PRINTK(KERN_NOTICE, ha->pcidev,
 940			   "Controller reset failed - controller now offline.\n");
 941
 942		/* Now fail all of the active commands */
 943		DEBUG_VAR(1, "(%s%d) Failing active commands",
 944			  ips_name, ha->host_num);
 945
 946		while ((scb = ips_removeq_scb_head(&ha->scb_activelist))) {
 947			scb->scsi_cmd->result = DID_ERROR << 16;
 948			scb->scsi_cmd->scsi_done(scb->scsi_cmd);
 949			ips_freescb(ha, scb);
 950		}
 951
 952		/* Now fail all of the pending commands */
 953		DEBUG_VAR(1, "(%s%d) Failing pending commands",
 954			  ips_name, ha->host_num);
 955
 956		while ((scsi_cmd = ips_removeq_wait_head(&ha->scb_waitlist))) {
 957			scsi_cmd->result = DID_ERROR;
 958			scsi_cmd->scsi_done(scsi_cmd);
 959		}
 960
 961		ha->active = FALSE;
 962		return (FAILED);
 963	}
 964
 965	if (!ips_clear_adapter(ha, IPS_INTR_IORL)) {
 966		struct scsi_cmnd *scsi_cmd;
 967
 968		IPS_PRINTK(KERN_NOTICE, ha->pcidev,
 969			   "Controller reset failed - controller now offline.\n");
 970
 971		/* Now fail all of the active commands */
 972		DEBUG_VAR(1, "(%s%d) Failing active commands",
 973			  ips_name, ha->host_num);
 974
 975		while ((scb = ips_removeq_scb_head(&ha->scb_activelist))) {
 976			scb->scsi_cmd->result = DID_ERROR << 16;
 977			scb->scsi_cmd->scsi_done(scb->scsi_cmd);
 978			ips_freescb(ha, scb);
 979		}
 980
 981		/* Now fail all of the pending commands */
 982		DEBUG_VAR(1, "(%s%d) Failing pending commands",
 983			  ips_name, ha->host_num);
 984
 985		while ((scsi_cmd = ips_removeq_wait_head(&ha->scb_waitlist))) {
 986			scsi_cmd->result = DID_ERROR << 16;
 987			scsi_cmd->scsi_done(scsi_cmd);
 988		}
 989
 990		ha->active = FALSE;
 991		return (FAILED);
 992	}
 993
 994	/* FFDC */
 995	if (le32_to_cpu(ha->subsys->param[3]) & 0x300000) {
 996		struct timeval tv;
 997
 998		do_gettimeofday(&tv);
 999		ha->last_ffdc = tv.tv_sec;
1000		ha->reset_count++;
1001		ips_ffdc_reset(ha, IPS_INTR_IORL);
1002	}
1003
1004	/* Now fail all of the active commands */
1005	DEBUG_VAR(1, "(%s%d) Failing active commands", ips_name, ha->host_num);
1006
1007	while ((scb = ips_removeq_scb_head(&ha->scb_activelist))) {
1008		scb->scsi_cmd->result = DID_RESET << 16;
1009		scb->scsi_cmd->scsi_done(scb->scsi_cmd);
1010		ips_freescb(ha, scb);
1011	}
1012
1013	/* Reset DCDB active command bits */
1014	for (i = 1; i < ha->nbus; i++)
1015		ha->dcdb_active[i - 1] = 0;
1016
1017	/* Reset the number of active IOCTLs */
1018	ha->num_ioctl = 0;
1019
1020	ips_next(ha, IPS_INTR_IORL);
1021
1022	return (SUCCESS);
1023#endif				/* NO_IPS_RESET */
1024
1025}
1026
1027static int ips_eh_reset(struct scsi_cmnd *SC)
1028{
1029	int rc;
1030
1031	spin_lock_irq(SC->device->host->host_lock);
1032	rc = __ips_eh_reset(SC);
1033	spin_unlock_irq(SC->device->host->host_lock);
1034
1035	return rc;
1036}
1037
1038/****************************************************************************/
1039/*                                                                          */
1040/* Routine Name: ips_queue                                                  */
1041/*                                                                          */
1042/* Routine Description:                                                     */
1043/*                                                                          */
1044/*   Send a command to the controller                                       */
1045/*                                                                          */
1046/* NOTE:                                                                    */
1047/*    Linux obtains io_request_lock before calling this function            */
1048/*                                                                          */
1049/****************************************************************************/
1050static int ips_queue_lck(struct scsi_cmnd *SC, void (*done) (struct scsi_cmnd *))
1051{
 
1052	ips_ha_t *ha;
1053	ips_passthru_t *pt;
1054
1055	METHOD_TRACE("ips_queue", 1);
1056
1057	ha = (ips_ha_t *) SC->device->host->hostdata;
1058
1059	if (!ha)
1060		return (1);
1061
1062	if (!ha->active)
1063		return (DID_ERROR);
1064
1065	if (ips_is_passthru(SC)) {
1066		if (ha->copp_waitlist.count == IPS_MAX_IOCTL_QUEUE) {
1067			SC->result = DID_BUS_BUSY << 16;
1068			done(SC);
1069
1070			return (0);
1071		}
1072	} else if (ha->scb_waitlist.count == IPS_MAX_QUEUE) {
1073		SC->result = DID_BUS_BUSY << 16;
1074		done(SC);
1075
1076		return (0);
1077	}
1078
1079	SC->scsi_done = done;
1080
1081	DEBUG_VAR(2, "(%s%d): ips_queue: cmd 0x%X (%d %d %d)",
1082		  ips_name,
1083		  ha->host_num,
1084		  SC->cmnd[0],
1085		  SC->device->channel, SC->device->id, SC->device->lun);
1086
1087	/* Check for command to initiator IDs */
1088	if ((scmd_channel(SC) > 0)
1089	    && (scmd_id(SC) == ha->ha_id[scmd_channel(SC)])) {
1090		SC->result = DID_NO_CONNECT << 16;
1091		done(SC);
1092
1093		return (0);
1094	}
1095
1096	if (ips_is_passthru(SC)) {
1097
1098		ips_copp_wait_item_t *scratch;
1099
1100		/* A Reset IOCTL is only sent by the boot CD in extreme cases.           */
1101		/* There can never be any system activity ( network or disk ), but check */
1102		/* anyway just as a good practice.                                       */
1103		pt = (ips_passthru_t *) scsi_sglist(SC);
1104		if ((pt->CoppCP.cmd.reset.op_code == IPS_CMD_RESET_CHANNEL) &&
1105		    (pt->CoppCP.cmd.reset.adapter_flag == 1)) {
1106			if (ha->scb_activelist.count != 0) {
1107				SC->result = DID_BUS_BUSY << 16;
1108				done(SC);
1109				return (0);
1110			}
1111			ha->ioctl_reset = 1;	/* This reset request is from an IOCTL */
1112			__ips_eh_reset(SC);
1113			SC->result = DID_OK << 16;
1114			SC->scsi_done(SC);
1115			return (0);
1116		}
1117
1118		/* allocate space for the scribble */
1119		scratch = kmalloc(sizeof (ips_copp_wait_item_t), GFP_ATOMIC);
1120
1121		if (!scratch) {
1122			SC->result = DID_ERROR << 16;
1123			done(SC);
1124
1125			return (0);
1126		}
1127
1128		scratch->scsi_cmd = SC;
1129		scratch->next = NULL;
1130
1131		ips_putq_copp_tail(&ha->copp_waitlist, scratch);
1132	} else {
1133		ips_putq_wait_tail(&ha->scb_waitlist, SC);
1134	}
1135
1136	ips_next(ha, IPS_INTR_IORL);
1137
1138	return (0);
 
 
 
 
 
1139}
1140
1141static DEF_SCSI_QCMD(ips_queue)
1142
1143/****************************************************************************/
1144/*                                                                          */
1145/* Routine Name: ips_biosparam                                              */
1146/*                                                                          */
1147/* Routine Description:                                                     */
1148/*                                                                          */
1149/*   Set bios geometry for the controller                                   */
1150/*                                                                          */
1151/****************************************************************************/
1152static int ips_biosparam(struct scsi_device *sdev, struct block_device *bdev,
1153			 sector_t capacity, int geom[])
1154{
1155	ips_ha_t *ha = (ips_ha_t *) sdev->host->hostdata;
1156	int heads;
1157	int sectors;
1158	int cylinders;
1159
1160	METHOD_TRACE("ips_biosparam", 1);
1161
1162	if (!ha)
1163		/* ?!?! host adater info invalid */
1164		return (0);
1165
1166	if (!ha->active)
1167		return (0);
1168
1169	if (!ips_read_adapter_status(ha, IPS_INTR_ON))
1170		/* ?!?! Enquiry command failed */
1171		return (0);
1172
1173	if ((capacity > 0x400000) && ((ha->enq->ucMiscFlag & 0x8) == 0)) {
1174		heads = IPS_NORM_HEADS;
1175		sectors = IPS_NORM_SECTORS;
1176	} else {
1177		heads = IPS_COMP_HEADS;
1178		sectors = IPS_COMP_SECTORS;
1179	}
1180
1181	cylinders = (unsigned long) capacity / (heads * sectors);
1182
1183	DEBUG_VAR(2, "Geometry: heads: %d, sectors: %d, cylinders: %d",
1184		  heads, sectors, cylinders);
1185
1186	geom[0] = heads;
1187	geom[1] = sectors;
1188	geom[2] = cylinders;
1189
1190	return (0);
1191}
1192
1193/****************************************************************************/
1194/*                                                                          */
1195/* Routine Name: ips_slave_configure                                        */
1196/*                                                                          */
1197/* Routine Description:                                                     */
1198/*                                                                          */
1199/*   Set queue depths on devices once scan is complete                      */
1200/*                                                                          */
1201/****************************************************************************/
1202static int
1203ips_slave_configure(struct scsi_device * SDptr)
1204{
1205	ips_ha_t *ha;
1206	int min;
1207
1208	ha = IPS_HA(SDptr->host);
1209	if (SDptr->tagged_supported && SDptr->type == TYPE_DISK) {
1210		min = ha->max_cmds / 2;
1211		if (ha->enq->ucLogDriveCount <= 2)
1212			min = ha->max_cmds - 1;
1213		scsi_adjust_queue_depth(SDptr, MSG_ORDERED_TAG, min);
1214	}
1215
1216	SDptr->skip_ms_page_8 = 1;
1217	SDptr->skip_ms_page_3f = 1;
1218	return 0;
1219}
1220
1221/****************************************************************************/
1222/*                                                                          */
1223/* Routine Name: do_ipsintr                                                 */
1224/*                                                                          */
1225/* Routine Description:                                                     */
1226/*                                                                          */
1227/*   Wrapper for the interrupt handler                                      */
1228/*                                                                          */
1229/****************************************************************************/
1230static irqreturn_t
1231do_ipsintr(int irq, void *dev_id)
1232{
1233	ips_ha_t *ha;
1234	struct Scsi_Host *host;
1235	int irqstatus;
1236
1237	METHOD_TRACE("do_ipsintr", 2);
1238
1239	ha = (ips_ha_t *) dev_id;
1240	if (!ha)
1241		return IRQ_NONE;
1242	host = ips_sh[ha->host_num];
1243	/* interrupt during initialization */
1244	if (!host) {
1245		(*ha->func.intr) (ha);
1246		return IRQ_HANDLED;
1247	}
1248
1249	spin_lock(host->host_lock);
1250
1251	if (!ha->active) {
1252		spin_unlock(host->host_lock);
1253		return IRQ_HANDLED;
1254	}
1255
1256	irqstatus = (*ha->func.intr) (ha);
1257
1258	spin_unlock(host->host_lock);
1259
1260	/* start the next command */
1261	ips_next(ha, IPS_INTR_ON);
1262	return IRQ_RETVAL(irqstatus);
1263}
1264
1265/****************************************************************************/
1266/*                                                                          */
1267/* Routine Name: ips_intr_copperhead                                        */
1268/*                                                                          */
1269/* Routine Description:                                                     */
1270/*                                                                          */
1271/*   Polling interrupt handler                                              */
1272/*                                                                          */
1273/*   ASSUMES interrupts are disabled                                        */
1274/*                                                                          */
1275/****************************************************************************/
1276int
1277ips_intr_copperhead(ips_ha_t * ha)
1278{
1279	ips_stat_t *sp;
1280	ips_scb_t *scb;
1281	IPS_STATUS cstatus;
1282	int intrstatus;
1283
1284	METHOD_TRACE("ips_intr", 2);
1285
1286	if (!ha)
1287		return 0;
1288
1289	if (!ha->active)
1290		return 0;
1291
1292	intrstatus = (*ha->func.isintr) (ha);
1293
1294	if (!intrstatus) {
1295		/*
1296		 * Unexpected/Shared interrupt
1297		 */
1298
1299		return 0;
1300	}
1301
1302	while (TRUE) {
1303		sp = &ha->sp;
1304
1305		intrstatus = (*ha->func.isintr) (ha);
1306
1307		if (!intrstatus)
1308			break;
1309		else
1310			cstatus.value = (*ha->func.statupd) (ha);
1311
1312		if (cstatus.fields.command_id > (IPS_MAX_CMDS - 1)) {
1313			/* Spurious Interrupt ? */
1314			continue;
1315		}
1316
1317		ips_chkstatus(ha, &cstatus);
1318		scb = (ips_scb_t *) sp->scb_addr;
1319
1320		/*
1321		 * use the callback function to finish things up
1322		 * NOTE: interrupts are OFF for this
1323		 */
1324		(*scb->callback) (ha, scb);
1325	}			/* end while */
1326	return 1;
1327}
1328
1329/****************************************************************************/
1330/*                                                                          */
1331/* Routine Name: ips_intr_morpheus                                          */
1332/*                                                                          */
1333/* Routine Description:                                                     */
1334/*                                                                          */
1335/*   Polling interrupt handler                                              */
1336/*                                                                          */
1337/*   ASSUMES interrupts are disabled                                        */
1338/*                                                                          */
1339/****************************************************************************/
1340int
1341ips_intr_morpheus(ips_ha_t * ha)
1342{
1343	ips_stat_t *sp;
1344	ips_scb_t *scb;
1345	IPS_STATUS cstatus;
1346	int intrstatus;
1347
1348	METHOD_TRACE("ips_intr_morpheus", 2);
1349
1350	if (!ha)
1351		return 0;
1352
1353	if (!ha->active)
1354		return 0;
1355
1356	intrstatus = (*ha->func.isintr) (ha);
1357
1358	if (!intrstatus) {
1359		/*
1360		 * Unexpected/Shared interrupt
1361		 */
1362
1363		return 0;
1364	}
1365
1366	while (TRUE) {
1367		sp = &ha->sp;
1368
1369		intrstatus = (*ha->func.isintr) (ha);
1370
1371		if (!intrstatus)
1372			break;
1373		else
1374			cstatus.value = (*ha->func.statupd) (ha);
1375
1376		if (cstatus.value == 0xffffffff)
1377			/* No more to process */
1378			break;
1379
1380		if (cstatus.fields.command_id > (IPS_MAX_CMDS - 1)) {
1381			IPS_PRINTK(KERN_WARNING, ha->pcidev,
1382				   "Spurious interrupt; no ccb.\n");
1383
1384			continue;
1385		}
1386
1387		ips_chkstatus(ha, &cstatus);
1388		scb = (ips_scb_t *) sp->scb_addr;
1389
1390		/*
1391		 * use the callback function to finish things up
1392		 * NOTE: interrupts are OFF for this
1393		 */
1394		(*scb->callback) (ha, scb);
1395	}			/* end while */
1396	return 1;
1397}
1398
1399/****************************************************************************/
1400/*                                                                          */
1401/* Routine Name: ips_info                                                   */
1402/*                                                                          */
1403/* Routine Description:                                                     */
1404/*                                                                          */
1405/*   Return info about the driver                                           */
1406/*                                                                          */
1407/****************************************************************************/
1408static const char *
1409ips_info(struct Scsi_Host *SH)
1410{
1411	static char buffer[256];
1412	char *bp;
1413	ips_ha_t *ha;
1414
1415	METHOD_TRACE("ips_info", 1);
1416
1417	ha = IPS_HA(SH);
1418
1419	if (!ha)
1420		return (NULL);
1421
1422	bp = &buffer[0];
1423	memset(bp, 0, sizeof (buffer));
1424
1425	sprintf(bp, "%s%s%s Build %d", "IBM PCI ServeRAID ",
1426		IPS_VERSION_HIGH, IPS_VERSION_LOW, IPS_BUILD_IDENT);
1427
1428	if (ha->ad_type > 0 && ha->ad_type <= MAX_ADAPTER_NAME) {
1429		strcat(bp, " <");
1430		strcat(bp, ips_adapter_name[ha->ad_type - 1]);
1431		strcat(bp, ">");
1432	}
1433
1434	return (bp);
1435}
1436
1437static int
1438ips_write_info(struct Scsi_Host *host, char *buffer, int length)
1439{
1440	int i;
1441	ips_ha_t *ha = NULL;
1442
1443	/* Find our host structure */
1444	for (i = 0; i < ips_next_controller; i++) {
1445		if (ips_sh[i]) {
1446			if (ips_sh[i] == host) {
1447				ha = (ips_ha_t *) ips_sh[i]->hostdata;
1448				break;
1449			}
1450		}
1451	}
1452
1453	if (!ha)
1454		return (-EINVAL);
1455
1456	return 0;
1457}
1458
1459static int
1460ips_show_info(struct seq_file *m, struct Scsi_Host *host)
1461{
1462	int i;
1463	ips_ha_t *ha = NULL;
1464
1465	/* Find our host structure */
1466	for (i = 0; i < ips_next_controller; i++) {
1467		if (ips_sh[i]) {
1468			if (ips_sh[i] == host) {
1469				ha = (ips_ha_t *) ips_sh[i]->hostdata;
1470				break;
1471			}
1472		}
1473	}
1474
1475	if (!ha)
1476		return (-EINVAL);
1477
1478	return ips_host_info(ha, m);
1479}
1480
1481/*--------------------------------------------------------------------------*/
1482/* Helper Functions                                                         */
1483/*--------------------------------------------------------------------------*/
1484
1485/****************************************************************************/
1486/*                                                                          */
1487/* Routine Name: ips_is_passthru                                            */
1488/*                                                                          */
1489/* Routine Description:                                                     */
1490/*                                                                          */
1491/*   Determine if the specified SCSI command is really a passthru command   */
1492/*                                                                          */
1493/****************************************************************************/
1494static int ips_is_passthru(struct scsi_cmnd *SC)
1495{
1496	unsigned long flags;
1497
1498	METHOD_TRACE("ips_is_passthru", 1);
1499
1500	if (!SC)
1501		return (0);
1502
1503	if ((SC->cmnd[0] == IPS_IOCTL_COMMAND) &&
1504	    (SC->device->channel == 0) &&
1505	    (SC->device->id == IPS_ADAPTER_ID) &&
1506	    (SC->device->lun == 0) && scsi_sglist(SC)) {
1507                struct scatterlist *sg = scsi_sglist(SC);
1508                char  *buffer;
1509
1510                /* kmap_atomic() ensures addressability of the user buffer.*/
1511                /* local_irq_save() protects the KM_IRQ0 address slot.     */
1512                local_irq_save(flags);
1513                buffer = kmap_atomic(sg_page(sg)) + sg->offset;
1514                if (buffer && buffer[0] == 'C' && buffer[1] == 'O' &&
1515                    buffer[2] == 'P' && buffer[3] == 'P') {
1516                        kunmap_atomic(buffer - sg->offset);
1517                        local_irq_restore(flags);
1518                        return 1;
1519                }
1520                kunmap_atomic(buffer - sg->offset);
1521                local_irq_restore(flags);
1522	}
1523	return 0;
1524}
1525
1526/****************************************************************************/
1527/*                                                                          */
1528/* Routine Name: ips_alloc_passthru_buffer                                  */
1529/*                                                                          */
1530/* Routine Description:                                                     */
1531/*   allocate a buffer large enough for the ioctl data if the ioctl buffer  */
1532/*   is too small or doesn't exist                                          */
1533/****************************************************************************/
1534static int
1535ips_alloc_passthru_buffer(ips_ha_t * ha, int length)
1536{
1537	void *bigger_buf;
1538	dma_addr_t dma_busaddr;
1539
1540	if (ha->ioctl_data && length <= ha->ioctl_len)
1541		return 0;
1542	/* there is no buffer or it's not big enough, allocate a new one */
1543	bigger_buf = pci_alloc_consistent(ha->pcidev, length, &dma_busaddr);
 
1544	if (bigger_buf) {
1545		/* free the old memory */
1546		pci_free_consistent(ha->pcidev, ha->ioctl_len, ha->ioctl_data,
1547				    ha->ioctl_busaddr);
1548		/* use the new memory */
1549		ha->ioctl_data = (char *) bigger_buf;
1550		ha->ioctl_len = length;
1551		ha->ioctl_busaddr = dma_busaddr;
1552	} else {
1553		return -1;
1554	}
1555	return 0;
1556}
1557
1558/****************************************************************************/
1559/*                                                                          */
1560/* Routine Name: ips_make_passthru                                          */
1561/*                                                                          */
1562/* Routine Description:                                                     */
1563/*                                                                          */
1564/*   Make a passthru command out of the info in the Scsi block              */
1565/*                                                                          */
1566/****************************************************************************/
1567static int
1568ips_make_passthru(ips_ha_t *ha, struct scsi_cmnd *SC, ips_scb_t *scb, int intr)
1569{
1570	ips_passthru_t *pt;
1571	int length = 0;
1572	int i, ret;
1573        struct scatterlist *sg = scsi_sglist(SC);
1574
1575	METHOD_TRACE("ips_make_passthru", 1);
1576
1577        scsi_for_each_sg(SC, sg, scsi_sg_count(SC), i)
1578		length += sg->length;
1579
1580	if (length < sizeof (ips_passthru_t)) {
1581		/* wrong size */
1582		DEBUG_VAR(1, "(%s%d) Passthru structure wrong size",
1583			  ips_name, ha->host_num);
1584		return (IPS_FAILURE);
1585	}
1586	if (ips_alloc_passthru_buffer(ha, length)) {
1587		/* allocation failure!  If ha->ioctl_data exists, use it to return
1588		   some error codes.  Return a failed command to the scsi layer. */
1589		if (ha->ioctl_data) {
1590			pt = (ips_passthru_t *) ha->ioctl_data;
1591			ips_scmd_buf_read(SC, pt, sizeof (ips_passthru_t));
1592			pt->BasicStatus = 0x0B;
1593			pt->ExtendedStatus = 0x00;
1594			ips_scmd_buf_write(SC, pt, sizeof (ips_passthru_t));
1595		}
1596		return IPS_FAILURE;
1597	}
1598	ha->ioctl_datasize = length;
1599
1600	ips_scmd_buf_read(SC, ha->ioctl_data, ha->ioctl_datasize);
1601	pt = (ips_passthru_t *) ha->ioctl_data;
1602
1603	/*
1604	 * Some notes about the passthru interface used
1605	 *
1606	 * IF the scsi op_code == 0x0d then we assume
1607	 * that the data came along with/goes with the
1608	 * packet we received from the sg driver. In this
1609	 * case the CmdBSize field of the pt structure is
1610	 * used for the size of the buffer.
1611	 */
1612
1613	switch (pt->CoppCmd) {
1614	case IPS_NUMCTRLS:
1615		memcpy(ha->ioctl_data + sizeof (ips_passthru_t),
1616		       &ips_num_controllers, sizeof (int));
1617		ips_scmd_buf_write(SC, ha->ioctl_data,
1618				   sizeof (ips_passthru_t) + sizeof (int));
1619		SC->result = DID_OK << 16;
1620
1621		return (IPS_SUCCESS_IMM);
1622
1623	case IPS_COPPUSRCMD:
1624	case IPS_COPPIOCCMD:
1625		if (SC->cmnd[0] == IPS_IOCTL_COMMAND) {
1626			if (length < (sizeof (ips_passthru_t) + pt->CmdBSize)) {
1627				/* wrong size */
1628				DEBUG_VAR(1,
1629					  "(%s%d) Passthru structure wrong size",
1630					  ips_name, ha->host_num);
1631
1632				return (IPS_FAILURE);
1633			}
1634
1635			if (ha->pcidev->device == IPS_DEVICEID_COPPERHEAD &&
1636			    pt->CoppCP.cmd.flashfw.op_code ==
1637			    IPS_CMD_RW_BIOSFW) {
1638				ret = ips_flash_copperhead(ha, pt, scb);
1639				ips_scmd_buf_write(SC, ha->ioctl_data,
1640						   sizeof (ips_passthru_t));
1641				return ret;
1642			}
1643			if (ips_usrcmd(ha, pt, scb))
1644				return (IPS_SUCCESS);
1645			else
1646				return (IPS_FAILURE);
1647		}
1648
1649		break;
1650
1651	}			/* end switch */
1652
1653	return (IPS_FAILURE);
1654}
1655
1656/****************************************************************************/
1657/* Routine Name: ips_flash_copperhead                                       */
1658/* Routine Description:                                                     */
1659/*   Flash the BIOS/FW on a Copperhead style controller                     */
1660/****************************************************************************/
1661static int
1662ips_flash_copperhead(ips_ha_t * ha, ips_passthru_t * pt, ips_scb_t * scb)
1663{
1664	int datasize;
1665
1666	/* Trombone is the only copperhead that can do packet flash, but only
1667	 * for firmware. No one said it had to make sense. */
1668	if (IPS_IS_TROMBONE(ha) && pt->CoppCP.cmd.flashfw.type == IPS_FW_IMAGE) {
1669		if (ips_usrcmd(ha, pt, scb))
1670			return IPS_SUCCESS;
1671		else
1672			return IPS_FAILURE;
1673	}
1674	pt->BasicStatus = 0x0B;
1675	pt->ExtendedStatus = 0;
1676	scb->scsi_cmd->result = DID_OK << 16;
1677	/* IF it's OK to Use the "CD BOOT" Flash Buffer, then you can     */
1678	/* avoid allocating a huge buffer per adapter ( which can fail ). */
1679	if (pt->CoppCP.cmd.flashfw.type == IPS_BIOS_IMAGE &&
1680	    pt->CoppCP.cmd.flashfw.direction == IPS_ERASE_BIOS) {
1681		pt->BasicStatus = 0;
1682		return ips_flash_bios(ha, pt, scb);
1683	} else if (pt->CoppCP.cmd.flashfw.packet_num == 0) {
1684		if (ips_FlashData && !test_and_set_bit(0, &ips_FlashDataInUse)){
1685			ha->flash_data = ips_FlashData;
1686			ha->flash_busaddr = ips_flashbusaddr;
1687			ha->flash_len = PAGE_SIZE << 7;
1688			ha->flash_datasize = 0;
1689		} else if (!ha->flash_data) {
1690			datasize = pt->CoppCP.cmd.flashfw.total_packets *
1691			    pt->CoppCP.cmd.flashfw.count;
1692			ha->flash_data = pci_alloc_consistent(ha->pcidev,
1693					                      datasize,
1694							      &ha->flash_busaddr);
1695			if (!ha->flash_data){
1696				printk(KERN_WARNING "Unable to allocate a flash buffer\n");
1697				return IPS_FAILURE;
1698			}
1699			ha->flash_datasize = 0;
1700			ha->flash_len = datasize;
1701		} else
1702			return IPS_FAILURE;
1703	} else {
1704		if (pt->CoppCP.cmd.flashfw.count + ha->flash_datasize >
1705		    ha->flash_len) {
1706			ips_free_flash_copperhead(ha);
1707			IPS_PRINTK(KERN_WARNING, ha->pcidev,
1708				   "failed size sanity check\n");
1709			return IPS_FAILURE;
1710		}
1711	}
1712	if (!ha->flash_data)
1713		return IPS_FAILURE;
1714	pt->BasicStatus = 0;
1715	memcpy(&ha->flash_data[ha->flash_datasize], pt + 1,
1716	       pt->CoppCP.cmd.flashfw.count);
1717	ha->flash_datasize += pt->CoppCP.cmd.flashfw.count;
1718	if (pt->CoppCP.cmd.flashfw.packet_num ==
1719	    pt->CoppCP.cmd.flashfw.total_packets - 1) {
1720		if (pt->CoppCP.cmd.flashfw.type == IPS_BIOS_IMAGE)
1721			return ips_flash_bios(ha, pt, scb);
1722		else if (pt->CoppCP.cmd.flashfw.type == IPS_FW_IMAGE)
1723			return ips_flash_firmware(ha, pt, scb);
1724	}
1725	return IPS_SUCCESS_IMM;
1726}
1727
1728/****************************************************************************/
1729/* Routine Name: ips_flash_bios                                             */
1730/* Routine Description:                                                     */
1731/*   flashes the bios of a copperhead adapter                               */
1732/****************************************************************************/
1733static int
1734ips_flash_bios(ips_ha_t * ha, ips_passthru_t * pt, ips_scb_t * scb)
1735{
1736
1737	if (pt->CoppCP.cmd.flashfw.type == IPS_BIOS_IMAGE &&
1738	    pt->CoppCP.cmd.flashfw.direction == IPS_WRITE_BIOS) {
1739		if ((!ha->func.programbios) || (!ha->func.erasebios) ||
1740		    (!ha->func.verifybios))
1741			goto error;
1742		if ((*ha->func.erasebios) (ha)) {
1743			DEBUG_VAR(1,
1744				  "(%s%d) flash bios failed - unable to erase flash",
1745				  ips_name, ha->host_num);
1746			goto error;
1747		} else
1748		    if ((*ha->func.programbios) (ha,
1749						 ha->flash_data +
1750						 IPS_BIOS_HEADER,
1751						 ha->flash_datasize -
1752						 IPS_BIOS_HEADER, 0)) {
1753			DEBUG_VAR(1,
1754				  "(%s%d) flash bios failed - unable to flash",
1755				  ips_name, ha->host_num);
1756			goto error;
1757		} else
1758		    if ((*ha->func.verifybios) (ha,
1759						ha->flash_data +
1760						IPS_BIOS_HEADER,
1761						ha->flash_datasize -
1762						IPS_BIOS_HEADER, 0)) {
1763			DEBUG_VAR(1,
1764				  "(%s%d) flash bios failed - unable to verify flash",
1765				  ips_name, ha->host_num);
1766			goto error;
1767		}
1768		ips_free_flash_copperhead(ha);
1769		return IPS_SUCCESS_IMM;
1770	} else if (pt->CoppCP.cmd.flashfw.type == IPS_BIOS_IMAGE &&
1771		   pt->CoppCP.cmd.flashfw.direction == IPS_ERASE_BIOS) {
1772		if (!ha->func.erasebios)
1773			goto error;
1774		if ((*ha->func.erasebios) (ha)) {
1775			DEBUG_VAR(1,
1776				  "(%s%d) flash bios failed - unable to erase flash",
1777				  ips_name, ha->host_num);
1778			goto error;
1779		}
1780		return IPS_SUCCESS_IMM;
1781	}
1782      error:
1783	pt->BasicStatus = 0x0B;
1784	pt->ExtendedStatus = 0x00;
1785	ips_free_flash_copperhead(ha);
1786	return IPS_FAILURE;
1787}
1788
1789/****************************************************************************/
1790/*                                                                          */
1791/* Routine Name: ips_fill_scb_sg_single                                     */
1792/*                                                                          */
1793/* Routine Description:                                                     */
1794/*   Fill in a single scb sg_list element from an address                   */
1795/*   return a -1 if a breakup occurred                                      */
1796/****************************************************************************/
1797static int
1798ips_fill_scb_sg_single(ips_ha_t * ha, dma_addr_t busaddr,
1799		       ips_scb_t * scb, int indx, unsigned int e_len)
1800{
1801
1802	int ret_val = 0;
1803
1804	if ((scb->data_len + e_len) > ha->max_xfer) {
1805		e_len = ha->max_xfer - scb->data_len;
1806		scb->breakup = indx;
1807		++scb->sg_break;
1808		ret_val = -1;
1809	} else {
1810		scb->breakup = 0;
1811		scb->sg_break = 0;
1812	}
1813	if (IPS_USE_ENH_SGLIST(ha)) {
1814		scb->sg_list.enh_list[indx].address_lo =
1815		    cpu_to_le32(pci_dma_lo32(busaddr));
1816		scb->sg_list.enh_list[indx].address_hi =
1817		    cpu_to_le32(pci_dma_hi32(busaddr));
1818		scb->sg_list.enh_list[indx].length = cpu_to_le32(e_len);
1819	} else {
1820		scb->sg_list.std_list[indx].address =
1821		    cpu_to_le32(pci_dma_lo32(busaddr));
1822		scb->sg_list.std_list[indx].length = cpu_to_le32(e_len);
1823	}
1824
1825	++scb->sg_len;
1826	scb->data_len += e_len;
1827	return ret_val;
1828}
1829
1830/****************************************************************************/
1831/* Routine Name: ips_flash_firmware                                         */
1832/* Routine Description:                                                     */
1833/*   flashes the firmware of a copperhead adapter                           */
1834/****************************************************************************/
1835static int
1836ips_flash_firmware(ips_ha_t * ha, ips_passthru_t * pt, ips_scb_t * scb)
1837{
1838	IPS_SG_LIST sg_list;
1839	uint32_t cmd_busaddr;
1840
1841	if (pt->CoppCP.cmd.flashfw.type == IPS_FW_IMAGE &&
1842	    pt->CoppCP.cmd.flashfw.direction == IPS_WRITE_FW) {
1843		memset(&pt->CoppCP.cmd, 0, sizeof (IPS_HOST_COMMAND));
1844		pt->CoppCP.cmd.flashfw.op_code = IPS_CMD_DOWNLOAD;
1845		pt->CoppCP.cmd.flashfw.count = cpu_to_le32(ha->flash_datasize);
1846	} else {
1847		pt->BasicStatus = 0x0B;
1848		pt->ExtendedStatus = 0x00;
1849		ips_free_flash_copperhead(ha);
1850		return IPS_FAILURE;
1851	}
1852	/* Save the S/G list pointer so it doesn't get clobbered */
1853	sg_list.list = scb->sg_list.list;
1854	cmd_busaddr = scb->scb_busaddr;
1855	/* copy in the CP */
1856	memcpy(&scb->cmd, &pt->CoppCP.cmd, sizeof (IPS_IOCTL_CMD));
1857	/* FIX stuff that might be wrong */
1858	scb->sg_list.list = sg_list.list;
1859	scb->scb_busaddr = cmd_busaddr;
1860	scb->bus = scb->scsi_cmd->device->channel;
1861	scb->target_id = scb->scsi_cmd->device->id;
1862	scb->lun = scb->scsi_cmd->device->lun;
1863	scb->sg_len = 0;
1864	scb->data_len = 0;
1865	scb->flags = 0;
1866	scb->op_code = 0;
1867	scb->callback = ipsintr_done;
1868	scb->timeout = ips_cmd_timeout;
1869
1870	scb->data_len = ha->flash_datasize;
1871	scb->data_busaddr =
1872	    pci_map_single(ha->pcidev, ha->flash_data, scb->data_len,
1873			   IPS_DMA_DIR(scb));
1874	scb->flags |= IPS_SCB_MAP_SINGLE;
1875	scb->cmd.flashfw.command_id = IPS_COMMAND_ID(ha, scb);
1876	scb->cmd.flashfw.buffer_addr = cpu_to_le32(scb->data_busaddr);
1877	if (pt->TimeOut)
1878		scb->timeout = pt->TimeOut;
1879	scb->scsi_cmd->result = DID_OK << 16;
1880	return IPS_SUCCESS;
1881}
1882
1883/****************************************************************************/
1884/* Routine Name: ips_free_flash_copperhead                                  */
1885/* Routine Description:                                                     */
1886/*   release the memory resources used to hold the flash image              */
1887/****************************************************************************/
1888static void
1889ips_free_flash_copperhead(ips_ha_t * ha)
1890{
1891	if (ha->flash_data == ips_FlashData)
1892		test_and_clear_bit(0, &ips_FlashDataInUse);
1893	else if (ha->flash_data)
1894		pci_free_consistent(ha->pcidev, ha->flash_len, ha->flash_data,
1895				    ha->flash_busaddr);
1896	ha->flash_data = NULL;
1897}
1898
1899/****************************************************************************/
1900/*                                                                          */
1901/* Routine Name: ips_usrcmd                                                 */
1902/*                                                                          */
1903/* Routine Description:                                                     */
1904/*                                                                          */
1905/*   Process a user command and make it ready to send                       */
1906/*                                                                          */
1907/****************************************************************************/
1908static int
1909ips_usrcmd(ips_ha_t * ha, ips_passthru_t * pt, ips_scb_t * scb)
1910{
1911	IPS_SG_LIST sg_list;
1912	uint32_t cmd_busaddr;
1913
1914	METHOD_TRACE("ips_usrcmd", 1);
1915
1916	if ((!scb) || (!pt) || (!ha))
1917		return (0);
1918
1919	/* Save the S/G list pointer so it doesn't get clobbered */
1920	sg_list.list = scb->sg_list.list;
1921	cmd_busaddr = scb->scb_busaddr;
1922	/* copy in the CP */
1923	memcpy(&scb->cmd, &pt->CoppCP.cmd, sizeof (IPS_IOCTL_CMD));
1924	memcpy(&scb->dcdb, &pt->CoppCP.dcdb, sizeof (IPS_DCDB_TABLE));
1925
1926	/* FIX stuff that might be wrong */
1927	scb->sg_list.list = sg_list.list;
1928	scb->scb_busaddr = cmd_busaddr;
1929	scb->bus = scb->scsi_cmd->device->channel;
1930	scb->target_id = scb->scsi_cmd->device->id;
1931	scb->lun = scb->scsi_cmd->device->lun;
1932	scb->sg_len = 0;
1933	scb->data_len = 0;
1934	scb->flags = 0;
1935	scb->op_code = 0;
1936	scb->callback = ipsintr_done;
1937	scb->timeout = ips_cmd_timeout;
1938	scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
1939
1940	/* we don't support DCDB/READ/WRITE Scatter Gather */
1941	if ((scb->cmd.basic_io.op_code == IPS_CMD_READ_SG) ||
1942	    (scb->cmd.basic_io.op_code == IPS_CMD_WRITE_SG) ||
1943	    (scb->cmd.basic_io.op_code == IPS_CMD_DCDB_SG))
1944		return (0);
1945
1946	if (pt->CmdBSize) {
1947		scb->data_len = pt->CmdBSize;
1948		scb->data_busaddr = ha->ioctl_busaddr + sizeof (ips_passthru_t);
1949	} else {
1950		scb->data_busaddr = 0L;
1951	}
1952
1953	if (scb->cmd.dcdb.op_code == IPS_CMD_DCDB)
1954		scb->cmd.dcdb.dcdb_address = cpu_to_le32(scb->scb_busaddr +
1955							 (unsigned long) &scb->
1956							 dcdb -
1957							 (unsigned long) scb);
1958
1959	if (pt->CmdBSize) {
1960		if (scb->cmd.dcdb.op_code == IPS_CMD_DCDB)
1961			scb->dcdb.buffer_pointer =
1962			    cpu_to_le32(scb->data_busaddr);
1963		else
1964			scb->cmd.basic_io.sg_addr =
1965			    cpu_to_le32(scb->data_busaddr);
1966	}
1967
1968	/* set timeouts */
1969	if (pt->TimeOut) {
1970		scb->timeout = pt->TimeOut;
1971
1972		if (pt->TimeOut <= 10)
1973			scb->dcdb.cmd_attribute |= IPS_TIMEOUT10;
1974		else if (pt->TimeOut <= 60)
1975			scb->dcdb.cmd_attribute |= IPS_TIMEOUT60;
1976		else
1977			scb->dcdb.cmd_attribute |= IPS_TIMEOUT20M;
1978	}
1979
1980	/* assume success */
1981	scb->scsi_cmd->result = DID_OK << 16;
1982
1983	/* success */
1984	return (1);
1985}
1986
1987/****************************************************************************/
1988/*                                                                          */
1989/* Routine Name: ips_cleanup_passthru                                       */
1990/*                                                                          */
1991/* Routine Description:                                                     */
1992/*                                                                          */
1993/*   Cleanup after a passthru command                                       */
1994/*                                                                          */
1995/****************************************************************************/
1996static void
1997ips_cleanup_passthru(ips_ha_t * ha, ips_scb_t * scb)
1998{
1999	ips_passthru_t *pt;
2000
2001	METHOD_TRACE("ips_cleanup_passthru", 1);
2002
2003	if ((!scb) || (!scb->scsi_cmd) || (!scsi_sglist(scb->scsi_cmd))) {
2004		DEBUG_VAR(1, "(%s%d) couldn't cleanup after passthru",
2005			  ips_name, ha->host_num);
2006
2007		return;
2008	}
2009	pt = (ips_passthru_t *) ha->ioctl_data;
2010
2011	/* Copy data back to the user */
2012	if (scb->cmd.dcdb.op_code == IPS_CMD_DCDB)	/* Copy DCDB Back to Caller's Area */
2013		memcpy(&pt->CoppCP.dcdb, &scb->dcdb, sizeof (IPS_DCDB_TABLE));
2014
2015	pt->BasicStatus = scb->basic_status;
2016	pt->ExtendedStatus = scb->extended_status;
2017	pt->AdapterType = ha->ad_type;
2018
2019	if (ha->pcidev->device == IPS_DEVICEID_COPPERHEAD &&
2020	    (scb->cmd.flashfw.op_code == IPS_CMD_DOWNLOAD ||
2021	     scb->cmd.flashfw.op_code == IPS_CMD_RW_BIOSFW))
2022		ips_free_flash_copperhead(ha);
2023
2024	ips_scmd_buf_write(scb->scsi_cmd, ha->ioctl_data, ha->ioctl_datasize);
2025}
2026
2027/****************************************************************************/
2028/*                                                                          */
2029/* Routine Name: ips_host_info                                              */
2030/*                                                                          */
2031/* Routine Description:                                                     */
2032/*                                                                          */
2033/*   The passthru interface for the driver                                  */
2034/*                                                                          */
2035/****************************************************************************/
2036static int
2037ips_host_info(ips_ha_t *ha, struct seq_file *m)
2038{
2039	METHOD_TRACE("ips_host_info", 1);
2040
2041	seq_printf(m, "\nIBM ServeRAID General Information:\n\n");
2042
2043	if ((le32_to_cpu(ha->nvram->signature) == IPS_NVRAM_P5_SIG) &&
2044	    (le16_to_cpu(ha->nvram->adapter_type) != 0))
2045		seq_printf(m, "\tController Type                   : %s\n",
2046			  ips_adapter_name[ha->ad_type - 1]);
2047	else
2048		seq_printf(m,
2049			  "\tController Type                   : Unknown\n");
2050
2051	if (ha->io_addr)
2052		seq_printf(m,
2053			  "\tIO region                         : 0x%x (%d bytes)\n",
2054			  ha->io_addr, ha->io_len);
2055
2056	if (ha->mem_addr) {
2057		seq_printf(m,
2058			  "\tMemory region                     : 0x%x (%d bytes)\n",
2059			  ha->mem_addr, ha->mem_len);
2060		seq_printf(m,
2061			  "\tShared memory address             : 0x%lx\n",
2062			  (unsigned long)ha->mem_ptr);
2063	}
2064
2065	seq_printf(m, "\tIRQ number                        : %d\n", ha->pcidev->irq);
2066
2067    /* For the Next 3 lines Check for Binary 0 at the end and don't include it if it's there. */
2068    /* That keeps everything happy for "text" operations on the proc file.                    */
2069
2070	if (le32_to_cpu(ha->nvram->signature) == IPS_NVRAM_P5_SIG) {
2071	if (ha->nvram->bios_low[3] == 0) {
2072		seq_printf(m,
2073			  "\tBIOS Version                      : %c%c%c%c%c%c%c\n",
2074			  ha->nvram->bios_high[0], ha->nvram->bios_high[1],
2075			  ha->nvram->bios_high[2], ha->nvram->bios_high[3],
2076			  ha->nvram->bios_low[0], ha->nvram->bios_low[1],
2077			  ha->nvram->bios_low[2]);
2078
2079        } else {
2080		seq_printf(m,
2081			  "\tBIOS Version                      : %c%c%c%c%c%c%c%c\n",
2082			  ha->nvram->bios_high[0], ha->nvram->bios_high[1],
2083			  ha->nvram->bios_high[2], ha->nvram->bios_high[3],
2084			  ha->nvram->bios_low[0], ha->nvram->bios_low[1],
2085			  ha->nvram->bios_low[2], ha->nvram->bios_low[3]);
2086        }
2087
2088    }
2089
2090    if (ha->enq->CodeBlkVersion[7] == 0) {
2091        seq_printf(m,
2092		  "\tFirmware Version                  : %c%c%c%c%c%c%c\n",
2093		  ha->enq->CodeBlkVersion[0], ha->enq->CodeBlkVersion[1],
2094		  ha->enq->CodeBlkVersion[2], ha->enq->CodeBlkVersion[3],
2095		  ha->enq->CodeBlkVersion[4], ha->enq->CodeBlkVersion[5],
2096		  ha->enq->CodeBlkVersion[6]);
2097    } else {
2098	seq_printf(m,
2099		  "\tFirmware Version                  : %c%c%c%c%c%c%c%c\n",
2100		  ha->enq->CodeBlkVersion[0], ha->enq->CodeBlkVersion[1],
2101		  ha->enq->CodeBlkVersion[2], ha->enq->CodeBlkVersion[3],
2102		  ha->enq->CodeBlkVersion[4], ha->enq->CodeBlkVersion[5],
2103		  ha->enq->CodeBlkVersion[6], ha->enq->CodeBlkVersion[7]);
2104    }
2105
2106    if (ha->enq->BootBlkVersion[7] == 0) {
2107        seq_printf(m,
2108		  "\tBoot Block Version                : %c%c%c%c%c%c%c\n",
2109		  ha->enq->BootBlkVersion[0], ha->enq->BootBlkVersion[1],
2110		  ha->enq->BootBlkVersion[2], ha->enq->BootBlkVersion[3],
2111		  ha->enq->BootBlkVersion[4], ha->enq->BootBlkVersion[5],
2112		  ha->enq->BootBlkVersion[6]);
2113    } else {
2114        seq_printf(m,
2115		  "\tBoot Block Version                : %c%c%c%c%c%c%c%c\n",
2116		  ha->enq->BootBlkVersion[0], ha->enq->BootBlkVersion[1],
2117		  ha->enq->BootBlkVersion[2], ha->enq->BootBlkVersion[3],
2118		  ha->enq->BootBlkVersion[4], ha->enq->BootBlkVersion[5],
2119		  ha->enq->BootBlkVersion[6], ha->enq->BootBlkVersion[7]);
2120    }
2121
2122	seq_printf(m, "\tDriver Version                    : %s%s\n",
2123		  IPS_VERSION_HIGH, IPS_VERSION_LOW);
2124
2125	seq_printf(m, "\tDriver Build                      : %d\n",
2126		  IPS_BUILD_IDENT);
2127
2128	seq_printf(m, "\tMax Physical Devices              : %d\n",
2129		  ha->enq->ucMaxPhysicalDevices);
2130	seq_printf(m, "\tMax Active Commands               : %d\n",
2131		  ha->max_cmds);
2132	seq_printf(m, "\tCurrent Queued Commands           : %d\n",
2133		  ha->scb_waitlist.count);
2134	seq_printf(m, "\tCurrent Active Commands           : %d\n",
2135		  ha->scb_activelist.count - ha->num_ioctl);
2136	seq_printf(m, "\tCurrent Queued PT Commands        : %d\n",
2137		  ha->copp_waitlist.count);
2138	seq_printf(m, "\tCurrent Active PT Commands        : %d\n",
2139		  ha->num_ioctl);
2140
2141	seq_printf(m, "\n");
2142
2143	return 0;
2144}
2145
2146/****************************************************************************/
2147/*                                                                          */
2148/* Routine Name: ips_identify_controller                                    */
2149/*                                                                          */
2150/* Routine Description:                                                     */
2151/*                                                                          */
2152/*   Identify this controller                                               */
2153/*                                                                          */
2154/****************************************************************************/
2155static void
2156ips_identify_controller(ips_ha_t * ha)
2157{
2158	METHOD_TRACE("ips_identify_controller", 1);
2159
2160	switch (ha->pcidev->device) {
2161	case IPS_DEVICEID_COPPERHEAD:
2162		if (ha->pcidev->revision <= IPS_REVID_SERVERAID) {
2163			ha->ad_type = IPS_ADTYPE_SERVERAID;
2164		} else if (ha->pcidev->revision == IPS_REVID_SERVERAID2) {
2165			ha->ad_type = IPS_ADTYPE_SERVERAID2;
2166		} else if (ha->pcidev->revision == IPS_REVID_NAVAJO) {
2167			ha->ad_type = IPS_ADTYPE_NAVAJO;
2168		} else if ((ha->pcidev->revision == IPS_REVID_SERVERAID2)
2169			   && (ha->slot_num == 0)) {
2170			ha->ad_type = IPS_ADTYPE_KIOWA;
2171		} else if ((ha->pcidev->revision >= IPS_REVID_CLARINETP1) &&
2172			   (ha->pcidev->revision <= IPS_REVID_CLARINETP3)) {
2173			if (ha->enq->ucMaxPhysicalDevices == 15)
2174				ha->ad_type = IPS_ADTYPE_SERVERAID3L;
2175			else
2176				ha->ad_type = IPS_ADTYPE_SERVERAID3;
2177		} else if ((ha->pcidev->revision >= IPS_REVID_TROMBONE32) &&
2178			   (ha->pcidev->revision <= IPS_REVID_TROMBONE64)) {
2179			ha->ad_type = IPS_ADTYPE_SERVERAID4H;
2180		}
2181		break;
2182
2183	case IPS_DEVICEID_MORPHEUS:
2184		switch (ha->pcidev->subsystem_device) {
2185		case IPS_SUBDEVICEID_4L:
2186			ha->ad_type = IPS_ADTYPE_SERVERAID4L;
2187			break;
2188
2189		case IPS_SUBDEVICEID_4M:
2190			ha->ad_type = IPS_ADTYPE_SERVERAID4M;
2191			break;
2192
2193		case IPS_SUBDEVICEID_4MX:
2194			ha->ad_type = IPS_ADTYPE_SERVERAID4MX;
2195			break;
2196
2197		case IPS_SUBDEVICEID_4LX:
2198			ha->ad_type = IPS_ADTYPE_SERVERAID4LX;
2199			break;
2200
2201		case IPS_SUBDEVICEID_5I2:
2202			ha->ad_type = IPS_ADTYPE_SERVERAID5I2;
2203			break;
2204
2205		case IPS_SUBDEVICEID_5I1:
2206			ha->ad_type = IPS_ADTYPE_SERVERAID5I1;
2207			break;
2208		}
2209
2210		break;
2211
2212	case IPS_DEVICEID_MARCO:
2213		switch (ha->pcidev->subsystem_device) {
2214		case IPS_SUBDEVICEID_6M:
2215			ha->ad_type = IPS_ADTYPE_SERVERAID6M;
2216			break;
2217		case IPS_SUBDEVICEID_6I:
2218			ha->ad_type = IPS_ADTYPE_SERVERAID6I;
2219			break;
2220		case IPS_SUBDEVICEID_7k:
2221			ha->ad_type = IPS_ADTYPE_SERVERAID7k;
2222			break;
2223		case IPS_SUBDEVICEID_7M:
2224			ha->ad_type = IPS_ADTYPE_SERVERAID7M;
2225			break;
2226		}
2227		break;
2228	}
2229}
2230
2231/****************************************************************************/
2232/*                                                                          */
2233/* Routine Name: ips_get_bios_version                                       */
2234/*                                                                          */
2235/* Routine Description:                                                     */
2236/*                                                                          */
2237/*   Get the BIOS revision number                                           */
2238/*                                                                          */
2239/****************************************************************************/
2240static void
2241ips_get_bios_version(ips_ha_t * ha, int intr)
2242{
2243	ips_scb_t *scb;
2244	int ret;
2245	uint8_t major;
2246	uint8_t minor;
2247	uint8_t subminor;
2248	uint8_t *buffer;
2249	char hexDigits[] =
2250	    { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C',
2251     'D', 'E', 'F' };
2252
2253	METHOD_TRACE("ips_get_bios_version", 1);
2254
2255	major = 0;
2256	minor = 0;
2257
2258	strncpy(ha->bios_version, "       ?", 8);
2259
2260	if (ha->pcidev->device == IPS_DEVICEID_COPPERHEAD) {
2261		if (IPS_USE_MEMIO(ha)) {
2262			/* Memory Mapped I/O */
2263
2264			/* test 1st byte */
2265			writel(0, ha->mem_ptr + IPS_REG_FLAP);
2266			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2267				udelay(25);	/* 25 us */
2268
2269			if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0x55)
2270				return;
2271
2272			writel(1, ha->mem_ptr + IPS_REG_FLAP);
2273			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2274				udelay(25);	/* 25 us */
2275
2276			if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0xAA)
2277				return;
2278
2279			/* Get Major version */
2280			writel(0x1FF, ha->mem_ptr + IPS_REG_FLAP);
2281			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2282				udelay(25);	/* 25 us */
2283
2284			major = readb(ha->mem_ptr + IPS_REG_FLDP);
2285
2286			/* Get Minor version */
2287			writel(0x1FE, ha->mem_ptr + IPS_REG_FLAP);
2288			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2289				udelay(25);	/* 25 us */
2290			minor = readb(ha->mem_ptr + IPS_REG_FLDP);
2291
2292			/* Get SubMinor version */
2293			writel(0x1FD, ha->mem_ptr + IPS_REG_FLAP);
2294			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2295				udelay(25);	/* 25 us */
2296			subminor = readb(ha->mem_ptr + IPS_REG_FLDP);
2297
2298		} else {
2299			/* Programmed I/O */
2300
2301			/* test 1st byte */
2302			outl(0, ha->io_addr + IPS_REG_FLAP);
2303			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2304				udelay(25);	/* 25 us */
2305
2306			if (inb(ha->io_addr + IPS_REG_FLDP) != 0x55)
2307				return;
2308
2309			outl(1, ha->io_addr + IPS_REG_FLAP);
2310			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2311				udelay(25);	/* 25 us */
2312
2313			if (inb(ha->io_addr + IPS_REG_FLDP) != 0xAA)
2314				return;
2315
2316			/* Get Major version */
2317			outl(0x1FF, ha->io_addr + IPS_REG_FLAP);
2318			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2319				udelay(25);	/* 25 us */
2320
2321			major = inb(ha->io_addr + IPS_REG_FLDP);
2322
2323			/* Get Minor version */
2324			outl(0x1FE, ha->io_addr + IPS_REG_FLAP);
2325			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2326				udelay(25);	/* 25 us */
2327
2328			minor = inb(ha->io_addr + IPS_REG_FLDP);
2329
2330			/* Get SubMinor version */
2331			outl(0x1FD, ha->io_addr + IPS_REG_FLAP);
2332			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
2333				udelay(25);	/* 25 us */
2334
2335			subminor = inb(ha->io_addr + IPS_REG_FLDP);
2336
2337		}
2338	} else {
2339		/* Morpheus Family - Send Command to the card */
2340
2341		buffer = ha->ioctl_data;
2342
2343		memset(buffer, 0, 0x1000);
2344
2345		scb = &ha->scbs[ha->max_cmds - 1];
2346
2347		ips_init_scb(ha, scb);
2348
2349		scb->timeout = ips_cmd_timeout;
2350		scb->cdb[0] = IPS_CMD_RW_BIOSFW;
2351
2352		scb->cmd.flashfw.op_code = IPS_CMD_RW_BIOSFW;
2353		scb->cmd.flashfw.command_id = IPS_COMMAND_ID(ha, scb);
2354		scb->cmd.flashfw.type = 1;
2355		scb->cmd.flashfw.direction = 0;
2356		scb->cmd.flashfw.count = cpu_to_le32(0x800);
2357		scb->cmd.flashfw.total_packets = 1;
2358		scb->cmd.flashfw.packet_num = 0;
2359		scb->data_len = 0x1000;
2360		scb->cmd.flashfw.buffer_addr = ha->ioctl_busaddr;
2361
2362		/* issue the command */
2363		if (((ret =
2364		      ips_send_wait(ha, scb, ips_cmd_timeout,
2365				    intr)) == IPS_FAILURE)
2366		    || (ret == IPS_SUCCESS_IMM)
2367		    || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) {
2368			/* Error occurred */
2369
2370			return;
2371		}
2372
2373		if ((buffer[0xC0] == 0x55) && (buffer[0xC1] == 0xAA)) {
2374			major = buffer[0x1ff + 0xC0];	/* Offset 0x1ff after the header (0xc0) */
2375			minor = buffer[0x1fe + 0xC0];	/* Offset 0x1fe after the header (0xc0) */
2376			subminor = buffer[0x1fd + 0xC0];	/* Offset 0x1fd after the header (0xc0) */
2377		} else {
2378			return;
2379		}
2380	}
2381
2382	ha->bios_version[0] = hexDigits[(major & 0xF0) >> 4];
2383	ha->bios_version[1] = '.';
2384	ha->bios_version[2] = hexDigits[major & 0x0F];
2385	ha->bios_version[3] = hexDigits[subminor];
2386	ha->bios_version[4] = '.';
2387	ha->bios_version[5] = hexDigits[(minor & 0xF0) >> 4];
2388	ha->bios_version[6] = hexDigits[minor & 0x0F];
2389	ha->bios_version[7] = 0;
2390}
2391
2392/****************************************************************************/
2393/*                                                                          */
2394/* Routine Name: ips_hainit                                                 */
2395/*                                                                          */
2396/* Routine Description:                                                     */
2397/*                                                                          */
2398/*   Initialize the controller                                              */
2399/*                                                                          */
2400/* NOTE: Assumes to be called from with a lock                              */
2401/*                                                                          */
2402/****************************************************************************/
2403static int
2404ips_hainit(ips_ha_t * ha)
2405{
2406	int i;
2407	struct timeval tv;
2408
2409	METHOD_TRACE("ips_hainit", 1);
2410
2411	if (!ha)
2412		return (0);
2413
2414	if (ha->func.statinit)
2415		(*ha->func.statinit) (ha);
2416
2417	if (ha->func.enableint)
2418		(*ha->func.enableint) (ha);
2419
2420	/* Send FFDC */
2421	ha->reset_count = 1;
2422	do_gettimeofday(&tv);
2423	ha->last_ffdc = tv.tv_sec;
2424	ips_ffdc_reset(ha, IPS_INTR_IORL);
2425
2426	if (!ips_read_config(ha, IPS_INTR_IORL)) {
2427		IPS_PRINTK(KERN_WARNING, ha->pcidev,
2428			   "unable to read config from controller.\n");
2429
2430		return (0);
2431	}
2432	/* end if */
2433	if (!ips_read_adapter_status(ha, IPS_INTR_IORL)) {
2434		IPS_PRINTK(KERN_WARNING, ha->pcidev,
2435			   "unable to read controller status.\n");
2436
2437		return (0);
2438	}
2439
2440	/* Identify this controller */
2441	ips_identify_controller(ha);
2442
2443	if (!ips_read_subsystem_parameters(ha, IPS_INTR_IORL)) {
2444		IPS_PRINTK(KERN_WARNING, ha->pcidev,
2445			   "unable to read subsystem parameters.\n");
2446
2447		return (0);
2448	}
2449
2450	/* write nvram user page 5 */
2451	if (!ips_write_driver_status(ha, IPS_INTR_IORL)) {
2452		IPS_PRINTK(KERN_WARNING, ha->pcidev,
2453			   "unable to write driver info to controller.\n");
2454
2455		return (0);
2456	}
2457
2458	/* If there are Logical Drives and a Reset Occurred, then an EraseStripeLock is Needed */
2459	if ((ha->conf->ucLogDriveCount > 0) && (ha->requires_esl == 1))
2460		ips_clear_adapter(ha, IPS_INTR_IORL);
2461
2462	/* set limits on SID, LUN, BUS */
2463	ha->ntargets = IPS_MAX_TARGETS + 1;
2464	ha->nlun = 1;
2465	ha->nbus = (ha->enq->ucMaxPhysicalDevices / IPS_MAX_TARGETS) + 1;
2466
2467	switch (ha->conf->logical_drive[0].ucStripeSize) {
2468	case 4:
2469		ha->max_xfer = 0x10000;
2470		break;
2471
2472	case 5:
2473		ha->max_xfer = 0x20000;
2474		break;
2475
2476	case 6:
2477		ha->max_xfer = 0x40000;
2478		break;
2479
2480	case 7:
2481	default:
2482		ha->max_xfer = 0x80000;
2483		break;
2484	}
2485
2486	/* setup max concurrent commands */
2487	if (le32_to_cpu(ha->subsys->param[4]) & 0x1) {
2488		/* Use the new method */
2489		ha->max_cmds = ha->enq->ucConcurrentCmdCount;
2490	} else {
2491		/* use the old method */
2492		switch (ha->conf->logical_drive[0].ucStripeSize) {
2493		case 4:
2494			ha->max_cmds = 32;
2495			break;
2496
2497		case 5:
2498			ha->max_cmds = 16;
2499			break;
2500
2501		case 6:
2502			ha->max_cmds = 8;
2503			break;
2504
2505		case 7:
2506		default:
2507			ha->max_cmds = 4;
2508			break;
2509		}
2510	}
2511
2512	/* Limit the Active Commands on a Lite Adapter */
2513	if ((ha->ad_type == IPS_ADTYPE_SERVERAID3L) ||
2514	    (ha->ad_type == IPS_ADTYPE_SERVERAID4L) ||
2515	    (ha->ad_type == IPS_ADTYPE_SERVERAID4LX)) {
2516		if ((ha->max_cmds > MaxLiteCmds) && (MaxLiteCmds))
2517			ha->max_cmds = MaxLiteCmds;
2518	}
2519
2520	/* set controller IDs */
2521	ha->ha_id[0] = IPS_ADAPTER_ID;
2522	for (i = 1; i < ha->nbus; i++) {
2523		ha->ha_id[i] = ha->conf->init_id[i - 1] & 0x1f;
2524		ha->dcdb_active[i - 1] = 0;
2525	}
2526
2527	return (1);
2528}
2529
2530/****************************************************************************/
2531/*                                                                          */
2532/* Routine Name: ips_next                                                   */
2533/*                                                                          */
2534/* Routine Description:                                                     */
2535/*                                                                          */
2536/*   Take the next command off the queue and send it to the controller      */
2537/*                                                                          */
2538/****************************************************************************/
2539static void
2540ips_next(ips_ha_t * ha, int intr)
2541{
2542	ips_scb_t *scb;
2543	struct scsi_cmnd *SC;
2544	struct scsi_cmnd *p;
2545	struct scsi_cmnd *q;
2546	ips_copp_wait_item_t *item;
2547	int ret;
2548	struct Scsi_Host *host;
2549	METHOD_TRACE("ips_next", 1);
2550
2551	if (!ha)
2552		return;
2553	host = ips_sh[ha->host_num];
2554	/*
2555	 * Block access to the queue function so
2556	 * this command won't time out
2557	 */
2558	if (intr == IPS_INTR_ON)
2559		spin_lock(host->host_lock);
2560
2561	if ((ha->subsys->param[3] & 0x300000)
2562	    && (ha->scb_activelist.count == 0)) {
2563		struct timeval tv;
2564
2565		do_gettimeofday(&tv);
2566
2567		if (tv.tv_sec - ha->last_ffdc > IPS_SECS_8HOURS) {
2568			ha->last_ffdc = tv.tv_sec;
2569			ips_ffdc_time(ha);
2570		}
2571	}
2572
2573	/*
2574	 * Send passthru commands
2575	 * These have priority over normal I/O
2576	 * but shouldn't affect performance too much
2577	 * since we limit the number that can be active
2578	 * on the card at any one time
2579	 */
2580	while ((ha->num_ioctl < IPS_MAX_IOCTL) &&
2581	       (ha->copp_waitlist.head) && (scb = ips_getscb(ha))) {
2582
2583		item = ips_removeq_copp_head(&ha->copp_waitlist);
2584		ha->num_ioctl++;
2585		if (intr == IPS_INTR_ON)
2586			spin_unlock(host->host_lock);
2587		scb->scsi_cmd = item->scsi_cmd;
2588		kfree(item);
2589
2590		ret = ips_make_passthru(ha, scb->scsi_cmd, scb, intr);
2591
2592		if (intr == IPS_INTR_ON)
2593			spin_lock(host->host_lock);
2594		switch (ret) {
2595		case IPS_FAILURE:
2596			if (scb->scsi_cmd) {
2597				scb->scsi_cmd->result = DID_ERROR << 16;
2598				scb->scsi_cmd->scsi_done(scb->scsi_cmd);
2599			}
2600
2601			ips_freescb(ha, scb);
2602			break;
2603		case IPS_SUCCESS_IMM:
2604			if (scb->scsi_cmd) {
2605				scb->scsi_cmd->result = DID_OK << 16;
2606				scb->scsi_cmd->scsi_done(scb->scsi_cmd);
2607			}
2608
2609			ips_freescb(ha, scb);
2610			break;
2611		default:
2612			break;
2613		}		/* end case */
2614
2615		if (ret != IPS_SUCCESS) {
2616			ha->num_ioctl--;
2617			continue;
2618		}
2619
2620		ret = ips_send_cmd(ha, scb);
2621
2622		if (ret == IPS_SUCCESS)
2623			ips_putq_scb_head(&ha->scb_activelist, scb);
2624		else
2625			ha->num_ioctl--;
2626
2627		switch (ret) {
2628		case IPS_FAILURE:
2629			if (scb->scsi_cmd) {
2630				scb->scsi_cmd->result = DID_ERROR << 16;
2631			}
2632
2633			ips_freescb(ha, scb);
2634			break;
2635		case IPS_SUCCESS_IMM:
2636			ips_freescb(ha, scb);
2637			break;
2638		default:
2639			break;
2640		}		/* end case */
2641
2642	}
2643
2644	/*
2645	 * Send "Normal" I/O commands
2646	 */
2647
2648	p = ha->scb_waitlist.head;
2649	while ((p) && (scb = ips_getscb(ha))) {
2650		if ((scmd_channel(p) > 0)
2651		    && (ha->
2652			dcdb_active[scmd_channel(p) -
2653				    1] & (1 << scmd_id(p)))) {
2654			ips_freescb(ha, scb);
2655			p = (struct scsi_cmnd *) p->host_scribble;
2656			continue;
2657		}
2658
2659		q = p;
2660		SC = ips_removeq_wait(&ha->scb_waitlist, q);
2661
2662		if (intr == IPS_INTR_ON)
2663			spin_unlock(host->host_lock);	/* Unlock HA after command is taken off queue */
2664
2665		SC->result = DID_OK;
2666		SC->host_scribble = NULL;
2667
2668		scb->target_id = SC->device->id;
2669		scb->lun = SC->device->lun;
2670		scb->bus = SC->device->channel;
2671		scb->scsi_cmd = SC;
2672		scb->breakup = 0;
2673		scb->data_len = 0;
2674		scb->callback = ipsintr_done;
2675		scb->timeout = ips_cmd_timeout;
2676		memset(&scb->cmd, 0, 16);
2677
2678		/* copy in the CDB */
2679		memcpy(scb->cdb, SC->cmnd, SC->cmd_len);
2680
2681                scb->sg_count = scsi_dma_map(SC);
2682                BUG_ON(scb->sg_count < 0);
2683		if (scb->sg_count) {
2684			struct scatterlist *sg;
2685			int i;
2686
2687			scb->flags |= IPS_SCB_MAP_SG;
2688
2689                        scsi_for_each_sg(SC, sg, scb->sg_count, i) {
2690				if (ips_fill_scb_sg_single
2691				    (ha, sg_dma_address(sg), scb, i,
2692				     sg_dma_len(sg)) < 0)
2693					break;
2694			}
2695			scb->dcdb.transfer_length = scb->data_len;
2696		} else {
2697                        scb->data_busaddr = 0L;
2698                        scb->sg_len = 0;
2699                        scb->data_len = 0;
2700                        scb->dcdb.transfer_length = 0;
2701		}
2702
2703		scb->dcdb.cmd_attribute =
2704		    ips_command_direction[scb->scsi_cmd->cmnd[0]];
2705
2706		/* Allow a WRITE BUFFER Command to Have no Data */
2707		/* This is Used by Tape Flash Utilites          */
2708		if ((scb->scsi_cmd->cmnd[0] == WRITE_BUFFER) &&
2709				(scb->data_len == 0))
2710			scb->dcdb.cmd_attribute = 0;
2711
2712		if (!(scb->dcdb.cmd_attribute & 0x3))
2713			scb->dcdb.transfer_length = 0;
2714
2715		if (scb->data_len >= IPS_MAX_XFER) {
2716			scb->dcdb.cmd_attribute |= IPS_TRANSFER64K;
2717			scb->dcdb.transfer_length = 0;
2718		}
2719		if (intr == IPS_INTR_ON)
2720			spin_lock(host->host_lock);
2721
2722		ret = ips_send_cmd(ha, scb);
2723
2724		switch (ret) {
2725		case IPS_SUCCESS:
2726			ips_putq_scb_head(&ha->scb_activelist, scb);
2727			break;
2728		case IPS_FAILURE:
2729			if (scb->scsi_cmd) {
2730				scb->scsi_cmd->result = DID_ERROR << 16;
2731				scb->scsi_cmd->scsi_done(scb->scsi_cmd);
2732			}
2733
2734			if (scb->bus)
2735				ha->dcdb_active[scb->bus - 1] &=
2736				    ~(1 << scb->target_id);
2737
2738			ips_freescb(ha, scb);
2739			break;
2740		case IPS_SUCCESS_IMM:
2741			if (scb->scsi_cmd)
2742				scb->scsi_cmd->scsi_done(scb->scsi_cmd);
2743
2744			if (scb->bus)
2745				ha->dcdb_active[scb->bus - 1] &=
2746				    ~(1 << scb->target_id);
2747
2748			ips_freescb(ha, scb);
2749			break;
2750		default:
2751			break;
2752		}		/* end case */
2753
2754		p = (struct scsi_cmnd *) p->host_scribble;
2755
2756	}			/* end while */
2757
2758	if (intr == IPS_INTR_ON)
2759		spin_unlock(host->host_lock);
2760}
2761
2762/****************************************************************************/
2763/*                                                                          */
2764/* Routine Name: ips_putq_scb_head                                          */
2765/*                                                                          */
2766/* Routine Description:                                                     */
2767/*                                                                          */
2768/*   Add an item to the head of the queue                                   */
2769/*                                                                          */
2770/* ASSUMED to be called from within the HA lock                             */
2771/*                                                                          */
2772/****************************************************************************/
2773static void
2774ips_putq_scb_head(ips_scb_queue_t * queue, ips_scb_t * item)
2775{
2776	METHOD_TRACE("ips_putq_scb_head", 1);
2777
2778	if (!item)
2779		return;
2780
2781	item->q_next = queue->head;
2782	queue->head = item;
2783
2784	if (!queue->tail)
2785		queue->tail = item;
2786
2787	queue->count++;
2788}
2789
2790/****************************************************************************/
2791/*                                                                          */
2792/* Routine Name: ips_removeq_scb_head                                       */
2793/*                                                                          */
2794/* Routine Description:                                                     */
2795/*                                                                          */
2796/*   Remove the head of the queue                                           */
2797/*                                                                          */
2798/* ASSUMED to be called from within the HA lock                             */
2799/*                                                                          */
2800/****************************************************************************/
2801static ips_scb_t *
2802ips_removeq_scb_head(ips_scb_queue_t * queue)
2803{
2804	ips_scb_t *item;
2805
2806	METHOD_TRACE("ips_removeq_scb_head", 1);
2807
2808	item = queue->head;
2809
2810	if (!item) {
2811		return (NULL);
2812	}
2813
2814	queue->head = item->q_next;
2815	item->q_next = NULL;
2816
2817	if (queue->tail == item)
2818		queue->tail = NULL;
2819
2820	queue->count--;
2821
2822	return (item);
2823}
2824
2825/****************************************************************************/
2826/*                                                                          */
2827/* Routine Name: ips_removeq_scb                                            */
2828/*                                                                          */
2829/* Routine Description:                                                     */
2830/*                                                                          */
2831/*   Remove an item from a queue                                            */
2832/*                                                                          */
2833/* ASSUMED to be called from within the HA lock                             */
2834/*                                                                          */
2835/****************************************************************************/
2836static ips_scb_t *
2837ips_removeq_scb(ips_scb_queue_t * queue, ips_scb_t * item)
2838{
2839	ips_scb_t *p;
2840
2841	METHOD_TRACE("ips_removeq_scb", 1);
2842
2843	if (!item)
2844		return (NULL);
2845
2846	if (item == queue->head) {
2847		return (ips_removeq_scb_head(queue));
2848	}
2849
2850	p = queue->head;
2851
2852	while ((p) && (item != p->q_next))
2853		p = p->q_next;
2854
2855	if (p) {
2856		/* found a match */
2857		p->q_next = item->q_next;
2858
2859		if (!item->q_next)
2860			queue->tail = p;
2861
2862		item->q_next = NULL;
2863		queue->count--;
2864
2865		return (item);
2866	}
2867
2868	return (NULL);
2869}
2870
2871/****************************************************************************/
2872/*                                                                          */
2873/* Routine Name: ips_putq_wait_tail                                         */
2874/*                                                                          */
2875/* Routine Description:                                                     */
2876/*                                                                          */
2877/*   Add an item to the tail of the queue                                   */
2878/*                                                                          */
2879/* ASSUMED to be called from within the HA lock                             */
2880/*                                                                          */
2881/****************************************************************************/
2882static void ips_putq_wait_tail(ips_wait_queue_t *queue, struct scsi_cmnd *item)
2883{
2884	METHOD_TRACE("ips_putq_wait_tail", 1);
2885
2886	if (!item)
2887		return;
2888
2889	item->host_scribble = NULL;
2890
2891	if (queue->tail)
2892		queue->tail->host_scribble = (char *) item;
2893
2894	queue->tail = item;
2895
2896	if (!queue->head)
2897		queue->head = item;
2898
2899	queue->count++;
2900}
2901
2902/****************************************************************************/
2903/*                                                                          */
2904/* Routine Name: ips_removeq_wait_head                                      */
2905/*                                                                          */
2906/* Routine Description:                                                     */
2907/*                                                                          */
2908/*   Remove the head of the queue                                           */
2909/*                                                                          */
2910/* ASSUMED to be called from within the HA lock                             */
2911/*                                                                          */
2912/****************************************************************************/
2913static struct scsi_cmnd *ips_removeq_wait_head(ips_wait_queue_t *queue)
2914{
2915	struct scsi_cmnd *item;
2916
2917	METHOD_TRACE("ips_removeq_wait_head", 1);
2918
2919	item = queue->head;
2920
2921	if (!item) {
2922		return (NULL);
2923	}
2924
2925	queue->head = (struct scsi_cmnd *) item->host_scribble;
2926	item->host_scribble = NULL;
2927
2928	if (queue->tail == item)
2929		queue->tail = NULL;
2930
2931	queue->count--;
2932
2933	return (item);
2934}
2935
2936/****************************************************************************/
2937/*                                                                          */
2938/* Routine Name: ips_removeq_wait                                           */
2939/*                                                                          */
2940/* Routine Description:                                                     */
2941/*                                                                          */
2942/*   Remove an item from a queue                                            */
2943/*                                                                          */
2944/* ASSUMED to be called from within the HA lock                             */
2945/*                                                                          */
2946/****************************************************************************/
2947static struct scsi_cmnd *ips_removeq_wait(ips_wait_queue_t *queue,
2948					  struct scsi_cmnd *item)
2949{
2950	struct scsi_cmnd *p;
2951
2952	METHOD_TRACE("ips_removeq_wait", 1);
2953
2954	if (!item)
2955		return (NULL);
2956
2957	if (item == queue->head) {
2958		return (ips_removeq_wait_head(queue));
2959	}
2960
2961	p = queue->head;
2962
2963	while ((p) && (item != (struct scsi_cmnd *) p->host_scribble))
2964		p = (struct scsi_cmnd *) p->host_scribble;
2965
2966	if (p) {
2967		/* found a match */
2968		p->host_scribble = item->host_scribble;
2969
2970		if (!item->host_scribble)
2971			queue->tail = p;
2972
2973		item->host_scribble = NULL;
2974		queue->count--;
2975
2976		return (item);
2977	}
2978
2979	return (NULL);
2980}
2981
2982/****************************************************************************/
2983/*                                                                          */
2984/* Routine Name: ips_putq_copp_tail                                         */
2985/*                                                                          */
2986/* Routine Description:                                                     */
2987/*                                                                          */
2988/*   Add an item to the tail of the queue                                   */
2989/*                                                                          */
2990/* ASSUMED to be called from within the HA lock                             */
2991/*                                                                          */
2992/****************************************************************************/
2993static void
2994ips_putq_copp_tail(ips_copp_queue_t * queue, ips_copp_wait_item_t * item)
2995{
2996	METHOD_TRACE("ips_putq_copp_tail", 1);
2997
2998	if (!item)
2999		return;
3000
3001	item->next = NULL;
3002
3003	if (queue->tail)
3004		queue->tail->next = item;
3005
3006	queue->tail = item;
3007
3008	if (!queue->head)
3009		queue->head = item;
3010
3011	queue->count++;
3012}
3013
3014/****************************************************************************/
3015/*                                                                          */
3016/* Routine Name: ips_removeq_copp_head                                      */
3017/*                                                                          */
3018/* Routine Description:                                                     */
3019/*                                                                          */
3020/*   Remove the head of the queue                                           */
3021/*                                                                          */
3022/* ASSUMED to be called from within the HA lock                             */
3023/*                                                                          */
3024/****************************************************************************/
3025static ips_copp_wait_item_t *
3026ips_removeq_copp_head(ips_copp_queue_t * queue)
3027{
3028	ips_copp_wait_item_t *item;
3029
3030	METHOD_TRACE("ips_removeq_copp_head", 1);
3031
3032	item = queue->head;
3033
3034	if (!item) {
3035		return (NULL);
3036	}
3037
3038	queue->head = item->next;
3039	item->next = NULL;
3040
3041	if (queue->tail == item)
3042		queue->tail = NULL;
3043
3044	queue->count--;
3045
3046	return (item);
3047}
3048
3049/****************************************************************************/
3050/*                                                                          */
3051/* Routine Name: ips_removeq_copp                                           */
3052/*                                                                          */
3053/* Routine Description:                                                     */
3054/*                                                                          */
3055/*   Remove an item from a queue                                            */
3056/*                                                                          */
3057/* ASSUMED to be called from within the HA lock                             */
3058/*                                                                          */
3059/****************************************************************************/
3060static ips_copp_wait_item_t *
3061ips_removeq_copp(ips_copp_queue_t * queue, ips_copp_wait_item_t * item)
3062{
3063	ips_copp_wait_item_t *p;
3064
3065	METHOD_TRACE("ips_removeq_copp", 1);
3066
3067	if (!item)
3068		return (NULL);
3069
3070	if (item == queue->head) {
3071		return (ips_removeq_copp_head(queue));
3072	}
3073
3074	p = queue->head;
3075
3076	while ((p) && (item != p->next))
3077		p = p->next;
3078
3079	if (p) {
3080		/* found a match */
3081		p->next = item->next;
3082
3083		if (!item->next)
3084			queue->tail = p;
3085
3086		item->next = NULL;
3087		queue->count--;
3088
3089		return (item);
3090	}
3091
3092	return (NULL);
3093}
3094
3095/****************************************************************************/
3096/*                                                                          */
3097/* Routine Name: ipsintr_blocking                                           */
3098/*                                                                          */
3099/* Routine Description:                                                     */
3100/*                                                                          */
3101/*   Finalize an interrupt for internal commands                            */
3102/*                                                                          */
3103/****************************************************************************/
3104static void
3105ipsintr_blocking(ips_ha_t * ha, ips_scb_t * scb)
3106{
3107	METHOD_TRACE("ipsintr_blocking", 2);
3108
3109	ips_freescb(ha, scb);
3110	if ((ha->waitflag == TRUE) && (ha->cmd_in_progress == scb->cdb[0])) {
3111		ha->waitflag = FALSE;
3112
3113		return;
3114	}
3115}
3116
3117/****************************************************************************/
3118/*                                                                          */
3119/* Routine Name: ipsintr_done                                               */
3120/*                                                                          */
3121/* Routine Description:                                                     */
3122/*                                                                          */
3123/*   Finalize an interrupt for non-internal commands                        */
3124/*                                                                          */
3125/****************************************************************************/
3126static void
3127ipsintr_done(ips_ha_t * ha, ips_scb_t * scb)
3128{
3129	METHOD_TRACE("ipsintr_done", 2);
3130
3131	if (!scb) {
3132		IPS_PRINTK(KERN_WARNING, ha->pcidev,
3133			   "Spurious interrupt; scb NULL.\n");
3134
3135		return;
3136	}
3137
3138	if (scb->scsi_cmd == NULL) {
3139		/* unexpected interrupt */
3140		IPS_PRINTK(KERN_WARNING, ha->pcidev,
3141			   "Spurious interrupt; scsi_cmd not set.\n");
3142
3143		return;
3144	}
3145
3146	ips_done(ha, scb);
3147}
3148
3149/****************************************************************************/
3150/*                                                                          */
3151/* Routine Name: ips_done                                                   */
3152/*                                                                          */
3153/* Routine Description:                                                     */
3154/*                                                                          */
3155/*   Do housekeeping on completed commands                                  */
3156/*  ASSUMED to be called form within the request lock                       */
3157/****************************************************************************/
3158static void
3159ips_done(ips_ha_t * ha, ips_scb_t * scb)
3160{
3161	int ret;
3162
3163	METHOD_TRACE("ips_done", 1);
3164
3165	if (!scb)
3166		return;
3167
3168	if ((scb->scsi_cmd) && (ips_is_passthru(scb->scsi_cmd))) {
3169		ips_cleanup_passthru(ha, scb);
3170		ha->num_ioctl--;
3171	} else {
3172		/*
3173		 * Check to see if this command had too much
3174		 * data and had to be broke up.  If so, queue
3175		 * the rest of the data and continue.
3176		 */
3177		if ((scb->breakup) || (scb->sg_break)) {
3178                        struct scatterlist *sg;
3179                        int i, sg_dma_index, ips_sg_index = 0;
3180
3181			/* we had a data breakup */
3182			scb->data_len = 0;
3183
3184                        sg = scsi_sglist(scb->scsi_cmd);
3185
3186                        /* Spin forward to last dma chunk */
3187                        sg_dma_index = scb->breakup;
3188                        for (i = 0; i < scb->breakup; i++)
3189                                sg = sg_next(sg);
3190
3191			/* Take care of possible partial on last chunk */
3192                        ips_fill_scb_sg_single(ha,
3193                                               sg_dma_address(sg),
3194                                               scb, ips_sg_index++,
3195                                               sg_dma_len(sg));
3196
3197                        for (; sg_dma_index < scsi_sg_count(scb->scsi_cmd);
3198                             sg_dma_index++, sg = sg_next(sg)) {
3199                                if (ips_fill_scb_sg_single
3200                                    (ha,
3201                                     sg_dma_address(sg),
3202                                     scb, ips_sg_index++,
3203                                     sg_dma_len(sg)) < 0)
3204                                        break;
3205                        }
3206
3207			scb->dcdb.transfer_length = scb->data_len;
3208			scb->dcdb.cmd_attribute |=
3209			    ips_command_direction[scb->scsi_cmd->cmnd[0]];
3210
3211			if (!(scb->dcdb.cmd_attribute & 0x3))
3212				scb->dcdb.transfer_length = 0;
3213
3214			if (scb->data_len >= IPS_MAX_XFER) {
3215				scb->dcdb.cmd_attribute |= IPS_TRANSFER64K;
3216				scb->dcdb.transfer_length = 0;
3217			}
3218
3219			ret = ips_send_cmd(ha, scb);
3220
3221			switch (ret) {
3222			case IPS_FAILURE:
3223				if (scb->scsi_cmd) {
3224					scb->scsi_cmd->result = DID_ERROR << 16;
3225					scb->scsi_cmd->scsi_done(scb->scsi_cmd);
3226				}
3227
3228				ips_freescb(ha, scb);
3229				break;
3230			case IPS_SUCCESS_IMM:
3231				if (scb->scsi_cmd) {
3232					scb->scsi_cmd->result = DID_ERROR << 16;
3233					scb->scsi_cmd->scsi_done(scb->scsi_cmd);
3234				}
3235
3236				ips_freescb(ha, scb);
3237				break;
3238			default:
3239				break;
3240			}	/* end case */
3241
3242			return;
3243		}
3244	}			/* end if passthru */
3245
3246	if (scb->bus) {
3247		ha->dcdb_active[scb->bus - 1] &= ~(1 << scb->target_id);
3248	}
3249
3250	scb->scsi_cmd->scsi_done(scb->scsi_cmd);
3251
3252	ips_freescb(ha, scb);
3253}
3254
3255/****************************************************************************/
3256/*                                                                          */
3257/* Routine Name: ips_map_status                                             */
3258/*                                                                          */
3259/* Routine Description:                                                     */
3260/*                                                                          */
3261/*   Map Controller Error codes to Linux Error Codes                        */
3262/*                                                                          */
3263/****************************************************************************/
3264static int
3265ips_map_status(ips_ha_t * ha, ips_scb_t * scb, ips_stat_t * sp)
3266{
3267	int errcode;
3268	int device_error;
3269	uint32_t transfer_len;
3270	IPS_DCDB_TABLE_TAPE *tapeDCDB;
3271	IPS_SCSI_INQ_DATA inquiryData;
3272
3273	METHOD_TRACE("ips_map_status", 1);
3274
3275	if (scb->bus) {
3276		DEBUG_VAR(2,
3277			  "(%s%d) Physical device error (%d %d %d): %x %x, Sense Key: %x, ASC: %x, ASCQ: %x",
3278			  ips_name, ha->host_num,
3279			  scb->scsi_cmd->device->channel,
3280			  scb->scsi_cmd->device->id, scb->scsi_cmd->device->lun,
3281			  scb->basic_status, scb->extended_status,
3282			  scb->extended_status ==
3283			  IPS_ERR_CKCOND ? scb->dcdb.sense_info[2] & 0xf : 0,
3284			  scb->extended_status ==
3285			  IPS_ERR_CKCOND ? scb->dcdb.sense_info[12] : 0,
3286			  scb->extended_status ==
3287			  IPS_ERR_CKCOND ? scb->dcdb.sense_info[13] : 0);
3288	}
3289
3290	/* default driver error */
3291	errcode = DID_ERROR;
3292	device_error = 0;
3293
3294	switch (scb->basic_status & IPS_GSC_STATUS_MASK) {
3295	case IPS_CMD_TIMEOUT:
3296		errcode = DID_TIME_OUT;
3297		break;
3298
3299	case IPS_INVAL_OPCO:
3300	case IPS_INVAL_CMD_BLK:
3301	case IPS_INVAL_PARM_BLK:
3302	case IPS_LD_ERROR:
3303	case IPS_CMD_CMPLT_WERROR:
3304		break;
3305
3306	case IPS_PHYS_DRV_ERROR:
3307		switch (scb->extended_status) {
3308		case IPS_ERR_SEL_TO:
3309			if (scb->bus)
3310				errcode = DID_NO_CONNECT;
3311
3312			break;
3313
3314		case IPS_ERR_OU_RUN:
3315			if ((scb->cmd.dcdb.op_code == IPS_CMD_EXTENDED_DCDB) ||
3316			    (scb->cmd.dcdb.op_code ==
3317			     IPS_CMD_EXTENDED_DCDB_SG)) {
3318				tapeDCDB = (IPS_DCDB_TABLE_TAPE *) & scb->dcdb;
3319				transfer_len = tapeDCDB->transfer_length;
3320			} else {
3321				transfer_len =
3322				    (uint32_t) scb->dcdb.transfer_length;
3323			}
3324
3325			if ((scb->bus) && (transfer_len < scb->data_len)) {
3326				/* Underrun - set default to no error */
3327				errcode = DID_OK;
3328
3329				/* Restrict access to physical DASD */
3330				if (scb->scsi_cmd->cmnd[0] == INQUIRY) {
3331				    ips_scmd_buf_read(scb->scsi_cmd,
3332                                      &inquiryData, sizeof (inquiryData));
3333 				    if ((inquiryData.DeviceType & 0x1f) == TYPE_DISK) {
3334				        errcode = DID_TIME_OUT;
3335				        break;
3336				    }
3337				}
3338			} else
3339				errcode = DID_ERROR;
3340
3341			break;
3342
3343		case IPS_ERR_RECOVERY:
3344			/* don't fail recovered errors */
3345			if (scb->bus)
3346				errcode = DID_OK;
3347
3348			break;
3349
3350		case IPS_ERR_HOST_RESET:
3351		case IPS_ERR_DEV_RESET:
3352			errcode = DID_RESET;
3353			break;
3354
3355		case IPS_ERR_CKCOND:
3356			if (scb->bus) {
3357				if ((scb->cmd.dcdb.op_code ==
3358				     IPS_CMD_EXTENDED_DCDB)
3359				    || (scb->cmd.dcdb.op_code ==
3360					IPS_CMD_EXTENDED_DCDB_SG)) {
3361					tapeDCDB =
3362					    (IPS_DCDB_TABLE_TAPE *) & scb->dcdb;
3363					memcpy(scb->scsi_cmd->sense_buffer,
 
3364					       tapeDCDB->sense_info,
3365					       SCSI_SENSE_BUFFERSIZE);
3366				} else {
3367					memcpy(scb->scsi_cmd->sense_buffer,
 
3368					       scb->dcdb.sense_info,
3369					       SCSI_SENSE_BUFFERSIZE);
3370				}
3371				device_error = 2;	/* check condition */
3372			}
3373
3374			errcode = DID_OK;
3375
3376			break;
3377
3378		default:
3379			errcode = DID_ERROR;
3380			break;
3381
3382		}		/* end switch */
3383	}			/* end switch */
3384
3385	scb->scsi_cmd->result = device_error | (errcode << 16);
3386
3387	return (1);
3388}
3389
3390/****************************************************************************/
3391/*                                                                          */
3392/* Routine Name: ips_send_wait                                              */
3393/*                                                                          */
3394/* Routine Description:                                                     */
3395/*                                                                          */
3396/*   Send a command to the controller and wait for it to return             */
3397/*                                                                          */
3398/*   The FFDC Time Stamp use this function for the callback, but doesn't    */
3399/*   actually need to wait.                                                 */
3400/****************************************************************************/
3401static int
3402ips_send_wait(ips_ha_t * ha, ips_scb_t * scb, int timeout, int intr)
3403{
3404	int ret;
3405
3406	METHOD_TRACE("ips_send_wait", 1);
3407
3408	if (intr != IPS_FFDC) {	/* Won't be Waiting if this is a Time Stamp */
3409		ha->waitflag = TRUE;
3410		ha->cmd_in_progress = scb->cdb[0];
3411	}
3412	scb->callback = ipsintr_blocking;
3413	ret = ips_send_cmd(ha, scb);
3414
3415	if ((ret == IPS_FAILURE) || (ret == IPS_SUCCESS_IMM))
3416		return (ret);
3417
3418	if (intr != IPS_FFDC)	/* Don't Wait around if this is a Time Stamp */
3419		ret = ips_wait(ha, timeout, intr);
3420
3421	return (ret);
3422}
3423
3424/****************************************************************************/
3425/*                                                                          */
3426/* Routine Name: ips_scmd_buf_write                                         */
3427/*                                                                          */
3428/* Routine Description:                                                     */
3429/*  Write data to struct scsi_cmnd request_buffer at proper offsets	    */
3430/****************************************************************************/
3431static void
3432ips_scmd_buf_write(struct scsi_cmnd *scmd, void *data, unsigned int count)
3433{
3434	unsigned long flags;
3435
3436	local_irq_save(flags);
3437	scsi_sg_copy_from_buffer(scmd, data, count);
3438	local_irq_restore(flags);
3439}
3440
3441/****************************************************************************/
3442/*                                                                          */
3443/* Routine Name: ips_scmd_buf_read                                          */
3444/*                                                                          */
3445/* Routine Description:                                                     */
3446/*  Copy data from a struct scsi_cmnd to a new, linear buffer		    */
3447/****************************************************************************/
3448static void
3449ips_scmd_buf_read(struct scsi_cmnd *scmd, void *data, unsigned int count)
3450{
3451	unsigned long flags;
3452
3453	local_irq_save(flags);
3454	scsi_sg_copy_to_buffer(scmd, data, count);
3455	local_irq_restore(flags);
3456}
3457
3458/****************************************************************************/
3459/*                                                                          */
3460/* Routine Name: ips_send_cmd                                               */
3461/*                                                                          */
3462/* Routine Description:                                                     */
3463/*                                                                          */
3464/*   Map SCSI commands to ServeRAID commands for logical drives             */
3465/*                                                                          */
3466/****************************************************************************/
3467static int
3468ips_send_cmd(ips_ha_t * ha, ips_scb_t * scb)
3469{
3470	int ret;
3471	char *sp;
3472	int device_error;
3473	IPS_DCDB_TABLE_TAPE *tapeDCDB;
3474	int TimeOut;
3475
3476	METHOD_TRACE("ips_send_cmd", 1);
3477
3478	ret = IPS_SUCCESS;
3479
3480	if (!scb->scsi_cmd) {
3481		/* internal command */
3482
3483		if (scb->bus > 0) {
3484			/* Controller commands can't be issued */
3485			/* to real devices -- fail them        */
3486			if ((ha->waitflag == TRUE) &&
3487			    (ha->cmd_in_progress == scb->cdb[0])) {
3488				ha->waitflag = FALSE;
3489			}
3490
3491			return (1);
3492		}
3493	} else if ((scb->bus == 0) && (!ips_is_passthru(scb->scsi_cmd))) {
3494		/* command to logical bus -- interpret */
3495		ret = IPS_SUCCESS_IMM;
3496
3497		switch (scb->scsi_cmd->cmnd[0]) {
3498		case ALLOW_MEDIUM_REMOVAL:
3499		case REZERO_UNIT:
3500		case ERASE:
3501		case WRITE_FILEMARKS:
3502		case SPACE:
3503			scb->scsi_cmd->result = DID_ERROR << 16;
3504			break;
3505
3506		case START_STOP:
3507			scb->scsi_cmd->result = DID_OK << 16;
 
3508
3509		case TEST_UNIT_READY:
3510		case INQUIRY:
3511			if (scb->target_id == IPS_ADAPTER_ID) {
3512				/*
3513				 * Either we have a TUR
3514				 * or we have a SCSI inquiry
3515				 */
3516				if (scb->scsi_cmd->cmnd[0] == TEST_UNIT_READY)
3517					scb->scsi_cmd->result = DID_OK << 16;
3518
3519				if (scb->scsi_cmd->cmnd[0] == INQUIRY) {
3520					IPS_SCSI_INQ_DATA inquiry;
3521
3522					memset(&inquiry, 0,
3523					       sizeof (IPS_SCSI_INQ_DATA));
3524
3525					inquiry.DeviceType =
3526					    IPS_SCSI_INQ_TYPE_PROCESSOR;
3527					inquiry.DeviceTypeQualifier =
3528					    IPS_SCSI_INQ_LU_CONNECTED;
3529					inquiry.Version = IPS_SCSI_INQ_REV2;
3530					inquiry.ResponseDataFormat =
3531					    IPS_SCSI_INQ_RD_REV2;
3532					inquiry.AdditionalLength = 31;
3533					inquiry.Flags[0] =
3534					    IPS_SCSI_INQ_Address16;
3535					inquiry.Flags[1] =
3536					    IPS_SCSI_INQ_WBus16 |
3537					    IPS_SCSI_INQ_Sync;
3538					strncpy(inquiry.VendorId, "IBM     ",
3539						8);
3540					strncpy(inquiry.ProductId,
3541						"SERVERAID       ", 16);
3542					strncpy(inquiry.ProductRevisionLevel,
3543						"1.00", 4);
3544
3545					ips_scmd_buf_write(scb->scsi_cmd,
3546							   &inquiry,
3547							   sizeof (inquiry));
3548
3549					scb->scsi_cmd->result = DID_OK << 16;
3550				}
3551			} else {
3552				scb->cmd.logical_info.op_code = IPS_CMD_GET_LD_INFO;
3553				scb->cmd.logical_info.command_id = IPS_COMMAND_ID(ha, scb);
3554				scb->cmd.logical_info.reserved = 0;
3555				scb->cmd.logical_info.reserved2 = 0;
3556				scb->data_len = sizeof (IPS_LD_INFO);
3557				scb->data_busaddr = ha->logical_drive_info_dma_addr;
3558				scb->flags = 0;
3559				scb->cmd.logical_info.buffer_addr = scb->data_busaddr;
3560				ret = IPS_SUCCESS;
3561			}
3562
3563			break;
3564
3565		case REQUEST_SENSE:
3566			ips_reqsen(ha, scb);
3567			scb->scsi_cmd->result = DID_OK << 16;
3568			break;
3569
3570		case READ_6:
3571		case WRITE_6:
3572			if (!scb->sg_len) {
3573				scb->cmd.basic_io.op_code =
3574				    (scb->scsi_cmd->cmnd[0] ==
3575				     READ_6) ? IPS_CMD_READ : IPS_CMD_WRITE;
3576				scb->cmd.basic_io.enhanced_sg = 0;
3577				scb->cmd.basic_io.sg_addr =
3578				    cpu_to_le32(scb->data_busaddr);
3579			} else {
3580				scb->cmd.basic_io.op_code =
3581				    (scb->scsi_cmd->cmnd[0] ==
3582				     READ_6) ? IPS_CMD_READ_SG :
3583				    IPS_CMD_WRITE_SG;
3584				scb->cmd.basic_io.enhanced_sg =
3585				    IPS_USE_ENH_SGLIST(ha) ? 0xFF : 0;
3586				scb->cmd.basic_io.sg_addr =
3587				    cpu_to_le32(scb->sg_busaddr);
3588			}
3589
3590			scb->cmd.basic_io.segment_4G = 0;
3591			scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
3592			scb->cmd.basic_io.log_drv = scb->target_id;
3593			scb->cmd.basic_io.sg_count = scb->sg_len;
3594
3595			if (scb->cmd.basic_io.lba)
3596				le32_add_cpu(&scb->cmd.basic_io.lba,
3597						le16_to_cpu(scb->cmd.basic_io.
3598							    sector_count));
3599			else
3600				scb->cmd.basic_io.lba =
3601				    (((scb->scsi_cmd->
3602				       cmnd[1] & 0x1f) << 16) | (scb->scsi_cmd->
3603								 cmnd[2] << 8) |
3604				     (scb->scsi_cmd->cmnd[3]));
3605
3606			scb->cmd.basic_io.sector_count =
3607			    cpu_to_le16(scb->data_len / IPS_BLKSIZE);
3608
3609			if (le16_to_cpu(scb->cmd.basic_io.sector_count) == 0)
3610				scb->cmd.basic_io.sector_count =
3611				    cpu_to_le16(256);
3612
3613			ret = IPS_SUCCESS;
3614			break;
3615
3616		case READ_10:
3617		case WRITE_10:
3618			if (!scb->sg_len) {
3619				scb->cmd.basic_io.op_code =
3620				    (scb->scsi_cmd->cmnd[0] ==
3621				     READ_10) ? IPS_CMD_READ : IPS_CMD_WRITE;
3622				scb->cmd.basic_io.enhanced_sg = 0;
3623				scb->cmd.basic_io.sg_addr =
3624				    cpu_to_le32(scb->data_busaddr);
3625			} else {
3626				scb->cmd.basic_io.op_code =
3627				    (scb->scsi_cmd->cmnd[0] ==
3628				     READ_10) ? IPS_CMD_READ_SG :
3629				    IPS_CMD_WRITE_SG;
3630				scb->cmd.basic_io.enhanced_sg =
3631				    IPS_USE_ENH_SGLIST(ha) ? 0xFF : 0;
3632				scb->cmd.basic_io.sg_addr =
3633				    cpu_to_le32(scb->sg_busaddr);
3634			}
3635
3636			scb->cmd.basic_io.segment_4G = 0;
3637			scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
3638			scb->cmd.basic_io.log_drv = scb->target_id;
3639			scb->cmd.basic_io.sg_count = scb->sg_len;
3640
3641			if (scb->cmd.basic_io.lba)
3642				le32_add_cpu(&scb->cmd.basic_io.lba,
3643						le16_to_cpu(scb->cmd.basic_io.
3644							    sector_count));
3645			else
3646				scb->cmd.basic_io.lba =
3647				    ((scb->scsi_cmd->cmnd[2] << 24) | (scb->
3648								       scsi_cmd->
3649								       cmnd[3]
3650								       << 16) |
3651				     (scb->scsi_cmd->cmnd[4] << 8) | scb->
3652				     scsi_cmd->cmnd[5]);
3653
3654			scb->cmd.basic_io.sector_count =
3655			    cpu_to_le16(scb->data_len / IPS_BLKSIZE);
3656
3657			if (cpu_to_le16(scb->cmd.basic_io.sector_count) == 0) {
3658				/*
3659				 * This is a null condition
3660				 * we don't have to do anything
3661				 * so just return
3662				 */
3663				scb->scsi_cmd->result = DID_OK << 16;
3664			} else
3665				ret = IPS_SUCCESS;
3666
3667			break;
3668
3669		case RESERVE:
3670		case RELEASE:
3671			scb->scsi_cmd->result = DID_OK << 16;
3672			break;
3673
3674		case MODE_SENSE:
3675			scb->cmd.basic_io.op_code = IPS_CMD_ENQUIRY;
3676			scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
3677			scb->cmd.basic_io.segment_4G = 0;
3678			scb->cmd.basic_io.enhanced_sg = 0;
3679			scb->data_len = sizeof (*ha->enq);
3680			scb->cmd.basic_io.sg_addr = ha->enq_busaddr;
3681			ret = IPS_SUCCESS;
3682			break;
3683
3684		case READ_CAPACITY:
3685			scb->cmd.logical_info.op_code = IPS_CMD_GET_LD_INFO;
3686			scb->cmd.logical_info.command_id = IPS_COMMAND_ID(ha, scb);
3687			scb->cmd.logical_info.reserved = 0;
3688			scb->cmd.logical_info.reserved2 = 0;
3689			scb->cmd.logical_info.reserved3 = 0;
3690			scb->data_len = sizeof (IPS_LD_INFO);
3691			scb->data_busaddr = ha->logical_drive_info_dma_addr;
3692			scb->flags = 0;
3693			scb->cmd.logical_info.buffer_addr = scb->data_busaddr;
3694			ret = IPS_SUCCESS;
3695			break;
3696
3697		case SEND_DIAGNOSTIC:
3698		case REASSIGN_BLOCKS:
3699		case FORMAT_UNIT:
3700		case SEEK_10:
3701		case VERIFY:
3702		case READ_DEFECT_DATA:
3703		case READ_BUFFER:
3704		case WRITE_BUFFER:
3705			scb->scsi_cmd->result = DID_OK << 16;
3706			break;
3707
3708		default:
3709			/* Set the Return Info to appear like the Command was */
3710			/* attempted, a Check Condition occurred, and Sense   */
3711			/* Data indicating an Invalid CDB OpCode is returned. */
3712			sp = (char *) scb->scsi_cmd->sense_buffer;
3713
3714			sp[0] = 0x70;	/* Error Code               */
3715			sp[2] = ILLEGAL_REQUEST;	/* Sense Key 5 Illegal Req. */
3716			sp[7] = 0x0A;	/* Additional Sense Length  */
3717			sp[12] = 0x20;	/* ASC = Invalid OpCode     */
3718			sp[13] = 0x00;	/* ASCQ                     */
3719
3720			device_error = 2;	/* Indicate Check Condition */
3721			scb->scsi_cmd->result = device_error | (DID_OK << 16);
3722			break;
3723		}		/* end switch */
3724	}
3725	/* end if */
3726	if (ret == IPS_SUCCESS_IMM)
3727		return (ret);
3728
3729	/* setup DCDB */
3730	if (scb->bus > 0) {
3731
3732		/* If we already know the Device is Not there, no need to attempt a Command   */
3733		/* This also protects an NT FailOver Controller from getting CDB's sent to it */
3734		if (ha->conf->dev[scb->bus - 1][scb->target_id].ucState == 0) {
3735			scb->scsi_cmd->result = DID_NO_CONNECT << 16;
3736			return (IPS_SUCCESS_IMM);
3737		}
3738
3739		ha->dcdb_active[scb->bus - 1] |= (1 << scb->target_id);
3740		scb->cmd.dcdb.command_id = IPS_COMMAND_ID(ha, scb);
3741		scb->cmd.dcdb.dcdb_address = cpu_to_le32(scb->scb_busaddr +
3742							 (unsigned long) &scb->
3743							 dcdb -
3744							 (unsigned long) scb);
3745		scb->cmd.dcdb.reserved = 0;
3746		scb->cmd.dcdb.reserved2 = 0;
3747		scb->cmd.dcdb.reserved3 = 0;
3748		scb->cmd.dcdb.segment_4G = 0;
3749		scb->cmd.dcdb.enhanced_sg = 0;
3750
3751		TimeOut = scb->scsi_cmd->request->timeout;
3752
3753		if (ha->subsys->param[4] & 0x00100000) {	/* If NEW Tape DCDB is Supported */
3754			if (!scb->sg_len) {
3755				scb->cmd.dcdb.op_code = IPS_CMD_EXTENDED_DCDB;
3756			} else {
3757				scb->cmd.dcdb.op_code =
3758				    IPS_CMD_EXTENDED_DCDB_SG;
3759				scb->cmd.dcdb.enhanced_sg =
3760				    IPS_USE_ENH_SGLIST(ha) ? 0xFF : 0;
3761			}
3762
3763			tapeDCDB = (IPS_DCDB_TABLE_TAPE *) & scb->dcdb;	/* Use Same Data Area as Old DCDB Struct */
3764			tapeDCDB->device_address =
3765			    ((scb->bus - 1) << 4) | scb->target_id;
3766			tapeDCDB->cmd_attribute |= IPS_DISCONNECT_ALLOWED;
3767			tapeDCDB->cmd_attribute &= ~IPS_TRANSFER64K;	/* Always Turn OFF 64K Size Flag */
3768
3769			if (TimeOut) {
3770				if (TimeOut < (10 * HZ))
3771					tapeDCDB->cmd_attribute |= IPS_TIMEOUT10;	/* TimeOut is 10 Seconds */
3772				else if (TimeOut < (60 * HZ))
3773					tapeDCDB->cmd_attribute |= IPS_TIMEOUT60;	/* TimeOut is 60 Seconds */
3774				else if (TimeOut < (1200 * HZ))
3775					tapeDCDB->cmd_attribute |= IPS_TIMEOUT20M;	/* TimeOut is 20 Minutes */
3776			}
3777
3778			tapeDCDB->cdb_length = scb->scsi_cmd->cmd_len;
3779			tapeDCDB->reserved_for_LUN = 0;
3780			tapeDCDB->transfer_length = scb->data_len;
3781			if (scb->cmd.dcdb.op_code == IPS_CMD_EXTENDED_DCDB_SG)
3782				tapeDCDB->buffer_pointer =
3783				    cpu_to_le32(scb->sg_busaddr);
3784			else
3785				tapeDCDB->buffer_pointer =
3786				    cpu_to_le32(scb->data_busaddr);
3787			tapeDCDB->sg_count = scb->sg_len;
3788			tapeDCDB->sense_length = sizeof (tapeDCDB->sense_info);
3789			tapeDCDB->scsi_status = 0;
3790			tapeDCDB->reserved = 0;
3791			memcpy(tapeDCDB->scsi_cdb, scb->scsi_cmd->cmnd,
3792			       scb->scsi_cmd->cmd_len);
3793		} else {
3794			if (!scb->sg_len) {
3795				scb->cmd.dcdb.op_code = IPS_CMD_DCDB;
3796			} else {
3797				scb->cmd.dcdb.op_code = IPS_CMD_DCDB_SG;
3798				scb->cmd.dcdb.enhanced_sg =
3799				    IPS_USE_ENH_SGLIST(ha) ? 0xFF : 0;
3800			}
3801
3802			scb->dcdb.device_address =
3803			    ((scb->bus - 1) << 4) | scb->target_id;
3804			scb->dcdb.cmd_attribute |= IPS_DISCONNECT_ALLOWED;
3805
3806			if (TimeOut) {
3807				if (TimeOut < (10 * HZ))
3808					scb->dcdb.cmd_attribute |= IPS_TIMEOUT10;	/* TimeOut is 10 Seconds */
3809				else if (TimeOut < (60 * HZ))
3810					scb->dcdb.cmd_attribute |= IPS_TIMEOUT60;	/* TimeOut is 60 Seconds */
3811				else if (TimeOut < (1200 * HZ))
3812					scb->dcdb.cmd_attribute |= IPS_TIMEOUT20M;	/* TimeOut is 20 Minutes */
3813			}
3814
3815			scb->dcdb.transfer_length = scb->data_len;
3816			if (scb->dcdb.cmd_attribute & IPS_TRANSFER64K)
3817				scb->dcdb.transfer_length = 0;
3818			if (scb->cmd.dcdb.op_code == IPS_CMD_DCDB_SG)
3819				scb->dcdb.buffer_pointer =
3820				    cpu_to_le32(scb->sg_busaddr);
3821			else
3822				scb->dcdb.buffer_pointer =
3823				    cpu_to_le32(scb->data_busaddr);
3824			scb->dcdb.cdb_length = scb->scsi_cmd->cmd_len;
3825			scb->dcdb.sense_length = sizeof (scb->dcdb.sense_info);
3826			scb->dcdb.sg_count = scb->sg_len;
3827			scb->dcdb.reserved = 0;
3828			memcpy(scb->dcdb.scsi_cdb, scb->scsi_cmd->cmnd,
3829			       scb->scsi_cmd->cmd_len);
3830			scb->dcdb.scsi_status = 0;
3831			scb->dcdb.reserved2[0] = 0;
3832			scb->dcdb.reserved2[1] = 0;
3833			scb->dcdb.reserved2[2] = 0;
3834		}
3835	}
3836
3837	return ((*ha->func.issue) (ha, scb));
3838}
3839
3840/****************************************************************************/
3841/*                                                                          */
3842/* Routine Name: ips_chk_status                                             */
3843/*                                                                          */
3844/* Routine Description:                                                     */
3845/*                                                                          */
3846/*   Check the status of commands to logical drives                         */
3847/*   Assumed to be called with the HA lock                                  */
3848/****************************************************************************/
3849static void
3850ips_chkstatus(ips_ha_t * ha, IPS_STATUS * pstatus)
3851{
3852	ips_scb_t *scb;
3853	ips_stat_t *sp;
3854	uint8_t basic_status;
3855	uint8_t ext_status;
3856	int errcode;
3857	IPS_SCSI_INQ_DATA inquiryData;
3858
3859	METHOD_TRACE("ips_chkstatus", 1);
3860
3861	scb = &ha->scbs[pstatus->fields.command_id];
3862	scb->basic_status = basic_status =
3863	    pstatus->fields.basic_status & IPS_BASIC_STATUS_MASK;
3864	scb->extended_status = ext_status = pstatus->fields.extended_status;
3865
3866	sp = &ha->sp;
3867	sp->residue_len = 0;
3868	sp->scb_addr = (void *) scb;
3869
3870	/* Remove the item from the active queue */
3871	ips_removeq_scb(&ha->scb_activelist, scb);
3872
3873	if (!scb->scsi_cmd)
3874		/* internal commands are handled in do_ipsintr */
3875		return;
3876
3877	DEBUG_VAR(2, "(%s%d) ips_chkstatus: cmd 0x%X id %d (%d %d %d)",
3878		  ips_name,
3879		  ha->host_num,
3880		  scb->cdb[0],
3881		  scb->cmd.basic_io.command_id,
3882		  scb->bus, scb->target_id, scb->lun);
3883
3884	if ((scb->scsi_cmd) && (ips_is_passthru(scb->scsi_cmd)))
3885		/* passthru - just returns the raw result */
3886		return;
3887
3888	errcode = DID_OK;
3889
3890	if (((basic_status & IPS_GSC_STATUS_MASK) == IPS_CMD_SUCCESS) ||
3891	    ((basic_status & IPS_GSC_STATUS_MASK) == IPS_CMD_RECOVERED_ERROR)) {
3892
3893		if (scb->bus == 0) {
3894			if ((basic_status & IPS_GSC_STATUS_MASK) ==
3895			    IPS_CMD_RECOVERED_ERROR) {
3896				DEBUG_VAR(1,
3897					  "(%s%d) Recovered Logical Drive Error OpCode: %x, BSB: %x, ESB: %x",
3898					  ips_name, ha->host_num,
3899					  scb->cmd.basic_io.op_code,
3900					  basic_status, ext_status);
3901			}
3902
3903			switch (scb->scsi_cmd->cmnd[0]) {
3904			case ALLOW_MEDIUM_REMOVAL:
3905			case REZERO_UNIT:
3906			case ERASE:
3907			case WRITE_FILEMARKS:
3908			case SPACE:
3909				errcode = DID_ERROR;
3910				break;
3911
3912			case START_STOP:
3913				break;
3914
3915			case TEST_UNIT_READY:
3916				if (!ips_online(ha, scb)) {
3917					errcode = DID_TIME_OUT;
3918				}
3919				break;
3920
3921			case INQUIRY:
3922				if (ips_online(ha, scb)) {
3923					ips_inquiry(ha, scb);
3924				} else {
3925					errcode = DID_TIME_OUT;
3926				}
3927				break;
3928
3929			case REQUEST_SENSE:
3930				ips_reqsen(ha, scb);
3931				break;
3932
3933			case READ_6:
3934			case WRITE_6:
3935			case READ_10:
3936			case WRITE_10:
3937			case RESERVE:
3938			case RELEASE:
3939				break;
3940
3941			case MODE_SENSE:
3942				if (!ips_online(ha, scb)
3943				    || !ips_msense(ha, scb)) {
3944					errcode = DID_ERROR;
3945				}
3946				break;
3947
3948			case READ_CAPACITY:
3949				if (ips_online(ha, scb))
3950					ips_rdcap(ha, scb);
3951				else {
3952					errcode = DID_TIME_OUT;
3953				}
3954				break;
3955
3956			case SEND_DIAGNOSTIC:
3957			case REASSIGN_BLOCKS:
3958				break;
3959
3960			case FORMAT_UNIT:
3961				errcode = DID_ERROR;
3962				break;
3963
3964			case SEEK_10:
3965			case VERIFY:
3966			case READ_DEFECT_DATA:
3967			case READ_BUFFER:
3968			case WRITE_BUFFER:
3969				break;
3970
3971			default:
3972				errcode = DID_ERROR;
3973			}	/* end switch */
3974
3975			scb->scsi_cmd->result = errcode << 16;
3976		} else {	/* bus == 0 */
3977			/* restrict access to physical drives */
3978			if (scb->scsi_cmd->cmnd[0] == INQUIRY) {
3979			    ips_scmd_buf_read(scb->scsi_cmd,
3980                                  &inquiryData, sizeof (inquiryData));
3981			    if ((inquiryData.DeviceType & 0x1f) == TYPE_DISK)
3982			        scb->scsi_cmd->result = DID_TIME_OUT << 16;
3983			}
3984		}		/* else */
3985	} else {		/* recovered error / success */
3986		if (scb->bus == 0) {
3987			DEBUG_VAR(1,
3988				  "(%s%d) Unrecovered Logical Drive Error OpCode: %x, BSB: %x, ESB: %x",
3989				  ips_name, ha->host_num,
3990				  scb->cmd.basic_io.op_code, basic_status,
3991				  ext_status);
3992		}
3993
3994		ips_map_status(ha, scb, sp);
3995	}			/* else */
3996}
3997
3998/****************************************************************************/
3999/*                                                                          */
4000/* Routine Name: ips_online                                                 */
4001/*                                                                          */
4002/* Routine Description:                                                     */
4003/*                                                                          */
4004/*   Determine if a logical drive is online                                 */
4005/*                                                                          */
4006/****************************************************************************/
4007static int
4008ips_online(ips_ha_t * ha, ips_scb_t * scb)
4009{
4010	METHOD_TRACE("ips_online", 1);
4011
4012	if (scb->target_id >= IPS_MAX_LD)
4013		return (0);
4014
4015	if ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1) {
4016		memset(ha->logical_drive_info, 0, sizeof (IPS_LD_INFO));
4017		return (0);
4018	}
4019
4020	if (ha->logical_drive_info->drive_info[scb->target_id].state !=
4021	    IPS_LD_OFFLINE
4022	    && ha->logical_drive_info->drive_info[scb->target_id].state !=
4023	    IPS_LD_FREE
4024	    && ha->logical_drive_info->drive_info[scb->target_id].state !=
4025	    IPS_LD_CRS
4026	    && ha->logical_drive_info->drive_info[scb->target_id].state !=
4027	    IPS_LD_SYS)
4028		return (1);
4029	else
4030		return (0);
4031}
4032
4033/****************************************************************************/
4034/*                                                                          */
4035/* Routine Name: ips_inquiry                                                */
4036/*                                                                          */
4037/* Routine Description:                                                     */
4038/*                                                                          */
4039/*   Simulate an inquiry command to a logical drive                         */
4040/*                                                                          */
4041/****************************************************************************/
4042static int
4043ips_inquiry(ips_ha_t * ha, ips_scb_t * scb)
4044{
4045	IPS_SCSI_INQ_DATA inquiry;
4046
4047	METHOD_TRACE("ips_inquiry", 1);
4048
4049	memset(&inquiry, 0, sizeof (IPS_SCSI_INQ_DATA));
4050
4051	inquiry.DeviceType = IPS_SCSI_INQ_TYPE_DASD;
4052	inquiry.DeviceTypeQualifier = IPS_SCSI_INQ_LU_CONNECTED;
4053	inquiry.Version = IPS_SCSI_INQ_REV2;
4054	inquiry.ResponseDataFormat = IPS_SCSI_INQ_RD_REV2;
4055	inquiry.AdditionalLength = 31;
4056	inquiry.Flags[0] = IPS_SCSI_INQ_Address16;
4057	inquiry.Flags[1] =
4058	    IPS_SCSI_INQ_WBus16 | IPS_SCSI_INQ_Sync | IPS_SCSI_INQ_CmdQue;
4059	strncpy(inquiry.VendorId, "IBM     ", 8);
4060	strncpy(inquiry.ProductId, "SERVERAID       ", 16);
4061	strncpy(inquiry.ProductRevisionLevel, "1.00", 4);
4062
4063	ips_scmd_buf_write(scb->scsi_cmd, &inquiry, sizeof (inquiry));
4064
4065	return (1);
4066}
4067
4068/****************************************************************************/
4069/*                                                                          */
4070/* Routine Name: ips_rdcap                                                  */
4071/*                                                                          */
4072/* Routine Description:                                                     */
4073/*                                                                          */
4074/*   Simulate a read capacity command to a logical drive                    */
4075/*                                                                          */
4076/****************************************************************************/
4077static int
4078ips_rdcap(ips_ha_t * ha, ips_scb_t * scb)
4079{
4080	IPS_SCSI_CAPACITY cap;
4081
4082	METHOD_TRACE("ips_rdcap", 1);
4083
4084	if (scsi_bufflen(scb->scsi_cmd) < 8)
4085		return (0);
4086
4087	cap.lba =
4088	    cpu_to_be32(le32_to_cpu
4089			(ha->logical_drive_info->
4090			 drive_info[scb->target_id].sector_count) - 1);
4091	cap.len = cpu_to_be32((uint32_t) IPS_BLKSIZE);
4092
4093	ips_scmd_buf_write(scb->scsi_cmd, &cap, sizeof (cap));
4094
4095	return (1);
4096}
4097
4098/****************************************************************************/
4099/*                                                                          */
4100/* Routine Name: ips_msense                                                 */
4101/*                                                                          */
4102/* Routine Description:                                                     */
4103/*                                                                          */
4104/*   Simulate a mode sense command to a logical drive                       */
4105/*                                                                          */
4106/****************************************************************************/
4107static int
4108ips_msense(ips_ha_t * ha, ips_scb_t * scb)
4109{
4110	uint16_t heads;
4111	uint16_t sectors;
4112	uint32_t cylinders;
4113	IPS_SCSI_MODE_PAGE_DATA mdata;
4114
4115	METHOD_TRACE("ips_msense", 1);
4116
4117	if (le32_to_cpu(ha->enq->ulDriveSize[scb->target_id]) > 0x400000 &&
4118	    (ha->enq->ucMiscFlag & 0x8) == 0) {
4119		heads = IPS_NORM_HEADS;
4120		sectors = IPS_NORM_SECTORS;
4121	} else {
4122		heads = IPS_COMP_HEADS;
4123		sectors = IPS_COMP_SECTORS;
4124	}
4125
4126	cylinders =
4127	    (le32_to_cpu(ha->enq->ulDriveSize[scb->target_id]) -
4128	     1) / (heads * sectors);
4129
4130	memset(&mdata, 0, sizeof (IPS_SCSI_MODE_PAGE_DATA));
4131
4132	mdata.hdr.BlockDescLength = 8;
4133
4134	switch (scb->scsi_cmd->cmnd[2] & 0x3f) {
4135	case 0x03:		/* page 3 */
4136		mdata.pdata.pg3.PageCode = 3;
4137		mdata.pdata.pg3.PageLength = sizeof (IPS_SCSI_MODE_PAGE3);
4138		mdata.hdr.DataLength =
4139		    3 + mdata.hdr.BlockDescLength + mdata.pdata.pg3.PageLength;
4140		mdata.pdata.pg3.TracksPerZone = 0;
4141		mdata.pdata.pg3.AltSectorsPerZone = 0;
4142		mdata.pdata.pg3.AltTracksPerZone = 0;
4143		mdata.pdata.pg3.AltTracksPerVolume = 0;
4144		mdata.pdata.pg3.SectorsPerTrack = cpu_to_be16(sectors);
4145		mdata.pdata.pg3.BytesPerSector = cpu_to_be16(IPS_BLKSIZE);
4146		mdata.pdata.pg3.Interleave = cpu_to_be16(1);
4147		mdata.pdata.pg3.TrackSkew = 0;
4148		mdata.pdata.pg3.CylinderSkew = 0;
4149		mdata.pdata.pg3.flags = IPS_SCSI_MP3_SoftSector;
4150		break;
4151
4152	case 0x4:
4153		mdata.pdata.pg4.PageCode = 4;
4154		mdata.pdata.pg4.PageLength = sizeof (IPS_SCSI_MODE_PAGE4);
4155		mdata.hdr.DataLength =
4156		    3 + mdata.hdr.BlockDescLength + mdata.pdata.pg4.PageLength;
4157		mdata.pdata.pg4.CylindersHigh =
4158		    cpu_to_be16((cylinders >> 8) & 0xFFFF);
4159		mdata.pdata.pg4.CylindersLow = (cylinders & 0xFF);
4160		mdata.pdata.pg4.Heads = heads;
4161		mdata.pdata.pg4.WritePrecompHigh = 0;
4162		mdata.pdata.pg4.WritePrecompLow = 0;
4163		mdata.pdata.pg4.ReducedWriteCurrentHigh = 0;
4164		mdata.pdata.pg4.ReducedWriteCurrentLow = 0;
4165		mdata.pdata.pg4.StepRate = cpu_to_be16(1);
4166		mdata.pdata.pg4.LandingZoneHigh = 0;
4167		mdata.pdata.pg4.LandingZoneLow = 0;
4168		mdata.pdata.pg4.flags = 0;
4169		mdata.pdata.pg4.RotationalOffset = 0;
4170		mdata.pdata.pg4.MediumRotationRate = 0;
4171		break;
4172	case 0x8:
4173		mdata.pdata.pg8.PageCode = 8;
4174		mdata.pdata.pg8.PageLength = sizeof (IPS_SCSI_MODE_PAGE8);
4175		mdata.hdr.DataLength =
4176		    3 + mdata.hdr.BlockDescLength + mdata.pdata.pg8.PageLength;
4177		/* everything else is left set to 0 */
4178		break;
4179
4180	default:
4181		return (0);
4182	}			/* end switch */
4183
4184	ips_scmd_buf_write(scb->scsi_cmd, &mdata, sizeof (mdata));
4185
4186	return (1);
4187}
4188
4189/****************************************************************************/
4190/*                                                                          */
4191/* Routine Name: ips_reqsen                                                 */
4192/*                                                                          */
4193/* Routine Description:                                                     */
4194/*                                                                          */
4195/*   Simulate a request sense command to a logical drive                    */
4196/*                                                                          */
4197/****************************************************************************/
4198static int
4199ips_reqsen(ips_ha_t * ha, ips_scb_t * scb)
4200{
4201	IPS_SCSI_REQSEN reqsen;
4202
4203	METHOD_TRACE("ips_reqsen", 1);
4204
4205	memset(&reqsen, 0, sizeof (IPS_SCSI_REQSEN));
4206
4207	reqsen.ResponseCode =
4208	    IPS_SCSI_REQSEN_VALID | IPS_SCSI_REQSEN_CURRENT_ERR;
4209	reqsen.AdditionalLength = 10;
4210	reqsen.AdditionalSenseCode = IPS_SCSI_REQSEN_NO_SENSE;
4211	reqsen.AdditionalSenseCodeQual = IPS_SCSI_REQSEN_NO_SENSE;
4212
4213	ips_scmd_buf_write(scb->scsi_cmd, &reqsen, sizeof (reqsen));
4214
4215	return (1);
4216}
4217
4218/****************************************************************************/
4219/*                                                                          */
4220/* Routine Name: ips_free                                                   */
4221/*                                                                          */
4222/* Routine Description:                                                     */
4223/*                                                                          */
4224/*   Free any allocated space for this controller                           */
4225/*                                                                          */
4226/****************************************************************************/
4227static void
4228ips_free(ips_ha_t * ha)
4229{
4230
4231	METHOD_TRACE("ips_free", 1);
4232
4233	if (ha) {
4234		if (ha->enq) {
4235			pci_free_consistent(ha->pcidev, sizeof(IPS_ENQ),
4236					    ha->enq, ha->enq_busaddr);
4237			ha->enq = NULL;
4238		}
4239
4240		kfree(ha->conf);
4241		ha->conf = NULL;
4242
4243		if (ha->adapt) {
4244			pci_free_consistent(ha->pcidev,
4245					    sizeof (IPS_ADAPTER) +
4246					    sizeof (IPS_IO_CMD), ha->adapt,
4247					    ha->adapt->hw_status_start);
4248			ha->adapt = NULL;
4249		}
4250
4251		if (ha->logical_drive_info) {
4252			pci_free_consistent(ha->pcidev,
4253					    sizeof (IPS_LD_INFO),
4254					    ha->logical_drive_info,
4255					    ha->logical_drive_info_dma_addr);
4256			ha->logical_drive_info = NULL;
4257		}
4258
4259		kfree(ha->nvram);
4260		ha->nvram = NULL;
4261
4262		kfree(ha->subsys);
4263		ha->subsys = NULL;
4264
4265		if (ha->ioctl_data) {
4266			pci_free_consistent(ha->pcidev, ha->ioctl_len,
4267					    ha->ioctl_data, ha->ioctl_busaddr);
4268			ha->ioctl_data = NULL;
4269			ha->ioctl_datasize = 0;
4270			ha->ioctl_len = 0;
4271		}
4272		ips_deallocatescbs(ha, ha->max_cmds);
4273
4274		/* free memory mapped (if applicable) */
4275		if (ha->mem_ptr) {
4276			iounmap(ha->ioremap_ptr);
4277			ha->ioremap_ptr = NULL;
4278			ha->mem_ptr = NULL;
4279		}
4280
4281		ha->mem_addr = 0;
4282
4283	}
4284}
4285
4286/****************************************************************************/
4287/*                                                                          */
4288/* Routine Name: ips_deallocatescbs                                         */
4289/*                                                                          */
4290/* Routine Description:                                                     */
4291/*                                                                          */
4292/*   Free the command blocks                                                */
4293/*                                                                          */
4294/****************************************************************************/
4295static int
4296ips_deallocatescbs(ips_ha_t * ha, int cmds)
4297{
4298	if (ha->scbs) {
4299		pci_free_consistent(ha->pcidev,
4300				    IPS_SGLIST_SIZE(ha) * IPS_MAX_SG * cmds,
4301				    ha->scbs->sg_list.list,
4302				    ha->scbs->sg_busaddr);
4303		pci_free_consistent(ha->pcidev, sizeof (ips_scb_t) * cmds,
4304				    ha->scbs, ha->scbs->scb_busaddr);
4305		ha->scbs = NULL;
4306	}			/* end if */
4307	return 1;
4308}
4309
4310/****************************************************************************/
4311/*                                                                          */
4312/* Routine Name: ips_allocatescbs                                           */
4313/*                                                                          */
4314/* Routine Description:                                                     */
4315/*                                                                          */
4316/*   Allocate the command blocks                                            */
4317/*                                                                          */
4318/****************************************************************************/
4319static int
4320ips_allocatescbs(ips_ha_t * ha)
4321{
4322	ips_scb_t *scb_p;
4323	IPS_SG_LIST ips_sg;
4324	int i;
4325	dma_addr_t command_dma, sg_dma;
4326
4327	METHOD_TRACE("ips_allocatescbs", 1);
4328
4329	/* Allocate memory for the SCBs */
4330	ha->scbs =
4331	    pci_alloc_consistent(ha->pcidev, ha->max_cmds * sizeof (ips_scb_t),
4332				 &command_dma);
4333	if (ha->scbs == NULL)
4334		return 0;
4335	ips_sg.list =
4336	    pci_alloc_consistent(ha->pcidev,
4337				 IPS_SGLIST_SIZE(ha) * IPS_MAX_SG *
4338				 ha->max_cmds, &sg_dma);
4339	if (ips_sg.list == NULL) {
4340		pci_free_consistent(ha->pcidev,
4341				    ha->max_cmds * sizeof (ips_scb_t), ha->scbs,
4342				    command_dma);
4343		return 0;
4344	}
4345
4346	memset(ha->scbs, 0, ha->max_cmds * sizeof (ips_scb_t));
4347
4348	for (i = 0; i < ha->max_cmds; i++) {
4349		scb_p = &ha->scbs[i];
4350		scb_p->scb_busaddr = command_dma + sizeof (ips_scb_t) * i;
4351		/* set up S/G list */
4352		if (IPS_USE_ENH_SGLIST(ha)) {
4353			scb_p->sg_list.enh_list =
4354			    ips_sg.enh_list + i * IPS_MAX_SG;
4355			scb_p->sg_busaddr =
4356			    sg_dma + IPS_SGLIST_SIZE(ha) * IPS_MAX_SG * i;
4357		} else {
4358			scb_p->sg_list.std_list =
4359			    ips_sg.std_list + i * IPS_MAX_SG;
4360			scb_p->sg_busaddr =
4361			    sg_dma + IPS_SGLIST_SIZE(ha) * IPS_MAX_SG * i;
4362		}
4363
4364		/* add to the free list */
4365		if (i < ha->max_cmds - 1) {
4366			scb_p->q_next = ha->scb_freelist;
4367			ha->scb_freelist = scb_p;
4368		}
4369	}
4370
4371	/* success */
4372	return (1);
4373}
4374
4375/****************************************************************************/
4376/*                                                                          */
4377/* Routine Name: ips_init_scb                                               */
4378/*                                                                          */
4379/* Routine Description:                                                     */
4380/*                                                                          */
4381/*   Initialize a CCB to default values                                     */
4382/*                                                                          */
4383/****************************************************************************/
4384static void
4385ips_init_scb(ips_ha_t * ha, ips_scb_t * scb)
4386{
4387	IPS_SG_LIST sg_list;
4388	uint32_t cmd_busaddr, sg_busaddr;
4389	METHOD_TRACE("ips_init_scb", 1);
4390
4391	if (scb == NULL)
4392		return;
4393
4394	sg_list.list = scb->sg_list.list;
4395	cmd_busaddr = scb->scb_busaddr;
4396	sg_busaddr = scb->sg_busaddr;
4397	/* zero fill */
4398	memset(scb, 0, sizeof (ips_scb_t));
4399	memset(ha->dummy, 0, sizeof (IPS_IO_CMD));
4400
4401	/* Initialize dummy command bucket */
4402	ha->dummy->op_code = 0xFF;
4403	ha->dummy->ccsar = cpu_to_le32(ha->adapt->hw_status_start
4404				       + sizeof (IPS_ADAPTER));
4405	ha->dummy->command_id = IPS_MAX_CMDS;
4406
4407	/* set bus address of scb */
4408	scb->scb_busaddr = cmd_busaddr;
4409	scb->sg_busaddr = sg_busaddr;
4410	scb->sg_list.list = sg_list.list;
4411
4412	/* Neptune Fix */
4413	scb->cmd.basic_io.cccr = cpu_to_le32((uint32_t) IPS_BIT_ILE);
4414	scb->cmd.basic_io.ccsar = cpu_to_le32(ha->adapt->hw_status_start
4415					      + sizeof (IPS_ADAPTER));
4416}
4417
4418/****************************************************************************/
4419/*                                                                          */
4420/* Routine Name: ips_get_scb                                                */
4421/*                                                                          */
4422/* Routine Description:                                                     */
4423/*                                                                          */
4424/*   Initialize a CCB to default values                                     */
4425/*                                                                          */
4426/* ASSUMED to be called from within a lock                                 */
4427/*                                                                          */
4428/****************************************************************************/
4429static ips_scb_t *
4430ips_getscb(ips_ha_t * ha)
4431{
4432	ips_scb_t *scb;
4433
4434	METHOD_TRACE("ips_getscb", 1);
4435
4436	if ((scb = ha->scb_freelist) == NULL) {
4437
4438		return (NULL);
4439	}
4440
4441	ha->scb_freelist = scb->q_next;
4442	scb->flags = 0;
4443	scb->q_next = NULL;
4444
4445	ips_init_scb(ha, scb);
4446
4447	return (scb);
4448}
4449
4450/****************************************************************************/
4451/*                                                                          */
4452/* Routine Name: ips_free_scb                                               */
4453/*                                                                          */
4454/* Routine Description:                                                     */
4455/*                                                                          */
4456/*   Return an unused CCB back to the free list                             */
4457/*                                                                          */
4458/* ASSUMED to be called from within a lock                                  */
4459/*                                                                          */
4460/****************************************************************************/
4461static void
4462ips_freescb(ips_ha_t * ha, ips_scb_t * scb)
4463{
4464
4465	METHOD_TRACE("ips_freescb", 1);
4466	if (scb->flags & IPS_SCB_MAP_SG)
4467                scsi_dma_unmap(scb->scsi_cmd);
4468	else if (scb->flags & IPS_SCB_MAP_SINGLE)
4469		pci_unmap_single(ha->pcidev, scb->data_busaddr, scb->data_len,
4470				 IPS_DMA_DIR(scb));
4471
4472	/* check to make sure this is not our "special" scb */
4473	if (IPS_COMMAND_ID(ha, scb) < (ha->max_cmds - 1)) {
4474		scb->q_next = ha->scb_freelist;
4475		ha->scb_freelist = scb;
4476	}
4477}
4478
4479/****************************************************************************/
4480/*                                                                          */
4481/* Routine Name: ips_isinit_copperhead                                      */
4482/*                                                                          */
4483/* Routine Description:                                                     */
4484/*                                                                          */
4485/*   Is controller initialized ?                                            */
4486/*                                                                          */
4487/****************************************************************************/
4488static int
4489ips_isinit_copperhead(ips_ha_t * ha)
4490{
4491	uint8_t scpr;
4492	uint8_t isr;
4493
4494	METHOD_TRACE("ips_isinit_copperhead", 1);
4495
4496	isr = inb(ha->io_addr + IPS_REG_HISR);
4497	scpr = inb(ha->io_addr + IPS_REG_SCPR);
4498
4499	if (((isr & IPS_BIT_EI) == 0) && ((scpr & IPS_BIT_EBM) == 0))
4500		return (0);
4501	else
4502		return (1);
4503}
4504
4505/****************************************************************************/
4506/*                                                                          */
4507/* Routine Name: ips_isinit_copperhead_memio                                */
4508/*                                                                          */
4509/* Routine Description:                                                     */
4510/*                                                                          */
4511/*   Is controller initialized ?                                            */
4512/*                                                                          */
4513/****************************************************************************/
4514static int
4515ips_isinit_copperhead_memio(ips_ha_t * ha)
4516{
4517	uint8_t isr = 0;
4518	uint8_t scpr;
4519
4520	METHOD_TRACE("ips_is_init_copperhead_memio", 1);
4521
4522	isr = readb(ha->mem_ptr + IPS_REG_HISR);
4523	scpr = readb(ha->mem_ptr + IPS_REG_SCPR);
4524
4525	if (((isr & IPS_BIT_EI) == 0) && ((scpr & IPS_BIT_EBM) == 0))
4526		return (0);
4527	else
4528		return (1);
4529}
4530
4531/****************************************************************************/
4532/*                                                                          */
4533/* Routine Name: ips_isinit_morpheus                                        */
4534/*                                                                          */
4535/* Routine Description:                                                     */
4536/*                                                                          */
4537/*   Is controller initialized ?                                            */
4538/*                                                                          */
4539/****************************************************************************/
4540static int
4541ips_isinit_morpheus(ips_ha_t * ha)
4542{
4543	uint32_t post;
4544	uint32_t bits;
4545
4546	METHOD_TRACE("ips_is_init_morpheus", 1);
4547
4548	if (ips_isintr_morpheus(ha))
4549	    ips_flush_and_reset(ha);
4550
4551	post = readl(ha->mem_ptr + IPS_REG_I960_MSG0);
4552	bits = readl(ha->mem_ptr + IPS_REG_I2O_HIR);
4553
4554	if (post == 0)
4555		return (0);
4556	else if (bits & 0x3)
4557		return (0);
4558	else
4559		return (1);
4560}
4561
4562/****************************************************************************/
4563/*                                                                          */
4564/* Routine Name: ips_flush_and_reset                                        */
4565/*                                                                          */
4566/* Routine Description:                                                     */
4567/*                                                                          */
4568/*   Perform cleanup ( FLUSH and RESET ) when the adapter is in an unknown  */
4569/*   state ( was trying to INIT and an interrupt was already pending ) ...  */
4570/*                                                                          */
4571/****************************************************************************/
4572static void
4573ips_flush_and_reset(ips_ha_t *ha)
4574{
4575	ips_scb_t *scb;
4576	int  ret;
4577 	int  time;
4578	int  done;
4579	dma_addr_t command_dma;
4580
4581	/* Create a usuable SCB */
4582	scb = pci_alloc_consistent(ha->pcidev, sizeof(ips_scb_t), &command_dma);
 
4583	if (scb) {
4584	    memset(scb, 0, sizeof(ips_scb_t));
4585	    ips_init_scb(ha, scb);
4586	    scb->scb_busaddr = command_dma;
4587
4588	    scb->timeout = ips_cmd_timeout;
4589	    scb->cdb[0] = IPS_CMD_FLUSH;
4590
4591	    scb->cmd.flush_cache.op_code = IPS_CMD_FLUSH;
4592	    scb->cmd.flush_cache.command_id = IPS_MAX_CMDS;   /* Use an ID that would otherwise not exist */
4593	    scb->cmd.flush_cache.state = IPS_NORM_STATE;
4594	    scb->cmd.flush_cache.reserved = 0;
4595	    scb->cmd.flush_cache.reserved2 = 0;
4596	    scb->cmd.flush_cache.reserved3 = 0;
4597	    scb->cmd.flush_cache.reserved4 = 0;
4598
4599	    ret = ips_send_cmd(ha, scb);                      /* Send the Flush Command */
4600
4601	    if (ret == IPS_SUCCESS) {
4602	        time = 60 * IPS_ONE_SEC;	              /* Max Wait time is 60 seconds */
4603	        done = 0;
4604
4605	        while ((time > 0) && (!done)) {
4606		   done = ips_poll_for_flush_complete(ha);
4607	           /* This may look evil, but it's only done during extremely rare start-up conditions ! */
4608	           udelay(1000);
4609	           time--;
4610	        }
4611        }
4612	}
4613
4614	/* Now RESET and INIT the adapter */
4615	(*ha->func.reset) (ha);
4616
4617	pci_free_consistent(ha->pcidev, sizeof(ips_scb_t), scb, command_dma);
4618	return;
4619}
4620
4621/****************************************************************************/
4622/*                                                                          */
4623/* Routine Name: ips_poll_for_flush_complete                                */
4624/*                                                                          */
4625/* Routine Description:                                                     */
4626/*                                                                          */
4627/*   Poll for the Flush Command issued by ips_flush_and_reset() to complete */
4628/*   All other responses are just taken off the queue and ignored           */
4629/*                                                                          */
4630/****************************************************************************/
4631static int
4632ips_poll_for_flush_complete(ips_ha_t * ha)
4633{
4634	IPS_STATUS cstatus;
4635
4636	while (TRUE) {
4637	    cstatus.value = (*ha->func.statupd) (ha);
4638
4639	    if (cstatus.value == 0xffffffff)      /* If No Interrupt to process */
4640			break;
4641
4642	    /* Success is when we see the Flush Command ID */
4643	    if (cstatus.fields.command_id == IPS_MAX_CMDS)
4644	        return 1;
4645	 }
4646
4647	return 0;
4648}
4649
4650/****************************************************************************/
4651/*                                                                          */
4652/* Routine Name: ips_enable_int_copperhead                                  */
4653/*                                                                          */
4654/* Routine Description:                                                     */
4655/*   Turn on interrupts                                                     */
4656/*                                                                          */
4657/****************************************************************************/
4658static void
4659ips_enable_int_copperhead(ips_ha_t * ha)
4660{
4661	METHOD_TRACE("ips_enable_int_copperhead", 1);
4662
4663	outb(ha->io_addr + IPS_REG_HISR, IPS_BIT_EI);
4664	inb(ha->io_addr + IPS_REG_HISR);	/*Ensure PCI Posting Completes*/
4665}
4666
4667/****************************************************************************/
4668/*                                                                          */
4669/* Routine Name: ips_enable_int_copperhead_memio                            */
4670/*                                                                          */
4671/* Routine Description:                                                     */
4672/*   Turn on interrupts                                                     */
4673/*                                                                          */
4674/****************************************************************************/
4675static void
4676ips_enable_int_copperhead_memio(ips_ha_t * ha)
4677{
4678	METHOD_TRACE("ips_enable_int_copperhead_memio", 1);
4679
4680	writeb(IPS_BIT_EI, ha->mem_ptr + IPS_REG_HISR);
4681	readb(ha->mem_ptr + IPS_REG_HISR);	/*Ensure PCI Posting Completes*/
4682}
4683
4684/****************************************************************************/
4685/*                                                                          */
4686/* Routine Name: ips_enable_int_morpheus                                    */
4687/*                                                                          */
4688/* Routine Description:                                                     */
4689/*   Turn on interrupts                                                     */
4690/*                                                                          */
4691/****************************************************************************/
4692static void
4693ips_enable_int_morpheus(ips_ha_t * ha)
4694{
4695	uint32_t Oimr;
4696
4697	METHOD_TRACE("ips_enable_int_morpheus", 1);
4698
4699	Oimr = readl(ha->mem_ptr + IPS_REG_I960_OIMR);
4700	Oimr &= ~0x08;
4701	writel(Oimr, ha->mem_ptr + IPS_REG_I960_OIMR);
4702	readl(ha->mem_ptr + IPS_REG_I960_OIMR);	/*Ensure PCI Posting Completes*/
4703}
4704
4705/****************************************************************************/
4706/*                                                                          */
4707/* Routine Name: ips_init_copperhead                                        */
4708/*                                                                          */
4709/* Routine Description:                                                     */
4710/*                                                                          */
4711/*   Initialize a copperhead controller                                     */
4712/*                                                                          */
4713/****************************************************************************/
4714static int
4715ips_init_copperhead(ips_ha_t * ha)
4716{
4717	uint8_t Isr;
4718	uint8_t Cbsp;
4719	uint8_t PostByte[IPS_MAX_POST_BYTES];
4720	uint8_t ConfigByte[IPS_MAX_CONFIG_BYTES];
4721	int i, j;
4722
4723	METHOD_TRACE("ips_init_copperhead", 1);
4724
4725	for (i = 0; i < IPS_MAX_POST_BYTES; i++) {
4726		for (j = 0; j < 45; j++) {
4727			Isr = inb(ha->io_addr + IPS_REG_HISR);
4728			if (Isr & IPS_BIT_GHI)
4729				break;
4730
4731			/* Delay for 1 Second */
4732			MDELAY(IPS_ONE_SEC);
4733		}
4734
4735		if (j >= 45)
4736			/* error occurred */
4737			return (0);
4738
4739		PostByte[i] = inb(ha->io_addr + IPS_REG_ISPR);
4740		outb(Isr, ha->io_addr + IPS_REG_HISR);
4741	}
4742
4743	if (PostByte[0] < IPS_GOOD_POST_STATUS) {
4744		IPS_PRINTK(KERN_WARNING, ha->pcidev,
4745			   "reset controller fails (post status %x %x).\n",
4746			   PostByte[0], PostByte[1]);
4747
4748		return (0);
4749	}
4750
4751	for (i = 0; i < IPS_MAX_CONFIG_BYTES; i++) {
4752		for (j = 0; j < 240; j++) {
4753			Isr = inb(ha->io_addr + IPS_REG_HISR);
4754			if (Isr & IPS_BIT_GHI)
4755				break;
4756
4757			/* Delay for 1 Second */
4758			MDELAY(IPS_ONE_SEC);
4759		}
4760
4761		if (j >= 240)
4762			/* error occurred */
4763			return (0);
4764
4765		ConfigByte[i] = inb(ha->io_addr + IPS_REG_ISPR);
4766		outb(Isr, ha->io_addr + IPS_REG_HISR);
4767	}
4768
4769	for (i = 0; i < 240; i++) {
4770		Cbsp = inb(ha->io_addr + IPS_REG_CBSP);
4771
4772		if ((Cbsp & IPS_BIT_OP) == 0)
4773			break;
4774
4775		/* Delay for 1 Second */
4776		MDELAY(IPS_ONE_SEC);
4777	}
4778
4779	if (i >= 240)
4780		/* reset failed */
4781		return (0);
4782
4783	/* setup CCCR */
4784	outl(0x1010, ha->io_addr + IPS_REG_CCCR);
4785
4786	/* Enable busmastering */
4787	outb(IPS_BIT_EBM, ha->io_addr + IPS_REG_SCPR);
4788
4789	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
4790		/* fix for anaconda64 */
4791		outl(0, ha->io_addr + IPS_REG_NDAE);
4792
4793	/* Enable interrupts */
4794	outb(IPS_BIT_EI, ha->io_addr + IPS_REG_HISR);
4795
4796	return (1);
4797}
4798
4799/****************************************************************************/
4800/*                                                                          */
4801/* Routine Name: ips_init_copperhead_memio                                  */
4802/*                                                                          */
4803/* Routine Description:                                                     */
4804/*                                                                          */
4805/*   Initialize a copperhead controller with memory mapped I/O              */
4806/*                                                                          */
4807/****************************************************************************/
4808static int
4809ips_init_copperhead_memio(ips_ha_t * ha)
4810{
4811	uint8_t Isr = 0;
4812	uint8_t Cbsp;
4813	uint8_t PostByte[IPS_MAX_POST_BYTES];
4814	uint8_t ConfigByte[IPS_MAX_CONFIG_BYTES];
4815	int i, j;
4816
4817	METHOD_TRACE("ips_init_copperhead_memio", 1);
4818
4819	for (i = 0; i < IPS_MAX_POST_BYTES; i++) {
4820		for (j = 0; j < 45; j++) {
4821			Isr = readb(ha->mem_ptr + IPS_REG_HISR);
4822			if (Isr & IPS_BIT_GHI)
4823				break;
4824
4825			/* Delay for 1 Second */
4826			MDELAY(IPS_ONE_SEC);
4827		}
4828
4829		if (j >= 45)
4830			/* error occurred */
4831			return (0);
4832
4833		PostByte[i] = readb(ha->mem_ptr + IPS_REG_ISPR);
4834		writeb(Isr, ha->mem_ptr + IPS_REG_HISR);
4835	}
4836
4837	if (PostByte[0] < IPS_GOOD_POST_STATUS) {
4838		IPS_PRINTK(KERN_WARNING, ha->pcidev,
4839			   "reset controller fails (post status %x %x).\n",
4840			   PostByte[0], PostByte[1]);
4841
4842		return (0);
4843	}
4844
4845	for (i = 0; i < IPS_MAX_CONFIG_BYTES; i++) {
4846		for (j = 0; j < 240; j++) {
4847			Isr = readb(ha->mem_ptr + IPS_REG_HISR);
4848			if (Isr & IPS_BIT_GHI)
4849				break;
4850
4851			/* Delay for 1 Second */
4852			MDELAY(IPS_ONE_SEC);
4853		}
4854
4855		if (j >= 240)
4856			/* error occurred */
4857			return (0);
4858
4859		ConfigByte[i] = readb(ha->mem_ptr + IPS_REG_ISPR);
4860		writeb(Isr, ha->mem_ptr + IPS_REG_HISR);
4861	}
4862
4863	for (i = 0; i < 240; i++) {
4864		Cbsp = readb(ha->mem_ptr + IPS_REG_CBSP);
4865
4866		if ((Cbsp & IPS_BIT_OP) == 0)
4867			break;
4868
4869		/* Delay for 1 Second */
4870		MDELAY(IPS_ONE_SEC);
4871	}
4872
4873	if (i >= 240)
4874		/* error occurred */
4875		return (0);
4876
4877	/* setup CCCR */
4878	writel(0x1010, ha->mem_ptr + IPS_REG_CCCR);
4879
4880	/* Enable busmastering */
4881	writeb(IPS_BIT_EBM, ha->mem_ptr + IPS_REG_SCPR);
4882
4883	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
4884		/* fix for anaconda64 */
4885		writel(0, ha->mem_ptr + IPS_REG_NDAE);
4886
4887	/* Enable interrupts */
4888	writeb(IPS_BIT_EI, ha->mem_ptr + IPS_REG_HISR);
4889
4890	/* if we get here then everything went OK */
4891	return (1);
4892}
4893
4894/****************************************************************************/
4895/*                                                                          */
4896/* Routine Name: ips_init_morpheus                                          */
4897/*                                                                          */
4898/* Routine Description:                                                     */
4899/*                                                                          */
4900/*   Initialize a morpheus controller                                       */
4901/*                                                                          */
4902/****************************************************************************/
4903static int
4904ips_init_morpheus(ips_ha_t * ha)
4905{
4906	uint32_t Post;
4907	uint32_t Config;
4908	uint32_t Isr;
4909	uint32_t Oimr;
4910	int i;
4911
4912	METHOD_TRACE("ips_init_morpheus", 1);
4913
4914	/* Wait up to 45 secs for Post */
4915	for (i = 0; i < 45; i++) {
4916		Isr = readl(ha->mem_ptr + IPS_REG_I2O_HIR);
4917
4918		if (Isr & IPS_BIT_I960_MSG0I)
4919			break;
4920
4921		/* Delay for 1 Second */
4922		MDELAY(IPS_ONE_SEC);
4923	}
4924
4925	if (i >= 45) {
4926		/* error occurred */
4927		IPS_PRINTK(KERN_WARNING, ha->pcidev,
4928			   "timeout waiting for post.\n");
4929
4930		return (0);
4931	}
4932
4933	Post = readl(ha->mem_ptr + IPS_REG_I960_MSG0);
4934
4935	if (Post == 0x4F00) {	/* If Flashing the Battery PIC         */
4936		IPS_PRINTK(KERN_WARNING, ha->pcidev,
4937			   "Flashing Battery PIC, Please wait ...\n");
4938
4939		/* Clear the interrupt bit */
4940		Isr = (uint32_t) IPS_BIT_I960_MSG0I;
4941		writel(Isr, ha->mem_ptr + IPS_REG_I2O_HIR);
4942
4943		for (i = 0; i < 120; i++) {	/*    Wait Up to 2 Min. for Completion */
4944			Post = readl(ha->mem_ptr + IPS_REG_I960_MSG0);
4945			if (Post != 0x4F00)
4946				break;
4947			/* Delay for 1 Second */
4948			MDELAY(IPS_ONE_SEC);
4949		}
4950
4951		if (i >= 120) {
4952			IPS_PRINTK(KERN_WARNING, ha->pcidev,
4953				   "timeout waiting for Battery PIC Flash\n");
4954			return (0);
4955		}
4956
4957	}
4958
4959	/* Clear the interrupt bit */
4960	Isr = (uint32_t) IPS_BIT_I960_MSG0I;
4961	writel(Isr, ha->mem_ptr + IPS_REG_I2O_HIR);
4962
4963	if (Post < (IPS_GOOD_POST_STATUS << 8)) {
4964		IPS_PRINTK(KERN_WARNING, ha->pcidev,
4965			   "reset controller fails (post status %x).\n", Post);
4966
4967		return (0);
4968	}
4969
4970	/* Wait up to 240 secs for config bytes */
4971	for (i = 0; i < 240; i++) {
4972		Isr = readl(ha->mem_ptr + IPS_REG_I2O_HIR);
4973
4974		if (Isr & IPS_BIT_I960_MSG1I)
4975			break;
4976
4977		/* Delay for 1 Second */
4978		MDELAY(IPS_ONE_SEC);
4979	}
4980
4981	if (i >= 240) {
4982		/* error occurred */
4983		IPS_PRINTK(KERN_WARNING, ha->pcidev,
4984			   "timeout waiting for config.\n");
4985
4986		return (0);
4987	}
4988
4989	Config = readl(ha->mem_ptr + IPS_REG_I960_MSG1);
4990
4991	/* Clear interrupt bit */
4992	Isr = (uint32_t) IPS_BIT_I960_MSG1I;
4993	writel(Isr, ha->mem_ptr + IPS_REG_I2O_HIR);
4994
4995	/* Turn on the interrupts */
4996	Oimr = readl(ha->mem_ptr + IPS_REG_I960_OIMR);
4997	Oimr &= ~0x8;
4998	writel(Oimr, ha->mem_ptr + IPS_REG_I960_OIMR);
4999
5000	/* if we get here then everything went OK */
5001
5002	/* Since we did a RESET, an EraseStripeLock may be needed */
5003	if (Post == 0xEF10) {
5004		if ((Config == 0x000F) || (Config == 0x0009))
5005			ha->requires_esl = 1;
5006	}
5007
5008	return (1);
5009}
5010
5011/****************************************************************************/
5012/*                                                                          */
5013/* Routine Name: ips_reset_copperhead                                       */
5014/*                                                                          */
5015/* Routine Description:                                                     */
5016/*                                                                          */
5017/*   Reset the controller                                                   */
5018/*                                                                          */
5019/****************************************************************************/
5020static int
5021ips_reset_copperhead(ips_ha_t * ha)
5022{
5023	int reset_counter;
5024
5025	METHOD_TRACE("ips_reset_copperhead", 1);
5026
5027	DEBUG_VAR(1, "(%s%d) ips_reset_copperhead: io addr: %x, irq: %d",
5028		  ips_name, ha->host_num, ha->io_addr, ha->pcidev->irq);
5029
5030	reset_counter = 0;
5031
5032	while (reset_counter < 2) {
5033		reset_counter++;
5034
5035		outb(IPS_BIT_RST, ha->io_addr + IPS_REG_SCPR);
5036
5037		/* Delay for 1 Second */
5038		MDELAY(IPS_ONE_SEC);
5039
5040		outb(0, ha->io_addr + IPS_REG_SCPR);
5041
5042		/* Delay for 1 Second */
5043		MDELAY(IPS_ONE_SEC);
5044
5045		if ((*ha->func.init) (ha))
5046			break;
5047		else if (reset_counter >= 2) {
5048
5049			return (0);
5050		}
5051	}
5052
5053	return (1);
5054}
5055
5056/****************************************************************************/
5057/*                                                                          */
5058/* Routine Name: ips_reset_copperhead_memio                                 */
5059/*                                                                          */
5060/* Routine Description:                                                     */
5061/*                                                                          */
5062/*   Reset the controller                                                   */
5063/*                                                                          */
5064/****************************************************************************/
5065static int
5066ips_reset_copperhead_memio(ips_ha_t * ha)
5067{
5068	int reset_counter;
5069
5070	METHOD_TRACE("ips_reset_copperhead_memio", 1);
5071
5072	DEBUG_VAR(1, "(%s%d) ips_reset_copperhead_memio: mem addr: %x, irq: %d",
5073		  ips_name, ha->host_num, ha->mem_addr, ha->pcidev->irq);
5074
5075	reset_counter = 0;
5076
5077	while (reset_counter < 2) {
5078		reset_counter++;
5079
5080		writeb(IPS_BIT_RST, ha->mem_ptr + IPS_REG_SCPR);
5081
5082		/* Delay for 1 Second */
5083		MDELAY(IPS_ONE_SEC);
5084
5085		writeb(0, ha->mem_ptr + IPS_REG_SCPR);
5086
5087		/* Delay for 1 Second */
5088		MDELAY(IPS_ONE_SEC);
5089
5090		if ((*ha->func.init) (ha))
5091			break;
5092		else if (reset_counter >= 2) {
5093
5094			return (0);
5095		}
5096	}
5097
5098	return (1);
5099}
5100
5101/****************************************************************************/
5102/*                                                                          */
5103/* Routine Name: ips_reset_morpheus                                         */
5104/*                                                                          */
5105/* Routine Description:                                                     */
5106/*                                                                          */
5107/*   Reset the controller                                                   */
5108/*                                                                          */
5109/****************************************************************************/
5110static int
5111ips_reset_morpheus(ips_ha_t * ha)
5112{
5113	int reset_counter;
5114	uint8_t junk;
5115
5116	METHOD_TRACE("ips_reset_morpheus", 1);
5117
5118	DEBUG_VAR(1, "(%s%d) ips_reset_morpheus: mem addr: %x, irq: %d",
5119		  ips_name, ha->host_num, ha->mem_addr, ha->pcidev->irq);
5120
5121	reset_counter = 0;
5122
5123	while (reset_counter < 2) {
5124		reset_counter++;
5125
5126		writel(0x80000000, ha->mem_ptr + IPS_REG_I960_IDR);
5127
5128		/* Delay for 5 Seconds */
5129		MDELAY(5 * IPS_ONE_SEC);
5130
5131		/* Do a PCI config read to wait for adapter */
5132		pci_read_config_byte(ha->pcidev, 4, &junk);
5133
5134		if ((*ha->func.init) (ha))
5135			break;
5136		else if (reset_counter >= 2) {
5137
5138			return (0);
5139		}
5140	}
5141
5142	return (1);
5143}
5144
5145/****************************************************************************/
5146/*                                                                          */
5147/* Routine Name: ips_statinit                                               */
5148/*                                                                          */
5149/* Routine Description:                                                     */
5150/*                                                                          */
5151/*   Initialize the status queues on the controller                         */
5152/*                                                                          */
5153/****************************************************************************/
5154static void
5155ips_statinit(ips_ha_t * ha)
5156{
5157	uint32_t phys_status_start;
5158
5159	METHOD_TRACE("ips_statinit", 1);
5160
5161	ha->adapt->p_status_start = ha->adapt->status;
5162	ha->adapt->p_status_end = ha->adapt->status + IPS_MAX_CMDS;
5163	ha->adapt->p_status_tail = ha->adapt->status;
5164
5165	phys_status_start = ha->adapt->hw_status_start;
5166	outl(phys_status_start, ha->io_addr + IPS_REG_SQSR);
5167	outl(phys_status_start + IPS_STATUS_Q_SIZE,
5168	     ha->io_addr + IPS_REG_SQER);
5169	outl(phys_status_start + IPS_STATUS_SIZE,
5170	     ha->io_addr + IPS_REG_SQHR);
5171	outl(phys_status_start, ha->io_addr + IPS_REG_SQTR);
5172
5173	ha->adapt->hw_status_tail = phys_status_start;
5174}
5175
5176/****************************************************************************/
5177/*                                                                          */
5178/* Routine Name: ips_statinit_memio                                         */
5179/*                                                                          */
5180/* Routine Description:                                                     */
5181/*                                                                          */
5182/*   Initialize the status queues on the controller                         */
5183/*                                                                          */
5184/****************************************************************************/
5185static void
5186ips_statinit_memio(ips_ha_t * ha)
5187{
5188	uint32_t phys_status_start;
5189
5190	METHOD_TRACE("ips_statinit_memio", 1);
5191
5192	ha->adapt->p_status_start = ha->adapt->status;
5193	ha->adapt->p_status_end = ha->adapt->status + IPS_MAX_CMDS;
5194	ha->adapt->p_status_tail = ha->adapt->status;
5195
5196	phys_status_start = ha->adapt->hw_status_start;
5197	writel(phys_status_start, ha->mem_ptr + IPS_REG_SQSR);
5198	writel(phys_status_start + IPS_STATUS_Q_SIZE,
5199	       ha->mem_ptr + IPS_REG_SQER);
5200	writel(phys_status_start + IPS_STATUS_SIZE, ha->mem_ptr + IPS_REG_SQHR);
5201	writel(phys_status_start, ha->mem_ptr + IPS_REG_SQTR);
5202
5203	ha->adapt->hw_status_tail = phys_status_start;
5204}
5205
5206/****************************************************************************/
5207/*                                                                          */
5208/* Routine Name: ips_statupd_copperhead                                     */
5209/*                                                                          */
5210/* Routine Description:                                                     */
5211/*                                                                          */
5212/*   Remove an element from the status queue                                */
5213/*                                                                          */
5214/****************************************************************************/
5215static uint32_t
5216ips_statupd_copperhead(ips_ha_t * ha)
5217{
5218	METHOD_TRACE("ips_statupd_copperhead", 1);
5219
5220	if (ha->adapt->p_status_tail != ha->adapt->p_status_end) {
5221		ha->adapt->p_status_tail++;
5222		ha->adapt->hw_status_tail += sizeof (IPS_STATUS);
5223	} else {
5224		ha->adapt->p_status_tail = ha->adapt->p_status_start;
5225		ha->adapt->hw_status_tail = ha->adapt->hw_status_start;
5226	}
5227
5228	outl(ha->adapt->hw_status_tail,
5229	     ha->io_addr + IPS_REG_SQTR);
5230
5231	return (ha->adapt->p_status_tail->value);
5232}
5233
5234/****************************************************************************/
5235/*                                                                          */
5236/* Routine Name: ips_statupd_copperhead_memio                               */
5237/*                                                                          */
5238/* Routine Description:                                                     */
5239/*                                                                          */
5240/*   Remove an element from the status queue                                */
5241/*                                                                          */
5242/****************************************************************************/
5243static uint32_t
5244ips_statupd_copperhead_memio(ips_ha_t * ha)
5245{
5246	METHOD_TRACE("ips_statupd_copperhead_memio", 1);
5247
5248	if (ha->adapt->p_status_tail != ha->adapt->p_status_end) {
5249		ha->adapt->p_status_tail++;
5250		ha->adapt->hw_status_tail += sizeof (IPS_STATUS);
5251	} else {
5252		ha->adapt->p_status_tail = ha->adapt->p_status_start;
5253		ha->adapt->hw_status_tail = ha->adapt->hw_status_start;
5254	}
5255
5256	writel(ha->adapt->hw_status_tail, ha->mem_ptr + IPS_REG_SQTR);
5257
5258	return (ha->adapt->p_status_tail->value);
5259}
5260
5261/****************************************************************************/
5262/*                                                                          */
5263/* Routine Name: ips_statupd_morpheus                                       */
5264/*                                                                          */
5265/* Routine Description:                                                     */
5266/*                                                                          */
5267/*   Remove an element from the status queue                                */
5268/*                                                                          */
5269/****************************************************************************/
5270static uint32_t
5271ips_statupd_morpheus(ips_ha_t * ha)
5272{
5273	uint32_t val;
5274
5275	METHOD_TRACE("ips_statupd_morpheus", 1);
5276
5277	val = readl(ha->mem_ptr + IPS_REG_I2O_OUTMSGQ);
5278
5279	return (val);
5280}
5281
5282/****************************************************************************/
5283/*                                                                          */
5284/* Routine Name: ips_issue_copperhead                                       */
5285/*                                                                          */
5286/* Routine Description:                                                     */
5287/*                                                                          */
5288/*   Send a command down to the controller                                  */
5289/*                                                                          */
5290/****************************************************************************/
5291static int
5292ips_issue_copperhead(ips_ha_t * ha, ips_scb_t * scb)
5293{
5294	uint32_t TimeOut;
5295	uint32_t val;
5296
5297	METHOD_TRACE("ips_issue_copperhead", 1);
5298
5299	if (scb->scsi_cmd) {
5300		DEBUG_VAR(2, "(%s%d) ips_issue: cmd 0x%X id %d (%d %d %d)",
5301			  ips_name,
5302			  ha->host_num,
5303			  scb->cdb[0],
5304			  scb->cmd.basic_io.command_id,
5305			  scb->bus, scb->target_id, scb->lun);
5306	} else {
5307		DEBUG_VAR(2, KERN_NOTICE "(%s%d) ips_issue: logical cmd id %d",
5308			  ips_name, ha->host_num, scb->cmd.basic_io.command_id);
5309	}
5310
5311	TimeOut = 0;
5312
5313	while ((val =
5314		le32_to_cpu(inl(ha->io_addr + IPS_REG_CCCR))) & IPS_BIT_SEM) {
5315		udelay(1000);
5316
5317		if (++TimeOut >= IPS_SEM_TIMEOUT) {
5318			if (!(val & IPS_BIT_START_STOP))
5319				break;
5320
5321			IPS_PRINTK(KERN_WARNING, ha->pcidev,
5322				   "ips_issue val [0x%x].\n", val);
5323			IPS_PRINTK(KERN_WARNING, ha->pcidev,
5324				   "ips_issue semaphore chk timeout.\n");
5325
5326			return (IPS_FAILURE);
5327		}		/* end if */
5328	}			/* end while */
5329
5330	outl(scb->scb_busaddr, ha->io_addr + IPS_REG_CCSAR);
5331	outw(IPS_BIT_START_CMD, ha->io_addr + IPS_REG_CCCR);
5332
5333	return (IPS_SUCCESS);
5334}
5335
5336/****************************************************************************/
5337/*                                                                          */
5338/* Routine Name: ips_issue_copperhead_memio                                 */
5339/*                                                                          */
5340/* Routine Description:                                                     */
5341/*                                                                          */
5342/*   Send a command down to the controller                                  */
5343/*                                                                          */
5344/****************************************************************************/
5345static int
5346ips_issue_copperhead_memio(ips_ha_t * ha, ips_scb_t * scb)
5347{
5348	uint32_t TimeOut;
5349	uint32_t val;
5350
5351	METHOD_TRACE("ips_issue_copperhead_memio", 1);
5352
5353	if (scb->scsi_cmd) {
5354		DEBUG_VAR(2, "(%s%d) ips_issue: cmd 0x%X id %d (%d %d %d)",
5355			  ips_name,
5356			  ha->host_num,
5357			  scb->cdb[0],
5358			  scb->cmd.basic_io.command_id,
5359			  scb->bus, scb->target_id, scb->lun);
5360	} else {
5361		DEBUG_VAR(2, "(%s%d) ips_issue: logical cmd id %d",
5362			  ips_name, ha->host_num, scb->cmd.basic_io.command_id);
5363	}
5364
5365	TimeOut = 0;
5366
5367	while ((val = readl(ha->mem_ptr + IPS_REG_CCCR)) & IPS_BIT_SEM) {
5368		udelay(1000);
5369
5370		if (++TimeOut >= IPS_SEM_TIMEOUT) {
5371			if (!(val & IPS_BIT_START_STOP))
5372				break;
5373
5374			IPS_PRINTK(KERN_WARNING, ha->pcidev,
5375				   "ips_issue val [0x%x].\n", val);
5376			IPS_PRINTK(KERN_WARNING, ha->pcidev,
5377				   "ips_issue semaphore chk timeout.\n");
5378
5379			return (IPS_FAILURE);
5380		}		/* end if */
5381	}			/* end while */
5382
5383	writel(scb->scb_busaddr, ha->mem_ptr + IPS_REG_CCSAR);
5384	writel(IPS_BIT_START_CMD, ha->mem_ptr + IPS_REG_CCCR);
5385
5386	return (IPS_SUCCESS);
5387}
5388
5389/****************************************************************************/
5390/*                                                                          */
5391/* Routine Name: ips_issue_i2o                                              */
5392/*                                                                          */
5393/* Routine Description:                                                     */
5394/*                                                                          */
5395/*   Send a command down to the controller                                  */
5396/*                                                                          */
5397/****************************************************************************/
5398static int
5399ips_issue_i2o(ips_ha_t * ha, ips_scb_t * scb)
5400{
5401
5402	METHOD_TRACE("ips_issue_i2o", 1);
5403
5404	if (scb->scsi_cmd) {
5405		DEBUG_VAR(2, "(%s%d) ips_issue: cmd 0x%X id %d (%d %d %d)",
5406			  ips_name,
5407			  ha->host_num,
5408			  scb->cdb[0],
5409			  scb->cmd.basic_io.command_id,
5410			  scb->bus, scb->target_id, scb->lun);
5411	} else {
5412		DEBUG_VAR(2, "(%s%d) ips_issue: logical cmd id %d",
5413			  ips_name, ha->host_num, scb->cmd.basic_io.command_id);
5414	}
5415
5416	outl(scb->scb_busaddr, ha->io_addr + IPS_REG_I2O_INMSGQ);
5417
5418	return (IPS_SUCCESS);
5419}
5420
5421/****************************************************************************/
5422/*                                                                          */
5423/* Routine Name: ips_issue_i2o_memio                                        */
5424/*                                                                          */
5425/* Routine Description:                                                     */
5426/*                                                                          */
5427/*   Send a command down to the controller                                  */
5428/*                                                                          */
5429/****************************************************************************/
5430static int
5431ips_issue_i2o_memio(ips_ha_t * ha, ips_scb_t * scb)
5432{
5433
5434	METHOD_TRACE("ips_issue_i2o_memio", 1);
5435
5436	if (scb->scsi_cmd) {
5437		DEBUG_VAR(2, "(%s%d) ips_issue: cmd 0x%X id %d (%d %d %d)",
5438			  ips_name,
5439			  ha->host_num,
5440			  scb->cdb[0],
5441			  scb->cmd.basic_io.command_id,
5442			  scb->bus, scb->target_id, scb->lun);
5443	} else {
5444		DEBUG_VAR(2, "(%s%d) ips_issue: logical cmd id %d",
5445			  ips_name, ha->host_num, scb->cmd.basic_io.command_id);
5446	}
5447
5448	writel(scb->scb_busaddr, ha->mem_ptr + IPS_REG_I2O_INMSGQ);
5449
5450	return (IPS_SUCCESS);
5451}
5452
5453/****************************************************************************/
5454/*                                                                          */
5455/* Routine Name: ips_isintr_copperhead                                      */
5456/*                                                                          */
5457/* Routine Description:                                                     */
5458/*                                                                          */
5459/*   Test to see if an interrupt is for us                                  */
5460/*                                                                          */
5461/****************************************************************************/
5462static int
5463ips_isintr_copperhead(ips_ha_t * ha)
5464{
5465	uint8_t Isr;
5466
5467	METHOD_TRACE("ips_isintr_copperhead", 2);
5468
5469	Isr = inb(ha->io_addr + IPS_REG_HISR);
5470
5471	if (Isr == 0xFF)
5472		/* ?!?! Nothing really there */
5473		return (0);
5474
5475	if (Isr & IPS_BIT_SCE)
5476		return (1);
5477	else if (Isr & (IPS_BIT_SQO | IPS_BIT_GHI)) {
5478		/* status queue overflow or GHI */
5479		/* just clear the interrupt */
5480		outb(Isr, ha->io_addr + IPS_REG_HISR);
5481	}
5482
5483	return (0);
5484}
5485
5486/****************************************************************************/
5487/*                                                                          */
5488/* Routine Name: ips_isintr_copperhead_memio                                */
5489/*                                                                          */
5490/* Routine Description:                                                     */
5491/*                                                                          */
5492/*   Test to see if an interrupt is for us                                  */
5493/*                                                                          */
5494/****************************************************************************/
5495static int
5496ips_isintr_copperhead_memio(ips_ha_t * ha)
5497{
5498	uint8_t Isr;
5499
5500	METHOD_TRACE("ips_isintr_memio", 2);
5501
5502	Isr = readb(ha->mem_ptr + IPS_REG_HISR);
5503
5504	if (Isr == 0xFF)
5505		/* ?!?! Nothing really there */
5506		return (0);
5507
5508	if (Isr & IPS_BIT_SCE)
5509		return (1);
5510	else if (Isr & (IPS_BIT_SQO | IPS_BIT_GHI)) {
5511		/* status queue overflow or GHI */
5512		/* just clear the interrupt */
5513		writeb(Isr, ha->mem_ptr + IPS_REG_HISR);
5514	}
5515
5516	return (0);
5517}
5518
5519/****************************************************************************/
5520/*                                                                          */
5521/* Routine Name: ips_isintr_morpheus                                        */
5522/*                                                                          */
5523/* Routine Description:                                                     */
5524/*                                                                          */
5525/*   Test to see if an interrupt is for us                                  */
5526/*                                                                          */
5527/****************************************************************************/
5528static int
5529ips_isintr_morpheus(ips_ha_t * ha)
5530{
5531	uint32_t Isr;
5532
5533	METHOD_TRACE("ips_isintr_morpheus", 2);
5534
5535	Isr = readl(ha->mem_ptr + IPS_REG_I2O_HIR);
5536
5537	if (Isr & IPS_BIT_I2O_OPQI)
5538		return (1);
5539	else
5540		return (0);
5541}
5542
5543/****************************************************************************/
5544/*                                                                          */
5545/* Routine Name: ips_wait                                                   */
5546/*                                                                          */
5547/* Routine Description:                                                     */
5548/*                                                                          */
5549/*   Wait for a command to complete                                         */
5550/*                                                                          */
5551/****************************************************************************/
5552static int
5553ips_wait(ips_ha_t * ha, int time, int intr)
5554{
5555	int ret;
5556	int done;
5557
5558	METHOD_TRACE("ips_wait", 1);
5559
5560	ret = IPS_FAILURE;
5561	done = FALSE;
5562
5563	time *= IPS_ONE_SEC;	/* convert seconds */
5564
5565	while ((time > 0) && (!done)) {
5566		if (intr == IPS_INTR_ON) {
5567			if (ha->waitflag == FALSE) {
5568				ret = IPS_SUCCESS;
5569				done = TRUE;
5570				break;
5571			}
5572		} else if (intr == IPS_INTR_IORL) {
5573			if (ha->waitflag == FALSE) {
5574				/*
5575				 * controller generated an interrupt to
5576				 * acknowledge completion of the command
5577				 * and ips_intr() has serviced the interrupt.
5578				 */
5579				ret = IPS_SUCCESS;
5580				done = TRUE;
5581				break;
5582			}
5583
5584			/*
5585			 * NOTE: we already have the io_request_lock so
5586			 * even if we get an interrupt it won't get serviced
5587			 * until after we finish.
5588			 */
5589
5590			(*ha->func.intr) (ha);
5591		}
5592
5593		/* This looks like a very evil loop, but it only does this during start-up */
5594		udelay(1000);
5595		time--;
5596	}
5597
5598	return (ret);
5599}
5600
5601/****************************************************************************/
5602/*                                                                          */
5603/* Routine Name: ips_write_driver_status                                    */
5604/*                                                                          */
5605/* Routine Description:                                                     */
5606/*                                                                          */
5607/*   Write OS/Driver version to Page 5 of the nvram on the controller       */
5608/*                                                                          */
5609/****************************************************************************/
5610static int
5611ips_write_driver_status(ips_ha_t * ha, int intr)
5612{
5613	METHOD_TRACE("ips_write_driver_status", 1);
5614
5615	if (!ips_readwrite_page5(ha, FALSE, intr)) {
5616		IPS_PRINTK(KERN_WARNING, ha->pcidev,
5617			   "unable to read NVRAM page 5.\n");
5618
5619		return (0);
5620	}
5621
5622	/* check to make sure the page has a valid */
5623	/* signature */
5624	if (le32_to_cpu(ha->nvram->signature) != IPS_NVRAM_P5_SIG) {
5625		DEBUG_VAR(1,
5626			  "(%s%d) NVRAM page 5 has an invalid signature: %X.",
5627			  ips_name, ha->host_num, ha->nvram->signature);
5628		ha->nvram->signature = IPS_NVRAM_P5_SIG;
5629	}
5630
5631	DEBUG_VAR(2,
5632		  "(%s%d) Ad Type: %d, Ad Slot: %d, BIOS: %c%c%c%c %c%c%c%c.",
5633		  ips_name, ha->host_num, le16_to_cpu(ha->nvram->adapter_type),
5634		  ha->nvram->adapter_slot, ha->nvram->bios_high[0],
5635		  ha->nvram->bios_high[1], ha->nvram->bios_high[2],
5636		  ha->nvram->bios_high[3], ha->nvram->bios_low[0],
5637		  ha->nvram->bios_low[1], ha->nvram->bios_low[2],
5638		  ha->nvram->bios_low[3]);
5639
5640	ips_get_bios_version(ha, intr);
5641
5642	/* change values (as needed) */
5643	ha->nvram->operating_system = IPS_OS_LINUX;
5644	ha->nvram->adapter_type = ha->ad_type;
5645	strncpy((char *) ha->nvram->driver_high, IPS_VERSION_HIGH, 4);
5646	strncpy((char *) ha->nvram->driver_low, IPS_VERSION_LOW, 4);
5647	strncpy((char *) ha->nvram->bios_high, ha->bios_version, 4);
5648	strncpy((char *) ha->nvram->bios_low, ha->bios_version + 4, 4);
5649
5650	ha->nvram->versioning = 0;	/* Indicate the Driver Does Not Support Versioning */
5651
5652	/* now update the page */
5653	if (!ips_readwrite_page5(ha, TRUE, intr)) {
5654		IPS_PRINTK(KERN_WARNING, ha->pcidev,
5655			   "unable to write NVRAM page 5.\n");
5656
5657		return (0);
5658	}
5659
5660	/* IF NVRAM Page 5 is OK, Use it for Slot Number Info Because Linux Doesn't Do Slots */
5661	ha->slot_num = ha->nvram->adapter_slot;
5662
5663	return (1);
5664}
5665
5666/****************************************************************************/
5667/*                                                                          */
5668/* Routine Name: ips_read_adapter_status                                    */
5669/*                                                                          */
5670/* Routine Description:                                                     */
5671/*                                                                          */
5672/*   Do an Inquiry command to the adapter                                   */
5673/*                                                                          */
5674/****************************************************************************/
5675static int
5676ips_read_adapter_status(ips_ha_t * ha, int intr)
5677{
5678	ips_scb_t *scb;
5679	int ret;
5680
5681	METHOD_TRACE("ips_read_adapter_status", 1);
5682
5683	scb = &ha->scbs[ha->max_cmds - 1];
5684
5685	ips_init_scb(ha, scb);
5686
5687	scb->timeout = ips_cmd_timeout;
5688	scb->cdb[0] = IPS_CMD_ENQUIRY;
5689
5690	scb->cmd.basic_io.op_code = IPS_CMD_ENQUIRY;
5691	scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
5692	scb->cmd.basic_io.sg_count = 0;
5693	scb->cmd.basic_io.lba = 0;
5694	scb->cmd.basic_io.sector_count = 0;
5695	scb->cmd.basic_io.log_drv = 0;
5696	scb->data_len = sizeof (*ha->enq);
5697	scb->cmd.basic_io.sg_addr = ha->enq_busaddr;
5698
5699	/* send command */
5700	if (((ret =
5701	      ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE)
5702	    || (ret == IPS_SUCCESS_IMM)
5703	    || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1))
5704		return (0);
5705
5706	return (1);
5707}
5708
5709/****************************************************************************/
5710/*                                                                          */
5711/* Routine Name: ips_read_subsystem_parameters                              */
5712/*                                                                          */
5713/* Routine Description:                                                     */
5714/*                                                                          */
5715/*   Read subsystem parameters from the adapter                             */
5716/*                                                                          */
5717/****************************************************************************/
5718static int
5719ips_read_subsystem_parameters(ips_ha_t * ha, int intr)
5720{
5721	ips_scb_t *scb;
5722	int ret;
5723
5724	METHOD_TRACE("ips_read_subsystem_parameters", 1);
5725
5726	scb = &ha->scbs[ha->max_cmds - 1];
5727
5728	ips_init_scb(ha, scb);
5729
5730	scb->timeout = ips_cmd_timeout;
5731	scb->cdb[0] = IPS_CMD_GET_SUBSYS;
5732
5733	scb->cmd.basic_io.op_code = IPS_CMD_GET_SUBSYS;
5734	scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
5735	scb->cmd.basic_io.sg_count = 0;
5736	scb->cmd.basic_io.lba = 0;
5737	scb->cmd.basic_io.sector_count = 0;
5738	scb->cmd.basic_io.log_drv = 0;
5739	scb->data_len = sizeof (*ha->subsys);
5740	scb->cmd.basic_io.sg_addr = ha->ioctl_busaddr;
5741
5742	/* send command */
5743	if (((ret =
5744	      ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE)
5745	    || (ret == IPS_SUCCESS_IMM)
5746	    || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1))
5747		return (0);
5748
5749	memcpy(ha->subsys, ha->ioctl_data, sizeof(*ha->subsys));
5750	return (1);
5751}
5752
5753/****************************************************************************/
5754/*                                                                          */
5755/* Routine Name: ips_read_config                                            */
5756/*                                                                          */
5757/* Routine Description:                                                     */
5758/*                                                                          */
5759/*   Read the configuration on the adapter                                  */
5760/*                                                                          */
5761/****************************************************************************/
5762static int
5763ips_read_config(ips_ha_t * ha, int intr)
5764{
5765	ips_scb_t *scb;
5766	int i;
5767	int ret;
5768
5769	METHOD_TRACE("ips_read_config", 1);
5770
5771	/* set defaults for initiator IDs */
5772	for (i = 0; i < 4; i++)
5773		ha->conf->init_id[i] = 7;
5774
5775	scb = &ha->scbs[ha->max_cmds - 1];
5776
5777	ips_init_scb(ha, scb);
5778
5779	scb->timeout = ips_cmd_timeout;
5780	scb->cdb[0] = IPS_CMD_READ_CONF;
5781
5782	scb->cmd.basic_io.op_code = IPS_CMD_READ_CONF;
5783	scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
5784	scb->data_len = sizeof (*ha->conf);
5785	scb->cmd.basic_io.sg_addr = ha->ioctl_busaddr;
5786
5787	/* send command */
5788	if (((ret =
5789	      ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE)
5790	    || (ret == IPS_SUCCESS_IMM)
5791	    || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) {
5792
5793		memset(ha->conf, 0, sizeof (IPS_CONF));
5794
5795		/* reset initiator IDs */
5796		for (i = 0; i < 4; i++)
5797			ha->conf->init_id[i] = 7;
5798
5799		/* Allow Completed with Errors, so JCRM can access the Adapter to fix the problems */
5800		if ((scb->basic_status & IPS_GSC_STATUS_MASK) ==
5801		    IPS_CMD_CMPLT_WERROR)
5802			return (1);
5803
5804		return (0);
5805	}
5806
5807	memcpy(ha->conf, ha->ioctl_data, sizeof(*ha->conf));
5808	return (1);
5809}
5810
5811/****************************************************************************/
5812/*                                                                          */
5813/* Routine Name: ips_readwrite_page5                                        */
5814/*                                                                          */
5815/* Routine Description:                                                     */
5816/*                                                                          */
5817/*   Read nvram page 5 from the adapter                                     */
5818/*                                                                          */
5819/****************************************************************************/
5820static int
5821ips_readwrite_page5(ips_ha_t * ha, int write, int intr)
5822{
5823	ips_scb_t *scb;
5824	int ret;
5825
5826	METHOD_TRACE("ips_readwrite_page5", 1);
5827
5828	scb = &ha->scbs[ha->max_cmds - 1];
5829
5830	ips_init_scb(ha, scb);
5831
5832	scb->timeout = ips_cmd_timeout;
5833	scb->cdb[0] = IPS_CMD_RW_NVRAM_PAGE;
5834
5835	scb->cmd.nvram.op_code = IPS_CMD_RW_NVRAM_PAGE;
5836	scb->cmd.nvram.command_id = IPS_COMMAND_ID(ha, scb);
5837	scb->cmd.nvram.page = 5;
5838	scb->cmd.nvram.write = write;
5839	scb->cmd.nvram.reserved = 0;
5840	scb->cmd.nvram.reserved2 = 0;
5841	scb->data_len = sizeof (*ha->nvram);
5842	scb->cmd.nvram.buffer_addr = ha->ioctl_busaddr;
5843	if (write)
5844		memcpy(ha->ioctl_data, ha->nvram, sizeof(*ha->nvram));
5845
5846	/* issue the command */
5847	if (((ret =
5848	      ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE)
5849	    || (ret == IPS_SUCCESS_IMM)
5850	    || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) {
5851
5852		memset(ha->nvram, 0, sizeof (IPS_NVRAM_P5));
5853
5854		return (0);
5855	}
5856	if (!write)
5857		memcpy(ha->nvram, ha->ioctl_data, sizeof(*ha->nvram));
5858	return (1);
5859}
5860
5861/****************************************************************************/
5862/*                                                                          */
5863/* Routine Name: ips_clear_adapter                                          */
5864/*                                                                          */
5865/* Routine Description:                                                     */
5866/*                                                                          */
5867/*   Clear the stripe lock tables                                           */
5868/*                                                                          */
5869/****************************************************************************/
5870static int
5871ips_clear_adapter(ips_ha_t * ha, int intr)
5872{
5873	ips_scb_t *scb;
5874	int ret;
5875
5876	METHOD_TRACE("ips_clear_adapter", 1);
5877
5878	scb = &ha->scbs[ha->max_cmds - 1];
5879
5880	ips_init_scb(ha, scb);
5881
5882	scb->timeout = ips_reset_timeout;
5883	scb->cdb[0] = IPS_CMD_CONFIG_SYNC;
5884
5885	scb->cmd.config_sync.op_code = IPS_CMD_CONFIG_SYNC;
5886	scb->cmd.config_sync.command_id = IPS_COMMAND_ID(ha, scb);
5887	scb->cmd.config_sync.channel = 0;
5888	scb->cmd.config_sync.source_target = IPS_POCL;
5889	scb->cmd.config_sync.reserved = 0;
5890	scb->cmd.config_sync.reserved2 = 0;
5891	scb->cmd.config_sync.reserved3 = 0;
5892
5893	/* issue command */
5894	if (((ret =
5895	      ips_send_wait(ha, scb, ips_reset_timeout, intr)) == IPS_FAILURE)
5896	    || (ret == IPS_SUCCESS_IMM)
5897	    || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1))
5898		return (0);
5899
5900	/* send unlock stripe command */
5901	ips_init_scb(ha, scb);
5902
5903	scb->cdb[0] = IPS_CMD_ERROR_TABLE;
5904	scb->timeout = ips_reset_timeout;
5905
5906	scb->cmd.unlock_stripe.op_code = IPS_CMD_ERROR_TABLE;
5907	scb->cmd.unlock_stripe.command_id = IPS_COMMAND_ID(ha, scb);
5908	scb->cmd.unlock_stripe.log_drv = 0;
5909	scb->cmd.unlock_stripe.control = IPS_CSL;
5910	scb->cmd.unlock_stripe.reserved = 0;
5911	scb->cmd.unlock_stripe.reserved2 = 0;
5912	scb->cmd.unlock_stripe.reserved3 = 0;
5913
5914	/* issue command */
5915	if (((ret =
5916	      ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE)
5917	    || (ret == IPS_SUCCESS_IMM)
5918	    || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1))
5919		return (0);
5920
5921	return (1);
5922}
5923
5924/****************************************************************************/
5925/*                                                                          */
5926/* Routine Name: ips_ffdc_reset                                             */
5927/*                                                                          */
5928/* Routine Description:                                                     */
5929/*                                                                          */
5930/*   FFDC: write reset info                                                 */
5931/*                                                                          */
5932/****************************************************************************/
5933static void
5934ips_ffdc_reset(ips_ha_t * ha, int intr)
5935{
5936	ips_scb_t *scb;
5937
5938	METHOD_TRACE("ips_ffdc_reset", 1);
5939
5940	scb = &ha->scbs[ha->max_cmds - 1];
5941
5942	ips_init_scb(ha, scb);
5943
5944	scb->timeout = ips_cmd_timeout;
5945	scb->cdb[0] = IPS_CMD_FFDC;
5946	scb->cmd.ffdc.op_code = IPS_CMD_FFDC;
5947	scb->cmd.ffdc.command_id = IPS_COMMAND_ID(ha, scb);
5948	scb->cmd.ffdc.reset_count = ha->reset_count;
5949	scb->cmd.ffdc.reset_type = 0x80;
5950
5951	/* convert time to what the card wants */
5952	ips_fix_ffdc_time(ha, scb, ha->last_ffdc);
5953
5954	/* issue command */
5955	ips_send_wait(ha, scb, ips_cmd_timeout, intr);
5956}
5957
5958/****************************************************************************/
5959/*                                                                          */
5960/* Routine Name: ips_ffdc_time                                              */
5961/*                                                                          */
5962/* Routine Description:                                                     */
5963/*                                                                          */
5964/*   FFDC: write time info                                                  */
5965/*                                                                          */
5966/****************************************************************************/
5967static void
5968ips_ffdc_time(ips_ha_t * ha)
5969{
5970	ips_scb_t *scb;
5971
5972	METHOD_TRACE("ips_ffdc_time", 1);
5973
5974	DEBUG_VAR(1, "(%s%d) Sending time update.", ips_name, ha->host_num);
5975
5976	scb = &ha->scbs[ha->max_cmds - 1];
5977
5978	ips_init_scb(ha, scb);
5979
5980	scb->timeout = ips_cmd_timeout;
5981	scb->cdb[0] = IPS_CMD_FFDC;
5982	scb->cmd.ffdc.op_code = IPS_CMD_FFDC;
5983	scb->cmd.ffdc.command_id = IPS_COMMAND_ID(ha, scb);
5984	scb->cmd.ffdc.reset_count = 0;
5985	scb->cmd.ffdc.reset_type = 0;
5986
5987	/* convert time to what the card wants */
5988	ips_fix_ffdc_time(ha, scb, ha->last_ffdc);
5989
5990	/* issue command */
5991	ips_send_wait(ha, scb, ips_cmd_timeout, IPS_FFDC);
5992}
5993
5994/****************************************************************************/
5995/*                                                                          */
5996/* Routine Name: ips_fix_ffdc_time                                          */
5997/*                                                                          */
5998/* Routine Description:                                                     */
5999/*   Adjust time_t to what the card wants                                   */
6000/*                                                                          */
6001/****************************************************************************/
6002static void
6003ips_fix_ffdc_time(ips_ha_t * ha, ips_scb_t * scb, time_t current_time)
6004{
6005	long days;
6006	long rem;
6007	int i;
6008	int year;
6009	int yleap;
6010	int year_lengths[2] = { IPS_DAYS_NORMAL_YEAR, IPS_DAYS_LEAP_YEAR };
6011	int month_lengths[12][2] = { {31, 31},
6012	{28, 29},
6013	{31, 31},
6014	{30, 30},
6015	{31, 31},
6016	{30, 30},
6017	{31, 31},
6018	{31, 31},
6019	{30, 30},
6020	{31, 31},
6021	{30, 30},
6022	{31, 31}
6023	};
6024
6025	METHOD_TRACE("ips_fix_ffdc_time", 1);
6026
6027	days = current_time / IPS_SECS_DAY;
6028	rem = current_time % IPS_SECS_DAY;
6029
6030	scb->cmd.ffdc.hour = (rem / IPS_SECS_HOUR);
6031	rem = rem % IPS_SECS_HOUR;
6032	scb->cmd.ffdc.minute = (rem / IPS_SECS_MIN);
6033	scb->cmd.ffdc.second = (rem % IPS_SECS_MIN);
6034
6035	year = IPS_EPOCH_YEAR;
6036	while (days < 0 || days >= year_lengths[yleap = IPS_IS_LEAP_YEAR(year)]) {
6037		int newy;
6038
6039		newy = year + (days / IPS_DAYS_NORMAL_YEAR);
6040		if (days < 0)
6041			--newy;
6042		days -= (newy - year) * IPS_DAYS_NORMAL_YEAR +
6043		    IPS_NUM_LEAP_YEARS_THROUGH(newy - 1) -
6044		    IPS_NUM_LEAP_YEARS_THROUGH(year - 1);
6045		year = newy;
6046	}
6047
6048	scb->cmd.ffdc.yearH = year / 100;
6049	scb->cmd.ffdc.yearL = year % 100;
6050
6051	for (i = 0; days >= month_lengths[i][yleap]; ++i)
6052		days -= month_lengths[i][yleap];
6053
6054	scb->cmd.ffdc.month = i + 1;
6055	scb->cmd.ffdc.day = days + 1;
6056}
6057
6058/****************************************************************************
6059 * BIOS Flash Routines                                                      *
6060 ****************************************************************************/
6061
6062/****************************************************************************/
6063/*                                                                          */
6064/* Routine Name: ips_erase_bios                                             */
6065/*                                                                          */
6066/* Routine Description:                                                     */
6067/*   Erase the BIOS on the adapter                                          */
6068/*                                                                          */
6069/****************************************************************************/
6070static int
6071ips_erase_bios(ips_ha_t * ha)
6072{
6073	int timeout;
6074	uint8_t status = 0;
6075
6076	METHOD_TRACE("ips_erase_bios", 1);
6077
6078	status = 0;
6079
6080	/* Clear the status register */
6081	outl(0, ha->io_addr + IPS_REG_FLAP);
6082	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6083		udelay(25);	/* 25 us */
6084
6085	outb(0x50, ha->io_addr + IPS_REG_FLDP);
6086	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6087		udelay(25);	/* 25 us */
6088
6089	/* Erase Setup */
6090	outb(0x20, ha->io_addr + IPS_REG_FLDP);
6091	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6092		udelay(25);	/* 25 us */
6093
6094	/* Erase Confirm */
6095	outb(0xD0, ha->io_addr + IPS_REG_FLDP);
6096	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6097		udelay(25);	/* 25 us */
6098
6099	/* Erase Status */
6100	outb(0x70, ha->io_addr + IPS_REG_FLDP);
6101	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6102		udelay(25);	/* 25 us */
6103
6104	timeout = 80000;	/* 80 seconds */
6105
6106	while (timeout > 0) {
6107		if (ha->pcidev->revision == IPS_REVID_TROMBONE64) {
6108			outl(0, ha->io_addr + IPS_REG_FLAP);
6109			udelay(25);	/* 25 us */
6110		}
6111
6112		status = inb(ha->io_addr + IPS_REG_FLDP);
6113
6114		if (status & 0x80)
6115			break;
6116
6117		MDELAY(1);
6118		timeout--;
6119	}
6120
6121	/* check for timeout */
6122	if (timeout <= 0) {
6123		/* timeout */
6124
6125		/* try to suspend the erase */
6126		outb(0xB0, ha->io_addr + IPS_REG_FLDP);
6127		if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6128			udelay(25);	/* 25 us */
6129
6130		/* wait for 10 seconds */
6131		timeout = 10000;
6132		while (timeout > 0) {
6133			if (ha->pcidev->revision == IPS_REVID_TROMBONE64) {
6134				outl(0, ha->io_addr + IPS_REG_FLAP);
6135				udelay(25);	/* 25 us */
6136			}
6137
6138			status = inb(ha->io_addr + IPS_REG_FLDP);
6139
6140			if (status & 0xC0)
6141				break;
6142
6143			MDELAY(1);
6144			timeout--;
6145		}
6146
6147		return (1);
6148	}
6149
6150	/* check for valid VPP */
6151	if (status & 0x08)
6152		/* VPP failure */
6153		return (1);
6154
6155	/* check for successful flash */
6156	if (status & 0x30)
6157		/* sequence error */
6158		return (1);
6159
6160	/* Otherwise, we were successful */
6161	/* clear status */
6162	outb(0x50, ha->io_addr + IPS_REG_FLDP);
6163	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6164		udelay(25);	/* 25 us */
6165
6166	/* enable reads */
6167	outb(0xFF, ha->io_addr + IPS_REG_FLDP);
6168	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6169		udelay(25);	/* 25 us */
6170
6171	return (0);
6172}
6173
6174/****************************************************************************/
6175/*                                                                          */
6176/* Routine Name: ips_erase_bios_memio                                       */
6177/*                                                                          */
6178/* Routine Description:                                                     */
6179/*   Erase the BIOS on the adapter                                          */
6180/*                                                                          */
6181/****************************************************************************/
6182static int
6183ips_erase_bios_memio(ips_ha_t * ha)
6184{
6185	int timeout;
6186	uint8_t status;
6187
6188	METHOD_TRACE("ips_erase_bios_memio", 1);
6189
6190	status = 0;
6191
6192	/* Clear the status register */
6193	writel(0, ha->mem_ptr + IPS_REG_FLAP);
6194	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6195		udelay(25);	/* 25 us */
6196
6197	writeb(0x50, ha->mem_ptr + IPS_REG_FLDP);
6198	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6199		udelay(25);	/* 25 us */
6200
6201	/* Erase Setup */
6202	writeb(0x20, ha->mem_ptr + IPS_REG_FLDP);
6203	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6204		udelay(25);	/* 25 us */
6205
6206	/* Erase Confirm */
6207	writeb(0xD0, ha->mem_ptr + IPS_REG_FLDP);
6208	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6209		udelay(25);	/* 25 us */
6210
6211	/* Erase Status */
6212	writeb(0x70, ha->mem_ptr + IPS_REG_FLDP);
6213	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6214		udelay(25);	/* 25 us */
6215
6216	timeout = 80000;	/* 80 seconds */
6217
6218	while (timeout > 0) {
6219		if (ha->pcidev->revision == IPS_REVID_TROMBONE64) {
6220			writel(0, ha->mem_ptr + IPS_REG_FLAP);
6221			udelay(25);	/* 25 us */
6222		}
6223
6224		status = readb(ha->mem_ptr + IPS_REG_FLDP);
6225
6226		if (status & 0x80)
6227			break;
6228
6229		MDELAY(1);
6230		timeout--;
6231	}
6232
6233	/* check for timeout */
6234	if (timeout <= 0) {
6235		/* timeout */
6236
6237		/* try to suspend the erase */
6238		writeb(0xB0, ha->mem_ptr + IPS_REG_FLDP);
6239		if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6240			udelay(25);	/* 25 us */
6241
6242		/* wait for 10 seconds */
6243		timeout = 10000;
6244		while (timeout > 0) {
6245			if (ha->pcidev->revision == IPS_REVID_TROMBONE64) {
6246				writel(0, ha->mem_ptr + IPS_REG_FLAP);
6247				udelay(25);	/* 25 us */
6248			}
6249
6250			status = readb(ha->mem_ptr + IPS_REG_FLDP);
6251
6252			if (status & 0xC0)
6253				break;
6254
6255			MDELAY(1);
6256			timeout--;
6257		}
6258
6259		return (1);
6260	}
6261
6262	/* check for valid VPP */
6263	if (status & 0x08)
6264		/* VPP failure */
6265		return (1);
6266
6267	/* check for successful flash */
6268	if (status & 0x30)
6269		/* sequence error */
6270		return (1);
6271
6272	/* Otherwise, we were successful */
6273	/* clear status */
6274	writeb(0x50, ha->mem_ptr + IPS_REG_FLDP);
6275	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6276		udelay(25);	/* 25 us */
6277
6278	/* enable reads */
6279	writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP);
6280	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6281		udelay(25);	/* 25 us */
6282
6283	return (0);
6284}
6285
6286/****************************************************************************/
6287/*                                                                          */
6288/* Routine Name: ips_program_bios                                           */
6289/*                                                                          */
6290/* Routine Description:                                                     */
6291/*   Program the BIOS on the adapter                                        */
6292/*                                                                          */
6293/****************************************************************************/
6294static int
6295ips_program_bios(ips_ha_t * ha, char *buffer, uint32_t buffersize,
6296		 uint32_t offset)
6297{
6298	int i;
6299	int timeout;
6300	uint8_t status = 0;
6301
6302	METHOD_TRACE("ips_program_bios", 1);
6303
6304	status = 0;
6305
6306	for (i = 0; i < buffersize; i++) {
6307		/* write a byte */
6308		outl(i + offset, ha->io_addr + IPS_REG_FLAP);
6309		if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6310			udelay(25);	/* 25 us */
6311
6312		outb(0x40, ha->io_addr + IPS_REG_FLDP);
6313		if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6314			udelay(25);	/* 25 us */
6315
6316		outb(buffer[i], ha->io_addr + IPS_REG_FLDP);
6317		if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6318			udelay(25);	/* 25 us */
6319
6320		/* wait up to one second */
6321		timeout = 1000;
6322		while (timeout > 0) {
6323			if (ha->pcidev->revision == IPS_REVID_TROMBONE64) {
6324				outl(0, ha->io_addr + IPS_REG_FLAP);
6325				udelay(25);	/* 25 us */
6326			}
6327
6328			status = inb(ha->io_addr + IPS_REG_FLDP);
6329
6330			if (status & 0x80)
6331				break;
6332
6333			MDELAY(1);
6334			timeout--;
6335		}
6336
6337		if (timeout == 0) {
6338			/* timeout error */
6339			outl(0, ha->io_addr + IPS_REG_FLAP);
6340			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6341				udelay(25);	/* 25 us */
6342
6343			outb(0xFF, ha->io_addr + IPS_REG_FLDP);
6344			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6345				udelay(25);	/* 25 us */
6346
6347			return (1);
6348		}
6349
6350		/* check the status */
6351		if (status & 0x18) {
6352			/* programming error */
6353			outl(0, ha->io_addr + IPS_REG_FLAP);
6354			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6355				udelay(25);	/* 25 us */
6356
6357			outb(0xFF, ha->io_addr + IPS_REG_FLDP);
6358			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6359				udelay(25);	/* 25 us */
6360
6361			return (1);
6362		}
6363	}			/* end for */
6364
6365	/* Enable reading */
6366	outl(0, ha->io_addr + IPS_REG_FLAP);
6367	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6368		udelay(25);	/* 25 us */
6369
6370	outb(0xFF, ha->io_addr + IPS_REG_FLDP);
6371	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6372		udelay(25);	/* 25 us */
6373
6374	return (0);
6375}
6376
6377/****************************************************************************/
6378/*                                                                          */
6379/* Routine Name: ips_program_bios_memio                                     */
6380/*                                                                          */
6381/* Routine Description:                                                     */
6382/*   Program the BIOS on the adapter                                        */
6383/*                                                                          */
6384/****************************************************************************/
6385static int
6386ips_program_bios_memio(ips_ha_t * ha, char *buffer, uint32_t buffersize,
6387		       uint32_t offset)
6388{
6389	int i;
6390	int timeout;
6391	uint8_t status = 0;
6392
6393	METHOD_TRACE("ips_program_bios_memio", 1);
6394
6395	status = 0;
6396
6397	for (i = 0; i < buffersize; i++) {
6398		/* write a byte */
6399		writel(i + offset, ha->mem_ptr + IPS_REG_FLAP);
6400		if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6401			udelay(25);	/* 25 us */
6402
6403		writeb(0x40, ha->mem_ptr + IPS_REG_FLDP);
6404		if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6405			udelay(25);	/* 25 us */
6406
6407		writeb(buffer[i], ha->mem_ptr + IPS_REG_FLDP);
6408		if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6409			udelay(25);	/* 25 us */
6410
6411		/* wait up to one second */
6412		timeout = 1000;
6413		while (timeout > 0) {
6414			if (ha->pcidev->revision == IPS_REVID_TROMBONE64) {
6415				writel(0, ha->mem_ptr + IPS_REG_FLAP);
6416				udelay(25);	/* 25 us */
6417			}
6418
6419			status = readb(ha->mem_ptr + IPS_REG_FLDP);
6420
6421			if (status & 0x80)
6422				break;
6423
6424			MDELAY(1);
6425			timeout--;
6426		}
6427
6428		if (timeout == 0) {
6429			/* timeout error */
6430			writel(0, ha->mem_ptr + IPS_REG_FLAP);
6431			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6432				udelay(25);	/* 25 us */
6433
6434			writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP);
6435			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6436				udelay(25);	/* 25 us */
6437
6438			return (1);
6439		}
6440
6441		/* check the status */
6442		if (status & 0x18) {
6443			/* programming error */
6444			writel(0, ha->mem_ptr + IPS_REG_FLAP);
6445			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6446				udelay(25);	/* 25 us */
6447
6448			writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP);
6449			if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6450				udelay(25);	/* 25 us */
6451
6452			return (1);
6453		}
6454	}			/* end for */
6455
6456	/* Enable reading */
6457	writel(0, ha->mem_ptr + IPS_REG_FLAP);
6458	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6459		udelay(25);	/* 25 us */
6460
6461	writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP);
6462	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6463		udelay(25);	/* 25 us */
6464
6465	return (0);
6466}
6467
6468/****************************************************************************/
6469/*                                                                          */
6470/* Routine Name: ips_verify_bios                                            */
6471/*                                                                          */
6472/* Routine Description:                                                     */
6473/*   Verify the BIOS on the adapter                                         */
6474/*                                                                          */
6475/****************************************************************************/
6476static int
6477ips_verify_bios(ips_ha_t * ha, char *buffer, uint32_t buffersize,
6478		uint32_t offset)
6479{
6480	uint8_t checksum;
6481	int i;
6482
6483	METHOD_TRACE("ips_verify_bios", 1);
6484
6485	/* test 1st byte */
6486	outl(0, ha->io_addr + IPS_REG_FLAP);
6487	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6488		udelay(25);	/* 25 us */
6489
6490	if (inb(ha->io_addr + IPS_REG_FLDP) != 0x55)
6491		return (1);
6492
6493	outl(1, ha->io_addr + IPS_REG_FLAP);
6494	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6495		udelay(25);	/* 25 us */
6496	if (inb(ha->io_addr + IPS_REG_FLDP) != 0xAA)
6497		return (1);
6498
6499	checksum = 0xff;
6500	for (i = 2; i < buffersize; i++) {
6501
6502		outl(i + offset, ha->io_addr + IPS_REG_FLAP);
6503		if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6504			udelay(25);	/* 25 us */
6505
6506		checksum = (uint8_t) checksum + inb(ha->io_addr + IPS_REG_FLDP);
6507	}
6508
6509	if (checksum != 0)
6510		/* failure */
6511		return (1);
6512	else
6513		/* success */
6514		return (0);
6515}
6516
6517/****************************************************************************/
6518/*                                                                          */
6519/* Routine Name: ips_verify_bios_memio                                      */
6520/*                                                                          */
6521/* Routine Description:                                                     */
6522/*   Verify the BIOS on the adapter                                         */
6523/*                                                                          */
6524/****************************************************************************/
6525static int
6526ips_verify_bios_memio(ips_ha_t * ha, char *buffer, uint32_t buffersize,
6527		      uint32_t offset)
6528{
6529	uint8_t checksum;
6530	int i;
6531
6532	METHOD_TRACE("ips_verify_bios_memio", 1);
6533
6534	/* test 1st byte */
6535	writel(0, ha->mem_ptr + IPS_REG_FLAP);
6536	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6537		udelay(25);	/* 25 us */
6538
6539	if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0x55)
6540		return (1);
6541
6542	writel(1, ha->mem_ptr + IPS_REG_FLAP);
6543	if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6544		udelay(25);	/* 25 us */
6545	if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0xAA)
6546		return (1);
6547
6548	checksum = 0xff;
6549	for (i = 2; i < buffersize; i++) {
6550
6551		writel(i + offset, ha->mem_ptr + IPS_REG_FLAP);
6552		if (ha->pcidev->revision == IPS_REVID_TROMBONE64)
6553			udelay(25);	/* 25 us */
6554
6555		checksum =
6556		    (uint8_t) checksum + readb(ha->mem_ptr + IPS_REG_FLDP);
6557	}
6558
6559	if (checksum != 0)
6560		/* failure */
6561		return (1);
6562	else
6563		/* success */
6564		return (0);
6565}
6566
6567/****************************************************************************/
6568/*                                                                          */
6569/* Routine Name: ips_abort_init                                             */
6570/*                                                                          */
6571/* Routine Description:                                                     */
6572/*   cleanup routine for a failed adapter initialization                    */
6573/****************************************************************************/
6574static int
6575ips_abort_init(ips_ha_t * ha, int index)
6576{
6577	ha->active = 0;
6578	ips_free(ha);
6579	ips_ha[index] = NULL;
6580	ips_sh[index] = NULL;
6581	return -1;
6582}
6583
6584/****************************************************************************/
6585/*                                                                          */
6586/* Routine Name: ips_shift_controllers                                      */
6587/*                                                                          */
6588/* Routine Description:                                                     */
6589/*   helper function for ordering adapters                                  */
6590/****************************************************************************/
6591static void
6592ips_shift_controllers(int lowindex, int highindex)
6593{
6594	ips_ha_t *ha_sav = ips_ha[highindex];
6595	struct Scsi_Host *sh_sav = ips_sh[highindex];
6596	int i;
6597
6598	for (i = highindex; i > lowindex; i--) {
6599		ips_ha[i] = ips_ha[i - 1];
6600		ips_sh[i] = ips_sh[i - 1];
6601		ips_ha[i]->host_num = i;
6602	}
6603	ha_sav->host_num = lowindex;
6604	ips_ha[lowindex] = ha_sav;
6605	ips_sh[lowindex] = sh_sav;
6606}
6607
6608/****************************************************************************/
6609/*                                                                          */
6610/* Routine Name: ips_order_controllers                                      */
6611/*                                                                          */
6612/* Routine Description:                                                     */
6613/*   place controllers is the "proper" boot order                           */
6614/****************************************************************************/
6615static void
6616ips_order_controllers(void)
6617{
6618	int i, j, tmp, position = 0;
6619	IPS_NVRAM_P5 *nvram;
6620	if (!ips_ha[0])
6621		return;
6622	nvram = ips_ha[0]->nvram;
6623
6624	if (nvram->adapter_order[0]) {
6625		for (i = 1; i <= nvram->adapter_order[0]; i++) {
6626			for (j = position; j < ips_num_controllers; j++) {
6627				switch (ips_ha[j]->ad_type) {
6628				case IPS_ADTYPE_SERVERAID6M:
6629				case IPS_ADTYPE_SERVERAID7M:
6630					if (nvram->adapter_order[i] == 'M') {
6631						ips_shift_controllers(position,
6632								      j);
6633						position++;
6634					}
6635					break;
6636				case IPS_ADTYPE_SERVERAID4L:
6637				case IPS_ADTYPE_SERVERAID4M:
6638				case IPS_ADTYPE_SERVERAID4MX:
6639				case IPS_ADTYPE_SERVERAID4LX:
6640					if (nvram->adapter_order[i] == 'N') {
6641						ips_shift_controllers(position,
6642								      j);
6643						position++;
6644					}
6645					break;
6646				case IPS_ADTYPE_SERVERAID6I:
6647				case IPS_ADTYPE_SERVERAID5I2:
6648				case IPS_ADTYPE_SERVERAID5I1:
6649				case IPS_ADTYPE_SERVERAID7k:
6650					if (nvram->adapter_order[i] == 'S') {
6651						ips_shift_controllers(position,
6652								      j);
6653						position++;
6654					}
6655					break;
6656				case IPS_ADTYPE_SERVERAID:
6657				case IPS_ADTYPE_SERVERAID2:
6658				case IPS_ADTYPE_NAVAJO:
6659				case IPS_ADTYPE_KIOWA:
6660				case IPS_ADTYPE_SERVERAID3L:
6661				case IPS_ADTYPE_SERVERAID3:
6662				case IPS_ADTYPE_SERVERAID4H:
6663					if (nvram->adapter_order[i] == 'A') {
6664						ips_shift_controllers(position,
6665								      j);
6666						position++;
6667					}
6668					break;
6669				default:
6670					break;
6671				}
6672			}
6673		}
6674		/* if adapter_order[0], then ordering is complete */
6675		return;
6676	}
6677	/* old bios, use older ordering */
6678	tmp = 0;
6679	for (i = position; i < ips_num_controllers; i++) {
6680		if (ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID5I2 ||
6681		    ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID5I1) {
6682			ips_shift_controllers(position, i);
6683			position++;
6684			tmp = 1;
6685		}
6686	}
6687	/* if there were no 5I cards, then don't do any extra ordering */
6688	if (!tmp)
6689		return;
6690	for (i = position; i < ips_num_controllers; i++) {
6691		if (ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID4L ||
6692		    ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID4M ||
6693		    ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID4LX ||
6694		    ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID4MX) {
6695			ips_shift_controllers(position, i);
6696			position++;
6697		}
6698	}
6699
6700	return;
6701}
6702
6703/****************************************************************************/
6704/*                                                                          */
6705/* Routine Name: ips_register_scsi                                          */
6706/*                                                                          */
6707/* Routine Description:                                                     */
6708/*   perform any registration and setup with the scsi layer                 */
6709/****************************************************************************/
6710static int
6711ips_register_scsi(int index)
6712{
6713	struct Scsi_Host *sh;
6714	ips_ha_t *ha, *oldha = ips_ha[index];
6715	sh = scsi_host_alloc(&ips_driver_template, sizeof (ips_ha_t));
6716	if (!sh) {
6717		IPS_PRINTK(KERN_WARNING, oldha->pcidev,
6718			   "Unable to register controller with SCSI subsystem\n");
6719		return -1;
6720	}
6721	ha = IPS_HA(sh);
6722	memcpy(ha, oldha, sizeof (ips_ha_t));
6723	free_irq(oldha->pcidev->irq, oldha);
6724	/* Install the interrupt handler with the new ha */
6725	if (request_irq(ha->pcidev->irq, do_ipsintr, IRQF_SHARED, ips_name, ha)) {
6726		IPS_PRINTK(KERN_WARNING, ha->pcidev,
6727			   "Unable to install interrupt handler\n");
6728		goto err_out_sh;
6729	}
6730
6731	kfree(oldha);
6732
6733	/* Store away needed values for later use */
6734	sh->unique_id = (ha->io_addr) ? ha->io_addr : ha->mem_addr;
6735	sh->sg_tablesize = sh->hostt->sg_tablesize;
6736	sh->can_queue = sh->hostt->can_queue;
6737	sh->cmd_per_lun = sh->hostt->cmd_per_lun;
6738	sh->use_clustering = sh->hostt->use_clustering;
6739	sh->max_sectors = 128;
6740
6741	sh->max_id = ha->ntargets;
6742	sh->max_lun = ha->nlun;
6743	sh->max_channel = ha->nbus - 1;
6744	sh->can_queue = ha->max_cmds - 1;
6745
6746	if (scsi_add_host(sh, &ha->pcidev->dev))
6747		goto err_out;
6748
6749	ips_sh[index] = sh;
6750	ips_ha[index] = ha;
6751
6752	scsi_scan_host(sh);
6753
6754	return 0;
6755
6756err_out:
6757	free_irq(ha->pcidev->irq, ha);
6758err_out_sh:
6759	scsi_host_put(sh);
6760	return -1;
6761}
6762
6763/*---------------------------------------------------------------------------*/
6764/*   Routine Name: ips_remove_device                                         */
6765/*                                                                           */
6766/*   Routine Description:                                                    */
6767/*     Remove one Adapter ( Hot Plugging )                                   */
6768/*---------------------------------------------------------------------------*/
6769static void
6770ips_remove_device(struct pci_dev *pci_dev)
6771{
6772	struct Scsi_Host *sh = pci_get_drvdata(pci_dev);
6773
6774	pci_set_drvdata(pci_dev, NULL);
6775
6776	ips_release(sh);
6777
6778	pci_release_regions(pci_dev);
6779	pci_disable_device(pci_dev);
6780}
6781
6782/****************************************************************************/
6783/*                                                                          */
6784/* Routine Name: ips_module_init                                            */
6785/*                                                                          */
6786/* Routine Description:                                                     */
6787/*   function called on module load                                         */
6788/****************************************************************************/
6789static int __init
6790ips_module_init(void)
6791{
 
 
 
 
 
6792	if (pci_register_driver(&ips_pci_driver) < 0)
6793		return -ENODEV;
6794	ips_driver_template.module = THIS_MODULE;
6795	ips_order_controllers();
6796	if (!ips_detect(&ips_driver_template)) {
6797		pci_unregister_driver(&ips_pci_driver);
6798		return -ENODEV;
6799	}
6800	register_reboot_notifier(&ips_notifier);
6801	return 0;
6802}
6803
6804/****************************************************************************/
6805/*                                                                          */
6806/* Routine Name: ips_module_exit                                            */
6807/*                                                                          */
6808/* Routine Description:                                                     */
6809/*   function called on module unload                                       */
6810/****************************************************************************/
6811static void __exit
6812ips_module_exit(void)
6813{
6814	pci_unregister_driver(&ips_pci_driver);
6815	unregister_reboot_notifier(&ips_notifier);
6816}
6817
6818module_init(ips_module_init);
6819module_exit(ips_module_exit);
6820
6821/*---------------------------------------------------------------------------*/
6822/*   Routine Name: ips_insert_device                                         */
6823/*                                                                           */
6824/*   Routine Description:                                                    */
6825/*     Add One Adapter ( Hot Plug )                                          */
6826/*                                                                           */
6827/*   Return Value:                                                           */
6828/*     0 if Successful, else non-zero                                        */
6829/*---------------------------------------------------------------------------*/
6830static int
6831ips_insert_device(struct pci_dev *pci_dev, const struct pci_device_id *ent)
6832{
6833	int index = -1;
6834	int rc;
6835
6836	METHOD_TRACE("ips_insert_device", 1);
6837	rc = pci_enable_device(pci_dev);
6838	if (rc)
6839		return rc;
6840
6841	rc = pci_request_regions(pci_dev, "ips");
6842	if (rc)
6843		goto err_out;
6844
6845	rc = ips_init_phase1(pci_dev, &index);
6846	if (rc == SUCCESS)
6847		rc = ips_init_phase2(index);
6848
6849	if (ips_hotplug)
6850		if (ips_register_scsi(index)) {
6851			ips_free(ips_ha[index]);
6852			rc = -1;
6853		}
6854
6855	if (rc == SUCCESS)
6856		ips_num_controllers++;
6857
6858	ips_next_controller = ips_num_controllers;
6859
6860	if (rc < 0) {
6861		rc = -ENODEV;
6862		goto err_out_regions;
6863	}
6864
6865	pci_set_drvdata(pci_dev, ips_sh[index]);
6866	return 0;
6867
6868err_out_regions:
6869	pci_release_regions(pci_dev);
6870err_out:
6871	pci_disable_device(pci_dev);
6872	return rc;
6873}
6874
6875/*---------------------------------------------------------------------------*/
6876/*   Routine Name: ips_init_phase1                                           */
6877/*                                                                           */
6878/*   Routine Description:                                                    */
6879/*     Adapter Initialization                                                */
6880/*                                                                           */
6881/*   Return Value:                                                           */
6882/*     0 if Successful, else non-zero                                        */
6883/*---------------------------------------------------------------------------*/
6884static int
6885ips_init_phase1(struct pci_dev *pci_dev, int *indexPtr)
6886{
6887	ips_ha_t *ha;
6888	uint32_t io_addr;
6889	uint32_t mem_addr;
6890	uint32_t io_len;
6891	uint32_t mem_len;
6892	uint8_t bus;
6893	uint8_t func;
6894	int j;
6895	int index;
6896	dma_addr_t dma_address;
6897	char __iomem *ioremap_ptr;
6898	char __iomem *mem_ptr;
6899	uint32_t IsDead;
6900
6901	METHOD_TRACE("ips_init_phase1", 1);
6902	index = IPS_MAX_ADAPTERS;
6903	for (j = 0; j < IPS_MAX_ADAPTERS; j++) {
6904		if (ips_ha[j] == NULL) {
6905			index = j;
6906			break;
6907		}
6908	}
6909
6910	if (index >= IPS_MAX_ADAPTERS)
6911		return -1;
6912
6913	/* stuff that we get in dev */
6914	bus = pci_dev->bus->number;
6915	func = pci_dev->devfn;
6916
6917	/* Init MEM/IO addresses to 0 */
6918	mem_addr = 0;
6919	io_addr = 0;
6920	mem_len = 0;
6921	io_len = 0;
6922
6923	for (j = 0; j < 2; j++) {
6924		if (!pci_resource_start(pci_dev, j))
6925			break;
6926
6927		if (pci_resource_flags(pci_dev, j) & IORESOURCE_IO) {
6928			io_addr = pci_resource_start(pci_dev, j);
6929			io_len = pci_resource_len(pci_dev, j);
6930		} else {
6931			mem_addr = pci_resource_start(pci_dev, j);
6932			mem_len = pci_resource_len(pci_dev, j);
6933		}
6934	}
6935
6936	/* setup memory mapped area (if applicable) */
6937	if (mem_addr) {
6938		uint32_t base;
6939		uint32_t offs;
6940
6941		base = mem_addr & PAGE_MASK;
6942		offs = mem_addr - base;
6943		ioremap_ptr = ioremap(base, PAGE_SIZE);
6944		if (!ioremap_ptr)
6945			return -1;
6946		mem_ptr = ioremap_ptr + offs;
6947	} else {
6948		ioremap_ptr = NULL;
6949		mem_ptr = NULL;
6950	}
6951
6952	/* found a controller */
6953	ha = kzalloc(sizeof (ips_ha_t), GFP_KERNEL);
6954	if (ha == NULL) {
6955		IPS_PRINTK(KERN_WARNING, pci_dev,
6956			   "Unable to allocate temporary ha struct\n");
6957		return -1;
6958	}
6959
6960	ips_sh[index] = NULL;
6961	ips_ha[index] = ha;
6962	ha->active = 1;
6963
6964	/* Store info in HA structure */
6965	ha->io_addr = io_addr;
6966	ha->io_len = io_len;
6967	ha->mem_addr = mem_addr;
6968	ha->mem_len = mem_len;
6969	ha->mem_ptr = mem_ptr;
6970	ha->ioremap_ptr = ioremap_ptr;
6971	ha->host_num = (uint32_t) index;
6972	ha->slot_num = PCI_SLOT(pci_dev->devfn);
6973	ha->pcidev = pci_dev;
6974
6975	/*
6976	 * Set the pci_dev's dma_mask.  Not all adapters support 64bit
6977	 * addressing so don't enable it if the adapter can't support
6978	 * it!  Also, don't use 64bit addressing if dma addresses
6979	 * are guaranteed to be < 4G.
6980	 */
6981	if (IPS_ENABLE_DMA64 && IPS_HAS_ENH_SGLIST(ha) &&
6982	    !pci_set_dma_mask(ha->pcidev, DMA_BIT_MASK(64))) {
6983		(ha)->flags |= IPS_HA_ENH_SG;
6984	} else {
6985		if (pci_set_dma_mask(ha->pcidev, DMA_BIT_MASK(32)) != 0) {
6986			printk(KERN_WARNING "Unable to set DMA Mask\n");
6987			return ips_abort_init(ha, index);
6988		}
6989	}
6990	if(ips_cd_boot && !ips_FlashData){
6991		ips_FlashData = pci_alloc_consistent(pci_dev, PAGE_SIZE << 7,
6992						     &ips_flashbusaddr);
6993	}
6994
6995	ha->enq = pci_alloc_consistent(pci_dev, sizeof (IPS_ENQ),
6996				       &ha->enq_busaddr);
6997	if (!ha->enq) {
6998		IPS_PRINTK(KERN_WARNING, pci_dev,
6999			   "Unable to allocate host inquiry structure\n");
7000		return ips_abort_init(ha, index);
7001	}
7002
7003	ha->adapt = pci_alloc_consistent(pci_dev, sizeof (IPS_ADAPTER) +
7004					 sizeof (IPS_IO_CMD), &dma_address);
 
7005	if (!ha->adapt) {
7006		IPS_PRINTK(KERN_WARNING, pci_dev,
7007			   "Unable to allocate host adapt & dummy structures\n");
7008		return ips_abort_init(ha, index);
7009	}
7010	ha->adapt->hw_status_start = dma_address;
7011	ha->dummy = (void *) (ha->adapt + 1);
7012
7013
7014
7015	ha->logical_drive_info = pci_alloc_consistent(pci_dev, sizeof (IPS_LD_INFO), &dma_address);
 
7016	if (!ha->logical_drive_info) {
7017		IPS_PRINTK(KERN_WARNING, pci_dev,
7018			   "Unable to allocate logical drive info structure\n");
7019		return ips_abort_init(ha, index);
7020	}
7021	ha->logical_drive_info_dma_addr = dma_address;
7022
7023
7024	ha->conf = kmalloc(sizeof (IPS_CONF), GFP_KERNEL);
7025
7026	if (!ha->conf) {
7027		IPS_PRINTK(KERN_WARNING, pci_dev,
7028			   "Unable to allocate host conf structure\n");
7029		return ips_abort_init(ha, index);
7030	}
7031
7032	ha->nvram = kmalloc(sizeof (IPS_NVRAM_P5), GFP_KERNEL);
7033
7034	if (!ha->nvram) {
7035		IPS_PRINTK(KERN_WARNING, pci_dev,
7036			   "Unable to allocate host NVRAM structure\n");
7037		return ips_abort_init(ha, index);
7038	}
7039
7040	ha->subsys = kmalloc(sizeof (IPS_SUBSYS), GFP_KERNEL);
7041
7042	if (!ha->subsys) {
7043		IPS_PRINTK(KERN_WARNING, pci_dev,
7044			   "Unable to allocate host subsystem structure\n");
7045		return ips_abort_init(ha, index);
7046	}
7047
7048	/* the ioctl buffer is now used during adapter initialization, so its
7049	 * successful allocation is now required */
7050	if (ips_ioctlsize < PAGE_SIZE)
7051		ips_ioctlsize = PAGE_SIZE;
7052
7053	ha->ioctl_data = pci_alloc_consistent(pci_dev, ips_ioctlsize,
7054					      &ha->ioctl_busaddr);
7055	ha->ioctl_len = ips_ioctlsize;
7056	if (!ha->ioctl_data) {
7057		IPS_PRINTK(KERN_WARNING, pci_dev,
7058			   "Unable to allocate IOCTL data\n");
7059		return ips_abort_init(ha, index);
7060	}
7061
7062	/*
7063	 * Setup Functions
7064	 */
7065	ips_setup_funclist(ha);
7066
7067	if ((IPS_IS_MORPHEUS(ha)) || (IPS_IS_MARCO(ha))) {
7068		/* If Morpheus appears dead, reset it */
7069		IsDead = readl(ha->mem_ptr + IPS_REG_I960_MSG1);
7070		if (IsDead == 0xDEADBEEF) {
7071			ips_reset_morpheus(ha);
7072		}
7073	}
7074
7075	/*
7076	 * Initialize the card if it isn't already
7077	 */
7078
7079	if (!(*ha->func.isinit) (ha)) {
7080		if (!(*ha->func.init) (ha)) {
7081			/*
7082			 * Initialization failed
7083			 */
7084			IPS_PRINTK(KERN_WARNING, pci_dev,
7085				   "Unable to initialize controller\n");
7086			return ips_abort_init(ha, index);
7087		}
7088	}
7089
7090	*indexPtr = index;
7091	return SUCCESS;
7092}
7093
7094/*---------------------------------------------------------------------------*/
7095/*   Routine Name: ips_init_phase2                                           */
7096/*                                                                           */
7097/*   Routine Description:                                                    */
7098/*     Adapter Initialization Phase 2                                        */
7099/*                                                                           */
7100/*   Return Value:                                                           */
7101/*     0 if Successful, else non-zero                                        */
7102/*---------------------------------------------------------------------------*/
7103static int
7104ips_init_phase2(int index)
7105{
7106	ips_ha_t *ha;
7107
7108	ha = ips_ha[index];
7109
7110	METHOD_TRACE("ips_init_phase2", 1);
7111	if (!ha->active) {
7112		ips_ha[index] = NULL;
7113		return -1;
7114	}
7115
7116	/* Install the interrupt handler */
7117	if (request_irq(ha->pcidev->irq, do_ipsintr, IRQF_SHARED, ips_name, ha)) {
7118		IPS_PRINTK(KERN_WARNING, ha->pcidev,
7119			   "Unable to install interrupt handler\n");
7120		return ips_abort_init(ha, index);
7121	}
7122
7123	/*
7124	 * Allocate a temporary SCB for initialization
7125	 */
7126	ha->max_cmds = 1;
7127	if (!ips_allocatescbs(ha)) {
7128		IPS_PRINTK(KERN_WARNING, ha->pcidev,
7129			   "Unable to allocate a CCB\n");
7130		free_irq(ha->pcidev->irq, ha);
7131		return ips_abort_init(ha, index);
7132	}
7133
7134	if (!ips_hainit(ha)) {
7135		IPS_PRINTK(KERN_WARNING, ha->pcidev,
7136			   "Unable to initialize controller\n");
7137		free_irq(ha->pcidev->irq, ha);
7138		return ips_abort_init(ha, index);
7139	}
7140	/* Free the temporary SCB */
7141	ips_deallocatescbs(ha, 1);
7142
7143	/* allocate CCBs */
7144	if (!ips_allocatescbs(ha)) {
7145		IPS_PRINTK(KERN_WARNING, ha->pcidev,
7146			   "Unable to allocate CCBs\n");
7147		free_irq(ha->pcidev->irq, ha);
7148		return ips_abort_init(ha, index);
7149	}
7150
7151	return SUCCESS;
7152}
7153
7154MODULE_LICENSE("GPL");
7155MODULE_DESCRIPTION("IBM ServeRAID Adapter Driver " IPS_VER_STRING);
7156MODULE_VERSION(IPS_VER_STRING);
7157
7158
7159/*
7160 * Overrides for Emacs so that we almost follow Linus's tabbing style.
7161 * Emacs will notice this stuff at the end of the file and automatically
7162 * adjust the settings for this buffer only.  This must remain at the end
7163 * of the file.
7164 * ---------------------------------------------------------------------------
7165 * Local variables:
7166 * c-indent-level: 2
7167 * c-brace-imaginary-offset: 0
7168 * c-brace-offset: -2
7169 * c-argdecl-indent: 2
7170 * c-label-offset: -2
7171 * c-continued-statement-offset: 2
7172 * c-continued-brace-offset: 0
7173 * indent-tabs-mode: nil
7174 * tab-width: 8
7175 * End:
7176 */