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