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