1/* aha152x.c -- Adaptec AHA-152x driver 2 * Author: J��rgen E. Fischer, fischer@norbit.de 3 * Copyright 1993-2004 J��rgen E. Fischer 4 * 5 * This program is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License as published by the 7 * Free Software Foundation; either version 2, or (at your option) any 8 * later version. 9 * 10 * This program is distributed in the hope that it will be useful, but 11 * WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * General Public License for more details. 14 * 15 * 16 * $Id: aha152x.c,v 2.7 2004/01/24 11:42:59 Exp $ 17 * 18 * $Log: aha152x.c,v $ 19 * Revision 2.7 2004/01/24 11:42:59 fischer 20 * - gather code that is not used by PCMCIA at the end 21 * - move request_region for !PCMCIA case to detection 22 * - migration to new scsi host api (remove legacy code) 23 * - free host scribble before scsi_done 24 * - fix error handling 25 * - one isapnp device added to id_table 26 * 27 * Revision 2.6 2003/10/30 20:52:47 fischer 28 * - interfaces changes for kernel 2.6 29 * - aha152x_probe_one introduced for pcmcia stub 30 * - fixed pnpdev handling 31 * - instead of allocation a new one, reuse command for request sense after check condition and reset 32 * - fixes race in is_complete 33 * 34 * Revision 2.5 2002/04/14 11:24:53 fischer 35 * - isapnp support 36 * - abort fixed 37 * - 2.5 support 38 * 39 * Revision 2.4 2000/12/16 12:53:56 fischer 40 * - allow REQUEST SENSE to be queued 41 * - handle shared PCI interrupts 42 * 43 * Revision 2.3 2000/11/04 16:40:26 fischer 44 * - handle data overruns 45 * - extend timeout for data phases 46 * 47 * Revision 2.2 2000/08/08 19:54:53 fischer 48 * - minor changes 49 * 50 * Revision 2.1 2000/05/17 16:23:17 fischer 51 * - signature update 52 * - fix for data out w/o scatter gather 53 * 54 * Revision 2.0 1999/12/25 15:07:32 fischer 55 * - interrupt routine completly reworked 56 * - basic support for new eh code 57 * 58 * Revision 1.21 1999/11/10 23:46:36 fischer 59 * - default to synchronous operation 60 * - synchronous negotiation fixed 61 * - added timeout to loops 62 * - debugging output can be controlled through procfs 63 * 64 * Revision 1.20 1999/11/07 18:37:31 fischer 65 * - synchronous operation works 66 * - resid support for sg driver 67 * 68 * Revision 1.19 1999/11/02 22:39:59 fischer 69 * - moved leading comments to README.aha152x 70 * - new additional module parameters 71 * - updates for 2.3 72 * - support for the Tripace TC1550 controller 73 * - interrupt handling changed 74 * 75 * Revision 1.18 1996/09/07 20:10:40 fischer 76 * - fixed can_queue handling (multiple outstanding commands working again) 77 * 78 * Revision 1.17 1996/08/17 16:05:14 fischer 79 * - biosparam improved 80 * - interrupt verification 81 * - updated documentation 82 * - cleanups 83 * 84 * Revision 1.16 1996/06/09 00:04:56 root 85 * - added configuration symbols for insmod (aha152x/aha152x1) 86 * 87 * Revision 1.15 1996/04/30 14:52:06 fischer 88 * - proc info fixed 89 * - support for extended translation for >1GB disks 90 * 91 * Revision 1.14 1996/01/17 15:11:20 fischer 92 * - fixed lockup in MESSAGE IN phase after reconnection 93 * 94 * Revision 1.13 1996/01/09 02:15:53 fischer 95 * - some cleanups 96 * - moved request_irq behind controller initialization 97 * (to avoid spurious interrupts) 98 * 99 * Revision 1.12 1995/12/16 12:26:07 fischer 100 * - barrier()s added 101 * - configurable RESET delay added 102 * 103 * Revision 1.11 1995/12/06 21:18:35 fischer 104 * - some minor updates 105 * 106 * Revision 1.10 1995/07/22 19:18:45 fischer 107 * - support for 2 controllers 108 * - started synchronous data transfers (not working yet) 109 * 110 * Revision 1.9 1995/03/18 09:20:24 root 111 * - patches for PCMCIA and modules 112 * 113 * Revision 1.8 1995/01/21 22:07:19 root 114 * - snarf_region => request_region 115 * - aha152x_intr interface change 116 * 117 * Revision 1.7 1995/01/02 23:19:36 root 118 * - updated COMMAND_SIZE to cmd_len 119 * - changed sti() to restore_flags() 120 * - fixed some #ifdef which generated warnings 121 * 122 * Revision 1.6 1994/11/24 20:35:27 root 123 * - problem with odd number of bytes in fifo fixed 124 * 125 * Revision 1.5 1994/10/30 14:39:56 root 126 * - abort code fixed 127 * - debugging improved 128 * 129 * Revision 1.4 1994/09/12 11:33:01 root 130 * - irqaction to request_irq 131 * - abortion updated 132 * 133 * Revision 1.3 1994/08/04 13:53:05 root 134 * - updates for mid-level-driver changes 135 * - accept unexpected BUSFREE phase as error condition 136 * - parity check now configurable 137 * 138 * Revision 1.2 1994/07/03 12:56:36 root 139 * - cleaned up debugging code 140 * - more tweaking on reset delays 141 * - updated abort/reset code (pretty untested...) 142 * 143 * Revision 1.1 1994/05/28 21:18:49 root 144 * - update for mid-level interface change (abort-reset) 145 * - delays after resets adjusted for some slow devices 146 * 147 * Revision 1.0 1994/03/25 12:52:00 root 148 * - Fixed "more data than expected" problem 149 * - added new BIOS signatures 150 * 151 * Revision 0.102 1994/01/31 20:44:12 root 152 * - minor changes in insw/outsw handling 153 * 154 * Revision 0.101 1993/12/13 01:16:27 root 155 * - fixed STATUS phase (non-GOOD stati were dropped sometimes; 156 * fixes problems with CD-ROM sector size detection & media change) 157 * 158 * Revision 0.100 1993/12/10 16:58:47 root 159 * - fix for unsuccessful selections in case of non-continuous id assignments 160 * on the scsi bus. 161 * 162 * Revision 0.99 1993/10/24 16:19:59 root 163 * - fixed DATA IN (rare read errors gone) 164 * 165 * Revision 0.98 1993/10/17 12:54:44 root 166 * - fixed some recent fixes (shame on me) 167 * - moved initialization of scratch area to aha152x_queue 168 * 169 * Revision 0.97 1993/10/09 18:53:53 root 170 * - DATA IN fixed. Rarely left data in the fifo. 171 * 172 * Revision 0.96 1993/10/03 00:53:59 root 173 * - minor changes on DATA IN 174 * 175 * Revision 0.95 1993/09/24 10:36:01 root 176 * - change handling of MSGI after reselection 177 * - fixed sti/cli 178 * - minor changes 179 * 180 * Revision 0.94 1993/09/18 14:08:22 root 181 * - fixed bug in multiple outstanding command code 182 * - changed detection 183 * - support for kernel command line configuration 184 * - reset corrected 185 * - changed message handling 186 * 187 * Revision 0.93 1993/09/15 20:41:19 root 188 * - fixed bugs with multiple outstanding commands 189 * 190 * Revision 0.92 1993/09/13 02:46:33 root 191 * - multiple outstanding commands work (no problems with IBM drive) 192 * 193 * Revision 0.91 1993/09/12 20:51:46 root 194 * added multiple outstanding commands 195 * (some problem with this $%&? IBM device remain) 196 * 197 * Revision 0.9 1993/09/12 11:11:22 root 198 * - corrected auto-configuration 199 * - changed the auto-configuration (added some '#define's) 200 * - added support for dis-/reconnection 201 * 202 * Revision 0.8 1993/09/06 23:09:39 root 203 * - added support for the drive activity light 204 * - minor changes 205 * 206 * Revision 0.7 1993/09/05 14:30:15 root 207 * - improved phase detection 208 * - now using the new snarf_region code of 0.99pl13 209 * 210 * Revision 0.6 1993/09/02 11:01:38 root 211 * first public release; added some signatures and biosparam() 212 * 213 * Revision 0.5 1993/08/30 10:23:30 root 214 * fixed timing problems with my IBM drive 215 * 216 * Revision 0.4 1993/08/29 14:06:52 root 217 * fixed some problems with timeouts due incomplete commands 218 * 219 * Revision 0.3 1993/08/28 15:55:03 root 220 * writing data works too. mounted and worked on a dos partition 221 * 222 * Revision 0.2 1993/08/27 22:42:07 root 223 * reading data works. Mounted a msdos partition. 224 * 225 * Revision 0.1 1993/08/25 13:38:30 root 226 * first "damn thing doesn't work" version 227 * 228 * Revision 0.0 1993/08/14 19:54:25 root 229 * empty function bodies; detect() works. 230 * 231 * 232 ************************************************************************** 233 234 see Documentation/scsi/aha152x.txt for configuration details 235 236 **************************************************************************/ 237 238#include <linux/module.h> 239#include <asm/irq.h> 240#include <linux/io.h> 241#include <linux/blkdev.h> 242#include <asm/system.h> 243#include <linux/completion.h> 244#include <linux/errno.h> 245#include <linux/string.h> 246#include <linux/wait.h> 247#include <linux/ioport.h> 248#include <linux/delay.h> 249#include <linux/proc_fs.h> 250#include <linux/interrupt.h> 251#include <linux/init.h> 252#include <linux/kernel.h> 253#include <linux/isapnp.h> 254#include <linux/spinlock.h> 255#include <linux/workqueue.h> 256#include <linux/list.h> 257#include <linux/slab.h> 258#include <scsi/scsicam.h> 259 260#include "scsi.h" 261#include <scsi/scsi_dbg.h> 262#include <scsi/scsi_host.h> 263#include <scsi/scsi_transport_spi.h> 264#include <scsi/scsi_eh.h> 265#include "aha152x.h" 266 267static LIST_HEAD(aha152x_host_list); 268 269 270/* DEFINES */ 271 272/* For PCMCIA cards, always use AUTOCONF */ 273#if defined(PCMCIA) || defined(MODULE) 274#if !defined(AUTOCONF) 275#define AUTOCONF 276#endif 277#endif 278 279#if !defined(AUTOCONF) && !defined(SETUP0) 280#error define AUTOCONF or SETUP0 281#endif 282 283#if defined(AHA152X_DEBUG) 284#define DEBUG_DEFAULT debug_eh 285 286#define DPRINTK(when,msgs...) \ 287 do { if(HOSTDATA(shpnt)->debug & (when)) printk(msgs); } while(0) 288 289#define DO_LOCK(flags) \ 290 do { \ 291 if(spin_is_locked(&QLOCK)) { \ 292 DPRINTK(debug_intr, DEBUG_LEAD "(%s:%d) already locked at %s:%d\n", CMDINFO(CURRENT_SC), __func__, __LINE__, QLOCKER, QLOCKERL); \ 293 } \ 294 DPRINTK(debug_locking, DEBUG_LEAD "(%s:%d) locking\n", CMDINFO(CURRENT_SC), __func__, __LINE__); \ 295 spin_lock_irqsave(&QLOCK,flags); \ 296 DPRINTK(debug_locking, DEBUG_LEAD "(%s:%d) locked\n", CMDINFO(CURRENT_SC), __func__, __LINE__); \ 297 QLOCKER=__func__; \ 298 QLOCKERL=__LINE__; \ 299 } while(0) 300 301#define DO_UNLOCK(flags) \ 302 do { \ 303 DPRINTK(debug_locking, DEBUG_LEAD "(%s:%d) unlocking (locked at %s:%d)\n", CMDINFO(CURRENT_SC), __func__, __LINE__, QLOCKER, QLOCKERL); \ 304 spin_unlock_irqrestore(&QLOCK,flags); \ 305 DPRINTK(debug_locking, DEBUG_LEAD "(%s:%d) unlocked\n", CMDINFO(CURRENT_SC), __func__, __LINE__); \ 306 QLOCKER="(not locked)"; \ 307 QLOCKERL=0; \ 308 } while(0) 309 310#else 311#define DPRINTK(when,msgs...) 312#define DO_LOCK(flags) spin_lock_irqsave(&QLOCK,flags) 313#define DO_UNLOCK(flags) spin_unlock_irqrestore(&QLOCK,flags) 314#endif 315 316#define LEAD "(scsi%d:%d:%d) " 317#define WARN_LEAD KERN_WARNING LEAD 318#define INFO_LEAD KERN_INFO LEAD 319#define NOTE_LEAD KERN_NOTICE LEAD 320#define ERR_LEAD KERN_ERR LEAD 321#define DEBUG_LEAD KERN_DEBUG LEAD 322#define CMDINFO(cmd) \ 323 (cmd) ? ((cmd)->device->host->host_no) : -1, \ 324 (cmd) ? ((cmd)->device->id & 0x0f) : -1, \ 325 (cmd) ? ((cmd)->device->lun & 0x07) : -1 326 327static inline void 328CMD_INC_RESID(struct scsi_cmnd *cmd, int inc) 329{ 330 scsi_set_resid(cmd, scsi_get_resid(cmd) + inc); 331} 332 333#define DELAY_DEFAULT 1000 334 335#if defined(PCMCIA) 336#define IRQ_MIN 0 337#define IRQ_MAX 16 338#else 339#define IRQ_MIN 9 340#if defined(__PPC) 341#define IRQ_MAX (nr_irqs-1) 342#else 343#define IRQ_MAX 12 344#endif 345#endif 346 347enum { 348 not_issued = 0x0001, /* command not yet issued */ 349 selecting = 0x0002, /* target is beeing selected */ 350 identified = 0x0004, /* IDENTIFY was sent */ 351 disconnected = 0x0008, /* target disconnected */ 352 completed = 0x0010, /* target sent COMMAND COMPLETE */ 353 aborted = 0x0020, /* ABORT was sent */ 354 resetted = 0x0040, /* BUS DEVICE RESET was sent */ 355 spiordy = 0x0080, /* waiting for SPIORDY to raise */ 356 syncneg = 0x0100, /* synchronous negotiation in progress */ 357 aborting = 0x0200, /* ABORT is pending */ 358 resetting = 0x0400, /* BUS DEVICE RESET is pending */ 359 check_condition = 0x0800, /* requesting sense after CHECK CONDITION */ 360}; 361 362MODULE_AUTHOR("J��rgen Fischer"); 363MODULE_DESCRIPTION(AHA152X_REVID); 364MODULE_LICENSE("GPL"); 365 366#if !defined(PCMCIA) 367#if defined(MODULE) 368static int io[] = {0, 0}; 369module_param_array(io, int, NULL, 0); 370MODULE_PARM_DESC(io,"base io address of controller"); 371 372static int irq[] = {0, 0}; 373module_param_array(irq, int, NULL, 0); 374MODULE_PARM_DESC(irq,"interrupt for controller"); 375 376static int scsiid[] = {7, 7}; 377module_param_array(scsiid, int, NULL, 0); 378MODULE_PARM_DESC(scsiid,"scsi id of controller"); 379 380static int reconnect[] = {1, 1}; 381module_param_array(reconnect, int, NULL, 0); 382MODULE_PARM_DESC(reconnect,"allow targets to disconnect"); 383 384static int parity[] = {1, 1}; 385module_param_array(parity, int, NULL, 0); 386MODULE_PARM_DESC(parity,"use scsi parity"); 387 388static int sync[] = {1, 1}; 389module_param_array(sync, int, NULL, 0); 390MODULE_PARM_DESC(sync,"use synchronous transfers"); 391 392static int delay[] = {DELAY_DEFAULT, DELAY_DEFAULT}; 393module_param_array(delay, int, NULL, 0); 394MODULE_PARM_DESC(delay,"scsi reset delay"); 395 396static int exttrans[] = {0, 0}; 397module_param_array(exttrans, int, NULL, 0); 398MODULE_PARM_DESC(exttrans,"use extended translation"); 399 400#if !defined(AHA152X_DEBUG) 401static int aha152x[] = {0, 11, 7, 1, 1, 0, DELAY_DEFAULT, 0}; 402module_param_array(aha152x, int, NULL, 0); 403MODULE_PARM_DESC(aha152x, "parameters for first controller"); 404 405static int aha152x1[] = {0, 11, 7, 1, 1, 0, DELAY_DEFAULT, 0}; 406module_param_array(aha152x1, int, NULL, 0); 407MODULE_PARM_DESC(aha152x1, "parameters for second controller"); 408#else 409static int debug[] = {DEBUG_DEFAULT, DEBUG_DEFAULT}; 410module_param_array(debug, int, NULL, 0); 411MODULE_PARM_DESC(debug, "flags for driver debugging"); 412 413static int aha152x[] = {0, 11, 7, 1, 1, 1, DELAY_DEFAULT, 0, DEBUG_DEFAULT}; 414module_param_array(aha152x, int, NULL, 0); 415MODULE_PARM_DESC(aha152x, "parameters for first controller"); 416 417static int aha152x1[] = {0, 11, 7, 1, 1, 1, DELAY_DEFAULT, 0, DEBUG_DEFAULT}; 418module_param_array(aha152x1, int, NULL, 0); 419MODULE_PARM_DESC(aha152x1, "parameters for second controller"); 420#endif /* !defined(AHA152X_DEBUG) */ 421#endif /* MODULE */ 422 423#ifdef __ISAPNP__ 424static struct isapnp_device_id id_table[] __devinitdata = { 425 { ISAPNP_ANY_ID, ISAPNP_ANY_ID, 426 ISAPNP_VENDOR('A','D','P'), ISAPNP_FUNCTION(0x1505), 0 }, 427 { ISAPNP_ANY_ID, ISAPNP_ANY_ID, 428 ISAPNP_VENDOR('A','D','P'), ISAPNP_FUNCTION(0x1530), 0 }, 429 { ISAPNP_DEVICE_SINGLE_END, } 430}; 431MODULE_DEVICE_TABLE(isapnp, id_table); 432#endif /* ISAPNP */ 433 434#endif /* !PCMCIA */ 435 436static struct scsi_host_template aha152x_driver_template; 437 438/* 439 * internal states of the host 440 * 441 */ 442enum aha152x_state { 443 idle=0, 444 unknown, 445 seldo, 446 seldi, 447 selto, 448 busfree, 449 msgo, 450 cmd, 451 msgi, 452 status, 453 datai, 454 datao, 455 parerr, 456 rsti, 457 maxstate 458}; 459 460/* 461 * current state information of the host 462 * 463 */ 464struct aha152x_hostdata { 465 Scsi_Cmnd *issue_SC; 466 /* pending commands to issue */ 467 468 Scsi_Cmnd *current_SC; 469 /* current command on the bus */ 470 471 Scsi_Cmnd *disconnected_SC; 472 /* commands that disconnected */ 473 474 Scsi_Cmnd *done_SC; 475 /* command that was completed */ 476 477 spinlock_t lock; 478 /* host lock */ 479 480#if defined(AHA152X_DEBUG) 481 const char *locker; 482 /* which function has the lock */ 483 int lockerl; /* where did it get it */ 484 485 int debug; /* current debugging setting */ 486#endif 487 488#if defined(AHA152X_STAT) 489 int total_commands; 490 int disconnections; 491 int busfree_without_any_action; 492 int busfree_without_old_command; 493 int busfree_without_new_command; 494 int busfree_without_done_command; 495 int busfree_with_check_condition; 496 int count[maxstate]; 497 int count_trans[maxstate]; 498 unsigned long time[maxstate]; 499#endif 500 501 int commands; /* current number of commands */ 502 503 int reconnect; /* disconnection allowed */ 504 int parity; /* parity checking enabled */ 505 int synchronous; /* synchronous transferes enabled */ 506 int delay; /* reset out delay */ 507 int ext_trans; /* extended translation enabled */ 508 509 int swint; /* software-interrupt was fired during detect() */ 510 int service; /* bh needs to be run */ 511 int in_intr; /* bh is running */ 512 513 /* current state, 514 previous state, 515 last state different from current state */ 516 enum aha152x_state state, prevstate, laststate; 517 518 int target; 519 /* reconnecting target */ 520 521 unsigned char syncrate[8]; 522 /* current synchronous transfer agreements */ 523 524 unsigned char syncneg[8]; 525 /* 0: no negotiation; 526 * 1: negotiation in progress; 527 * 2: negotiation completed 528 */ 529 530 int cmd_i; 531 /* number of sent bytes of current command */ 532 533 int msgi_len; 534 /* number of received message bytes */ 535 unsigned char msgi[256]; 536 /* received message bytes */ 537 538 int msgo_i, msgo_len; 539 /* number of sent bytes and length of current messages */ 540 unsigned char msgo[256]; 541 /* pending messages */ 542 543 int data_len; 544 /* number of sent/received bytes in dataphase */ 545 546 unsigned long io_port0; 547 unsigned long io_port1; 548 549#ifdef __ISAPNP__ 550 struct pnp_dev *pnpdev; 551#endif 552 struct list_head host_list; 553}; 554 555 556/* 557 * host specific command extension 558 * 559 */ 560struct aha152x_scdata { 561 Scsi_Cmnd *next; /* next sc in queue */ 562 struct completion *done;/* semaphore to block on */ 563 struct scsi_eh_save ses; 564}; 565 566/* access macros for hostdata */ 567 568#define HOSTDATA(shpnt) ((struct aha152x_hostdata *) &shpnt->hostdata) 569 570#define HOSTNO ((shpnt)->host_no) 571 572#define CURRENT_SC (HOSTDATA(shpnt)->current_SC) 573#define DONE_SC (HOSTDATA(shpnt)->done_SC) 574#define ISSUE_SC (HOSTDATA(shpnt)->issue_SC) 575#define DISCONNECTED_SC (HOSTDATA(shpnt)->disconnected_SC) 576#define QLOCK (HOSTDATA(shpnt)->lock) 577#define QLOCKER (HOSTDATA(shpnt)->locker) 578#define QLOCKERL (HOSTDATA(shpnt)->lockerl) 579 580#define STATE (HOSTDATA(shpnt)->state) 581#define PREVSTATE (HOSTDATA(shpnt)->prevstate) 582#define LASTSTATE (HOSTDATA(shpnt)->laststate) 583 584#define RECONN_TARGET (HOSTDATA(shpnt)->target) 585 586#define CMD_I (HOSTDATA(shpnt)->cmd_i) 587 588#define MSGO(i) (HOSTDATA(shpnt)->msgo[i]) 589#define MSGO_I (HOSTDATA(shpnt)->msgo_i) 590#define MSGOLEN (HOSTDATA(shpnt)->msgo_len) 591#define ADDMSGO(x) (MSGOLEN<256 ? (void)(MSGO(MSGOLEN++)=x) : aha152x_error(shpnt,"MSGO overflow")) 592 593#define MSGI(i) (HOSTDATA(shpnt)->msgi[i]) 594#define MSGILEN (HOSTDATA(shpnt)->msgi_len) 595#define ADDMSGI(x) (MSGILEN<256 ? (void)(MSGI(MSGILEN++)=x) : aha152x_error(shpnt,"MSGI overflow")) 596 597#define DATA_LEN (HOSTDATA(shpnt)->data_len) 598 599#define SYNCRATE (HOSTDATA(shpnt)->syncrate[CURRENT_SC->device->id]) 600#define SYNCNEG (HOSTDATA(shpnt)->syncneg[CURRENT_SC->device->id]) 601 602#define DELAY (HOSTDATA(shpnt)->delay) 603#define EXT_TRANS (HOSTDATA(shpnt)->ext_trans) 604#define TC1550 (HOSTDATA(shpnt)->tc1550) 605#define RECONNECT (HOSTDATA(shpnt)->reconnect) 606#define PARITY (HOSTDATA(shpnt)->parity) 607#define SYNCHRONOUS (HOSTDATA(shpnt)->synchronous) 608 609#define HOSTIOPORT0 (HOSTDATA(shpnt)->io_port0) 610#define HOSTIOPORT1 (HOSTDATA(shpnt)->io_port1) 611 612#define SCDATA(SCpnt) ((struct aha152x_scdata *) (SCpnt)->host_scribble) 613#define SCNEXT(SCpnt) SCDATA(SCpnt)->next 614#define SCSEM(SCpnt) SCDATA(SCpnt)->done 615 616#define SG_ADDRESS(buffer) ((char *) sg_virt((buffer))) 617 618/* state handling */ 619static void seldi_run(struct Scsi_Host *shpnt); 620static void seldo_run(struct Scsi_Host *shpnt); 621static void selto_run(struct Scsi_Host *shpnt); 622static void busfree_run(struct Scsi_Host *shpnt); 623 624static void msgo_init(struct Scsi_Host *shpnt); 625static void msgo_run(struct Scsi_Host *shpnt); 626static void msgo_end(struct Scsi_Host *shpnt); 627 628static void cmd_init(struct Scsi_Host *shpnt); 629static void cmd_run(struct Scsi_Host *shpnt); 630static void cmd_end(struct Scsi_Host *shpnt); 631 632static void datai_init(struct Scsi_Host *shpnt); 633static void datai_run(struct Scsi_Host *shpnt); 634static void datai_end(struct Scsi_Host *shpnt); 635 636static void datao_init(struct Scsi_Host *shpnt); 637static void datao_run(struct Scsi_Host *shpnt); 638static void datao_end(struct Scsi_Host *shpnt); 639 640static void status_run(struct Scsi_Host *shpnt); 641 642static void msgi_run(struct Scsi_Host *shpnt); 643static void msgi_end(struct Scsi_Host *shpnt); 644 645static void parerr_run(struct Scsi_Host *shpnt); 646static void rsti_run(struct Scsi_Host *shpnt); 647 648static void is_complete(struct Scsi_Host *shpnt); 649 650/* 651 * driver states 652 * 653 */ 654static struct { 655 char *name; 656 void (*init)(struct Scsi_Host *); 657 void (*run)(struct Scsi_Host *); 658 void (*end)(struct Scsi_Host *); 659 int spio; 660} states[] = { 661 { "idle", NULL, NULL, NULL, 0}, 662 { "unknown", NULL, NULL, NULL, 0}, 663 { "seldo", NULL, seldo_run, NULL, 0}, 664 { "seldi", NULL, seldi_run, NULL, 0}, 665 { "selto", NULL, selto_run, NULL, 0}, 666 { "busfree", NULL, busfree_run, NULL, 0}, 667 { "msgo", msgo_init, msgo_run, msgo_end, 1}, 668 { "cmd", cmd_init, cmd_run, cmd_end, 1}, 669 { "msgi", NULL, msgi_run, msgi_end, 1}, 670 { "status", NULL, status_run, NULL, 1}, 671 { "datai", datai_init, datai_run, datai_end, 0}, 672 { "datao", datao_init, datao_run, datao_end, 0}, 673 { "parerr", NULL, parerr_run, NULL, 0}, 674 { "rsti", NULL, rsti_run, NULL, 0}, 675}; 676 677/* setup & interrupt */ 678static irqreturn_t intr(int irq, void *dev_id); 679static void reset_ports(struct Scsi_Host *shpnt); 680static void aha152x_error(struct Scsi_Host *shpnt, char *msg); 681static void done(struct Scsi_Host *shpnt, int error); 682 683/* diagnostics */ 684static void disp_ports(struct Scsi_Host *shpnt); 685static void show_command(Scsi_Cmnd * ptr); 686static void show_queues(struct Scsi_Host *shpnt); 687static void disp_enintr(struct Scsi_Host *shpnt); 688 689 690/* 691 * queue services: 692 * 693 */ 694static inline void append_SC(Scsi_Cmnd **SC, Scsi_Cmnd *new_SC) 695{ 696 Scsi_Cmnd *end; 697 698 SCNEXT(new_SC) = NULL; 699 if (!*SC) 700 *SC = new_SC; 701 else { 702 for (end = *SC; SCNEXT(end); end = SCNEXT(end)) 703 ; 704 SCNEXT(end) = new_SC; 705 } 706} 707 708static inline Scsi_Cmnd *remove_first_SC(Scsi_Cmnd ** SC) 709{ 710 Scsi_Cmnd *ptr; 711 712 ptr = *SC; 713 if (ptr) { 714 *SC = SCNEXT(*SC); 715 SCNEXT(ptr)=NULL; 716 } 717 return ptr; 718} 719 720static inline Scsi_Cmnd *remove_lun_SC(Scsi_Cmnd ** SC, int target, int lun) 721{ 722 Scsi_Cmnd *ptr, *prev; 723 724 for (ptr = *SC, prev = NULL; 725 ptr && ((ptr->device->id != target) || (ptr->device->lun != lun)); 726 prev = ptr, ptr = SCNEXT(ptr)) 727 ; 728 729 if (ptr) { 730 if (prev) 731 SCNEXT(prev) = SCNEXT(ptr); 732 else 733 *SC = SCNEXT(ptr); 734 735 SCNEXT(ptr)=NULL; 736 } 737 738 return ptr; 739} 740 741static inline Scsi_Cmnd *remove_SC(Scsi_Cmnd **SC, Scsi_Cmnd *SCp) 742{ 743 Scsi_Cmnd *ptr, *prev; 744 745 for (ptr = *SC, prev = NULL; 746 ptr && SCp!=ptr; 747 prev = ptr, ptr = SCNEXT(ptr)) 748 ; 749 750 if (ptr) { 751 if (prev) 752 SCNEXT(prev) = SCNEXT(ptr); 753 else 754 *SC = SCNEXT(ptr); 755 756 SCNEXT(ptr)=NULL; 757 } 758 759 return ptr; 760} 761 762static irqreturn_t swintr(int irqno, void *dev_id) 763{ 764 struct Scsi_Host *shpnt = dev_id; 765 766 HOSTDATA(shpnt)->swint++; 767 768 SETPORT(DMACNTRL0, INTEN); 769 return IRQ_HANDLED; 770} 771 772struct Scsi_Host *aha152x_probe_one(struct aha152x_setup *setup) 773{ 774 struct Scsi_Host *shpnt; 775 776 shpnt = scsi_host_alloc(&aha152x_driver_template, sizeof(struct aha152x_hostdata)); 777 if (!shpnt) { 778 printk(KERN_ERR "aha152x: scsi_host_alloc failed\n"); 779 return NULL; 780 } 781 782 memset(HOSTDATA(shpnt), 0, sizeof *HOSTDATA(shpnt)); 783 INIT_LIST_HEAD(&HOSTDATA(shpnt)->host_list); 784 785 /* need to have host registered before triggering any interrupt */ 786 list_add_tail(&HOSTDATA(shpnt)->host_list, &aha152x_host_list); 787 788 shpnt->io_port = setup->io_port; 789 shpnt->n_io_port = IO_RANGE; 790 shpnt->irq = setup->irq; 791 792 if (!setup->tc1550) { 793 HOSTIOPORT0 = setup->io_port; 794 HOSTIOPORT1 = setup->io_port; 795 } else { 796 HOSTIOPORT0 = setup->io_port+0x10; 797 HOSTIOPORT1 = setup->io_port-0x10; 798 } 799 800 spin_lock_init(&QLOCK); 801 RECONNECT = setup->reconnect; 802 SYNCHRONOUS = setup->synchronous; 803 PARITY = setup->parity; 804 DELAY = setup->delay; 805 EXT_TRANS = setup->ext_trans; 806 807#if defined(AHA152X_DEBUG) 808 HOSTDATA(shpnt)->debug = setup->debug; 809#endif 810 811 SETPORT(SCSIID, setup->scsiid << 4); 812 shpnt->this_id = setup->scsiid; 813 814 if (setup->reconnect) 815 shpnt->can_queue = AHA152X_MAXQUEUE; 816 817 /* RESET OUT */ 818 printk("aha152x: resetting bus...\n"); 819 SETPORT(SCSISEQ, SCSIRSTO); 820 mdelay(256); 821 SETPORT(SCSISEQ, 0); 822 mdelay(DELAY); 823 824 reset_ports(shpnt); 825 826 printk(KERN_INFO 827 "aha152x%d%s: " 828 "vital data: rev=%x, " 829 "io=0x%03lx (0x%03lx/0x%03lx), " 830 "irq=%d, " 831 "scsiid=%d, " 832 "reconnect=%s, " 833 "parity=%s, " 834 "synchronous=%s, " 835 "delay=%d, " 836 "extended translation=%s\n", 837 shpnt->host_no, setup->tc1550 ? " (tc1550 mode)" : "", 838 GETPORT(REV) & 0x7, 839 shpnt->io_port, HOSTIOPORT0, HOSTIOPORT1, 840 shpnt->irq, 841 shpnt->this_id, 842 RECONNECT ? "enabled" : "disabled", 843 PARITY ? "enabled" : "disabled", 844 SYNCHRONOUS ? "enabled" : "disabled", 845 DELAY, 846 EXT_TRANS ? "enabled" : "disabled"); 847 848 /* not expecting any interrupts */ 849 SETPORT(SIMODE0, 0); 850 SETPORT(SIMODE1, 0); 851 852 if( request_irq(shpnt->irq, swintr, IRQF_DISABLED|IRQF_SHARED, "aha152x", shpnt) ) { 853 printk(KERN_ERR "aha152x%d: irq %d busy.\n", shpnt->host_no, shpnt->irq); 854 goto out_host_put; 855 } 856 857 HOSTDATA(shpnt)->swint = 0; 858 859 printk(KERN_INFO "aha152x%d: trying software interrupt, ", shpnt->host_no); 860 861 mb(); 862 SETPORT(DMACNTRL0, SWINT|INTEN); 863 mdelay(1000); 864 free_irq(shpnt->irq, shpnt); 865 866 if (!HOSTDATA(shpnt)->swint) { 867 if (TESTHI(DMASTAT, INTSTAT)) { 868 printk("lost.\n"); 869 } else { 870 printk("failed.\n"); 871 } 872 873 SETPORT(DMACNTRL0, INTEN); 874 875 printk(KERN_ERR "aha152x%d: irq %d possibly wrong. " 876 "Please verify.\n", shpnt->host_no, shpnt->irq); 877 goto out_host_put; 878 } 879 printk("ok.\n"); 880 881 882 /* clear interrupts */ 883 SETPORT(SSTAT0, 0x7f); 884 SETPORT(SSTAT1, 0xef); 885 886 if ( request_irq(shpnt->irq, intr, IRQF_DISABLED|IRQF_SHARED, "aha152x", shpnt) ) { 887 printk(KERN_ERR "aha152x%d: failed to reassign irq %d.\n", shpnt->host_no, shpnt->irq); 888 goto out_host_put; 889 } 890 891 if( scsi_add_host(shpnt, NULL) ) { 892 free_irq(shpnt->irq, shpnt); 893 printk(KERN_ERR "aha152x%d: failed to add host.\n", shpnt->host_no); 894 goto out_host_put; 895 } 896 897 scsi_scan_host(shpnt); 898 899 return shpnt; 900 901out_host_put: 902 list_del(&HOSTDATA(shpnt)->host_list); 903 scsi_host_put(shpnt); 904 905 return NULL; 906} 907 908void aha152x_release(struct Scsi_Host *shpnt) 909{ 910 if (!shpnt) 911 return; 912 913 scsi_remove_host(shpnt); 914 if (shpnt->irq) 915 free_irq(shpnt->irq, shpnt); 916 917#if !defined(PCMCIA) 918 if (shpnt->io_port) 919 release_region(shpnt->io_port, IO_RANGE); 920#endif 921 922#ifdef __ISAPNP__ 923 if (HOSTDATA(shpnt)->pnpdev) 924 pnp_device_detach(HOSTDATA(shpnt)->pnpdev); 925#endif 926 927 list_del(&HOSTDATA(shpnt)->host_list); 928 scsi_host_put(shpnt); 929} 930 931 932/* 933 * setup controller to generate interrupts depending 934 * on current state (lock has to be acquired) 935 * 936 */ 937static int setup_expected_interrupts(struct Scsi_Host *shpnt) 938{ 939 if(CURRENT_SC) { 940 CURRENT_SC->SCp.phase |= 1 << 16; 941 942 if(CURRENT_SC->SCp.phase & selecting) { 943 DPRINTK(debug_intr, DEBUG_LEAD "expecting: (seldo) (seltimo) (seldi)\n", CMDINFO(CURRENT_SC)); 944 SETPORT(SSTAT1, SELTO); 945 SETPORT(SIMODE0, ENSELDO | (DISCONNECTED_SC ? ENSELDI : 0)); 946 SETPORT(SIMODE1, ENSELTIMO); 947 } else { 948 DPRINTK(debug_intr, DEBUG_LEAD "expecting: (phase change) (busfree) %s\n", CMDINFO(CURRENT_SC), CURRENT_SC->SCp.phase & spiordy ? "(spiordy)" : ""); 949 SETPORT(SIMODE0, (CURRENT_SC->SCp.phase & spiordy) ? ENSPIORDY : 0); 950 SETPORT(SIMODE1, ENPHASEMIS | ENSCSIRST | ENSCSIPERR | ENBUSFREE); 951 } 952 } else if(STATE==seldi) { 953 DPRINTK(debug_intr, DEBUG_LEAD "expecting: (phase change) (identify)\n", CMDINFO(CURRENT_SC)); 954 SETPORT(SIMODE0, 0); 955 SETPORT(SIMODE1, ENPHASEMIS | ENSCSIRST | ENSCSIPERR | ENBUSFREE); 956 } else { 957 DPRINTK(debug_intr, DEBUG_LEAD "expecting: %s %s\n", 958 CMDINFO(CURRENT_SC), 959 DISCONNECTED_SC ? "(reselection)" : "", 960 ISSUE_SC ? "(busfree)" : ""); 961 SETPORT(SIMODE0, DISCONNECTED_SC ? ENSELDI : 0); 962 SETPORT(SIMODE1, ENSCSIRST | ( (ISSUE_SC||DONE_SC) ? ENBUSFREE : 0)); 963 } 964 965 if(!HOSTDATA(shpnt)->in_intr) 966 SETBITS(DMACNTRL0, INTEN); 967 968 return TESTHI(DMASTAT, INTSTAT); 969} 970 971 972/* 973 * Queue a command and setup interrupts for a free bus. 974 */ 975static int aha152x_internal_queue(Scsi_Cmnd *SCpnt, struct completion *complete, 976 int phase, void (*done)(Scsi_Cmnd *)) 977{ 978 struct Scsi_Host *shpnt = SCpnt->device->host; 979 unsigned long flags; 980 981#if defined(AHA152X_DEBUG) 982 if (HOSTDATA(shpnt)->debug & debug_queue) { 983 printk(INFO_LEAD "queue: %p; cmd_len=%d pieces=%d size=%u cmnd=", 984 CMDINFO(SCpnt), SCpnt, SCpnt->cmd_len, 985 scsi_sg_count(SCpnt), scsi_bufflen(SCpnt)); 986 __scsi_print_command(SCpnt->cmnd); 987 } 988#endif 989 990 SCpnt->scsi_done = done; 991 SCpnt->SCp.phase = not_issued | phase; 992 SCpnt->SCp.Status = 0x1; /* Ilegal status by SCSI standard */ 993 SCpnt->SCp.Message = 0; 994 SCpnt->SCp.have_data_in = 0; 995 SCpnt->SCp.sent_command = 0; 996 997 if(SCpnt->SCp.phase & (resetting|check_condition)) { 998 if (!SCpnt->host_scribble || SCSEM(SCpnt) || SCNEXT(SCpnt)) { 999 printk(ERR_LEAD "cannot reuse command\n", CMDINFO(SCpnt)); 1000 return FAILED; 1001 } 1002 } else { 1003 SCpnt->host_scribble = kmalloc(sizeof(struct aha152x_scdata), GFP_ATOMIC); 1004 if(!SCpnt->host_scribble) { 1005 printk(ERR_LEAD "allocation failed\n", CMDINFO(SCpnt)); 1006 return FAILED; 1007 } 1008 } 1009 1010 SCNEXT(SCpnt) = NULL; 1011 SCSEM(SCpnt) = complete; 1012 1013 /* setup scratch area 1014 SCp.ptr : buffer pointer 1015 SCp.this_residual : buffer length 1016 SCp.buffer : next buffer 1017 SCp.buffers_residual : left buffers in list 1018 SCp.phase : current state of the command */ 1019 1020 if ((phase & resetting) || !scsi_sglist(SCpnt)) { 1021 SCpnt->SCp.ptr = NULL; 1022 SCpnt->SCp.this_residual = 0; 1023 scsi_set_resid(SCpnt, 0); 1024 SCpnt->SCp.buffer = NULL; 1025 SCpnt->SCp.buffers_residual = 0; 1026 } else { 1027 scsi_set_resid(SCpnt, scsi_bufflen(SCpnt)); 1028 SCpnt->SCp.buffer = scsi_sglist(SCpnt); 1029 SCpnt->SCp.ptr = SG_ADDRESS(SCpnt->SCp.buffer); 1030 SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length; 1031 SCpnt->SCp.buffers_residual = scsi_sg_count(SCpnt) - 1; 1032 } 1033 1034 DO_LOCK(flags); 1035 1036#if defined(AHA152X_STAT) 1037 HOSTDATA(shpnt)->total_commands++; 1038#endif 1039 1040 /* Turn led on, when this is the first command. */ 1041 HOSTDATA(shpnt)->commands++; 1042 if (HOSTDATA(shpnt)->commands==1) 1043 SETPORT(PORTA, 1); 1044 1045 append_SC(&ISSUE_SC, SCpnt); 1046 1047 if(!HOSTDATA(shpnt)->in_intr) 1048 setup_expected_interrupts(shpnt); 1049 1050 DO_UNLOCK(flags); 1051 1052 return 0; 1053} 1054 1055/* 1056 * queue a command 1057 * 1058 */ 1059static int aha152x_queue(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) 1060{ 1061 1062 return aha152x_internal_queue(SCpnt, NULL, 0, done); 1063} 1064 1065 1066/* 1067 * 1068 * 1069 */ 1070static void reset_done(Scsi_Cmnd *SCpnt) 1071{ 1072 if(SCSEM(SCpnt)) { 1073 complete(SCSEM(SCpnt)); 1074 } else { 1075 printk(KERN_ERR "aha152x: reset_done w/o completion\n"); 1076 } 1077} 1078 1079/* 1080 * Abort a command 1081 * 1082 */ 1083static int aha152x_abort(Scsi_Cmnd *SCpnt) 1084{ 1085 struct Scsi_Host *shpnt = SCpnt->device->host; 1086 Scsi_Cmnd *ptr; 1087 unsigned long flags; 1088 1089#if defined(AHA152X_DEBUG) 1090 if(HOSTDATA(shpnt)->debug & debug_eh) { 1091 printk(DEBUG_LEAD "abort(%p)", CMDINFO(SCpnt), SCpnt); 1092 show_queues(shpnt); 1093 } 1094#endif 1095 1096 DO_LOCK(flags); 1097 1098 ptr=remove_SC(&ISSUE_SC, SCpnt); 1099 1100 if(ptr) { 1101 DPRINTK(debug_eh, DEBUG_LEAD "not yet issued - SUCCESS\n", CMDINFO(SCpnt)); 1102 1103 HOSTDATA(shpnt)->commands--; 1104 if (!HOSTDATA(shpnt)->commands) 1105 SETPORT(PORTA, 0); 1106 DO_UNLOCK(flags); 1107 1108 kfree(SCpnt->host_scribble); 1109 SCpnt->host_scribble=NULL; 1110 1111 return SUCCESS; 1112 } 1113 1114 DO_UNLOCK(flags); 1115 1116 1117 printk(ERR_LEAD "cannot abort running or disconnected command\n", CMDINFO(SCpnt)); 1118 1119 return FAILED; 1120} 1121 1122/* 1123 * Reset a device 1124 * 1125 */ 1126static int aha152x_device_reset(Scsi_Cmnd * SCpnt) 1127{ 1128 struct Scsi_Host *shpnt = SCpnt->device->host; 1129 DECLARE_COMPLETION(done); 1130 int ret, issued, disconnected; 1131 unsigned char old_cmd_len = SCpnt->cmd_len; 1132 unsigned long flags; 1133 unsigned long timeleft; 1134 1135#if defined(AHA152X_DEBUG) 1136 if(HOSTDATA(shpnt)->debug & debug_eh) { 1137 printk(INFO_LEAD "aha152x_device_reset(%p)", CMDINFO(SCpnt), SCpnt); 1138 show_queues(shpnt); 1139 } 1140#endif 1141 1142 if(CURRENT_SC==SCpnt) { 1143 printk(ERR_LEAD "cannot reset current device\n", CMDINFO(SCpnt)); 1144 return FAILED; 1145 } 1146 1147 DO_LOCK(flags); 1148 issued = remove_SC(&ISSUE_SC, SCpnt) == NULL; 1149 disconnected = issued && remove_SC(&DISCONNECTED_SC, SCpnt); 1150 DO_UNLOCK(flags); 1151 1152 SCpnt->cmd_len = 0; 1153 1154 aha152x_internal_queue(SCpnt, &done, resetting, reset_done); 1155 1156 timeleft = wait_for_completion_timeout(&done, 100*HZ); 1157 if (!timeleft) { 1158 /* remove command from issue queue */ 1159 DO_LOCK(flags); 1160 remove_SC(&ISSUE_SC, SCpnt); 1161 DO_UNLOCK(flags); 1162 } 1163 1164 SCpnt->cmd_len = old_cmd_len; 1165 1166 DO_LOCK(flags); 1167 1168 if(SCpnt->SCp.phase & resetted) { 1169 HOSTDATA(shpnt)->commands--; 1170 if (!HOSTDATA(shpnt)->commands) 1171 SETPORT(PORTA, 0); 1172 kfree(SCpnt->host_scribble); 1173 SCpnt->host_scribble=NULL; 1174 1175 ret = SUCCESS; 1176 } else { 1177 /* requeue */ 1178 if(!issued) { 1179 append_SC(&ISSUE_SC, SCpnt); 1180 } else if(disconnected) { 1181 append_SC(&DISCONNECTED_SC, SCpnt); 1182 } 1183 1184 ret = FAILED; 1185 } 1186 1187 DO_UNLOCK(flags); 1188 return ret; 1189} 1190 1191static void free_hard_reset_SCs(struct Scsi_Host *shpnt, Scsi_Cmnd **SCs) 1192{ 1193 Scsi_Cmnd *ptr; 1194 1195 ptr=*SCs; 1196 while(ptr) { 1197 Scsi_Cmnd *next; 1198 1199 if(SCDATA(ptr)) { 1200 next = SCNEXT(ptr); 1201 } else { 1202 printk(DEBUG_LEAD "queue corrupted at %p\n", CMDINFO(ptr), ptr); 1203 next = NULL; 1204 } 1205 1206 if (!ptr->device->soft_reset) { 1207 DPRINTK(debug_eh, DEBUG_LEAD "disconnected command %p removed\n", CMDINFO(ptr), ptr); 1208 remove_SC(SCs, ptr); 1209 HOSTDATA(shpnt)->commands--; 1210 kfree(ptr->host_scribble); 1211 ptr->host_scribble=NULL; 1212 } 1213 1214 ptr = next; 1215 } 1216} 1217 1218/* 1219 * Reset the bus 1220 * 1221 */ 1222static int aha152x_bus_reset_host(struct Scsi_Host *shpnt) 1223{ 1224 unsigned long flags; 1225 1226 DO_LOCK(flags); 1227 1228#if defined(AHA152X_DEBUG) 1229 if(HOSTDATA(shpnt)->debug & debug_eh) { 1230 printk(KERN_DEBUG "scsi%d: bus reset", shpnt->host_no); 1231 show_queues(shpnt); 1232 } 1233#endif 1234 1235 free_hard_reset_SCs(shpnt, &ISSUE_SC); 1236 free_hard_reset_SCs(shpnt, &DISCONNECTED_SC); 1237 1238 DPRINTK(debug_eh, KERN_DEBUG "scsi%d: resetting bus\n", shpnt->host_no); 1239 1240 SETPORT(SCSISEQ, SCSIRSTO); 1241 mdelay(256); 1242 SETPORT(SCSISEQ, 0); 1243 mdelay(DELAY); 1244 1245 DPRINTK(debug_eh, KERN_DEBUG "scsi%d: bus resetted\n", shpnt->host_no); 1246 1247 setup_expected_interrupts(shpnt); 1248 if(HOSTDATA(shpnt)->commands==0) 1249 SETPORT(PORTA, 0); 1250 1251 DO_UNLOCK(flags); 1252 1253 return SUCCESS; 1254} 1255 1256/* 1257 * Reset the bus 1258 * 1259 */ 1260static int aha152x_bus_reset(Scsi_Cmnd *SCpnt) 1261{ 1262 return aha152x_bus_reset_host(SCpnt->device->host); 1263} 1264 1265/* 1266 * Restore default values to the AIC-6260 registers and reset the fifos 1267 * 1268 */ 1269static void reset_ports(struct Scsi_Host *shpnt) 1270{ 1271 unsigned long flags; 1272 1273 /* disable interrupts */ 1274 SETPORT(DMACNTRL0, RSTFIFO); 1275 1276 SETPORT(SCSISEQ, 0); 1277 1278 SETPORT(SXFRCTL1, 0); 1279 SETPORT(SCSISIG, 0); 1280 SETRATE(0); 1281 1282 /* clear all interrupt conditions */ 1283 SETPORT(SSTAT0, 0x7f); 1284 SETPORT(SSTAT1, 0xef); 1285 1286 SETPORT(SSTAT4, SYNCERR | FWERR | FRERR); 1287 1288 SETPORT(DMACNTRL0, 0); 1289 SETPORT(DMACNTRL1, 0); 1290 1291 SETPORT(BRSTCNTRL, 0xf1); 1292 1293 /* clear SCSI fifos and transfer count */ 1294 SETPORT(SXFRCTL0, CH1|CLRCH1|CLRSTCNT); 1295 SETPORT(SXFRCTL0, CH1); 1296 1297 DO_LOCK(flags); 1298 setup_expected_interrupts(shpnt); 1299 DO_UNLOCK(flags); 1300} 1301 1302/* 1303 * Reset the host (bus and controller) 1304 * 1305 */ 1306int aha152x_host_reset_host(struct Scsi_Host *shpnt) 1307{ 1308 DPRINTK(debug_eh, KERN_DEBUG "scsi%d: host reset\n", shpnt->host_no); 1309 1310 aha152x_bus_reset_host(shpnt); 1311 1312 DPRINTK(debug_eh, KERN_DEBUG "scsi%d: resetting ports\n", shpnt->host_no); 1313 reset_ports(shpnt); 1314 1315 return SUCCESS; 1316} 1317 1318/* 1319 * Reset the host (bus and controller) 1320 * 1321 */ 1322static int aha152x_host_reset(Scsi_Cmnd *SCpnt) 1323{ 1324 return aha152x_host_reset_host(SCpnt->device->host); 1325} 1326 1327/* 1328 * Return the "logical geometry" 1329 * 1330 */ 1331static int aha152x_biosparam(struct scsi_device *sdev, struct block_device *bdev, 1332 sector_t capacity, int *info_array) 1333{ 1334 struct Scsi_Host *shpnt = sdev->host; 1335 1336 /* try default translation */ 1337 info_array[0] = 64; 1338 info_array[1] = 32; 1339 info_array[2] = (unsigned long)capacity / (64 * 32); 1340 1341 /* for disks >1GB do some guessing */ 1342 if (info_array[2] >= 1024) { 1343 int info[3]; 1344 1345 /* try to figure out the geometry from the partition table */ 1346 if (scsicam_bios_param(bdev, capacity, info) < 0 || 1347 !((info[0] == 64 && info[1] == 32) || (info[0] == 255 && info[1] == 63))) { 1348 if (EXT_TRANS) { 1349 printk(KERN_NOTICE 1350 "aha152x: unable to verify geometry for disk with >1GB.\n" 1351 " using extended translation.\n"); 1352 info_array[0] = 255; 1353 info_array[1] = 63; 1354 info_array[2] = (unsigned long)capacity / (255 * 63); 1355 } else { 1356 printk(KERN_NOTICE 1357 "aha152x: unable to verify geometry for disk with >1GB.\n" 1358 " Using default translation. Please verify yourself.\n" 1359 " Perhaps you need to enable extended translation in the driver.\n" 1360 " See Documentation/scsi/aha152x.txt for details.\n"); 1361 } 1362 } else { 1363 info_array[0] = info[0]; 1364 info_array[1] = info[1]; 1365 info_array[2] = info[2]; 1366 1367 if (info[0] == 255 && !EXT_TRANS) { 1368 printk(KERN_NOTICE 1369 "aha152x: current partition table is using extended translation.\n" 1370 " using it also, although it's not explicitly enabled.\n"); 1371 } 1372 } 1373 } 1374 1375 return 0; 1376} 1377 1378/* 1379 * Internal done function 1380 * 1381 */ 1382static void done(struct Scsi_Host *shpnt, int error) 1383{ 1384 if (CURRENT_SC) { 1385 if(DONE_SC) 1386 printk(ERR_LEAD "there's already a completed command %p - will cause abort\n", CMDINFO(CURRENT_SC), DONE_SC); 1387 1388 DONE_SC = CURRENT_SC; 1389 CURRENT_SC = NULL; 1390 DONE_SC->result = error; 1391 } else 1392 printk(KERN_ERR "aha152x: done() called outside of command\n"); 1393} 1394 1395static struct work_struct aha152x_tq; 1396 1397/* 1398 * Run service completions on the card with interrupts enabled. 1399 * 1400 */ 1401static void run(struct work_struct *work) 1402{ 1403 struct aha152x_hostdata *hd; 1404 1405 list_for_each_entry(hd, &aha152x_host_list, host_list) { 1406 struct Scsi_Host *shost = container_of((void *)hd, struct Scsi_Host, hostdata); 1407 1408 is_complete(shost); 1409 } 1410} 1411 1412/* 1413 * Interrupt handler 1414 * 1415 */ 1416static irqreturn_t intr(int irqno, void *dev_id) 1417{ 1418 struct Scsi_Host *shpnt = dev_id; 1419 unsigned long flags; 1420 unsigned char rev, dmacntrl0; 1421 1422 /* 1423 * Read a couple of registers that are known to not be all 1's. If 1424 * we read all 1's (-1), that means that either: 1425 * 1426 * a. The host adapter chip has gone bad, and we cannot control it, 1427 * OR 1428 * b. The host adapter is a PCMCIA card that has been ejected 1429 * 1430 * In either case, we cannot do anything with the host adapter at 1431 * this point in time. So just ignore the interrupt and return. 1432 * In the latter case, the interrupt might actually be meant for 1433 * someone else sharing this IRQ, and that driver will handle it. 1434 */ 1435 rev = GETPORT(REV); 1436 dmacntrl0 = GETPORT(DMACNTRL0); 1437 if ((rev == 0xFF) && (dmacntrl0 == 0xFF)) 1438 return IRQ_NONE; 1439 1440 if( TESTLO(DMASTAT, INTSTAT) ) 1441 return IRQ_NONE; 1442 1443 /* no more interrupts from the controller, while we're busy. 1444 INTEN is restored by the BH handler */ 1445 CLRBITS(DMACNTRL0, INTEN); 1446 1447 DO_LOCK(flags); 1448 if( HOSTDATA(shpnt)->service==0 ) { 1449 HOSTDATA(shpnt)->service=1; 1450 1451 /* Poke the BH handler */ 1452 INIT_WORK(&aha152x_tq, run); 1453 schedule_work(&aha152x_tq); 1454 } 1455 DO_UNLOCK(flags); 1456 1457 return IRQ_HANDLED; 1458} 1459 1460/* 1461 * busfree phase 1462 * - handle completition/disconnection/error of current command 1463 * - start selection for next command (if any) 1464 */ 1465static void busfree_run(struct Scsi_Host *shpnt) 1466{ 1467 unsigned long flags; 1468#if defined(AHA152X_STAT) 1469 int action=0; 1470#endif 1471 1472 SETPORT(SXFRCTL0, CH1|CLRCH1|CLRSTCNT); 1473 SETPORT(SXFRCTL0, CH1); 1474 1475 SETPORT(SSTAT1, CLRBUSFREE); 1476 1477 if(CURRENT_SC) { 1478#if defined(AHA152X_STAT) 1479 action++; 1480#endif 1481 CURRENT_SC->SCp.phase &= ~syncneg; 1482 1483 if(CURRENT_SC->SCp.phase & completed) { 1484 /* target sent COMMAND COMPLETE */ 1485 done(shpnt, (CURRENT_SC->SCp.Status & 0xff) | ((CURRENT_SC->SCp.Message & 0xff) << 8) | (DID_OK << 16)); 1486 1487 } else if(CURRENT_SC->SCp.phase & aborted) { 1488 DPRINTK(debug_eh, DEBUG_LEAD "ABORT sent\n", CMDINFO(CURRENT_SC)); 1489 done(shpnt, (CURRENT_SC->SCp.Status & 0xff) | ((CURRENT_SC->SCp.Message & 0xff) << 8) | (DID_ABORT << 16)); 1490 1491 } else if(CURRENT_SC->SCp.phase & resetted) { 1492 DPRINTK(debug_eh, DEBUG_LEAD "BUS DEVICE RESET sent\n", CMDINFO(CURRENT_SC)); 1493 done(shpnt, (CURRENT_SC->SCp.Status & 0xff) | ((CURRENT_SC->SCp.Message & 0xff) << 8) | (DID_RESET << 16)); 1494 1495 } else if(CURRENT_SC->SCp.phase & disconnected) { 1496 /* target sent DISCONNECT */ 1497 DPRINTK(debug_selection, DEBUG_LEAD "target disconnected at %d/%d\n", 1498 CMDINFO(CURRENT_SC), 1499 scsi_get_resid(CURRENT_SC), 1500 scsi_bufflen(CURRENT_SC)); 1501#if defined(AHA152X_STAT) 1502 HOSTDATA(shpnt)->disconnections++; 1503#endif 1504 append_SC(&DISCONNECTED_SC, CURRENT_SC); 1505 CURRENT_SC->SCp.phase |= 1 << 16; 1506 CURRENT_SC = NULL; 1507 1508 } else { 1509 done(shpnt, DID_ERROR << 16); 1510 } 1511#if defined(AHA152X_STAT) 1512 } else { 1513 HOSTDATA(shpnt)->busfree_without_old_command++; 1514#endif 1515 } 1516 1517 DO_LOCK(flags); 1518 1519 if(DONE_SC) { 1520#if defined(AHA152X_STAT) 1521 action++; 1522#endif 1523 1524 if(DONE_SC->SCp.phase & check_condition) { 1525 struct scsi_cmnd *cmd = HOSTDATA(shpnt)->done_SC; 1526 struct aha152x_scdata *sc = SCDATA(cmd); 1527 1528 1529 scsi_eh_restore_cmnd(cmd, &sc->ses); 1530 1531 cmd->SCp.Status = SAM_STAT_CHECK_CONDITION; 1532 1533 HOSTDATA(shpnt)->commands--; 1534 if (!HOSTDATA(shpnt)->commands) 1535 SETPORT(PORTA, 0); /* turn led off */ 1536 } else if(DONE_SC->SCp.Status==SAM_STAT_CHECK_CONDITION) { 1537#if defined(AHA152X_STAT) 1538 HOSTDATA(shpnt)->busfree_with_check_condition++; 1539#endif 1540 1541 if(!(DONE_SC->SCp.phase & not_issued)) { 1542 struct aha152x_scdata *sc; 1543 Scsi_Cmnd *ptr = DONE_SC; 1544 DONE_SC=NULL; 1545 1546 sc = SCDATA(ptr); 1547 /* It was allocated in aha152x_internal_queue? */ 1548 BUG_ON(!sc); 1549 scsi_eh_prep_cmnd(ptr, &sc->ses, NULL, 0, ~0); 1550 1551 DO_UNLOCK(flags); 1552 aha152x_internal_queue(ptr, NULL, check_condition, ptr->scsi_done); 1553 DO_LOCK(flags); 1554 } 1555 } 1556 1557 if(DONE_SC && DONE_SC->scsi_done) { 1558#if defined(AHA152X_DEBUG) 1559 int hostno=DONE_SC->device->host->host_no; 1560 int id=DONE_SC->device->id & 0xf; 1561 int lun=DONE_SC->device->lun & 0x7; 1562#endif 1563 Scsi_Cmnd *ptr = DONE_SC; 1564 DONE_SC=NULL; 1565 1566 /* turn led off, when no commands are in the driver */ 1567 HOSTDATA(shpnt)->commands--; 1568 if (!HOSTDATA(shpnt)->commands) 1569 SETPORT(PORTA, 0); /* turn led off */ 1570 1571 if(ptr->scsi_done != reset_done) { 1572 kfree(ptr->host_scribble); 1573 ptr->host_scribble=NULL; 1574 } 1575 1576 DO_UNLOCK(flags); 1577 DPRINTK(debug_done, DEBUG_LEAD "calling scsi_done(%p)\n", hostno, id, lun, ptr); 1578 ptr->scsi_done(ptr); 1579 DPRINTK(debug_done, DEBUG_LEAD "scsi_done(%p) returned\n", hostno, id, lun, ptr); 1580 DO_LOCK(flags); 1581 } 1582 1583 DONE_SC=NULL; 1584#if defined(AHA152X_STAT) 1585 } else { 1586 HOSTDATA(shpnt)->busfree_without_done_command++; 1587#endif 1588 } 1589 1590 if(ISSUE_SC) 1591 CURRENT_SC = remove_first_SC(&ISSUE_SC); 1592 1593 DO_UNLOCK(flags); 1594 1595 if(CURRENT_SC) { 1596#if defined(AHA152X_STAT) 1597 action++; 1598#endif 1599 CURRENT_SC->SCp.phase |= selecting; 1600 1601 DPRINTK(debug_selection, DEBUG_LEAD "selecting target\n", CMDINFO(CURRENT_SC)); 1602 1603 /* clear selection timeout */ 1604 SETPORT(SSTAT1, SELTO); 1605 1606 SETPORT(SCSIID, (shpnt->this_id << OID_) | CURRENT_SC->device->id); 1607 SETPORT(SXFRCTL1, (PARITY ? ENSPCHK : 0 ) | ENSTIMER); 1608 SETPORT(SCSISEQ, ENSELO | ENAUTOATNO | (DISCONNECTED_SC ? ENRESELI : 0)); 1609 } else { 1610#if defined(AHA152X_STAT) 1611 HOSTDATA(shpnt)->busfree_without_new_command++; 1612#endif 1613 SETPORT(SCSISEQ, DISCONNECTED_SC ? ENRESELI : 0); 1614 } 1615 1616#if defined(AHA152X_STAT) 1617 if(!action) 1618 HOSTDATA(shpnt)->busfree_without_any_action++; 1619#endif 1620} 1621 1622/* 1623 * Selection done (OUT) 1624 * - queue IDENTIFY message and SDTR to selected target for message out 1625 * (ATN asserted automagically via ENAUTOATNO in busfree()) 1626 */ 1627static void seldo_run(struct Scsi_Host *shpnt) 1628{ 1629 SETPORT(SCSISIG, 0); 1630 SETPORT(SSTAT1, CLRBUSFREE); 1631 SETPORT(SSTAT1, CLRPHASECHG); 1632 1633 CURRENT_SC->SCp.phase &= ~(selecting|not_issued); 1634 1635 SETPORT(SCSISEQ, 0); 1636 1637 if (TESTLO(SSTAT0, SELDO)) { 1638 printk(ERR_LEAD "aha152x: passing bus free condition\n", CMDINFO(CURRENT_SC)); 1639 done(shpnt, DID_NO_CONNECT << 16); 1640 return; 1641 } 1642 1643 SETPORT(SSTAT0, CLRSELDO); 1644 1645 ADDMSGO(IDENTIFY(RECONNECT, CURRENT_SC->device->lun)); 1646 1647 if (CURRENT_SC->SCp.phase & aborting) { 1648 ADDMSGO(ABORT); 1649 } else if (CURRENT_SC->SCp.phase & resetting) { 1650 ADDMSGO(BUS_DEVICE_RESET); 1651 } else if (SYNCNEG==0 && SYNCHRONOUS) { 1652 CURRENT_SC->SCp.phase |= syncneg; 1653 MSGOLEN += spi_populate_sync_msg(&MSGO(MSGOLEN), 50, 8); 1654 SYNCNEG=1; /* negotiation in progress */ 1655 } 1656 1657 SETRATE(SYNCRATE); 1658} 1659 1660/* 1661 * Selection timeout 1662 * - return command to mid-level with failure cause 1663 * 1664 */ 1665static void selto_run(struct Scsi_Host *shpnt) 1666{ 1667 SETPORT(SCSISEQ, 0); 1668 SETPORT(SSTAT1, CLRSELTIMO); 1669 1670 DPRINTK(debug_selection, DEBUG_LEAD "selection timeout\n", CMDINFO(CURRENT_SC)); 1671 1672 if(!CURRENT_SC) { 1673 DPRINTK(debug_selection, DEBUG_LEAD "!CURRENT_SC\n", CMDINFO(CURRENT_SC)); 1674 return; 1675 } 1676 1677 CURRENT_SC->SCp.phase &= ~selecting; 1678 1679 if (CURRENT_SC->SCp.phase & aborted) { 1680 DPRINTK(debug_selection, DEBUG_LEAD "aborted\n", CMDINFO(CURRENT_SC)); 1681 done(shpnt, DID_ABORT << 16); 1682 } else if (TESTLO(SSTAT0, SELINGO)) { 1683 DPRINTK(debug_selection, DEBUG_LEAD "arbitration not won\n", CMDINFO(CURRENT_SC)); 1684 done(shpnt, DID_BUS_BUSY << 16); 1685 } else { 1686 /* ARBITRATION won, but SELECTION failed */ 1687 DPRINTK(debug_selection, DEBUG_LEAD "selection failed\n", CMDINFO(CURRENT_SC)); 1688 done(shpnt, DID_NO_CONNECT << 16); 1689 } 1690} 1691 1692/* 1693 * Selection in done 1694 * - put current command back to issue queue 1695 * (reconnection of a disconnected nexus instead 1696 * of successful selection out) 1697 * 1698 */ 1699static void seldi_run(struct Scsi_Host *shpnt) 1700{ 1701 int selid; 1702 int target; 1703 unsigned long flags; 1704 1705 SETPORT(SCSISIG, 0); 1706 SETPORT(SSTAT0, CLRSELDI); 1707 SETPORT(SSTAT1, CLRBUSFREE); 1708 SETPORT(SSTAT1, CLRPHASECHG); 1709 1710 if(CURRENT_SC) { 1711 if(!(CURRENT_SC->SCp.phase & not_issued)) 1712 printk(ERR_LEAD "command should not have been issued yet\n", CMDINFO(CURRENT_SC)); 1713 1714 DPRINTK(debug_selection, ERR_LEAD "command requeued - reselection\n", CMDINFO(CURRENT_SC)); 1715 1716 DO_LOCK(flags); 1717 append_SC(&ISSUE_SC, CURRENT_SC); 1718 DO_UNLOCK(flags); 1719 1720 CURRENT_SC = NULL; 1721 } 1722 1723 if(!DISCONNECTED_SC) { 1724 DPRINTK(debug_selection, DEBUG_LEAD "unexpected SELDI ", CMDINFO(CURRENT_SC)); 1725 return; 1726 } 1727 1728 RECONN_TARGET=-1; 1729 1730 selid = GETPORT(SELID) & ~(1 << shpnt->this_id); 1731 1732 if (selid==0) { 1733 printk("aha152x%d: target id unknown (%02x)\n", HOSTNO, selid); 1734 return; 1735 } 1736 1737 for(target=7; !(selid & (1 << target)); target--) 1738 ; 1739 1740 if(selid & ~(1 << target)) { 1741 printk("aha152x%d: multiple targets reconnected (%02x)\n", 1742 HOSTNO, selid); 1743 } 1744 1745 1746 SETPORT(SCSIID, (shpnt->this_id << OID_) | target); 1747 SETPORT(SCSISEQ, 0); 1748 1749 SETRATE(HOSTDATA(shpnt)->syncrate[target]); 1750 1751 RECONN_TARGET=target; 1752 DPRINTK(debug_selection, DEBUG_LEAD "target %d reselected (%02x).\n", CMDINFO(CURRENT_SC), target, selid); 1753} 1754 1755static void msgi_run(struct Scsi_Host *shpnt) 1756{ 1757 for(;;) { 1758 int sstat1 = GETPORT(SSTAT1); 1759 1760 if(sstat1 & (PHASECHG|PHASEMIS|BUSFREE) || !(sstat1 & REQINIT)) 1761 return; 1762 1763 if(TESTLO(SSTAT0,SPIORDY)) { 1764 DPRINTK(debug_msgi, DEBUG_LEAD "!SPIORDY\n", CMDINFO(CURRENT_SC)); 1765 return; 1766 } 1767 1768 ADDMSGI(GETPORT(SCSIDAT)); 1769 1770#if defined(AHA152X_DEBUG) 1771 if (HOSTDATA(shpnt)->debug & debug_msgi) { 1772 printk(INFO_LEAD "inbound message %02x ", CMDINFO(CURRENT_SC), MSGI(0)); 1773 spi_print_msg(&MSGI(0)); 1774 printk("\n"); 1775 } 1776#endif 1777 1778 if(!CURRENT_SC) { 1779 if(LASTSTATE!=seldi) { 1780 printk(KERN_ERR "aha152x%d: message in w/o current command not after reselection\n", HOSTNO); 1781 } 1782 1783 /* 1784 * Handle reselection 1785 */ 1786 if(!(MSGI(0) & IDENTIFY_BASE)) { 1787 printk(KERN_ERR "aha152x%d: target didn't identify after reselection\n", HOSTNO); 1788 continue; 1789 } 1790 1791 CURRENT_SC = remove_lun_SC(&DISCONNECTED_SC, RECONN_TARGET, MSGI(0) & 0x3f); 1792 1793 if (!CURRENT_SC) { 1794 show_queues(shpnt); 1795 printk(KERN_ERR "aha152x%d: no disconnected command for target %d/%d\n", HOSTNO, RECONN_TARGET, MSGI(0) & 0x3f); 1796 continue; 1797 } 1798 1799 DPRINTK(debug_msgi, DEBUG_LEAD "target reconnected\n", CMDINFO(CURRENT_SC)); 1800 1801 CURRENT_SC->SCp.Message = MSGI(0); 1802 CURRENT_SC->SCp.phase &= ~disconnected; 1803 1804 MSGILEN=0; 1805 1806 /* next message if any */ 1807 continue; 1808 } 1809 1810 CURRENT_SC->SCp.Message = MSGI(0); 1811 1812 switch (MSGI(0)) { 1813 case DISCONNECT: 1814 if (!RECONNECT) 1815 printk(WARN_LEAD "target was not allowed to disconnect\n", CMDINFO(CURRENT_SC)); 1816 1817 CURRENT_SC->SCp.phase |= disconnected; 1818 break; 1819 1820 case COMMAND_COMPLETE: 1821 if(CURRENT_SC->SCp.phase & completed) 1822 DPRINTK(debug_msgi, DEBUG_LEAD "again COMMAND COMPLETE\n", CMDINFO(CURRENT_SC)); 1823 1824 CURRENT_SC->SCp.phase |= completed; 1825 break; 1826 1827 case MESSAGE_REJECT: 1828 if (SYNCNEG==1) { 1829 printk(INFO_LEAD "Synchronous Data Transfer Request was rejected\n", CMDINFO(CURRENT_SC)); 1830 SYNCNEG=2; /* negotiation completed */ 1831 } else 1832 printk(INFO_LEAD "inbound message (MESSAGE REJECT)\n", CMDINFO(CURRENT_SC)); 1833 break; 1834 1835 case SAVE_POINTERS: 1836 break; 1837 1838 case RESTORE_POINTERS: 1839 break; 1840 1841 case EXTENDED_MESSAGE: 1842 if(MSGILEN<2 || MSGILEN<MSGI(1)+2) { 1843 /* not yet completed */ 1844 continue; 1845 } 1846 1847 switch (MSGI(2)) { 1848 case EXTENDED_SDTR: 1849 { 1850 long ticks; 1851 1852 if (MSGI(1) != 3) { 1853 printk(ERR_LEAD "SDTR message length!=3\n", CMDINFO(CURRENT_SC)); 1854 break; 1855 } 1856 1857 if (!HOSTDATA(shpnt)->synchronous) 1858 break; 1859 1860 printk(INFO_LEAD, CMDINFO(CURRENT_SC)); 1861 spi_print_msg(&MSGI(0)); 1862 printk("\n"); 1863 1864 ticks = (MSGI(3) * 4 + 49) / 50; 1865 1866 if (syncneg) { 1867 /* negotiation in progress */ 1868 if (ticks > 9 || MSGI(4) < 1 || MSGI(4) > 8) { 1869 ADDMSGO(MESSAGE_REJECT); 1870 printk(INFO_LEAD "received Synchronous Data Transfer Request invalid - rejected\n", CMDINFO(CURRENT_SC)); 1871 break; 1872 } 1873 1874 SYNCRATE |= ((ticks - 2) << 4) + MSGI(4); 1875 } else if (ticks <= 9 && MSGI(4) >= 1) { 1876 ADDMSGO(EXTENDED_MESSAGE); 1877 ADDMSGO(3); 1878 ADDMSGO(EXTENDED_SDTR); 1879 if (ticks < 4) { 1880 ticks = 4; 1881 ADDMSGO(50); 1882 } else 1883 ADDMSGO(MSGI(3)); 1884 1885 if (MSGI(4) > 8) 1886 MSGI(4) = 8; 1887 1888 ADDMSGO(MSGI(4)); 1889 1890 SYNCRATE |= ((ticks - 2) << 4) + MSGI(4); 1891 } else { 1892 /* requested SDTR is too slow, do it asynchronously */ 1893 printk(INFO_LEAD "Synchronous Data Transfer Request too slow - Rejecting\n", CMDINFO(CURRENT_SC)); 1894 ADDMSGO(MESSAGE_REJECT); 1895 } 1896 1897 SYNCNEG=2; /* negotiation completed */ 1898 SETRATE(SYNCRATE); 1899 } 1900 break; 1901 1902 case BUS_DEVICE_RESET: 1903 { 1904 int i; 1905 1906 for(i=0; i<8; i++) { 1907 HOSTDATA(shpnt)->syncrate[i]=0; 1908 HOSTDATA(shpnt)->syncneg[i]=0; 1909 } 1910 1911 } 1912 break; 1913 1914 case EXTENDED_MODIFY_DATA_POINTER: 1915 case EXTENDED_EXTENDED_IDENTIFY: 1916 case EXTENDED_WDTR: 1917 default: 1918 ADDMSGO(MESSAGE_REJECT); 1919 break; 1920 } 1921 break; 1922 } 1923 1924 MSGILEN=0; 1925 } 1926} 1927 1928static void msgi_end(struct Scsi_Host *shpnt) 1929{ 1930 if(MSGILEN>0) 1931 printk(WARN_LEAD "target left before message completed (%d)\n", CMDINFO(CURRENT_SC), MSGILEN); 1932 1933 if (MSGOLEN > 0 && !(GETPORT(SSTAT1) & BUSFREE)) { 1934 DPRINTK(debug_msgi, DEBUG_LEAD "msgo pending\n", CMDINFO(CURRENT_SC)); 1935 SETPORT(SCSISIG, P_MSGI | SIG_ATNO); 1936 } 1937} 1938 1939/* 1940 * message out phase 1941 * 1942 */ 1943static void msgo_init(struct Scsi_Host *shpnt) 1944{ 1945 if(MSGOLEN==0) { 1946 if((CURRENT_SC->SCp.phase & syncneg) && SYNCNEG==2 && SYNCRATE==0) { 1947 ADDMSGO(IDENTIFY(RECONNECT, CURRENT_SC->device->lun)); 1948 } else { 1949 printk(INFO_LEAD "unexpected MESSAGE OUT phase; rejecting\n", CMDINFO(CURRENT_SC)); 1950 ADDMSGO(MESSAGE_REJECT); 1951 } 1952 } 1953 1954#if defined(AHA152X_DEBUG) 1955 if(HOSTDATA(shpnt)->debug & debug_msgo) { 1956 int i; 1957 1958 printk(DEBUG_LEAD "messages( ", CMDINFO(CURRENT_SC)); 1959 for (i=0; i<MSGOLEN; i+=spi_print_msg(&MSGO(i)), printk(" ")) 1960 ; 1961 printk(")\n"); 1962 } 1963#endif 1964} 1965 1966/* 1967 * message out phase 1968 * 1969 */ 1970static void msgo_run(struct Scsi_Host *shpnt) 1971{ 1972 if(MSGO_I==MSGOLEN) 1973 DPRINTK(debug_msgo, DEBUG_LEAD "messages all sent (%d/%d)\n", CMDINFO(CURRENT_SC), MSGO_I, MSGOLEN); 1974 1975 while(MSGO_I<MSGOLEN) { 1976 DPRINTK(debug_msgo, DEBUG_LEAD "message byte %02x (%d/%d)\n", CMDINFO(CURRENT_SC), MSGO(MSGO_I), MSGO_I, MSGOLEN); 1977 1978 if(TESTLO(SSTAT0, SPIORDY)) { 1979 DPRINTK(debug_msgo, DEBUG_LEAD "!SPIORDY\n", CMDINFO(CURRENT_SC)); 1980 return; 1981 } 1982 1983 if (MSGO_I==MSGOLEN-1) { 1984 /* Leave MESSAGE OUT after transfer */ 1985 SETPORT(SSTAT1, CLRATNO); 1986 } 1987 1988 1989 if (MSGO(MSGO_I) & IDENTIFY_BASE) 1990 CURRENT_SC->SCp.phase |= identified; 1991 1992 if (MSGO(MSGO_I)==ABORT) 1993 CURRENT_SC->SCp.phase |= aborted; 1994 1995 if (MSGO(MSGO_I)==BUS_DEVICE_RESET) 1996 CURRENT_SC->SCp.phase |= resetted; 1997 1998 SETPORT(SCSIDAT, MSGO(MSGO_I++)); 1999 } 2000} 2001 2002static void msgo_end(struct Scsi_Host *shpnt) 2003{ 2004 if(MSGO_I<MSGOLEN) { 2005 printk(ERR_LEAD "message sent incompletely (%d/%d)\n", CMDINFO(CURRENT_SC), MSGO_I, MSGOLEN); 2006 if(SYNCNEG==1) { 2007 printk(INFO_LEAD "Synchronous Data Transfer Request was rejected\n", CMDINFO(CURRENT_SC)); 2008 SYNCNEG=2; 2009 } 2010 } 2011 2012 MSGO_I = 0; 2013 MSGOLEN = 0; 2014} 2015 2016/* 2017 * command phase 2018 * 2019 */ 2020static void cmd_init(struct Scsi_Host *shpnt) 2021{ 2022 if (CURRENT_SC->SCp.sent_command) { 2023 printk(ERR_LEAD "command already sent\n", CMDINFO(CURRENT_SC)); 2024 done(shpnt, DID_ERROR << 16); 2025 return; 2026 } 2027 2028#if defined(AHA152X_DEBUG) 2029 if (HOSTDATA(shpnt)->debug & debug_cmd) { 2030 printk(DEBUG_LEAD "cmd_init: ", CMDINFO(CURRENT_SC)); 2031 __scsi_print_command(CURRENT_SC->cmnd); 2032 } 2033#endif 2034 2035 CMD_I=0; 2036} 2037 2038/* 2039 * command phase 2040 * 2041 */ 2042static void cmd_run(struct Scsi_Host *shpnt) 2043{ 2044 if(CMD_I==CURRENT_SC->cmd_len) { 2045 DPRINTK(debug_cmd, DEBUG_LEAD "command already completely sent (%d/%d)", CMDINFO(CURRENT_SC), CMD_I, CURRENT_SC->cmd_len); 2046 disp_ports(shpnt); 2047 } 2048 2049 while(CMD_I<CURRENT_SC->cmd_len) { 2050 DPRINTK(debug_cmd, DEBUG_LEAD "command byte %02x (%d/%d)\n", CMDINFO(CURRENT_SC), CURRENT_SC->cmnd[CMD_I], CMD_I, CURRENT_SC->cmd_len); 2051 2052 if(TESTLO(SSTAT0, SPIORDY)) { 2053 DPRINTK(debug_cmd, DEBUG_LEAD "!SPIORDY\n", CMDINFO(CURRENT_SC)); 2054 return; 2055 } 2056 2057 SETPORT(SCSIDAT, CURRENT_SC->cmnd[CMD_I++]); 2058 } 2059} 2060 2061static void cmd_end(struct Scsi_Host *shpnt) 2062{ 2063 if(CMD_I<CURRENT_SC->cmd_len) 2064 printk(ERR_LEAD "command sent incompletely (%d/%d)\n", CMDINFO(CURRENT_SC), CMD_I, CURRENT_SC->cmd_len); 2065 else 2066 CURRENT_SC->SCp.sent_command++; 2067} 2068 2069/* 2070 * status phase 2071 * 2072 */ 2073static void status_run(struct Scsi_Host *shpnt) 2074{ 2075 if(TESTLO(SSTAT0,SPIORDY)) { 2076 DPRINTK(debug_status, DEBUG_LEAD "!SPIORDY\n", CMDINFO(CURRENT_SC)); 2077 return; 2078 } 2079 2080 CURRENT_SC->SCp.Status = GETPORT(SCSIDAT); 2081 2082#if defined(AHA152X_DEBUG) 2083 if (HOSTDATA(shpnt)->debug & debug_status) { 2084 printk(DEBUG_LEAD "inbound status %02x ", CMDINFO(CURRENT_SC), CURRENT_SC->SCp.Status); 2085 scsi_print_status(CURRENT_SC->SCp.Status); 2086 printk("\n"); 2087 } 2088#endif 2089} 2090 2091/* 2092 * data in phase 2093 * 2094 */ 2095static void datai_init(struct Scsi_Host *shpnt) 2096{ 2097 SETPORT(DMACNTRL0, RSTFIFO); 2098 SETPORT(DMACNTRL0, RSTFIFO|ENDMA); 2099 2100 SETPORT(SXFRCTL0, CH1|CLRSTCNT); 2101 SETPORT(SXFRCTL0, CH1|SCSIEN|DMAEN); 2102 2103 SETPORT(SIMODE0, 0); 2104 SETPORT(SIMODE1, ENSCSIPERR | ENSCSIRST | ENPHASEMIS | ENBUSFREE); 2105 2106 DATA_LEN=0; 2107 DPRINTK(debug_datai, 2108 DEBUG_LEAD "datai_init: request_bufflen=%d resid=%d\n", 2109 CMDINFO(CURRENT_SC), scsi_bufflen(CURRENT_SC), 2110 scsi_get_resid(CURRENT_SC)); 2111} 2112 2113static void datai_run(struct Scsi_Host *shpnt) 2114{ 2115 unsigned long the_time; 2116 int fifodata, data_count; 2117 2118 /* 2119 * loop while the phase persists or the fifos are not empty 2120 * 2121 */ 2122 while(TESTLO(DMASTAT, INTSTAT) || TESTLO(DMASTAT, DFIFOEMP) || TESTLO(SSTAT2, SEMPTY)) { 2123 the_time=jiffies + 100*HZ; 2124 while(TESTLO(DMASTAT, DFIFOFULL|INTSTAT) && time_before(jiffies,the_time)) 2125 barrier(); 2126 2127 if(TESTLO(DMASTAT, DFIFOFULL|INTSTAT)) { 2128 printk(ERR_LEAD "datai timeout", CMDINFO(CURRENT_SC)); 2129 disp_ports(shpnt); 2130 break; 2131 } 2132 2133 if(TESTHI(DMASTAT, DFIFOFULL)) { 2134 fifodata = 128; 2135 } else { 2136 the_time=jiffies + 100*HZ; 2137 while(TESTLO(SSTAT2, SEMPTY) && time_before(jiffies,the_time)) 2138 barrier(); 2139 2140 if(TESTLO(SSTAT2, SEMPTY)) { 2141 printk(ERR_LEAD "datai sempty timeout", CMDINFO(CURRENT_SC)); 2142 disp_ports(shpnt); 2143 break; 2144 } 2145 2146 fifodata = GETPORT(FIFOSTAT); 2147 } 2148 2149 if(CURRENT_SC->SCp.this_residual>0) { 2150 while(fifodata>0 && CURRENT_SC->SCp.this_residual>0) { 2151 data_count = fifodata>CURRENT_SC->SCp.this_residual ? 2152 CURRENT_SC->SCp.this_residual : 2153 fifodata; 2154 fifodata -= data_count; 2155 2156 if(data_count & 1) { 2157 DPRINTK(debug_datai, DEBUG_LEAD "8bit\n", CMDINFO(CURRENT_SC)); 2158 SETPORT(DMACNTRL0, ENDMA|_8BIT); 2159 *CURRENT_SC->SCp.ptr++ = GETPORT(DATAPORT); 2160 CURRENT_SC->SCp.this_residual--; 2161 DATA_LEN++; 2162 SETPORT(DMACNTRL0, ENDMA); 2163 } 2164 2165 if(data_count > 1) { 2166 DPRINTK(debug_datai, DEBUG_LEAD "16bit(%d)\n", CMDINFO(CURRENT_SC), data_count); 2167 data_count >>= 1; 2168 insw(DATAPORT, CURRENT_SC->SCp.ptr, data_count); 2169 CURRENT_SC->SCp.ptr += 2 * data_count; 2170 CURRENT_SC->SCp.this_residual -= 2 * data_count; 2171 DATA_LEN += 2 * data_count; 2172 } 2173 2174 if(CURRENT_SC->SCp.this_residual==0 && CURRENT_SC->SCp.buffers_residual>0) { 2175 /* advance to next buffer */ 2176 CURRENT_SC->SCp.buffers_residual--; 2177 CURRENT_SC->SCp.buffer++; 2178 CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer); 2179 CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length; 2180 } 2181 } 2182 } else if(fifodata>0) { 2183 printk(ERR_LEAD "no buffers left for %d(%d) bytes (data overrun!?)\n", CMDINFO(CURRENT_SC), fifodata, GETPORT(FIFOSTAT)); 2184 SETPORT(DMACNTRL0, ENDMA|_8BIT); 2185 while(fifodata>0) { 2186 int data; 2187 data=GETPORT(DATAPORT); 2188 DPRINTK(debug_datai, DEBUG_LEAD "data=%02x\n", CMDINFO(CURRENT_SC), data); 2189 fifodata--; 2190 DATA_LEN++; 2191 } 2192 SETPORT(DMACNTRL0, ENDMA|_8BIT); 2193 } 2194 } 2195 2196 if(TESTLO(DMASTAT, INTSTAT) || 2197 TESTLO(DMASTAT, DFIFOEMP) || 2198 TESTLO(SSTAT2, SEMPTY) || 2199 GETPORT(FIFOSTAT)>0) { 2200 /* 2201 * something went wrong, if there's something left in the fifos 2202 * or the phase didn't change 2203 */ 2204 printk(ERR_LEAD "fifos should be empty and phase should have changed\n", CMDINFO(CURRENT_SC)); 2205 disp_ports(shpnt); 2206 } 2207 2208 if(DATA_LEN!=GETSTCNT()) { 2209 printk(ERR_LEAD 2210 "manual transfer count differs from automatic (count=%d;stcnt=%d;diff=%d;fifostat=%d)", 2211 CMDINFO(CURRENT_SC), DATA_LEN, GETSTCNT(), GETSTCNT()-DATA_LEN, GETPORT(FIFOSTAT)); 2212 disp_ports(shpnt); 2213 mdelay(10000); 2214 } 2215} 2216 2217static void datai_end(struct Scsi_Host *shpnt) 2218{ 2219 CMD_INC_RESID(CURRENT_SC, -GETSTCNT()); 2220 2221 DPRINTK(debug_datai, 2222 DEBUG_LEAD "datai_end: request_bufflen=%d resid=%d stcnt=%d\n", 2223 CMDINFO(CURRENT_SC), scsi_bufflen(CURRENT_SC), 2224 scsi_get_resid(CURRENT_SC), GETSTCNT()); 2225 2226 SETPORT(SXFRCTL0, CH1|CLRSTCNT); 2227 SETPORT(DMACNTRL0, 0); 2228} 2229 2230/* 2231 * data out phase 2232 * 2233 */ 2234static void datao_init(struct Scsi_Host *shpnt) 2235{ 2236 SETPORT(DMACNTRL0, WRITE_READ | RSTFIFO); 2237 SETPORT(DMACNTRL0, WRITE_READ | ENDMA); 2238 2239 SETPORT(SXFRCTL0, CH1|CLRSTCNT); 2240 SETPORT(SXFRCTL0, CH1|SCSIEN|DMAEN); 2241 2242 SETPORT(SIMODE0, 0); 2243 SETPORT(SIMODE1, ENSCSIPERR | ENSCSIRST | ENPHASEMIS | ENBUSFREE ); 2244 2245 DATA_LEN = scsi_get_resid(CURRENT_SC); 2246 2247 DPRINTK(debug_datao, 2248 DEBUG_LEAD "datao_init: request_bufflen=%d; resid=%d\n", 2249 CMDINFO(CURRENT_SC), scsi_bufflen(CURRENT_SC), 2250 scsi_get_resid(CURRENT_SC)); 2251} 2252 2253static void datao_run(struct Scsi_Host *shpnt) 2254{ 2255 unsigned long the_time; 2256 int data_count; 2257 2258 /* until phase changes or all data sent */ 2259 while(TESTLO(DMASTAT, INTSTAT) && CURRENT_SC->SCp.this_residual>0) { 2260 data_count = 128; 2261 if(data_count > CURRENT_SC->SCp.this_residual) 2262 data_count=CURRENT_SC->SCp.this_residual; 2263 2264 if(TESTLO(DMASTAT, DFIFOEMP)) { 2265 printk(ERR_LEAD "datao fifo not empty (%d)", CMDINFO(CURRENT_SC), GETPORT(FIFOSTAT)); 2266 disp_ports(shpnt); 2267 break; 2268 } 2269 2270 if(data_count & 1) { 2271 SETPORT(DMACNTRL0,WRITE_READ|ENDMA|_8BIT); 2272 SETPORT(DATAPORT, *CURRENT_SC->SCp.ptr++); 2273 CURRENT_SC->SCp.this_residual--; 2274 CMD_INC_RESID(CURRENT_SC, -1); 2275 SETPORT(DMACNTRL0,WRITE_READ|ENDMA); 2276 } 2277 2278 if(data_count > 1) { 2279 data_count >>= 1; 2280 outsw(DATAPORT, CURRENT_SC->SCp.ptr, data_count); 2281 CURRENT_SC->SCp.ptr += 2 * data_count; 2282 CURRENT_SC->SCp.this_residual -= 2 * data_count; 2283 CMD_INC_RESID(CURRENT_SC, -2 * data_count); 2284 } 2285 2286 if(CURRENT_SC->SCp.this_residual==0 && CURRENT_SC->SCp.buffers_residual>0) { 2287 /* advance to next buffer */ 2288 CURRENT_SC->SCp.buffers_residual--; 2289 CURRENT_SC->SCp.buffer++; 2290 CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer); 2291 CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length; 2292 } 2293 2294 the_time=jiffies + 100*HZ; 2295 while(TESTLO(DMASTAT, DFIFOEMP|INTSTAT) && time_before(jiffies,the_time)) 2296 barrier(); 2297 2298 if(TESTLO(DMASTAT, DFIFOEMP|INTSTAT)) { 2299 printk(ERR_LEAD "dataout timeout", CMDINFO(CURRENT_SC)); 2300 disp_ports(shpnt); 2301 break; 2302 } 2303 } 2304} 2305 2306static void datao_end(struct Scsi_Host *shpnt) 2307{ 2308 if(TESTLO(DMASTAT, DFIFOEMP)) { 2309 int data_count = (DATA_LEN - scsi_get_resid(CURRENT_SC)) - 2310 GETSTCNT(); 2311 2312 DPRINTK(debug_datao, DEBUG_LEAD "datao: %d bytes to resend (%d written, %d transferred)\n", 2313 CMDINFO(CURRENT_SC), 2314 data_count, 2315 DATA_LEN - scsi_get_resid(CURRENT_SC), 2316 GETSTCNT()); 2317 2318 CMD_INC_RESID(CURRENT_SC, data_count); 2319 2320 data_count -= CURRENT_SC->SCp.ptr - 2321 SG_ADDRESS(CURRENT_SC->SCp.buffer); 2322 while(data_count>0) { 2323 CURRENT_SC->SCp.buffer--; 2324 CURRENT_SC->SCp.buffers_residual++; 2325 data_count -= CURRENT_SC->SCp.buffer->length; 2326 } 2327 CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer) - 2328 data_count; 2329 CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length + 2330 data_count; 2331 } 2332 2333 DPRINTK(debug_datao, DEBUG_LEAD "datao_end: request_bufflen=%d; resid=%d; stcnt=%d\n", 2334 CMDINFO(CURRENT_SC), 2335 scsi_bufflen(CURRENT_SC), 2336 scsi_get_resid(CURRENT_SC), 2337 GETSTCNT()); 2338 2339 SETPORT(SXFRCTL0, CH1|CLRCH1|CLRSTCNT); 2340 SETPORT(SXFRCTL0, CH1); 2341 2342 SETPORT(DMACNTRL0, 0); 2343} 2344 2345/* 2346 * figure out what state we're in 2347 * 2348 */ 2349static int update_state(struct Scsi_Host *shpnt) 2350{ 2351 int dataphase=0; 2352 unsigned int stat0 = GETPORT(SSTAT0); 2353 unsigned int stat1 = GETPORT(SSTAT1); 2354 2355 PREVSTATE = STATE; 2356 STATE=unknown; 2357 2358 if(stat1 & SCSIRSTI) { 2359 STATE=rsti; 2360 SETPORT(SCSISEQ,0); 2361 SETPORT(SSTAT1,SCSIRSTI); 2362 } else if(stat0 & SELDI && PREVSTATE==busfree) { 2363 STATE=seldi; 2364 } else if(stat0 & SELDO && CURRENT_SC && (CURRENT_SC->SCp.phase & selecting)) { 2365 STATE=seldo; 2366 } else if(stat1 & SELTO) { 2367 STATE=selto; 2368 } else if(stat1 & BUSFREE) { 2369 STATE=busfree; 2370 SETPORT(SSTAT1,BUSFREE); 2371 } else if(stat1 & SCSIPERR) { 2372 STATE=parerr; 2373 SETPORT(SSTAT1,SCSIPERR); 2374 } else if(stat1 & REQINIT) { 2375 switch(GETPORT(SCSISIG) & P_MASK) { 2376 case P_MSGI: STATE=msgi; break; 2377 case P_MSGO: STATE=msgo; break; 2378 case P_DATAO: STATE=datao; break; 2379 case P_DATAI: STATE=datai; break; 2380 case P_STATUS: STATE=status; break; 2381 case P_CMD: STATE=cmd; break; 2382 } 2383 dataphase=1; 2384 } 2385 2386 if((stat0 & SELDI) && STATE!=seldi && !dataphase) { 2387 printk(INFO_LEAD "reselection missed?", CMDINFO(CURRENT_SC)); 2388 disp_ports(shpnt); 2389 } 2390 2391 if(STATE!=PREVSTATE) { 2392 LASTSTATE=PREVSTATE; 2393 } 2394 2395 return dataphase; 2396} 2397 2398static void parerr_run(struct Scsi_Host *shpnt) 2399{ 2400 printk(ERR_LEAD "parity error\n", CMDINFO(CURRENT_SC)); 2401 done(shpnt, DID_PARITY << 16); 2402} 2403 2404/* 2405 * handle reset in 2406 * 2407 */ 2408static void rsti_run(struct Scsi_Host *shpnt) 2409{ 2410 Scsi_Cmnd *ptr; 2411 2412 printk(KERN_NOTICE "aha152x%d: scsi reset in\n", HOSTNO); 2413 2414 ptr=DISCONNECTED_SC; 2415 while(ptr) { 2416 Scsi_Cmnd *next = SCNEXT(ptr); 2417 2418 if (!ptr->device->soft_reset) { 2419 remove_SC(&DISCONNECTED_SC, ptr); 2420 2421 kfree(ptr->host_scribble); 2422 ptr->host_scribble=NULL; 2423 2424 ptr->result = DID_RESET << 16; 2425 ptr->scsi_done(ptr); 2426 } 2427 2428 ptr = next; 2429 } 2430 2431 if(CURRENT_SC && !CURRENT_SC->device->soft_reset) 2432 done(shpnt, DID_RESET << 16 ); 2433} 2434 2435 2436/* 2437 * bottom-half handler 2438 * 2439 */ 2440static void is_complete(struct Scsi_Host *shpnt) 2441{ 2442 int dataphase; 2443 unsigned long flags; 2444 int pending; 2445 2446 if(!shpnt) 2447 return; 2448 2449 DO_LOCK(flags); 2450 2451 if( HOSTDATA(shpnt)->service==0 ) { 2452 DO_UNLOCK(flags); 2453 return; 2454 } 2455 2456 HOSTDATA(shpnt)->service = 0; 2457 2458 if(HOSTDATA(shpnt)->in_intr) { 2459 DO_UNLOCK(flags); 2460 /* aha152x_error never returns.. */ 2461 aha152x_error(shpnt, "bottom-half already running!?"); 2462 } 2463 HOSTDATA(shpnt)->in_intr++; 2464 2465 /* 2466 * loop while there are interrupt conditions pending 2467 * 2468 */ 2469 do { 2470 unsigned long start = jiffies; 2471 DO_UNLOCK(flags); 2472 2473 dataphase=update_state(shpnt); 2474 2475 DPRINTK(debug_phases, LEAD "start %s %s(%s)\n", CMDINFO(CURRENT_SC), states[STATE].name, states[PREVSTATE].name, states[LASTSTATE].name); 2476 2477 /* 2478 * end previous state 2479 * 2480 */ 2481 if(PREVSTATE!=STATE && states[PREVSTATE].end) 2482 states[PREVSTATE].end(shpnt); 2483 2484 /* 2485 * disable SPIO mode if previous phase used it 2486 * and this one doesn't 2487 * 2488 */ 2489 if(states[PREVSTATE].spio && !states[STATE].spio) { 2490 SETPORT(SXFRCTL0, CH1); 2491 SETPORT(DMACNTRL0, 0); 2492 if(CURRENT_SC) 2493 CURRENT_SC->SCp.phase &= ~spiordy; 2494 } 2495 2496 /* 2497 * accept current dataphase phase 2498 * 2499 */ 2500 if(dataphase) { 2501 SETPORT(SSTAT0, REQINIT); 2502 SETPORT(SCSISIG, GETPORT(SCSISIG) & P_MASK); 2503 SETPORT(SSTAT1, PHASECHG); 2504 } 2505 2506 /* 2507 * enable SPIO mode if previous didn't use it 2508 * and this one does 2509 * 2510 */ 2511 if(!states[PREVSTATE].spio && states[STATE].spio) { 2512 SETPORT(DMACNTRL0, 0); 2513 SETPORT(SXFRCTL0, CH1|SPIOEN); 2514 if(CURRENT_SC) 2515 CURRENT_SC->SCp.phase |= spiordy; 2516 } 2517 2518 /* 2519 * initialize for new state 2520 * 2521 */ 2522 if(PREVSTATE!=STATE && states[STATE].init) 2523 states[STATE].init(shpnt); 2524 2525 /* 2526 * handle current state 2527 * 2528 */ 2529 if(states[STATE].run) 2530 states[STATE].run(shpnt); 2531 else 2532 printk(ERR_LEAD "unexpected state (%x)\n", CMDINFO(CURRENT_SC), STATE); 2533 2534 /* 2535 * setup controller to interrupt on 2536 * the next expected condition and 2537 * loop if it's already there 2538 * 2539 */ 2540 DO_LOCK(flags); 2541 pending=setup_expected_interrupts(shpnt); 2542#if defined(AHA152X_STAT) 2543 HOSTDATA(shpnt)->count[STATE]++; 2544 if(PREVSTATE!=STATE) 2545 HOSTDATA(shpnt)->count_trans[STATE]++; 2546 HOSTDATA(shpnt)->time[STATE] += jiffies-start; 2547#endif 2548 2549 DPRINTK(debug_phases, LEAD "end %s %s(%s)\n", CMDINFO(CURRENT_SC), states[STATE].name, states[PREVSTATE].name, states[LASTSTATE].name); 2550 } while(pending); 2551 2552 /* 2553 * enable interrupts and leave bottom-half 2554 * 2555 */ 2556 HOSTDATA(shpnt)->in_intr--; 2557 SETBITS(DMACNTRL0, INTEN); 2558 DO_UNLOCK(flags); 2559} 2560 2561 2562/* 2563 * Dump the current driver status and panic 2564 */ 2565static void aha152x_error(struct Scsi_Host *shpnt, char *msg) 2566{ 2567 printk(KERN_EMERG "\naha152x%d: %s\n", HOSTNO, msg); 2568 show_queues(shpnt); 2569 panic("aha152x panic\n"); 2570} 2571 2572/* 2573 * Display registers of AIC-6260 2574 */ 2575static void disp_ports(struct Scsi_Host *shpnt) 2576{ 2577#if defined(AHA152X_DEBUG) 2578 int s; 2579 2580 printk("\n%s: %s(%s) ", 2581 CURRENT_SC ? "busy" : "waiting", 2582 states[STATE].name, 2583 states[PREVSTATE].name); 2584 2585 s = GETPORT(SCSISEQ); 2586 printk("SCSISEQ( "); 2587 if (s & TEMODEO) 2588 printk("TARGET MODE "); 2589 if (s & ENSELO) 2590 printk("SELO "); 2591 if (s & ENSELI) 2592 printk("SELI "); 2593 if (s & ENRESELI) 2594 printk("RESELI "); 2595 if (s & ENAUTOATNO) 2596 printk("AUTOATNO "); 2597 if (s & ENAUTOATNI) 2598 printk("AUTOATNI "); 2599 if (s & ENAUTOATNP) 2600 printk("AUTOATNP "); 2601 if (s & SCSIRSTO) 2602 printk("SCSIRSTO "); 2603 printk(");"); 2604 2605 printk(" SCSISIG("); 2606 s = GETPORT(SCSISIG); 2607 switch (s & P_MASK) { 2608 case P_DATAO: 2609 printk("DATA OUT"); 2610 break; 2611 case P_DATAI: 2612 printk("DATA IN"); 2613 break; 2614 case P_CMD: 2615 printk("COMMAND"); 2616 break; 2617 case P_STATUS: 2618 printk("STATUS"); 2619 break; 2620 case P_MSGO: 2621 printk("MESSAGE OUT"); 2622 break; 2623 case P_MSGI: 2624 printk("MESSAGE IN"); 2625 break; 2626 default: 2627 printk("*invalid*"); 2628 break; 2629 } 2630 2631 printk("); "); 2632 2633 printk("INTSTAT (%s); ", TESTHI(DMASTAT, INTSTAT) ? "hi" : "lo"); 2634 2635 printk("SSTAT( "); 2636 s = GETPORT(SSTAT0); 2637 if (s & TARGET) 2638 printk("TARGET "); 2639 if (s & SELDO) 2640 printk("SELDO "); 2641 if (s & SELDI) 2642 printk("SELDI "); 2643 if (s & SELINGO) 2644 printk("SELINGO "); 2645 if (s & SWRAP) 2646 printk("SWRAP "); 2647 if (s & SDONE) 2648 printk("SDONE "); 2649 if (s & SPIORDY) 2650 printk("SPIORDY "); 2651 if (s & DMADONE) 2652 printk("DMADONE "); 2653 2654 s = GETPORT(SSTAT1); 2655 if (s & SELTO) 2656 printk("SELTO "); 2657 if (s & ATNTARG) 2658 printk("ATNTARG "); 2659 if (s & SCSIRSTI) 2660 printk("SCSIRSTI "); 2661 if (s & PHASEMIS) 2662 printk("PHASEMIS "); 2663 if (s & BUSFREE) 2664 printk("BUSFREE "); 2665 if (s & SCSIPERR) 2666 printk("SCSIPERR "); 2667 if (s & PHASECHG) 2668 printk("PHASECHG "); 2669 if (s & REQINIT) 2670 printk("REQINIT "); 2671 printk("); "); 2672 2673 2674 printk("SSTAT( "); 2675 2676 s = GETPORT(SSTAT0) & GETPORT(SIMODE0); 2677 2678 if (s & TARGET) 2679 printk("TARGET "); 2680 if (s & SELDO) 2681 printk("SELDO "); 2682 if (s & SELDI) 2683 printk("SELDI "); 2684 if (s & SELINGO) 2685 printk("SELINGO "); 2686 if (s & SWRAP) 2687 printk("SWRAP "); 2688 if (s & SDONE) 2689 printk("SDONE "); 2690 if (s & SPIORDY) 2691 printk("SPIORDY "); 2692 if (s & DMADONE) 2693 printk("DMADONE "); 2694 2695 s = GETPORT(SSTAT1) & GETPORT(SIMODE1); 2696 2697 if (s & SELTO) 2698 printk("SELTO "); 2699 if (s & ATNTARG) 2700 printk("ATNTARG "); 2701 if (s & SCSIRSTI) 2702 printk("SCSIRSTI "); 2703 if (s & PHASEMIS) 2704 printk("PHASEMIS "); 2705 if (s & BUSFREE) 2706 printk("BUSFREE "); 2707 if (s & SCSIPERR) 2708 printk("SCSIPERR "); 2709 if (s & PHASECHG) 2710 printk("PHASECHG "); 2711 if (s & REQINIT) 2712 printk("REQINIT "); 2713 printk("); "); 2714 2715 printk("SXFRCTL0( "); 2716 2717 s = GETPORT(SXFRCTL0); 2718 if (s & SCSIEN) 2719 printk("SCSIEN "); 2720 if (s & DMAEN) 2721 printk("DMAEN "); 2722 if (s & CH1) 2723 printk("CH1 "); 2724 if (s & CLRSTCNT) 2725 printk("CLRSTCNT "); 2726 if (s & SPIOEN) 2727 printk("SPIOEN "); 2728 if (s & CLRCH1) 2729 printk("CLRCH1 "); 2730 printk("); "); 2731 2732 printk("SIGNAL( "); 2733 2734 s = GETPORT(SCSISIG); 2735 if (s & SIG_ATNI) 2736 printk("ATNI "); 2737 if (s & SIG_SELI) 2738 printk("SELI "); 2739 if (s & SIG_BSYI) 2740 printk("BSYI "); 2741 if (s & SIG_REQI) 2742 printk("REQI "); 2743 if (s & SIG_ACKI) 2744 printk("ACKI "); 2745 printk("); "); 2746 2747 printk("SELID (%02x), ", GETPORT(SELID)); 2748 2749 printk("STCNT (%d), ", GETSTCNT()); 2750 2751 printk("SSTAT2( "); 2752 2753 s = GETPORT(SSTAT2); 2754 if (s & SOFFSET) 2755 printk("SOFFSET "); 2756 if (s & SEMPTY) 2757 printk("SEMPTY "); 2758 if (s & SFULL) 2759 printk("SFULL "); 2760 printk("); SFCNT (%d); ", s & (SFULL | SFCNT)); 2761 2762 s = GETPORT(SSTAT3); 2763 printk("SCSICNT (%d), OFFCNT(%d), ", (s & 0xf0) >> 4, s & 0x0f); 2764 2765 printk("SSTAT4( "); 2766 s = GETPORT(SSTAT4); 2767 if (s & SYNCERR) 2768 printk("SYNCERR "); 2769 if (s & FWERR) 2770 printk("FWERR "); 2771 if (s & FRERR) 2772 printk("FRERR "); 2773 printk("); "); 2774 2775 printk("DMACNTRL0( "); 2776 s = GETPORT(DMACNTRL0); 2777 printk("%s ", s & _8BIT ? "8BIT" : "16BIT"); 2778 printk("%s ", s & DMA ? "DMA" : "PIO"); 2779 printk("%s ", s & WRITE_READ ? "WRITE" : "READ"); 2780 if (s & ENDMA) 2781 printk("ENDMA "); 2782 if (s & INTEN) 2783 printk("INTEN "); 2784 if (s & RSTFIFO) 2785 printk("RSTFIFO "); 2786 if (s & SWINT) 2787 printk("SWINT "); 2788 printk("); "); 2789 2790 printk("DMASTAT( "); 2791 s = GETPORT(DMASTAT); 2792 if (s & ATDONE) 2793 printk("ATDONE "); 2794 if (s & WORDRDY) 2795 printk("WORDRDY "); 2796 if (s & DFIFOFULL) 2797 printk("DFIFOFULL "); 2798 if (s & DFIFOEMP) 2799 printk("DFIFOEMP "); 2800 printk(")\n"); 2801#endif 2802} 2803 2804/* 2805 * display enabled interrupts 2806 */ 2807static void disp_enintr(struct Scsi_Host *shpnt) 2808{ 2809 int s; 2810 2811 printk(KERN_DEBUG "enabled interrupts ( "); 2812 2813 s = GETPORT(SIMODE0); 2814 if (s & ENSELDO) 2815 printk("ENSELDO "); 2816 if (s & ENSELDI) 2817 printk("ENSELDI "); 2818 if (s & ENSELINGO) 2819 printk("ENSELINGO "); 2820 if (s & ENSWRAP) 2821 printk("ENSWRAP "); 2822 if (s & ENSDONE) 2823 printk("ENSDONE "); 2824 if (s & ENSPIORDY) 2825 printk("ENSPIORDY "); 2826 if (s & ENDMADONE) 2827 printk("ENDMADONE "); 2828 2829 s = GETPORT(SIMODE1); 2830 if (s & ENSELTIMO) 2831 printk("ENSELTIMO "); 2832 if (s & ENATNTARG) 2833 printk("ENATNTARG "); 2834 if (s & ENPHASEMIS) 2835 printk("ENPHASEMIS "); 2836 if (s & ENBUSFREE) 2837 printk("ENBUSFREE "); 2838 if (s & ENSCSIPERR) 2839 printk("ENSCSIPERR "); 2840 if (s & ENPHASECHG) 2841 printk("ENPHASECHG "); 2842 if (s & ENREQINIT) 2843 printk("ENREQINIT "); 2844 printk(")\n"); 2845} 2846 2847/* 2848 * Show the command data of a command 2849 */ 2850static void show_command(Scsi_Cmnd *ptr) 2851{ 2852 scmd_printk(KERN_DEBUG, ptr, "%p: cmnd=(", ptr); 2853 2854 __scsi_print_command(ptr->cmnd); 2855 2856 printk(KERN_DEBUG "); request_bufflen=%d; resid=%d; phase |", 2857 scsi_bufflen(ptr), scsi_get_resid(ptr)); 2858 2859 if (ptr->SCp.phase & not_issued) 2860 printk("not issued|"); 2861 if (ptr->SCp.phase & selecting) 2862 printk("selecting|"); 2863 if (ptr->SCp.phase & identified) 2864 printk("identified|"); 2865 if (ptr->SCp.phase & disconnected) 2866 printk("disconnected|"); 2867 if (ptr->SCp.phase & completed) 2868 printk("completed|"); 2869 if (ptr->SCp.phase & spiordy) 2870 printk("spiordy|"); 2871 if (ptr->SCp.phase & syncneg) 2872 printk("syncneg|"); 2873 if (ptr->SCp.phase & aborted) 2874 printk("aborted|"); 2875 if (ptr->SCp.phase & resetted) 2876 printk("resetted|"); 2877 if( SCDATA(ptr) ) { 2878 printk("; next=0x%p\n", SCNEXT(ptr)); 2879 } else { 2880 printk("; next=(host scribble NULL)\n"); 2881 } 2882} 2883 2884/* 2885 * Dump the queued data 2886 */ 2887static void show_queues(struct Scsi_Host *shpnt) 2888{ 2889 Scsi_Cmnd *ptr; 2890 unsigned long flags; 2891 2892 DO_LOCK(flags); 2893 printk(KERN_DEBUG "\nqueue status:\nissue_SC:\n"); 2894 for (ptr = ISSUE_SC; ptr; ptr = SCNEXT(ptr)) 2895 show_command(ptr); 2896 DO_UNLOCK(flags); 2897 2898 printk(KERN_DEBUG "current_SC:\n"); 2899 if (CURRENT_SC) 2900 show_command(CURRENT_SC); 2901 else 2902 printk(KERN_DEBUG "none\n"); 2903 2904 printk(KERN_DEBUG "disconnected_SC:\n"); 2905 for (ptr = DISCONNECTED_SC; ptr; ptr = SCDATA(ptr) ? SCNEXT(ptr) : NULL) 2906 show_command(ptr); 2907 2908 disp_ports(shpnt); 2909 disp_enintr(shpnt); 2910} 2911 2912#undef SPRINTF 2913#define SPRINTF(args...) pos += sprintf(pos, ## args) 2914 2915static int get_command(char *pos, Scsi_Cmnd * ptr) 2916{ 2917 char *start = pos; 2918 int i; 2919 2920 SPRINTF("0x%08x: target=%d; lun=%d; cmnd=( ", 2921 (unsigned int) ptr, ptr->device->id, ptr->device->lun); 2922 2923 for (i = 0; i < COMMAND_SIZE(ptr->cmnd[0]); i++) 2924 SPRINTF("0x%02x ", ptr->cmnd[i]); 2925 2926 SPRINTF("); resid=%d; residual=%d; buffers=%d; phase |", 2927 scsi_get_resid(ptr), ptr->SCp.this_residual, 2928 ptr->SCp.buffers_residual); 2929 2930 if (ptr->SCp.phase & not_issued) 2931 SPRINTF("not issued|"); 2932 if (ptr->SCp.phase & selecting) 2933 SPRINTF("selecting|"); 2934 if (ptr->SCp.phase & disconnected) 2935 SPRINTF("disconnected|"); 2936 if (ptr->SCp.phase & aborted) 2937 SPRINTF("aborted|"); 2938 if (ptr->SCp.phase & identified) 2939 SPRINTF("identified|"); 2940 if (ptr->SCp.phase & completed) 2941 SPRINTF("completed|"); 2942 if (ptr->SCp.phase & spiordy) 2943 SPRINTF("spiordy|"); 2944 if (ptr->SCp.phase & syncneg) 2945 SPRINTF("syncneg|"); 2946 SPRINTF("; next=0x%p\n", SCNEXT(ptr)); 2947 2948 return (pos - start); 2949} 2950 2951static int get_ports(struct Scsi_Host *shpnt, char *pos) 2952{ 2953 char *start = pos; 2954 int s; 2955 2956 SPRINTF("\n%s: %s(%s) ", CURRENT_SC ? "on bus" : "waiting", states[STATE].name, states[PREVSTATE].name); 2957 2958 s = GETPORT(SCSISEQ); 2959 SPRINTF("SCSISEQ( "); 2960 if (s & TEMODEO) 2961 SPRINTF("TARGET MODE "); 2962 if (s & ENSELO) 2963 SPRINTF("SELO "); 2964 if (s & ENSELI) 2965 SPRINTF("SELI "); 2966 if (s & ENRESELI) 2967 SPRINTF("RESELI "); 2968 if (s & ENAUTOATNO) 2969 SPRINTF("AUTOATNO "); 2970 if (s & ENAUTOATNI) 2971 SPRINTF("AUTOATNI "); 2972 if (s & ENAUTOATNP) 2973 SPRINTF("AUTOATNP "); 2974 if (s & SCSIRSTO) 2975 SPRINTF("SCSIRSTO "); 2976 SPRINTF(");"); 2977 2978 SPRINTF(" SCSISIG("); 2979 s = GETPORT(SCSISIG); 2980 switch (s & P_MASK) { 2981 case P_DATAO: 2982 SPRINTF("DATA OUT"); 2983 break; 2984 case P_DATAI: 2985 SPRINTF("DATA IN"); 2986 break; 2987 case P_CMD: 2988 SPRINTF("COMMAND"); 2989 break; 2990 case P_STATUS: 2991 SPRINTF("STATUS"); 2992 break; 2993 case P_MSGO: 2994 SPRINTF("MESSAGE OUT"); 2995 break; 2996 case P_MSGI: 2997 SPRINTF("MESSAGE IN"); 2998 break; 2999 default: 3000 SPRINTF("*invalid*"); 3001 break; 3002 } 3003 3004 SPRINTF("); "); 3005 3006 SPRINTF("INTSTAT (%s); ", TESTHI(DMASTAT, INTSTAT) ? "hi" : "lo"); 3007 3008 SPRINTF("SSTAT( "); 3009 s = GETPORT(SSTAT0); 3010 if (s & TARGET) 3011 SPRINTF("TARGET "); 3012 if (s & SELDO) 3013 SPRINTF("SELDO "); 3014 if (s & SELDI) 3015 SPRINTF("SELDI "); 3016 if (s & SELINGO) 3017 SPRINTF("SELINGO "); 3018 if (s & SWRAP) 3019 SPRINTF("SWRAP "); 3020 if (s & SDONE) 3021 SPRINTF("SDONE "); 3022 if (s & SPIORDY) 3023 SPRINTF("SPIORDY "); 3024 if (s & DMADONE) 3025 SPRINTF("DMADONE "); 3026 3027 s = GETPORT(SSTAT1); 3028 if (s & SELTO) 3029 SPRINTF("SELTO "); 3030 if (s & ATNTARG) 3031 SPRINTF("ATNTARG "); 3032 if (s & SCSIRSTI) 3033 SPRINTF("SCSIRSTI "); 3034 if (s & PHASEMIS) 3035 SPRINTF("PHASEMIS "); 3036 if (s & BUSFREE) 3037 SPRINTF("BUSFREE "); 3038 if (s & SCSIPERR) 3039 SPRINTF("SCSIPERR "); 3040 if (s & PHASECHG) 3041 SPRINTF("PHASECHG "); 3042 if (s & REQINIT) 3043 SPRINTF("REQINIT "); 3044 SPRINTF("); "); 3045 3046 3047 SPRINTF("SSTAT( "); 3048 3049 s = GETPORT(SSTAT0) & GETPORT(SIMODE0); 3050 3051 if (s & TARGET) 3052 SPRINTF("TARGET "); 3053 if (s & SELDO) 3054 SPRINTF("SELDO "); 3055 if (s & SELDI) 3056 SPRINTF("SELDI "); 3057 if (s & SELINGO) 3058 SPRINTF("SELINGO "); 3059 if (s & SWRAP) 3060 SPRINTF("SWRAP "); 3061 if (s & SDONE) 3062 SPRINTF("SDONE "); 3063 if (s & SPIORDY) 3064 SPRINTF("SPIORDY "); 3065 if (s & DMADONE) 3066 SPRINTF("DMADONE "); 3067 3068 s = GETPORT(SSTAT1) & GETPORT(SIMODE1); 3069 3070 if (s & SELTO) 3071 SPRINTF("SELTO "); 3072 if (s & ATNTARG) 3073 SPRINTF("ATNTARG "); 3074 if (s & SCSIRSTI) 3075 SPRINTF("SCSIRSTI "); 3076 if (s & PHASEMIS) 3077 SPRINTF("PHASEMIS "); 3078 if (s & BUSFREE) 3079 SPRINTF("BUSFREE "); 3080 if (s & SCSIPERR) 3081 SPRINTF("SCSIPERR "); 3082 if (s & PHASECHG) 3083 SPRINTF("PHASECHG "); 3084 if (s & REQINIT) 3085 SPRINTF("REQINIT "); 3086 SPRINTF("); "); 3087 3088 SPRINTF("SXFRCTL0( "); 3089 3090 s = GETPORT(SXFRCTL0); 3091 if (s & SCSIEN) 3092 SPRINTF("SCSIEN "); 3093 if (s & DMAEN) 3094 SPRINTF("DMAEN "); 3095 if (s & CH1) 3096 SPRINTF("CH1 "); 3097 if (s & CLRSTCNT) 3098 SPRINTF("CLRSTCNT "); 3099 if (s & SPIOEN) 3100 SPRINTF("SPIOEN "); 3101 if (s & CLRCH1) 3102 SPRINTF("CLRCH1 "); 3103 SPRINTF("); "); 3104 3105 SPRINTF("SIGNAL( "); 3106 3107 s = GETPORT(SCSISIG); 3108 if (s & SIG_ATNI) 3109 SPRINTF("ATNI "); 3110 if (s & SIG_SELI) 3111 SPRINTF("SELI "); 3112 if (s & SIG_BSYI) 3113 SPRINTF("BSYI "); 3114 if (s & SIG_REQI) 3115 SPRINTF("REQI "); 3116 if (s & SIG_ACKI) 3117 SPRINTF("ACKI "); 3118 SPRINTF("); "); 3119 3120 SPRINTF("SELID(%02x), ", GETPORT(SELID)); 3121 3122 SPRINTF("STCNT(%d), ", GETSTCNT()); 3123 3124 SPRINTF("SSTAT2( "); 3125 3126 s = GETPORT(SSTAT2); 3127 if (s & SOFFSET) 3128 SPRINTF("SOFFSET "); 3129 if (s & SEMPTY) 3130 SPRINTF("SEMPTY "); 3131 if (s & SFULL) 3132 SPRINTF("SFULL "); 3133 SPRINTF("); SFCNT (%d); ", s & (SFULL | SFCNT)); 3134 3135 s = GETPORT(SSTAT3); 3136 SPRINTF("SCSICNT (%d), OFFCNT(%d), ", (s & 0xf0) >> 4, s & 0x0f); 3137 3138 SPRINTF("SSTAT4( "); 3139 s = GETPORT(SSTAT4); 3140 if (s & SYNCERR) 3141 SPRINTF("SYNCERR "); 3142 if (s & FWERR) 3143 SPRINTF("FWERR "); 3144 if (s & FRERR) 3145 SPRINTF("FRERR "); 3146 SPRINTF("); "); 3147 3148 SPRINTF("DMACNTRL0( "); 3149 s = GETPORT(DMACNTRL0); 3150 SPRINTF("%s ", s & _8BIT ? "8BIT" : "16BIT"); 3151 SPRINTF("%s ", s & DMA ? "DMA" : "PIO"); 3152 SPRINTF("%s ", s & WRITE_READ ? "WRITE" : "READ"); 3153 if (s & ENDMA) 3154 SPRINTF("ENDMA "); 3155 if (s & INTEN) 3156 SPRINTF("INTEN "); 3157 if (s & RSTFIFO) 3158 SPRINTF("RSTFIFO "); 3159 if (s & SWINT) 3160 SPRINTF("SWINT "); 3161 SPRINTF("); "); 3162 3163 SPRINTF("DMASTAT( "); 3164 s = GETPORT(DMASTAT); 3165 if (s & ATDONE) 3166 SPRINTF("ATDONE "); 3167 if (s & WORDRDY) 3168 SPRINTF("WORDRDY "); 3169 if (s & DFIFOFULL) 3170 SPRINTF("DFIFOFULL "); 3171 if (s & DFIFOEMP) 3172 SPRINTF("DFIFOEMP "); 3173 SPRINTF(")\n"); 3174 3175 SPRINTF("enabled interrupts( "); 3176 3177 s = GETPORT(SIMODE0); 3178 if (s & ENSELDO) 3179 SPRINTF("ENSELDO "); 3180 if (s & ENSELDI) 3181 SPRINTF("ENSELDI "); 3182 if (s & ENSELINGO) 3183 SPRINTF("ENSELINGO "); 3184 if (s & ENSWRAP) 3185 SPRINTF("ENSWRAP "); 3186 if (s & ENSDONE) 3187 SPRINTF("ENSDONE "); 3188 if (s & ENSPIORDY) 3189 SPRINTF("ENSPIORDY "); 3190 if (s & ENDMADONE) 3191 SPRINTF("ENDMADONE "); 3192 3193 s = GETPORT(SIMODE1); 3194 if (s & ENSELTIMO) 3195 SPRINTF("ENSELTIMO "); 3196 if (s & ENATNTARG) 3197 SPRINTF("ENATNTARG "); 3198 if (s & ENPHASEMIS) 3199 SPRINTF("ENPHASEMIS "); 3200 if (s & ENBUSFREE) 3201 SPRINTF("ENBUSFREE "); 3202 if (s & ENSCSIPERR) 3203 SPRINTF("ENSCSIPERR "); 3204 if (s & ENPHASECHG) 3205 SPRINTF("ENPHASECHG "); 3206 if (s & ENREQINIT) 3207 SPRINTF("ENREQINIT "); 3208 SPRINTF(")\n"); 3209 3210 return (pos - start); 3211} 3212 3213static int aha152x_set_info(char *buffer, int length, struct Scsi_Host *shpnt) 3214{ 3215 if(!shpnt || !buffer || length<8 || strncmp("aha152x ", buffer, 8)!=0) 3216 return -EINVAL; 3217 3218#if defined(AHA152X_DEBUG) 3219 if(length>14 && strncmp("debug ", buffer+8, 6)==0) { 3220 int debug = HOSTDATA(shpnt)->debug; 3221 3222 HOSTDATA(shpnt)->debug = simple_strtoul(buffer+14, NULL, 0); 3223 3224 printk(KERN_INFO "aha152x%d: debugging options set to 0x%04x (were 0x%04x)\n", HOSTNO, HOSTDATA(shpnt)->debug, debug); 3225 } else 3226#endif 3227#if defined(AHA152X_STAT) 3228 if(length>13 && strncmp("reset", buffer+8, 5)==0) { 3229 int i; 3230 3231 HOSTDATA(shpnt)->total_commands=0; 3232 HOSTDATA(shpnt)->disconnections=0; 3233 HOSTDATA(shpnt)->busfree_without_any_action=0; 3234 HOSTDATA(shpnt)->busfree_without_old_command=0; 3235 HOSTDATA(shpnt)->busfree_without_new_command=0; 3236 HOSTDATA(shpnt)->busfree_without_done_command=0; 3237 HOSTDATA(shpnt)->busfree_with_check_condition=0; 3238 for (i = idle; i<maxstate; i++) { 3239 HOSTDATA(shpnt)->count[i]=0; 3240 HOSTDATA(shpnt)->count_trans[i]=0; 3241 HOSTDATA(shpnt)->time[i]=0; 3242 } 3243 3244 printk(KERN_INFO "aha152x%d: stats reseted.\n", HOSTNO); 3245 3246 } else 3247#endif 3248 { 3249 return -EINVAL; 3250 } 3251 3252 3253 return length; 3254} 3255 3256#undef SPRINTF 3257#define SPRINTF(args...) \ 3258 do { if(pos < buffer + length) pos += sprintf(pos, ## args); } while(0) 3259 3260static int aha152x_proc_info(struct Scsi_Host *shpnt, char *buffer, char **start, 3261 off_t offset, int length, int inout) 3262{ 3263 int i; 3264 char *pos = buffer; 3265 Scsi_Cmnd *ptr; 3266 unsigned long flags; 3267 int thislength; 3268 3269 DPRINTK(debug_procinfo, 3270 KERN_DEBUG "aha152x_proc_info: buffer=%p offset=%ld length=%d hostno=%d inout=%d\n", 3271 buffer, offset, length, shpnt->host_no, inout); 3272 3273 3274 if (inout) 3275 return aha152x_set_info(buffer, length, shpnt); 3276 3277 SPRINTF(AHA152X_REVID "\n"); 3278 3279 SPRINTF("ioports 0x%04lx to 0x%04lx\n", 3280 shpnt->io_port, shpnt->io_port + shpnt->n_io_port - 1); 3281 SPRINTF("interrupt 0x%02x\n", shpnt->irq); 3282 SPRINTF("disconnection/reconnection %s\n", 3283 RECONNECT ? "enabled" : "disabled"); 3284 SPRINTF("parity checking %s\n", 3285 PARITY ? "enabled" : "disabled"); 3286 SPRINTF("synchronous transfers %s\n", 3287 SYNCHRONOUS ? "enabled" : "disabled"); 3288 SPRINTF("%d commands currently queued\n", HOSTDATA(shpnt)->commands); 3289 3290 if(SYNCHRONOUS) { 3291 SPRINTF("synchronously operating targets (tick=50 ns):\n"); 3292 for (i = 0; i < 8; i++) 3293 if (HOSTDATA(shpnt)->syncrate[i] & 0x7f) 3294 SPRINTF("target %d: period %dT/%dns; req/ack offset %d\n", 3295 i, 3296 (((HOSTDATA(shpnt)->syncrate[i] & 0x70) >> 4) + 2), 3297 (((HOSTDATA(shpnt)->syncrate[i] & 0x70) >> 4) + 2) * 50, 3298 HOSTDATA(shpnt)->syncrate[i] & 0x0f); 3299 } 3300#if defined(AHA152X_DEBUG) 3301#define PDEBUG(flags,txt) \ 3302 if(HOSTDATA(shpnt)->debug & flags) SPRINTF("(%s) ", txt); 3303 3304 SPRINTF("enabled debugging options: "); 3305 3306 PDEBUG(debug_procinfo, "procinfo"); 3307 PDEBUG(debug_queue, "queue"); 3308 PDEBUG(debug_intr, "interrupt"); 3309 PDEBUG(debug_selection, "selection"); 3310 PDEBUG(debug_msgo, "message out"); 3311 PDEBUG(debug_msgi, "message in"); 3312 PDEBUG(debug_status, "status"); 3313 PDEBUG(debug_cmd, "command"); 3314 PDEBUG(debug_datai, "data in"); 3315 PDEBUG(debug_datao, "data out"); 3316 PDEBUG(debug_eh, "eh"); 3317 PDEBUG(debug_locking, "locks"); 3318 PDEBUG(debug_phases, "phases"); 3319 3320 SPRINTF("\n"); 3321#endif 3322 3323 SPRINTF("\nqueue status:\n"); 3324 DO_LOCK(flags); 3325 if (ISSUE_SC) { 3326 SPRINTF("not yet issued commands:\n"); 3327 for (ptr = ISSUE_SC; ptr; ptr = SCNEXT(ptr)) 3328 pos += get_command(pos, ptr); 3329 } else 3330 SPRINTF("no not yet issued commands\n"); 3331 DO_UNLOCK(flags); 3332 3333 if (CURRENT_SC) { 3334 SPRINTF("current command:\n"); 3335 pos += get_command(pos, CURRENT_SC); 3336 } else 3337 SPRINTF("no current command\n"); 3338 3339 if (DISCONNECTED_SC) { 3340 SPRINTF("disconnected commands:\n"); 3341 for (ptr = DISCONNECTED_SC; ptr; ptr = SCNEXT(ptr)) 3342 pos += get_command(pos, ptr); 3343 } else 3344 SPRINTF("no disconnected commands\n"); 3345 3346 pos += get_ports(shpnt, pos); 3347 3348#if defined(AHA152X_STAT) 3349 SPRINTF("statistics:\n" 3350 "total commands: %d\n" 3351 "disconnections: %d\n" 3352 "busfree with check condition: %d\n" 3353 "busfree without old command: %d\n" 3354 "busfree without new command: %d\n" 3355 "busfree without done command: %d\n" 3356 "busfree without any action: %d\n" 3357 "state " 3358 "transitions " 3359 "count " 3360 "time\n", 3361 HOSTDATA(shpnt)->total_commands, 3362 HOSTDATA(shpnt)->disconnections, 3363 HOSTDATA(shpnt)->busfree_with_check_condition, 3364 HOSTDATA(shpnt)->busfree_without_old_command, 3365 HOSTDATA(shpnt)->busfree_without_new_command, 3366 HOSTDATA(shpnt)->busfree_without_done_command, 3367 HOSTDATA(shpnt)->busfree_without_any_action); 3368 for(i=0; i<maxstate; i++) { 3369 SPRINTF("%-10s %-12d %-12d %-12ld\n", 3370 states[i].name, 3371 HOSTDATA(shpnt)->count_trans[i], 3372 HOSTDATA(shpnt)->count[i], 3373 HOSTDATA(shpnt)->time[i]); 3374 } 3375#endif 3376 3377 DPRINTK(debug_procinfo, KERN_DEBUG "aha152x_proc_info: pos=%p\n", pos); 3378 3379 thislength = pos - (buffer + offset); 3380 DPRINTK(debug_procinfo, KERN_DEBUG "aha152x_proc_info: length=%d thislength=%d\n", length, thislength); 3381 3382 if(thislength<0) { 3383 DPRINTK(debug_procinfo, KERN_DEBUG "aha152x_proc_info: output too short\n"); 3384 *start = NULL; 3385 return 0; 3386 } 3387 3388 thislength = thislength<length ? thislength : length; 3389 3390 DPRINTK(debug_procinfo, KERN_DEBUG "aha152x_proc_info: return %d\n", thislength); 3391 3392 *start = buffer + offset; 3393 return thislength < length ? thislength : length; 3394} 3395 3396static int aha152x_adjust_queue(struct scsi_device *device) 3397{ 3398 blk_queue_bounce_limit(device->request_queue, BLK_BOUNCE_HIGH); 3399 return 0; 3400} 3401 3402static struct scsi_host_template aha152x_driver_template = { 3403 .module = THIS_MODULE, 3404 .name = AHA152X_REVID, 3405 .proc_name = "aha152x", 3406 .proc_info = aha152x_proc_info, 3407 .queuecommand = aha152x_queue, 3408 .eh_abort_handler = aha152x_abort, 3409 .eh_device_reset_handler = aha152x_device_reset, 3410 .eh_bus_reset_handler = aha152x_bus_reset, 3411 .eh_host_reset_handler = aha152x_host_reset, 3412 .bios_param = aha152x_biosparam, 3413 .can_queue = 1, 3414 .this_id = 7, 3415 .sg_tablesize = SG_ALL, 3416 .cmd_per_lun = 1, 3417 .use_clustering = DISABLE_CLUSTERING, 3418 .slave_alloc = aha152x_adjust_queue, 3419}; 3420 3421#if !defined(PCMCIA) 3422static int setup_count; 3423static struct aha152x_setup setup[2]; 3424 3425/* possible i/o addresses for the AIC-6260; default first */ 3426static unsigned short ports[] = { 0x340, 0x140 }; 3427 3428#if !defined(SKIP_BIOSTEST) 3429/* possible locations for the Adaptec BIOS; defaults first */ 3430static unsigned int addresses[] = 3431{ 3432 0xdc000, /* default first */ 3433 0xc8000, 3434 0xcc000, 3435 0xd0000, 3436 0xd4000, 3437 0xd8000, 3438 0xe0000, 3439 0xeb800, /* VTech Platinum SMP */ 3440 0xf0000, 3441}; 3442 3443/* signatures for various AIC-6[23]60 based controllers. 3444 The point in detecting signatures is to avoid useless and maybe 3445 harmful probes on ports. I'm not sure that all listed boards pass 3446 auto-configuration. For those which fail the BIOS signature is 3447 obsolete, because user intervention to supply the configuration is 3448 needed anyway. May be an information whether or not the BIOS supports 3449 extended translation could be also useful here. */ 3450static struct signature { 3451 unsigned char *signature; 3452 int sig_offset; 3453 int sig_length; 3454} signatures[] = 3455{ 3456 { "Adaptec AHA-1520 BIOS", 0x102e, 21 }, 3457 /* Adaptec 152x */ 3458 { "Adaptec AHA-1520B", 0x000b, 17 }, 3459 /* Adaptec 152x rev B */ 3460 { "Adaptec AHA-1520B", 0x0026, 17 }, 3461 /* Iomega Jaz Jet ISA (AIC6370Q) */ 3462 { "Adaptec ASW-B626 BIOS", 0x1029, 21 }, 3463 /* on-board controller */ 3464 { "Adaptec BIOS: ASW-B626", 0x000f, 22 }, 3465 /* on-board controller */ 3466 { "Adaptec ASW-B626 S2", 0x2e6c, 19 }, 3467 /* on-board controller */ 3468 { "Adaptec BIOS:AIC-6360", 0x000c, 21 }, 3469 /* on-board controller */ 3470 { "ScsiPro SP-360 BIOS", 0x2873, 19 }, 3471 /* ScsiPro-Controller */ 3472 { "GA-400 LOCAL BUS SCSI BIOS", 0x102e, 26 }, 3473 /* Gigabyte Local-Bus-SCSI */ 3474 { "Adaptec BIOS:AVA-282X", 0x000c, 21 }, 3475 /* Adaptec 282x */ 3476 { "Adaptec IBM Dock II SCSI", 0x2edd, 24 }, 3477 /* IBM Thinkpad Dock II */ 3478 { "Adaptec BIOS:AHA-1532P", 0x001c, 22 }, 3479 /* IBM Thinkpad Dock II SCSI */ 3480 { "DTC3520A Host Adapter BIOS", 0x318a, 26 }, 3481 /* DTC 3520A ISA SCSI */ 3482}; 3483#endif /* !SKIP_BIOSTEST */ 3484 3485/* 3486 * Test, if port_base is valid. 3487 * 3488 */ 3489static int aha152x_porttest(int io_port) 3490{ 3491 int i; 3492 3493 SETPORT(io_port + O_DMACNTRL1, 0); /* reset stack pointer */ 3494 for (i = 0; i < 16; i++) 3495 SETPORT(io_port + O_STACK, i); 3496 3497 SETPORT(io_port + O_DMACNTRL1, 0); /* reset stack pointer */ 3498 for (i = 0; i < 16 && GETPORT(io_port + O_STACK) == i; i++) 3499 ; 3500 3501 return (i == 16); 3502} 3503 3504static int tc1550_porttest(int io_port) 3505{ 3506 int i; 3507 3508 SETPORT(io_port + O_TC_DMACNTRL1, 0); /* reset stack pointer */ 3509 for (i = 0; i < 16; i++) 3510 SETPORT(io_port + O_STACK, i); 3511 3512 SETPORT(io_port + O_TC_DMACNTRL1, 0); /* reset stack pointer */ 3513 for (i = 0; i < 16 && GETPORT(io_port + O_TC_STACK) == i; i++) 3514 ; 3515 3516 return (i == 16); 3517} 3518 3519 3520static int checksetup(struct aha152x_setup *setup) 3521{ 3522 int i; 3523 for (i = 0; i < ARRAY_SIZE(ports) && (setup->io_port != ports[i]); i++) 3524 ; 3525 3526 if (i == ARRAY_SIZE(ports)) 3527 return 0; 3528 3529 if (!request_region(setup->io_port, IO_RANGE, "aha152x")) { 3530 printk(KERN_ERR "aha152x: io port 0x%x busy.\n", setup->io_port); 3531 return 0; 3532 } 3533 3534 if( aha152x_porttest(setup->io_port) ) { 3535 setup->tc1550=0; 3536 } else if( tc1550_porttest(setup->io_port) ) { 3537 setup->tc1550=1; 3538 } else { 3539 release_region(setup->io_port, IO_RANGE); 3540 return 0; 3541 } 3542 3543 release_region(setup->io_port, IO_RANGE); 3544 3545 if ((setup->irq < IRQ_MIN) || (setup->irq > IRQ_MAX)) 3546 return 0; 3547 3548 if ((setup->scsiid < 0) || (setup->scsiid > 7)) 3549 return 0; 3550 3551 if ((setup->reconnect < 0) || (setup->reconnect > 1)) 3552 return 0; 3553 3554 if ((setup->parity < 0) || (setup->parity > 1)) 3555 return 0; 3556 3557 if ((setup->synchronous < 0) || (setup->synchronous > 1)) 3558 return 0; 3559 3560 if ((setup->ext_trans < 0) || (setup->ext_trans > 1)) 3561 return 0; 3562 3563 3564 return 1; 3565} 3566 3567 3568static int __init aha152x_init(void) 3569{ 3570 int i, j, ok; 3571#if defined(AUTOCONF) 3572 aha152x_config conf; 3573#endif 3574#ifdef __ISAPNP__ 3575 struct pnp_dev *dev=NULL, *pnpdev[2] = {NULL, NULL}; 3576#endif 3577 3578 if ( setup_count ) { 3579 printk(KERN_INFO "aha152x: processing commandline: "); 3580 3581 for (i = 0; i<setup_count; i++) { 3582 if (!checksetup(&setup[i])) { 3583 printk(KERN_ERR "\naha152x: %s\n", setup[i].conf); 3584 printk(KERN_ERR "aha152x: invalid line\n"); 3585 } 3586 } 3587 printk("ok\n"); 3588 } 3589 3590#if defined(SETUP0) 3591 if (setup_count < ARRAY_SIZE(setup)) { 3592 struct aha152x_setup override = SETUP0; 3593 3594 if (setup_count == 0 || (override.io_port != setup[0].io_port)) { 3595 if (!checksetup(&override)) { 3596 printk(KERN_ERR "\naha152x: invalid override SETUP0={0x%x,%d,%d,%d,%d,%d,%d,%d}\n", 3597 override.io_port, 3598 override.irq, 3599 override.scsiid, 3600 override.reconnect, 3601 override.parity, 3602 override.synchronous, 3603 override.delay, 3604 override.ext_trans); 3605 } else 3606 setup[setup_count++] = override; 3607 } 3608 } 3609#endif 3610 3611#if defined(SETUP1) 3612 if (setup_count < ARRAY_SIZE(setup)) { 3613 struct aha152x_setup override = SETUP1; 3614 3615 if (setup_count == 0 || (override.io_port != setup[0].io_port)) { 3616 if (!checksetup(&override)) { 3617 printk(KERN_ERR "\naha152x: invalid override SETUP1={0x%x,%d,%d,%d,%d,%d,%d,%d}\n", 3618 override.io_port, 3619 override.irq, 3620 override.scsiid, 3621 override.reconnect, 3622 override.parity, 3623 override.synchronous, 3624 override.delay, 3625 override.ext_trans); 3626 } else 3627 setup[setup_count++] = override; 3628 } 3629 } 3630#endif 3631 3632#if defined(MODULE) 3633 if (setup_count<ARRAY_SIZE(setup) && (aha152x[0]!=0 || io[0]!=0 || irq[0]!=0)) { 3634 if(aha152x[0]!=0) { 3635 setup[setup_count].conf = ""; 3636 setup[setup_count].io_port = aha152x[0]; 3637 setup[setup_count].irq = aha152x[1]; 3638 setup[setup_count].scsiid = aha152x[2]; 3639 setup[setup_count].reconnect = aha152x[3]; 3640 setup[setup_count].parity = aha152x[4]; 3641 setup[setup_count].synchronous = aha152x[5]; 3642 setup[setup_count].delay = aha152x[6]; 3643 setup[setup_count].ext_trans = aha152x[7]; 3644#if defined(AHA152X_DEBUG) 3645 setup[setup_count].debug = aha152x[8]; 3646#endif 3647 } else if(io[0]!=0 || irq[0]!=0) { 3648 if(io[0]!=0) setup[setup_count].io_port = io[0]; 3649 if(irq[0]!=0) setup[setup_count].irq = irq[0]; 3650 3651 setup[setup_count].scsiid = scsiid[0]; 3652 setup[setup_count].reconnect = reconnect[0]; 3653 setup[setup_count].parity = parity[0]; 3654 setup[setup_count].synchronous = sync[0]; 3655 setup[setup_count].delay = delay[0]; 3656 setup[setup_count].ext_trans = exttrans[0]; 3657#if defined(AHA152X_DEBUG) 3658 setup[setup_count].debug = debug[0]; 3659#endif 3660 } 3661 3662 if (checksetup(&setup[setup_count])) 3663 setup_count++; 3664 else 3665 printk(KERN_ERR "aha152x: invalid module params io=0x%x, irq=%d,scsiid=%d,reconnect=%d,parity=%d,sync=%d,delay=%d,exttrans=%d\n", 3666 setup[setup_count].io_port, 3667 setup[setup_count].irq, 3668 setup[setup_count].scsiid, 3669 setup[setup_count].reconnect, 3670 setup[setup_count].parity, 3671 setup[setup_count].synchronous, 3672 setup[setup_count].delay, 3673 setup[setup_count].ext_trans); 3674 } 3675 3676 if (setup_count<ARRAY_SIZE(setup) && (aha152x1[0]!=0 || io[1]!=0 || irq[1]!=0)) { 3677 if(aha152x1[0]!=0) { 3678 setup[setup_count].conf = ""; 3679 setup[setup_count].io_port = aha152x1[0]; 3680 setup[setup_count].irq = aha152x1[1]; 3681 setup[setup_count].scsiid = aha152x1[2]; 3682 setup[setup_count].reconnect = aha152x1[3]; 3683 setup[setup_count].parity = aha152x1[4]; 3684 setup[setup_count].synchronous = aha152x1[5]; 3685 setup[setup_count].delay = aha152x1[6]; 3686 setup[setup_count].ext_trans = aha152x1[7]; 3687#if defined(AHA152X_DEBUG) 3688 setup[setup_count].debug = aha152x1[8]; 3689#endif 3690 } else if(io[1]!=0 || irq[1]!=0) { 3691 if(io[1]!=0) setup[setup_count].io_port = io[1]; 3692 if(irq[1]!=0) setup[setup_count].irq = irq[1]; 3693 3694 setup[setup_count].scsiid = scsiid[1]; 3695 setup[setup_count].reconnect = reconnect[1]; 3696 setup[setup_count].parity = parity[1]; 3697 setup[setup_count].synchronous = sync[1]; 3698 setup[setup_count].delay = delay[1]; 3699 setup[setup_count].ext_trans = exttrans[1]; 3700#if defined(AHA152X_DEBUG) 3701 setup[setup_count].debug = debug[1]; 3702#endif 3703 } 3704 if (checksetup(&setup[setup_count])) 3705 setup_count++; 3706 else 3707 printk(KERN_ERR "aha152x: invalid module params io=0x%x, irq=%d,scsiid=%d,reconnect=%d,parity=%d,sync=%d,delay=%d,exttrans=%d\n", 3708 setup[setup_count].io_port, 3709 setup[setup_count].irq, 3710 setup[setup_count].scsiid, 3711 setup[setup_count].reconnect, 3712 setup[setup_count].parity, 3713 setup[setup_count].synchronous, 3714 setup[setup_count].delay, 3715 setup[setup_count].ext_trans); 3716 } 3717#endif 3718 3719#ifdef __ISAPNP__ 3720 for(i=0; setup_count<ARRAY_SIZE(setup) && id_table[i].vendor; i++) { 3721 while ( setup_count<ARRAY_SIZE(setup) && 3722 (dev=pnp_find_dev(NULL, id_table[i].vendor, id_table[i].function, dev)) ) { 3723 if (pnp_device_attach(dev) < 0) 3724 continue; 3725 3726 if (pnp_activate_dev(dev) < 0) { 3727 pnp_device_detach(dev); 3728 continue; 3729 } 3730 3731 if (!pnp_port_valid(dev, 0)) { 3732 pnp_device_detach(dev); 3733 continue; 3734 } 3735 3736 if (setup_count==1 && pnp_port_start(dev, 0)==setup[0].io_port) { 3737 pnp_device_detach(dev); 3738 continue; 3739 } 3740 3741 setup[setup_count].io_port = pnp_port_start(dev, 0); 3742 setup[setup_count].irq = pnp_irq(dev, 0); 3743 setup[setup_count].scsiid = 7; 3744 setup[setup_count].reconnect = 1; 3745 setup[setup_count].parity = 1; 3746 setup[setup_count].synchronous = 1; 3747 setup[setup_count].delay = DELAY_DEFAULT; 3748 setup[setup_count].ext_trans = 0; 3749#if defined(AHA152X_DEBUG) 3750 setup[setup_count].debug = DEBUG_DEFAULT; 3751#endif 3752#if defined(__ISAPNP__) 3753 pnpdev[setup_count] = dev; 3754#endif 3755 printk (KERN_INFO 3756 "aha152x: found ISAPnP adapter at io=0x%03x, irq=%d\n", 3757 setup[setup_count].io_port, setup[setup_count].irq); 3758 setup_count++; 3759 } 3760 } 3761#endif 3762 3763#if defined(AUTOCONF) 3764 if (setup_count<ARRAY_SIZE(setup)) { 3765#if !defined(SKIP_BIOSTEST) 3766 ok = 0; 3767 for (i = 0; i < ARRAY_SIZE(addresses) && !ok; i++) { 3768 void __iomem *p = ioremap(addresses[i], 0x4000); 3769 if (!p) 3770 continue; 3771 for (j = 0; j<ARRAY_SIZE(signatures) && !ok; j++) 3772 ok = check_signature(p + signatures[j].sig_offset, 3773 signatures[j].signature, signatures[j].sig_length); 3774 iounmap(p); 3775 } 3776 if (!ok && setup_count == 0) 3777 return -ENODEV; 3778 3779 printk(KERN_INFO "aha152x: BIOS test: passed, "); 3780#else 3781 printk(KERN_INFO "aha152x: "); 3782#endif /* !SKIP_BIOSTEST */ 3783 3784 ok = 0; 3785 for (i = 0; i < ARRAY_SIZE(ports) && setup_count < 2; i++) { 3786 if ((setup_count == 1) && (setup[0].io_port == ports[i])) 3787 continue; 3788 3789 if (!request_region(ports[i], IO_RANGE, "aha152x")) { 3790 printk(KERN_ERR "aha152x: io port 0x%x busy.\n", ports[i]); 3791 continue; 3792 } 3793 3794 if (aha152x_porttest(ports[i])) { 3795 setup[setup_count].tc1550 = 0; 3796 3797 conf.cf_port = 3798 (GETPORT(ports[i] + O_PORTA) << 8) + GETPORT(ports[i] + O_PORTB); 3799 } else if (tc1550_porttest(ports[i])) { 3800 setup[setup_count].tc1550 = 1; 3801 3802 conf.cf_port = 3803 (GETPORT(ports[i] + O_TC_PORTA) << 8) + GETPORT(ports[i] + O_TC_PORTB); 3804 } else { 3805 release_region(ports[i], IO_RANGE); 3806 continue; 3807 } 3808 3809 release_region(ports[i], IO_RANGE); 3810 3811 ok++; 3812 setup[setup_count].io_port = ports[i]; 3813 setup[setup_count].irq = IRQ_MIN + conf.cf_irq; 3814 setup[setup_count].scsiid = conf.cf_id; 3815 setup[setup_count].reconnect = conf.cf_tardisc; 3816 setup[setup_count].parity = !conf.cf_parity; 3817 setup[setup_count].synchronous = conf.cf_syncneg; 3818 setup[setup_count].delay = DELAY_DEFAULT; 3819 setup[setup_count].ext_trans = 0; 3820#if defined(AHA152X_DEBUG) 3821 setup[setup_count].debug = DEBUG_DEFAULT; 3822#endif 3823 setup_count++; 3824 3825 } 3826 3827 if (ok) 3828 printk("auto configuration: ok, "); 3829 } 3830#endif 3831 3832 printk("%d controller(s) configured\n", setup_count); 3833 3834 for (i=0; i<setup_count; i++) { 3835 if ( request_region(setup[i].io_port, IO_RANGE, "aha152x") ) { 3836 struct Scsi_Host *shpnt = aha152x_probe_one(&setup[i]); 3837 3838 if( !shpnt ) { 3839 release_region(setup[i].io_port, IO_RANGE); 3840#if defined(__ISAPNP__) 3841 } else if( pnpdev[i] ) { 3842 HOSTDATA(shpnt)->pnpdev=pnpdev[i]; 3843 pnpdev[i]=NULL; 3844#endif 3845 } 3846 } else { 3847 printk(KERN_ERR "aha152x: io port 0x%x busy.\n", setup[i].io_port); 3848 } 3849 3850#if defined(__ISAPNP__) 3851 if( pnpdev[i] ) 3852 pnp_device_detach(pnpdev[i]); 3853#endif 3854 } 3855 3856 return 0; 3857} 3858 3859static void __exit aha152x_exit(void) 3860{ 3861 struct aha152x_hostdata *hd, *tmp; 3862 3863 list_for_each_entry_safe(hd, tmp, &aha152x_host_list, host_list) { 3864 struct Scsi_Host *shost = container_of((void *)hd, struct Scsi_Host, hostdata); 3865 3866 aha152x_release(shost); 3867 } 3868} 3869 3870module_init(aha152x_init); 3871module_exit(aha152x_exit); 3872 3873#if !defined(MODULE) 3874static int __init aha152x_setup(char *str) 3875{ 3876#if defined(AHA152X_DEBUG) 3877 int ints[11]; 3878#else 3879 int ints[10]; 3880#endif 3881 get_options(str, ARRAY_SIZE(ints), ints); 3882 3883 if(setup_count>=ARRAY_SIZE(setup)) { 3884 printk(KERN_ERR "aha152x: you can only configure up to two controllers\n"); 3885 return 1; 3886 } 3887 3888 setup[setup_count].conf = str; 3889 setup[setup_count].io_port = ints[0] >= 1 ? ints[1] : 0x340; 3890 setup[setup_count].irq = ints[0] >= 2 ? ints[2] : 11; 3891 setup[setup_count].scsiid = ints[0] >= 3 ? ints[3] : 7; 3892 setup[setup_count].reconnect = ints[0] >= 4 ? ints[4] : 1; 3893 setup[setup_count].parity = ints[0] >= 5 ? ints[5] : 1; 3894 setup[setup_count].synchronous = ints[0] >= 6 ? ints[6] : 1; 3895 setup[setup_count].delay = ints[0] >= 7 ? ints[7] : DELAY_DEFAULT; 3896 setup[setup_count].ext_trans = ints[0] >= 8 ? ints[8] : 0; 3897#if defined(AHA152X_DEBUG) 3898 setup[setup_count].debug = ints[0] >= 9 ? ints[9] : DEBUG_DEFAULT; 3899 if (ints[0] > 9) { 3900 printk(KERN_NOTICE "aha152x: usage: aha152x=<IOBASE>[,<IRQ>[,<SCSI ID>" 3901 "[,<RECONNECT>[,<PARITY>[,<SYNCHRONOUS>[,<DELAY>[,<EXT_TRANS>[,<DEBUG>]]]]]]]]\n"); 3902#else 3903 if (ints[0] > 8) { /*}*/ 3904 printk(KERN_NOTICE "aha152x: usage: aha152x=<IOBASE>[,<IRQ>[,<SCSI ID>" 3905 "[,<RECONNECT>[,<PARITY>[,<SYNCHRONOUS>[,<DELAY>[,<EXT_TRANS>]]]]]]]\n"); 3906#endif 3907 } else { 3908 setup_count++; 3909 return 0; 3910 } 3911 3912 return 1; 3913} 3914__setup("aha152x=", aha152x_setup); 3915#endif 3916 3917#endif /* !PCMCIA */ 3918