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