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