[PATCH] ARM: Allow register_undef_hook to be called with IRQs off
[linux-2.6/zen-sources.git] / drivers / scsi / ips.c
blob6dfcb4fbccdda1ed614b2833ea755ed81df7b9ea
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 /*****************************************************************************/
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.xx - 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 /*****************************************************************************/
143 * Conditional Compilation directives for this driver:
145 * IPS_DEBUG - Turn on debugging info
147 * Parameters:
149 * debug:<number> - Set debug level to <number>
150 * NOTE: only works when IPS_DEBUG compile directive is used.
151 * 1 - Normal debug messages
152 * 2 - Verbose debug messages
153 * 11 - Method trace (non interrupt)
154 * 12 - Method trace (includes interrupt)
156 * noi2o - Don't use I2O Queues (ServeRAID 4 only)
157 * nommap - Don't use memory mapped I/O
158 * ioctlsize - Initial size of the IOCTL buffer
161 #include <asm/io.h>
162 #include <asm/byteorder.h>
163 #include <asm/page.h>
164 #include <linux/stddef.h>
165 #include <linux/version.h>
166 #include <linux/string.h>
167 #include <linux/errno.h>
168 #include <linux/kernel.h>
169 #include <linux/ioport.h>
170 #include <linux/slab.h>
171 #include <linux/delay.h>
172 #include <linux/pci.h>
173 #include <linux/proc_fs.h>
174 #include <linux/reboot.h>
175 #include <linux/interrupt.h>
177 #include <linux/blkdev.h>
178 #include <linux/types.h>
180 #include <scsi/sg.h>
182 #include "scsi.h"
184 #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,0)
185 #include "hosts.h"
186 #else
187 #include <scsi/scsi_host.h>
188 #endif
190 #include "ips.h"
192 #include <linux/module.h>
194 #include <linux/stat.h>
195 #include <linux/config.h>
197 #include <linux/spinlock.h>
198 #include <linux/init.h>
200 #include <linux/smp.h>
202 #ifdef MODULE
203 static char *ips = NULL;
204 module_param(ips, charp, 0);
205 #endif
208 * DRIVER_VER
210 #define IPS_VERSION_HIGH "7.10"
211 #define IPS_VERSION_LOW ".18 "
213 #if !defined(__i386__) && !defined(__ia64__) && !defined(__x86_64__)
214 #warning "This driver has only been tested on the x86/ia64/x86_64 platforms"
215 #endif
217 #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,0)
218 #include <linux/blk.h>
219 #include "sd.h"
220 #define IPS_SG_ADDRESS(sg) ((sg)->address)
221 #define IPS_LOCK_SAVE(lock,flags) spin_lock_irqsave(&io_request_lock,flags)
222 #define IPS_UNLOCK_RESTORE(lock,flags) spin_unlock_irqrestore(&io_request_lock,flags)
223 #ifndef __devexit_p
224 #define __devexit_p(x) x
225 #endif
226 #else
227 #define IPS_SG_ADDRESS(sg) (page_address((sg)->page) ? \
228 page_address((sg)->page)+(sg)->offset : NULL)
229 #define IPS_LOCK_SAVE(lock,flags) do{spin_lock(lock);(void)flags;}while(0)
230 #define IPS_UNLOCK_RESTORE(lock,flags) do{spin_unlock(lock);(void)flags;}while(0)
231 #endif
233 #define IPS_DMA_DIR(scb) ((!scb->scsi_cmd || ips_is_passthru(scb->scsi_cmd) || \
234 DMA_NONE == scb->scsi_cmd->sc_data_direction) ? \
235 PCI_DMA_BIDIRECTIONAL : \
236 scb->scsi_cmd->sc_data_direction)
238 #ifdef IPS_DEBUG
239 #define METHOD_TRACE(s, i) if (ips_debug >= (i+10)) printk(KERN_NOTICE s "\n");
240 #define DEBUG(i, s) if (ips_debug >= i) printk(KERN_NOTICE s "\n");
241 #define DEBUG_VAR(i, s, v...) if (ips_debug >= i) printk(KERN_NOTICE s "\n", v);
242 #else
243 #define METHOD_TRACE(s, i)
244 #define DEBUG(i, s)
245 #define DEBUG_VAR(i, s, v...)
246 #endif
249 * Function prototypes
251 static int ips_detect(Scsi_Host_Template *);
252 static int ips_release(struct Scsi_Host *);
253 static int ips_eh_abort(Scsi_Cmnd *);
254 static int ips_eh_reset(Scsi_Cmnd *);
255 static int ips_queue(Scsi_Cmnd *, void (*)(Scsi_Cmnd *));
256 static const char *ips_info(struct Scsi_Host *);
257 static irqreturn_t do_ipsintr(int, void *, struct pt_regs *);
258 static int ips_hainit(ips_ha_t *);
259 static int ips_map_status(ips_ha_t *, ips_scb_t *, ips_stat_t *);
260 static int ips_send_wait(ips_ha_t *, ips_scb_t *, int, int);
261 static int ips_send_cmd(ips_ha_t *, ips_scb_t *);
262 static int ips_online(ips_ha_t *, ips_scb_t *);
263 static int ips_inquiry(ips_ha_t *, ips_scb_t *);
264 static int ips_rdcap(ips_ha_t *, ips_scb_t *);
265 static int ips_msense(ips_ha_t *, ips_scb_t *);
266 static int ips_reqsen(ips_ha_t *, ips_scb_t *);
267 static int ips_deallocatescbs(ips_ha_t *, int);
268 static int ips_allocatescbs(ips_ha_t *);
269 static int ips_reset_copperhead(ips_ha_t *);
270 static int ips_reset_copperhead_memio(ips_ha_t *);
271 static int ips_reset_morpheus(ips_ha_t *);
272 static int ips_issue_copperhead(ips_ha_t *, ips_scb_t *);
273 static int ips_issue_copperhead_memio(ips_ha_t *, ips_scb_t *);
274 static int ips_issue_i2o(ips_ha_t *, ips_scb_t *);
275 static int ips_issue_i2o_memio(ips_ha_t *, ips_scb_t *);
276 static int ips_isintr_copperhead(ips_ha_t *);
277 static int ips_isintr_copperhead_memio(ips_ha_t *);
278 static int ips_isintr_morpheus(ips_ha_t *);
279 static int ips_wait(ips_ha_t *, int, int);
280 static int ips_write_driver_status(ips_ha_t *, int);
281 static int ips_read_adapter_status(ips_ha_t *, int);
282 static int ips_read_subsystem_parameters(ips_ha_t *, int);
283 static int ips_read_config(ips_ha_t *, int);
284 static int ips_clear_adapter(ips_ha_t *, int);
285 static int ips_readwrite_page5(ips_ha_t *, int, int);
286 static int ips_init_copperhead(ips_ha_t *);
287 static int ips_init_copperhead_memio(ips_ha_t *);
288 static int ips_init_morpheus(ips_ha_t *);
289 static int ips_isinit_copperhead(ips_ha_t *);
290 static int ips_isinit_copperhead_memio(ips_ha_t *);
291 static int ips_isinit_morpheus(ips_ha_t *);
292 static int ips_erase_bios(ips_ha_t *);
293 static int ips_program_bios(ips_ha_t *, char *, uint32_t, uint32_t);
294 static int ips_verify_bios(ips_ha_t *, char *, uint32_t, uint32_t);
295 static int ips_erase_bios_memio(ips_ha_t *);
296 static int ips_program_bios_memio(ips_ha_t *, char *, uint32_t, uint32_t);
297 static int ips_verify_bios_memio(ips_ha_t *, char *, uint32_t, uint32_t);
298 static int ips_flash_copperhead(ips_ha_t *, ips_passthru_t *, ips_scb_t *);
299 static int ips_flash_bios(ips_ha_t *, ips_passthru_t *, ips_scb_t *);
300 static int ips_flash_firmware(ips_ha_t *, ips_passthru_t *, ips_scb_t *);
301 static void ips_free_flash_copperhead(ips_ha_t * ha);
302 static void ips_get_bios_version(ips_ha_t *, int);
303 static void ips_identify_controller(ips_ha_t *);
304 static void ips_chkstatus(ips_ha_t *, IPS_STATUS *);
305 static void ips_enable_int_copperhead(ips_ha_t *);
306 static void ips_enable_int_copperhead_memio(ips_ha_t *);
307 static void ips_enable_int_morpheus(ips_ha_t *);
308 static int ips_intr_copperhead(ips_ha_t *);
309 static int ips_intr_morpheus(ips_ha_t *);
310 static void ips_next(ips_ha_t *, int);
311 static void ipsintr_blocking(ips_ha_t *, struct ips_scb *);
312 static void ipsintr_done(ips_ha_t *, struct ips_scb *);
313 static void ips_done(ips_ha_t *, ips_scb_t *);
314 static void ips_free(ips_ha_t *);
315 static void ips_init_scb(ips_ha_t *, ips_scb_t *);
316 static void ips_freescb(ips_ha_t *, ips_scb_t *);
317 static void ips_setup_funclist(ips_ha_t *);
318 static void ips_statinit(ips_ha_t *);
319 static void ips_statinit_memio(ips_ha_t *);
320 static void ips_fix_ffdc_time(ips_ha_t *, ips_scb_t *, time_t);
321 static void ips_ffdc_reset(ips_ha_t *, int);
322 static void ips_ffdc_time(ips_ha_t *);
323 static uint32_t ips_statupd_copperhead(ips_ha_t *);
324 static uint32_t ips_statupd_copperhead_memio(ips_ha_t *);
325 static uint32_t ips_statupd_morpheus(ips_ha_t *);
326 static ips_scb_t *ips_getscb(ips_ha_t *);
327 static void ips_putq_scb_head(ips_scb_queue_t *, ips_scb_t *);
328 static void ips_putq_wait_tail(ips_wait_queue_t *, Scsi_Cmnd *);
329 static void ips_putq_copp_tail(ips_copp_queue_t *,
330 ips_copp_wait_item_t *);
331 static ips_scb_t *ips_removeq_scb_head(ips_scb_queue_t *);
332 static ips_scb_t *ips_removeq_scb(ips_scb_queue_t *, ips_scb_t *);
333 static Scsi_Cmnd *ips_removeq_wait_head(ips_wait_queue_t *);
334 static Scsi_Cmnd *ips_removeq_wait(ips_wait_queue_t *, Scsi_Cmnd *);
335 static ips_copp_wait_item_t *ips_removeq_copp(ips_copp_queue_t *,
336 ips_copp_wait_item_t *);
337 static ips_copp_wait_item_t *ips_removeq_copp_head(ips_copp_queue_t *);
339 static int ips_is_passthru(Scsi_Cmnd *);
340 static int ips_make_passthru(ips_ha_t *, Scsi_Cmnd *, ips_scb_t *, int);
341 static int ips_usrcmd(ips_ha_t *, ips_passthru_t *, ips_scb_t *);
342 static void ips_cleanup_passthru(ips_ha_t *, ips_scb_t *);
343 static void ips_scmd_buf_write(Scsi_Cmnd * scmd, void *data,
344 unsigned int count);
345 static void ips_scmd_buf_read(Scsi_Cmnd * scmd, void *data, unsigned int count);
347 static int ips_proc_info(struct Scsi_Host *, char *, char **, off_t, int, int);
348 static int ips_host_info(ips_ha_t *, char *, off_t, int);
349 static void copy_mem_info(IPS_INFOSTR *, char *, int);
350 static int copy_info(IPS_INFOSTR *, char *, ...);
351 static int ips_get_version_info(ips_ha_t * ha, dma_addr_t, int intr);
352 static void ips_version_check(ips_ha_t * ha, int intr);
353 static int ips_abort_init(ips_ha_t * ha, int index);
354 static int ips_init_phase2(int index);
356 static int ips_init_phase1(struct pci_dev *pci_dev, int *indexPtr);
357 static int ips_register_scsi(int index);
360 * global variables
362 static const char ips_name[] = "ips";
363 static struct Scsi_Host *ips_sh[IPS_MAX_ADAPTERS]; /* Array of host controller structures */
364 static ips_ha_t *ips_ha[IPS_MAX_ADAPTERS]; /* Array of HA structures */
365 static unsigned int ips_next_controller;
366 static unsigned int ips_num_controllers;
367 static unsigned int ips_released_controllers;
368 static int ips_hotplug;
369 static int ips_cmd_timeout = 60;
370 static int ips_reset_timeout = 60 * 5;
371 static int ips_force_memio = 1; /* Always use Memory Mapped I/O */
372 static int ips_force_i2o = 1; /* Always use I2O command delivery */
373 static int ips_ioctlsize = IPS_IOCTL_SIZE; /* Size of the ioctl buffer */
374 static int ips_cd_boot; /* Booting from Manager CD */
375 static char *ips_FlashData = NULL; /* CD Boot - Flash Data Buffer */
376 static dma_addr_t ips_flashbusaddr;
377 static long ips_FlashDataInUse; /* CD Boot - Flash Data In Use Flag */
378 static uint32_t MaxLiteCmds = 32; /* Max Active Cmds for a Lite Adapter */
379 static Scsi_Host_Template ips_driver_template = {
380 .detect = ips_detect,
381 .release = ips_release,
382 .info = ips_info,
383 .queuecommand = ips_queue,
384 .eh_abort_handler = ips_eh_abort,
385 .eh_host_reset_handler = ips_eh_reset,
386 .proc_name = "ips",
387 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
388 .proc_info = ips_proc_info,
389 .slave_configure = ips_slave_configure,
390 #else
391 .proc_info = ips_proc24_info,
392 .select_queue_depths = ips_select_queue_depth,
393 #endif
394 .bios_param = ips_biosparam,
395 .this_id = -1,
396 .sg_tablesize = IPS_MAX_SG,
397 .cmd_per_lun = 3,
398 .use_clustering = ENABLE_CLUSTERING,
399 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
400 .use_new_eh_code = 1,
401 #endif
402 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20) && LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
403 .highmem_io = 1,
404 #endif
407 static IPS_DEFINE_COMPAT_TABLE( Compatable ); /* Version Compatability Table */
410 /* This table describes all ServeRAID Adapters */
411 static struct pci_device_id ips_pci_table[] = {
412 { 0x1014, 0x002E, PCI_ANY_ID, PCI_ANY_ID, 0, 0 },
413 { 0x1014, 0x01BD, PCI_ANY_ID, PCI_ANY_ID, 0, 0 },
414 { 0x9005, 0x0250, PCI_ANY_ID, PCI_ANY_ID, 0, 0 },
415 { 0, }
418 MODULE_DEVICE_TABLE( pci, ips_pci_table );
420 static char ips_hot_plug_name[] = "ips";
422 static int __devinit ips_insert_device(struct pci_dev *pci_dev, const struct pci_device_id *ent);
423 static void __devexit ips_remove_device(struct pci_dev *pci_dev);
425 static struct pci_driver ips_pci_driver = {
426 .name = ips_hot_plug_name,
427 .id_table = ips_pci_table,
428 .probe = ips_insert_device,
429 .remove = __devexit_p(ips_remove_device),
434 * Necessary forward function protoypes
436 static int ips_halt(struct notifier_block *nb, ulong event, void *buf);
438 #define MAX_ADAPTER_NAME 15
440 static char ips_adapter_name[][30] = {
441 "ServeRAID",
442 "ServeRAID II",
443 "ServeRAID on motherboard",
444 "ServeRAID on motherboard",
445 "ServeRAID 3H",
446 "ServeRAID 3L",
447 "ServeRAID 4H",
448 "ServeRAID 4M",
449 "ServeRAID 4L",
450 "ServeRAID 4Mx",
451 "ServeRAID 4Lx",
452 "ServeRAID 5i",
453 "ServeRAID 5i",
454 "ServeRAID 6M",
455 "ServeRAID 6i",
456 "ServeRAID 7t",
457 "ServeRAID 7k",
458 "ServeRAID 7M"
461 static struct notifier_block ips_notifier = {
462 ips_halt, NULL, 0
466 * Direction table
468 static char ips_command_direction[] = {
469 IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_OUT,
470 IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_UNK,
471 IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
472 IPS_DATA_IN, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_OUT,
473 IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_OUT,
474 IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_OUT,
475 IPS_DATA_NONE, IPS_DATA_UNK, IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_IN,
476 IPS_DATA_UNK, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_UNK,
477 IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_NONE, IPS_DATA_UNK,
478 IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT,
479 IPS_DATA_OUT, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_NONE, IPS_DATA_NONE,
480 IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT,
481 IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_OUT,
482 IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_NONE,
483 IPS_DATA_UNK, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_UNK,
484 IPS_DATA_NONE, IPS_DATA_OUT, IPS_DATA_IN, 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_OUT, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
487 IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
488 IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
489 IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
490 IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
491 IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
492 IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
493 IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
494 IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
495 IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
496 IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
497 IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
498 IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
499 IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
500 IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
501 IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
502 IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_UNK, IPS_DATA_IN, IPS_DATA_NONE,
503 IPS_DATA_OUT, IPS_DATA_UNK, IPS_DATA_NONE, IPS_DATA_UNK, IPS_DATA_OUT,
504 IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_NONE,
505 IPS_DATA_UNK, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_IN,
506 IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
507 IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
508 IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
509 IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
510 IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
511 IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
512 IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
513 IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
514 IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
515 IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_OUT,
516 IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
517 IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
518 IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK,
519 IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK
523 /****************************************************************************/
524 /* */
525 /* Routine Name: ips_setup */
526 /* */
527 /* Routine Description: */
528 /* */
529 /* setup parameters to the driver */
530 /* */
531 /****************************************************************************/
532 static int
533 ips_setup(char *ips_str)
536 int i;
537 char *key;
538 char *value;
539 IPS_OPTION options[] = {
540 {"noi2o", &ips_force_i2o, 0},
541 {"nommap", &ips_force_memio, 0},
542 {"ioctlsize", &ips_ioctlsize, IPS_IOCTL_SIZE},
543 {"cdboot", &ips_cd_boot, 0},
544 {"maxcmds", &MaxLiteCmds, 32},
547 /* Don't use strtok() anymore ( if 2.4 Kernel or beyond ) */
548 /* Search for value */
549 while ((key = strsep(&ips_str, ",."))) {
550 if (!*key)
551 continue;
552 value = strchr(key, ':');
553 if (value)
554 *value++ = '\0';
556 * We now have key/value pairs.
557 * Update the variables
559 for (i = 0; i < (sizeof (options) / sizeof (options[0])); i++) {
560 if (strnicmp
561 (key, options[i].option_name,
562 strlen(options[i].option_name)) == 0) {
563 if (value)
564 *options[i].option_flag =
565 simple_strtoul(value, NULL, 0);
566 else
567 *options[i].option_flag =
568 options[i].option_value;
569 break;
574 return (1);
577 __setup("ips=", ips_setup);
579 /****************************************************************************/
580 /* */
581 /* Routine Name: ips_detect */
582 /* */
583 /* Routine Description: */
584 /* */
585 /* Detect and initialize the driver */
586 /* */
587 /* NOTE: this routine is called under the io_request_lock spinlock */
588 /* */
589 /****************************************************************************/
590 static int
591 ips_detect(Scsi_Host_Template * SHT)
593 int i;
595 METHOD_TRACE("ips_detect", 1);
597 #ifdef MODULE
598 if (ips)
599 ips_setup(ips);
600 #endif
602 for (i = 0; i < ips_num_controllers; i++) {
603 if (ips_register_scsi(i))
604 ips_free(ips_ha[i]);
605 ips_released_controllers++;
607 ips_hotplug = 1;
608 return (ips_num_controllers);
611 /****************************************************************************/
612 /* configure the function pointers to use the functions that will work */
613 /* with the found version of the adapter */
614 /****************************************************************************/
615 static void
616 ips_setup_funclist(ips_ha_t * ha)
620 * Setup Functions
622 if (IPS_IS_MORPHEUS(ha) || IPS_IS_MARCO(ha)) {
623 /* morpheus / marco / sebring */
624 ha->func.isintr = ips_isintr_morpheus;
625 ha->func.isinit = ips_isinit_morpheus;
626 ha->func.issue = ips_issue_i2o_memio;
627 ha->func.init = ips_init_morpheus;
628 ha->func.statupd = ips_statupd_morpheus;
629 ha->func.reset = ips_reset_morpheus;
630 ha->func.intr = ips_intr_morpheus;
631 ha->func.enableint = ips_enable_int_morpheus;
632 } else if (IPS_USE_MEMIO(ha)) {
633 /* copperhead w/MEMIO */
634 ha->func.isintr = ips_isintr_copperhead_memio;
635 ha->func.isinit = ips_isinit_copperhead_memio;
636 ha->func.init = ips_init_copperhead_memio;
637 ha->func.statupd = ips_statupd_copperhead_memio;
638 ha->func.statinit = ips_statinit_memio;
639 ha->func.reset = ips_reset_copperhead_memio;
640 ha->func.intr = ips_intr_copperhead;
641 ha->func.erasebios = ips_erase_bios_memio;
642 ha->func.programbios = ips_program_bios_memio;
643 ha->func.verifybios = ips_verify_bios_memio;
644 ha->func.enableint = ips_enable_int_copperhead_memio;
645 if (IPS_USE_I2O_DELIVER(ha))
646 ha->func.issue = ips_issue_i2o_memio;
647 else
648 ha->func.issue = ips_issue_copperhead_memio;
649 } else {
650 /* copperhead */
651 ha->func.isintr = ips_isintr_copperhead;
652 ha->func.isinit = ips_isinit_copperhead;
653 ha->func.init = ips_init_copperhead;
654 ha->func.statupd = ips_statupd_copperhead;
655 ha->func.statinit = ips_statinit;
656 ha->func.reset = ips_reset_copperhead;
657 ha->func.intr = ips_intr_copperhead;
658 ha->func.erasebios = ips_erase_bios;
659 ha->func.programbios = ips_program_bios;
660 ha->func.verifybios = ips_verify_bios;
661 ha->func.enableint = ips_enable_int_copperhead;
663 if (IPS_USE_I2O_DELIVER(ha))
664 ha->func.issue = ips_issue_i2o;
665 else
666 ha->func.issue = ips_issue_copperhead;
670 /****************************************************************************/
671 /* */
672 /* Routine Name: ips_release */
673 /* */
674 /* Routine Description: */
675 /* */
676 /* Remove a driver */
677 /* */
678 /****************************************************************************/
679 static int
680 ips_release(struct Scsi_Host *sh)
682 ips_scb_t *scb;
683 ips_ha_t *ha;
684 int i;
686 METHOD_TRACE("ips_release", 1);
688 for (i = 0; i < IPS_MAX_ADAPTERS && ips_sh[i] != sh; i++) ;
690 if (i == IPS_MAX_ADAPTERS) {
691 printk(KERN_WARNING
692 "(%s) release, invalid Scsi_Host pointer.\n", ips_name);
693 BUG();
694 return (FALSE);
697 ha = IPS_HA(sh);
699 if (!ha)
700 return (FALSE);
702 /* flush the cache on the controller */
703 scb = &ha->scbs[ha->max_cmds - 1];
705 ips_init_scb(ha, scb);
707 scb->timeout = ips_cmd_timeout;
708 scb->cdb[0] = IPS_CMD_FLUSH;
710 scb->cmd.flush_cache.op_code = IPS_CMD_FLUSH;
711 scb->cmd.flush_cache.command_id = IPS_COMMAND_ID(ha, scb);
712 scb->cmd.flush_cache.state = IPS_NORM_STATE;
713 scb->cmd.flush_cache.reserved = 0;
714 scb->cmd.flush_cache.reserved2 = 0;
715 scb->cmd.flush_cache.reserved3 = 0;
716 scb->cmd.flush_cache.reserved4 = 0;
718 IPS_PRINTK(KERN_WARNING, ha->pcidev, "Flushing Cache.\n");
720 /* send command */
721 if (ips_send_wait(ha, scb, ips_cmd_timeout, IPS_INTR_ON) == IPS_FAILURE)
722 IPS_PRINTK(KERN_WARNING, ha->pcidev, "Incomplete Flush.\n");
724 IPS_PRINTK(KERN_WARNING, ha->pcidev, "Flushing Complete.\n");
726 ips_sh[i] = NULL;
727 ips_ha[i] = NULL;
729 /* free extra memory */
730 ips_free(ha);
732 /* Free I/O Region */
733 if (ha->io_addr)
734 release_region(ha->io_addr, ha->io_len);
736 /* free IRQ */
737 free_irq(ha->irq, ha);
739 IPS_REMOVE_HOST(sh);
740 scsi_host_put(sh);
742 ips_released_controllers++;
744 return (FALSE);
747 /****************************************************************************/
748 /* */
749 /* Routine Name: ips_halt */
750 /* */
751 /* Routine Description: */
752 /* */
753 /* Perform cleanup when the system reboots */
754 /* */
755 /****************************************************************************/
756 static int
757 ips_halt(struct notifier_block *nb, ulong event, void *buf)
759 ips_scb_t *scb;
760 ips_ha_t *ha;
761 int i;
763 if ((event != SYS_RESTART) && (event != SYS_HALT) &&
764 (event != SYS_POWER_OFF))
765 return (NOTIFY_DONE);
767 for (i = 0; i < ips_next_controller; i++) {
768 ha = (ips_ha_t *) ips_ha[i];
770 if (!ha)
771 continue;
773 if (!ha->active)
774 continue;
776 /* flush the cache on the controller */
777 scb = &ha->scbs[ha->max_cmds - 1];
779 ips_init_scb(ha, scb);
781 scb->timeout = ips_cmd_timeout;
782 scb->cdb[0] = IPS_CMD_FLUSH;
784 scb->cmd.flush_cache.op_code = IPS_CMD_FLUSH;
785 scb->cmd.flush_cache.command_id = IPS_COMMAND_ID(ha, scb);
786 scb->cmd.flush_cache.state = IPS_NORM_STATE;
787 scb->cmd.flush_cache.reserved = 0;
788 scb->cmd.flush_cache.reserved2 = 0;
789 scb->cmd.flush_cache.reserved3 = 0;
790 scb->cmd.flush_cache.reserved4 = 0;
792 IPS_PRINTK(KERN_WARNING, ha->pcidev, "Flushing Cache.\n");
794 /* send command */
795 if (ips_send_wait(ha, scb, ips_cmd_timeout, IPS_INTR_ON) ==
796 IPS_FAILURE)
797 IPS_PRINTK(KERN_WARNING, ha->pcidev,
798 "Incomplete Flush.\n");
799 else
800 IPS_PRINTK(KERN_WARNING, ha->pcidev,
801 "Flushing Complete.\n");
804 return (NOTIFY_OK);
807 /****************************************************************************/
808 /* */
809 /* Routine Name: ips_eh_abort */
810 /* */
811 /* Routine Description: */
812 /* */
813 /* Abort a command (using the new error code stuff) */
814 /* Note: this routine is called under the io_request_lock */
815 /****************************************************************************/
817 ips_eh_abort(Scsi_Cmnd * SC)
819 ips_ha_t *ha;
820 ips_copp_wait_item_t *item;
821 int ret;
822 unsigned long cpu_flags;
823 struct Scsi_Host *host;
825 METHOD_TRACE("ips_eh_abort", 1);
827 if (!SC)
828 return (FAILED);
830 host = SC->device->host;
831 ha = (ips_ha_t *) SC->device->host->hostdata;
833 if (!ha)
834 return (FAILED);
836 if (!ha->active)
837 return (FAILED);
839 IPS_LOCK_SAVE(host->host_lock, cpu_flags);
841 /* See if the command is on the copp queue */
842 item = ha->copp_waitlist.head;
843 while ((item) && (item->scsi_cmd != SC))
844 item = item->next;
846 if (item) {
847 /* Found it */
848 ips_removeq_copp(&ha->copp_waitlist, item);
849 ret = (SUCCESS);
851 /* See if the command is on the wait queue */
852 } else if (ips_removeq_wait(&ha->scb_waitlist, SC)) {
853 /* command not sent yet */
854 ret = (SUCCESS);
855 } else {
856 /* command must have already been sent */
857 ret = (FAILED);
860 IPS_UNLOCK_RESTORE(host->host_lock, cpu_flags);
861 return ret;
864 /****************************************************************************/
865 /* */
866 /* Routine Name: ips_eh_reset */
867 /* */
868 /* Routine Description: */
869 /* */
870 /* Reset the controller (with new eh error code) */
871 /* */
872 /* NOTE: this routine is called under the io_request_lock spinlock */
873 /* */
874 /****************************************************************************/
875 static int
876 __ips_eh_reset(Scsi_Cmnd * SC)
878 int ret;
879 int i;
880 ips_ha_t *ha;
881 ips_scb_t *scb;
882 ips_copp_wait_item_t *item;
884 METHOD_TRACE("ips_eh_reset", 1);
886 #ifdef NO_IPS_RESET
887 return (FAILED);
888 #else
890 if (!SC) {
891 DEBUG(1, "Reset called with NULL scsi command");
893 return (FAILED);
896 ha = (ips_ha_t *) SC->device->host->hostdata;
898 if (!ha) {
899 DEBUG(1, "Reset called with NULL ha struct");
901 return (FAILED);
904 if (!ha->active)
905 return (FAILED);
907 /* See if the command is on the copp queue */
908 item = ha->copp_waitlist.head;
909 while ((item) && (item->scsi_cmd != SC))
910 item = item->next;
912 if (item) {
913 /* Found it */
914 ips_removeq_copp(&ha->copp_waitlist, item);
915 return (SUCCESS);
918 /* See if the command is on the wait queue */
919 if (ips_removeq_wait(&ha->scb_waitlist, SC)) {
920 /* command not sent yet */
921 return (SUCCESS);
924 /* An explanation for the casual observer: */
925 /* Part of the function of a RAID controller is automatic error */
926 /* detection and recovery. As such, the only problem that physically */
927 /* resetting an adapter will ever fix is when, for some reason, */
928 /* the driver is not successfully communicating with the adapter. */
929 /* Therefore, we will attempt to flush this adapter. If that succeeds, */
930 /* then there's no real purpose in a physical reset. This will complete */
931 /* much faster and avoids any problems that might be caused by a */
932 /* physical reset ( such as having to fail all the outstanding I/O's ). */
934 if (ha->ioctl_reset == 0) { /* IF Not an IOCTL Requested Reset */
935 scb = &ha->scbs[ha->max_cmds - 1];
937 ips_init_scb(ha, scb);
939 scb->timeout = ips_cmd_timeout;
940 scb->cdb[0] = IPS_CMD_FLUSH;
942 scb->cmd.flush_cache.op_code = IPS_CMD_FLUSH;
943 scb->cmd.flush_cache.command_id = IPS_COMMAND_ID(ha, scb);
944 scb->cmd.flush_cache.state = IPS_NORM_STATE;
945 scb->cmd.flush_cache.reserved = 0;
946 scb->cmd.flush_cache.reserved2 = 0;
947 scb->cmd.flush_cache.reserved3 = 0;
948 scb->cmd.flush_cache.reserved4 = 0;
950 /* Attempt the flush command */
951 ret = ips_send_wait(ha, scb, ips_cmd_timeout, IPS_INTR_IORL);
952 if (ret == IPS_SUCCESS) {
953 IPS_PRINTK(KERN_NOTICE, ha->pcidev,
954 "Reset Request - Flushed Cache\n");
955 return (SUCCESS);
959 /* Either we can't communicate with the adapter or it's an IOCTL request */
960 /* from a utility. A physical reset is needed at this point. */
962 ha->ioctl_reset = 0; /* Reset the IOCTL Requested Reset Flag */
965 * command must have already been sent
966 * reset the controller
968 IPS_PRINTK(KERN_NOTICE, ha->pcidev, "Resetting controller.\n");
969 ret = (*ha->func.reset) (ha);
971 if (!ret) {
972 Scsi_Cmnd *scsi_cmd;
974 IPS_PRINTK(KERN_NOTICE, ha->pcidev,
975 "Controller reset failed - controller now offline.\n");
977 /* Now fail all of the active commands */
978 DEBUG_VAR(1, "(%s%d) Failing active commands",
979 ips_name, ha->host_num);
981 while ((scb = ips_removeq_scb_head(&ha->scb_activelist))) {
982 scb->scsi_cmd->result = DID_ERROR << 16;
983 scb->scsi_cmd->scsi_done(scb->scsi_cmd);
984 ips_freescb(ha, scb);
987 /* Now fail all of the pending commands */
988 DEBUG_VAR(1, "(%s%d) Failing pending commands",
989 ips_name, ha->host_num);
991 while ((scsi_cmd = ips_removeq_wait_head(&ha->scb_waitlist))) {
992 scsi_cmd->result = DID_ERROR;
993 scsi_cmd->scsi_done(scsi_cmd);
996 ha->active = FALSE;
997 return (FAILED);
1000 if (!ips_clear_adapter(ha, IPS_INTR_IORL)) {
1001 Scsi_Cmnd *scsi_cmd;
1003 IPS_PRINTK(KERN_NOTICE, ha->pcidev,
1004 "Controller reset failed - controller now offline.\n");
1006 /* Now fail all of the active commands */
1007 DEBUG_VAR(1, "(%s%d) Failing active commands",
1008 ips_name, ha->host_num);
1010 while ((scb = ips_removeq_scb_head(&ha->scb_activelist))) {
1011 scb->scsi_cmd->result = DID_ERROR << 16;
1012 scb->scsi_cmd->scsi_done(scb->scsi_cmd);
1013 ips_freescb(ha, scb);
1016 /* Now fail all of the pending commands */
1017 DEBUG_VAR(1, "(%s%d) Failing pending commands",
1018 ips_name, ha->host_num);
1020 while ((scsi_cmd = ips_removeq_wait_head(&ha->scb_waitlist))) {
1021 scsi_cmd->result = DID_ERROR << 16;
1022 scsi_cmd->scsi_done(scsi_cmd);
1025 ha->active = FALSE;
1026 return (FAILED);
1029 /* FFDC */
1030 if (le32_to_cpu(ha->subsys->param[3]) & 0x300000) {
1031 struct timeval tv;
1033 do_gettimeofday(&tv);
1034 ha->last_ffdc = tv.tv_sec;
1035 ha->reset_count++;
1036 ips_ffdc_reset(ha, IPS_INTR_IORL);
1039 /* Now fail all of the active commands */
1040 DEBUG_VAR(1, "(%s%d) Failing active commands", ips_name, ha->host_num);
1042 while ((scb = ips_removeq_scb_head(&ha->scb_activelist))) {
1043 scb->scsi_cmd->result =
1044 (DID_RESET << 16) | (SUGGEST_RETRY << 24);
1045 scb->scsi_cmd->scsi_done(scb->scsi_cmd);
1046 ips_freescb(ha, scb);
1049 /* Reset DCDB active command bits */
1050 for (i = 1; i < ha->nbus; i++)
1051 ha->dcdb_active[i - 1] = 0;
1053 /* Reset the number of active IOCTLs */
1054 ha->num_ioctl = 0;
1056 ips_next(ha, IPS_INTR_IORL);
1058 return (SUCCESS);
1059 #endif /* NO_IPS_RESET */
1063 static int
1064 ips_eh_reset(Scsi_Cmnd * SC)
1066 int rc;
1068 spin_lock_irq(SC->device->host->host_lock);
1069 rc = __ips_eh_reset(SC);
1070 spin_unlock_irq(SC->device->host->host_lock);
1072 return rc;
1075 /****************************************************************************/
1076 /* */
1077 /* Routine Name: ips_queue */
1078 /* */
1079 /* Routine Description: */
1080 /* */
1081 /* Send a command to the controller */
1082 /* */
1083 /* NOTE: */
1084 /* Linux obtains io_request_lock before calling this function */
1085 /* */
1086 /****************************************************************************/
1087 static int
1088 ips_queue(Scsi_Cmnd * SC, void (*done) (Scsi_Cmnd *))
1090 ips_ha_t *ha;
1091 ips_passthru_t *pt;
1093 METHOD_TRACE("ips_queue", 1);
1095 ha = (ips_ha_t *) SC->device->host->hostdata;
1097 if (!ha)
1098 return (1);
1100 if (!ha->active)
1101 return (DID_ERROR);
1103 if (ips_is_passthru(SC)) {
1104 if (ha->copp_waitlist.count == IPS_MAX_IOCTL_QUEUE) {
1105 SC->result = DID_BUS_BUSY << 16;
1106 done(SC);
1108 return (0);
1110 } else if (ha->scb_waitlist.count == IPS_MAX_QUEUE) {
1111 SC->result = DID_BUS_BUSY << 16;
1112 done(SC);
1114 return (0);
1117 SC->scsi_done = done;
1119 DEBUG_VAR(2, "(%s%d): ips_queue: cmd 0x%X (%d %d %d)",
1120 ips_name,
1121 ha->host_num,
1122 SC->cmnd[0],
1123 SC->device->channel, SC->device->id, SC->device->lun);
1125 /* Check for command to initiator IDs */
1126 if ((SC->device->channel > 0)
1127 && (SC->device->id == ha->ha_id[SC->device->channel])) {
1128 SC->result = DID_NO_CONNECT << 16;
1129 done(SC);
1131 return (0);
1134 if (ips_is_passthru(SC)) {
1136 ips_copp_wait_item_t *scratch;
1138 /* A Reset IOCTL is only sent by the boot CD in extreme cases. */
1139 /* There can never be any system activity ( network or disk ), but check */
1140 /* anyway just as a good practice. */
1141 pt = (ips_passthru_t *) SC->request_buffer;
1142 if ((pt->CoppCP.cmd.reset.op_code == IPS_CMD_RESET_CHANNEL) &&
1143 (pt->CoppCP.cmd.reset.adapter_flag == 1)) {
1144 if (ha->scb_activelist.count != 0) {
1145 SC->result = DID_BUS_BUSY << 16;
1146 done(SC);
1147 return (0);
1149 ha->ioctl_reset = 1; /* This reset request is from an IOCTL */
1150 ips_eh_reset(SC);
1151 SC->result = DID_OK << 16;
1152 SC->scsi_done(SC);
1153 return (0);
1156 /* allocate space for the scribble */
1157 scratch = kmalloc(sizeof (ips_copp_wait_item_t), GFP_ATOMIC);
1159 if (!scratch) {
1160 SC->result = DID_ERROR << 16;
1161 done(SC);
1163 return (0);
1166 scratch->scsi_cmd = SC;
1167 scratch->next = NULL;
1169 ips_putq_copp_tail(&ha->copp_waitlist, scratch);
1170 } else {
1171 ips_putq_wait_tail(&ha->scb_waitlist, SC);
1174 ips_next(ha, IPS_INTR_IORL);
1176 return (0);
1179 /****************************************************************************/
1180 /* */
1181 /* Routine Name: ips_biosparam */
1182 /* */
1183 /* Routine Description: */
1184 /* */
1185 /* Set bios geometry for the controller */
1186 /* */
1187 /****************************************************************************/
1188 static int
1189 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
1190 ips_biosparam(Disk * disk, kdev_t dev, int geom[])
1192 ips_ha_t *ha = (ips_ha_t *) disk->device->host->hostdata;
1193 unsigned long capacity = disk->capacity;
1194 #else
1195 ips_biosparam(struct scsi_device *sdev, struct block_device *bdev,
1196 sector_t capacity, int geom[])
1198 ips_ha_t *ha = (ips_ha_t *) sdev->host->hostdata;
1199 #endif
1200 int heads;
1201 int sectors;
1202 int cylinders;
1204 METHOD_TRACE("ips_biosparam", 1);
1206 if (!ha)
1207 /* ?!?! host adater info invalid */
1208 return (0);
1210 if (!ha->active)
1211 return (0);
1213 if (!ips_read_adapter_status(ha, IPS_INTR_ON))
1214 /* ?!?! Enquiry command failed */
1215 return (0);
1217 if ((capacity > 0x400000) && ((ha->enq->ucMiscFlag & 0x8) == 0)) {
1218 heads = IPS_NORM_HEADS;
1219 sectors = IPS_NORM_SECTORS;
1220 } else {
1221 heads = IPS_COMP_HEADS;
1222 sectors = IPS_COMP_SECTORS;
1225 cylinders = (unsigned long) capacity / (heads * sectors);
1227 DEBUG_VAR(2, "Geometry: heads: %d, sectors: %d, cylinders: %d",
1228 heads, sectors, cylinders);
1230 geom[0] = heads;
1231 geom[1] = sectors;
1232 geom[2] = cylinders;
1234 return (0);
1237 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
1239 /* ips_proc24_info is a wrapper around ips_proc_info *
1240 * for compatibility with the 2.4 scsi parameters */
1241 static int
1242 ips_proc24_info(char *buffer, char **start, off_t offset, int length,
1243 int hostno, int func)
1245 int i;
1247 for (i = 0; i < ips_next_controller; i++) {
1248 if (ips_sh[i] && ips_sh[i]->host_no == hostno) {
1249 return ips_proc_info(ips_sh[i], buffer, start,
1250 offset, length, func);
1253 return -EINVAL;
1256 /****************************************************************************/
1257 /* */
1258 /* Routine Name: ips_select_queue_depth */
1259 /* */
1260 /* Routine Description: */
1261 /* */
1262 /* Select queue depths for the devices on the contoller */
1263 /* */
1264 /****************************************************************************/
1265 static void
1266 ips_select_queue_depth(struct Scsi_Host *host, Scsi_Device * scsi_devs)
1268 Scsi_Device *device;
1269 ips_ha_t *ha;
1270 int count = 0;
1271 int min;
1273 ha = IPS_HA(host);
1274 min = ha->max_cmds / 4;
1276 for (device = scsi_devs; device; device = device->next) {
1277 if (device->host == host) {
1278 if ((device->channel == 0) && (device->type == 0))
1279 count++;
1283 for (device = scsi_devs; device; device = device->next) {
1284 if (device->host == host) {
1285 if ((device->channel == 0) && (device->type == 0)) {
1286 device->queue_depth =
1287 (ha->max_cmds - 1) / count;
1288 if (device->queue_depth < min)
1289 device->queue_depth = min;
1290 } else {
1291 device->queue_depth = 2;
1294 if (device->queue_depth < 2)
1295 device->queue_depth = 2;
1300 #else
1301 /****************************************************************************/
1302 /* */
1303 /* Routine Name: ips_slave_configure */
1304 /* */
1305 /* Routine Description: */
1306 /* */
1307 /* Set queue depths on devices once scan is complete */
1308 /* */
1309 /****************************************************************************/
1310 static int
1311 ips_slave_configure(Scsi_Device * SDptr)
1313 ips_ha_t *ha;
1314 int min;
1316 ha = IPS_HA(SDptr->host);
1317 if (SDptr->tagged_supported && SDptr->type == TYPE_DISK) {
1318 min = ha->max_cmds / 2;
1319 if (ha->enq->ucLogDriveCount <= 2)
1320 min = ha->max_cmds - 1;
1321 scsi_adjust_queue_depth(SDptr, MSG_ORDERED_TAG, min);
1323 return 0;
1325 #endif
1327 /****************************************************************************/
1328 /* */
1329 /* Routine Name: do_ipsintr */
1330 /* */
1331 /* Routine Description: */
1332 /* */
1333 /* Wrapper for the interrupt handler */
1334 /* */
1335 /****************************************************************************/
1336 static irqreturn_t
1337 do_ipsintr(int irq, void *dev_id, struct pt_regs * regs)
1339 ips_ha_t *ha;
1340 unsigned long cpu_flags;
1341 struct Scsi_Host *host;
1342 int irqstatus;
1344 METHOD_TRACE("do_ipsintr", 2);
1346 ha = (ips_ha_t *) dev_id;
1347 if (!ha)
1348 return IRQ_NONE;
1349 host = ips_sh[ha->host_num];
1350 /* interrupt during initialization */
1351 if (!host) {
1352 (*ha->func.intr) (ha);
1353 return IRQ_HANDLED;
1356 IPS_LOCK_SAVE(host->host_lock, cpu_flags);
1358 if (!ha->active) {
1359 IPS_UNLOCK_RESTORE(host->host_lock, cpu_flags);
1360 return IRQ_HANDLED;
1363 irqstatus = (*ha->func.intr) (ha);
1365 IPS_UNLOCK_RESTORE(host->host_lock, cpu_flags);
1367 /* start the next command */
1368 ips_next(ha, IPS_INTR_ON);
1369 return IRQ_RETVAL(irqstatus);
1372 /****************************************************************************/
1373 /* */
1374 /* Routine Name: ips_intr_copperhead */
1375 /* */
1376 /* Routine Description: */
1377 /* */
1378 /* Polling interrupt handler */
1379 /* */
1380 /* ASSUMES interrupts are disabled */
1381 /* */
1382 /****************************************************************************/
1384 ips_intr_copperhead(ips_ha_t * ha)
1386 ips_stat_t *sp;
1387 ips_scb_t *scb;
1388 IPS_STATUS cstatus;
1389 int intrstatus;
1391 METHOD_TRACE("ips_intr", 2);
1393 if (!ha)
1394 return 0;
1396 if (!ha->active)
1397 return 0;
1399 intrstatus = (*ha->func.isintr) (ha);
1401 if (!intrstatus) {
1403 * Unexpected/Shared interrupt
1406 return 0;
1409 while (TRUE) {
1410 sp = &ha->sp;
1412 intrstatus = (*ha->func.isintr) (ha);
1414 if (!intrstatus)
1415 break;
1416 else
1417 cstatus.value = (*ha->func.statupd) (ha);
1419 if (cstatus.fields.command_id > (IPS_MAX_CMDS - 1)) {
1420 /* Spurious Interupt ? */
1421 continue;
1424 ips_chkstatus(ha, &cstatus);
1425 scb = (ips_scb_t *) sp->scb_addr;
1428 * use the callback function to finish things up
1429 * NOTE: interrupts are OFF for this
1431 (*scb->callback) (ha, scb);
1432 } /* end while */
1433 return 1;
1436 /****************************************************************************/
1437 /* */
1438 /* Routine Name: ips_intr_morpheus */
1439 /* */
1440 /* Routine Description: */
1441 /* */
1442 /* Polling interrupt handler */
1443 /* */
1444 /* ASSUMES interrupts are disabled */
1445 /* */
1446 /****************************************************************************/
1448 ips_intr_morpheus(ips_ha_t * ha)
1450 ips_stat_t *sp;
1451 ips_scb_t *scb;
1452 IPS_STATUS cstatus;
1453 int intrstatus;
1455 METHOD_TRACE("ips_intr_morpheus", 2);
1457 if (!ha)
1458 return 0;
1460 if (!ha->active)
1461 return 0;
1463 intrstatus = (*ha->func.isintr) (ha);
1465 if (!intrstatus) {
1467 * Unexpected/Shared interrupt
1470 return 0;
1473 while (TRUE) {
1474 sp = &ha->sp;
1476 intrstatus = (*ha->func.isintr) (ha);
1478 if (!intrstatus)
1479 break;
1480 else
1481 cstatus.value = (*ha->func.statupd) (ha);
1483 if (cstatus.value == 0xffffffff)
1484 /* No more to process */
1485 break;
1487 if (cstatus.fields.command_id > (IPS_MAX_CMDS - 1)) {
1488 IPS_PRINTK(KERN_WARNING, ha->pcidev,
1489 "Spurious interrupt; no ccb.\n");
1491 continue;
1494 ips_chkstatus(ha, &cstatus);
1495 scb = (ips_scb_t *) sp->scb_addr;
1498 * use the callback function to finish things up
1499 * NOTE: interrupts are OFF for this
1501 (*scb->callback) (ha, scb);
1502 } /* end while */
1503 return 1;
1506 /****************************************************************************/
1507 /* */
1508 /* Routine Name: ips_info */
1509 /* */
1510 /* Routine Description: */
1511 /* */
1512 /* Return info about the driver */
1513 /* */
1514 /****************************************************************************/
1515 static const char *
1516 ips_info(struct Scsi_Host *SH)
1518 static char buffer[256];
1519 char *bp;
1520 ips_ha_t *ha;
1522 METHOD_TRACE("ips_info", 1);
1524 ha = IPS_HA(SH);
1526 if (!ha)
1527 return (NULL);
1529 bp = &buffer[0];
1530 memset(bp, 0, sizeof (buffer));
1532 sprintf(bp, "%s%s%s Build %d", "IBM PCI ServeRAID ",
1533 IPS_VERSION_HIGH, IPS_VERSION_LOW, IPS_BUILD_IDENT);
1535 if (ha->ad_type > 0 && ha->ad_type <= MAX_ADAPTER_NAME) {
1536 strcat(bp, " <");
1537 strcat(bp, ips_adapter_name[ha->ad_type - 1]);
1538 strcat(bp, ">");
1541 return (bp);
1544 /****************************************************************************/
1545 /* */
1546 /* Routine Name: ips_proc_info */
1547 /* */
1548 /* Routine Description: */
1549 /* */
1550 /* The passthru interface for the driver */
1551 /* */
1552 /****************************************************************************/
1553 static int
1554 ips_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset,
1555 int length, int func)
1557 int i;
1558 int ret;
1559 ips_ha_t *ha = NULL;
1561 METHOD_TRACE("ips_proc_info", 1);
1563 /* Find our host structure */
1564 for (i = 0; i < ips_next_controller; i++) {
1565 if (ips_sh[i]) {
1566 if (ips_sh[i] == host) {
1567 ha = (ips_ha_t *) ips_sh[i]->hostdata;
1568 break;
1573 if (!ha)
1574 return (-EINVAL);
1576 if (func) {
1577 /* write */
1578 return (0);
1579 } else {
1580 /* read */
1581 if (start)
1582 *start = buffer;
1584 ret = ips_host_info(ha, buffer, offset, length);
1586 return (ret);
1590 /*--------------------------------------------------------------------------*/
1591 /* Helper Functions */
1592 /*--------------------------------------------------------------------------*/
1594 /****************************************************************************/
1595 /* */
1596 /* Routine Name: ips_is_passthru */
1597 /* */
1598 /* Routine Description: */
1599 /* */
1600 /* Determine if the specified SCSI command is really a passthru command */
1601 /* */
1602 /****************************************************************************/
1603 static int
1604 ips_is_passthru(Scsi_Cmnd * SC)
1606 METHOD_TRACE("ips_is_passthru", 1);
1608 if (!SC)
1609 return (0);
1611 if ((SC->cmnd[0] == IPS_IOCTL_COMMAND) &&
1612 (SC->device->channel == 0) &&
1613 (SC->device->id == IPS_ADAPTER_ID) &&
1614 (SC->device->lun == 0) && SC->request_buffer) {
1615 if ((!SC->use_sg) && SC->request_bufflen &&
1616 (((char *) SC->request_buffer)[0] == 'C') &&
1617 (((char *) SC->request_buffer)[1] == 'O') &&
1618 (((char *) SC->request_buffer)[2] == 'P') &&
1619 (((char *) SC->request_buffer)[3] == 'P'))
1620 return 1;
1621 else if (SC->use_sg) {
1622 struct scatterlist *sg = SC->request_buffer;
1623 char *buffer = IPS_SG_ADDRESS(sg);
1624 if (buffer && buffer[0] == 'C' && buffer[1] == 'O' &&
1625 buffer[2] == 'P' && buffer[3] == 'P')
1626 return 1;
1629 return 0;
1632 /****************************************************************************/
1633 /* */
1634 /* Routine Name: ips_alloc_passthru_buffer */
1635 /* */
1636 /* Routine Description: */
1637 /* allocate a buffer large enough for the ioctl data if the ioctl buffer */
1638 /* is too small or doesn't exist */
1639 /****************************************************************************/
1640 static int
1641 ips_alloc_passthru_buffer(ips_ha_t * ha, int length)
1643 void *bigger_buf;
1644 dma_addr_t dma_busaddr;
1646 if (ha->ioctl_data && length <= ha->ioctl_len)
1647 return 0;
1648 /* there is no buffer or it's not big enough, allocate a new one */
1649 bigger_buf = pci_alloc_consistent(ha->pcidev, length, &dma_busaddr);
1650 if (bigger_buf) {
1651 /* free the old memory */
1652 pci_free_consistent(ha->pcidev, ha->ioctl_len, ha->ioctl_data,
1653 ha->ioctl_busaddr);
1654 /* use the new memory */
1655 ha->ioctl_data = (char *) bigger_buf;
1656 ha->ioctl_len = length;
1657 ha->ioctl_busaddr = dma_busaddr;
1658 } else {
1659 return -1;
1661 return 0;
1664 /****************************************************************************/
1665 /* */
1666 /* Routine Name: ips_make_passthru */
1667 /* */
1668 /* Routine Description: */
1669 /* */
1670 /* Make a passthru command out of the info in the Scsi block */
1671 /* */
1672 /****************************************************************************/
1673 static int
1674 ips_make_passthru(ips_ha_t * ha, Scsi_Cmnd * SC, ips_scb_t * scb, int intr)
1676 ips_passthru_t *pt;
1677 int length = 0;
1678 int ret;
1680 METHOD_TRACE("ips_make_passthru", 1);
1682 if (!SC->use_sg) {
1683 length = SC->request_bufflen;
1684 } else {
1685 struct scatterlist *sg = SC->request_buffer;
1686 int i;
1687 for (i = 0; i < SC->use_sg; i++)
1688 length += sg[i].length;
1690 if (length < sizeof (ips_passthru_t)) {
1691 /* wrong size */
1692 DEBUG_VAR(1, "(%s%d) Passthru structure wrong size",
1693 ips_name, ha->host_num);
1694 return (IPS_FAILURE);
1696 if (ips_alloc_passthru_buffer(ha, length)) {
1697 /* allocation failure! If ha->ioctl_data exists, use it to return
1698 some error codes. Return a failed command to the scsi layer. */
1699 if (ha->ioctl_data) {
1700 pt = (ips_passthru_t *) ha->ioctl_data;
1701 ips_scmd_buf_read(SC, pt, sizeof (ips_passthru_t));
1702 pt->BasicStatus = 0x0B;
1703 pt->ExtendedStatus = 0x00;
1704 ips_scmd_buf_write(SC, pt, sizeof (ips_passthru_t));
1706 return IPS_FAILURE;
1708 ha->ioctl_datasize = length;
1710 ips_scmd_buf_read(SC, ha->ioctl_data, ha->ioctl_datasize);
1711 pt = (ips_passthru_t *) ha->ioctl_data;
1714 * Some notes about the passthru interface used
1716 * IF the scsi op_code == 0x0d then we assume
1717 * that the data came along with/goes with the
1718 * packet we received from the sg driver. In this
1719 * case the CmdBSize field of the pt structure is
1720 * used for the size of the buffer.
1723 switch (pt->CoppCmd) {
1724 case IPS_NUMCTRLS:
1725 memcpy(ha->ioctl_data + sizeof (ips_passthru_t),
1726 &ips_num_controllers, sizeof (int));
1727 ips_scmd_buf_write(SC, ha->ioctl_data,
1728 sizeof (ips_passthru_t) + sizeof (int));
1729 SC->result = DID_OK << 16;
1731 return (IPS_SUCCESS_IMM);
1733 case IPS_COPPUSRCMD:
1734 case IPS_COPPIOCCMD:
1735 if (SC->cmnd[0] == IPS_IOCTL_COMMAND) {
1736 if (length < (sizeof (ips_passthru_t) + pt->CmdBSize)) {
1737 /* wrong size */
1738 DEBUG_VAR(1,
1739 "(%s%d) Passthru structure wrong size",
1740 ips_name, ha->host_num);
1742 return (IPS_FAILURE);
1745 if (ha->device_id == IPS_DEVICEID_COPPERHEAD &&
1746 pt->CoppCP.cmd.flashfw.op_code ==
1747 IPS_CMD_RW_BIOSFW) {
1748 ret = ips_flash_copperhead(ha, pt, scb);
1749 ips_scmd_buf_write(SC, ha->ioctl_data,
1750 sizeof (ips_passthru_t));
1751 return ret;
1753 if (ips_usrcmd(ha, pt, scb))
1754 return (IPS_SUCCESS);
1755 else
1756 return (IPS_FAILURE);
1759 break;
1761 } /* end switch */
1763 return (IPS_FAILURE);
1766 /****************************************************************************/
1767 /* Routine Name: ips_flash_copperhead */
1768 /* Routine Description: */
1769 /* Flash the BIOS/FW on a Copperhead style controller */
1770 /****************************************************************************/
1771 static int
1772 ips_flash_copperhead(ips_ha_t * ha, ips_passthru_t * pt, ips_scb_t * scb)
1774 int datasize;
1776 /* Trombone is the only copperhead that can do packet flash, but only
1777 * for firmware. No one said it had to make sence. */
1778 if (IPS_IS_TROMBONE(ha) && pt->CoppCP.cmd.flashfw.type == IPS_FW_IMAGE) {
1779 if (ips_usrcmd(ha, pt, scb))
1780 return IPS_SUCCESS;
1781 else
1782 return IPS_FAILURE;
1784 pt->BasicStatus = 0x0B;
1785 pt->ExtendedStatus = 0;
1786 scb->scsi_cmd->result = DID_OK << 16;
1787 /* IF it's OK to Use the "CD BOOT" Flash Buffer, then you can */
1788 /* avoid allocating a huge buffer per adapter ( which can fail ). */
1789 if (pt->CoppCP.cmd.flashfw.type == IPS_BIOS_IMAGE &&
1790 pt->CoppCP.cmd.flashfw.direction == IPS_ERASE_BIOS) {
1791 pt->BasicStatus = 0;
1792 return ips_flash_bios(ha, pt, scb);
1793 } else if (pt->CoppCP.cmd.flashfw.packet_num == 0) {
1794 if (ips_FlashData && !test_and_set_bit(0, &ips_FlashDataInUse)){
1795 ha->flash_data = ips_FlashData;
1796 ha->flash_busaddr = ips_flashbusaddr;
1797 ha->flash_len = PAGE_SIZE << 7;
1798 ha->flash_datasize = 0;
1799 } else if (!ha->flash_data) {
1800 datasize = pt->CoppCP.cmd.flashfw.total_packets *
1801 pt->CoppCP.cmd.flashfw.count;
1802 ha->flash_data = pci_alloc_consistent(ha->pcidev,
1803 datasize,
1804 &ha->flash_busaddr);
1805 if (!ha->flash_data){
1806 printk(KERN_WARNING "Unable to allocate a flash buffer\n");
1807 return IPS_FAILURE;
1809 ha->flash_datasize = 0;
1810 ha->flash_len = datasize;
1811 } else
1812 return IPS_FAILURE;
1813 } else {
1814 if (pt->CoppCP.cmd.flashfw.count + ha->flash_datasize >
1815 ha->flash_len) {
1816 ips_free_flash_copperhead(ha);
1817 IPS_PRINTK(KERN_WARNING, ha->pcidev,
1818 "failed size sanity check\n");
1819 return IPS_FAILURE;
1822 if (!ha->flash_data)
1823 return IPS_FAILURE;
1824 pt->BasicStatus = 0;
1825 memcpy(&ha->flash_data[ha->flash_datasize], pt + 1,
1826 pt->CoppCP.cmd.flashfw.count);
1827 ha->flash_datasize += pt->CoppCP.cmd.flashfw.count;
1828 if (pt->CoppCP.cmd.flashfw.packet_num ==
1829 pt->CoppCP.cmd.flashfw.total_packets - 1) {
1830 if (pt->CoppCP.cmd.flashfw.type == IPS_BIOS_IMAGE)
1831 return ips_flash_bios(ha, pt, scb);
1832 else if (pt->CoppCP.cmd.flashfw.type == IPS_FW_IMAGE)
1833 return ips_flash_firmware(ha, pt, scb);
1835 return IPS_SUCCESS_IMM;
1838 /****************************************************************************/
1839 /* Routine Name: ips_flash_bios */
1840 /* Routine Description: */
1841 /* flashes the bios of a copperhead adapter */
1842 /****************************************************************************/
1843 static int
1844 ips_flash_bios(ips_ha_t * ha, ips_passthru_t * pt, ips_scb_t * scb)
1847 if (pt->CoppCP.cmd.flashfw.type == IPS_BIOS_IMAGE &&
1848 pt->CoppCP.cmd.flashfw.direction == IPS_WRITE_BIOS) {
1849 if ((!ha->func.programbios) || (!ha->func.erasebios) ||
1850 (!ha->func.verifybios))
1851 goto error;
1852 if ((*ha->func.erasebios) (ha)) {
1853 DEBUG_VAR(1,
1854 "(%s%d) flash bios failed - unable to erase flash",
1855 ips_name, ha->host_num);
1856 goto error;
1857 } else
1858 if ((*ha->func.programbios) (ha,
1859 ha->flash_data +
1860 IPS_BIOS_HEADER,
1861 ha->flash_datasize -
1862 IPS_BIOS_HEADER, 0)) {
1863 DEBUG_VAR(1,
1864 "(%s%d) flash bios failed - unable to flash",
1865 ips_name, ha->host_num);
1866 goto error;
1867 } else
1868 if ((*ha->func.verifybios) (ha,
1869 ha->flash_data +
1870 IPS_BIOS_HEADER,
1871 ha->flash_datasize -
1872 IPS_BIOS_HEADER, 0)) {
1873 DEBUG_VAR(1,
1874 "(%s%d) flash bios failed - unable to verify flash",
1875 ips_name, ha->host_num);
1876 goto error;
1878 ips_free_flash_copperhead(ha);
1879 return IPS_SUCCESS_IMM;
1880 } else if (pt->CoppCP.cmd.flashfw.type == IPS_BIOS_IMAGE &&
1881 pt->CoppCP.cmd.flashfw.direction == IPS_ERASE_BIOS) {
1882 if (!ha->func.erasebios)
1883 goto error;
1884 if ((*ha->func.erasebios) (ha)) {
1885 DEBUG_VAR(1,
1886 "(%s%d) flash bios failed - unable to erase flash",
1887 ips_name, ha->host_num);
1888 goto error;
1890 return IPS_SUCCESS_IMM;
1892 error:
1893 pt->BasicStatus = 0x0B;
1894 pt->ExtendedStatus = 0x00;
1895 ips_free_flash_copperhead(ha);
1896 return IPS_FAILURE;
1899 /****************************************************************************/
1900 /* */
1901 /* Routine Name: ips_fill_scb_sg_single */
1902 /* */
1903 /* Routine Description: */
1904 /* Fill in a single scb sg_list element from an address */
1905 /* return a -1 if a breakup occurred */
1906 /****************************************************************************/
1907 static int
1908 ips_fill_scb_sg_single(ips_ha_t * ha, dma_addr_t busaddr,
1909 ips_scb_t * scb, int indx, unsigned int e_len)
1912 int ret_val = 0;
1914 if ((scb->data_len + e_len) > ha->max_xfer) {
1915 e_len = ha->max_xfer - scb->data_len;
1916 scb->breakup = indx;
1917 ++scb->sg_break;
1918 ret_val = -1;
1919 } else {
1920 scb->breakup = 0;
1921 scb->sg_break = 0;
1923 if (IPS_USE_ENH_SGLIST(ha)) {
1924 scb->sg_list.enh_list[indx].address_lo =
1925 cpu_to_le32(pci_dma_lo32(busaddr));
1926 scb->sg_list.enh_list[indx].address_hi =
1927 cpu_to_le32(pci_dma_hi32(busaddr));
1928 scb->sg_list.enh_list[indx].length = cpu_to_le32(e_len);
1929 } else {
1930 scb->sg_list.std_list[indx].address =
1931 cpu_to_le32(pci_dma_lo32(busaddr));
1932 scb->sg_list.std_list[indx].length = cpu_to_le32(e_len);
1935 ++scb->sg_len;
1936 scb->data_len += e_len;
1937 return ret_val;
1940 /****************************************************************************/
1941 /* Routine Name: ips_flash_firmware */
1942 /* Routine Description: */
1943 /* flashes the firmware of a copperhead adapter */
1944 /****************************************************************************/
1945 static int
1946 ips_flash_firmware(ips_ha_t * ha, ips_passthru_t * pt, ips_scb_t * scb)
1948 IPS_SG_LIST sg_list;
1949 uint32_t cmd_busaddr;
1951 if (pt->CoppCP.cmd.flashfw.type == IPS_FW_IMAGE &&
1952 pt->CoppCP.cmd.flashfw.direction == IPS_WRITE_FW) {
1953 memset(&pt->CoppCP.cmd, 0, sizeof (IPS_HOST_COMMAND));
1954 pt->CoppCP.cmd.flashfw.op_code = IPS_CMD_DOWNLOAD;
1955 pt->CoppCP.cmd.flashfw.count = cpu_to_le32(ha->flash_datasize);
1956 } else {
1957 pt->BasicStatus = 0x0B;
1958 pt->ExtendedStatus = 0x00;
1959 ips_free_flash_copperhead(ha);
1960 return IPS_FAILURE;
1962 /* Save the S/G list pointer so it doesn't get clobbered */
1963 sg_list.list = scb->sg_list.list;
1964 cmd_busaddr = scb->scb_busaddr;
1965 /* copy in the CP */
1966 memcpy(&scb->cmd, &pt->CoppCP.cmd, sizeof (IPS_IOCTL_CMD));
1967 /* FIX stuff that might be wrong */
1968 scb->sg_list.list = sg_list.list;
1969 scb->scb_busaddr = cmd_busaddr;
1970 scb->bus = scb->scsi_cmd->device->channel;
1971 scb->target_id = scb->scsi_cmd->device->id;
1972 scb->lun = scb->scsi_cmd->device->lun;
1973 scb->sg_len = 0;
1974 scb->data_len = 0;
1975 scb->flags = 0;
1976 scb->op_code = 0;
1977 scb->callback = ipsintr_done;
1978 scb->timeout = ips_cmd_timeout;
1980 scb->data_len = ha->flash_datasize;
1981 scb->data_busaddr =
1982 pci_map_single(ha->pcidev, ha->flash_data, scb->data_len,
1983 IPS_DMA_DIR(scb));
1984 scb->flags |= IPS_SCB_MAP_SINGLE;
1985 scb->cmd.flashfw.command_id = IPS_COMMAND_ID(ha, scb);
1986 scb->cmd.flashfw.buffer_addr = cpu_to_le32(scb->data_busaddr);
1987 if (pt->TimeOut)
1988 scb->timeout = pt->TimeOut;
1989 scb->scsi_cmd->result = DID_OK << 16;
1990 return IPS_SUCCESS;
1993 /****************************************************************************/
1994 /* Routine Name: ips_free_flash_copperhead */
1995 /* Routine Description: */
1996 /* release the memory resources used to hold the flash image */
1997 /****************************************************************************/
1998 static void
1999 ips_free_flash_copperhead(ips_ha_t * ha)
2001 if (ha->flash_data == ips_FlashData)
2002 test_and_clear_bit(0, &ips_FlashDataInUse);
2003 else if (ha->flash_data)
2004 pci_free_consistent(ha->pcidev, ha->flash_len, ha->flash_data,
2005 ha->flash_busaddr);
2006 ha->flash_data = NULL;
2009 /****************************************************************************/
2010 /* */
2011 /* Routine Name: ips_usrcmd */
2012 /* */
2013 /* Routine Description: */
2014 /* */
2015 /* Process a user command and make it ready to send */
2016 /* */
2017 /****************************************************************************/
2018 static int
2019 ips_usrcmd(ips_ha_t * ha, ips_passthru_t * pt, ips_scb_t * scb)
2021 IPS_SG_LIST sg_list;
2022 uint32_t cmd_busaddr;
2024 METHOD_TRACE("ips_usrcmd", 1);
2026 if ((!scb) || (!pt) || (!ha))
2027 return (0);
2029 /* Save the S/G list pointer so it doesn't get clobbered */
2030 sg_list.list = scb->sg_list.list;
2031 cmd_busaddr = scb->scb_busaddr;
2032 /* copy in the CP */
2033 memcpy(&scb->cmd, &pt->CoppCP.cmd, sizeof (IPS_IOCTL_CMD));
2034 memcpy(&scb->dcdb, &pt->CoppCP.dcdb, sizeof (IPS_DCDB_TABLE));
2036 /* FIX stuff that might be wrong */
2037 scb->sg_list.list = sg_list.list;
2038 scb->scb_busaddr = cmd_busaddr;
2039 scb->bus = scb->scsi_cmd->device->channel;
2040 scb->target_id = scb->scsi_cmd->device->id;
2041 scb->lun = scb->scsi_cmd->device->lun;
2042 scb->sg_len = 0;
2043 scb->data_len = 0;
2044 scb->flags = 0;
2045 scb->op_code = 0;
2046 scb->callback = ipsintr_done;
2047 scb->timeout = ips_cmd_timeout;
2048 scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
2050 /* we don't support DCDB/READ/WRITE Scatter Gather */
2051 if ((scb->cmd.basic_io.op_code == IPS_CMD_READ_SG) ||
2052 (scb->cmd.basic_io.op_code == IPS_CMD_WRITE_SG) ||
2053 (scb->cmd.basic_io.op_code == IPS_CMD_DCDB_SG))
2054 return (0);
2056 if (pt->CmdBSize) {
2057 scb->data_len = pt->CmdBSize;
2058 scb->data_busaddr = ha->ioctl_busaddr + sizeof (ips_passthru_t);
2059 } else {
2060 scb->data_busaddr = 0L;
2063 if (scb->cmd.dcdb.op_code == IPS_CMD_DCDB)
2064 scb->cmd.dcdb.dcdb_address = cpu_to_le32(scb->scb_busaddr +
2065 (unsigned long) &scb->
2066 dcdb -
2067 (unsigned long) scb);
2069 if (pt->CmdBSize) {
2070 if (scb->cmd.dcdb.op_code == IPS_CMD_DCDB)
2071 scb->dcdb.buffer_pointer =
2072 cpu_to_le32(scb->data_busaddr);
2073 else
2074 scb->cmd.basic_io.sg_addr =
2075 cpu_to_le32(scb->data_busaddr);
2078 /* set timeouts */
2079 if (pt->TimeOut) {
2080 scb->timeout = pt->TimeOut;
2082 if (pt->TimeOut <= 10)
2083 scb->dcdb.cmd_attribute |= IPS_TIMEOUT10;
2084 else if (pt->TimeOut <= 60)
2085 scb->dcdb.cmd_attribute |= IPS_TIMEOUT60;
2086 else
2087 scb->dcdb.cmd_attribute |= IPS_TIMEOUT20M;
2090 /* assume success */
2091 scb->scsi_cmd->result = DID_OK << 16;
2093 /* success */
2094 return (1);
2097 /****************************************************************************/
2098 /* */
2099 /* Routine Name: ips_cleanup_passthru */
2100 /* */
2101 /* Routine Description: */
2102 /* */
2103 /* Cleanup after a passthru command */
2104 /* */
2105 /****************************************************************************/
2106 static void
2107 ips_cleanup_passthru(ips_ha_t * ha, ips_scb_t * scb)
2109 ips_passthru_t *pt;
2111 METHOD_TRACE("ips_cleanup_passthru", 1);
2113 if ((!scb) || (!scb->scsi_cmd) || (!scb->scsi_cmd->request_buffer)) {
2114 DEBUG_VAR(1, "(%s%d) couldn't cleanup after passthru",
2115 ips_name, ha->host_num);
2117 return;
2119 pt = (ips_passthru_t *) ha->ioctl_data;
2121 /* Copy data back to the user */
2122 if (scb->cmd.dcdb.op_code == IPS_CMD_DCDB) /* Copy DCDB Back to Caller's Area */
2123 memcpy(&pt->CoppCP.dcdb, &scb->dcdb, sizeof (IPS_DCDB_TABLE));
2125 pt->BasicStatus = scb->basic_status;
2126 pt->ExtendedStatus = scb->extended_status;
2127 pt->AdapterType = ha->ad_type;
2129 if (ha->device_id == IPS_DEVICEID_COPPERHEAD &&
2130 (scb->cmd.flashfw.op_code == IPS_CMD_DOWNLOAD ||
2131 scb->cmd.flashfw.op_code == IPS_CMD_RW_BIOSFW))
2132 ips_free_flash_copperhead(ha);
2134 ips_scmd_buf_write(scb->scsi_cmd, ha->ioctl_data, ha->ioctl_datasize);
2137 /****************************************************************************/
2138 /* */
2139 /* Routine Name: ips_host_info */
2140 /* */
2141 /* Routine Description: */
2142 /* */
2143 /* The passthru interface for the driver */
2144 /* */
2145 /****************************************************************************/
2146 static int
2147 ips_host_info(ips_ha_t * ha, char *ptr, off_t offset, int len)
2149 IPS_INFOSTR info;
2151 METHOD_TRACE("ips_host_info", 1);
2153 info.buffer = ptr;
2154 info.length = len;
2155 info.offset = offset;
2156 info.pos = 0;
2157 info.localpos = 0;
2159 copy_info(&info, "\nIBM ServeRAID General Information:\n\n");
2161 if ((le32_to_cpu(ha->nvram->signature) == IPS_NVRAM_P5_SIG) &&
2162 (le16_to_cpu(ha->nvram->adapter_type) != 0))
2163 copy_info(&info, "\tController Type : %s\n",
2164 ips_adapter_name[ha->ad_type - 1]);
2165 else
2166 copy_info(&info,
2167 "\tController Type : Unknown\n");
2169 if (ha->io_addr)
2170 copy_info(&info,
2171 "\tIO region : 0x%lx (%d bytes)\n",
2172 ha->io_addr, ha->io_len);
2174 if (ha->mem_addr) {
2175 copy_info(&info,
2176 "\tMemory region : 0x%lx (%d bytes)\n",
2177 ha->mem_addr, ha->mem_len);
2178 copy_info(&info,
2179 "\tShared memory address : 0x%lx\n",
2180 ha->mem_ptr);
2183 copy_info(&info, "\tIRQ number : %d\n", ha->irq);
2185 /* For the Next 3 lines Check for Binary 0 at the end and don't include it if it's there. */
2186 /* That keeps everything happy for "text" operations on the proc file. */
2188 if (le32_to_cpu(ha->nvram->signature) == IPS_NVRAM_P5_SIG) {
2189 if (ha->nvram->bios_low[3] == 0) {
2190 copy_info(&info,
2191 "\tBIOS Version : %c%c%c%c%c%c%c\n",
2192 ha->nvram->bios_high[0], ha->nvram->bios_high[1],
2193 ha->nvram->bios_high[2], ha->nvram->bios_high[3],
2194 ha->nvram->bios_low[0], ha->nvram->bios_low[1],
2195 ha->nvram->bios_low[2]);
2197 } else {
2198 copy_info(&info,
2199 "\tBIOS Version : %c%c%c%c%c%c%c%c\n",
2200 ha->nvram->bios_high[0], ha->nvram->bios_high[1],
2201 ha->nvram->bios_high[2], ha->nvram->bios_high[3],
2202 ha->nvram->bios_low[0], ha->nvram->bios_low[1],
2203 ha->nvram->bios_low[2], ha->nvram->bios_low[3]);
2208 if (ha->enq->CodeBlkVersion[7] == 0) {
2209 copy_info(&info,
2210 "\tFirmware Version : %c%c%c%c%c%c%c\n",
2211 ha->enq->CodeBlkVersion[0], ha->enq->CodeBlkVersion[1],
2212 ha->enq->CodeBlkVersion[2], ha->enq->CodeBlkVersion[3],
2213 ha->enq->CodeBlkVersion[4], ha->enq->CodeBlkVersion[5],
2214 ha->enq->CodeBlkVersion[6]);
2215 } else {
2216 copy_info(&info,
2217 "\tFirmware Version : %c%c%c%c%c%c%c%c\n",
2218 ha->enq->CodeBlkVersion[0], ha->enq->CodeBlkVersion[1],
2219 ha->enq->CodeBlkVersion[2], ha->enq->CodeBlkVersion[3],
2220 ha->enq->CodeBlkVersion[4], ha->enq->CodeBlkVersion[5],
2221 ha->enq->CodeBlkVersion[6], ha->enq->CodeBlkVersion[7]);
2224 if (ha->enq->BootBlkVersion[7] == 0) {
2225 copy_info(&info,
2226 "\tBoot Block Version : %c%c%c%c%c%c%c\n",
2227 ha->enq->BootBlkVersion[0], ha->enq->BootBlkVersion[1],
2228 ha->enq->BootBlkVersion[2], ha->enq->BootBlkVersion[3],
2229 ha->enq->BootBlkVersion[4], ha->enq->BootBlkVersion[5],
2230 ha->enq->BootBlkVersion[6]);
2231 } else {
2232 copy_info(&info,
2233 "\tBoot Block Version : %c%c%c%c%c%c%c%c\n",
2234 ha->enq->BootBlkVersion[0], ha->enq->BootBlkVersion[1],
2235 ha->enq->BootBlkVersion[2], ha->enq->BootBlkVersion[3],
2236 ha->enq->BootBlkVersion[4], ha->enq->BootBlkVersion[5],
2237 ha->enq->BootBlkVersion[6], ha->enq->BootBlkVersion[7]);
2240 copy_info(&info, "\tDriver Version : %s%s\n",
2241 IPS_VERSION_HIGH, IPS_VERSION_LOW);
2243 copy_info(&info, "\tDriver Build : %d\n",
2244 IPS_BUILD_IDENT);
2246 copy_info(&info, "\tMax Physical Devices : %d\n",
2247 ha->enq->ucMaxPhysicalDevices);
2248 copy_info(&info, "\tMax Active Commands : %d\n",
2249 ha->max_cmds);
2250 copy_info(&info, "\tCurrent Queued Commands : %d\n",
2251 ha->scb_waitlist.count);
2252 copy_info(&info, "\tCurrent Active Commands : %d\n",
2253 ha->scb_activelist.count - ha->num_ioctl);
2254 copy_info(&info, "\tCurrent Queued PT Commands : %d\n",
2255 ha->copp_waitlist.count);
2256 copy_info(&info, "\tCurrent Active PT Commands : %d\n",
2257 ha->num_ioctl);
2259 copy_info(&info, "\n");
2261 return (info.localpos);
2264 /****************************************************************************/
2265 /* */
2266 /* Routine Name: copy_mem_info */
2267 /* */
2268 /* Routine Description: */
2269 /* */
2270 /* Copy data into an IPS_INFOSTR structure */
2271 /* */
2272 /****************************************************************************/
2273 static void
2274 copy_mem_info(IPS_INFOSTR * info, char *data, int len)
2276 METHOD_TRACE("copy_mem_info", 1);
2278 if (info->pos + len < info->offset) {
2279 info->pos += len;
2280 return;
2283 if (info->pos < info->offset) {
2284 data += (info->offset - info->pos);
2285 len -= (info->offset - info->pos);
2286 info->pos += (info->offset - info->pos);
2289 if (info->localpos + len > info->length)
2290 len = info->length - info->localpos;
2292 if (len > 0) {
2293 memcpy(info->buffer + info->localpos, data, len);
2294 info->pos += len;
2295 info->localpos += len;
2299 /****************************************************************************/
2300 /* */
2301 /* Routine Name: copy_info */
2302 /* */
2303 /* Routine Description: */
2304 /* */
2305 /* printf style wrapper for an info structure */
2306 /* */
2307 /****************************************************************************/
2308 static int
2309 copy_info(IPS_INFOSTR * info, char *fmt, ...)
2311 va_list args;
2312 char buf[128];
2313 int len;
2315 METHOD_TRACE("copy_info", 1);
2317 va_start(args, fmt);
2318 len = vsprintf(buf, fmt, args);
2319 va_end(args);
2321 copy_mem_info(info, buf, len);
2323 return (len);
2326 /****************************************************************************/
2327 /* */
2328 /* Routine Name: ips_identify_controller */
2329 /* */
2330 /* Routine Description: */
2331 /* */
2332 /* Identify this controller */
2333 /* */
2334 /****************************************************************************/
2335 static void
2336 ips_identify_controller(ips_ha_t * ha)
2338 METHOD_TRACE("ips_identify_controller", 1);
2340 switch (ha->device_id) {
2341 case IPS_DEVICEID_COPPERHEAD:
2342 if (ha->revision_id <= IPS_REVID_SERVERAID) {
2343 ha->ad_type = IPS_ADTYPE_SERVERAID;
2344 } else if (ha->revision_id == IPS_REVID_SERVERAID2) {
2345 ha->ad_type = IPS_ADTYPE_SERVERAID2;
2346 } else if (ha->revision_id == IPS_REVID_NAVAJO) {
2347 ha->ad_type = IPS_ADTYPE_NAVAJO;
2348 } else if ((ha->revision_id == IPS_REVID_SERVERAID2)
2349 && (ha->slot_num == 0)) {
2350 ha->ad_type = IPS_ADTYPE_KIOWA;
2351 } else if ((ha->revision_id >= IPS_REVID_CLARINETP1) &&
2352 (ha->revision_id <= IPS_REVID_CLARINETP3)) {
2353 if (ha->enq->ucMaxPhysicalDevices == 15)
2354 ha->ad_type = IPS_ADTYPE_SERVERAID3L;
2355 else
2356 ha->ad_type = IPS_ADTYPE_SERVERAID3;
2357 } else if ((ha->revision_id >= IPS_REVID_TROMBONE32) &&
2358 (ha->revision_id <= IPS_REVID_TROMBONE64)) {
2359 ha->ad_type = IPS_ADTYPE_SERVERAID4H;
2361 break;
2363 case IPS_DEVICEID_MORPHEUS:
2364 switch (ha->subdevice_id) {
2365 case IPS_SUBDEVICEID_4L:
2366 ha->ad_type = IPS_ADTYPE_SERVERAID4L;
2367 break;
2369 case IPS_SUBDEVICEID_4M:
2370 ha->ad_type = IPS_ADTYPE_SERVERAID4M;
2371 break;
2373 case IPS_SUBDEVICEID_4MX:
2374 ha->ad_type = IPS_ADTYPE_SERVERAID4MX;
2375 break;
2377 case IPS_SUBDEVICEID_4LX:
2378 ha->ad_type = IPS_ADTYPE_SERVERAID4LX;
2379 break;
2381 case IPS_SUBDEVICEID_5I2:
2382 ha->ad_type = IPS_ADTYPE_SERVERAID5I2;
2383 break;
2385 case IPS_SUBDEVICEID_5I1:
2386 ha->ad_type = IPS_ADTYPE_SERVERAID5I1;
2387 break;
2390 break;
2392 case IPS_DEVICEID_MARCO:
2393 switch (ha->subdevice_id) {
2394 case IPS_SUBDEVICEID_6M:
2395 ha->ad_type = IPS_ADTYPE_SERVERAID6M;
2396 break;
2397 case IPS_SUBDEVICEID_6I:
2398 ha->ad_type = IPS_ADTYPE_SERVERAID6I;
2399 break;
2400 case IPS_SUBDEVICEID_7k:
2401 ha->ad_type = IPS_ADTYPE_SERVERAID7k;
2402 break;
2403 case IPS_SUBDEVICEID_7M:
2404 ha->ad_type = IPS_ADTYPE_SERVERAID7M;
2405 break;
2407 break;
2411 /****************************************************************************/
2412 /* */
2413 /* Routine Name: ips_get_bios_version */
2414 /* */
2415 /* Routine Description: */
2416 /* */
2417 /* Get the BIOS revision number */
2418 /* */
2419 /****************************************************************************/
2420 static void
2421 ips_get_bios_version(ips_ha_t * ha, int intr)
2423 ips_scb_t *scb;
2424 int ret;
2425 uint8_t major;
2426 uint8_t minor;
2427 uint8_t subminor;
2428 uint8_t *buffer;
2429 char hexDigits[] =
2430 { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C',
2431 'D', 'E', 'F' };
2433 METHOD_TRACE("ips_get_bios_version", 1);
2435 major = 0;
2436 minor = 0;
2438 strncpy(ha->bios_version, " ?", 8);
2440 if (ha->device_id == IPS_DEVICEID_COPPERHEAD) {
2441 if (IPS_USE_MEMIO(ha)) {
2442 /* Memory Mapped I/O */
2444 /* test 1st byte */
2445 writel(0, ha->mem_ptr + IPS_REG_FLAP);
2446 if (ha->revision_id == IPS_REVID_TROMBONE64)
2447 udelay(25); /* 25 us */
2449 if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0x55)
2450 return;
2452 writel(1, ha->mem_ptr + IPS_REG_FLAP);
2453 if (ha->revision_id == IPS_REVID_TROMBONE64)
2454 udelay(25); /* 25 us */
2456 if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0xAA)
2457 return;
2459 /* Get Major version */
2460 writel(0x1FF, ha->mem_ptr + IPS_REG_FLAP);
2461 if (ha->revision_id == IPS_REVID_TROMBONE64)
2462 udelay(25); /* 25 us */
2464 major = readb(ha->mem_ptr + IPS_REG_FLDP);
2466 /* Get Minor version */
2467 writel(0x1FE, ha->mem_ptr + IPS_REG_FLAP);
2468 if (ha->revision_id == IPS_REVID_TROMBONE64)
2469 udelay(25); /* 25 us */
2470 minor = readb(ha->mem_ptr + IPS_REG_FLDP);
2472 /* Get SubMinor version */
2473 writel(0x1FD, ha->mem_ptr + IPS_REG_FLAP);
2474 if (ha->revision_id == IPS_REVID_TROMBONE64)
2475 udelay(25); /* 25 us */
2476 subminor = readb(ha->mem_ptr + IPS_REG_FLDP);
2478 } else {
2479 /* Programmed I/O */
2481 /* test 1st byte */
2482 outl(0, ha->io_addr + IPS_REG_FLAP);
2483 if (ha->revision_id == IPS_REVID_TROMBONE64)
2484 udelay(25); /* 25 us */
2486 if (inb(ha->io_addr + IPS_REG_FLDP) != 0x55)
2487 return;
2489 outl(cpu_to_le32(1), ha->io_addr + IPS_REG_FLAP);
2490 if (ha->revision_id == IPS_REVID_TROMBONE64)
2491 udelay(25); /* 25 us */
2493 if (inb(ha->io_addr + IPS_REG_FLDP) != 0xAA)
2494 return;
2496 /* Get Major version */
2497 outl(cpu_to_le32(0x1FF), ha->io_addr + IPS_REG_FLAP);
2498 if (ha->revision_id == IPS_REVID_TROMBONE64)
2499 udelay(25); /* 25 us */
2501 major = inb(ha->io_addr + IPS_REG_FLDP);
2503 /* Get Minor version */
2504 outl(cpu_to_le32(0x1FE), ha->io_addr + IPS_REG_FLAP);
2505 if (ha->revision_id == IPS_REVID_TROMBONE64)
2506 udelay(25); /* 25 us */
2508 minor = inb(ha->io_addr + IPS_REG_FLDP);
2510 /* Get SubMinor version */
2511 outl(cpu_to_le32(0x1FD), ha->io_addr + IPS_REG_FLAP);
2512 if (ha->revision_id == IPS_REVID_TROMBONE64)
2513 udelay(25); /* 25 us */
2515 subminor = inb(ha->io_addr + IPS_REG_FLDP);
2518 } else {
2519 /* Morpheus Family - Send Command to the card */
2521 buffer = ha->ioctl_data;
2523 memset(buffer, 0, 0x1000);
2525 scb = &ha->scbs[ha->max_cmds - 1];
2527 ips_init_scb(ha, scb);
2529 scb->timeout = ips_cmd_timeout;
2530 scb->cdb[0] = IPS_CMD_RW_BIOSFW;
2532 scb->cmd.flashfw.op_code = IPS_CMD_RW_BIOSFW;
2533 scb->cmd.flashfw.command_id = IPS_COMMAND_ID(ha, scb);
2534 scb->cmd.flashfw.type = 1;
2535 scb->cmd.flashfw.direction = 0;
2536 scb->cmd.flashfw.count = cpu_to_le32(0x800);
2537 scb->cmd.flashfw.total_packets = 1;
2538 scb->cmd.flashfw.packet_num = 0;
2539 scb->data_len = 0x1000;
2540 scb->cmd.flashfw.buffer_addr = ha->ioctl_busaddr;
2542 /* issue the command */
2543 if (((ret =
2544 ips_send_wait(ha, scb, ips_cmd_timeout,
2545 intr)) == IPS_FAILURE)
2546 || (ret == IPS_SUCCESS_IMM)
2547 || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) {
2548 /* Error occurred */
2550 return;
2553 if ((buffer[0xC0] == 0x55) && (buffer[0xC1] == 0xAA)) {
2554 major = buffer[0x1ff + 0xC0]; /* Offset 0x1ff after the header (0xc0) */
2555 minor = buffer[0x1fe + 0xC0]; /* Offset 0x1fe after the header (0xc0) */
2556 subminor = buffer[0x1fd + 0xC0]; /* Offset 0x1fd after the header (0xc0) */
2557 } else {
2558 return;
2562 ha->bios_version[0] = hexDigits[(major & 0xF0) >> 4];
2563 ha->bios_version[1] = '.';
2564 ha->bios_version[2] = hexDigits[major & 0x0F];
2565 ha->bios_version[3] = hexDigits[subminor];
2566 ha->bios_version[4] = '.';
2567 ha->bios_version[5] = hexDigits[(minor & 0xF0) >> 4];
2568 ha->bios_version[6] = hexDigits[minor & 0x0F];
2569 ha->bios_version[7] = 0;
2572 /****************************************************************************/
2573 /* */
2574 /* Routine Name: ips_hainit */
2575 /* */
2576 /* Routine Description: */
2577 /* */
2578 /* Initialize the controller */
2579 /* */
2580 /* NOTE: Assumes to be called from with a lock */
2581 /* */
2582 /****************************************************************************/
2583 static int
2584 ips_hainit(ips_ha_t * ha)
2586 int i;
2587 struct timeval tv;
2589 METHOD_TRACE("ips_hainit", 1);
2591 if (!ha)
2592 return (0);
2594 if (ha->func.statinit)
2595 (*ha->func.statinit) (ha);
2597 if (ha->func.enableint)
2598 (*ha->func.enableint) (ha);
2600 /* Send FFDC */
2601 ha->reset_count = 1;
2602 do_gettimeofday(&tv);
2603 ha->last_ffdc = tv.tv_sec;
2604 ips_ffdc_reset(ha, IPS_INTR_IORL);
2606 if (!ips_read_config(ha, IPS_INTR_IORL)) {
2607 IPS_PRINTK(KERN_WARNING, ha->pcidev,
2608 "unable to read config from controller.\n");
2610 return (0);
2612 /* end if */
2613 if (!ips_read_adapter_status(ha, IPS_INTR_IORL)) {
2614 IPS_PRINTK(KERN_WARNING, ha->pcidev,
2615 "unable to read controller status.\n");
2617 return (0);
2620 /* Identify this controller */
2621 ips_identify_controller(ha);
2623 if (!ips_read_subsystem_parameters(ha, IPS_INTR_IORL)) {
2624 IPS_PRINTK(KERN_WARNING, ha->pcidev,
2625 "unable to read subsystem parameters.\n");
2627 return (0);
2630 /* write nvram user page 5 */
2631 if (!ips_write_driver_status(ha, IPS_INTR_IORL)) {
2632 IPS_PRINTK(KERN_WARNING, ha->pcidev,
2633 "unable to write driver info to controller.\n");
2635 return (0);
2638 /* If there are Logical Drives and a Reset Occurred, then an EraseStripeLock is Needed */
2639 if ((ha->conf->ucLogDriveCount > 0) && (ha->requires_esl == 1))
2640 ips_clear_adapter(ha, IPS_INTR_IORL);
2642 /* set limits on SID, LUN, BUS */
2643 ha->ntargets = IPS_MAX_TARGETS + 1;
2644 ha->nlun = 1;
2645 ha->nbus = (ha->enq->ucMaxPhysicalDevices / IPS_MAX_TARGETS) + 1;
2647 switch (ha->conf->logical_drive[0].ucStripeSize) {
2648 case 4:
2649 ha->max_xfer = 0x10000;
2650 break;
2652 case 5:
2653 ha->max_xfer = 0x20000;
2654 break;
2656 case 6:
2657 ha->max_xfer = 0x40000;
2658 break;
2660 case 7:
2661 default:
2662 ha->max_xfer = 0x80000;
2663 break;
2666 /* setup max concurrent commands */
2667 if (le32_to_cpu(ha->subsys->param[4]) & 0x1) {
2668 /* Use the new method */
2669 ha->max_cmds = ha->enq->ucConcurrentCmdCount;
2670 } else {
2671 /* use the old method */
2672 switch (ha->conf->logical_drive[0].ucStripeSize) {
2673 case 4:
2674 ha->max_cmds = 32;
2675 break;
2677 case 5:
2678 ha->max_cmds = 16;
2679 break;
2681 case 6:
2682 ha->max_cmds = 8;
2683 break;
2685 case 7:
2686 default:
2687 ha->max_cmds = 4;
2688 break;
2692 /* Limit the Active Commands on a Lite Adapter */
2693 if ((ha->ad_type == IPS_ADTYPE_SERVERAID3L) ||
2694 (ha->ad_type == IPS_ADTYPE_SERVERAID4L) ||
2695 (ha->ad_type == IPS_ADTYPE_SERVERAID4LX)) {
2696 if ((ha->max_cmds > MaxLiteCmds) && (MaxLiteCmds))
2697 ha->max_cmds = MaxLiteCmds;
2700 /* set controller IDs */
2701 ha->ha_id[0] = IPS_ADAPTER_ID;
2702 for (i = 1; i < ha->nbus; i++) {
2703 ha->ha_id[i] = ha->conf->init_id[i - 1] & 0x1f;
2704 ha->dcdb_active[i - 1] = 0;
2707 return (1);
2710 /****************************************************************************/
2711 /* */
2712 /* Routine Name: ips_next */
2713 /* */
2714 /* Routine Description: */
2715 /* */
2716 /* Take the next command off the queue and send it to the controller */
2717 /* */
2718 /****************************************************************************/
2719 static void
2720 ips_next(ips_ha_t * ha, int intr)
2722 ips_scb_t *scb;
2723 Scsi_Cmnd *SC;
2724 Scsi_Cmnd *p;
2725 Scsi_Cmnd *q;
2726 ips_copp_wait_item_t *item;
2727 int ret;
2728 unsigned long cpu_flags = 0;
2729 struct Scsi_Host *host;
2730 METHOD_TRACE("ips_next", 1);
2732 if (!ha)
2733 return;
2734 host = ips_sh[ha->host_num];
2736 * Block access to the queue function so
2737 * this command won't time out
2739 if (intr == IPS_INTR_ON)
2740 IPS_LOCK_SAVE(host->host_lock, cpu_flags);
2742 if ((ha->subsys->param[3] & 0x300000)
2743 && (ha->scb_activelist.count == 0)) {
2744 struct timeval tv;
2746 do_gettimeofday(&tv);
2748 if (tv.tv_sec - ha->last_ffdc > IPS_SECS_8HOURS) {
2749 ha->last_ffdc = tv.tv_sec;
2750 ips_ffdc_time(ha);
2755 * Send passthru commands
2756 * These have priority over normal I/O
2757 * but shouldn't affect performance too much
2758 * since we limit the number that can be active
2759 * on the card at any one time
2761 while ((ha->num_ioctl < IPS_MAX_IOCTL) &&
2762 (ha->copp_waitlist.head) && (scb = ips_getscb(ha))) {
2764 item = ips_removeq_copp_head(&ha->copp_waitlist);
2765 ha->num_ioctl++;
2766 if (intr == IPS_INTR_ON)
2767 IPS_UNLOCK_RESTORE(host->host_lock, cpu_flags);
2768 scb->scsi_cmd = item->scsi_cmd;
2769 kfree(item);
2771 ret = ips_make_passthru(ha, scb->scsi_cmd, scb, intr);
2773 if (intr == IPS_INTR_ON)
2774 IPS_LOCK_SAVE(host->host_lock, cpu_flags);
2775 switch (ret) {
2776 case IPS_FAILURE:
2777 if (scb->scsi_cmd) {
2778 scb->scsi_cmd->result = DID_ERROR << 16;
2779 scb->scsi_cmd->scsi_done(scb->scsi_cmd);
2782 ips_freescb(ha, scb);
2783 break;
2784 case IPS_SUCCESS_IMM:
2785 if (scb->scsi_cmd) {
2786 scb->scsi_cmd->result = DID_OK << 16;
2787 scb->scsi_cmd->scsi_done(scb->scsi_cmd);
2790 ips_freescb(ha, scb);
2791 break;
2792 default:
2793 break;
2794 } /* end case */
2796 if (ret != IPS_SUCCESS) {
2797 ha->num_ioctl--;
2798 continue;
2801 ret = ips_send_cmd(ha, scb);
2803 if (ret == IPS_SUCCESS)
2804 ips_putq_scb_head(&ha->scb_activelist, scb);
2805 else
2806 ha->num_ioctl--;
2808 switch (ret) {
2809 case IPS_FAILURE:
2810 if (scb->scsi_cmd) {
2811 scb->scsi_cmd->result = DID_ERROR << 16;
2814 ips_freescb(ha, scb);
2815 break;
2816 case IPS_SUCCESS_IMM:
2817 ips_freescb(ha, scb);
2818 break;
2819 default:
2820 break;
2821 } /* end case */
2826 * Send "Normal" I/O commands
2829 p = ha->scb_waitlist.head;
2830 while ((p) && (scb = ips_getscb(ha))) {
2831 if ((p->device->channel > 0)
2832 && (ha->
2833 dcdb_active[p->device->channel -
2834 1] & (1 << p->device->id))) {
2835 ips_freescb(ha, scb);
2836 p = (Scsi_Cmnd *) p->host_scribble;
2837 continue;
2840 q = p;
2841 SC = ips_removeq_wait(&ha->scb_waitlist, q);
2843 if (intr == IPS_INTR_ON)
2844 IPS_UNLOCK_RESTORE(host->host_lock, cpu_flags); /* Unlock HA after command is taken off queue */
2846 SC->result = DID_OK;
2847 SC->host_scribble = NULL;
2849 memset(SC->sense_buffer, 0, sizeof (SC->sense_buffer));
2851 scb->target_id = SC->device->id;
2852 scb->lun = SC->device->lun;
2853 scb->bus = SC->device->channel;
2854 scb->scsi_cmd = SC;
2855 scb->breakup = 0;
2856 scb->data_len = 0;
2857 scb->callback = ipsintr_done;
2858 scb->timeout = ips_cmd_timeout;
2859 memset(&scb->cmd, 0, 16);
2861 /* copy in the CDB */
2862 memcpy(scb->cdb, SC->cmnd, SC->cmd_len);
2864 /* Now handle the data buffer */
2865 if (SC->use_sg) {
2866 struct scatterlist *sg;
2867 int i;
2869 sg = SC->request_buffer;
2870 scb->sg_count = pci_map_sg(ha->pcidev, sg, SC->use_sg,
2871 SC->sc_data_direction);
2872 scb->flags |= IPS_SCB_MAP_SG;
2873 for (i = 0; i < scb->sg_count; i++) {
2874 if (ips_fill_scb_sg_single
2875 (ha, sg_dma_address(&sg[i]), scb, i,
2876 sg_dma_len(&sg[i])) < 0)
2877 break;
2879 scb->dcdb.transfer_length = scb->data_len;
2880 } else {
2881 if (SC->request_bufflen) {
2882 scb->data_busaddr =
2883 pci_map_single(ha->pcidev,
2884 SC->request_buffer,
2885 SC->request_bufflen,
2886 SC->sc_data_direction);
2887 scb->flags |= IPS_SCB_MAP_SINGLE;
2888 ips_fill_scb_sg_single(ha, scb->data_busaddr,
2889 scb, 0,
2890 SC->request_bufflen);
2891 scb->dcdb.transfer_length = scb->data_len;
2892 } else {
2893 scb->data_busaddr = 0L;
2894 scb->sg_len = 0;
2895 scb->data_len = 0;
2896 scb->dcdb.transfer_length = 0;
2901 scb->dcdb.cmd_attribute =
2902 ips_command_direction[scb->scsi_cmd->cmnd[0]];
2904 /* Allow a WRITE BUFFER Command to Have no Data */
2905 /* This is Used by Tape Flash Utilites */
2906 if ((scb->scsi_cmd->cmnd[0] == WRITE_BUFFER) && (scb->data_len == 0))
2907 scb->dcdb.cmd_attribute = 0;
2909 if (!(scb->dcdb.cmd_attribute & 0x3))
2910 scb->dcdb.transfer_length = 0;
2912 if (scb->data_len >= IPS_MAX_XFER) {
2913 scb->dcdb.cmd_attribute |= IPS_TRANSFER64K;
2914 scb->dcdb.transfer_length = 0;
2916 if (intr == IPS_INTR_ON)
2917 IPS_LOCK_SAVE(host->host_lock, cpu_flags);
2919 ret = ips_send_cmd(ha, scb);
2921 switch (ret) {
2922 case IPS_SUCCESS:
2923 ips_putq_scb_head(&ha->scb_activelist, scb);
2924 break;
2925 case IPS_FAILURE:
2926 if (scb->scsi_cmd) {
2927 scb->scsi_cmd->result = DID_ERROR << 16;
2928 scb->scsi_cmd->scsi_done(scb->scsi_cmd);
2931 if (scb->bus)
2932 ha->dcdb_active[scb->bus - 1] &=
2933 ~(1 << scb->target_id);
2935 ips_freescb(ha, scb);
2936 break;
2937 case IPS_SUCCESS_IMM:
2938 if (scb->scsi_cmd)
2939 scb->scsi_cmd->scsi_done(scb->scsi_cmd);
2941 if (scb->bus)
2942 ha->dcdb_active[scb->bus - 1] &=
2943 ~(1 << scb->target_id);
2945 ips_freescb(ha, scb);
2946 break;
2947 default:
2948 break;
2949 } /* end case */
2951 p = (Scsi_Cmnd *) p->host_scribble;
2953 } /* end while */
2955 if (intr == IPS_INTR_ON)
2956 IPS_UNLOCK_RESTORE(host->host_lock, cpu_flags);
2959 /****************************************************************************/
2960 /* */
2961 /* Routine Name: ips_putq_scb_head */
2962 /* */
2963 /* Routine Description: */
2964 /* */
2965 /* Add an item to the head of the queue */
2966 /* */
2967 /* ASSUMED to be called from within the HA lock */
2968 /* */
2969 /****************************************************************************/
2970 static void
2971 ips_putq_scb_head(ips_scb_queue_t * queue, ips_scb_t * item)
2973 METHOD_TRACE("ips_putq_scb_head", 1);
2975 if (!item)
2976 return;
2978 item->q_next = queue->head;
2979 queue->head = item;
2981 if (!queue->tail)
2982 queue->tail = item;
2984 queue->count++;
2987 /****************************************************************************/
2988 /* */
2989 /* Routine Name: ips_removeq_scb_head */
2990 /* */
2991 /* Routine Description: */
2992 /* */
2993 /* Remove the head of the queue */
2994 /* */
2995 /* ASSUMED to be called from within the HA lock */
2996 /* */
2997 /****************************************************************************/
2998 static ips_scb_t *
2999 ips_removeq_scb_head(ips_scb_queue_t * queue)
3001 ips_scb_t *item;
3003 METHOD_TRACE("ips_removeq_scb_head", 1);
3005 item = queue->head;
3007 if (!item) {
3008 return (NULL);
3011 queue->head = item->q_next;
3012 item->q_next = NULL;
3014 if (queue->tail == item)
3015 queue->tail = NULL;
3017 queue->count--;
3019 return (item);
3022 /****************************************************************************/
3023 /* */
3024 /* Routine Name: ips_removeq_scb */
3025 /* */
3026 /* Routine Description: */
3027 /* */
3028 /* Remove an item from a queue */
3029 /* */
3030 /* ASSUMED to be called from within the HA lock */
3031 /* */
3032 /****************************************************************************/
3033 static ips_scb_t *
3034 ips_removeq_scb(ips_scb_queue_t * queue, ips_scb_t * item)
3036 ips_scb_t *p;
3038 METHOD_TRACE("ips_removeq_scb", 1);
3040 if (!item)
3041 return (NULL);
3043 if (item == queue->head) {
3044 return (ips_removeq_scb_head(queue));
3047 p = queue->head;
3049 while ((p) && (item != p->q_next))
3050 p = p->q_next;
3052 if (p) {
3053 /* found a match */
3054 p->q_next = item->q_next;
3056 if (!item->q_next)
3057 queue->tail = p;
3059 item->q_next = NULL;
3060 queue->count--;
3062 return (item);
3065 return (NULL);
3068 /****************************************************************************/
3069 /* */
3070 /* Routine Name: ips_putq_wait_tail */
3071 /* */
3072 /* Routine Description: */
3073 /* */
3074 /* Add an item to the tail of the queue */
3075 /* */
3076 /* ASSUMED to be called from within the HA lock */
3077 /* */
3078 /****************************************************************************/
3079 static void
3080 ips_putq_wait_tail(ips_wait_queue_t * queue, Scsi_Cmnd * item)
3082 METHOD_TRACE("ips_putq_wait_tail", 1);
3084 if (!item)
3085 return;
3087 item->host_scribble = NULL;
3089 if (queue->tail)
3090 queue->tail->host_scribble = (char *) item;
3092 queue->tail = item;
3094 if (!queue->head)
3095 queue->head = item;
3097 queue->count++;
3100 /****************************************************************************/
3101 /* */
3102 /* Routine Name: ips_removeq_wait_head */
3103 /* */
3104 /* Routine Description: */
3105 /* */
3106 /* Remove the head of the queue */
3107 /* */
3108 /* ASSUMED to be called from within the HA lock */
3109 /* */
3110 /****************************************************************************/
3111 static Scsi_Cmnd *
3112 ips_removeq_wait_head(ips_wait_queue_t * queue)
3114 Scsi_Cmnd *item;
3116 METHOD_TRACE("ips_removeq_wait_head", 1);
3118 item = queue->head;
3120 if (!item) {
3121 return (NULL);
3124 queue->head = (Scsi_Cmnd *) item->host_scribble;
3125 item->host_scribble = NULL;
3127 if (queue->tail == item)
3128 queue->tail = NULL;
3130 queue->count--;
3132 return (item);
3135 /****************************************************************************/
3136 /* */
3137 /* Routine Name: ips_removeq_wait */
3138 /* */
3139 /* Routine Description: */
3140 /* */
3141 /* Remove an item from a queue */
3142 /* */
3143 /* ASSUMED to be called from within the HA lock */
3144 /* */
3145 /****************************************************************************/
3146 static Scsi_Cmnd *
3147 ips_removeq_wait(ips_wait_queue_t * queue, Scsi_Cmnd * item)
3149 Scsi_Cmnd *p;
3151 METHOD_TRACE("ips_removeq_wait", 1);
3153 if (!item)
3154 return (NULL);
3156 if (item == queue->head) {
3157 return (ips_removeq_wait_head(queue));
3160 p = queue->head;
3162 while ((p) && (item != (Scsi_Cmnd *) p->host_scribble))
3163 p = (Scsi_Cmnd *) p->host_scribble;
3165 if (p) {
3166 /* found a match */
3167 p->host_scribble = item->host_scribble;
3169 if (!item->host_scribble)
3170 queue->tail = p;
3172 item->host_scribble = NULL;
3173 queue->count--;
3175 return (item);
3178 return (NULL);
3181 /****************************************************************************/
3182 /* */
3183 /* Routine Name: ips_putq_copp_tail */
3184 /* */
3185 /* Routine Description: */
3186 /* */
3187 /* Add an item to the tail of the queue */
3188 /* */
3189 /* ASSUMED to be called from within the HA lock */
3190 /* */
3191 /****************************************************************************/
3192 static void
3193 ips_putq_copp_tail(ips_copp_queue_t * queue, ips_copp_wait_item_t * item)
3195 METHOD_TRACE("ips_putq_copp_tail", 1);
3197 if (!item)
3198 return;
3200 item->next = NULL;
3202 if (queue->tail)
3203 queue->tail->next = item;
3205 queue->tail = item;
3207 if (!queue->head)
3208 queue->head = item;
3210 queue->count++;
3213 /****************************************************************************/
3214 /* */
3215 /* Routine Name: ips_removeq_copp_head */
3216 /* */
3217 /* Routine Description: */
3218 /* */
3219 /* Remove the head of the queue */
3220 /* */
3221 /* ASSUMED to be called from within the HA lock */
3222 /* */
3223 /****************************************************************************/
3224 static ips_copp_wait_item_t *
3225 ips_removeq_copp_head(ips_copp_queue_t * queue)
3227 ips_copp_wait_item_t *item;
3229 METHOD_TRACE("ips_removeq_copp_head", 1);
3231 item = queue->head;
3233 if (!item) {
3234 return (NULL);
3237 queue->head = item->next;
3238 item->next = NULL;
3240 if (queue->tail == item)
3241 queue->tail = NULL;
3243 queue->count--;
3245 return (item);
3248 /****************************************************************************/
3249 /* */
3250 /* Routine Name: ips_removeq_copp */
3251 /* */
3252 /* Routine Description: */
3253 /* */
3254 /* Remove an item from a queue */
3255 /* */
3256 /* ASSUMED to be called from within the HA lock */
3257 /* */
3258 /****************************************************************************/
3259 static ips_copp_wait_item_t *
3260 ips_removeq_copp(ips_copp_queue_t * queue, ips_copp_wait_item_t * item)
3262 ips_copp_wait_item_t *p;
3264 METHOD_TRACE("ips_removeq_copp", 1);
3266 if (!item)
3267 return (NULL);
3269 if (item == queue->head) {
3270 return (ips_removeq_copp_head(queue));
3273 p = queue->head;
3275 while ((p) && (item != p->next))
3276 p = p->next;
3278 if (p) {
3279 /* found a match */
3280 p->next = item->next;
3282 if (!item->next)
3283 queue->tail = p;
3285 item->next = NULL;
3286 queue->count--;
3288 return (item);
3291 return (NULL);
3294 /****************************************************************************/
3295 /* */
3296 /* Routine Name: ipsintr_blocking */
3297 /* */
3298 /* Routine Description: */
3299 /* */
3300 /* Finalize an interrupt for internal commands */
3301 /* */
3302 /****************************************************************************/
3303 static void
3304 ipsintr_blocking(ips_ha_t * ha, ips_scb_t * scb)
3306 METHOD_TRACE("ipsintr_blocking", 2);
3308 ips_freescb(ha, scb);
3309 if ((ha->waitflag == TRUE) && (ha->cmd_in_progress == scb->cdb[0])) {
3310 ha->waitflag = FALSE;
3312 return;
3316 /****************************************************************************/
3317 /* */
3318 /* Routine Name: ipsintr_done */
3319 /* */
3320 /* Routine Description: */
3321 /* */
3322 /* Finalize an interrupt for non-internal commands */
3323 /* */
3324 /****************************************************************************/
3325 static void
3326 ipsintr_done(ips_ha_t * ha, ips_scb_t * scb)
3328 METHOD_TRACE("ipsintr_done", 2);
3330 if (!scb) {
3331 IPS_PRINTK(KERN_WARNING, ha->pcidev,
3332 "Spurious interrupt; scb NULL.\n");
3334 return;
3337 if (scb->scsi_cmd == NULL) {
3338 /* unexpected interrupt */
3339 IPS_PRINTK(KERN_WARNING, ha->pcidev,
3340 "Spurious interrupt; scsi_cmd not set.\n");
3342 return;
3345 ips_done(ha, scb);
3348 /****************************************************************************/
3349 /* */
3350 /* Routine Name: ips_done */
3351 /* */
3352 /* Routine Description: */
3353 /* */
3354 /* Do housekeeping on completed commands */
3355 /* ASSUMED to be called form within the request lock */
3356 /****************************************************************************/
3357 static void
3358 ips_done(ips_ha_t * ha, ips_scb_t * scb)
3360 int ret;
3362 METHOD_TRACE("ips_done", 1);
3364 if (!scb)
3365 return;
3367 if ((scb->scsi_cmd) && (ips_is_passthru(scb->scsi_cmd))) {
3368 ips_cleanup_passthru(ha, scb);
3369 ha->num_ioctl--;
3370 } else {
3372 * Check to see if this command had too much
3373 * data and had to be broke up. If so, queue
3374 * the rest of the data and continue.
3376 if ((scb->breakup) || (scb->sg_break)) {
3377 /* we had a data breakup */
3378 scb->data_len = 0;
3380 if (scb->sg_count) {
3381 /* S/G request */
3382 struct scatterlist *sg;
3383 int ips_sg_index = 0;
3384 int sg_dma_index;
3386 sg = scb->scsi_cmd->request_buffer;
3388 /* Spin forward to last dma chunk */
3389 sg_dma_index = scb->breakup;
3391 /* Take care of possible partial on last chunk */
3392 ips_fill_scb_sg_single(ha,
3393 sg_dma_address(&sg
3394 [sg_dma_index]),
3395 scb, ips_sg_index++,
3396 sg_dma_len(&sg
3397 [sg_dma_index]));
3399 for (; sg_dma_index < scb->sg_count;
3400 sg_dma_index++) {
3401 if (ips_fill_scb_sg_single
3402 (ha,
3403 sg_dma_address(&sg[sg_dma_index]),
3404 scb, ips_sg_index++,
3405 sg_dma_len(&sg[sg_dma_index])) < 0)
3406 break;
3410 } else {
3411 /* Non S/G Request */
3412 (void) ips_fill_scb_sg_single(ha,
3413 scb->
3414 data_busaddr +
3415 (scb->sg_break *
3416 ha->max_xfer),
3417 scb, 0,
3418 scb->scsi_cmd->
3419 request_bufflen -
3420 (scb->sg_break *
3421 ha->max_xfer));
3424 scb->dcdb.transfer_length = scb->data_len;
3425 scb->dcdb.cmd_attribute |=
3426 ips_command_direction[scb->scsi_cmd->cmnd[0]];
3428 if (!(scb->dcdb.cmd_attribute & 0x3))
3429 scb->dcdb.transfer_length = 0;
3431 if (scb->data_len >= IPS_MAX_XFER) {
3432 scb->dcdb.cmd_attribute |= IPS_TRANSFER64K;
3433 scb->dcdb.transfer_length = 0;
3436 ret = ips_send_cmd(ha, scb);
3438 switch (ret) {
3439 case IPS_FAILURE:
3440 if (scb->scsi_cmd) {
3441 scb->scsi_cmd->result = DID_ERROR << 16;
3442 scb->scsi_cmd->scsi_done(scb->scsi_cmd);
3445 ips_freescb(ha, scb);
3446 break;
3447 case IPS_SUCCESS_IMM:
3448 if (scb->scsi_cmd) {
3449 scb->scsi_cmd->result = DID_ERROR << 16;
3450 scb->scsi_cmd->scsi_done(scb->scsi_cmd);
3453 ips_freescb(ha, scb);
3454 break;
3455 default:
3456 break;
3457 } /* end case */
3459 return;
3461 } /* end if passthru */
3463 if (scb->bus) {
3464 ha->dcdb_active[scb->bus - 1] &= ~(1 << scb->target_id);
3467 scb->scsi_cmd->scsi_done(scb->scsi_cmd);
3469 ips_freescb(ha, scb);
3472 /****************************************************************************/
3473 /* */
3474 /* Routine Name: ips_map_status */
3475 /* */
3476 /* Routine Description: */
3477 /* */
3478 /* Map Controller Error codes to Linux Error Codes */
3479 /* */
3480 /****************************************************************************/
3481 static int
3482 ips_map_status(ips_ha_t * ha, ips_scb_t * scb, ips_stat_t * sp)
3484 int errcode;
3485 int device_error;
3486 uint32_t transfer_len;
3487 IPS_DCDB_TABLE_TAPE *tapeDCDB;
3489 METHOD_TRACE("ips_map_status", 1);
3491 if (scb->bus) {
3492 DEBUG_VAR(2,
3493 "(%s%d) Physical device error (%d %d %d): %x %x, Sense Key: %x, ASC: %x, ASCQ: %x",
3494 ips_name, ha->host_num,
3495 scb->scsi_cmd->device->channel,
3496 scb->scsi_cmd->device->id, scb->scsi_cmd->device->lun,
3497 scb->basic_status, scb->extended_status,
3498 scb->extended_status ==
3499 IPS_ERR_CKCOND ? scb->dcdb.sense_info[2] & 0xf : 0,
3500 scb->extended_status ==
3501 IPS_ERR_CKCOND ? scb->dcdb.sense_info[12] : 0,
3502 scb->extended_status ==
3503 IPS_ERR_CKCOND ? scb->dcdb.sense_info[13] : 0);
3506 /* default driver error */
3507 errcode = DID_ERROR;
3508 device_error = 0;
3510 switch (scb->basic_status & IPS_GSC_STATUS_MASK) {
3511 case IPS_CMD_TIMEOUT:
3512 errcode = DID_TIME_OUT;
3513 break;
3515 case IPS_INVAL_OPCO:
3516 case IPS_INVAL_CMD_BLK:
3517 case IPS_INVAL_PARM_BLK:
3518 case IPS_LD_ERROR:
3519 case IPS_CMD_CMPLT_WERROR:
3520 break;
3522 case IPS_PHYS_DRV_ERROR:
3523 switch (scb->extended_status) {
3524 case IPS_ERR_SEL_TO:
3525 if (scb->bus)
3526 errcode = DID_NO_CONNECT;
3528 break;
3530 case IPS_ERR_OU_RUN:
3531 if ((scb->cmd.dcdb.op_code == IPS_CMD_EXTENDED_DCDB) ||
3532 (scb->cmd.dcdb.op_code ==
3533 IPS_CMD_EXTENDED_DCDB_SG)) {
3534 tapeDCDB = (IPS_DCDB_TABLE_TAPE *) & scb->dcdb;
3535 transfer_len = tapeDCDB->transfer_length;
3536 } else {
3537 transfer_len =
3538 (uint32_t) scb->dcdb.transfer_length;
3541 if ((scb->bus) && (transfer_len < scb->data_len)) {
3542 /* Underrun - set default to no error */
3543 errcode = DID_OK;
3545 /* Restrict access to physical DASD */
3546 if ((scb->scsi_cmd->cmnd[0] == INQUIRY) &&
3547 ((((char *) scb->scsi_cmd->
3548 buffer)[0] & 0x1f) == TYPE_DISK)) {
3549 /* underflow -- no error */
3550 /* restrict access to physical DASD */
3551 errcode = DID_TIME_OUT;
3552 break;
3554 } else
3555 errcode = DID_ERROR;
3557 break;
3559 case IPS_ERR_RECOVERY:
3560 /* don't fail recovered errors */
3561 if (scb->bus)
3562 errcode = DID_OK;
3564 break;
3566 case IPS_ERR_HOST_RESET:
3567 case IPS_ERR_DEV_RESET:
3568 errcode = DID_RESET;
3569 break;
3571 case IPS_ERR_CKCOND:
3572 if (scb->bus) {
3573 if ((scb->cmd.dcdb.op_code ==
3574 IPS_CMD_EXTENDED_DCDB)
3575 || (scb->cmd.dcdb.op_code ==
3576 IPS_CMD_EXTENDED_DCDB_SG)) {
3577 tapeDCDB =
3578 (IPS_DCDB_TABLE_TAPE *) & scb->dcdb;
3579 memcpy(scb->scsi_cmd->sense_buffer,
3580 tapeDCDB->sense_info,
3581 sizeof (scb->scsi_cmd->
3582 sense_buffer));
3583 } else {
3584 memcpy(scb->scsi_cmd->sense_buffer,
3585 scb->dcdb.sense_info,
3586 sizeof (scb->scsi_cmd->
3587 sense_buffer));
3589 device_error = 2; /* check condition */
3592 errcode = DID_OK;
3594 break;
3596 default:
3597 errcode = DID_ERROR;
3598 break;
3600 } /* end switch */
3601 } /* end switch */
3603 scb->scsi_cmd->result = device_error | (errcode << 16);
3605 return (1);
3608 /****************************************************************************/
3609 /* */
3610 /* Routine Name: ips_send_wait */
3611 /* */
3612 /* Routine Description: */
3613 /* */
3614 /* Send a command to the controller and wait for it to return */
3615 /* */
3616 /* The FFDC Time Stamp use this function for the callback, but doesn't */
3617 /* actually need to wait. */
3618 /****************************************************************************/
3619 static int
3620 ips_send_wait(ips_ha_t * ha, ips_scb_t * scb, int timeout, int intr)
3622 int ret;
3624 METHOD_TRACE("ips_send_wait", 1);
3626 if (intr != IPS_FFDC) { /* Won't be Waiting if this is a Time Stamp */
3627 ha->waitflag = TRUE;
3628 ha->cmd_in_progress = scb->cdb[0];
3630 scb->callback = ipsintr_blocking;
3631 ret = ips_send_cmd(ha, scb);
3633 if ((ret == IPS_FAILURE) || (ret == IPS_SUCCESS_IMM))
3634 return (ret);
3636 if (intr != IPS_FFDC) /* Don't Wait around if this is a Time Stamp */
3637 ret = ips_wait(ha, timeout, intr);
3639 return (ret);
3642 /****************************************************************************/
3643 /* */
3644 /* Routine Name: ips_scmd_buf_write */
3645 /* */
3646 /* Routine Description: */
3647 /* Write data to Scsi_Cmnd request_buffer at proper offsets */
3648 /****************************************************************************/
3649 static void
3650 ips_scmd_buf_write(Scsi_Cmnd * scmd, void *data, unsigned
3651 int count)
3653 if (scmd->use_sg) {
3654 int i;
3655 unsigned int min_cnt, xfer_cnt;
3656 char *cdata = (char *) data;
3657 struct scatterlist *sg = scmd->request_buffer;
3658 for (i = 0, xfer_cnt = 0;
3659 (i < scmd->use_sg) && (xfer_cnt < count); i++) {
3660 if (!IPS_SG_ADDRESS(&sg[i]))
3661 return;
3662 min_cnt = min(count - xfer_cnt, sg[i].length);
3663 memcpy(IPS_SG_ADDRESS(&sg[i]), &cdata[xfer_cnt],
3664 min_cnt);
3665 xfer_cnt += min_cnt;
3668 } else {
3669 unsigned int min_cnt = min(count, scmd->request_bufflen);
3670 memcpy(scmd->request_buffer, data, min_cnt);
3674 /****************************************************************************/
3675 /* */
3676 /* Routine Name: ips_scmd_buf_read */
3677 /* */
3678 /* Routine Description: */
3679 /* Copy data from a Scsi_Cmnd to a new, linear buffer */
3680 /****************************************************************************/
3681 static void
3682 ips_scmd_buf_read(Scsi_Cmnd * scmd, void *data, unsigned
3683 int count)
3685 if (scmd->use_sg) {
3686 int i;
3687 unsigned int min_cnt, xfer_cnt;
3688 char *cdata = (char *) data;
3689 struct scatterlist *sg = scmd->request_buffer;
3690 for (i = 0, xfer_cnt = 0;
3691 (i < scmd->use_sg) && (xfer_cnt < count); i++) {
3692 if (!IPS_SG_ADDRESS(&sg[i]))
3693 return;
3694 min_cnt = min(count - xfer_cnt, sg[i].length);
3695 memcpy(&cdata[xfer_cnt], IPS_SG_ADDRESS(&sg[i]),
3696 min_cnt);
3697 xfer_cnt += min_cnt;
3700 } else {
3701 unsigned int min_cnt = min(count, scmd->request_bufflen);
3702 memcpy(data, scmd->request_buffer, min_cnt);
3706 /****************************************************************************/
3707 /* */
3708 /* Routine Name: ips_send_cmd */
3709 /* */
3710 /* Routine Description: */
3711 /* */
3712 /* Map SCSI commands to ServeRAID commands for logical drives */
3713 /* */
3714 /****************************************************************************/
3715 static int
3716 ips_send_cmd(ips_ha_t * ha, ips_scb_t * scb)
3718 int ret;
3719 char *sp;
3720 int device_error;
3721 IPS_DCDB_TABLE_TAPE *tapeDCDB;
3722 int TimeOut;
3724 METHOD_TRACE("ips_send_cmd", 1);
3726 ret = IPS_SUCCESS;
3728 if (!scb->scsi_cmd) {
3729 /* internal command */
3731 if (scb->bus > 0) {
3732 /* Controller commands can't be issued */
3733 /* to real devices -- fail them */
3734 if ((ha->waitflag == TRUE) &&
3735 (ha->cmd_in_progress == scb->cdb[0])) {
3736 ha->waitflag = FALSE;
3739 return (1);
3741 } else if ((scb->bus == 0) && (!ips_is_passthru(scb->scsi_cmd))) {
3742 /* command to logical bus -- interpret */
3743 ret = IPS_SUCCESS_IMM;
3745 switch (scb->scsi_cmd->cmnd[0]) {
3746 case ALLOW_MEDIUM_REMOVAL:
3747 case REZERO_UNIT:
3748 case ERASE:
3749 case WRITE_FILEMARKS:
3750 case SPACE:
3751 scb->scsi_cmd->result = DID_ERROR << 16;
3752 break;
3754 case START_STOP:
3755 scb->scsi_cmd->result = DID_OK << 16;
3757 case TEST_UNIT_READY:
3758 case INQUIRY:
3759 if (scb->target_id == IPS_ADAPTER_ID) {
3761 * Either we have a TUR
3762 * or we have a SCSI inquiry
3764 if (scb->scsi_cmd->cmnd[0] == TEST_UNIT_READY)
3765 scb->scsi_cmd->result = DID_OK << 16;
3767 if (scb->scsi_cmd->cmnd[0] == INQUIRY) {
3768 IPS_SCSI_INQ_DATA inquiry;
3770 memset(&inquiry, 0,
3771 sizeof (IPS_SCSI_INQ_DATA));
3773 inquiry.DeviceType =
3774 IPS_SCSI_INQ_TYPE_PROCESSOR;
3775 inquiry.DeviceTypeQualifier =
3776 IPS_SCSI_INQ_LU_CONNECTED;
3777 inquiry.Version = IPS_SCSI_INQ_REV2;
3778 inquiry.ResponseDataFormat =
3779 IPS_SCSI_INQ_RD_REV2;
3780 inquiry.AdditionalLength = 31;
3781 inquiry.Flags[0] =
3782 IPS_SCSI_INQ_Address16;
3783 inquiry.Flags[1] =
3784 IPS_SCSI_INQ_WBus16 |
3785 IPS_SCSI_INQ_Sync;
3786 strncpy(inquiry.VendorId, "IBM ",
3788 strncpy(inquiry.ProductId,
3789 "SERVERAID ", 16);
3790 strncpy(inquiry.ProductRevisionLevel,
3791 "1.00", 4);
3793 ips_scmd_buf_write(scb->scsi_cmd,
3794 &inquiry,
3795 sizeof (inquiry));
3797 scb->scsi_cmd->result = DID_OK << 16;
3799 } else {
3800 scb->cmd.logical_info.op_code = IPS_CMD_GET_LD_INFO;
3801 scb->cmd.logical_info.command_id = IPS_COMMAND_ID(ha, scb);
3802 scb->cmd.logical_info.reserved = 0;
3803 scb->cmd.logical_info.reserved2 = 0;
3804 scb->data_len = sizeof (IPS_LD_INFO);
3805 scb->data_busaddr = ha->logical_drive_info_dma_addr;
3806 scb->flags = 0;
3807 scb->cmd.logical_info.buffer_addr = scb->data_busaddr;
3808 ret = IPS_SUCCESS;
3811 break;
3813 case REQUEST_SENSE:
3814 ips_reqsen(ha, scb);
3815 scb->scsi_cmd->result = DID_OK << 16;
3816 break;
3818 case READ_6:
3819 case WRITE_6:
3820 if (!scb->sg_len) {
3821 scb->cmd.basic_io.op_code =
3822 (scb->scsi_cmd->cmnd[0] ==
3823 READ_6) ? IPS_CMD_READ : IPS_CMD_WRITE;
3824 scb->cmd.basic_io.enhanced_sg = 0;
3825 scb->cmd.basic_io.sg_addr =
3826 cpu_to_le32(scb->data_busaddr);
3827 } else {
3828 scb->cmd.basic_io.op_code =
3829 (scb->scsi_cmd->cmnd[0] ==
3830 READ_6) ? IPS_CMD_READ_SG :
3831 IPS_CMD_WRITE_SG;
3832 scb->cmd.basic_io.enhanced_sg =
3833 IPS_USE_ENH_SGLIST(ha) ? 0xFF : 0;
3834 scb->cmd.basic_io.sg_addr =
3835 cpu_to_le32(scb->sg_busaddr);
3838 scb->cmd.basic_io.segment_4G = 0;
3839 scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
3840 scb->cmd.basic_io.log_drv = scb->target_id;
3841 scb->cmd.basic_io.sg_count = scb->sg_len;
3843 if (scb->cmd.basic_io.lba)
3844 scb->cmd.basic_io.lba =
3845 cpu_to_le32(le32_to_cpu
3846 (scb->cmd.basic_io.lba) +
3847 le16_to_cpu(scb->cmd.basic_io.
3848 sector_count));
3849 else
3850 scb->cmd.basic_io.lba =
3851 (((scb->scsi_cmd->
3852 cmnd[1] & 0x1f) << 16) | (scb->scsi_cmd->
3853 cmnd[2] << 8) |
3854 (scb->scsi_cmd->cmnd[3]));
3856 scb->cmd.basic_io.sector_count =
3857 cpu_to_le16(scb->data_len / IPS_BLKSIZE);
3859 if (le16_to_cpu(scb->cmd.basic_io.sector_count) == 0)
3860 scb->cmd.basic_io.sector_count =
3861 cpu_to_le16(256);
3863 ret = IPS_SUCCESS;
3864 break;
3866 case READ_10:
3867 case WRITE_10:
3868 if (!scb->sg_len) {
3869 scb->cmd.basic_io.op_code =
3870 (scb->scsi_cmd->cmnd[0] ==
3871 READ_10) ? IPS_CMD_READ : IPS_CMD_WRITE;
3872 scb->cmd.basic_io.enhanced_sg = 0;
3873 scb->cmd.basic_io.sg_addr =
3874 cpu_to_le32(scb->data_busaddr);
3875 } else {
3876 scb->cmd.basic_io.op_code =
3877 (scb->scsi_cmd->cmnd[0] ==
3878 READ_10) ? IPS_CMD_READ_SG :
3879 IPS_CMD_WRITE_SG;
3880 scb->cmd.basic_io.enhanced_sg =
3881 IPS_USE_ENH_SGLIST(ha) ? 0xFF : 0;
3882 scb->cmd.basic_io.sg_addr =
3883 cpu_to_le32(scb->sg_busaddr);
3886 scb->cmd.basic_io.segment_4G = 0;
3887 scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
3888 scb->cmd.basic_io.log_drv = scb->target_id;
3889 scb->cmd.basic_io.sg_count = scb->sg_len;
3891 if (scb->cmd.basic_io.lba)
3892 scb->cmd.basic_io.lba =
3893 cpu_to_le32(le32_to_cpu
3894 (scb->cmd.basic_io.lba) +
3895 le16_to_cpu(scb->cmd.basic_io.
3896 sector_count));
3897 else
3898 scb->cmd.basic_io.lba =
3899 ((scb->scsi_cmd->cmnd[2] << 24) | (scb->
3900 scsi_cmd->
3901 cmnd[3]
3902 << 16) |
3903 (scb->scsi_cmd->cmnd[4] << 8) | scb->
3904 scsi_cmd->cmnd[5]);
3906 scb->cmd.basic_io.sector_count =
3907 cpu_to_le16(scb->data_len / IPS_BLKSIZE);
3909 if (cpu_to_le16(scb->cmd.basic_io.sector_count) == 0) {
3911 * This is a null condition
3912 * we don't have to do anything
3913 * so just return
3915 scb->scsi_cmd->result = DID_OK << 16;
3916 } else
3917 ret = IPS_SUCCESS;
3919 break;
3921 case RESERVE:
3922 case RELEASE:
3923 scb->scsi_cmd->result = DID_OK << 16;
3924 break;
3926 case MODE_SENSE:
3927 scb->cmd.basic_io.op_code = IPS_CMD_ENQUIRY;
3928 scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
3929 scb->cmd.basic_io.segment_4G = 0;
3930 scb->cmd.basic_io.enhanced_sg = 0;
3931 scb->data_len = sizeof (*ha->enq);
3932 scb->cmd.basic_io.sg_addr = ha->enq_busaddr;
3933 ret = IPS_SUCCESS;
3934 break;
3936 case READ_CAPACITY:
3937 scb->cmd.logical_info.op_code = IPS_CMD_GET_LD_INFO;
3938 scb->cmd.logical_info.command_id = IPS_COMMAND_ID(ha, scb);
3939 scb->cmd.logical_info.reserved = 0;
3940 scb->cmd.logical_info.reserved2 = 0;
3941 scb->cmd.logical_info.reserved3 = 0;
3942 scb->data_len = sizeof (IPS_LD_INFO);
3943 scb->data_busaddr = ha->logical_drive_info_dma_addr;
3944 scb->flags = 0;
3945 scb->cmd.logical_info.buffer_addr = scb->data_busaddr;
3946 ret = IPS_SUCCESS;
3947 break;
3949 case SEND_DIAGNOSTIC:
3950 case REASSIGN_BLOCKS:
3951 case FORMAT_UNIT:
3952 case SEEK_10:
3953 case VERIFY:
3954 case READ_DEFECT_DATA:
3955 case READ_BUFFER:
3956 case WRITE_BUFFER:
3957 scb->scsi_cmd->result = DID_OK << 16;
3958 break;
3960 default:
3961 /* Set the Return Info to appear like the Command was */
3962 /* attempted, a Check Condition occurred, and Sense */
3963 /* Data indicating an Invalid CDB OpCode is returned. */
3964 sp = (char *) scb->scsi_cmd->sense_buffer;
3965 memset(sp, 0, sizeof (scb->scsi_cmd->sense_buffer));
3967 sp[0] = 0x70; /* Error Code */
3968 sp[2] = ILLEGAL_REQUEST; /* Sense Key 5 Illegal Req. */
3969 sp[7] = 0x0A; /* Additional Sense Length */
3970 sp[12] = 0x20; /* ASC = Invalid OpCode */
3971 sp[13] = 0x00; /* ASCQ */
3973 device_error = 2; /* Indicate Check Condition */
3974 scb->scsi_cmd->result = device_error | (DID_OK << 16);
3975 break;
3976 } /* end switch */
3978 /* end if */
3979 if (ret == IPS_SUCCESS_IMM)
3980 return (ret);
3982 /* setup DCDB */
3983 if (scb->bus > 0) {
3985 /* If we already know the Device is Not there, no need to attempt a Command */
3986 /* This also protects an NT FailOver Controller from getting CDB's sent to it */
3987 if (ha->conf->dev[scb->bus - 1][scb->target_id].ucState == 0) {
3988 scb->scsi_cmd->result = DID_NO_CONNECT << 16;
3989 return (IPS_SUCCESS_IMM);
3992 ha->dcdb_active[scb->bus - 1] |= (1 << scb->target_id);
3993 scb->cmd.dcdb.command_id = IPS_COMMAND_ID(ha, scb);
3994 scb->cmd.dcdb.dcdb_address = cpu_to_le32(scb->scb_busaddr +
3995 (unsigned long) &scb->
3996 dcdb -
3997 (unsigned long) scb);
3998 scb->cmd.dcdb.reserved = 0;
3999 scb->cmd.dcdb.reserved2 = 0;
4000 scb->cmd.dcdb.reserved3 = 0;
4001 scb->cmd.dcdb.segment_4G = 0;
4002 scb->cmd.dcdb.enhanced_sg = 0;
4004 TimeOut = scb->scsi_cmd->timeout_per_command;
4006 if (ha->subsys->param[4] & 0x00100000) { /* If NEW Tape DCDB is Supported */
4007 if (!scb->sg_len) {
4008 scb->cmd.dcdb.op_code = IPS_CMD_EXTENDED_DCDB;
4009 } else {
4010 scb->cmd.dcdb.op_code =
4011 IPS_CMD_EXTENDED_DCDB_SG;
4012 scb->cmd.dcdb.enhanced_sg =
4013 IPS_USE_ENH_SGLIST(ha) ? 0xFF : 0;
4016 tapeDCDB = (IPS_DCDB_TABLE_TAPE *) & scb->dcdb; /* Use Same Data Area as Old DCDB Struct */
4017 tapeDCDB->device_address =
4018 ((scb->bus - 1) << 4) | scb->target_id;
4019 tapeDCDB->cmd_attribute |= IPS_DISCONNECT_ALLOWED;
4020 tapeDCDB->cmd_attribute &= ~IPS_TRANSFER64K; /* Always Turn OFF 64K Size Flag */
4022 if (TimeOut) {
4023 if (TimeOut < (10 * HZ))
4024 tapeDCDB->cmd_attribute |= IPS_TIMEOUT10; /* TimeOut is 10 Seconds */
4025 else if (TimeOut < (60 * HZ))
4026 tapeDCDB->cmd_attribute |= IPS_TIMEOUT60; /* TimeOut is 60 Seconds */
4027 else if (TimeOut < (1200 * HZ))
4028 tapeDCDB->cmd_attribute |= IPS_TIMEOUT20M; /* TimeOut is 20 Minutes */
4031 tapeDCDB->cdb_length = scb->scsi_cmd->cmd_len;
4032 tapeDCDB->reserved_for_LUN = 0;
4033 tapeDCDB->transfer_length = scb->data_len;
4034 if (scb->cmd.dcdb.op_code == IPS_CMD_EXTENDED_DCDB_SG)
4035 tapeDCDB->buffer_pointer =
4036 cpu_to_le32(scb->sg_busaddr);
4037 else
4038 tapeDCDB->buffer_pointer =
4039 cpu_to_le32(scb->data_busaddr);
4040 tapeDCDB->sg_count = scb->sg_len;
4041 tapeDCDB->sense_length = sizeof (tapeDCDB->sense_info);
4042 tapeDCDB->scsi_status = 0;
4043 tapeDCDB->reserved = 0;
4044 memcpy(tapeDCDB->scsi_cdb, scb->scsi_cmd->cmnd,
4045 scb->scsi_cmd->cmd_len);
4046 } else {
4047 if (!scb->sg_len) {
4048 scb->cmd.dcdb.op_code = IPS_CMD_DCDB;
4049 } else {
4050 scb->cmd.dcdb.op_code = IPS_CMD_DCDB_SG;
4051 scb->cmd.dcdb.enhanced_sg =
4052 IPS_USE_ENH_SGLIST(ha) ? 0xFF : 0;
4055 scb->dcdb.device_address =
4056 ((scb->bus - 1) << 4) | scb->target_id;
4057 scb->dcdb.cmd_attribute |= IPS_DISCONNECT_ALLOWED;
4059 if (TimeOut) {
4060 if (TimeOut < (10 * HZ))
4061 scb->dcdb.cmd_attribute |= IPS_TIMEOUT10; /* TimeOut is 10 Seconds */
4062 else if (TimeOut < (60 * HZ))
4063 scb->dcdb.cmd_attribute |= IPS_TIMEOUT60; /* TimeOut is 60 Seconds */
4064 else if (TimeOut < (1200 * HZ))
4065 scb->dcdb.cmd_attribute |= IPS_TIMEOUT20M; /* TimeOut is 20 Minutes */
4068 scb->dcdb.transfer_length = scb->data_len;
4069 if (scb->dcdb.cmd_attribute & IPS_TRANSFER64K)
4070 scb->dcdb.transfer_length = 0;
4071 if (scb->cmd.dcdb.op_code == IPS_CMD_DCDB_SG)
4072 scb->dcdb.buffer_pointer =
4073 cpu_to_le32(scb->sg_busaddr);
4074 else
4075 scb->dcdb.buffer_pointer =
4076 cpu_to_le32(scb->data_busaddr);
4077 scb->dcdb.cdb_length = scb->scsi_cmd->cmd_len;
4078 scb->dcdb.sense_length = sizeof (scb->dcdb.sense_info);
4079 scb->dcdb.sg_count = scb->sg_len;
4080 scb->dcdb.reserved = 0;
4081 memcpy(scb->dcdb.scsi_cdb, scb->scsi_cmd->cmnd,
4082 scb->scsi_cmd->cmd_len);
4083 scb->dcdb.scsi_status = 0;
4084 scb->dcdb.reserved2[0] = 0;
4085 scb->dcdb.reserved2[1] = 0;
4086 scb->dcdb.reserved2[2] = 0;
4090 return ((*ha->func.issue) (ha, scb));
4093 /****************************************************************************/
4094 /* */
4095 /* Routine Name: ips_chk_status */
4096 /* */
4097 /* Routine Description: */
4098 /* */
4099 /* Check the status of commands to logical drives */
4100 /* Assumed to be called with the HA lock */
4101 /****************************************************************************/
4102 static void
4103 ips_chkstatus(ips_ha_t * ha, IPS_STATUS * pstatus)
4105 ips_scb_t *scb;
4106 ips_stat_t *sp;
4107 uint8_t basic_status;
4108 uint8_t ext_status;
4109 int errcode;
4111 METHOD_TRACE("ips_chkstatus", 1);
4113 scb = &ha->scbs[pstatus->fields.command_id];
4114 scb->basic_status = basic_status =
4115 pstatus->fields.basic_status & IPS_BASIC_STATUS_MASK;
4116 scb->extended_status = ext_status = pstatus->fields.extended_status;
4118 sp = &ha->sp;
4119 sp->residue_len = 0;
4120 sp->scb_addr = (void *) scb;
4122 /* Remove the item from the active queue */
4123 ips_removeq_scb(&ha->scb_activelist, scb);
4125 if (!scb->scsi_cmd)
4126 /* internal commands are handled in do_ipsintr */
4127 return;
4129 DEBUG_VAR(2, "(%s%d) ips_chkstatus: cmd 0x%X id %d (%d %d %d)",
4130 ips_name,
4131 ha->host_num,
4132 scb->cdb[0],
4133 scb->cmd.basic_io.command_id,
4134 scb->bus, scb->target_id, scb->lun);
4136 if ((scb->scsi_cmd) && (ips_is_passthru(scb->scsi_cmd)))
4137 /* passthru - just returns the raw result */
4138 return;
4140 errcode = DID_OK;
4142 if (((basic_status & IPS_GSC_STATUS_MASK) == IPS_CMD_SUCCESS) ||
4143 ((basic_status & IPS_GSC_STATUS_MASK) == IPS_CMD_RECOVERED_ERROR)) {
4145 if (scb->bus == 0) {
4146 if ((basic_status & IPS_GSC_STATUS_MASK) ==
4147 IPS_CMD_RECOVERED_ERROR) {
4148 DEBUG_VAR(1,
4149 "(%s%d) Recovered Logical Drive Error OpCode: %x, BSB: %x, ESB: %x",
4150 ips_name, ha->host_num,
4151 scb->cmd.basic_io.op_code,
4152 basic_status, ext_status);
4155 switch (scb->scsi_cmd->cmnd[0]) {
4156 case ALLOW_MEDIUM_REMOVAL:
4157 case REZERO_UNIT:
4158 case ERASE:
4159 case WRITE_FILEMARKS:
4160 case SPACE:
4161 errcode = DID_ERROR;
4162 break;
4164 case START_STOP:
4165 break;
4167 case TEST_UNIT_READY:
4168 if (!ips_online(ha, scb)) {
4169 errcode = DID_TIME_OUT;
4171 break;
4173 case INQUIRY:
4174 if (ips_online(ha, scb)) {
4175 ips_inquiry(ha, scb);
4176 } else {
4177 errcode = DID_TIME_OUT;
4179 break;
4181 case REQUEST_SENSE:
4182 ips_reqsen(ha, scb);
4183 break;
4185 case READ_6:
4186 case WRITE_6:
4187 case READ_10:
4188 case WRITE_10:
4189 case RESERVE:
4190 case RELEASE:
4191 break;
4193 case MODE_SENSE:
4194 if (!ips_online(ha, scb)
4195 || !ips_msense(ha, scb)) {
4196 errcode = DID_ERROR;
4198 break;
4200 case READ_CAPACITY:
4201 if (ips_online(ha, scb))
4202 ips_rdcap(ha, scb);
4203 else {
4204 errcode = DID_TIME_OUT;
4206 break;
4208 case SEND_DIAGNOSTIC:
4209 case REASSIGN_BLOCKS:
4210 break;
4212 case FORMAT_UNIT:
4213 errcode = DID_ERROR;
4214 break;
4216 case SEEK_10:
4217 case VERIFY:
4218 case READ_DEFECT_DATA:
4219 case READ_BUFFER:
4220 case WRITE_BUFFER:
4221 break;
4223 default:
4224 errcode = DID_ERROR;
4225 } /* end switch */
4227 scb->scsi_cmd->result = errcode << 16;
4228 } else { /* bus == 0 */
4229 /* restrict access to physical drives */
4230 if ((scb->scsi_cmd->cmnd[0] == INQUIRY) &&
4231 ((((char *) scb->scsi_cmd->buffer)[0] & 0x1f) ==
4232 TYPE_DISK)) {
4234 scb->scsi_cmd->result = DID_TIME_OUT << 16;
4236 } /* else */
4237 } else { /* recovered error / success */
4238 if (scb->bus == 0) {
4239 DEBUG_VAR(1,
4240 "(%s%d) Unrecovered Logical Drive Error OpCode: %x, BSB: %x, ESB: %x",
4241 ips_name, ha->host_num,
4242 scb->cmd.basic_io.op_code, basic_status,
4243 ext_status);
4246 ips_map_status(ha, scb, sp);
4247 } /* else */
4250 /****************************************************************************/
4251 /* */
4252 /* Routine Name: ips_online */
4253 /* */
4254 /* Routine Description: */
4255 /* */
4256 /* Determine if a logical drive is online */
4257 /* */
4258 /****************************************************************************/
4259 static int
4260 ips_online(ips_ha_t * ha, ips_scb_t * scb)
4262 METHOD_TRACE("ips_online", 1);
4264 if (scb->target_id >= IPS_MAX_LD)
4265 return (0);
4267 if ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1) {
4268 memset(ha->logical_drive_info, 0, sizeof (IPS_LD_INFO));
4269 return (0);
4272 if (ha->logical_drive_info->drive_info[scb->target_id].state !=
4273 IPS_LD_OFFLINE
4274 && ha->logical_drive_info->drive_info[scb->target_id].state !=
4275 IPS_LD_FREE
4276 && ha->logical_drive_info->drive_info[scb->target_id].state !=
4277 IPS_LD_CRS
4278 && ha->logical_drive_info->drive_info[scb->target_id].state !=
4279 IPS_LD_SYS)
4280 return (1);
4281 else
4282 return (0);
4285 /****************************************************************************/
4286 /* */
4287 /* Routine Name: ips_inquiry */
4288 /* */
4289 /* Routine Description: */
4290 /* */
4291 /* Simulate an inquiry command to a logical drive */
4292 /* */
4293 /****************************************************************************/
4294 static int
4295 ips_inquiry(ips_ha_t * ha, ips_scb_t * scb)
4297 IPS_SCSI_INQ_DATA inquiry;
4299 METHOD_TRACE("ips_inquiry", 1);
4301 memset(&inquiry, 0, sizeof (IPS_SCSI_INQ_DATA));
4303 inquiry.DeviceType = IPS_SCSI_INQ_TYPE_DASD;
4304 inquiry.DeviceTypeQualifier = IPS_SCSI_INQ_LU_CONNECTED;
4305 inquiry.Version = IPS_SCSI_INQ_REV2;
4306 inquiry.ResponseDataFormat = IPS_SCSI_INQ_RD_REV2;
4307 inquiry.AdditionalLength = 31;
4308 inquiry.Flags[0] = IPS_SCSI_INQ_Address16;
4309 inquiry.Flags[1] =
4310 IPS_SCSI_INQ_WBus16 | IPS_SCSI_INQ_Sync | IPS_SCSI_INQ_CmdQue;
4311 strncpy(inquiry.VendorId, "IBM ", 8);
4312 strncpy(inquiry.ProductId, "SERVERAID ", 16);
4313 strncpy(inquiry.ProductRevisionLevel, "1.00", 4);
4315 ips_scmd_buf_write(scb->scsi_cmd, &inquiry, sizeof (inquiry));
4317 return (1);
4320 /****************************************************************************/
4321 /* */
4322 /* Routine Name: ips_rdcap */
4323 /* */
4324 /* Routine Description: */
4325 /* */
4326 /* Simulate a read capacity command to a logical drive */
4327 /* */
4328 /****************************************************************************/
4329 static int
4330 ips_rdcap(ips_ha_t * ha, ips_scb_t * scb)
4332 IPS_SCSI_CAPACITY cap;
4334 METHOD_TRACE("ips_rdcap", 1);
4336 if (scb->scsi_cmd->bufflen < 8)
4337 return (0);
4339 cap.lba =
4340 cpu_to_be32(le32_to_cpu
4341 (ha->logical_drive_info->
4342 drive_info[scb->target_id].sector_count) - 1);
4343 cap.len = cpu_to_be32((uint32_t) IPS_BLKSIZE);
4345 ips_scmd_buf_write(scb->scsi_cmd, &cap, sizeof (cap));
4347 return (1);
4350 /****************************************************************************/
4351 /* */
4352 /* Routine Name: ips_msense */
4353 /* */
4354 /* Routine Description: */
4355 /* */
4356 /* Simulate a mode sense command to a logical drive */
4357 /* */
4358 /****************************************************************************/
4359 static int
4360 ips_msense(ips_ha_t * ha, ips_scb_t * scb)
4362 uint16_t heads;
4363 uint16_t sectors;
4364 uint32_t cylinders;
4365 IPS_SCSI_MODE_PAGE_DATA mdata;
4367 METHOD_TRACE("ips_msense", 1);
4369 if (le32_to_cpu(ha->enq->ulDriveSize[scb->target_id]) > 0x400000 &&
4370 (ha->enq->ucMiscFlag & 0x8) == 0) {
4371 heads = IPS_NORM_HEADS;
4372 sectors = IPS_NORM_SECTORS;
4373 } else {
4374 heads = IPS_COMP_HEADS;
4375 sectors = IPS_COMP_SECTORS;
4378 cylinders =
4379 (le32_to_cpu(ha->enq->ulDriveSize[scb->target_id]) -
4380 1) / (heads * sectors);
4382 memset(&mdata, 0, sizeof (IPS_SCSI_MODE_PAGE_DATA));
4384 mdata.hdr.BlockDescLength = 8;
4386 switch (scb->scsi_cmd->cmnd[2] & 0x3f) {
4387 case 0x03: /* page 3 */
4388 mdata.pdata.pg3.PageCode = 3;
4389 mdata.pdata.pg3.PageLength = sizeof (IPS_SCSI_MODE_PAGE3);
4390 mdata.hdr.DataLength =
4391 3 + mdata.hdr.BlockDescLength + mdata.pdata.pg3.PageLength;
4392 mdata.pdata.pg3.TracksPerZone = 0;
4393 mdata.pdata.pg3.AltSectorsPerZone = 0;
4394 mdata.pdata.pg3.AltTracksPerZone = 0;
4395 mdata.pdata.pg3.AltTracksPerVolume = 0;
4396 mdata.pdata.pg3.SectorsPerTrack = cpu_to_be16(sectors);
4397 mdata.pdata.pg3.BytesPerSector = cpu_to_be16(IPS_BLKSIZE);
4398 mdata.pdata.pg3.Interleave = cpu_to_be16(1);
4399 mdata.pdata.pg3.TrackSkew = 0;
4400 mdata.pdata.pg3.CylinderSkew = 0;
4401 mdata.pdata.pg3.flags = IPS_SCSI_MP3_SoftSector;
4402 break;
4404 case 0x4:
4405 mdata.pdata.pg4.PageCode = 4;
4406 mdata.pdata.pg4.PageLength = sizeof (IPS_SCSI_MODE_PAGE4);
4407 mdata.hdr.DataLength =
4408 3 + mdata.hdr.BlockDescLength + mdata.pdata.pg4.PageLength;
4409 mdata.pdata.pg4.CylindersHigh =
4410 cpu_to_be16((cylinders >> 8) & 0xFFFF);
4411 mdata.pdata.pg4.CylindersLow = (cylinders & 0xFF);
4412 mdata.pdata.pg4.Heads = heads;
4413 mdata.pdata.pg4.WritePrecompHigh = 0;
4414 mdata.pdata.pg4.WritePrecompLow = 0;
4415 mdata.pdata.pg4.ReducedWriteCurrentHigh = 0;
4416 mdata.pdata.pg4.ReducedWriteCurrentLow = 0;
4417 mdata.pdata.pg4.StepRate = cpu_to_be16(1);
4418 mdata.pdata.pg4.LandingZoneHigh = 0;
4419 mdata.pdata.pg4.LandingZoneLow = 0;
4420 mdata.pdata.pg4.flags = 0;
4421 mdata.pdata.pg4.RotationalOffset = 0;
4422 mdata.pdata.pg4.MediumRotationRate = 0;
4423 break;
4424 case 0x8:
4425 mdata.pdata.pg8.PageCode = 8;
4426 mdata.pdata.pg8.PageLength = sizeof (IPS_SCSI_MODE_PAGE8);
4427 mdata.hdr.DataLength =
4428 3 + mdata.hdr.BlockDescLength + mdata.pdata.pg8.PageLength;
4429 /* everything else is left set to 0 */
4430 break;
4432 default:
4433 return (0);
4434 } /* end switch */
4436 ips_scmd_buf_write(scb->scsi_cmd, &mdata, sizeof (mdata));
4438 return (1);
4441 /****************************************************************************/
4442 /* */
4443 /* Routine Name: ips_reqsen */
4444 /* */
4445 /* Routine Description: */
4446 /* */
4447 /* Simulate a request sense command to a logical drive */
4448 /* */
4449 /****************************************************************************/
4450 static int
4451 ips_reqsen(ips_ha_t * ha, ips_scb_t * scb)
4453 IPS_SCSI_REQSEN reqsen;
4455 METHOD_TRACE("ips_reqsen", 1);
4457 memset(&reqsen, 0, sizeof (IPS_SCSI_REQSEN));
4459 reqsen.ResponseCode =
4460 IPS_SCSI_REQSEN_VALID | IPS_SCSI_REQSEN_CURRENT_ERR;
4461 reqsen.AdditionalLength = 10;
4462 reqsen.AdditionalSenseCode = IPS_SCSI_REQSEN_NO_SENSE;
4463 reqsen.AdditionalSenseCodeQual = IPS_SCSI_REQSEN_NO_SENSE;
4465 ips_scmd_buf_write(scb->scsi_cmd, &reqsen, sizeof (reqsen));
4467 return (1);
4470 /****************************************************************************/
4471 /* */
4472 /* Routine Name: ips_free */
4473 /* */
4474 /* Routine Description: */
4475 /* */
4476 /* Free any allocated space for this controller */
4477 /* */
4478 /****************************************************************************/
4479 static void
4480 ips_free(ips_ha_t * ha)
4483 METHOD_TRACE("ips_free", 1);
4485 if (ha) {
4486 if (ha->enq) {
4487 pci_free_consistent(ha->pcidev, sizeof(IPS_ENQ),
4488 ha->enq, ha->enq_busaddr);
4489 ha->enq = NULL;
4492 if (ha->conf) {
4493 kfree(ha->conf);
4494 ha->conf = NULL;
4497 if (ha->adapt) {
4498 pci_free_consistent(ha->pcidev,
4499 sizeof (IPS_ADAPTER) +
4500 sizeof (IPS_IO_CMD), ha->adapt,
4501 ha->adapt->hw_status_start);
4502 ha->adapt = NULL;
4505 if (ha->logical_drive_info) {
4506 pci_free_consistent(ha->pcidev,
4507 sizeof (IPS_LD_INFO),
4508 ha->logical_drive_info,
4509 ha->logical_drive_info_dma_addr);
4510 ha->logical_drive_info = NULL;
4513 if (ha->nvram) {
4514 kfree(ha->nvram);
4515 ha->nvram = NULL;
4518 if (ha->subsys) {
4519 kfree(ha->subsys);
4520 ha->subsys = NULL;
4523 if (ha->ioctl_data) {
4524 pci_free_consistent(ha->pcidev, ha->ioctl_len,
4525 ha->ioctl_data, ha->ioctl_busaddr);
4526 ha->ioctl_data = NULL;
4527 ha->ioctl_datasize = 0;
4528 ha->ioctl_len = 0;
4530 ips_deallocatescbs(ha, ha->max_cmds);
4532 /* free memory mapped (if applicable) */
4533 if (ha->mem_ptr) {
4534 iounmap(ha->ioremap_ptr);
4535 ha->ioremap_ptr = NULL;
4536 ha->mem_ptr = NULL;
4539 if (ha->mem_addr)
4540 release_mem_region(ha->mem_addr, ha->mem_len);
4541 ha->mem_addr = 0;
4546 /****************************************************************************/
4547 /* */
4548 /* Routine Name: ips_deallocatescbs */
4549 /* */
4550 /* Routine Description: */
4551 /* */
4552 /* Free the command blocks */
4553 /* */
4554 /****************************************************************************/
4555 static int
4556 ips_deallocatescbs(ips_ha_t * ha, int cmds)
4558 if (ha->scbs) {
4559 pci_free_consistent(ha->pcidev,
4560 IPS_SGLIST_SIZE(ha) * IPS_MAX_SG * cmds,
4561 ha->scbs->sg_list.list,
4562 ha->scbs->sg_busaddr);
4563 pci_free_consistent(ha->pcidev, sizeof (ips_scb_t) * cmds,
4564 ha->scbs, ha->scbs->scb_busaddr);
4565 ha->scbs = NULL;
4566 } /* end if */
4567 return 1;
4570 /****************************************************************************/
4571 /* */
4572 /* Routine Name: ips_allocatescbs */
4573 /* */
4574 /* Routine Description: */
4575 /* */
4576 /* Allocate the command blocks */
4577 /* */
4578 /****************************************************************************/
4579 static int
4580 ips_allocatescbs(ips_ha_t * ha)
4582 ips_scb_t *scb_p;
4583 IPS_SG_LIST ips_sg;
4584 int i;
4585 dma_addr_t command_dma, sg_dma;
4587 METHOD_TRACE("ips_allocatescbs", 1);
4589 /* Allocate memory for the SCBs */
4590 ha->scbs =
4591 pci_alloc_consistent(ha->pcidev, ha->max_cmds * sizeof (ips_scb_t),
4592 &command_dma);
4593 if (ha->scbs == NULL)
4594 return 0;
4595 ips_sg.list =
4596 pci_alloc_consistent(ha->pcidev,
4597 IPS_SGLIST_SIZE(ha) * IPS_MAX_SG *
4598 ha->max_cmds, &sg_dma);
4599 if (ips_sg.list == NULL) {
4600 pci_free_consistent(ha->pcidev,
4601 ha->max_cmds * sizeof (ips_scb_t), ha->scbs,
4602 command_dma);
4603 return 0;
4606 memset(ha->scbs, 0, ha->max_cmds * sizeof (ips_scb_t));
4608 for (i = 0; i < ha->max_cmds; i++) {
4609 scb_p = &ha->scbs[i];
4610 scb_p->scb_busaddr = command_dma + sizeof (ips_scb_t) * i;
4611 /* set up S/G list */
4612 if (IPS_USE_ENH_SGLIST(ha)) {
4613 scb_p->sg_list.enh_list =
4614 ips_sg.enh_list + i * IPS_MAX_SG;
4615 scb_p->sg_busaddr =
4616 sg_dma + IPS_SGLIST_SIZE(ha) * IPS_MAX_SG * i;
4617 } else {
4618 scb_p->sg_list.std_list =
4619 ips_sg.std_list + i * IPS_MAX_SG;
4620 scb_p->sg_busaddr =
4621 sg_dma + IPS_SGLIST_SIZE(ha) * IPS_MAX_SG * i;
4624 /* add to the free list */
4625 if (i < ha->max_cmds - 1) {
4626 scb_p->q_next = ha->scb_freelist;
4627 ha->scb_freelist = scb_p;
4631 /* success */
4632 return (1);
4635 /****************************************************************************/
4636 /* */
4637 /* Routine Name: ips_init_scb */
4638 /* */
4639 /* Routine Description: */
4640 /* */
4641 /* Initialize a CCB to default values */
4642 /* */
4643 /****************************************************************************/
4644 static void
4645 ips_init_scb(ips_ha_t * ha, ips_scb_t * scb)
4647 IPS_SG_LIST sg_list;
4648 uint32_t cmd_busaddr, sg_busaddr;
4649 METHOD_TRACE("ips_init_scb", 1);
4651 if (scb == NULL)
4652 return;
4654 sg_list.list = scb->sg_list.list;
4655 cmd_busaddr = scb->scb_busaddr;
4656 sg_busaddr = scb->sg_busaddr;
4657 /* zero fill */
4658 memset(scb, 0, sizeof (ips_scb_t));
4659 memset(ha->dummy, 0, sizeof (IPS_IO_CMD));
4661 /* Initialize dummy command bucket */
4662 ha->dummy->op_code = 0xFF;
4663 ha->dummy->ccsar = cpu_to_le32(ha->adapt->hw_status_start
4664 + sizeof (IPS_ADAPTER));
4665 ha->dummy->command_id = IPS_MAX_CMDS;
4667 /* set bus address of scb */
4668 scb->scb_busaddr = cmd_busaddr;
4669 scb->sg_busaddr = sg_busaddr;
4670 scb->sg_list.list = sg_list.list;
4672 /* Neptune Fix */
4673 scb->cmd.basic_io.cccr = cpu_to_le32((uint32_t) IPS_BIT_ILE);
4674 scb->cmd.basic_io.ccsar = cpu_to_le32(ha->adapt->hw_status_start
4675 + sizeof (IPS_ADAPTER));
4678 /****************************************************************************/
4679 /* */
4680 /* Routine Name: ips_get_scb */
4681 /* */
4682 /* Routine Description: */
4683 /* */
4684 /* Initialize a CCB to default values */
4685 /* */
4686 /* ASSUMED to be callled from within a lock */
4687 /* */
4688 /****************************************************************************/
4689 static ips_scb_t *
4690 ips_getscb(ips_ha_t * ha)
4692 ips_scb_t *scb;
4694 METHOD_TRACE("ips_getscb", 1);
4696 if ((scb = ha->scb_freelist) == NULL) {
4698 return (NULL);
4701 ha->scb_freelist = scb->q_next;
4702 scb->flags = 0;
4703 scb->q_next = NULL;
4705 ips_init_scb(ha, scb);
4707 return (scb);
4710 /****************************************************************************/
4711 /* */
4712 /* Routine Name: ips_free_scb */
4713 /* */
4714 /* Routine Description: */
4715 /* */
4716 /* Return an unused CCB back to the free list */
4717 /* */
4718 /* ASSUMED to be called from within a lock */
4719 /* */
4720 /****************************************************************************/
4721 static void
4722 ips_freescb(ips_ha_t * ha, ips_scb_t * scb)
4725 METHOD_TRACE("ips_freescb", 1);
4726 if (scb->flags & IPS_SCB_MAP_SG)
4727 pci_unmap_sg(ha->pcidev, scb->scsi_cmd->request_buffer,
4728 scb->scsi_cmd->use_sg, IPS_DMA_DIR(scb));
4729 else if (scb->flags & IPS_SCB_MAP_SINGLE)
4730 pci_unmap_single(ha->pcidev, scb->data_busaddr, scb->data_len,
4731 IPS_DMA_DIR(scb));
4733 /* check to make sure this is not our "special" scb */
4734 if (IPS_COMMAND_ID(ha, scb) < (ha->max_cmds - 1)) {
4735 scb->q_next = ha->scb_freelist;
4736 ha->scb_freelist = scb;
4740 /****************************************************************************/
4741 /* */
4742 /* Routine Name: ips_isinit_copperhead */
4743 /* */
4744 /* Routine Description: */
4745 /* */
4746 /* Is controller initialized ? */
4747 /* */
4748 /****************************************************************************/
4749 static int
4750 ips_isinit_copperhead(ips_ha_t * ha)
4752 uint8_t scpr;
4753 uint8_t isr;
4755 METHOD_TRACE("ips_isinit_copperhead", 1);
4757 isr = inb(ha->io_addr + IPS_REG_HISR);
4758 scpr = inb(ha->io_addr + IPS_REG_SCPR);
4760 if (((isr & IPS_BIT_EI) == 0) && ((scpr & IPS_BIT_EBM) == 0))
4761 return (0);
4762 else
4763 return (1);
4766 /****************************************************************************/
4767 /* */
4768 /* Routine Name: ips_isinit_copperhead_memio */
4769 /* */
4770 /* Routine Description: */
4771 /* */
4772 /* Is controller initialized ? */
4773 /* */
4774 /****************************************************************************/
4775 static int
4776 ips_isinit_copperhead_memio(ips_ha_t * ha)
4778 uint8_t isr = 0;
4779 uint8_t scpr;
4781 METHOD_TRACE("ips_is_init_copperhead_memio", 1);
4783 isr = readb(ha->mem_ptr + IPS_REG_HISR);
4784 scpr = readb(ha->mem_ptr + IPS_REG_SCPR);
4786 if (((isr & IPS_BIT_EI) == 0) && ((scpr & IPS_BIT_EBM) == 0))
4787 return (0);
4788 else
4789 return (1);
4792 /****************************************************************************/
4793 /* */
4794 /* Routine Name: ips_isinit_morpheus */
4795 /* */
4796 /* Routine Description: */
4797 /* */
4798 /* Is controller initialized ? */
4799 /* */
4800 /****************************************************************************/
4801 static int
4802 ips_isinit_morpheus(ips_ha_t * ha)
4804 uint32_t post;
4805 uint32_t bits;
4807 METHOD_TRACE("ips_is_init_morpheus", 1);
4809 post = readl(ha->mem_ptr + IPS_REG_I960_MSG0);
4810 bits = readl(ha->mem_ptr + IPS_REG_I2O_HIR);
4812 if (post == 0)
4813 return (0);
4814 else if (bits & 0x3)
4815 return (0);
4816 else
4817 return (1);
4820 /****************************************************************************/
4821 /* */
4822 /* Routine Name: ips_enable_int_copperhead */
4823 /* */
4824 /* Routine Description: */
4825 /* Turn on interrupts */
4826 /* */
4827 /****************************************************************************/
4828 static void
4829 ips_enable_int_copperhead(ips_ha_t * ha)
4831 METHOD_TRACE("ips_enable_int_copperhead", 1);
4833 outb(ha->io_addr + IPS_REG_HISR, IPS_BIT_EI);
4834 inb(ha->io_addr + IPS_REG_HISR); /*Ensure PCI Posting Completes*/
4837 /****************************************************************************/
4838 /* */
4839 /* Routine Name: ips_enable_int_copperhead_memio */
4840 /* */
4841 /* Routine Description: */
4842 /* Turn on interrupts */
4843 /* */
4844 /****************************************************************************/
4845 static void
4846 ips_enable_int_copperhead_memio(ips_ha_t * ha)
4848 METHOD_TRACE("ips_enable_int_copperhead_memio", 1);
4850 writeb(IPS_BIT_EI, ha->mem_ptr + IPS_REG_HISR);
4851 readb(ha->mem_ptr + IPS_REG_HISR); /*Ensure PCI Posting Completes*/
4854 /****************************************************************************/
4855 /* */
4856 /* Routine Name: ips_enable_int_morpheus */
4857 /* */
4858 /* Routine Description: */
4859 /* Turn on interrupts */
4860 /* */
4861 /****************************************************************************/
4862 static void
4863 ips_enable_int_morpheus(ips_ha_t * ha)
4865 uint32_t Oimr;
4867 METHOD_TRACE("ips_enable_int_morpheus", 1);
4869 Oimr = readl(ha->mem_ptr + IPS_REG_I960_OIMR);
4870 Oimr &= ~0x08;
4871 writel(Oimr, ha->mem_ptr + IPS_REG_I960_OIMR);
4872 readl(ha->mem_ptr + IPS_REG_I960_OIMR); /*Ensure PCI Posting Completes*/
4875 /****************************************************************************/
4876 /* */
4877 /* Routine Name: ips_init_copperhead */
4878 /* */
4879 /* Routine Description: */
4880 /* */
4881 /* Initialize a copperhead controller */
4882 /* */
4883 /****************************************************************************/
4884 static int
4885 ips_init_copperhead(ips_ha_t * ha)
4887 uint8_t Isr;
4888 uint8_t Cbsp;
4889 uint8_t PostByte[IPS_MAX_POST_BYTES];
4890 uint8_t ConfigByte[IPS_MAX_CONFIG_BYTES];
4891 int i, j;
4893 METHOD_TRACE("ips_init_copperhead", 1);
4895 for (i = 0; i < IPS_MAX_POST_BYTES; i++) {
4896 for (j = 0; j < 45; j++) {
4897 Isr = inb(ha->io_addr + IPS_REG_HISR);
4898 if (Isr & IPS_BIT_GHI)
4899 break;
4901 /* Delay for 1 Second */
4902 MDELAY(IPS_ONE_SEC);
4905 if (j >= 45)
4906 /* error occurred */
4907 return (0);
4909 PostByte[i] = inb(ha->io_addr + IPS_REG_ISPR);
4910 outb(Isr, ha->io_addr + IPS_REG_HISR);
4913 if (PostByte[0] < IPS_GOOD_POST_STATUS) {
4914 IPS_PRINTK(KERN_WARNING, ha->pcidev,
4915 "reset controller fails (post status %x %x).\n",
4916 PostByte[0], PostByte[1]);
4918 return (0);
4921 for (i = 0; i < IPS_MAX_CONFIG_BYTES; i++) {
4922 for (j = 0; j < 240; j++) {
4923 Isr = inb(ha->io_addr + IPS_REG_HISR);
4924 if (Isr & IPS_BIT_GHI)
4925 break;
4927 /* Delay for 1 Second */
4928 MDELAY(IPS_ONE_SEC);
4931 if (j >= 240)
4932 /* error occurred */
4933 return (0);
4935 ConfigByte[i] = inb(ha->io_addr + IPS_REG_ISPR);
4936 outb(Isr, ha->io_addr + IPS_REG_HISR);
4939 for (i = 0; i < 240; i++) {
4940 Cbsp = inb(ha->io_addr + IPS_REG_CBSP);
4942 if ((Cbsp & IPS_BIT_OP) == 0)
4943 break;
4945 /* Delay for 1 Second */
4946 MDELAY(IPS_ONE_SEC);
4949 if (i >= 240)
4950 /* reset failed */
4951 return (0);
4953 /* setup CCCR */
4954 outl(cpu_to_le32(0x1010), ha->io_addr + IPS_REG_CCCR);
4956 /* Enable busmastering */
4957 outb(IPS_BIT_EBM, ha->io_addr + IPS_REG_SCPR);
4959 if (ha->revision_id == IPS_REVID_TROMBONE64)
4960 /* fix for anaconda64 */
4961 outl(0, ha->io_addr + IPS_REG_NDAE);
4963 /* Enable interrupts */
4964 outb(IPS_BIT_EI, ha->io_addr + IPS_REG_HISR);
4966 return (1);
4969 /****************************************************************************/
4970 /* */
4971 /* Routine Name: ips_init_copperhead_memio */
4972 /* */
4973 /* Routine Description: */
4974 /* */
4975 /* Initialize a copperhead controller with memory mapped I/O */
4976 /* */
4977 /****************************************************************************/
4978 static int
4979 ips_init_copperhead_memio(ips_ha_t * ha)
4981 uint8_t Isr = 0;
4982 uint8_t Cbsp;
4983 uint8_t PostByte[IPS_MAX_POST_BYTES];
4984 uint8_t ConfigByte[IPS_MAX_CONFIG_BYTES];
4985 int i, j;
4987 METHOD_TRACE("ips_init_copperhead_memio", 1);
4989 for (i = 0; i < IPS_MAX_POST_BYTES; i++) {
4990 for (j = 0; j < 45; j++) {
4991 Isr = readb(ha->mem_ptr + IPS_REG_HISR);
4992 if (Isr & IPS_BIT_GHI)
4993 break;
4995 /* Delay for 1 Second */
4996 MDELAY(IPS_ONE_SEC);
4999 if (j >= 45)
5000 /* error occurred */
5001 return (0);
5003 PostByte[i] = readb(ha->mem_ptr + IPS_REG_ISPR);
5004 writeb(Isr, ha->mem_ptr + IPS_REG_HISR);
5007 if (PostByte[0] < IPS_GOOD_POST_STATUS) {
5008 IPS_PRINTK(KERN_WARNING, ha->pcidev,
5009 "reset controller fails (post status %x %x).\n",
5010 PostByte[0], PostByte[1]);
5012 return (0);
5015 for (i = 0; i < IPS_MAX_CONFIG_BYTES; i++) {
5016 for (j = 0; j < 240; j++) {
5017 Isr = readb(ha->mem_ptr + IPS_REG_HISR);
5018 if (Isr & IPS_BIT_GHI)
5019 break;
5021 /* Delay for 1 Second */
5022 MDELAY(IPS_ONE_SEC);
5025 if (j >= 240)
5026 /* error occurred */
5027 return (0);
5029 ConfigByte[i] = readb(ha->mem_ptr + IPS_REG_ISPR);
5030 writeb(Isr, ha->mem_ptr + IPS_REG_HISR);
5033 for (i = 0; i < 240; i++) {
5034 Cbsp = readb(ha->mem_ptr + IPS_REG_CBSP);
5036 if ((Cbsp & IPS_BIT_OP) == 0)
5037 break;
5039 /* Delay for 1 Second */
5040 MDELAY(IPS_ONE_SEC);
5043 if (i >= 240)
5044 /* error occurred */
5045 return (0);
5047 /* setup CCCR */
5048 writel(0x1010, ha->mem_ptr + IPS_REG_CCCR);
5050 /* Enable busmastering */
5051 writeb(IPS_BIT_EBM, ha->mem_ptr + IPS_REG_SCPR);
5053 if (ha->revision_id == IPS_REVID_TROMBONE64)
5054 /* fix for anaconda64 */
5055 writel(0, ha->mem_ptr + IPS_REG_NDAE);
5057 /* Enable interrupts */
5058 writeb(IPS_BIT_EI, ha->mem_ptr + IPS_REG_HISR);
5060 /* if we get here then everything went OK */
5061 return (1);
5064 /****************************************************************************/
5065 /* */
5066 /* Routine Name: ips_init_morpheus */
5067 /* */
5068 /* Routine Description: */
5069 /* */
5070 /* Initialize a morpheus controller */
5071 /* */
5072 /****************************************************************************/
5073 static int
5074 ips_init_morpheus(ips_ha_t * ha)
5076 uint32_t Post;
5077 uint32_t Config;
5078 uint32_t Isr;
5079 uint32_t Oimr;
5080 int i;
5082 METHOD_TRACE("ips_init_morpheus", 1);
5084 /* Wait up to 45 secs for Post */
5085 for (i = 0; i < 45; i++) {
5086 Isr = readl(ha->mem_ptr + IPS_REG_I2O_HIR);
5088 if (Isr & IPS_BIT_I960_MSG0I)
5089 break;
5091 /* Delay for 1 Second */
5092 MDELAY(IPS_ONE_SEC);
5095 if (i >= 45) {
5096 /* error occurred */
5097 IPS_PRINTK(KERN_WARNING, ha->pcidev,
5098 "timeout waiting for post.\n");
5100 return (0);
5103 Post = readl(ha->mem_ptr + IPS_REG_I960_MSG0);
5105 if (Post == 0x4F00) { /* If Flashing the Battery PIC */
5106 IPS_PRINTK(KERN_WARNING, ha->pcidev,
5107 "Flashing Battery PIC, Please wait ...\n");
5109 /* Clear the interrupt bit */
5110 Isr = (uint32_t) IPS_BIT_I960_MSG0I;
5111 writel(Isr, ha->mem_ptr + IPS_REG_I2O_HIR);
5113 for (i = 0; i < 120; i++) { /* Wait Up to 2 Min. for Completion */
5114 Post = readl(ha->mem_ptr + IPS_REG_I960_MSG0);
5115 if (Post != 0x4F00)
5116 break;
5117 /* Delay for 1 Second */
5118 MDELAY(IPS_ONE_SEC);
5121 if (i >= 120) {
5122 IPS_PRINTK(KERN_WARNING, ha->pcidev,
5123 "timeout waiting for Battery PIC Flash\n");
5124 return (0);
5129 /* Clear the interrupt bit */
5130 Isr = (uint32_t) IPS_BIT_I960_MSG0I;
5131 writel(Isr, ha->mem_ptr + IPS_REG_I2O_HIR);
5133 if (Post < (IPS_GOOD_POST_STATUS << 8)) {
5134 IPS_PRINTK(KERN_WARNING, ha->pcidev,
5135 "reset controller fails (post status %x).\n", Post);
5137 return (0);
5140 /* Wait up to 240 secs for config bytes */
5141 for (i = 0; i < 240; i++) {
5142 Isr = readl(ha->mem_ptr + IPS_REG_I2O_HIR);
5144 if (Isr & IPS_BIT_I960_MSG1I)
5145 break;
5147 /* Delay for 1 Second */
5148 MDELAY(IPS_ONE_SEC);
5151 if (i >= 240) {
5152 /* error occurred */
5153 IPS_PRINTK(KERN_WARNING, ha->pcidev,
5154 "timeout waiting for config.\n");
5156 return (0);
5159 Config = readl(ha->mem_ptr + IPS_REG_I960_MSG1);
5161 /* Clear interrupt bit */
5162 Isr = (uint32_t) IPS_BIT_I960_MSG1I;
5163 writel(Isr, ha->mem_ptr + IPS_REG_I2O_HIR);
5165 /* Turn on the interrupts */
5166 Oimr = readl(ha->mem_ptr + IPS_REG_I960_OIMR);
5167 Oimr &= ~0x8;
5168 writel(Oimr, ha->mem_ptr + IPS_REG_I960_OIMR);
5170 /* if we get here then everything went OK */
5172 /* Since we did a RESET, an EraseStripeLock may be needed */
5173 if (Post == 0xEF10) {
5174 if ((Config == 0x000F) || (Config == 0x0009))
5175 ha->requires_esl = 1;
5178 return (1);
5181 /****************************************************************************/
5182 /* */
5183 /* Routine Name: ips_reset_copperhead */
5184 /* */
5185 /* Routine Description: */
5186 /* */
5187 /* Reset the controller */
5188 /* */
5189 /****************************************************************************/
5190 static int
5191 ips_reset_copperhead(ips_ha_t * ha)
5193 int reset_counter;
5195 METHOD_TRACE("ips_reset_copperhead", 1);
5197 DEBUG_VAR(1, "(%s%d) ips_reset_copperhead: io addr: %x, irq: %d",
5198 ips_name, ha->host_num, ha->io_addr, ha->irq);
5200 reset_counter = 0;
5202 while (reset_counter < 2) {
5203 reset_counter++;
5205 outb(IPS_BIT_RST, ha->io_addr + IPS_REG_SCPR);
5207 /* Delay for 1 Second */
5208 MDELAY(IPS_ONE_SEC);
5210 outb(0, ha->io_addr + IPS_REG_SCPR);
5212 /* Delay for 1 Second */
5213 MDELAY(IPS_ONE_SEC);
5215 if ((*ha->func.init) (ha))
5216 break;
5217 else if (reset_counter >= 2) {
5219 return (0);
5223 return (1);
5226 /****************************************************************************/
5227 /* */
5228 /* Routine Name: ips_reset_copperhead_memio */
5229 /* */
5230 /* Routine Description: */
5231 /* */
5232 /* Reset the controller */
5233 /* */
5234 /****************************************************************************/
5235 static int
5236 ips_reset_copperhead_memio(ips_ha_t * ha)
5238 int reset_counter;
5240 METHOD_TRACE("ips_reset_copperhead_memio", 1);
5242 DEBUG_VAR(1, "(%s%d) ips_reset_copperhead_memio: mem addr: %x, irq: %d",
5243 ips_name, ha->host_num, ha->mem_addr, ha->irq);
5245 reset_counter = 0;
5247 while (reset_counter < 2) {
5248 reset_counter++;
5250 writeb(IPS_BIT_RST, ha->mem_ptr + IPS_REG_SCPR);
5252 /* Delay for 1 Second */
5253 MDELAY(IPS_ONE_SEC);
5255 writeb(0, ha->mem_ptr + IPS_REG_SCPR);
5257 /* Delay for 1 Second */
5258 MDELAY(IPS_ONE_SEC);
5260 if ((*ha->func.init) (ha))
5261 break;
5262 else if (reset_counter >= 2) {
5264 return (0);
5268 return (1);
5271 /****************************************************************************/
5272 /* */
5273 /* Routine Name: ips_reset_morpheus */
5274 /* */
5275 /* Routine Description: */
5276 /* */
5277 /* Reset the controller */
5278 /* */
5279 /****************************************************************************/
5280 static int
5281 ips_reset_morpheus(ips_ha_t * ha)
5283 int reset_counter;
5284 uint8_t junk;
5286 METHOD_TRACE("ips_reset_morpheus", 1);
5288 DEBUG_VAR(1, "(%s%d) ips_reset_morpheus: mem addr: %x, irq: %d",
5289 ips_name, ha->host_num, ha->mem_addr, ha->irq);
5291 reset_counter = 0;
5293 while (reset_counter < 2) {
5294 reset_counter++;
5296 writel(0x80000000, ha->mem_ptr + IPS_REG_I960_IDR);
5298 /* Delay for 5 Seconds */
5299 MDELAY(5 * IPS_ONE_SEC);
5301 /* Do a PCI config read to wait for adapter */
5302 pci_read_config_byte(ha->pcidev, 4, &junk);
5304 if ((*ha->func.init) (ha))
5305 break;
5306 else if (reset_counter >= 2) {
5308 return (0);
5312 return (1);
5315 /****************************************************************************/
5316 /* */
5317 /* Routine Name: ips_statinit */
5318 /* */
5319 /* Routine Description: */
5320 /* */
5321 /* Initialize the status queues on the controller */
5322 /* */
5323 /****************************************************************************/
5324 static void
5325 ips_statinit(ips_ha_t * ha)
5327 uint32_t phys_status_start;
5329 METHOD_TRACE("ips_statinit", 1);
5331 ha->adapt->p_status_start = ha->adapt->status;
5332 ha->adapt->p_status_end = ha->adapt->status + IPS_MAX_CMDS;
5333 ha->adapt->p_status_tail = ha->adapt->status;
5335 phys_status_start = ha->adapt->hw_status_start;
5336 outl(cpu_to_le32(phys_status_start), ha->io_addr + IPS_REG_SQSR);
5337 outl(cpu_to_le32(phys_status_start + IPS_STATUS_Q_SIZE),
5338 ha->io_addr + IPS_REG_SQER);
5339 outl(cpu_to_le32(phys_status_start + IPS_STATUS_SIZE),
5340 ha->io_addr + IPS_REG_SQHR);
5341 outl(cpu_to_le32(phys_status_start), ha->io_addr + IPS_REG_SQTR);
5343 ha->adapt->hw_status_tail = phys_status_start;
5346 /****************************************************************************/
5347 /* */
5348 /* Routine Name: ips_statinit_memio */
5349 /* */
5350 /* Routine Description: */
5351 /* */
5352 /* Initialize the status queues on the controller */
5353 /* */
5354 /****************************************************************************/
5355 static void
5356 ips_statinit_memio(ips_ha_t * ha)
5358 uint32_t phys_status_start;
5360 METHOD_TRACE("ips_statinit_memio", 1);
5362 ha->adapt->p_status_start = ha->adapt->status;
5363 ha->adapt->p_status_end = ha->adapt->status + IPS_MAX_CMDS;
5364 ha->adapt->p_status_tail = ha->adapt->status;
5366 phys_status_start = ha->adapt->hw_status_start;
5367 writel(phys_status_start, ha->mem_ptr + IPS_REG_SQSR);
5368 writel(phys_status_start + IPS_STATUS_Q_SIZE,
5369 ha->mem_ptr + IPS_REG_SQER);
5370 writel(phys_status_start + IPS_STATUS_SIZE, ha->mem_ptr + IPS_REG_SQHR);
5371 writel(phys_status_start, ha->mem_ptr + IPS_REG_SQTR);
5373 ha->adapt->hw_status_tail = phys_status_start;
5376 /****************************************************************************/
5377 /* */
5378 /* Routine Name: ips_statupd_copperhead */
5379 /* */
5380 /* Routine Description: */
5381 /* */
5382 /* Remove an element from the status queue */
5383 /* */
5384 /****************************************************************************/
5385 static uint32_t
5386 ips_statupd_copperhead(ips_ha_t * ha)
5388 METHOD_TRACE("ips_statupd_copperhead", 1);
5390 if (ha->adapt->p_status_tail != ha->adapt->p_status_end) {
5391 ha->adapt->p_status_tail++;
5392 ha->adapt->hw_status_tail += sizeof (IPS_STATUS);
5393 } else {
5394 ha->adapt->p_status_tail = ha->adapt->p_status_start;
5395 ha->adapt->hw_status_tail = ha->adapt->hw_status_start;
5398 outl(cpu_to_le32(ha->adapt->hw_status_tail),
5399 ha->io_addr + IPS_REG_SQTR);
5401 return (ha->adapt->p_status_tail->value);
5404 /****************************************************************************/
5405 /* */
5406 /* Routine Name: ips_statupd_copperhead_memio */
5407 /* */
5408 /* Routine Description: */
5409 /* */
5410 /* Remove an element from the status queue */
5411 /* */
5412 /****************************************************************************/
5413 static uint32_t
5414 ips_statupd_copperhead_memio(ips_ha_t * ha)
5416 METHOD_TRACE("ips_statupd_copperhead_memio", 1);
5418 if (ha->adapt->p_status_tail != ha->adapt->p_status_end) {
5419 ha->adapt->p_status_tail++;
5420 ha->adapt->hw_status_tail += sizeof (IPS_STATUS);
5421 } else {
5422 ha->adapt->p_status_tail = ha->adapt->p_status_start;
5423 ha->adapt->hw_status_tail = ha->adapt->hw_status_start;
5426 writel(ha->adapt->hw_status_tail, ha->mem_ptr + IPS_REG_SQTR);
5428 return (ha->adapt->p_status_tail->value);
5431 /****************************************************************************/
5432 /* */
5433 /* Routine Name: ips_statupd_morpheus */
5434 /* */
5435 /* Routine Description: */
5436 /* */
5437 /* Remove an element from the status queue */
5438 /* */
5439 /****************************************************************************/
5440 static uint32_t
5441 ips_statupd_morpheus(ips_ha_t * ha)
5443 uint32_t val;
5445 METHOD_TRACE("ips_statupd_morpheus", 1);
5447 val = readl(ha->mem_ptr + IPS_REG_I2O_OUTMSGQ);
5449 return (val);
5452 /****************************************************************************/
5453 /* */
5454 /* Routine Name: ips_issue_copperhead */
5455 /* */
5456 /* Routine Description: */
5457 /* */
5458 /* Send a command down to the controller */
5459 /* */
5460 /****************************************************************************/
5461 static int
5462 ips_issue_copperhead(ips_ha_t * ha, ips_scb_t * scb)
5464 uint32_t TimeOut;
5465 uint32_t val;
5467 METHOD_TRACE("ips_issue_copperhead", 1);
5469 if (scb->scsi_cmd) {
5470 DEBUG_VAR(2, "(%s%d) ips_issue: cmd 0x%X id %d (%d %d %d)",
5471 ips_name,
5472 ha->host_num,
5473 scb->cdb[0],
5474 scb->cmd.basic_io.command_id,
5475 scb->bus, scb->target_id, scb->lun);
5476 } else {
5477 DEBUG_VAR(2, KERN_NOTICE "(%s%d) ips_issue: logical cmd id %d",
5478 ips_name, ha->host_num, scb->cmd.basic_io.command_id);
5481 TimeOut = 0;
5483 while ((val =
5484 le32_to_cpu(inl(ha->io_addr + IPS_REG_CCCR))) & IPS_BIT_SEM) {
5485 udelay(1000);
5487 if (++TimeOut >= IPS_SEM_TIMEOUT) {
5488 if (!(val & IPS_BIT_START_STOP))
5489 break;
5491 IPS_PRINTK(KERN_WARNING, ha->pcidev,
5492 "ips_issue val [0x%x].\n", val);
5493 IPS_PRINTK(KERN_WARNING, ha->pcidev,
5494 "ips_issue semaphore chk timeout.\n");
5496 return (IPS_FAILURE);
5497 } /* end if */
5498 } /* end while */
5500 outl(cpu_to_le32(scb->scb_busaddr), ha->io_addr + IPS_REG_CCSAR);
5501 outw(cpu_to_le32(IPS_BIT_START_CMD), ha->io_addr + IPS_REG_CCCR);
5503 return (IPS_SUCCESS);
5506 /****************************************************************************/
5507 /* */
5508 /* Routine Name: ips_issue_copperhead_memio */
5509 /* */
5510 /* Routine Description: */
5511 /* */
5512 /* Send a command down to the controller */
5513 /* */
5514 /****************************************************************************/
5515 static int
5516 ips_issue_copperhead_memio(ips_ha_t * ha, ips_scb_t * scb)
5518 uint32_t TimeOut;
5519 uint32_t val;
5521 METHOD_TRACE("ips_issue_copperhead_memio", 1);
5523 if (scb->scsi_cmd) {
5524 DEBUG_VAR(2, "(%s%d) ips_issue: cmd 0x%X id %d (%d %d %d)",
5525 ips_name,
5526 ha->host_num,
5527 scb->cdb[0],
5528 scb->cmd.basic_io.command_id,
5529 scb->bus, scb->target_id, scb->lun);
5530 } else {
5531 DEBUG_VAR(2, "(%s%d) ips_issue: logical cmd id %d",
5532 ips_name, ha->host_num, scb->cmd.basic_io.command_id);
5535 TimeOut = 0;
5537 while ((val = readl(ha->mem_ptr + IPS_REG_CCCR)) & IPS_BIT_SEM) {
5538 udelay(1000);
5540 if (++TimeOut >= IPS_SEM_TIMEOUT) {
5541 if (!(val & IPS_BIT_START_STOP))
5542 break;
5544 IPS_PRINTK(KERN_WARNING, ha->pcidev,
5545 "ips_issue val [0x%x].\n", val);
5546 IPS_PRINTK(KERN_WARNING, ha->pcidev,
5547 "ips_issue semaphore chk timeout.\n");
5549 return (IPS_FAILURE);
5550 } /* end if */
5551 } /* end while */
5553 writel(scb->scb_busaddr, ha->mem_ptr + IPS_REG_CCSAR);
5554 writel(IPS_BIT_START_CMD, ha->mem_ptr + IPS_REG_CCCR);
5556 return (IPS_SUCCESS);
5559 /****************************************************************************/
5560 /* */
5561 /* Routine Name: ips_issue_i2o */
5562 /* */
5563 /* Routine Description: */
5564 /* */
5565 /* Send a command down to the controller */
5566 /* */
5567 /****************************************************************************/
5568 static int
5569 ips_issue_i2o(ips_ha_t * ha, ips_scb_t * scb)
5572 METHOD_TRACE("ips_issue_i2o", 1);
5574 if (scb->scsi_cmd) {
5575 DEBUG_VAR(2, "(%s%d) ips_issue: cmd 0x%X id %d (%d %d %d)",
5576 ips_name,
5577 ha->host_num,
5578 scb->cdb[0],
5579 scb->cmd.basic_io.command_id,
5580 scb->bus, scb->target_id, scb->lun);
5581 } else {
5582 DEBUG_VAR(2, "(%s%d) ips_issue: logical cmd id %d",
5583 ips_name, ha->host_num, scb->cmd.basic_io.command_id);
5586 outl(cpu_to_le32(scb->scb_busaddr), ha->io_addr + IPS_REG_I2O_INMSGQ);
5588 return (IPS_SUCCESS);
5591 /****************************************************************************/
5592 /* */
5593 /* Routine Name: ips_issue_i2o_memio */
5594 /* */
5595 /* Routine Description: */
5596 /* */
5597 /* Send a command down to the controller */
5598 /* */
5599 /****************************************************************************/
5600 static int
5601 ips_issue_i2o_memio(ips_ha_t * ha, ips_scb_t * scb)
5604 METHOD_TRACE("ips_issue_i2o_memio", 1);
5606 if (scb->scsi_cmd) {
5607 DEBUG_VAR(2, "(%s%d) ips_issue: cmd 0x%X id %d (%d %d %d)",
5608 ips_name,
5609 ha->host_num,
5610 scb->cdb[0],
5611 scb->cmd.basic_io.command_id,
5612 scb->bus, scb->target_id, scb->lun);
5613 } else {
5614 DEBUG_VAR(2, "(%s%d) ips_issue: logical cmd id %d",
5615 ips_name, ha->host_num, scb->cmd.basic_io.command_id);
5618 writel(scb->scb_busaddr, ha->mem_ptr + IPS_REG_I2O_INMSGQ);
5620 return (IPS_SUCCESS);
5623 /****************************************************************************/
5624 /* */
5625 /* Routine Name: ips_isintr_copperhead */
5626 /* */
5627 /* Routine Description: */
5628 /* */
5629 /* Test to see if an interrupt is for us */
5630 /* */
5631 /****************************************************************************/
5632 static int
5633 ips_isintr_copperhead(ips_ha_t * ha)
5635 uint8_t Isr;
5637 METHOD_TRACE("ips_isintr_copperhead", 2);
5639 Isr = inb(ha->io_addr + IPS_REG_HISR);
5641 if (Isr == 0xFF)
5642 /* ?!?! Nothing really there */
5643 return (0);
5645 if (Isr & IPS_BIT_SCE)
5646 return (1);
5647 else if (Isr & (IPS_BIT_SQO | IPS_BIT_GHI)) {
5648 /* status queue overflow or GHI */
5649 /* just clear the interrupt */
5650 outb(Isr, ha->io_addr + IPS_REG_HISR);
5653 return (0);
5656 /****************************************************************************/
5657 /* */
5658 /* Routine Name: ips_isintr_copperhead_memio */
5659 /* */
5660 /* Routine Description: */
5661 /* */
5662 /* Test to see if an interrupt is for us */
5663 /* */
5664 /****************************************************************************/
5665 static int
5666 ips_isintr_copperhead_memio(ips_ha_t * ha)
5668 uint8_t Isr;
5670 METHOD_TRACE("ips_isintr_memio", 2);
5672 Isr = readb(ha->mem_ptr + IPS_REG_HISR);
5674 if (Isr == 0xFF)
5675 /* ?!?! Nothing really there */
5676 return (0);
5678 if (Isr & IPS_BIT_SCE)
5679 return (1);
5680 else if (Isr & (IPS_BIT_SQO | IPS_BIT_GHI)) {
5681 /* status queue overflow or GHI */
5682 /* just clear the interrupt */
5683 writeb(Isr, ha->mem_ptr + IPS_REG_HISR);
5686 return (0);
5689 /****************************************************************************/
5690 /* */
5691 /* Routine Name: ips_isintr_morpheus */
5692 /* */
5693 /* Routine Description: */
5694 /* */
5695 /* Test to see if an interrupt is for us */
5696 /* */
5697 /****************************************************************************/
5698 static int
5699 ips_isintr_morpheus(ips_ha_t * ha)
5701 uint32_t Isr;
5703 METHOD_TRACE("ips_isintr_morpheus", 2);
5705 Isr = readl(ha->mem_ptr + IPS_REG_I2O_HIR);
5707 if (Isr & IPS_BIT_I2O_OPQI)
5708 return (1);
5709 else
5710 return (0);
5713 /****************************************************************************/
5714 /* */
5715 /* Routine Name: ips_wait */
5716 /* */
5717 /* Routine Description: */
5718 /* */
5719 /* Wait for a command to complete */
5720 /* */
5721 /****************************************************************************/
5722 static int
5723 ips_wait(ips_ha_t * ha, int time, int intr)
5725 int ret;
5726 int done;
5728 METHOD_TRACE("ips_wait", 1);
5730 ret = IPS_FAILURE;
5731 done = FALSE;
5733 time *= IPS_ONE_SEC; /* convert seconds */
5735 while ((time > 0) && (!done)) {
5736 if (intr == IPS_INTR_ON) {
5737 if (ha->waitflag == FALSE) {
5738 ret = IPS_SUCCESS;
5739 done = TRUE;
5740 break;
5742 } else if (intr == IPS_INTR_IORL) {
5743 if (ha->waitflag == FALSE) {
5745 * controller generated an interrupt to
5746 * acknowledge completion of the command
5747 * and ips_intr() has serviced the interrupt.
5749 ret = IPS_SUCCESS;
5750 done = TRUE;
5751 break;
5755 * NOTE: we already have the io_request_lock so
5756 * even if we get an interrupt it won't get serviced
5757 * until after we finish.
5760 (*ha->func.intr) (ha);
5763 /* This looks like a very evil loop, but it only does this during start-up */
5764 udelay(1000);
5765 time--;
5768 return (ret);
5771 /****************************************************************************/
5772 /* */
5773 /* Routine Name: ips_write_driver_status */
5774 /* */
5775 /* Routine Description: */
5776 /* */
5777 /* Write OS/Driver version to Page 5 of the nvram on the controller */
5778 /* */
5779 /****************************************************************************/
5780 static int
5781 ips_write_driver_status(ips_ha_t * ha, int intr)
5783 METHOD_TRACE("ips_write_driver_status", 1);
5785 if (!ips_readwrite_page5(ha, FALSE, intr)) {
5786 IPS_PRINTK(KERN_WARNING, ha->pcidev,
5787 "unable to read NVRAM page 5.\n");
5789 return (0);
5792 /* check to make sure the page has a valid */
5793 /* signature */
5794 if (le32_to_cpu(ha->nvram->signature) != IPS_NVRAM_P5_SIG) {
5795 DEBUG_VAR(1,
5796 "(%s%d) NVRAM page 5 has an invalid signature: %X.",
5797 ips_name, ha->host_num, ha->nvram->signature);
5798 ha->nvram->signature = IPS_NVRAM_P5_SIG;
5801 DEBUG_VAR(2,
5802 "(%s%d) Ad Type: %d, Ad Slot: %d, BIOS: %c%c%c%c %c%c%c%c.",
5803 ips_name, ha->host_num, le16_to_cpu(ha->nvram->adapter_type),
5804 ha->nvram->adapter_slot, ha->nvram->bios_high[0],
5805 ha->nvram->bios_high[1], ha->nvram->bios_high[2],
5806 ha->nvram->bios_high[3], ha->nvram->bios_low[0],
5807 ha->nvram->bios_low[1], ha->nvram->bios_low[2],
5808 ha->nvram->bios_low[3]);
5810 ips_get_bios_version(ha, intr);
5812 /* change values (as needed) */
5813 ha->nvram->operating_system = IPS_OS_LINUX;
5814 ha->nvram->adapter_type = ha->ad_type;
5815 strncpy((char *) ha->nvram->driver_high, IPS_VERSION_HIGH, 4);
5816 strncpy((char *) ha->nvram->driver_low, IPS_VERSION_LOW, 4);
5817 strncpy((char *) ha->nvram->bios_high, ha->bios_version, 4);
5818 strncpy((char *) ha->nvram->bios_low, ha->bios_version + 4, 4);
5820 ips_version_check(ha, intr); /* Check BIOS/FW/Driver Versions */
5822 /* now update the page */
5823 if (!ips_readwrite_page5(ha, TRUE, intr)) {
5824 IPS_PRINTK(KERN_WARNING, ha->pcidev,
5825 "unable to write NVRAM page 5.\n");
5827 return (0);
5830 /* IF NVRAM Page 5 is OK, Use it for Slot Number Info Because Linux Doesn't Do Slots */
5831 ha->slot_num = ha->nvram->adapter_slot;
5833 return (1);
5836 /****************************************************************************/
5837 /* */
5838 /* Routine Name: ips_read_adapter_status */
5839 /* */
5840 /* Routine Description: */
5841 /* */
5842 /* Do an Inquiry command to the adapter */
5843 /* */
5844 /****************************************************************************/
5845 static int
5846 ips_read_adapter_status(ips_ha_t * ha, int intr)
5848 ips_scb_t *scb;
5849 int ret;
5851 METHOD_TRACE("ips_read_adapter_status", 1);
5853 scb = &ha->scbs[ha->max_cmds - 1];
5855 ips_init_scb(ha, scb);
5857 scb->timeout = ips_cmd_timeout;
5858 scb->cdb[0] = IPS_CMD_ENQUIRY;
5860 scb->cmd.basic_io.op_code = IPS_CMD_ENQUIRY;
5861 scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
5862 scb->cmd.basic_io.sg_count = 0;
5863 scb->cmd.basic_io.lba = 0;
5864 scb->cmd.basic_io.sector_count = 0;
5865 scb->cmd.basic_io.log_drv = 0;
5866 scb->data_len = sizeof (*ha->enq);
5867 scb->cmd.basic_io.sg_addr = ha->enq_busaddr;
5869 /* send command */
5870 if (((ret =
5871 ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE)
5872 || (ret == IPS_SUCCESS_IMM)
5873 || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1))
5874 return (0);
5876 return (1);
5879 /****************************************************************************/
5880 /* */
5881 /* Routine Name: ips_read_subsystem_parameters */
5882 /* */
5883 /* Routine Description: */
5884 /* */
5885 /* Read subsystem parameters from the adapter */
5886 /* */
5887 /****************************************************************************/
5888 static int
5889 ips_read_subsystem_parameters(ips_ha_t * ha, int intr)
5891 ips_scb_t *scb;
5892 int ret;
5894 METHOD_TRACE("ips_read_subsystem_parameters", 1);
5896 scb = &ha->scbs[ha->max_cmds - 1];
5898 ips_init_scb(ha, scb);
5900 scb->timeout = ips_cmd_timeout;
5901 scb->cdb[0] = IPS_CMD_GET_SUBSYS;
5903 scb->cmd.basic_io.op_code = IPS_CMD_GET_SUBSYS;
5904 scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
5905 scb->cmd.basic_io.sg_count = 0;
5906 scb->cmd.basic_io.lba = 0;
5907 scb->cmd.basic_io.sector_count = 0;
5908 scb->cmd.basic_io.log_drv = 0;
5909 scb->data_len = sizeof (*ha->subsys);
5910 scb->cmd.basic_io.sg_addr = ha->ioctl_busaddr;
5912 /* send command */
5913 if (((ret =
5914 ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE)
5915 || (ret == IPS_SUCCESS_IMM)
5916 || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1))
5917 return (0);
5919 memcpy(ha->subsys, ha->ioctl_data, sizeof(*ha->subsys));
5920 return (1);
5923 /****************************************************************************/
5924 /* */
5925 /* Routine Name: ips_read_config */
5926 /* */
5927 /* Routine Description: */
5928 /* */
5929 /* Read the configuration on the adapter */
5930 /* */
5931 /****************************************************************************/
5932 static int
5933 ips_read_config(ips_ha_t * ha, int intr)
5935 ips_scb_t *scb;
5936 int i;
5937 int ret;
5939 METHOD_TRACE("ips_read_config", 1);
5941 /* set defaults for initiator IDs */
5942 for (i = 0; i < 4; i++)
5943 ha->conf->init_id[i] = 7;
5945 scb = &ha->scbs[ha->max_cmds - 1];
5947 ips_init_scb(ha, scb);
5949 scb->timeout = ips_cmd_timeout;
5950 scb->cdb[0] = IPS_CMD_READ_CONF;
5952 scb->cmd.basic_io.op_code = IPS_CMD_READ_CONF;
5953 scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb);
5954 scb->data_len = sizeof (*ha->conf);
5955 scb->cmd.basic_io.sg_addr = ha->ioctl_busaddr;
5957 /* send command */
5958 if (((ret =
5959 ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE)
5960 || (ret == IPS_SUCCESS_IMM)
5961 || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) {
5963 memset(ha->conf, 0, sizeof (IPS_CONF));
5965 /* reset initiator IDs */
5966 for (i = 0; i < 4; i++)
5967 ha->conf->init_id[i] = 7;
5969 /* Allow Completed with Errors, so JCRM can access the Adapter to fix the problems */
5970 if ((scb->basic_status & IPS_GSC_STATUS_MASK) ==
5971 IPS_CMD_CMPLT_WERROR)
5972 return (1);
5974 return (0);
5977 memcpy(ha->conf, ha->ioctl_data, sizeof(*ha->conf));
5978 return (1);
5981 /****************************************************************************/
5982 /* */
5983 /* Routine Name: ips_readwrite_page5 */
5984 /* */
5985 /* Routine Description: */
5986 /* */
5987 /* Read nvram page 5 from the adapter */
5988 /* */
5989 /****************************************************************************/
5990 static int
5991 ips_readwrite_page5(ips_ha_t * ha, int write, int intr)
5993 ips_scb_t *scb;
5994 int ret;
5996 METHOD_TRACE("ips_readwrite_page5", 1);
5998 scb = &ha->scbs[ha->max_cmds - 1];
6000 ips_init_scb(ha, scb);
6002 scb->timeout = ips_cmd_timeout;
6003 scb->cdb[0] = IPS_CMD_RW_NVRAM_PAGE;
6005 scb->cmd.nvram.op_code = IPS_CMD_RW_NVRAM_PAGE;
6006 scb->cmd.nvram.command_id = IPS_COMMAND_ID(ha, scb);
6007 scb->cmd.nvram.page = 5;
6008 scb->cmd.nvram.write = write;
6009 scb->cmd.nvram.reserved = 0;
6010 scb->cmd.nvram.reserved2 = 0;
6011 scb->data_len = sizeof (*ha->nvram);
6012 scb->cmd.nvram.buffer_addr = ha->ioctl_busaddr;
6013 if (write)
6014 memcpy(ha->ioctl_data, ha->nvram, sizeof(*ha->nvram));
6016 /* issue the command */
6017 if (((ret =
6018 ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE)
6019 || (ret == IPS_SUCCESS_IMM)
6020 || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) {
6022 memset(ha->nvram, 0, sizeof (IPS_NVRAM_P5));
6024 return (0);
6026 if (!write)
6027 memcpy(ha->nvram, ha->ioctl_data, sizeof(*ha->nvram));
6028 return (1);
6031 /****************************************************************************/
6032 /* */
6033 /* Routine Name: ips_clear_adapter */
6034 /* */
6035 /* Routine Description: */
6036 /* */
6037 /* Clear the stripe lock tables */
6038 /* */
6039 /****************************************************************************/
6040 static int
6041 ips_clear_adapter(ips_ha_t * ha, int intr)
6043 ips_scb_t *scb;
6044 int ret;
6046 METHOD_TRACE("ips_clear_adapter", 1);
6048 scb = &ha->scbs[ha->max_cmds - 1];
6050 ips_init_scb(ha, scb);
6052 scb->timeout = ips_reset_timeout;
6053 scb->cdb[0] = IPS_CMD_CONFIG_SYNC;
6055 scb->cmd.config_sync.op_code = IPS_CMD_CONFIG_SYNC;
6056 scb->cmd.config_sync.command_id = IPS_COMMAND_ID(ha, scb);
6057 scb->cmd.config_sync.channel = 0;
6058 scb->cmd.config_sync.source_target = IPS_POCL;
6059 scb->cmd.config_sync.reserved = 0;
6060 scb->cmd.config_sync.reserved2 = 0;
6061 scb->cmd.config_sync.reserved3 = 0;
6063 /* issue command */
6064 if (((ret =
6065 ips_send_wait(ha, scb, ips_reset_timeout, intr)) == IPS_FAILURE)
6066 || (ret == IPS_SUCCESS_IMM)
6067 || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1))
6068 return (0);
6070 /* send unlock stripe command */
6071 ips_init_scb(ha, scb);
6073 scb->cdb[0] = IPS_CMD_ERROR_TABLE;
6074 scb->timeout = ips_reset_timeout;
6076 scb->cmd.unlock_stripe.op_code = IPS_CMD_ERROR_TABLE;
6077 scb->cmd.unlock_stripe.command_id = IPS_COMMAND_ID(ha, scb);
6078 scb->cmd.unlock_stripe.log_drv = 0;
6079 scb->cmd.unlock_stripe.control = IPS_CSL;
6080 scb->cmd.unlock_stripe.reserved = 0;
6081 scb->cmd.unlock_stripe.reserved2 = 0;
6082 scb->cmd.unlock_stripe.reserved3 = 0;
6084 /* issue command */
6085 if (((ret =
6086 ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE)
6087 || (ret == IPS_SUCCESS_IMM)
6088 || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1))
6089 return (0);
6091 return (1);
6094 /****************************************************************************/
6095 /* */
6096 /* Routine Name: ips_ffdc_reset */
6097 /* */
6098 /* Routine Description: */
6099 /* */
6100 /* FFDC: write reset info */
6101 /* */
6102 /****************************************************************************/
6103 static void
6104 ips_ffdc_reset(ips_ha_t * ha, int intr)
6106 ips_scb_t *scb;
6108 METHOD_TRACE("ips_ffdc_reset", 1);
6110 scb = &ha->scbs[ha->max_cmds - 1];
6112 ips_init_scb(ha, scb);
6114 scb->timeout = ips_cmd_timeout;
6115 scb->cdb[0] = IPS_CMD_FFDC;
6116 scb->cmd.ffdc.op_code = IPS_CMD_FFDC;
6117 scb->cmd.ffdc.command_id = IPS_COMMAND_ID(ha, scb);
6118 scb->cmd.ffdc.reset_count = ha->reset_count;
6119 scb->cmd.ffdc.reset_type = 0x80;
6121 /* convert time to what the card wants */
6122 ips_fix_ffdc_time(ha, scb, ha->last_ffdc);
6124 /* issue command */
6125 ips_send_wait(ha, scb, ips_cmd_timeout, intr);
6128 /****************************************************************************/
6129 /* */
6130 /* Routine Name: ips_ffdc_time */
6131 /* */
6132 /* Routine Description: */
6133 /* */
6134 /* FFDC: write time info */
6135 /* */
6136 /****************************************************************************/
6137 static void
6138 ips_ffdc_time(ips_ha_t * ha)
6140 ips_scb_t *scb;
6142 METHOD_TRACE("ips_ffdc_time", 1);
6144 DEBUG_VAR(1, "(%s%d) Sending time update.", ips_name, ha->host_num);
6146 scb = &ha->scbs[ha->max_cmds - 1];
6148 ips_init_scb(ha, scb);
6150 scb->timeout = ips_cmd_timeout;
6151 scb->cdb[0] = IPS_CMD_FFDC;
6152 scb->cmd.ffdc.op_code = IPS_CMD_FFDC;
6153 scb->cmd.ffdc.command_id = IPS_COMMAND_ID(ha, scb);
6154 scb->cmd.ffdc.reset_count = 0;
6155 scb->cmd.ffdc.reset_type = 0;
6157 /* convert time to what the card wants */
6158 ips_fix_ffdc_time(ha, scb, ha->last_ffdc);
6160 /* issue command */
6161 ips_send_wait(ha, scb, ips_cmd_timeout, IPS_FFDC);
6164 /****************************************************************************/
6165 /* */
6166 /* Routine Name: ips_fix_ffdc_time */
6167 /* */
6168 /* Routine Description: */
6169 /* Adjust time_t to what the card wants */
6170 /* */
6171 /****************************************************************************/
6172 static void
6173 ips_fix_ffdc_time(ips_ha_t * ha, ips_scb_t * scb, time_t current_time)
6175 long days;
6176 long rem;
6177 int i;
6178 int year;
6179 int yleap;
6180 int year_lengths[2] = { IPS_DAYS_NORMAL_YEAR, IPS_DAYS_LEAP_YEAR };
6181 int month_lengths[12][2] = { {31, 31},
6182 {28, 29},
6183 {31, 31},
6184 {30, 30},
6185 {31, 31},
6186 {30, 30},
6187 {31, 31},
6188 {31, 31},
6189 {30, 30},
6190 {31, 31},
6191 {30, 30},
6192 {31, 31}
6195 METHOD_TRACE("ips_fix_ffdc_time", 1);
6197 days = current_time / IPS_SECS_DAY;
6198 rem = current_time % IPS_SECS_DAY;
6200 scb->cmd.ffdc.hour = (rem / IPS_SECS_HOUR);
6201 rem = rem % IPS_SECS_HOUR;
6202 scb->cmd.ffdc.minute = (rem / IPS_SECS_MIN);
6203 scb->cmd.ffdc.second = (rem % IPS_SECS_MIN);
6205 year = IPS_EPOCH_YEAR;
6206 while (days < 0 || days >= year_lengths[yleap = IPS_IS_LEAP_YEAR(year)]) {
6207 int newy;
6209 newy = year + (days / IPS_DAYS_NORMAL_YEAR);
6210 if (days < 0)
6211 --newy;
6212 days -= (newy - year) * IPS_DAYS_NORMAL_YEAR +
6213 IPS_NUM_LEAP_YEARS_THROUGH(newy - 1) -
6214 IPS_NUM_LEAP_YEARS_THROUGH(year - 1);
6215 year = newy;
6218 scb->cmd.ffdc.yearH = year / 100;
6219 scb->cmd.ffdc.yearL = year % 100;
6221 for (i = 0; days >= month_lengths[i][yleap]; ++i)
6222 days -= month_lengths[i][yleap];
6224 scb->cmd.ffdc.month = i + 1;
6225 scb->cmd.ffdc.day = days + 1;
6228 /****************************************************************************
6229 * BIOS Flash Routines *
6230 ****************************************************************************/
6232 /****************************************************************************/
6233 /* */
6234 /* Routine Name: ips_erase_bios */
6235 /* */
6236 /* Routine Description: */
6237 /* Erase the BIOS on the adapter */
6238 /* */
6239 /****************************************************************************/
6240 static int
6241 ips_erase_bios(ips_ha_t * ha)
6243 int timeout;
6244 uint8_t status = 0;
6246 METHOD_TRACE("ips_erase_bios", 1);
6248 status = 0;
6250 /* Clear the status register */
6251 outl(0, ha->io_addr + IPS_REG_FLAP);
6252 if (ha->revision_id == IPS_REVID_TROMBONE64)
6253 udelay(25); /* 25 us */
6255 outb(0x50, ha->io_addr + IPS_REG_FLDP);
6256 if (ha->revision_id == IPS_REVID_TROMBONE64)
6257 udelay(25); /* 25 us */
6259 /* Erase Setup */
6260 outb(0x20, ha->io_addr + IPS_REG_FLDP);
6261 if (ha->revision_id == IPS_REVID_TROMBONE64)
6262 udelay(25); /* 25 us */
6264 /* Erase Confirm */
6265 outb(0xD0, ha->io_addr + IPS_REG_FLDP);
6266 if (ha->revision_id == IPS_REVID_TROMBONE64)
6267 udelay(25); /* 25 us */
6269 /* Erase Status */
6270 outb(0x70, ha->io_addr + IPS_REG_FLDP);
6271 if (ha->revision_id == IPS_REVID_TROMBONE64)
6272 udelay(25); /* 25 us */
6274 timeout = 80000; /* 80 seconds */
6276 while (timeout > 0) {
6277 if (ha->revision_id == IPS_REVID_TROMBONE64) {
6278 outl(0, ha->io_addr + IPS_REG_FLAP);
6279 udelay(25); /* 25 us */
6282 status = inb(ha->io_addr + IPS_REG_FLDP);
6284 if (status & 0x80)
6285 break;
6287 MDELAY(1);
6288 timeout--;
6291 /* check for timeout */
6292 if (timeout <= 0) {
6293 /* timeout */
6295 /* try to suspend the erase */
6296 outb(0xB0, ha->io_addr + IPS_REG_FLDP);
6297 if (ha->revision_id == IPS_REVID_TROMBONE64)
6298 udelay(25); /* 25 us */
6300 /* wait for 10 seconds */
6301 timeout = 10000;
6302 while (timeout > 0) {
6303 if (ha->revision_id == IPS_REVID_TROMBONE64) {
6304 outl(0, ha->io_addr + IPS_REG_FLAP);
6305 udelay(25); /* 25 us */
6308 status = inb(ha->io_addr + IPS_REG_FLDP);
6310 if (status & 0xC0)
6311 break;
6313 MDELAY(1);
6314 timeout--;
6317 return (1);
6320 /* check for valid VPP */
6321 if (status & 0x08)
6322 /* VPP failure */
6323 return (1);
6325 /* check for succesful flash */
6326 if (status & 0x30)
6327 /* sequence error */
6328 return (1);
6330 /* Otherwise, we were successful */
6331 /* clear status */
6332 outb(0x50, ha->io_addr + IPS_REG_FLDP);
6333 if (ha->revision_id == IPS_REVID_TROMBONE64)
6334 udelay(25); /* 25 us */
6336 /* enable reads */
6337 outb(0xFF, ha->io_addr + IPS_REG_FLDP);
6338 if (ha->revision_id == IPS_REVID_TROMBONE64)
6339 udelay(25); /* 25 us */
6341 return (0);
6344 /****************************************************************************/
6345 /* */
6346 /* Routine Name: ips_erase_bios_memio */
6347 /* */
6348 /* Routine Description: */
6349 /* Erase the BIOS on the adapter */
6350 /* */
6351 /****************************************************************************/
6352 static int
6353 ips_erase_bios_memio(ips_ha_t * ha)
6355 int timeout;
6356 uint8_t status;
6358 METHOD_TRACE("ips_erase_bios_memio", 1);
6360 status = 0;
6362 /* Clear the status register */
6363 writel(0, ha->mem_ptr + IPS_REG_FLAP);
6364 if (ha->revision_id == IPS_REVID_TROMBONE64)
6365 udelay(25); /* 25 us */
6367 writeb(0x50, ha->mem_ptr + IPS_REG_FLDP);
6368 if (ha->revision_id == IPS_REVID_TROMBONE64)
6369 udelay(25); /* 25 us */
6371 /* Erase Setup */
6372 writeb(0x20, ha->mem_ptr + IPS_REG_FLDP);
6373 if (ha->revision_id == IPS_REVID_TROMBONE64)
6374 udelay(25); /* 25 us */
6376 /* Erase Confirm */
6377 writeb(0xD0, ha->mem_ptr + IPS_REG_FLDP);
6378 if (ha->revision_id == IPS_REVID_TROMBONE64)
6379 udelay(25); /* 25 us */
6381 /* Erase Status */
6382 writeb(0x70, ha->mem_ptr + IPS_REG_FLDP);
6383 if (ha->revision_id == IPS_REVID_TROMBONE64)
6384 udelay(25); /* 25 us */
6386 timeout = 80000; /* 80 seconds */
6388 while (timeout > 0) {
6389 if (ha->revision_id == IPS_REVID_TROMBONE64) {
6390 writel(0, ha->mem_ptr + IPS_REG_FLAP);
6391 udelay(25); /* 25 us */
6394 status = readb(ha->mem_ptr + IPS_REG_FLDP);
6396 if (status & 0x80)
6397 break;
6399 MDELAY(1);
6400 timeout--;
6403 /* check for timeout */
6404 if (timeout <= 0) {
6405 /* timeout */
6407 /* try to suspend the erase */
6408 writeb(0xB0, ha->mem_ptr + IPS_REG_FLDP);
6409 if (ha->revision_id == IPS_REVID_TROMBONE64)
6410 udelay(25); /* 25 us */
6412 /* wait for 10 seconds */
6413 timeout = 10000;
6414 while (timeout > 0) {
6415 if (ha->revision_id == IPS_REVID_TROMBONE64) {
6416 writel(0, ha->mem_ptr + IPS_REG_FLAP);
6417 udelay(25); /* 25 us */
6420 status = readb(ha->mem_ptr + IPS_REG_FLDP);
6422 if (status & 0xC0)
6423 break;
6425 MDELAY(1);
6426 timeout--;
6429 return (1);
6432 /* check for valid VPP */
6433 if (status & 0x08)
6434 /* VPP failure */
6435 return (1);
6437 /* check for succesful flash */
6438 if (status & 0x30)
6439 /* sequence error */
6440 return (1);
6442 /* Otherwise, we were successful */
6443 /* clear status */
6444 writeb(0x50, ha->mem_ptr + IPS_REG_FLDP);
6445 if (ha->revision_id == IPS_REVID_TROMBONE64)
6446 udelay(25); /* 25 us */
6448 /* enable reads */
6449 writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP);
6450 if (ha->revision_id == IPS_REVID_TROMBONE64)
6451 udelay(25); /* 25 us */
6453 return (0);
6456 /****************************************************************************/
6457 /* */
6458 /* Routine Name: ips_program_bios */
6459 /* */
6460 /* Routine Description: */
6461 /* Program the BIOS on the adapter */
6462 /* */
6463 /****************************************************************************/
6464 static int
6465 ips_program_bios(ips_ha_t * ha, char *buffer, uint32_t buffersize,
6466 uint32_t offset)
6468 int i;
6469 int timeout;
6470 uint8_t status = 0;
6472 METHOD_TRACE("ips_program_bios", 1);
6474 status = 0;
6476 for (i = 0; i < buffersize; i++) {
6477 /* write a byte */
6478 outl(cpu_to_le32(i + offset), ha->io_addr + IPS_REG_FLAP);
6479 if (ha->revision_id == IPS_REVID_TROMBONE64)
6480 udelay(25); /* 25 us */
6482 outb(0x40, ha->io_addr + IPS_REG_FLDP);
6483 if (ha->revision_id == IPS_REVID_TROMBONE64)
6484 udelay(25); /* 25 us */
6486 outb(buffer[i], ha->io_addr + IPS_REG_FLDP);
6487 if (ha->revision_id == IPS_REVID_TROMBONE64)
6488 udelay(25); /* 25 us */
6490 /* wait up to one second */
6491 timeout = 1000;
6492 while (timeout > 0) {
6493 if (ha->revision_id == IPS_REVID_TROMBONE64) {
6494 outl(0, ha->io_addr + IPS_REG_FLAP);
6495 udelay(25); /* 25 us */
6498 status = inb(ha->io_addr + IPS_REG_FLDP);
6500 if (status & 0x80)
6501 break;
6503 MDELAY(1);
6504 timeout--;
6507 if (timeout == 0) {
6508 /* timeout error */
6509 outl(0, ha->io_addr + IPS_REG_FLAP);
6510 if (ha->revision_id == IPS_REVID_TROMBONE64)
6511 udelay(25); /* 25 us */
6513 outb(0xFF, ha->io_addr + IPS_REG_FLDP);
6514 if (ha->revision_id == IPS_REVID_TROMBONE64)
6515 udelay(25); /* 25 us */
6517 return (1);
6520 /* check the status */
6521 if (status & 0x18) {
6522 /* programming error */
6523 outl(0, ha->io_addr + IPS_REG_FLAP);
6524 if (ha->revision_id == IPS_REVID_TROMBONE64)
6525 udelay(25); /* 25 us */
6527 outb(0xFF, ha->io_addr + IPS_REG_FLDP);
6528 if (ha->revision_id == IPS_REVID_TROMBONE64)
6529 udelay(25); /* 25 us */
6531 return (1);
6533 } /* end for */
6535 /* Enable reading */
6536 outl(0, ha->io_addr + IPS_REG_FLAP);
6537 if (ha->revision_id == IPS_REVID_TROMBONE64)
6538 udelay(25); /* 25 us */
6540 outb(0xFF, ha->io_addr + IPS_REG_FLDP);
6541 if (ha->revision_id == IPS_REVID_TROMBONE64)
6542 udelay(25); /* 25 us */
6544 return (0);
6547 /****************************************************************************/
6548 /* */
6549 /* Routine Name: ips_program_bios_memio */
6550 /* */
6551 /* Routine Description: */
6552 /* Program the BIOS on the adapter */
6553 /* */
6554 /****************************************************************************/
6555 static int
6556 ips_program_bios_memio(ips_ha_t * ha, char *buffer, uint32_t buffersize,
6557 uint32_t offset)
6559 int i;
6560 int timeout;
6561 uint8_t status = 0;
6563 METHOD_TRACE("ips_program_bios_memio", 1);
6565 status = 0;
6567 for (i = 0; i < buffersize; i++) {
6568 /* write a byte */
6569 writel(i + offset, ha->mem_ptr + IPS_REG_FLAP);
6570 if (ha->revision_id == IPS_REVID_TROMBONE64)
6571 udelay(25); /* 25 us */
6573 writeb(0x40, ha->mem_ptr + IPS_REG_FLDP);
6574 if (ha->revision_id == IPS_REVID_TROMBONE64)
6575 udelay(25); /* 25 us */
6577 writeb(buffer[i], ha->mem_ptr + IPS_REG_FLDP);
6578 if (ha->revision_id == IPS_REVID_TROMBONE64)
6579 udelay(25); /* 25 us */
6581 /* wait up to one second */
6582 timeout = 1000;
6583 while (timeout > 0) {
6584 if (ha->revision_id == IPS_REVID_TROMBONE64) {
6585 writel(0, ha->mem_ptr + IPS_REG_FLAP);
6586 udelay(25); /* 25 us */
6589 status = readb(ha->mem_ptr + IPS_REG_FLDP);
6591 if (status & 0x80)
6592 break;
6594 MDELAY(1);
6595 timeout--;
6598 if (timeout == 0) {
6599 /* timeout error */
6600 writel(0, ha->mem_ptr + IPS_REG_FLAP);
6601 if (ha->revision_id == IPS_REVID_TROMBONE64)
6602 udelay(25); /* 25 us */
6604 writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP);
6605 if (ha->revision_id == IPS_REVID_TROMBONE64)
6606 udelay(25); /* 25 us */
6608 return (1);
6611 /* check the status */
6612 if (status & 0x18) {
6613 /* programming error */
6614 writel(0, ha->mem_ptr + IPS_REG_FLAP);
6615 if (ha->revision_id == IPS_REVID_TROMBONE64)
6616 udelay(25); /* 25 us */
6618 writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP);
6619 if (ha->revision_id == IPS_REVID_TROMBONE64)
6620 udelay(25); /* 25 us */
6622 return (1);
6624 } /* end for */
6626 /* Enable reading */
6627 writel(0, ha->mem_ptr + IPS_REG_FLAP);
6628 if (ha->revision_id == IPS_REVID_TROMBONE64)
6629 udelay(25); /* 25 us */
6631 writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP);
6632 if (ha->revision_id == IPS_REVID_TROMBONE64)
6633 udelay(25); /* 25 us */
6635 return (0);
6638 /****************************************************************************/
6639 /* */
6640 /* Routine Name: ips_verify_bios */
6641 /* */
6642 /* Routine Description: */
6643 /* Verify the BIOS on the adapter */
6644 /* */
6645 /****************************************************************************/
6646 static int
6647 ips_verify_bios(ips_ha_t * ha, char *buffer, uint32_t buffersize,
6648 uint32_t offset)
6650 uint8_t checksum;
6651 int i;
6653 METHOD_TRACE("ips_verify_bios", 1);
6655 /* test 1st byte */
6656 outl(0, ha->io_addr + IPS_REG_FLAP);
6657 if (ha->revision_id == IPS_REVID_TROMBONE64)
6658 udelay(25); /* 25 us */
6660 if (inb(ha->io_addr + IPS_REG_FLDP) != 0x55)
6661 return (1);
6663 outl(cpu_to_le32(1), ha->io_addr + IPS_REG_FLAP);
6664 if (ha->revision_id == IPS_REVID_TROMBONE64)
6665 udelay(25); /* 25 us */
6666 if (inb(ha->io_addr + IPS_REG_FLDP) != 0xAA)
6667 return (1);
6669 checksum = 0xff;
6670 for (i = 2; i < buffersize; i++) {
6672 outl(cpu_to_le32(i + offset), ha->io_addr + IPS_REG_FLAP);
6673 if (ha->revision_id == IPS_REVID_TROMBONE64)
6674 udelay(25); /* 25 us */
6676 checksum = (uint8_t) checksum + inb(ha->io_addr + IPS_REG_FLDP);
6679 if (checksum != 0)
6680 /* failure */
6681 return (1);
6682 else
6683 /* success */
6684 return (0);
6687 /****************************************************************************/
6688 /* */
6689 /* Routine Name: ips_verify_bios_memio */
6690 /* */
6691 /* Routine Description: */
6692 /* Verify the BIOS on the adapter */
6693 /* */
6694 /****************************************************************************/
6695 static int
6696 ips_verify_bios_memio(ips_ha_t * ha, char *buffer, uint32_t buffersize,
6697 uint32_t offset)
6699 uint8_t checksum;
6700 int i;
6702 METHOD_TRACE("ips_verify_bios_memio", 1);
6704 /* test 1st byte */
6705 writel(0, ha->mem_ptr + IPS_REG_FLAP);
6706 if (ha->revision_id == IPS_REVID_TROMBONE64)
6707 udelay(25); /* 25 us */
6709 if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0x55)
6710 return (1);
6712 writel(1, ha->mem_ptr + IPS_REG_FLAP);
6713 if (ha->revision_id == IPS_REVID_TROMBONE64)
6714 udelay(25); /* 25 us */
6715 if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0xAA)
6716 return (1);
6718 checksum = 0xff;
6719 for (i = 2; i < buffersize; i++) {
6721 writel(i + offset, ha->mem_ptr + IPS_REG_FLAP);
6722 if (ha->revision_id == IPS_REVID_TROMBONE64)
6723 udelay(25); /* 25 us */
6725 checksum =
6726 (uint8_t) checksum + readb(ha->mem_ptr + IPS_REG_FLDP);
6729 if (checksum != 0)
6730 /* failure */
6731 return (1);
6732 else
6733 /* success */
6734 return (0);
6737 /*---------------------------------------------------------------------------*/
6738 /* Routine Name: ips_version_check */
6739 /* */
6740 /* Dependencies: */
6741 /* Assumes that ips_read_adapter_status() is called first filling in */
6742 /* the data for SubSystem Parameters. */
6743 /* Called from ips_write_driver_status() so it also assumes NVRAM Page 5 */
6744 /* Data is available. */
6745 /* */
6746 /*---------------------------------------------------------------------------*/
6747 static void
6748 ips_version_check(ips_ha_t * ha, int intr)
6750 IPS_VERSION_DATA *VersionInfo;
6751 uint8_t FirmwareVersion[IPS_COMPAT_ID_LENGTH + 1];
6752 uint8_t BiosVersion[IPS_COMPAT_ID_LENGTH + 1];
6753 int MatchError;
6754 int rc;
6755 char BiosString[10];
6756 char FirmwareString[10];
6758 METHOD_TRACE("ips_version_check", 1);
6760 VersionInfo = ( IPS_VERSION_DATA * ) ha->ioctl_data;
6762 memset(FirmwareVersion, 0, IPS_COMPAT_ID_LENGTH + 1);
6763 memset(BiosVersion, 0, IPS_COMPAT_ID_LENGTH + 1);
6765 /* Get the Compatible BIOS Version from NVRAM Page 5 */
6766 memcpy(BiosVersion, ha->nvram->BiosCompatibilityID,
6767 IPS_COMPAT_ID_LENGTH);
6769 rc = IPS_FAILURE;
6770 if (ha->subsys->param[4] & IPS_GET_VERSION_SUPPORT) { /* If Versioning is Supported */
6771 /* Get the Version Info with a Get Version Command */
6772 memset( VersionInfo, 0, sizeof (IPS_VERSION_DATA));
6773 rc = ips_get_version_info(ha, ha->ioctl_busaddr, intr);
6774 if (rc == IPS_SUCCESS)
6775 memcpy(FirmwareVersion, VersionInfo->compatibilityId,
6776 IPS_COMPAT_ID_LENGTH);
6779 if (rc != IPS_SUCCESS) { /* If Data Not Obtainable from a GetVersion Command */
6780 /* Get the Firmware Version from Enquiry Data */
6781 memcpy(FirmwareVersion, ha->enq->CodeBlkVersion,
6782 IPS_COMPAT_ID_LENGTH);
6785 /* printk(KERN_WARNING "Adapter's BIOS Version = %s\n", BiosVersion); */
6786 /* printk(KERN_WARNING "BIOS Compatible Version = %s\n", IPS_COMPAT_BIOS); */
6787 /* printk(KERN_WARNING "Adapter's Firmware Version = %s\n", FirmwareVersion); */
6788 /* printk(KERN_WARNING "Firmware Compatible Version = %s \n", Compatable[ ha->nvram->adapter_type ]); */
6790 MatchError = 0;
6792 if (strncmp
6793 (FirmwareVersion, Compatable[ha->nvram->adapter_type],
6794 IPS_COMPAT_ID_LENGTH) != 0)
6795 MatchError = 1;
6797 if (strncmp(BiosVersion, IPS_COMPAT_BIOS, IPS_COMPAT_ID_LENGTH) != 0)
6798 MatchError = 1;
6800 ha->nvram->versioning = 1; /* Indicate the Driver Supports Versioning */
6802 if (MatchError) {
6803 ha->nvram->version_mismatch = 1;
6804 if (ips_cd_boot == 0) {
6805 strncpy(&BiosString[0], ha->nvram->bios_high, 4);
6806 strncpy(&BiosString[4], ha->nvram->bios_low, 4);
6807 BiosString[8] = 0;
6809 strncpy(&FirmwareString[0], ha->enq->CodeBlkVersion, 8);
6810 FirmwareString[8] = 0;
6812 IPS_PRINTK(KERN_WARNING, ha->pcidev,
6813 "Warning ! ! ! ServeRAID Version Mismatch\n");
6814 IPS_PRINTK(KERN_WARNING, ha->pcidev,
6815 "Bios = %s, Firmware = %s, Device Driver = %s%s\n",
6816 BiosString, FirmwareString, IPS_VERSION_HIGH,
6817 IPS_VERSION_LOW);
6818 IPS_PRINTK(KERN_WARNING, ha->pcidev,
6819 "These levels should match to avoid possible compatibility problems.\n");
6821 } else {
6822 ha->nvram->version_mismatch = 0;
6825 return;
6828 /*---------------------------------------------------------------------------*/
6829 /* Routine Name: ips_get_version_info */
6830 /* */
6831 /* Routine Description: */
6832 /* Issue an internal GETVERSION Command */
6833 /* */
6834 /* Return Value: */
6835 /* 0 if Successful, else non-zero */
6836 /*---------------------------------------------------------------------------*/
6837 static int
6838 ips_get_version_info(ips_ha_t * ha, dma_addr_t Buffer, int intr)
6840 ips_scb_t *scb;
6841 int rc;
6843 METHOD_TRACE("ips_get_version_info", 1);
6845 scb = &ha->scbs[ha->max_cmds - 1];
6847 ips_init_scb(ha, scb);
6849 scb->timeout = ips_cmd_timeout;
6850 scb->cdb[0] = IPS_CMD_GET_VERSION_INFO;
6851 scb->cmd.version_info.op_code = IPS_CMD_GET_VERSION_INFO;
6852 scb->cmd.version_info.command_id = IPS_COMMAND_ID(ha, scb);
6853 scb->cmd.version_info.reserved = 0;
6854 scb->cmd.version_info.count = sizeof (IPS_VERSION_DATA);
6855 scb->cmd.version_info.reserved2 = 0;
6856 scb->data_len = sizeof (IPS_VERSION_DATA);
6857 scb->data_busaddr = Buffer;
6858 scb->cmd.version_info.buffer_addr = Buffer;
6859 scb->flags = 0;
6861 /* issue command */
6862 rc = ips_send_wait(ha, scb, ips_cmd_timeout, intr);
6863 return (rc);
6866 /****************************************************************************/
6867 /* */
6868 /* Routine Name: ips_abort_init */
6869 /* */
6870 /* Routine Description: */
6871 /* cleanup routine for a failed adapter initialization */
6872 /****************************************************************************/
6873 static int
6874 ips_abort_init(ips_ha_t * ha, int index)
6876 ha->active = 0;
6877 ips_free(ha);
6878 ips_ha[index] = NULL;
6879 ips_sh[index] = NULL;
6880 return -1;
6883 /****************************************************************************/
6884 /* */
6885 /* Routine Name: ips_shift_controllers */
6886 /* */
6887 /* Routine Description: */
6888 /* helper function for ordering adapters */
6889 /****************************************************************************/
6890 static void
6891 ips_shift_controllers(int lowindex, int highindex)
6893 ips_ha_t *ha_sav = ips_ha[highindex];
6894 struct Scsi_Host *sh_sav = ips_sh[highindex];
6895 int i;
6897 for (i = highindex; i > lowindex; i--) {
6898 ips_ha[i] = ips_ha[i - 1];
6899 ips_sh[i] = ips_sh[i - 1];
6900 ips_ha[i]->host_num = i;
6902 ha_sav->host_num = lowindex;
6903 ips_ha[lowindex] = ha_sav;
6904 ips_sh[lowindex] = sh_sav;
6907 /****************************************************************************/
6908 /* */
6909 /* Routine Name: ips_order_controllers */
6910 /* */
6911 /* Routine Description: */
6912 /* place controllers is the "proper" boot order */
6913 /****************************************************************************/
6914 static void
6915 ips_order_controllers(void)
6917 int i, j, tmp, position = 0;
6918 IPS_NVRAM_P5 *nvram;
6919 if (!ips_ha[0])
6920 return;
6921 nvram = ips_ha[0]->nvram;
6923 if (nvram->adapter_order[0]) {
6924 for (i = 1; i <= nvram->adapter_order[0]; i++) {
6925 for (j = position; j < ips_num_controllers; j++) {
6926 switch (ips_ha[j]->ad_type) {
6927 case IPS_ADTYPE_SERVERAID6M:
6928 case IPS_ADTYPE_SERVERAID7M:
6929 if (nvram->adapter_order[i] == 'M') {
6930 ips_shift_controllers(position,
6932 position++;
6934 break;
6935 case IPS_ADTYPE_SERVERAID4L:
6936 case IPS_ADTYPE_SERVERAID4M:
6937 case IPS_ADTYPE_SERVERAID4MX:
6938 case IPS_ADTYPE_SERVERAID4LX:
6939 if (nvram->adapter_order[i] == 'N') {
6940 ips_shift_controllers(position,
6942 position++;
6944 break;
6945 case IPS_ADTYPE_SERVERAID6I:
6946 case IPS_ADTYPE_SERVERAID5I2:
6947 case IPS_ADTYPE_SERVERAID5I1:
6948 case IPS_ADTYPE_SERVERAID7k:
6949 if (nvram->adapter_order[i] == 'S') {
6950 ips_shift_controllers(position,
6952 position++;
6954 break;
6955 case IPS_ADTYPE_SERVERAID:
6956 case IPS_ADTYPE_SERVERAID2:
6957 case IPS_ADTYPE_NAVAJO:
6958 case IPS_ADTYPE_KIOWA:
6959 case IPS_ADTYPE_SERVERAID3L:
6960 case IPS_ADTYPE_SERVERAID3:
6961 case IPS_ADTYPE_SERVERAID4H:
6962 if (nvram->adapter_order[i] == 'A') {
6963 ips_shift_controllers(position,
6965 position++;
6967 break;
6968 default:
6969 break;
6973 /* if adapter_order[0], then ordering is complete */
6974 return;
6976 /* old bios, use older ordering */
6977 tmp = 0;
6978 for (i = position; i < ips_num_controllers; i++) {
6979 if (ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID5I2 ||
6980 ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID5I1) {
6981 ips_shift_controllers(position, i);
6982 position++;
6983 tmp = 1;
6986 /* if there were no 5I cards, then don't do any extra ordering */
6987 if (!tmp)
6988 return;
6989 for (i = position; i < ips_num_controllers; i++) {
6990 if (ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID4L ||
6991 ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID4M ||
6992 ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID4LX ||
6993 ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID4MX) {
6994 ips_shift_controllers(position, i);
6995 position++;
6999 return;
7002 /****************************************************************************/
7003 /* */
7004 /* Routine Name: ips_register_scsi */
7005 /* */
7006 /* Routine Description: */
7007 /* perform any registration and setup with the scsi layer */
7008 /****************************************************************************/
7009 static int
7010 ips_register_scsi(int index)
7012 struct Scsi_Host *sh;
7013 ips_ha_t *ha, *oldha = ips_ha[index];
7014 sh = scsi_host_alloc(&ips_driver_template, sizeof (ips_ha_t));
7015 if (!sh) {
7016 IPS_PRINTK(KERN_WARNING, oldha->pcidev,
7017 "Unable to register controller with SCSI subsystem\n");
7018 return -1;
7020 ha = IPS_HA(sh);
7021 memcpy(ha, oldha, sizeof (ips_ha_t));
7022 free_irq(oldha->irq, oldha);
7023 /* Install the interrupt handler with the new ha */
7024 if (request_irq(ha->irq, do_ipsintr, SA_SHIRQ, ips_name, ha)) {
7025 IPS_PRINTK(KERN_WARNING, ha->pcidev,
7026 "Unable to install interrupt handler\n");
7027 scsi_host_put(sh);
7028 return -1;
7031 kfree(oldha);
7032 ips_sh[index] = sh;
7033 ips_ha[index] = ha;
7034 IPS_SCSI_SET_DEVICE(sh, ha);
7036 /* Store away needed values for later use */
7037 sh->io_port = ha->io_addr;
7038 sh->n_io_port = ha->io_addr ? 255 : 0;
7039 sh->unique_id = (ha->io_addr) ? ha->io_addr : ha->mem_addr;
7040 sh->irq = ha->irq;
7041 sh->sg_tablesize = sh->hostt->sg_tablesize;
7042 sh->can_queue = sh->hostt->can_queue;
7043 sh->cmd_per_lun = sh->hostt->cmd_per_lun;
7044 sh->unchecked_isa_dma = sh->hostt->unchecked_isa_dma;
7045 sh->use_clustering = sh->hostt->use_clustering;
7047 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,7)
7048 sh->max_sectors = 128;
7049 #endif
7051 sh->max_id = ha->ntargets;
7052 sh->max_lun = ha->nlun;
7053 sh->max_channel = ha->nbus - 1;
7054 sh->can_queue = ha->max_cmds - 1;
7056 IPS_ADD_HOST(sh, NULL);
7057 return 0;
7060 /*---------------------------------------------------------------------------*/
7061 /* Routine Name: ips_remove_device */
7062 /* */
7063 /* Routine Description: */
7064 /* Remove one Adapter ( Hot Plugging ) */
7065 /*---------------------------------------------------------------------------*/
7066 static void __devexit
7067 ips_remove_device(struct pci_dev *pci_dev)
7069 int i;
7070 struct Scsi_Host *sh;
7071 ips_ha_t *ha;
7073 for (i = 0; i < IPS_MAX_ADAPTERS; i++) {
7074 ha = ips_ha[i];
7075 if (ha) {
7076 if ((pci_dev->bus->number == ha->pcidev->bus->number) &&
7077 (pci_dev->devfn == ha->pcidev->devfn)) {
7078 sh = ips_sh[i];
7079 ips_release(sh);
7085 /****************************************************************************/
7086 /* */
7087 /* Routine Name: ips_module_init */
7088 /* */
7089 /* Routine Description: */
7090 /* function called on module load */
7091 /****************************************************************************/
7092 static int __init
7093 ips_module_init(void)
7095 if (pci_module_init(&ips_pci_driver) < 0)
7096 return -ENODEV;
7097 ips_driver_template.module = THIS_MODULE;
7098 ips_order_controllers();
7099 if (IPS_REGISTER_HOSTS(&ips_driver_template)) {
7100 pci_unregister_driver(&ips_pci_driver);
7101 return -ENODEV;
7103 register_reboot_notifier(&ips_notifier);
7104 return 0;
7107 /****************************************************************************/
7108 /* */
7109 /* Routine Name: ips_module_exit */
7110 /* */
7111 /* Routine Description: */
7112 /* function called on module unload */
7113 /****************************************************************************/
7114 static void __exit
7115 ips_module_exit(void)
7117 IPS_UNREGISTER_HOSTS(&ips_driver_template);
7118 pci_unregister_driver(&ips_pci_driver);
7119 unregister_reboot_notifier(&ips_notifier);
7122 module_init(ips_module_init);
7123 module_exit(ips_module_exit);
7125 /*---------------------------------------------------------------------------*/
7126 /* Routine Name: ips_insert_device */
7127 /* */
7128 /* Routine Description: */
7129 /* Add One Adapter ( Hot Plug ) */
7130 /* */
7131 /* Return Value: */
7132 /* 0 if Successful, else non-zero */
7133 /*---------------------------------------------------------------------------*/
7134 static int __devinit
7135 ips_insert_device(struct pci_dev *pci_dev, const struct pci_device_id *ent)
7137 int index;
7138 int rc;
7140 METHOD_TRACE("ips_insert_device", 1);
7141 if (pci_enable_device(pci_dev))
7142 return -1;
7144 rc = ips_init_phase1(pci_dev, &index);
7145 if (rc == SUCCESS)
7146 rc = ips_init_phase2(index);
7148 if (ips_hotplug)
7149 if (ips_register_scsi(index)) {
7150 ips_free(ips_ha[index]);
7151 rc = -1;
7154 if (rc == SUCCESS)
7155 ips_num_controllers++;
7157 ips_next_controller = ips_num_controllers;
7158 return rc;
7161 /*---------------------------------------------------------------------------*/
7162 /* Routine Name: ips_init_phase1 */
7163 /* */
7164 /* Routine Description: */
7165 /* Adapter Initialization */
7166 /* */
7167 /* Return Value: */
7168 /* 0 if Successful, else non-zero */
7169 /*---------------------------------------------------------------------------*/
7170 static int
7171 ips_init_phase1(struct pci_dev *pci_dev, int *indexPtr)
7173 ips_ha_t *ha;
7174 uint32_t io_addr;
7175 uint32_t mem_addr;
7176 uint32_t io_len;
7177 uint32_t mem_len;
7178 uint8_t revision_id;
7179 uint8_t bus;
7180 uint8_t func;
7181 uint8_t irq;
7182 uint16_t subdevice_id;
7183 int j;
7184 int index;
7185 dma_addr_t dma_address;
7186 char __iomem *ioremap_ptr;
7187 char __iomem *mem_ptr;
7188 uint32_t IsDead;
7190 METHOD_TRACE("ips_init_phase1", 1);
7191 index = IPS_MAX_ADAPTERS;
7192 for (j = 0; j < IPS_MAX_ADAPTERS; j++) {
7193 if (ips_ha[j] == 0) {
7194 index = j;
7195 break;
7199 if (index >= IPS_MAX_ADAPTERS)
7200 return -1;
7202 /* stuff that we get in dev */
7203 irq = pci_dev->irq;
7204 bus = pci_dev->bus->number;
7205 func = pci_dev->devfn;
7207 /* Init MEM/IO addresses to 0 */
7208 mem_addr = 0;
7209 io_addr = 0;
7210 mem_len = 0;
7211 io_len = 0;
7213 for (j = 0; j < 2; j++) {
7214 if (!pci_resource_start(pci_dev, j))
7215 break;
7217 if (pci_resource_flags(pci_dev, j) & IORESOURCE_IO) {
7218 io_addr = pci_resource_start(pci_dev, j);
7219 io_len = pci_resource_len(pci_dev, j);
7220 } else {
7221 mem_addr = pci_resource_start(pci_dev, j);
7222 mem_len = pci_resource_len(pci_dev, j);
7226 /* setup memory mapped area (if applicable) */
7227 if (mem_addr) {
7228 uint32_t base;
7229 uint32_t offs;
7231 if (!request_mem_region(mem_addr, mem_len, "ips")) {
7232 IPS_PRINTK(KERN_WARNING, pci_dev,
7233 "Couldn't allocate IO Memory space %x len %d.\n",
7234 mem_addr, mem_len);
7235 return -1;
7238 base = mem_addr & PAGE_MASK;
7239 offs = mem_addr - base;
7240 ioremap_ptr = ioremap(base, PAGE_SIZE);
7241 mem_ptr = ioremap_ptr + offs;
7242 } else {
7243 ioremap_ptr = NULL;
7244 mem_ptr = NULL;
7247 /* setup I/O mapped area (if applicable) */
7248 if (io_addr) {
7249 if (!request_region(io_addr, io_len, "ips")) {
7250 IPS_PRINTK(KERN_WARNING, pci_dev,
7251 "Couldn't allocate IO space %x len %d.\n",
7252 io_addr, io_len);
7253 return -1;
7257 /* get the revision ID */
7258 if (pci_read_config_byte(pci_dev, PCI_REVISION_ID, &revision_id)) {
7259 IPS_PRINTK(KERN_WARNING, pci_dev, "Can't get revision id.\n");
7260 return -1;
7263 subdevice_id = pci_dev->subsystem_device;
7265 /* found a controller */
7266 ha = kmalloc(sizeof (ips_ha_t), GFP_KERNEL);
7267 if (ha == NULL) {
7268 IPS_PRINTK(KERN_WARNING, pci_dev,
7269 "Unable to allocate temporary ha struct\n");
7270 return -1;
7273 memset(ha, 0, sizeof (ips_ha_t));
7275 ips_sh[index] = NULL;
7276 ips_ha[index] = ha;
7277 ha->active = 1;
7279 /* Store info in HA structure */
7280 ha->irq = irq;
7281 ha->io_addr = io_addr;
7282 ha->io_len = io_len;
7283 ha->mem_addr = mem_addr;
7284 ha->mem_len = mem_len;
7285 ha->mem_ptr = mem_ptr;
7286 ha->ioremap_ptr = ioremap_ptr;
7287 ha->host_num = (uint32_t) index;
7288 ha->revision_id = revision_id;
7289 ha->slot_num = PCI_SLOT(pci_dev->devfn);
7290 ha->device_id = pci_dev->device;
7291 ha->subdevice_id = subdevice_id;
7292 ha->pcidev = pci_dev;
7295 * Set the pci_dev's dma_mask. Not all adapters support 64bit
7296 * addressing so don't enable it if the adapter can't support
7297 * it! Also, don't use 64bit addressing if dma addresses
7298 * are guaranteed to be < 4G.
7300 if (IPS_ENABLE_DMA64 && IPS_HAS_ENH_SGLIST(ha) &&
7301 !pci_set_dma_mask(ha->pcidev, 0xffffffffffffffffULL)) {
7302 (ha)->flags |= IPS_HA_ENH_SG;
7303 } else {
7304 if (pci_set_dma_mask(ha->pcidev, 0xffffffffULL) != 0) {
7305 printk(KERN_WARNING "Unable to set DMA Mask\n");
7306 return ips_abort_init(ha, index);
7309 if(ips_cd_boot && !ips_FlashData){
7310 ips_FlashData = pci_alloc_consistent(pci_dev, PAGE_SIZE << 7,
7311 &ips_flashbusaddr);
7314 ha->enq = pci_alloc_consistent(pci_dev, sizeof (IPS_ENQ),
7315 &ha->enq_busaddr);
7316 if (!ha->enq) {
7317 IPS_PRINTK(KERN_WARNING, pci_dev,
7318 "Unable to allocate host inquiry structure\n");
7319 return ips_abort_init(ha, index);
7322 ha->adapt = pci_alloc_consistent(pci_dev, sizeof (IPS_ADAPTER) +
7323 sizeof (IPS_IO_CMD), &dma_address);
7324 if (!ha->adapt) {
7325 IPS_PRINTK(KERN_WARNING, pci_dev,
7326 "Unable to allocate host adapt & dummy structures\n");
7327 return ips_abort_init(ha, index);
7329 ha->adapt->hw_status_start = dma_address;
7330 ha->dummy = (void *) (ha->adapt + 1);
7334 ha->logical_drive_info = pci_alloc_consistent(pci_dev, sizeof (IPS_LD_INFO), &dma_address);
7335 if (!ha->logical_drive_info) {
7336 IPS_PRINTK(KERN_WARNING, pci_dev,
7337 "Unable to allocate logical drive info structure\n");
7338 return ips_abort_init(ha, index);
7340 ha->logical_drive_info_dma_addr = dma_address;
7343 ha->conf = kmalloc(sizeof (IPS_CONF), GFP_KERNEL);
7345 if (!ha->conf) {
7346 IPS_PRINTK(KERN_WARNING, pci_dev,
7347 "Unable to allocate host conf structure\n");
7348 return ips_abort_init(ha, index);
7351 ha->nvram = kmalloc(sizeof (IPS_NVRAM_P5), GFP_KERNEL);
7353 if (!ha->nvram) {
7354 IPS_PRINTK(KERN_WARNING, pci_dev,
7355 "Unable to allocate host NVRAM structure\n");
7356 return ips_abort_init(ha, index);
7359 ha->subsys = kmalloc(sizeof (IPS_SUBSYS), GFP_KERNEL);
7361 if (!ha->subsys) {
7362 IPS_PRINTK(KERN_WARNING, pci_dev,
7363 "Unable to allocate host subsystem structure\n");
7364 return ips_abort_init(ha, index);
7367 /* the ioctl buffer is now used during adapter initialization, so its
7368 * successful allocation is now required */
7369 if (ips_ioctlsize < PAGE_SIZE)
7370 ips_ioctlsize = PAGE_SIZE;
7372 ha->ioctl_data = pci_alloc_consistent(pci_dev, ips_ioctlsize,
7373 &ha->ioctl_busaddr);
7374 ha->ioctl_len = ips_ioctlsize;
7375 if (!ha->ioctl_data) {
7376 IPS_PRINTK(KERN_WARNING, pci_dev,
7377 "Unable to allocate IOCTL data\n");
7378 return ips_abort_init(ha, index);
7382 * Setup Functions
7384 ips_setup_funclist(ha);
7386 if ((IPS_IS_MORPHEUS(ha)) || (IPS_IS_MARCO(ha))) {
7387 /* If Morpheus appears dead, reset it */
7388 IsDead = readl(ha->mem_ptr + IPS_REG_I960_MSG1);
7389 if (IsDead == 0xDEADBEEF) {
7390 ips_reset_morpheus(ha);
7395 * Initialize the card if it isn't already
7398 if (!(*ha->func.isinit) (ha)) {
7399 if (!(*ha->func.init) (ha)) {
7401 * Initialization failed
7403 IPS_PRINTK(KERN_WARNING, pci_dev,
7404 "Unable to initialize controller\n");
7405 return ips_abort_init(ha, index);
7409 *indexPtr = index;
7410 return SUCCESS;
7413 /*---------------------------------------------------------------------------*/
7414 /* Routine Name: ips_init_phase2 */
7415 /* */
7416 /* Routine Description: */
7417 /* Adapter Initialization Phase 2 */
7418 /* */
7419 /* Return Value: */
7420 /* 0 if Successful, else non-zero */
7421 /*---------------------------------------------------------------------------*/
7422 static int
7423 ips_init_phase2(int index)
7425 ips_ha_t *ha;
7427 ha = ips_ha[index];
7429 METHOD_TRACE("ips_init_phase2", 1);
7430 if (!ha->active) {
7431 ips_ha[index] = NULL;
7432 return -1;
7435 /* Install the interrupt handler */
7436 if (request_irq(ha->irq, do_ipsintr, SA_SHIRQ, ips_name, ha)) {
7437 IPS_PRINTK(KERN_WARNING, ha->pcidev,
7438 "Unable to install interrupt handler\n");
7439 return ips_abort_init(ha, index);
7443 * Allocate a temporary SCB for initialization
7445 ha->max_cmds = 1;
7446 if (!ips_allocatescbs(ha)) {
7447 IPS_PRINTK(KERN_WARNING, ha->pcidev,
7448 "Unable to allocate a CCB\n");
7449 free_irq(ha->irq, ha);
7450 return ips_abort_init(ha, index);
7453 if (!ips_hainit(ha)) {
7454 IPS_PRINTK(KERN_WARNING, ha->pcidev,
7455 "Unable to initialize controller\n");
7456 free_irq(ha->irq, ha);
7457 return ips_abort_init(ha, index);
7459 /* Free the temporary SCB */
7460 ips_deallocatescbs(ha, 1);
7462 /* allocate CCBs */
7463 if (!ips_allocatescbs(ha)) {
7464 IPS_PRINTK(KERN_WARNING, ha->pcidev,
7465 "Unable to allocate CCBs\n");
7466 free_irq(ha->irq, ha);
7467 return ips_abort_init(ha, index);
7470 return SUCCESS;
7473 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,9)
7474 MODULE_LICENSE("GPL");
7475 #endif
7477 MODULE_DESCRIPTION("IBM ServeRAID Adapter Driver " IPS_VER_STRING);
7479 #ifdef MODULE_VERSION
7480 MODULE_VERSION(IPS_VER_STRING);
7481 #endif
7485 * Overrides for Emacs so that we almost follow Linus's tabbing style.
7486 * Emacs will notice this stuff at the end of the file and automatically
7487 * adjust the settings for this buffer only. This must remain at the end
7488 * of the file.
7489 * ---------------------------------------------------------------------------
7490 * Local variables:
7491 * c-indent-level: 2
7492 * c-brace-imaginary-offset: 0
7493 * c-brace-offset: -2
7494 * c-argdecl-indent: 2
7495 * c-label-offset: -2
7496 * c-continued-statement-offset: 2
7497 * c-continued-brace-offset: 0
7498 * indent-tabs-mode: nil
7499 * tab-width: 8
7500 * End: