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