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