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