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