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