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