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