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