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