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