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