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