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