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