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