[SCSI] allow sleeping in ->eh_host_reset_handler()
[deliverable/linux.git] / drivers / scsi / ips.c
1 /*****************************************************************************/
2 /* ips.c -- driver for the Adaptec / IBM ServeRAID controller */
3 /* */
4 /* Written By: Keith Mitchell, IBM Corporation */
5 /* Jack Hammer, Adaptec, Inc. */
6 /* David Jeffery, Adaptec, Inc. */
7 /* */
8 /* Copyright (C) 2000 IBM Corporation */
9 /* Copyright (C) 2002,2003 Adaptec, Inc. */
10 /* */
11 /* This program is free software; you can redistribute it and/or modify */
12 /* it under the terms of the GNU General Public License as published by */
13 /* the Free Software Foundation; either version 2 of the License, or */
14 /* (at your option) any later version. */
15 /* */
16 /* This program is distributed in the hope that it will be useful, */
17 /* but WITHOUT ANY WARRANTY; without even the implied warranty of */
18 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
19 /* GNU General Public License for more details. */
20 /* */
21 /* NO WARRANTY */
22 /* THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR */
23 /* CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT */
24 /* LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, */
25 /* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is */
26 /* solely responsible for determining the appropriateness of using and */
27 /* distributing the Program and assumes all risks associated with its */
28 /* exercise of rights under this Agreement, including but not limited to */
29 /* the risks and costs of program errors, damage to or loss of data, */
30 /* programs or equipment, and unavailability or interruption of operations. */
31 /* */
32 /* DISCLAIMER OF LIABILITY */
33 /* NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY */
34 /* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL */
35 /* DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND */
36 /* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR */
37 /* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE */
38 /* USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED */
39 /* HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES */
40 /* */
41 /* You should have received a copy of the GNU General Public License */
42 /* along with this program; if not, write to the Free Software */
43 /* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
44 /* */
45 /* Bugs/Comments/Suggestions about this driver should be mailed to: */
46 /* ipslinux@adaptec.com */
47 /* */
48 /* For system support issues, contact your local IBM Customer support. */
49 /* Directions to find IBM Customer Support for each country can be found at: */
50 /* http://www.ibm.com/planetwide/ */
51 /* */
52 /*****************************************************************************/
53
54 /*****************************************************************************/
55 /* Change Log */
56 /* */
57 /* 0.99.02 - Breakup commands that are bigger than 8 * the stripe size */
58 /* 0.99.03 - Make interrupt routine handle all completed request on the */
59 /* adapter not just the first one */
60 /* - Make sure passthru commands get woken up if we run out of */
61 /* SCBs */
62 /* - Send all of the commands on the queue at once rather than */
63 /* one at a time since the card will support it. */
64 /* 0.99.04 - Fix race condition in the passthru mechanism -- this required */
65 /* the interface to the utilities to change */
66 /* - Fix error recovery code */
67 /* 0.99.05 - Fix an oops when we get certain passthru commands */
68 /* 1.00.00 - Initial Public Release */
69 /* Functionally equivalent to 0.99.05 */
70 /* 3.60.00 - Bump max commands to 128 for use with firmware 3.60 */
71 /* - Change version to 3.60 to coincide with release numbering. */
72 /* 3.60.01 - Remove bogus error check in passthru routine */
73 /* 3.60.02 - Make DCDB direction based on lookup table */
74 /* - Only allow one DCDB command to a SCSI ID at a time */
75 /* 4.00.00 - Add support for ServeRAID 4 */
76 /* 4.00.01 - Add support for First Failure Data Capture */
77 /* 4.00.02 - Fix problem with PT DCDB with no buffer */
78 /* 4.00.03 - Add alternative passthru interface */
79 /* - Add ability to flash BIOS */
80 /* 4.00.04 - Rename structures/constants to be prefixed with IPS_ */
81 /* 4.00.05 - Remove wish_block from init routine */
82 /* - Use linux/spinlock.h instead of asm/spinlock.h for kernels */
83 /* 2.3.18 and later */
84 /* - Sync with other changes from the 2.3 kernels */
85 /* 4.00.06 - Fix timeout with initial FFDC command */
86 /* 4.00.06a - Port to 2.4 (trivial) -- Christoph Hellwig <hch@infradead.org> */
87 /* 4.10.00 - Add support for ServeRAID 4M/4L */
88 /* 4.10.13 - Fix for dynamic unload and proc file system */
89 /* 4.20.03 - Rename version to coincide with new release schedules */
90 /* Performance fixes */
91 /* Fix truncation of /proc files with cat */
92 /* Merge in changes through kernel 2.4.0test1ac21 */
93 /* 4.20.13 - Fix some failure cases / reset code */
94 /* - Hook into the reboot_notifier to flush the controller cache */
95 /* 4.50.01 - Fix problem when there is a hole in logical drive numbering */
96 /* 4.70.09 - Use a Common ( Large Buffer ) for Flashing from the JCRM CD */
97 /* - Add IPSSEND Flash Support */
98 /* - Set Sense Data for Unknown SCSI Command */
99 /* - Use Slot Number from NVRAM Page 5 */
100 /* - Restore caller's DCDB Structure */
101 /* 4.70.12 - Corrective actions for bad controller ( during initialization )*/
102 /* 4.70.13 - Don't Send CDB's if we already know the device is not present */
103 /* - Don't release HA Lock in ips_next() until SC taken off queue */
104 /* - Unregister SCSI device in ips_release() */
105 /* 4.70.15 - Fix Breakup for very large ( non-SG ) requests in ips_done() */
106 /* 4.71.00 - Change all memory allocations to not use GFP_DMA flag */
107 /* Code Clean-Up for 2.4.x kernel */
108 /* 4.72.00 - Allow for a Scatter-Gather Element to exceed MAX_XFER Size */
109 /* 4.72.01 - I/O Mapped Memory release ( so "insmod ips" does not Fail ) */
110 /* - Don't Issue Internal FFDC Command if there are Active Commands */
111 /* - Close Window for getting too many IOCTL's active */
112 /* 4.80.00 - Make ia64 Safe */
113 /* 4.80.04 - Eliminate calls to strtok() if 2.4.x or greater */
114 /* - Adjustments to Device Queue Depth */
115 /* 4.80.14 - Take all semaphores off stack */
116 /* - Clean Up New_IOCTL path */
117 /* 4.80.20 - Set max_sectors in Scsi_Host structure ( if >= 2.4.7 kernel ) */
118 /* - 5 second delay needed after resetting an i960 adapter */
119 /* 4.80.26 - Clean up potential code problems ( Arjan's recommendations ) */
120 /* 4.90.01 - Version Matching for FirmWare, BIOS, and Driver */
121 /* 4.90.05 - Use New PCI Architecture to facilitate Hot Plug Development */
122 /* 4.90.08 - Increase Delays in Flashing ( Trombone Only - 4H ) */
123 /* 4.90.08 - Data Corruption if First Scatter Gather Element is > 64K */
124 /* 4.90.11 - Don't actually RESET unless it's physically required */
125 /* - Remove unused compile options */
126 /* 5.00.01 - Sarasota ( 5i ) adapters must always be scanned first */
127 /* - Get rid on IOCTL_NEW_COMMAND code */
128 /* - Add Extended DCDB Commands for Tape Support in 5I */
129 /* 5.10.12 - use pci_dma interfaces, update for 2.5 kernel changes */
130 /* 5.10.15 - remove unused code (sem, macros, etc.) */
131 /* 5.30.00 - use __devexit_p() */
132 /* 6.00.00 - Add 6x Adapters and Battery Flash */
133 /* 6.10.00 - Remove 1G Addressing Limitations */
134 /* 6.11.xx - Get VersionInfo buffer off the stack ! DDTS 60401 */
135 /* 6.11.xx - Make Logical Drive Info structure safe for DMA DDTS 60639 */
136 /* 7.10.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 /*****************************************************************************/
141
142 /*
143 * Conditional Compilation directives for this driver:
144 *
145 * IPS_DEBUG - Turn on debugging info
146 *
147 * Parameters:
148 *
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)
155 *
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
159 */
160
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>
176
177 #include <linux/blkdev.h>
178 #include <linux/types.h>
179
180 #include <scsi/sg.h>
181
182 #include "scsi.h"
183
184 #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,0)
185 #include "hosts.h"
186 #else
187 #include <scsi/scsi_host.h>
188 #endif
189
190 #include "ips.h"
191
192 #include <linux/module.h>
193
194 #include <linux/stat.h>
195 #include <linux/config.h>
196
197 #include <linux/spinlock.h>
198 #include <linux/init.h>
199
200 #include <linux/smp.h>
201
202 #ifdef MODULE
203 static char *ips = NULL;
204 module_param(ips, charp, 0);
205 #endif
206
207 /*
208 * DRIVER_VER
209 */
210 #define IPS_VERSION_HIGH "7.10"
211 #define IPS_VERSION_LOW ".18 "
212
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
216
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
232
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)
237
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
247
248 /*
249 * Function prototypes
250 */
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 *);
338
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);
346
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);
355
356 static int ips_init_phase1(struct pci_dev *pci_dev, int *indexPtr);
357 static int ips_register_scsi(int index);
358
359 /*
360 * global variables
361 */
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
405 };
406
407 static IPS_DEFINE_COMPAT_TABLE( Compatable ); /* Version Compatability Table */
408
409
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, }
416 };
417
418 MODULE_DEVICE_TABLE( pci, ips_pci_table );
419
420 static char ips_hot_plug_name[] = "ips";
421
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);
424
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),
430 };
431
432
433 /*
434 * Necessary forward function protoypes
435 */
436 static int ips_halt(struct notifier_block *nb, ulong event, void *buf);
437
438 #define MAX_ADAPTER_NAME 15
439
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"
459 };
460
461 static struct notifier_block ips_notifier = {
462 ips_halt, NULL, 0
463 };
464
465 /*
466 * Direction table
467 */
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
520 };
521
522
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)
534 {
535
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},
545 };
546
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';
555 /*
556 * We now have key/value pairs.
557 * Update the variables
558 */
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;
570 }
571 }
572 }
573
574 return (1);
575 }
576
577 __setup("ips=", ips_setup);
578
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)
592 {
593 int i;
594
595 METHOD_TRACE("ips_detect", 1);
596
597 #ifdef MODULE
598 if (ips)
599 ips_setup(ips);
600 #endif
601
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++;
606 }
607 ips_hotplug = 1;
608 return (ips_num_controllers);
609 }
610
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)
617 {
618
619 /*
620 * Setup Functions
621 */
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;
662
663 if (IPS_USE_I2O_DELIVER(ha))
664 ha->func.issue = ips_issue_i2o;
665 else
666 ha->func.issue = ips_issue_copperhead;
667 }
668 }
669
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)
681 {
682 ips_scb_t *scb;
683 ips_ha_t *ha;
684 int i;
685
686 METHOD_TRACE("ips_release", 1);
687
688 for (i = 0; i < IPS_MAX_ADAPTERS && ips_sh[i] != sh; i++) ;
689
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);
695 }
696
697 ha = IPS_HA(sh);
698
699 if (!ha)
700 return (FALSE);
701
702 /* flush the cache on the controller */
703 scb = &ha->scbs[ha->max_cmds - 1];
704
705 ips_init_scb(ha, scb);
706
707 scb->timeout = ips_cmd_timeout;
708 scb->cdb[0] = IPS_CMD_FLUSH;
709
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;
717
718 IPS_PRINTK(KERN_WARNING, ha->pcidev, "Flushing Cache.\n");
719
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");
723
724 IPS_PRINTK(KERN_WARNING, ha->pcidev, "Flushing Complete.\n");
725
726 ips_sh[i] = NULL;
727 ips_ha[i] = NULL;
728
729 /* free extra memory */
730 ips_free(ha);
731
732 /* Free I/O Region */
733 if (ha->io_addr)
734 release_region(ha->io_addr, ha->io_len);
735
736 /* free IRQ */
737 free_irq(ha->irq, ha);
738
739 IPS_REMOVE_HOST(sh);
740 scsi_host_put(sh);
741
742 ips_released_controllers++;
743
744 return (FALSE);
745 }
746
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)
758 {
759 ips_scb_t *scb;
760 ips_ha_t *ha;
761 int i;
762
763 if ((event != SYS_RESTART) && (event != SYS_HALT) &&
764 (event != SYS_POWER_OFF))
765 return (NOTIFY_DONE);
766
767 for (i = 0; i < ips_next_controller; i++) {
768 ha = (ips_ha_t *) ips_ha[i];
769
770 if (!ha)
771 continue;
772
773 if (!ha->active)
774 continue;
775
776 /* flush the cache on the controller */
777 scb = &ha->scbs[ha->max_cmds - 1];
778
779 ips_init_scb(ha, scb);
780
781 scb->timeout = ips_cmd_timeout;
782 scb->cdb[0] = IPS_CMD_FLUSH;
783
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;
791
792 IPS_PRINTK(KERN_WARNING, ha->pcidev, "Flushing Cache.\n");
793
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");
802 }
803
804 return (NOTIFY_OK);
805 }
806
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 /****************************************************************************/
816 int
817 ips_eh_abort(Scsi_Cmnd * SC)
818 {
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;
824
825 METHOD_TRACE("ips_eh_abort", 1);
826
827 if (!SC)
828 return (FAILED);
829
830 host = SC->device->host;
831 ha = (ips_ha_t *) SC->device->host->hostdata;
832
833 if (!ha)
834 return (FAILED);
835
836 if (!ha->active)
837 return (FAILED);
838
839 IPS_LOCK_SAVE(host->host_lock, cpu_flags);
840
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;
845
846 if (item) {
847 /* Found it */
848 ips_removeq_copp(&ha->copp_waitlist, item);
849 ret = (SUCCESS);
850
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);
858 }
859
860 IPS_UNLOCK_RESTORE(host->host_lock, cpu_flags);
861 return ret;
862 }
863
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)
877 {
878 int ret;
879 int i;
880 ips_ha_t *ha;
881 ips_scb_t *scb;
882 ips_copp_wait_item_t *item;
883
884 METHOD_TRACE("ips_eh_reset", 1);
885
886 #ifdef NO_IPS_RESET
887 return (FAILED);
888 #else
889
890 if (!SC) {
891 DEBUG(1, "Reset called with NULL scsi command");
892
893 return (FAILED);
894 }
895
896 ha = (ips_ha_t *) SC->device->host->hostdata;
897
898 if (!ha) {
899 DEBUG(1, "Reset called with NULL ha struct");
900
901 return (FAILED);
902 }
903
904 if (!ha->active)
905 return (FAILED);
906
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;
911
912 if (item) {
913 /* Found it */
914 ips_removeq_copp(&ha->copp_waitlist, item);
915 return (SUCCESS);
916 }
917
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);
922 }
923
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 ). */
933
934 if (ha->ioctl_reset == 0) { /* IF Not an IOCTL Requested Reset */
935 scb = &ha->scbs[ha->max_cmds - 1];
936
937 ips_init_scb(ha, scb);
938
939 scb->timeout = ips_cmd_timeout;
940 scb->cdb[0] = IPS_CMD_FLUSH;
941
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;
949
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);
956 }
957 }
958
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. */
961
962 ha->ioctl_reset = 0; /* Reset the IOCTL Requested Reset Flag */
963
964 /*
965 * command must have already been sent
966 * reset the controller
967 */
968 IPS_PRINTK(KERN_NOTICE, ha->pcidev, "Resetting controller.\n");
969 ret = (*ha->func.reset) (ha);
970
971 if (!ret) {
972 Scsi_Cmnd *scsi_cmd;
973
974 IPS_PRINTK(KERN_NOTICE, ha->pcidev,
975 "Controller reset failed - controller now offline.\n");
976
977 /* Now fail all of the active commands */
978 DEBUG_VAR(1, "(%s%d) Failing active commands",
979 ips_name, ha->host_num);
980
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);
985 }
986
987 /* Now fail all of the pending commands */
988 DEBUG_VAR(1, "(%s%d) Failing pending commands",
989 ips_name, ha->host_num);
990
991 while ((scsi_cmd = ips_removeq_wait_head(&ha->scb_waitlist))) {
992 scsi_cmd->result = DID_ERROR;
993 scsi_cmd->scsi_done(scsi_cmd);
994 }
995
996 ha->active = FALSE;
997 return (FAILED);
998 }
999
1000 if (!ips_clear_adapter(ha, IPS_INTR_IORL)) {
1001 Scsi_Cmnd *scsi_cmd;
1002
1003 IPS_PRINTK(KERN_NOTICE, ha->pcidev,
1004 "Controller reset failed - controller now offline.\n");
1005
1006 /* Now fail all of the active commands */
1007 DEBUG_VAR(1, "(%s%d) Failing active commands",
1008 ips_name, ha->host_num);
1009
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);
1014 }
1015
1016 /* Now fail all of the pending commands */
1017 DEBUG_VAR(1, "(%s%d) Failing pending commands",
1018 ips_name, ha->host_num);
1019
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);
1023 }
1024
1025 ha->active = FALSE;
1026 return (FAILED);
1027 }
1028
1029 /* FFDC */
1030 if (le32_to_cpu(ha->subsys->param[3]) & 0x300000) {
1031 struct timeval tv;
1032
1033 do_gettimeofday(&tv);
1034 ha->last_ffdc = tv.tv_sec;
1035 ha->reset_count++;
1036 ips_ffdc_reset(ha, IPS_INTR_IORL);
1037 }
1038
1039 /* Now fail all of the active commands */
1040 DEBUG_VAR(1, "(%s%d) Failing active commands", ips_name, ha->host_num);
1041
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);
1047 }
1048
1049 /* Reset DCDB active command bits */
1050 for (i = 1; i < ha->nbus; i++)
1051 ha->dcdb_active[i - 1] = 0;
1052
1053 /* Reset the number of active IOCTLs */
1054 ha->num_ioctl = 0;
1055
1056 ips_next(ha, IPS_INTR_IORL);
1057
1058 return (SUCCESS);
1059 #endif /* NO_IPS_RESET */
1060
1061 }
1062
1063 static int
1064 ips_eh_reset(Scsi_Cmnd * SC)
1065 {
1066 int rc;
1067
1068 spin_lock_irq(SC->device->host->host_lock);
1069 rc = __ips_eh_reset(SC);
1070 spin_unlock_irq(SC->device->host->host_lock);
1071
1072 return rc;
1073 }
1074
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 *))
1089 {
1090 ips_ha_t *ha;
1091 ips_passthru_t *pt;
1092
1093 METHOD_TRACE("ips_queue", 1);
1094
1095 ha = (ips_ha_t *) SC->device->host->hostdata;
1096
1097 if (!ha)
1098 return (1);
1099
1100 if (!ha->active)
1101 return (DID_ERROR);
1102
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);
1107
1108 return (0);
1109 }
1110 } else if (ha->scb_waitlist.count == IPS_MAX_QUEUE) {
1111 SC->result = DID_BUS_BUSY << 16;
1112 done(SC);
1113
1114 return (0);
1115 }
1116
1117 SC->scsi_done = done;
1118
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);
1124
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);
1130
1131 return (0);
1132 }
1133
1134 if (ips_is_passthru(SC)) {
1135
1136 ips_copp_wait_item_t *scratch;
1137
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);
1148 }
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);
1154 }
1155
1156 /* allocate space for the scribble */
1157 scratch = kmalloc(sizeof (ips_copp_wait_item_t), GFP_ATOMIC);
1158
1159 if (!scratch) {
1160 SC->result = DID_ERROR << 16;
1161 done(SC);
1162
1163 return (0);
1164 }
1165
1166 scratch->scsi_cmd = SC;
1167 scratch->next = NULL;
1168
1169 ips_putq_copp_tail(&ha->copp_waitlist, scratch);
1170 } else {
1171 ips_putq_wait_tail(&ha->scb_waitlist, SC);
1172 }
1173
1174 ips_next(ha, IPS_INTR_IORL);
1175
1176 return (0);
1177 }
1178
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[])
1191 {
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[])
1197 {
1198 ips_ha_t *ha = (ips_ha_t *) sdev->host->hostdata;
1199 #endif
1200 int heads;
1201 int sectors;
1202 int cylinders;
1203
1204 METHOD_TRACE("ips_biosparam", 1);
1205
1206 if (!ha)
1207 /* ?!?! host adater info invalid */
1208 return (0);
1209
1210 if (!ha->active)
1211 return (0);
1212
1213 if (!ips_read_adapter_status(ha, IPS_INTR_ON))
1214 /* ?!?! Enquiry command failed */
1215 return (0);
1216
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;
1223 }
1224
1225 cylinders = (unsigned long) capacity / (heads * sectors);
1226
1227 DEBUG_VAR(2, "Geometry: heads: %d, sectors: %d, cylinders: %d",
1228 heads, sectors, cylinders);
1229
1230 geom[0] = heads;
1231 geom[1] = sectors;
1232 geom[2] = cylinders;
1233
1234 return (0);
1235 }
1236
1237 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
1238
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)
1244 {
1245 int i;
1246
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);
1251 }
1252 }
1253 return -EINVAL;
1254 }
1255
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)
1267 {
1268 Scsi_Device *device;
1269 ips_ha_t *ha;
1270 int count = 0;
1271 int min;
1272
1273 ha = IPS_HA(host);
1274 min = ha->max_cmds / 4;
1275
1276 for (device = scsi_devs; device; device = device->next) {
1277 if (device->host == host) {
1278 if ((device->channel == 0) && (device->type == 0))
1279 count++;
1280 }
1281 }
1282
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;
1292 }
1293
1294 if (device->queue_depth < 2)
1295 device->queue_depth = 2;
1296 }
1297 }
1298 }
1299
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)
1312 {
1313 ips_ha_t *ha;
1314 int min;
1315
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);
1322 }
1323 return 0;
1324 }
1325 #endif
1326
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)
1338 {
1339 ips_ha_t *ha;
1340 unsigned long cpu_flags;
1341 struct Scsi_Host *host;
1342 int irqstatus;
1343
1344 METHOD_TRACE("do_ipsintr", 2);
1345
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;
1354 }
1355
1356 IPS_LOCK_SAVE(host->host_lock, cpu_flags);
1357
1358 if (!ha->active) {
1359 IPS_UNLOCK_RESTORE(host->host_lock, cpu_flags);
1360 return IRQ_HANDLED;
1361 }
1362
1363 irqstatus = (*ha->func.intr) (ha);
1364
1365 IPS_UNLOCK_RESTORE(host->host_lock, cpu_flags);
1366
1367 /* start the next command */
1368 ips_next(ha, IPS_INTR_ON);
1369 return IRQ_RETVAL(irqstatus);
1370 }
1371
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 /****************************************************************************/
1383 int
1384 ips_intr_copperhead(ips_ha_t * ha)
1385 {
1386 ips_stat_t *sp;
1387 ips_scb_t *scb;
1388 IPS_STATUS cstatus;
1389 int intrstatus;
1390
1391 METHOD_TRACE("ips_intr", 2);
1392
1393 if (!ha)
1394 return 0;
1395
1396 if (!ha->active)
1397 return 0;
1398
1399 intrstatus = (*ha->func.isintr) (ha);
1400
1401 if (!intrstatus) {
1402 /*
1403 * Unexpected/Shared interrupt
1404 */
1405
1406 return 0;
1407 }
1408
1409 while (TRUE) {
1410 sp = &ha->sp;
1411
1412 intrstatus = (*ha->func.isintr) (ha);
1413
1414 if (!intrstatus)
1415 break;
1416 else
1417 cstatus.value = (*ha->func.statupd) (ha);
1418
1419 if (cstatus.fields.command_id > (IPS_MAX_CMDS - 1)) {
1420 /* Spurious Interupt ? */
1421 continue;
1422 }
1423
1424 ips_chkstatus(ha, &cstatus);
1425 scb = (ips_scb_t *) sp->scb_addr;
1426
1427 /*
1428 * use the callback function to finish things up
1429 * NOTE: interrupts are OFF for this
1430 */
1431 (*scb->callback) (ha, scb);
1432 } /* end while */
1433 return 1;
1434 }
1435
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 /****************************************************************************/
1447 int
1448 ips_intr_morpheus(ips_ha_t * ha)
1449 {
1450 ips_stat_t *sp;
1451 ips_scb_t *scb;
1452 IPS_STATUS cstatus;
1453 int intrstatus;
1454
1455 METHOD_TRACE("ips_intr_morpheus", 2);
1456
1457 if (!ha)
1458 return 0;
1459
1460 if (!ha->active)
1461 return 0;
1462
1463 intrstatus = (*ha->func.isintr) (ha);
1464
1465 if (!intrstatus) {
1466 /*
1467 * Unexpected/Shared interrupt
1468 */
1469
1470 return 0;
1471 }
1472
1473 while (TRUE) {
1474 sp = &ha->sp;
1475
1476 intrstatus = (*ha->func.isintr) (ha);
1477
1478 if (!intrstatus)
1479 break;
1480 else
1481 cstatus.value = (*ha->func.statupd) (ha);
1482
1483 if (cstatus.value == 0xffffffff)
1484 /* No more to process */
1485 break;
1486
1487 if (cstatus.fields.command_id > (IPS_MAX_CMDS - 1)) {
1488 IPS_PRINTK(KERN_WARNING, ha->pcidev,
1489 "Spurious interrupt; no ccb.\n");
1490
1491 continue;
1492 }
1493
1494 ips_chkstatus(ha, &cstatus);
1495 scb = (ips_scb_t *) sp->scb_addr;
1496
1497 /*
1498 * use the callback function to finish things up
1499 * NOTE: interrupts are OFF for this
1500 */
1501 (*scb->callback) (ha, scb);
1502 } /* end while */
1503 return 1;
1504 }
1505
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)
1517 {
1518 static char buffer[256];
1519 char *bp;
1520 ips_ha_t *ha;
1521
1522 METHOD_TRACE("ips_info", 1);
1523
1524 ha = IPS_HA(SH);
1525
1526 if (!ha)
1527 return (NULL);
1528
1529 bp = &buffer[0];
1530 memset(bp, 0, sizeof (buffer));
1531
1532 sprintf(bp, "%s%s%s Build %d", "IBM PCI ServeRAID ",
1533 IPS_VERSION_HIGH, IPS_VERSION_LOW, IPS_BUILD_IDENT);
1534
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, ">");
1539 }
1540
1541 return (bp);
1542 }
1543
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)
1556 {
1557 int i;
1558 int ret;
1559 ips_ha_t *ha = NULL;
1560
1561 METHOD_TRACE("ips_proc_info", 1);
1562
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;
1569 }
1570 }
1571 }
1572
1573 if (!ha)
1574 return (-EINVAL);
1575
1576 if (func) {
1577 /* write */
1578 return (0);
1579 } else {
1580 /* read */
1581 if (start)
1582 *start = buffer;
1583
1584 ret = ips_host_info(ha, buffer, offset, length);
1585
1586 return (ret);
1587 }
1588 }
1589
1590 /*--------------------------------------------------------------------------*/
1591 /* Helper Functions */
1592 /*--------------------------------------------------------------------------*/
1593
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)
1605 {
1606 METHOD_TRACE("ips_is_passthru", 1);
1607
1608 if (!SC)
1609 return (0);
1610
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;
1627 }
1628 }
1629 return 0;
1630 }
1631
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)
1642 {
1643 void *bigger_buf;
1644 dma_addr_t dma_busaddr;
1645
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;
1660 }
1661 return 0;
1662 }
1663
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)
1675 {
1676 ips_passthru_t *pt;
1677 int length = 0;
1678 int ret;
1679
1680 METHOD_TRACE("ips_make_passthru", 1);
1681
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;
1689 }
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);
1695 }
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));
1705 }
1706 return IPS_FAILURE;
1707 }
1708 ha->ioctl_datasize = length;
1709
1710 ips_scmd_buf_read(SC, ha->ioctl_data, ha->ioctl_datasize);
1711 pt = (ips_passthru_t *) ha->ioctl_data;
1712
1713 /*
1714 * Some notes about the passthru interface used
1715 *
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.
1721 */
1722
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;
1730
1731 return (IPS_SUCCESS_IMM);
1732
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);
1741
1742 return (IPS_FAILURE);
1743 }
1744
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;
1752 }
1753 if (ips_usrcmd(ha, pt, scb))
1754 return (IPS_SUCCESS);
1755 else
1756 return (IPS_FAILURE);
1757 }
1758
1759 break;
1760
1761 } /* end switch */
1762
1763 return (IPS_FAILURE);
1764 }
1765
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)
1773 {
1774 int datasize;
1775
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;
1783 }
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;
1808 }
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;
1820 }
1821 }
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);
1834 }
1835 return IPS_SUCCESS_IMM;
1836 }
1837
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)
1845 {
1846
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;
1877 }
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;
1889 }
1890 return IPS_SUCCESS_IMM;
1891 }
1892 error:
1893 pt->BasicStatus = 0x0B;
1894 pt->ExtendedStatus = 0x00;
1895 ips_free_flash_copperhead(ha);
1896 return IPS_FAILURE;
1897 }
1898
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)
1910 {
1911
1912 int ret_val = 0;
1913
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;
1922 }
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);
1933 }
1934
1935 ++scb->sg_len;
1936 scb->data_len += e_len;
1937 return ret_val;
1938 }
1939
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)
1947 {
1948 IPS_SG_LIST sg_list;
1949 uint32_t cmd_busaddr;
1950
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;
1961 }
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;
1979
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;
1991 }
1992
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)
2000 {
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;
2007 }
2008
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)
2020 {
2021 IPS_SG_LIST sg_list;
2022 uint32_t cmd_busaddr;
2023
2024 METHOD_TRACE("ips_usrcmd", 1);
2025
2026 if ((!scb) || (!pt) || (!ha))
2027 return (0);
2028
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));
2035
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);
2049
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);
2055
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;
2061 }
2062
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);
2068
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);
2076 }
2077
2078 /* set timeouts */
2079 if (pt->TimeOut) {
2080 scb->timeout = pt->TimeOut;
2081
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;
2088 }
2089
2090 /* assume success */
2091 scb->scsi_cmd->result = DID_OK << 16;
2092
2093 /* success */
2094 return (1);
2095 }
2096
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)
2108 {
2109 ips_passthru_t *pt;
2110
2111 METHOD_TRACE("ips_cleanup_passthru", 1);
2112
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);
2116
2117 return;
2118 }
2119 pt = (ips_passthru_t *) ha->ioctl_data;
2120
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));
2124
2125 pt->BasicStatus = scb->basic_status;
2126 pt->ExtendedStatus = scb->extended_status;
2127 pt->AdapterType = ha->ad_type;
2128
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);
2133
2134 ips_scmd_buf_write(scb->scsi_cmd, ha->ioctl_data, ha->ioctl_datasize);
2135 }
2136
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)
2148 {
2149 IPS_INFOSTR info;
2150
2151 METHOD_TRACE("ips_host_info", 1);
2152
2153 info.buffer = ptr;
2154 info.length = len;
2155 info.offset = offset;
2156 info.pos = 0;
2157 info.localpos = 0;
2158
2159 copy_info(&info, "\nIBM ServeRAID General Information:\n\n");
2160
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");
2168
2169 if (ha->io_addr)
2170 copy_info(&info,
2171 "\tIO region : 0x%lx (%d bytes)\n",
2172 ha->io_addr, ha->io_len);
2173
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);
2181 }
2182
2183 copy_info(&info, "\tIRQ number : %d\n", ha->irq);
2184
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. */
2187
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]);
2196
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]);
2204 }
2205
2206 }
2207
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]);
2222 }
2223
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]);
2238 }
2239
2240 copy_info(&info, "\tDriver Version : %s%s\n",
2241 IPS_VERSION_HIGH, IPS_VERSION_LOW);
2242
2243 copy_info(&info, "\tDriver Build : %d\n",
2244 IPS_BUILD_IDENT);
2245
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);
2258
2259 copy_info(&info, "\n");
2260
2261 return (info.localpos);
2262 }
2263
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)
2275 {
2276 METHOD_TRACE("copy_mem_info", 1);
2277
2278 if (info->pos + len < info->offset) {
2279 info->pos += len;
2280 return;
2281 }
2282
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);
2287 }
2288
2289 if (info->localpos + len > info->length)
2290 len = info->length - info->localpos;
2291
2292 if (len > 0) {
2293 memcpy(info->buffer + info->localpos, data, len);
2294 info->pos += len;
2295 info->localpos += len;
2296 }
2297 }
2298
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, ...)
2310 {
2311 va_list args;
2312 char buf[128];
2313 int len;
2314
2315 METHOD_TRACE("copy_info", 1);
2316
2317 va_start(args, fmt);
2318 len = vsprintf(buf, fmt, args);
2319 va_end(args);
2320
2321 copy_mem_info(info, buf, len);
2322
2323 return (len);
2324 }
2325
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)
2337 {
2338 METHOD_TRACE("ips_identify_controller", 1);
2339
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;
2360 }
2361 break;
2362
2363 case IPS_DEVICEID_MORPHEUS:
2364 switch (ha->subdevice_id) {
2365 case IPS_SUBDEVICEID_4L:
2366 ha->ad_type = IPS_ADTYPE_SERVERAID4L;
2367 break;
2368
2369 case IPS_SUBDEVICEID_4M:
2370 ha->ad_type = IPS_ADTYPE_SERVERAID4M;
2371 break;
2372
2373 case IPS_SUBDEVICEID_4MX:
2374 ha->ad_type = IPS_ADTYPE_SERVERAID4MX;
2375 break;
2376
2377 case IPS_SUBDEVICEID_4LX:
2378 ha->ad_type = IPS_ADTYPE_SERVERAID4LX;
2379 break;
2380
2381 case IPS_SUBDEVICEID_5I2:
2382 ha->ad_type = IPS_ADTYPE_SERVERAID5I2;
2383 break;
2384
2385 case IPS_SUBDEVICEID_5I1:
2386 ha->ad_type = IPS_ADTYPE_SERVERAID5I1;
2387 break;
2388 }
2389
2390 break;
2391
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;
2406 }
2407 break;
2408 }
2409 }
2410
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)
2422 {
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' };
2432
2433 METHOD_TRACE("ips_get_bios_version", 1);
2434
2435 major = 0;
2436 minor = 0;
2437
2438 strncpy(ha->bios_version, " ?", 8);
2439
2440 if (ha->device_id == IPS_DEVICEID_COPPERHEAD) {
2441 if (IPS_USE_MEMIO(ha)) {
2442 /* Memory Mapped I/O */
2443
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 */
2448
2449 if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0x55)
2450 return;
2451
2452 writel(1, ha->mem_ptr + IPS_REG_FLAP);
2453 if (ha->revision_id == IPS_REVID_TROMBONE64)
2454 udelay(25); /* 25 us */
2455
2456 if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0xAA)
2457 return;
2458
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 */
2463
2464 major = readb(ha->mem_ptr + IPS_REG_FLDP);
2465
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);
2471
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);
2477
2478 } else {
2479 /* Programmed I/O */
2480
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 */
2485
2486 if (inb(ha->io_addr + IPS_REG_FLDP) != 0x55)
2487 return;
2488
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 */
2492
2493 if (inb(ha->io_addr + IPS_REG_FLDP) != 0xAA)
2494 return;
2495
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 */
2500
2501 major = inb(ha->io_addr + IPS_REG_FLDP);
2502
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 */
2507
2508 minor = inb(ha->io_addr + IPS_REG_FLDP);
2509
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 */
2514
2515 subminor = inb(ha->io_addr + IPS_REG_FLDP);
2516
2517 }
2518 } else {
2519 /* Morpheus Family - Send Command to the card */
2520
2521 buffer = ha->ioctl_data;
2522
2523 memset(buffer, 0, 0x1000);
2524
2525 scb = &ha->scbs[ha->max_cmds - 1];
2526
2527 ips_init_scb(ha, scb);
2528
2529 scb->timeout = ips_cmd_timeout;
2530 scb->cdb[0] = IPS_CMD_RW_BIOSFW;
2531
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;
2541
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 */
2549
2550 return;
2551 }
2552
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;
2559 }
2560 }
2561
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;
2570 }
2571
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)
2585 {
2586 int i;
2587 struct timeval tv;
2588
2589 METHOD_TRACE("ips_hainit", 1);
2590
2591 if (!ha)
2592 return (0);
2593
2594 if (ha->func.statinit)
2595 (*ha->func.statinit) (ha);
2596
2597 if (ha->func.enableint)
2598 (*ha->func.enableint) (ha);
2599
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);
2605
2606 if (!ips_read_config(ha, IPS_INTR_IORL)) {
2607 IPS_PRINTK(KERN_WARNING, ha->pcidev,
2608 "unable to read config from controller.\n");
2609
2610 return (0);
2611 }
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");
2616
2617 return (0);
2618 }
2619
2620 /* Identify this controller */
2621 ips_identify_controller(ha);
2622
2623 if (!ips_read_subsystem_parameters(ha, IPS_INTR_IORL)) {
2624 IPS_PRINTK(KERN_WARNING, ha->pcidev,
2625 "unable to read subsystem parameters.\n");
2626
2627 return (0);
2628 }
2629
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");
2634
2635 return (0);
2636 }
2637
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);
2641
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;
2646
2647 switch (ha->conf->logical_drive[0].ucStripeSize) {
2648 case 4:
2649 ha->max_xfer = 0x10000;
2650 break;
2651
2652 case 5:
2653 ha->max_xfer = 0x20000;
2654 break;
2655
2656 case 6:
2657 ha->max_xfer = 0x40000;
2658 break;
2659
2660 case 7:
2661 default:
2662 ha->max_xfer = 0x80000;
2663 break;
2664 }
2665
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;
2676
2677 case 5:
2678 ha->max_cmds = 16;
2679 break;
2680
2681 case 6:
2682 ha->max_cmds = 8;
2683 break;
2684
2685 case 7:
2686 default:
2687 ha->max_cmds = 4;
2688 break;
2689 }
2690 }
2691
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;
2698 }
2699
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;
2705 }
2706
2707 return (1);
2708 }
2709
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)
2721 {
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);
2731
2732 if (!ha)
2733 return;
2734 host = ips_sh[ha->host_num];
2735 /*
2736 * Block access to the queue function so
2737 * this command won't time out
2738 */
2739 if (intr == IPS_INTR_ON)
2740 IPS_LOCK_SAVE(host->host_lock, cpu_flags);
2741
2742 if ((ha->subsys->param[3] & 0x300000)
2743 && (ha->scb_activelist.count == 0)) {
2744 struct timeval tv;
2745
2746 do_gettimeofday(&tv);
2747
2748 if (tv.tv_sec - ha->last_ffdc > IPS_SECS_8HOURS) {
2749 ha->last_ffdc = tv.tv_sec;
2750 ips_ffdc_time(ha);
2751 }
2752 }
2753
2754 /*
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
2760 */
2761 while ((ha->num_ioctl < IPS_MAX_IOCTL) &&
2762 (ha->copp_waitlist.head) && (scb = ips_getscb(ha))) {
2763
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);
2770
2771 ret = ips_make_passthru(ha, scb->scsi_cmd, scb, intr);
2772
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);
2780 }
2781
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);
2788 }
2789
2790 ips_freescb(ha, scb);
2791 break;
2792 default:
2793 break;
2794 } /* end case */
2795
2796 if (ret != IPS_SUCCESS) {
2797 ha->num_ioctl--;
2798 continue;
2799 }
2800
2801 ret = ips_send_cmd(ha, scb);
2802
2803 if (ret == IPS_SUCCESS)
2804 ips_putq_scb_head(&ha->scb_activelist, scb);
2805 else
2806 ha->num_ioctl--;
2807
2808 switch (ret) {
2809 case IPS_FAILURE:
2810 if (scb->scsi_cmd) {
2811 scb->scsi_cmd->result = DID_ERROR << 16;
2812 }
2813
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 */
2822
2823 }
2824
2825 /*
2826 * Send "Normal" I/O commands
2827 */
2828
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;
2838 }
2839
2840 q = p;
2841 SC = ips_removeq_wait(&ha->scb_waitlist, q);
2842
2843 if (intr == IPS_INTR_ON)
2844 IPS_UNLOCK_RESTORE(host->host_lock, cpu_flags); /* Unlock HA after command is taken off queue */
2845
2846 SC->result = DID_OK;
2847 SC->host_scribble = NULL;
2848
2849 memset(SC->sense_buffer, 0, sizeof (SC->sense_buffer));
2850
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);
2860
2861 /* copy in the CDB */
2862 memcpy(scb->cdb, SC->cmnd, SC->cmd_len);
2863
2864 /* Now handle the data buffer */
2865 if (SC->use_sg) {
2866 struct scatterlist *sg;
2867 int i;
2868
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;
2878 }
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;
2897 }
2898
2899 }
2900
2901 scb->dcdb.cmd_attribute =
2902 ips_command_direction[scb->scsi_cmd->cmnd[0]];
2903
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;
2908
2909 if (!(scb->dcdb.cmd_attribute & 0x3))
2910 scb->dcdb.transfer_length = 0;
2911
2912 if (scb->data_len >= IPS_MAX_XFER) {
2913 scb->dcdb.cmd_attribute |= IPS_TRANSFER64K;
2914 scb->dcdb.transfer_length = 0;
2915 }
2916 if (intr == IPS_INTR_ON)
2917 IPS_LOCK_SAVE(host->host_lock, cpu_flags);
2918
2919 ret = ips_send_cmd(ha, scb);
2920
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);
2929 }
2930
2931 if (scb->bus)
2932 ha->dcdb_active[scb->bus - 1] &=
2933 ~(1 << scb->target_id);
2934
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);
2940
2941 if (scb->bus)
2942 ha->dcdb_active[scb->bus - 1] &=
2943 ~(1 << scb->target_id);
2944
2945 ips_freescb(ha, scb);
2946 break;
2947 default:
2948 break;
2949 } /* end case */
2950
2951 p = (Scsi_Cmnd *) p->host_scribble;
2952
2953 } /* end while */
2954
2955 if (intr == IPS_INTR_ON)
2956 IPS_UNLOCK_RESTORE(host->host_lock, cpu_flags);
2957 }
2958
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)
2972 {
2973 METHOD_TRACE("ips_putq_scb_head", 1);
2974
2975 if (!item)
2976 return;
2977
2978 item->q_next = queue->head;
2979 queue->head = item;
2980
2981 if (!queue->tail)
2982 queue->tail = item;
2983
2984 queue->count++;
2985 }
2986
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)
3000 {
3001 ips_scb_t *item;
3002
3003 METHOD_TRACE("ips_removeq_scb_head", 1);
3004
3005 item = queue->head;
3006
3007 if (!item) {
3008 return (NULL);
3009 }
3010
3011 queue->head = item->q_next;
3012 item->q_next = NULL;
3013
3014 if (queue->tail == item)
3015 queue->tail = NULL;
3016
3017 queue->count--;
3018
3019 return (item);
3020 }
3021
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)
3035 {
3036 ips_scb_t *p;
3037
3038 METHOD_TRACE("ips_removeq_scb", 1);
3039
3040 if (!item)
3041 return (NULL);
3042
3043 if (item == queue->head) {
3044 return (ips_removeq_scb_head(queue));
3045 }
3046
3047 p = queue->head;
3048
3049 while ((p) && (item != p->q_next))
3050 p = p->q_next;
3051
3052 if (p) {
3053 /* found a match */
3054 p->q_next = item->q_next;
3055
3056 if (!item->q_next)
3057 queue->tail = p;
3058
3059 item->q_next = NULL;
3060 queue->count--;
3061
3062 return (item);
3063 }
3064
3065 return (NULL);
3066 }
3067
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)
3081 {
3082 METHOD_TRACE("ips_putq_wait_tail", 1);
3083
3084 if (!item)
3085 return;
3086
3087 item->host_scribble = NULL;
3088
3089 if (queue->tail)
3090 queue->tail->host_scribble = (char *) item;
3091
3092 queue->tail = item;
3093
3094 if (!queue->head)
3095 queue->head = item;
3096
3097 queue->count++;
3098 }
3099
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)
3113 {
3114 Scsi_Cmnd *item;
3115
3116 METHOD_TRACE("ips_removeq_wait_head", 1);
3117
3118 item = queue->head;
3119
3120 if (!item) {
3121 return (NULL);
3122 }
3123
3124 queue->head = (Scsi_Cmnd *) item->host_scribble;
3125 item->host_scribble = NULL;
3126
3127 if (queue->tail == item)
3128 queue->tail = NULL;
3129
3130 queue->count--;
3131
3132 return (item);
3133 }
3134
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)
3148 {
3149 Scsi_Cmnd *p;
3150
3151 METHOD_TRACE("ips_removeq_wait", 1);
3152
3153 if (!item)
3154 return (NULL);
3155
3156 if (item == queue->head) {
3157 return (ips_removeq_wait_head(queue));
3158 }
3159
3160 p = queue->head;
3161
3162 while ((p) && (item != (Scsi_Cmnd *) p->host_scribble))
3163 p = (Scsi_Cmnd *) p->host_scribble;
3164
3165 if (p) {
3166 /* found a match */
3167 p->host_scribble = item->host_scribble;
3168
3169 if (!item->host_scribble)
3170 queue->tail = p;
3171
3172 item->host_scribble = NULL;
3173 queue->count--;
3174
3175 return (item);
3176 }
3177
3178 return (NULL);
3179 }
3180
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)
3194 {
3195 METHOD_TRACE("ips_putq_copp_tail", 1);
3196
3197 if (!item)
3198 return;
3199
3200 item->next = NULL;
3201
3202 if (queue->tail)
3203 queue->tail->next = item;
3204
3205 queue->tail = item;
3206
3207 if (!queue->head)
3208 queue->head = item;
3209
3210 queue->count++;
3211 }
3212
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)
3226 {
3227 ips_copp_wait_item_t *item;
3228
3229 METHOD_TRACE("ips_removeq_copp_head", 1);
3230
3231 item = queue->head;
3232
3233 if (!item) {
3234 return (NULL);
3235 }
3236
3237 queue->head = item->next;
3238 item->next = NULL;
3239
3240 if (queue->tail == item)
3241 queue->tail = NULL;
3242
3243 queue->count--;
3244
3245 return (item);
3246 }
3247
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)
3261 {
3262 ips_copp_wait_item_t *p;
3263
3264 METHOD_TRACE("ips_removeq_copp", 1);
3265
3266 if (!item)
3267 return (NULL);
3268
3269 if (item == queue->head) {
3270 return (ips_removeq_copp_head(queue));
3271 }
3272
3273 p = queue->head;
3274
3275 while ((p) && (item != p->next))
3276 p = p->next;
3277
3278 if (p) {
3279 /* found a match */
3280 p->next = item->next;
3281
3282 if (!item->next)
3283 queue->tail = p;
3284
3285 item->next = NULL;
3286 queue->count--;
3287
3288 return (item);
3289 }
3290
3291 return (NULL);
3292 }
3293
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)
3305 {
3306 METHOD_TRACE("ipsintr_blocking", 2);
3307
3308 ips_freescb(ha, scb);
3309 if ((ha->waitflag == TRUE) && (ha->cmd_in_progress == scb->cdb[0])) {
3310 ha->waitflag = FALSE;
3311
3312 return;
3313 }
3314 }
3315
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)
3327 {
3328 METHOD_TRACE("ipsintr_done", 2);
3329
3330 if (!scb) {
3331 IPS_PRINTK(KERN_WARNING, ha->pcidev,
3332 "Spurious interrupt; scb NULL.\n");
3333
3334 return;
3335 }
3336
3337 if (scb->scsi_cmd == NULL) {
3338 /* unexpected interrupt */
3339 IPS_PRINTK(KERN_WARNING, ha->pcidev,
3340 "Spurious interrupt; scsi_cmd not set.\n");
3341
3342 return;
3343 }
3344
3345 ips_done(ha, scb);
3346 }
3347
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)
3359 {
3360 int ret;
3361
3362 METHOD_TRACE("ips_done", 1);
3363
3364 if (!scb)
3365 return;
3366
3367 if ((scb->scsi_cmd) && (ips_is_passthru(scb->scsi_cmd))) {
3368 ips_cleanup_passthru(ha, scb);
3369 ha->num_ioctl--;
3370 } else {
3371 /*
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.
3375 */
3376 if ((scb->breakup) || (scb->sg_break)) {
3377 /* we had a data breakup */
3378 scb->data_len = 0;
3379
3380 if (scb->sg_count) {
3381 /* S/G request */
3382 struct scatterlist *sg;
3383 int ips_sg_index = 0;
3384 int sg_dma_index;
3385
3386 sg = scb->scsi_cmd->request_buffer;
3387
3388 /* Spin forward to last dma chunk */
3389 sg_dma_index = scb->breakup;
3390
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]));
3398
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;
3407
3408 }
3409
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));
3422 }
3423
3424 scb->dcdb.transfer_length = scb->data_len;
3425 scb->dcdb.cmd_attribute |=
3426 ips_command_direction[scb->scsi_cmd->cmnd[0]];
3427
3428 if (!(scb->dcdb.cmd_attribute & 0x3))
3429 scb->dcdb.transfer_length = 0;
3430
3431 if (scb->data_len >= IPS_MAX_XFER) {
3432 scb->dcdb.cmd_attribute |= IPS_TRANSFER64K;
3433 scb->dcdb.transfer_length = 0;
3434 }
3435
3436 ret = ips_send_cmd(ha, scb);
3437
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);
3443 }
3444
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);
3451 }
3452
3453 ips_freescb(ha, scb);
3454 break;
3455 default:
3456 break;
3457 } /* end case */
3458
3459 return;
3460 }
3461 } /* end if passthru */
3462
3463 if (scb->bus) {
3464 ha->dcdb_active[scb->bus - 1] &= ~(1 << scb->target_id);
3465 }
3466
3467 scb->scsi_cmd->scsi_done(scb->scsi_cmd);
3468
3469 ips_freescb(ha, scb);
3470 }
3471
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)
3483 {
3484 int errcode;
3485 int device_error;
3486 uint32_t transfer_len;
3487 IPS_DCDB_TABLE_TAPE *tapeDCDB;
3488
3489 METHOD_TRACE("ips_map_status", 1);
3490
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);
3504 }
3505
3506 /* default driver error */
3507 errcode = DID_ERROR;
3508 device_error = 0;
3509
3510 switch (scb->basic_status & IPS_GSC_STATUS_MASK) {
3511 case IPS_CMD_TIMEOUT:
3512 errcode = DID_TIME_OUT;
3513 break;
3514
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;
3521
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;
3527
3528 break;
3529
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;
3539 }
3540
3541 if ((scb->bus) && (transfer_len < scb->data_len)) {
3542 /* Underrun - set default to no error */
3543 errcode = DID_OK;
3544
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;
3553 }
3554 } else
3555 errcode = DID_ERROR;
3556
3557 break;
3558
3559 case IPS_ERR_RECOVERY:
3560 /* don't fail recovered errors */
3561 if (scb->bus)
3562 errcode = DID_OK;
3563
3564 break;
3565
3566 case IPS_ERR_HOST_RESET:
3567 case IPS_ERR_DEV_RESET:
3568 errcode = DID_RESET;
3569 break;
3570
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));
3588 }
3589 device_error = 2; /* check condition */
3590 }
3591
3592 errcode = DID_OK;
3593
3594 break;
3595
3596 default:
3597 errcode = DID_ERROR;
3598 break;
3599
3600 } /* end switch */
3601 } /* end switch */
3602
3603 scb->scsi_cmd->result = device_error | (errcode << 16);
3604
3605 return (1);
3606 }
3607
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)
3621 {
3622 int ret;
3623
3624 METHOD_TRACE("ips_send_wait", 1);
3625
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];
3629 }
3630 scb->callback = ipsintr_blocking;
3631 ret = ips_send_cmd(ha, scb);
3632
3633 if ((ret == IPS_FAILURE) || (ret == IPS_SUCCESS_IMM))
3634 return (ret);
3635
3636 if (intr != IPS_FFDC) /* Don't Wait around if this is a Time Stamp */
3637 ret = ips_wait(ha, timeout, intr);
3638
3639 return (ret);
3640 }
3641
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)
3652 {
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;
3666 }
3667
3668 } else {
3669 unsigned int min_cnt = min(count, scmd->request_bufflen);
3670 memcpy(scmd->request_buffer, data, min_cnt);
3671 }
3672 }
3673
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)
3684 {
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;
3698 }
3699
3700 } else {
3701 unsigned int min_cnt = min(count, scmd->request_bufflen);
3702 memcpy(data, scmd->request_buffer, min_cnt);
3703 }
3704 }
3705
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)
3717 {
3718 int ret;
3719 char *sp;
3720 int device_error;
3721 IPS_DCDB_TABLE_TAPE *tapeDCDB;
3722 int TimeOut;
3723
3724 METHOD_TRACE("ips_send_cmd", 1);
3725
3726 ret = IPS_SUCCESS;
3727
3728 if (!scb->scsi_cmd) {
3729 /* internal command */
3730
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;
3737 }
3738
3739 return (1);
3740 }
3741 } else if ((scb->bus == 0) && (!ips_is_passthru(scb->scsi_cmd))) {
3742 /* command to logical bus -- interpret */
3743 ret = IPS_SUCCESS_IMM;
3744
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;
3753
3754 case START_STOP:
3755 scb->scsi_cmd->result = DID_OK << 16;
3756
3757 case TEST_UNIT_READY:
3758 case INQUIRY:
3759 if (scb->target_id == IPS_ADAPTER_ID) {
3760 /*
3761 * Either we have a TUR
3762 * or we have a SCSI inquiry
3763 */
3764 if (scb->scsi_cmd->cmnd[0] == TEST_UNIT_READY)
3765 scb->scsi_cmd->result = DID_OK << 16;
3766
3767 if (scb->scsi_cmd->cmnd[0] == INQUIRY) {
3768 IPS_SCSI_INQ_DATA inquiry;
3769
3770 memset(&inquiry, 0,
3771 sizeof (IPS_SCSI_INQ_DATA));
3772
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 ",
3787 8);
3788 strncpy(inquiry.ProductId,
3789 "SERVERAID ", 16);
3790 strncpy(inquiry.ProductRevisionLevel,
3791 "1.00", 4);
3792
3793 ips_scmd_buf_write(scb->scsi_cmd,
3794 &inquiry,
3795 sizeof (inquiry));
3796
3797 scb->scsi_cmd->result = DID_OK << 16;
3798 }
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;
3809 }
3810
3811 break;
3812
3813 case REQUEST_SENSE:
3814 ips_reqsen(ha, scb);
3815 scb->scsi_cmd->result = DID_OK << 16;
3816 break;
3817
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);
3836 }
3837
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;
3842
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]));
3855
3856 scb->cmd.basic_io.sector_count =
3857 cpu_to_le16(scb->data_len / IPS_BLKSIZE);
3858
3859 if (le16_to_cpu(scb->cmd.basic_io.sector_count) == 0)
3860 scb->cmd.basic_io.sector_count =
3861 cpu_to_le16(256);
3862
3863 ret = IPS_SUCCESS;
3864 break;
3865
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);
3884 }
3885
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;
3890
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]);
3905
3906 scb->cmd.basic_io.sector_count =
3907 cpu_to_le16(scb->data_len / IPS_BLKSIZE);
3908
3909 if (cpu_to_le16(scb->cmd.basic_io.sector_count) == 0) {
3910 /*
3911 * This is a null condition
3912 * we don't have to do anything
3913 * so just return
3914 */
3915 scb->scsi_cmd->result = DID_OK << 16;
3916 } else
3917 ret = IPS_SUCCESS;
3918
3919 break;
3920
3921 case RESERVE:
3922 case RELEASE:
3923 scb->scsi_cmd->result = DID_OK << 16;
3924 break;
3925
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;
3935
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;
3948
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;
3959
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));
3966
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 */
3972
3973 device_error = 2; /* Indicate Check Condition */
3974 scb->scsi_cmd->result = device_error | (DID_OK << 16);
3975 break;
3976 } /* end switch */
3977 }
3978 /* end if */
3979 if (ret == IPS_SUCCESS_IMM)
3980 return (ret);
3981
3982 /* setup DCDB */
3983 if (scb->bus > 0) {
3984
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);
3990 }
3991
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;
4003
4004 TimeOut = scb->scsi_cmd->timeout_per_command;
4005
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;
4014 }
4015
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 */
4021
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 */
4029 }
4030
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;
4053 }
4054
4055 scb->dcdb.device_address =
4056 ((scb->bus - 1) << 4) | scb->target_id;
4057 scb->dcdb.cmd_attribute |= IPS_DISCONNECT_ALLOWED;
4058
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 */
4066 }
4067
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;
4087 }
4088 }
4089
4090 return ((*ha->func.issue) (ha, scb));
4091 }
4092
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)
4104 {
4105 ips_scb_t *scb;
4106 ips_stat_t *sp;
4107 uint8_t basic_status;
4108 uint8_t ext_status;
4109 int errcode;
4110
4111 METHOD_TRACE("ips_chkstatus", 1);
4112
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;
4117
4118 sp = &ha->sp;
4119 sp->residue_len = 0;
4120 sp->scb_addr = (void *) scb;
4121
4122 /* Remove the item from the active queue */
4123 ips_removeq_scb(&ha->scb_activelist, scb);
4124
4125 if (!scb->scsi_cmd)
4126 /* internal commands are handled in do_ipsintr */
4127 return;
4128
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);
4135
4136 if ((scb->scsi_cmd) && (ips_is_passthru(scb->scsi_cmd)))
4137 /* passthru - just returns the raw result */
4138 return;
4139
4140 errcode = DID_OK;
4141
4142 if (((basic_status & IPS_GSC_STATUS_MASK) == IPS_CMD_SUCCESS) ||
4143 ((basic_status & IPS_GSC_STATUS_MASK) == IPS_CMD_RECOVERED_ERROR)) {
4144
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);
4153 }
4154
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;
4163
4164 case START_STOP:
4165 break;
4166
4167 case TEST_UNIT_READY:
4168 if (!ips_online(ha, scb)) {
4169 errcode = DID_TIME_OUT;
4170 }
4171 break;
4172
4173 case INQUIRY:
4174 if (ips_online(ha, scb)) {
4175 ips_inquiry(ha, scb);
4176 } else {
4177 errcode = DID_TIME_OUT;
4178 }
4179 break;
4180
4181 case REQUEST_SENSE:
4182 ips_reqsen(ha, scb);
4183 break;
4184
4185 case READ_6:
4186 case WRITE_6:
4187 case READ_10:
4188 case WRITE_10:
4189 case RESERVE:
4190 case RELEASE:
4191 break;
4192
4193 case MODE_SENSE:
4194 if (!ips_online(ha, scb)
4195 || !ips_msense(ha, scb)) {
4196 errcode = DID_ERROR;
4197 }
4198 break;
4199
4200 case READ_CAPACITY:
4201 if (ips_online(ha, scb))
4202 ips_rdcap(ha, scb);
4203 else {
4204 errcode = DID_TIME_OUT;
4205 }
4206 break;
4207
4208 case SEND_DIAGNOSTIC:
4209 case REASSIGN_BLOCKS:
4210 break;
4211
4212 case FORMAT_UNIT:
4213 errcode = DID_ERROR;
4214 break;
4215
4216 case SEEK_10:
4217 case VERIFY:
4218 case READ_DEFECT_DATA:
4219 case READ_BUFFER:
4220 case WRITE_BUFFER:
4221 break;
4222
4223 default:
4224 errcode = DID_ERROR;
4225 } /* end switch */
4226
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)) {
4233
4234 scb->scsi_cmd->result = DID_TIME_OUT << 16;
4235 }
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);
4244 }
4245
4246 ips_map_status(ha, scb, sp);
4247 } /* else */
4248 }
4249
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)
4261 {
4262 METHOD_TRACE("ips_online", 1);
4263
4264 if (scb->target_id >= IPS_MAX_LD)
4265 return (0);
4266
4267 if ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1) {
4268 memset(ha->logical_drive_info, 0, sizeof (IPS_LD_INFO));
4269 return (0);
4270 }
4271
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);
4283 }
4284
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)
4296 {
4297 IPS_SCSI_INQ_DATA inquiry;
4298
4299 METHOD_TRACE("ips_inquiry", 1);
4300
4301 memset(&inquiry, 0, sizeof (IPS_SCSI_INQ_DATA));
4302
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);
4314
4315 ips_scmd_buf_write(scb->scsi_cmd, &inquiry, sizeof (inquiry));
4316
4317 return (1);
4318 }
4319
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)
4331 {
4332 IPS_SCSI_CAPACITY cap;
4333
4334 METHOD_TRACE("ips_rdcap", 1);
4335
4336 if (scb->scsi_cmd->bufflen < 8)
4337 return (0);
4338
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);
4344
4345 ips_scmd_buf_write(scb->scsi_cmd, &cap, sizeof (cap));
4346
4347 return (1);
4348 }
4349
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)
4361 {
4362 uint16_t heads;
4363 uint16_t sectors;
4364 uint32_t cylinders;
4365 IPS_SCSI_MODE_PAGE_DATA mdata;
4366
4367 METHOD_TRACE("ips_msense", 1);
4368
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;
4376 }
4377
4378 cylinders =
4379 (le32_to_cpu(ha->enq->ulDriveSize[scb->target_id]) -
4380 1) / (heads * sectors);
4381
4382 memset(&mdata, 0, sizeof (IPS_SCSI_MODE_PAGE_DATA));
4383
4384 mdata.hdr.BlockDescLength = 8;
4385
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;
4403
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;
4431
4432 default:
4433 return (0);
4434 } /* end switch */
4435
4436 ips_scmd_buf_write(scb->scsi_cmd, &mdata, sizeof (mdata));
4437
4438 return (1);
4439 }
4440
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)
4452 {
4453 IPS_SCSI_REQSEN reqsen;
4454
4455 METHOD_TRACE("ips_reqsen", 1);
4456
4457 memset(&reqsen, 0, sizeof (IPS_SCSI_REQSEN));
4458
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;
4464
4465 ips_scmd_buf_write(scb->scsi_cmd, &reqsen, sizeof (reqsen));
4466
4467 return (1);
4468 }
4469
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)
4481 {
4482
4483 METHOD_TRACE("ips_free", 1);
4484
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;
4490 }
4491
4492 if (ha->conf) {
4493 kfree(ha->conf);
4494 ha->conf = NULL;
4495 }
4496
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;
4503 }
4504
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;
4511 }
4512
4513 if (ha->nvram) {
4514 kfree(ha->nvram);
4515 ha->nvram = NULL;
4516 }
4517
4518 if (ha->subsys) {
4519 kfree(ha->subsys);
4520 ha->subsys = NULL;
4521 }
4522
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;
4529 }
4530 ips_deallocatescbs(ha, ha->max_cmds);
4531
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;
4537 }
4538
4539 if (ha->mem_addr)
4540 release_mem_region(ha->mem_addr, ha->mem_len);
4541 ha->mem_addr = 0;
4542
4543 }
4544 }
4545
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)
4557 {
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;
4568 }
4569
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)
4581 {
4582 ips_scb_t *scb_p;
4583 IPS_SG_LIST ips_sg;
4584 int i;
4585 dma_addr_t command_dma, sg_dma;
4586
4587 METHOD_TRACE("ips_allocatescbs", 1);
4588
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;
4604 }
4605
4606 memset(ha->scbs, 0, ha->max_cmds * sizeof (ips_scb_t));
4607
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;
4622 }
4623
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;
4628 }
4629 }
4630
4631 /* success */
4632 return (1);
4633 }
4634
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)
4646 {
4647 IPS_SG_LIST sg_list;
4648 uint32_t cmd_busaddr, sg_busaddr;
4649 METHOD_TRACE("ips_init_scb", 1);
4650
4651 if (scb == NULL)
4652 return;
4653
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));
4660
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;
4666
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;
4671
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));
4676 }
4677
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)
4691 {
4692 ips_scb_t *scb;
4693
4694 METHOD_TRACE("ips_getscb", 1);
4695
4696 if ((scb = ha->scb_freelist) == NULL) {
4697
4698 return (NULL);
4699 }
4700
4701 ha->scb_freelist = scb->q_next;
4702 scb->flags = 0;
4703 scb->q_next = NULL;
4704
4705 ips_init_scb(ha, scb);
4706
4707 return (scb);
4708 }
4709
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)
4723 {
4724
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));
4732
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;
4737 }
4738 }
4739
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)
4751 {
4752 uint8_t scpr;
4753 uint8_t isr;
4754
4755 METHOD_TRACE("ips_isinit_copperhead", 1);
4756
4757 isr = inb(ha->io_addr + IPS_REG_HISR);
4758 scpr = inb(ha->io_addr + IPS_REG_SCPR);
4759
4760 if (((isr & IPS_BIT_EI) == 0) && ((scpr & IPS_BIT_EBM) == 0))
4761 return (0);
4762 else
4763 return (1);
4764 }
4765
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)
4777 {
4778 uint8_t isr = 0;
4779 uint8_t scpr;
4780
4781 METHOD_TRACE("ips_is_init_copperhead_memio", 1);
4782
4783 isr = readb(ha->mem_ptr + IPS_REG_HISR);
4784 scpr = readb(ha->mem_ptr + IPS_REG_SCPR);
4785
4786 if (((isr & IPS_BIT_EI) == 0) && ((scpr & IPS_BIT_EBM) == 0))
4787 return (0);
4788 else
4789 return (1);
4790 }
4791
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)
4803 {
4804 uint32_t post;
4805 uint32_t bits;
4806
4807 METHOD_TRACE("ips_is_init_morpheus", 1);
4808
4809 post = readl(ha->mem_ptr + IPS_REG_I960_MSG0);
4810 bits = readl(ha->mem_ptr + IPS_REG_I2O_HIR);
4811
4812 if (post == 0)
4813 return (0);
4814 else if (bits & 0x3)
4815 return (0);
4816 else
4817 return (1);
4818 }
4819
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)
4830 {
4831 METHOD_TRACE("ips_enable_int_copperhead", 1);
4832
4833 outb(ha->io_addr + IPS_REG_HISR, IPS_BIT_EI);
4834 inb(ha->io_addr + IPS_REG_HISR); /*Ensure PCI Posting Completes*/
4835 }
4836
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)
4847 {
4848 METHOD_TRACE("ips_enable_int_copperhead_memio", 1);
4849
4850 writeb(IPS_BIT_EI, ha->mem_ptr + IPS_REG_HISR);
4851 readb(ha->mem_ptr + IPS_REG_HISR); /*Ensure PCI Posting Completes*/
4852 }
4853
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)
4864 {
4865 uint32_t Oimr;
4866
4867 METHOD_TRACE("ips_enable_int_morpheus", 1);
4868
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*/
4873 }
4874
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)
4886 {
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;
4892
4893 METHOD_TRACE("ips_init_copperhead", 1);
4894
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;
4900
4901 /* Delay for 1 Second */
4902 MDELAY(IPS_ONE_SEC);
4903 }
4904
4905 if (j >= 45)
4906 /* error occurred */
4907 return (0);
4908
4909 PostByte[i] = inb(ha->io_addr + IPS_REG_ISPR);
4910 outb(Isr, ha->io_addr + IPS_REG_HISR);
4911 }
4912
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]);
4917
4918 return (0);
4919 }
4920
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;
4926
4927 /* Delay for 1 Second */
4928 MDELAY(IPS_ONE_SEC);
4929 }
4930
4931 if (j >= 240)
4932 /* error occurred */
4933 return (0);
4934
4935 ConfigByte[i] = inb(ha->io_addr + IPS_REG_ISPR);
4936 outb(Isr, ha->io_addr + IPS_REG_HISR);
4937 }
4938
4939 for (i = 0; i < 240; i++) {
4940 Cbsp = inb(ha->io_addr + IPS_REG_CBSP);
4941
4942 if ((Cbsp & IPS_BIT_OP) == 0)
4943 break;
4944
4945 /* Delay for 1 Second */
4946 MDELAY(IPS_ONE_SEC);
4947 }
4948
4949 if (i >= 240)
4950 /* reset failed */
4951 return (0);
4952
4953 /* setup CCCR */
4954 outl(cpu_to_le32(0x1010), ha->io_addr + IPS_REG_CCCR);
4955
4956 /* Enable busmastering */
4957 outb(IPS_BIT_EBM, ha->io_addr + IPS_REG_SCPR);
4958
4959 if (ha->revision_id == IPS_REVID_TROMBONE64)
4960 /* fix for anaconda64 */
4961 outl(0, ha->io_addr + IPS_REG_NDAE);
4962
4963 /* Enable interrupts */
4964 outb(IPS_BIT_EI, ha->io_addr + IPS_REG_HISR);
4965
4966 return (1);
4967 }
4968
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)
4980 {
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;
4986
4987 METHOD_TRACE("ips_init_copperhead_memio", 1);
4988
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;
4994
4995 /* Delay for 1 Second */
4996 MDELAY(IPS_ONE_SEC);
4997 }
4998
4999 if (j >= 45)
5000 /* error occurred */
5001 return (0);
5002
5003 PostByte[i] = readb(ha->mem_ptr + IPS_REG_ISPR);
5004 writeb(Isr, ha->mem_ptr + IPS_REG_HISR);
5005 }
5006
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]);
5011
5012 return (0);
5013 }
5014
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;
5020
5021 /* Delay for 1 Second */
5022 MDELAY(IPS_ONE_SEC);
5023 }
5024
5025 if (j >= 240)
5026 /* error occurred */
5027 return (0);
5028
5029 ConfigByte[i] = readb(ha->mem_ptr + IPS_REG_ISPR);
5030 writeb(Isr, ha->mem_ptr + IPS_REG_HISR);
5031 }
5032
5033 for (i = 0; i < 240; i++) {
5034 Cbsp = readb(ha->mem_ptr + IPS_REG_CBSP);
5035
5036 if ((Cbsp & IPS_BIT_OP) == 0)
5037 break;
5038
5039 /* Delay for 1 Second */
5040 MDELAY(IPS_ONE_SEC);
5041 }
5042
5043 if (i >= 240)
5044 /* error occurred */
5045 return (0);
5046
5047 /* setup CCCR */
5048 writel(0x1010, ha->mem_ptr + IPS_REG_CCCR);
5049
5050 /* Enable busmastering */
5051 writeb(IPS_BIT_EBM, ha->mem_ptr + IPS_REG_SCPR);
5052
5053 if (ha->revision_id == IPS_REVID_TROMBONE64)
5054 /* fix for anaconda64 */
5055 writel(0, ha->mem_ptr + IPS_REG_NDAE);
5056
5057 /* Enable interrupts */
5058 writeb(IPS_BIT_EI, ha->mem_ptr + IPS_REG_HISR);
5059
5060 /* if we get here then everything went OK */
5061 return (1);
5062 }
5063
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)
5075 {
5076 uint32_t Post;
5077 uint32_t Config;
5078 uint32_t Isr;
5079 uint32_t Oimr;
5080 int i;
5081
5082 METHOD_TRACE("ips_init_morpheus", 1);
5083
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);
5087
5088 if (Isr & IPS_BIT_I960_MSG0I)
5089 break;
5090
5091 /* Delay for 1 Second */
5092 MDELAY(IPS_ONE_SEC);
5093 }
5094
5095 if (i >= 45) {
5096 /* error occurred */
5097 IPS_PRINTK(KERN_WARNING, ha->pcidev,
5098 "timeout waiting for post.\n");
5099
5100 return (0);
5101 }
5102
5103 Post = readl(ha->mem_ptr + IPS_REG_I960_MSG0);
5104
5105 if (Post == 0x4F00) { /* If Flashing the Battery PIC */
5106 IPS_PRINTK(KERN_WARNING, ha->pcidev,
5107 "Flashing Battery PIC, Please wait ...\n");
5108
5109 /* Clear the interrupt bit */
5110 Isr = (uint32_t) IPS_BIT_I960_MSG0I;
5111 writel(Isr, ha->mem_ptr + IPS_REG_I2O_HIR);
5112
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);
5119 }
5120
5121 if (i >= 120) {
5122 IPS_PRINTK(KERN_WARNING, ha->pcidev,
5123 "timeout waiting for Battery PIC Flash\n");
5124 return (0);
5125 }
5126
5127 }
5128
5129 /* Clear the interrupt bit */
5130 Isr = (uint32_t) IPS_BIT_I960_MSG0I;
5131 writel(Isr, ha->mem_ptr + IPS_REG_I2O_HIR);
5132
5133 if (Post < (IPS_GOOD_POST_STATUS << 8)) {
5134 IPS_PRINTK(KERN_WARNING, ha->pcidev,
5135 "reset controller fails (post status %x).\n", Post);
5136
5137 return (0);
5138 }
5139
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);
5143
5144 if (Isr & IPS_BIT_I960_MSG1I)
5145 break;
5146
5147 /* Delay for 1 Second */
5148 MDELAY(IPS_ONE_SEC);
5149 }
5150
5151 if (i >= 240) {
5152 /* error occurred */
5153 IPS_PRINTK(KERN_WARNING, ha->pcidev,
5154 "timeout waiting for config.\n");
5155
5156 return (0);
5157 }
5158
5159 Config = readl(ha->mem_ptr + IPS_REG_I960_MSG1);
5160
5161 /* Clear interrupt bit */
5162 Isr = (uint32_t) IPS_BIT_I960_MSG1I;
5163 writel(Isr, ha->mem_ptr + IPS_REG_I2O_HIR);
5164
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);
5169
5170 /* if we get here then everything went OK */
5171
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;
5176 }
5177
5178 return (1);
5179 }
5180
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)
5192 {
5193 int reset_counter;
5194
5195 METHOD_TRACE("ips_reset_copperhead", 1);
5196
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);
5199
5200 reset_counter = 0;
5201
5202 while (reset_counter < 2) {
5203 reset_counter++;
5204
5205 outb(IPS_BIT_RST, ha->io_addr + IPS_REG_SCPR);
5206
5207 /* Delay for 1 Second */
5208 MDELAY(IPS_ONE_SEC);
5209
5210 outb(0, ha->io_addr + IPS_REG_SCPR);
5211
5212 /* Delay for 1 Second */
5213 MDELAY(IPS_ONE_SEC);
5214
5215 if ((*ha->func.init) (ha))
5216 break;
5217 else if (reset_counter >= 2) {
5218
5219 return (0);
5220 }
5221 }
5222
5223 return (1);
5224 }
5225
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)
5237 {
5238 int reset_counter;
5239
5240 METHOD_TRACE("ips_reset_copperhead_memio", 1);
5241
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);
5244
5245 reset_counter = 0;
5246
5247 while (reset_counter < 2) {
5248 reset_counter++;
5249
5250 writeb(IPS_BIT_RST, ha->mem_ptr + IPS_REG_SCPR);
5251
5252 /* Delay for 1 Second */
5253 MDELAY(IPS_ONE_SEC);
5254
5255 writeb(0, ha->mem_ptr + IPS_REG_SCPR);
5256
5257 /* Delay for 1 Second */
5258 MDELAY(IPS_ONE_SEC);
5259
5260 if ((*ha->func.init) (ha))
5261 break;
5262 else if (reset_counter >= 2) {
5263
5264 return (0);
5265 }
5266 }
5267
5268 return (1);
5269 }
5270
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)
5282 {
5283 int reset_counter;
5284 uint8_t junk;
5285
5286 METHOD_TRACE("ips_reset_morpheus", 1);
5287
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);
5290
5291 reset_counter = 0;
5292
5293 while (reset_counter < 2) {
5294 reset_counter++;
5295
5296 writel(0x80000000, ha->mem_ptr + IPS_REG_I960_IDR);
5297
5298 /* Delay for 5 Seconds */
5299 MDELAY(5 * IPS_ONE_SEC);
5300
5301 /* Do a PCI config read to wait for adapter */
5302 pci_read_config_byte(ha->pcidev, 4, &junk);
5303
5304 if ((*ha->func.init) (ha))
5305 break;
5306 else if (reset_counter >= 2) {
5307
5308 return (0);
5309 }
5310 }
5311
5312 return (1);
5313 }
5314
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)
5326 {
5327 uint32_t phys_status_start;
5328
5329 METHOD_TRACE("ips_statinit", 1);
5330
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;
5334
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);
5342
5343 ha->adapt->hw_status_tail = phys_status_start;
5344 }
5345
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)
5357 {
5358 uint32_t phys_status_start;
5359
5360 METHOD_TRACE("ips_statinit_memio", 1);
5361
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;
5365
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);
5372
5373 ha->adapt->hw_status_tail = phys_status_start;
5374 }
5375
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)
5387 {
5388 METHOD_TRACE("ips_statupd_copperhead", 1);
5389
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;
5396 }
5397
5398 outl(cpu_to_le32(ha->adapt->hw_status_tail),
5399 ha->io_addr + IPS_REG_SQTR);
5400
5401 return (ha->adapt->p_status_tail->value);
5402 }
5403
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)
5415 {
5416 METHOD_TRACE("ips_statupd_copperhead_memio", 1);
5417
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;
5424 }
5425
5426 writel(ha->adapt->hw_status_tail, ha->mem_ptr + IPS_REG_SQTR);
5427
5428 return (ha->adapt->p_status_tail->value);
5429 }
5430
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)
5442 {
5443 uint32_t val;
5444
5445 METHOD_TRACE("ips_statupd_morpheus", 1);
5446
5447 val = readl(ha->mem_ptr + IPS_REG_I2O_OUTMSGQ);
5448
5449 return (val);
5450 }
5451
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)
5463 {
5464 uint32_t TimeOut;
5465 uint32_t val;
5466
5467 METHOD_TRACE("ips_issue_copperhead", 1);
5468
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);
5479 }
5480
5481 TimeOut = 0;
5482
5483 while ((val =
5484 le32_to_cpu(inl(ha->io_addr + IPS_REG_CCCR))) & IPS_BIT_SEM) {
5485 udelay(1000);
5486
5487 if (++TimeOut >= IPS_SEM_TIMEOUT) {
5488 if (!(val & IPS_BIT_START_STOP))
5489 break;
5490
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");
5495
5496 return (IPS_FAILURE);
5497 } /* end if */
5498 } /* end while */
5499
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);
5502
5503 return (IPS_SUCCESS);
5504 }
5505
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)
5517 {
5518 uint32_t TimeOut;
5519 uint32_t val;
5520
5521 METHOD_TRACE("ips_issue_copperhead_memio", 1);
5522
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);
5533 }
5534
5535 TimeOut = 0;
5536
5537 while ((val = readl(ha->mem_ptr + IPS_REG_CCCR)) & IPS_BIT_SEM) {
5538 udelay(1000);
5539
5540 if (++TimeOut >= IPS_SEM_TIMEOUT) {
5541 if (!(val & IPS_BIT_START_STOP))
5542 break;
5543
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");
5548
5549 return (IPS_FAILURE);
5550 } /* end if */
5551 } /* end while */
5552
5553 writel(scb->scb_busaddr, ha->mem_ptr + IPS_REG_CCSAR);
5554 writel(IPS_BIT_START_CMD, ha->mem_ptr + IPS_REG_CCCR);
5555
5556 return (IPS_SUCCESS);
5557 }
5558
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)
5570 {
5571
5572 METHOD_TRACE("ips_issue_i2o", 1);
5573
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);
5584 }
5585
5586 outl(cpu_to_le32(scb->scb_busaddr), ha->io_addr + IPS_REG_I2O_INMSGQ);
5587
5588 return (IPS_SUCCESS);
5589 }
5590
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)
5602 {
5603
5604 METHOD_TRACE("ips_issue_i2o_memio", 1);
5605
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);
5616 }
5617
5618 writel(scb->scb_busaddr, ha->mem_ptr + IPS_REG_I2O_INMSGQ);
5619
5620 return (IPS_SUCCESS);
5621 }
5622
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)
5634 {
5635 uint8_t Isr;
5636
5637 METHOD_TRACE("ips_isintr_copperhead", 2);
5638
5639 Isr = inb(ha->io_addr + IPS_REG_HISR);
5640
5641 if (Isr == 0xFF)
5642 /* ?!?! Nothing really there */
5643 return (0);
5644
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);
5651 }
5652
5653 return (0);
5654 }
5655
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)
5667 {
5668 uint8_t Isr;
5669
5670 METHOD_TRACE("ips_isintr_memio", 2);
5671
5672 Isr = readb(ha->mem_ptr + IPS_REG_HISR);
5673
5674 if (Isr == 0xFF)
5675 /* ?!?! Nothing really there */
5676 return (0);
5677
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);
5684 }
5685
5686 return (0);
5687 }
5688
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)
5700 {
5701 uint32_t Isr;
5702
5703 METHOD_TRACE("ips_isintr_morpheus", 2);
5704
5705 Isr = readl(ha->mem_ptr + IPS_REG_I2O_HIR);
5706
5707 if (Isr & IPS_BIT_I2O_OPQI)
5708 return (1);
5709 else
5710 return (0);
5711 }
5712
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)
5724 {
5725 int ret;
5726 int done;
5727
5728 METHOD_TRACE("ips_wait", 1);
5729
5730 ret = IPS_FAILURE;
5731 done = FALSE;
5732
5733 time *= IPS_ONE_SEC; /* convert seconds */
5734
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;
5741 }
5742 } else if (intr == IPS_INTR_IORL) {
5743 if (ha->waitflag == FALSE) {
5744 /*
5745 * controller generated an interrupt to
5746 * acknowledge completion of the command
5747 * and ips_intr() has serviced the interrupt.
5748 */
5749 ret = IPS_SUCCESS;
5750 done = TRUE;
5751 break;
5752 }
5753
5754 /*
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.
5758 */
5759
5760 (*ha->func.intr) (ha);
5761 }
5762
5763 /* This looks like a very evil loop, but it only does this during start-up */
5764 udelay(1000);
5765 time--;
5766 }
5767
5768 return (ret);
5769 }
5770
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)
5782 {
5783 METHOD_TRACE("ips_write_driver_status", 1);
5784
5785 if (!ips_readwrite_page5(ha, FALSE, intr)) {
5786 IPS_PRINTK(KERN_WARNING, ha->pcidev,
5787 "unable to read NVRAM page 5.\n");
5788
5789 return (0);
5790 }
5791
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;
5799 }
5800
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]);
5809
5810 ips_get_bios_version(ha, intr);
5811
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);
5819
5820 ips_version_check(ha, intr); /* Check BIOS/FW/Driver Versions */
5821
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");
5826
5827 return (0);
5828 }
5829
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;
5832
5833 return (1);
5834 }
5835
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)
5847 {
5848 ips_scb_t *scb;
5849 int ret;
5850
5851 METHOD_TRACE("ips_read_adapter_status", 1);
5852
5853 scb = &ha->scbs[ha->max_cmds - 1];
5854
5855 ips_init_scb(ha, scb);
5856
5857 scb->timeout = ips_cmd_timeout;
5858 scb->cdb[0] = IPS_CMD_ENQUIRY;
5859
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;
5868
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);
5875
5876 return (1);
5877 }
5878
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)
5890 {
5891 ips_scb_t *scb;
5892 int ret;
5893
5894 METHOD_TRACE("ips_read_subsystem_parameters", 1);
5895
5896 scb = &ha->scbs[ha->max_cmds - 1];
5897
5898 ips_init_scb(ha, scb);
5899
5900 scb->timeout = ips_cmd_timeout;
5901 scb->cdb[0] = IPS_CMD_GET_SUBSYS;
5902
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;
5911
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);
5918
5919 memcpy(ha->subsys, ha->ioctl_data, sizeof(*ha->subsys));
5920 return (1);
5921 }
5922
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)
5934 {
5935 ips_scb_t *scb;
5936 int i;
5937 int ret;
5938
5939 METHOD_TRACE("ips_read_config", 1);
5940
5941 /* set defaults for initiator IDs */
5942 for (i = 0; i < 4; i++)
5943 ha->conf->init_id[i] = 7;
5944
5945 scb = &ha->scbs[ha->max_cmds - 1];
5946
5947 ips_init_scb(ha, scb);
5948
5949 scb->timeout = ips_cmd_timeout;
5950 scb->cdb[0] = IPS_CMD_READ_CONF;
5951
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;
5956
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)) {
5962
5963 memset(ha->conf, 0, sizeof (IPS_CONF));
5964
5965 /* reset initiator IDs */
5966 for (i = 0; i < 4; i++)
5967 ha->conf->init_id[i] = 7;
5968
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);
5973
5974 return (0);
5975 }
5976
5977 memcpy(ha->conf, ha->ioctl_data, sizeof(*ha->conf));
5978 return (1);
5979 }
5980
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)
5992 {
5993 ips_scb_t *scb;
5994 int ret;
5995
5996 METHOD_TRACE("ips_readwrite_page5", 1);
5997
5998 scb = &ha->scbs[ha->max_cmds - 1];
5999
6000 ips_init_scb(ha, scb);
6001
6002 scb->timeout = ips_cmd_timeout;
6003 scb->cdb[0] = IPS_CMD_RW_NVRAM_PAGE;
6004
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));
6015
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)) {
6021
6022 memset(ha->nvram, 0, sizeof (IPS_NVRAM_P5));
6023
6024 return (0);
6025 }
6026 if (!write)
6027 memcpy(ha->nvram, ha->ioctl_data, sizeof(*ha->nvram));
6028 return (1);
6029 }
6030
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)
6042 {
6043 ips_scb_t *scb;
6044 int ret;
6045
6046 METHOD_TRACE("ips_clear_adapter", 1);
6047
6048 scb = &ha->scbs[ha->max_cmds - 1];
6049
6050 ips_init_scb(ha, scb);
6051
6052 scb->timeout = ips_reset_timeout;
6053 scb->cdb[0] = IPS_CMD_CONFIG_SYNC;
6054
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;
6062
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);
6069
6070 /* send unlock stripe command */
6071 ips_init_scb(ha, scb);
6072
6073 scb->cdb[0] = IPS_CMD_ERROR_TABLE;
6074 scb->timeout = ips_reset_timeout;
6075
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;
6083
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);
6090
6091 return (1);
6092 }
6093
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)
6105 {
6106 ips_scb_t *scb;
6107
6108 METHOD_TRACE("ips_ffdc_reset", 1);
6109
6110 scb = &ha->scbs[ha->max_cmds - 1];
6111
6112 ips_init_scb(ha, scb);
6113
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;
6120
6121 /* convert time to what the card wants */
6122 ips_fix_ffdc_time(ha, scb, ha->last_ffdc);
6123
6124 /* issue command */
6125 ips_send_wait(ha, scb, ips_cmd_timeout, intr);
6126 }
6127
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)
6139 {
6140 ips_scb_t *scb;
6141
6142 METHOD_TRACE("ips_ffdc_time", 1);
6143
6144 DEBUG_VAR(1, "(%s%d) Sending time update.", ips_name, ha->host_num);
6145
6146 scb = &ha->scbs[ha->max_cmds - 1];
6147
6148 ips_init_scb(ha, scb);
6149
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;
6156
6157 /* convert time to what the card wants */
6158 ips_fix_ffdc_time(ha, scb, ha->last_ffdc);
6159
6160 /* issue command */
6161 ips_send_wait(ha, scb, ips_cmd_timeout, IPS_FFDC);
6162 }
6163
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)
6174 {
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}
6193 };
6194
6195 METHOD_TRACE("ips_fix_ffdc_time", 1);
6196
6197 days = current_time / IPS_SECS_DAY;
6198 rem = current_time % IPS_SECS_DAY;
6199
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);
6204
6205 year = IPS_EPOCH_YEAR;
6206 while (days < 0 || days >= year_lengths[yleap = IPS_IS_LEAP_YEAR(year)]) {
6207 int newy;
6208
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;
6216 }
6217
6218 scb->cmd.ffdc.yearH = year / 100;
6219 scb->cmd.ffdc.yearL = year % 100;
6220
6221 for (i = 0; days >= month_lengths[i][yleap]; ++i)
6222 days -= month_lengths[i][yleap];
6223
6224 scb->cmd.ffdc.month = i + 1;
6225 scb->cmd.ffdc.day = days + 1;
6226 }
6227
6228 /****************************************************************************
6229 * BIOS Flash Routines *
6230 ****************************************************************************/
6231
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)
6242 {
6243 int timeout;
6244 uint8_t status = 0;
6245
6246 METHOD_TRACE("ips_erase_bios", 1);
6247
6248 status = 0;
6249
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 */
6254
6255 outb(0x50, ha->io_addr + IPS_REG_FLDP);
6256 if (ha->revision_id == IPS_REVID_TROMBONE64)
6257 udelay(25); /* 25 us */
6258
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 */
6263
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 */
6268
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 */
6273
6274 timeout = 80000; /* 80 seconds */
6275
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 */
6280 }
6281
6282 status = inb(ha->io_addr + IPS_REG_FLDP);
6283
6284 if (status & 0x80)
6285 break;
6286
6287 MDELAY(1);
6288 timeout--;
6289 }
6290
6291 /* check for timeout */
6292 if (timeout <= 0) {
6293 /* timeout */
6294
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 */
6299
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 */
6306 }
6307
6308 status = inb(ha->io_addr + IPS_REG_FLDP);
6309
6310 if (status & 0xC0)
6311 break;
6312
6313 MDELAY(1);
6314 timeout--;
6315 }
6316
6317 return (1);
6318 }
6319
6320 /* check for valid VPP */
6321 if (status & 0x08)
6322 /* VPP failure */
6323 return (1);
6324
6325 /* check for succesful flash */
6326 if (status & 0x30)
6327 /* sequence error */
6328 return (1);
6329
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 */
6335
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 */
6340
6341 return (0);
6342 }
6343
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)
6354 {
6355 int timeout;
6356 uint8_t status;
6357
6358 METHOD_TRACE("ips_erase_bios_memio", 1);
6359
6360 status = 0;
6361
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 */
6366
6367 writeb(0x50, ha->mem_ptr + IPS_REG_FLDP);
6368 if (ha->revision_id == IPS_REVID_TROMBONE64)
6369 udelay(25); /* 25 us */
6370
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 */
6375
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 */
6380
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 */
6385
6386 timeout = 80000; /* 80 seconds */
6387
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 */
6392 }
6393
6394 status = readb(ha->mem_ptr + IPS_REG_FLDP);
6395
6396 if (status & 0x80)
6397 break;
6398
6399 MDELAY(1);
6400 timeout--;
6401 }
6402
6403 /* check for timeout */
6404 if (timeout <= 0) {
6405 /* timeout */
6406
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 */
6411
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 */
6418 }
6419
6420 status = readb(ha->mem_ptr + IPS_REG_FLDP);
6421
6422 if (status & 0xC0)
6423 break;
6424
6425 MDELAY(1);
6426 timeout--;
6427 }
6428
6429 return (1);
6430 }
6431
6432 /* check for valid VPP */
6433 if (status & 0x08)
6434 /* VPP failure */
6435 return (1);
6436
6437 /* check for succesful flash */
6438 if (status & 0x30)
6439 /* sequence error */
6440 return (1);
6441
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 */
6447
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 */
6452
6453 return (0);
6454 }
6455
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)
6467 {
6468 int i;
6469 int timeout;
6470 uint8_t status = 0;
6471
6472 METHOD_TRACE("ips_program_bios", 1);
6473
6474 status = 0;
6475
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 */
6481
6482 outb(0x40, ha->io_addr + IPS_REG_FLDP);
6483 if (ha->revision_id == IPS_REVID_TROMBONE64)
6484 udelay(25); /* 25 us */
6485
6486 outb(buffer[i], ha->io_addr + IPS_REG_FLDP);
6487 if (ha->revision_id == IPS_REVID_TROMBONE64)
6488 udelay(25); /* 25 us */
6489
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 */
6496 }
6497
6498 status = inb(ha->io_addr + IPS_REG_FLDP);
6499
6500 if (status & 0x80)
6501 break;
6502
6503 MDELAY(1);
6504 timeout--;
6505 }
6506
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 */
6512
6513 outb(0xFF, ha->io_addr + IPS_REG_FLDP);
6514 if (ha->revision_id == IPS_REVID_TROMBONE64)
6515 udelay(25); /* 25 us */
6516
6517 return (1);
6518 }
6519
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 */
6526
6527 outb(0xFF, ha->io_addr + IPS_REG_FLDP);
6528 if (ha->revision_id == IPS_REVID_TROMBONE64)
6529 udelay(25); /* 25 us */
6530
6531 return (1);
6532 }
6533 } /* end for */
6534
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 */
6539
6540 outb(0xFF, ha->io_addr + IPS_REG_FLDP);
6541 if (ha->revision_id == IPS_REVID_TROMBONE64)
6542 udelay(25); /* 25 us */
6543
6544 return (0);
6545 }
6546
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)
6558 {
6559 int i;
6560 int timeout;
6561 uint8_t status = 0;
6562
6563 METHOD_TRACE("ips_program_bios_memio", 1);
6564
6565 status = 0;
6566
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 */
6572
6573 writeb(0x40, ha->mem_ptr + IPS_REG_FLDP);
6574 if (ha->revision_id == IPS_REVID_TROMBONE64)
6575 udelay(25); /* 25 us */
6576
6577 writeb(buffer[i], ha->mem_ptr + IPS_REG_FLDP);
6578 if (ha->revision_id == IPS_REVID_TROMBONE64)
6579 udelay(25); /* 25 us */
6580
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 */
6587 }
6588
6589 status = readb(ha->mem_ptr + IPS_REG_FLDP);
6590
6591 if (status & 0x80)
6592 break;
6593
6594 MDELAY(1);
6595 timeout--;
6596 }
6597
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 */
6603
6604 writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP);
6605 if (ha->revision_id == IPS_REVID_TROMBONE64)
6606 udelay(25); /* 25 us */
6607
6608 return (1);
6609 }
6610
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 */
6617
6618 writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP);
6619 if (ha->revision_id == IPS_REVID_TROMBONE64)
6620 udelay(25); /* 25 us */
6621
6622 return (1);
6623 }
6624 } /* end for */
6625
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 */
6630
6631 writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP);
6632 if (ha->revision_id == IPS_REVID_TROMBONE64)
6633 udelay(25); /* 25 us */
6634
6635 return (0);
6636 }
6637
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)
6649 {
6650 uint8_t checksum;
6651 int i;
6652
6653 METHOD_TRACE("ips_verify_bios", 1);
6654
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 */
6659
6660 if (inb(ha->io_addr + IPS_REG_FLDP) != 0x55)
6661 return (1);
6662
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);
6668
6669 checksum = 0xff;
6670 for (i = 2; i < buffersize; i++) {
6671
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 */
6675
6676 checksum = (uint8_t) checksum + inb(ha->io_addr + IPS_REG_FLDP);
6677 }
6678
6679 if (checksum != 0)
6680 /* failure */
6681 return (1);
6682 else
6683 /* success */
6684 return (0);
6685 }
6686
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)
6698 {
6699 uint8_t checksum;
6700 int i;
6701
6702 METHOD_TRACE("ips_verify_bios_memio", 1);
6703
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 */
6708
6709 if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0x55)
6710 return (1);
6711
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);
6717
6718 checksum = 0xff;
6719 for (i = 2; i < buffersize; i++) {
6720
6721 writel(i + offset, ha->mem_ptr + IPS_REG_FLAP);
6722 if (ha->revision_id == IPS_REVID_TROMBONE64)
6723 udelay(25); /* 25 us */
6724
6725 checksum =
6726 (uint8_t) checksum + readb(ha->mem_ptr + IPS_REG_FLDP);
6727 }
6728
6729 if (checksum != 0)
6730 /* failure */
6731 return (1);
6732 else
6733 /* success */
6734 return (0);
6735 }
6736
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)
6749 {
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];
6757
6758 METHOD_TRACE("ips_version_check", 1);
6759
6760 VersionInfo = ( IPS_VERSION_DATA * ) ha->ioctl_data;
6761
6762 memset(FirmwareVersion, 0, IPS_COMPAT_ID_LENGTH + 1);
6763 memset(BiosVersion, 0, IPS_COMPAT_ID_LENGTH + 1);
6764
6765 /* Get the Compatible BIOS Version from NVRAM Page 5 */
6766 memcpy(BiosVersion, ha->nvram->BiosCompatibilityID,
6767 IPS_COMPAT_ID_LENGTH);
6768
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);
6777 }
6778
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);
6783 }
6784
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 ]); */
6789
6790 MatchError = 0;
6791
6792 if (strncmp
6793 (FirmwareVersion, Compatable[ha->nvram->adapter_type],
6794 IPS_COMPAT_ID_LENGTH) != 0)
6795 MatchError = 1;
6796
6797 if (strncmp(BiosVersion, IPS_COMPAT_BIOS, IPS_COMPAT_ID_LENGTH) != 0)
6798 MatchError = 1;
6799
6800 ha->nvram->versioning = 1; /* Indicate the Driver Supports Versioning */
6801
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;
6808
6809 strncpy(&FirmwareString[0], ha->enq->CodeBlkVersion, 8);
6810 FirmwareString[8] = 0;
6811
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");
6820 }
6821 } else {
6822 ha->nvram->version_mismatch = 0;
6823 }
6824
6825 return;
6826 }
6827
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)
6839 {
6840 ips_scb_t *scb;
6841 int rc;
6842
6843 METHOD_TRACE("ips_get_version_info", 1);
6844
6845 scb = &ha->scbs[ha->max_cmds - 1];
6846
6847 ips_init_scb(ha, scb);
6848
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;
6860
6861 /* issue command */
6862 rc = ips_send_wait(ha, scb, ips_cmd_timeout, intr);
6863 return (rc);
6864 }
6865
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)
6875 {
6876 ha->active = 0;
6877 ips_free(ha);
6878 ips_ha[index] = NULL;
6879 ips_sh[index] = NULL;
6880 return -1;
6881 }
6882
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)
6892 {
6893 ips_ha_t *ha_sav = ips_ha[highindex];
6894 struct Scsi_Host *sh_sav = ips_sh[highindex];
6895 int i;
6896
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;
6901 }
6902 ha_sav->host_num = lowindex;
6903 ips_ha[lowindex] = ha_sav;
6904 ips_sh[lowindex] = sh_sav;
6905 }
6906
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)
6916 {
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;
6922
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,
6931 j);
6932 position++;
6933 }
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,
6941 j);
6942 position++;
6943 }
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,
6951 j);
6952 position++;
6953 }
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,
6964 j);
6965 position++;
6966 }
6967 break;
6968 default:
6969 break;
6970 }
6971 }
6972 }
6973 /* if adapter_order[0], then ordering is complete */
6974 return;
6975 }
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;
6984 }
6985 }
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++;
6996 }
6997 }
6998
6999 return;
7000 }
7001
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)
7011 {
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;
7019 }
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;
7029 }
7030
7031 kfree(oldha);
7032 ips_sh[index] = sh;
7033 ips_ha[index] = ha;
7034 IPS_SCSI_SET_DEVICE(sh, ha);
7035
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;
7046
7047 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,7)
7048 sh->max_sectors = 128;
7049 #endif
7050
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;
7055
7056 IPS_ADD_HOST(sh, NULL);
7057 return 0;
7058 }
7059
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)
7068 {
7069 int i;
7070 struct Scsi_Host *sh;
7071 ips_ha_t *ha;
7072
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);
7080 }
7081 }
7082 }
7083 }
7084
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)
7094 {
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;
7102 }
7103 register_reboot_notifier(&ips_notifier);
7104 return 0;
7105 }
7106
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)
7116 {
7117 IPS_UNREGISTER_HOSTS(&ips_driver_template);
7118 pci_unregister_driver(&ips_pci_driver);
7119 unregister_reboot_notifier(&ips_notifier);
7120 }
7121
7122 module_init(ips_module_init);
7123 module_exit(ips_module_exit);
7124
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)
7136 {
7137 int index;
7138 int rc;
7139
7140 METHOD_TRACE("ips_insert_device", 1);
7141 if (pci_enable_device(pci_dev))
7142 return -1;
7143
7144 rc = ips_init_phase1(pci_dev, &index);
7145 if (rc == SUCCESS)
7146 rc = ips_init_phase2(index);
7147
7148 if (ips_hotplug)
7149 if (ips_register_scsi(index)) {
7150 ips_free(ips_ha[index]);
7151 rc = -1;
7152 }
7153
7154 if (rc == SUCCESS)
7155 ips_num_controllers++;
7156
7157 ips_next_controller = ips_num_controllers;
7158 return rc;
7159 }
7160
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)
7172 {
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;
7189
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;
7196 }
7197 }
7198
7199 if (index >= IPS_MAX_ADAPTERS)
7200 return -1;
7201
7202 /* stuff that we get in dev */
7203 irq = pci_dev->irq;
7204 bus = pci_dev->bus->number;
7205 func = pci_dev->devfn;
7206
7207 /* Init MEM/IO addresses to 0 */
7208 mem_addr = 0;
7209 io_addr = 0;
7210 mem_len = 0;
7211 io_len = 0;
7212
7213 for (j = 0; j < 2; j++) {
7214 if (!pci_resource_start(pci_dev, j))
7215 break;
7216
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);
7223 }
7224 }
7225
7226 /* setup memory mapped area (if applicable) */
7227 if (mem_addr) {
7228 uint32_t base;
7229 uint32_t offs;
7230
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;
7236 }
7237
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;
7245 }
7246
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;
7254 }
7255 }
7256
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;
7261 }
7262
7263 subdevice_id = pci_dev->subsystem_device;
7264
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;
7271 }
7272
7273 memset(ha, 0, sizeof (ips_ha_t));
7274
7275 ips_sh[index] = NULL;
7276 ips_ha[index] = ha;
7277 ha->active = 1;
7278
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;
7293
7294 /*
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.
7299 */
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);
7307 }
7308 }
7309 if(ips_cd_boot && !ips_FlashData){
7310 ips_FlashData = pci_alloc_consistent(pci_dev, PAGE_SIZE << 7,
7311 &ips_flashbusaddr);
7312 }
7313
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);
7320 }
7321
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);
7328 }
7329 ha->adapt->hw_status_start = dma_address;
7330 ha->dummy = (void *) (ha->adapt + 1);
7331
7332
7333
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);
7339 }
7340 ha->logical_drive_info_dma_addr = dma_address;
7341
7342
7343 ha->conf = kmalloc(sizeof (IPS_CONF), GFP_KERNEL);
7344
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);
7349 }
7350
7351 ha->nvram = kmalloc(sizeof (IPS_NVRAM_P5), GFP_KERNEL);
7352
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);
7357 }
7358
7359 ha->subsys = kmalloc(sizeof (IPS_SUBSYS), GFP_KERNEL);
7360
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);
7365 }
7366
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;
7371
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);
7379 }
7380
7381 /*
7382 * Setup Functions
7383 */
7384 ips_setup_funclist(ha);
7385
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);
7391 }
7392 }
7393
7394 /*
7395 * Initialize the card if it isn't already
7396 */
7397
7398 if (!(*ha->func.isinit) (ha)) {
7399 if (!(*ha->func.init) (ha)) {
7400 /*
7401 * Initialization failed
7402 */
7403 IPS_PRINTK(KERN_WARNING, pci_dev,
7404 "Unable to initialize controller\n");
7405 return ips_abort_init(ha, index);
7406 }
7407 }
7408
7409 *indexPtr = index;
7410 return SUCCESS;
7411 }
7412
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)
7424 {
7425 ips_ha_t *ha;
7426
7427 ha = ips_ha[index];
7428
7429 METHOD_TRACE("ips_init_phase2", 1);
7430 if (!ha->active) {
7431 ips_ha[index] = NULL;
7432 return -1;
7433 }
7434
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);
7440 }
7441
7442 /*
7443 * Allocate a temporary SCB for initialization
7444 */
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);
7451 }
7452
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);
7458 }
7459 /* Free the temporary SCB */
7460 ips_deallocatescbs(ha, 1);
7461
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);
7468 }
7469
7470 return SUCCESS;
7471 }
7472
7473 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,9)
7474 MODULE_LICENSE("GPL");
7475 #endif
7476
7477 MODULE_DESCRIPTION("IBM ServeRAID Adapter Driver " IPS_VER_STRING);
7478
7479 #ifdef MODULE_VERSION
7480 MODULE_VERSION(IPS_VER_STRING);
7481 #endif
7482
7483
7484 /*
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:
7501 */
This page took 0.376163 seconds and 5 git commands to generate.