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