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