Annotation of Gnu-Mach/linux/src/drivers/scsi/aic7xxx.c, revision 1.1.1.1

1.1       root        1: /*+M*************************************************************************
                      2:  * Adaptec AIC7xxx device driver for Linux.
                      3:  *
                      4:  * Copyright (c) 1994 John Aycock
                      5:  *   The University of Calgary Department of Computer Science.
                      6:  *
                      7:  * This program is free software; you can redistribute it and/or modify
                      8:  * it under the terms of the GNU General Public License as published by
                      9:  * the Free Software Foundation; either version 2, or (at your option)
                     10:  * any later version.
                     11:  *
                     12:  * This program is distributed in the hope that it will be useful,
                     13:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
                     14:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     15:  * GNU General Public License for more details.
                     16:  *
                     17:  * You should have received a copy of the GNU General Public License
                     18:  * along with this program; see the file COPYING.  If not, write to
                     19:  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
                     20:  *
                     21:  * Sources include the Adaptec 1740 driver (aha1740.c), the Ultrastor 24F
                     22:  * driver (ultrastor.c), various Linux kernel source, the Adaptec EISA
                     23:  * config file (!adp7771.cfg), the Adaptec AHA-2740A Series User's Guide,
                     24:  * the Linux Kernel Hacker's Guide, Writing a SCSI Device Driver for Linux,
                     25:  * the Adaptec 1542 driver (aha1542.c), the Adaptec EISA overlay file
                     26:  * (adp7770.ovl), the Adaptec AHA-2740 Series Technical Reference Manual,
                     27:  * the Adaptec AIC-7770 Data Book, the ANSI SCSI specification, the
                     28:  * ANSI SCSI-2 specification (draft 10c), ...
                     29:  *
                     30:  * --------------------------------------------------------------------------
                     31:  *
                     32:  *  Modifications by Daniel M. Eischen ([email protected]):
                     33:  *
                     34:  *  Substantially modified to include support for wide and twin bus
                     35:  *  adapters, DMAing of SCBs, tagged queueing, IRQ sharing, bug fixes,
                     36:  *  SCB paging, and other rework of the code.
                     37:  *
                     38:  *  Parts of this driver were also based on the FreeBSD driver by
                     39:  *  Justin T. Gibbs.  His copyright follows:
                     40:  *
                     41:  * --------------------------------------------------------------------------  
                     42:  * Copyright (c) 1994-1997 Justin Gibbs.
                     43:  * All rights reserved.
                     44:  *
                     45:  * Redistribution and use in source and binary forms, with or without
                     46:  * modification, are permitted provided that the following conditions
                     47:  * are met:
                     48:  * 1. Redistributions of source code must retain the above copyright
                     49:  *    notice, this list of conditions, and the following disclaimer,
                     50:  *    without modification, immediately at the beginning of the file.
                     51:  * 2. Redistributions in binary form must reproduce the above copyright
                     52:  *    notice, this list of conditions and the following disclaimer in the
                     53:  *    documentation and/or other materials provided with the distribution.
                     54:  * 3. The name of the author may not be used to endorse or promote products
                     55:  *    derived from this software without specific prior written permission.
                     56:  *
                     57:  * Where this Software is combined with software released under the terms of 
                     58:  * the GNU Public License ("GPL") and the terms of the GPL would require the 
                     59:  * combined work to also be released under the terms of the GPL, the terms
                     60:  * and conditions of this License will apply in addition to those of the
                     61:  * GPL with the exception of any terms or conditions of this License that
                     62:  * conflict with, or are expressly prohibited by, the GPL.
                     63:  *
                     64:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
                     65:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     66:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     67:  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
                     68:  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     69:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     70:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     71:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     72:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     73:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     74:  * SUCH DAMAGE.
                     75:  *
                     76:  *      $Id: aic7xxx.c,v 1.1 1999/04/26 05:54:15 tb Exp $
                     77:  *---------------------------------------------------------------------------
                     78:  *
                     79:  *  Thanks also go to (in alphabetical order) the following:
                     80:  *
                     81:  *    Rory Bolt     - Sequencer bug fixes
                     82:  *    Jay Estabrook - Initial DEC Alpha support
                     83:  *    Doug Ledford  - Much needed abort/reset bug fixes
                     84:  *    Kai Makisara  - DMAing of SCBs
                     85:  *
                     86:  *  A Boot time option was also added for not resetting the scsi bus.
                     87:  *
                     88:  *    Form:  aic7xxx=extended
                     89:  *           aic7xxx=no_reset
                     90:  *           aic7xxx=ultra
                     91:  *           aic7xxx=irq_trigger:[0,1]  # 0 edge, 1 level
                     92:  *           aic7xxx=verbose
                     93:  *
                     94:  *  Daniel M. Eischen, [email protected], 1/23/97
                     95:  *
                     96:  *  $Id: aic7xxx.c,v 1.1 1999/04/26 05:54:15 tb Exp $
                     97:  *-M*************************************************************************/
                     98: 
                     99: /*+M**************************************************************************
                    100:  *
                    101:  * Further driver modifications made by Doug Ledford <[email protected]>
                    102:  *
                    103:  * Copyright (c) 1997-1998 Doug Ledford
                    104:  *
                    105:  * These changes are released under the same licensing terms as the FreeBSD
                    106:  * driver written by Justin Gibbs.  Please see his Copyright notice above
                    107:  * for the exact terms and conditions covering my changes as well as the
                    108:  * warranty statement.
                    109:  *
                    110:  * Modifications made to the aic7xxx.c,v 4.1 driver from Dan Eischen include
                    111:  * but are not limited to:
                    112:  *
                    113:  *  1: Import of the latest FreeBSD sequencer code for this driver
                    114:  *  2: Modification of kernel code to accomodate different sequencer semantics
                    115:  *  3: Extensive changes throughout kernel portion of driver to improve
                    116:  *     abort/reset processing and error hanndling
                    117:  *  4: Other work contributed by various people on the Internet
                    118:  *  5: Changes to printk information and verbosity selection code
                    119:  *  6: General reliability related changes, especially in IRQ management
                    120:  *  7: Modifications to the default probe/attach order for supported cards
                    121:  *  8: SMP friendliness has been improved
                    122:  *
                    123:  * Overall, this driver represents a significant departure from the official
                    124:  * aic7xxx driver released by Dan Eischen in two ways.  First, in the code
                    125:  * itself.  A diff between the two version of the driver is now a several
                    126:  * thousand line diff.  Second, in approach to solving the same problem.  The
                    127:  * problem is importing the FreeBSD aic7xxx driver code to linux can be a
                    128:  * difficult and time consuming process, that also can be error prone.  Dan
                    129:  * Eischen's official driver uses the approach that the linux and FreeBSD
                    130:  * drivers should be as identical as possible.  To that end, his next version
                    131:  * of this driver will be using a mid-layer code library that he is developing
                    132:  * to moderate communications between the linux mid-level SCSI code and the
                    133:  * low level FreeBSD driver.  He intends to be able to essentially drop the
                    134:  * FreeBSD driver into the linux kernel with only a few minor tweaks to some
                    135:  * include files and the like and get things working, making for fast easy
                    136:  * imports of the FreeBSD code into linux.
                    137:  *
                    138:  * I disagree with Dan's approach.  Not that I don't think his way of doing
                    139:  * things would be nice, easy to maintain, and create a more uniform driver
                    140:  * between FreeBSD and Linux.  I have no objection to those issues.  My
                    141:  * disagreement is on the needed functionality.  There simply are certain
                    142:  * things that are done differently in FreeBSD than linux that will cause
                    143:  * problems for this driver regardless of any middle ware Dan implements.
                    144:  * The biggest example of this at the moment is interrupt semantics.  Linux
                    145:  * doesn't provide the same protection techniques as FreeBSD does, nor can
                    146:  * they be easily implemented in any middle ware code since they would truly
                    147:  * belong in the kernel proper and would effect all drivers.  For the time
                    148:  * being, I see issues such as these as major stumbling blocks to the 
                    149:  * reliability of code based upon such middle ware.  Therefore, I choose to
                    150:  * use a different approach to importing the FreeBSD code that doesn't
                    151:  * involve any middle ware type code.  My approach is to import the sequencer
                    152:  * code from FreeBSD wholesale.  Then, to only make changes in the kernel
                    153:  * portion of the driver as they are needed for the new sequencer semantics.
                    154:  * In this way, the portion of the driver that speaks to the rest of the
                    155:  * linux kernel is fairly static and can be changed/modified to solve
                    156:  * any problems one might encounter without concern for the FreeBSD driver.
                    157:  *
                    158:  * Note: If time and experience should prove me wrong that the middle ware
                    159:  * code Dan writes is reliable in its operation, then I'll retract my above
                    160:  * statements.  But, for those that don't know, I'm from Missouri (in the US)
                    161:  * and our state motto is "The Show-Me State".  Well, before I will put
                    162:  * faith into it, you'll have to show me that it works :)
                    163:  *
                    164:  *_M*************************************************************************/
                    165: 
                    166: /*
                    167:  * The next three defines are user configurable.  These should be the only
                    168:  * defines a user might need to get in here and change.  There are other
                    169:  * defines buried deeper in the code, but those really shouldn't need touched
                    170:  * under normal conditions.
                    171:  */
                    172: 
                    173: /*
                    174:  * AIC7XXX_FAKE_NEGOTIATION_CMDS
                    175:  *   We now have two distinctly different methods of device negotiation
                    176:  *   in this code.  The two methods are selected by either defining or not
                    177:  *   defining this option.  The difference is as follows:
                    178:  *
                    179:  *   With AIC7XXX_FAKE_NEGOTIATION_CMDS not set (commented out)
                    180:  *     When the driver is in need of issuing a negotiation command for any
                    181:  *     given device, it will add the negotiation message on to part of a
                    182:  *     regular SCSI command for the device.  In the process, if the device
                    183:  *     is configured for and using tagged queueing, then the code will
                    184:  *     also issue that single command as a non-tagged command, attach the
                    185:  *     negotiation message to that one command, and use a temporary
                    186:  *     queue depth of one to keep the untagged and tagged commands from
                    187:  *     overlapping.
                    188:  *       Pros: This doesn't use any extra SCB structures, it's simple, it
                    189:  *         works most of the time (if not all of the time now), and
                    190:  *         since we get the device capability info frmo the INQUIRY data
                    191:  *         now, shouldn't cause any problems.
                    192:  *       Cons: When we need to send a negotiation command to a device, we
                    193:  *         must use a command that is being sent to LUN 0 of the device.
                    194:  *         If we try sending one to high LUN numbers, then some devices
                    195:  *         get noticeably upset.  Since we have to wait for a command with
                    196:  *         LUN == 0 to come along, we may not be able to renegotiate when
                    197:  *         we want if the user is actually using say LUN 1 of a CD Changer
                    198:  *         instead of using LUN 0 for an extended period of time.
                    199:  *
                    200:  *   With AIC7XXX_FAKE_NEGOTIATION_CMDS defined
                    201:  *     When we need to negotiate with a device, instead of attaching our
                    202:  *     negotiation message to an existing command, we insert our own
                    203:  *     fictional Scsi_Cmnd into the chain that has the negotiation message
                    204:  *     attached to it.  We send this one command as untagged regardless
                    205:  *     of the device type, and we fiddle with the queue depth the same as
                    206:  *     we would with the option unset to avoid overlapping commands.  The
                    207:  *     primary difference between this and the unset option is that the
                    208:  *     negotiation message is no longer attached to a specific command,
                    209:  *     instead it is its own command and is merely triggered by a
                    210:  *     combination of both A) We need to negotiate and B) The mid level
                    211:  *     SCSI code has sent us a command.  We still don't do any negotiation
                    212:  *     unless there is a valid SCSI command to be processed.
                    213:  *       Pros: This fixes the problem above in the Cons section.  Since we
                    214:  *         issue our own fake command, we can set the LUN to 0 regardless
                    215:  *         of what the LUN is in the real command.  It also means that if
                    216:  *         the device get's nasty over negotiation issues, it won't be
                    217:  *         showing up on a regular command, so we won't get any SENSE buffer
                    218:  *         data or STATUS_BYTE returns to the mid level code that are caused
                    219:  *         by snits in the negotiation code.
                    220:  *       Cons: We add more code, and more complexity.  This means more ways
                    221:  *         in which things could break.  It means a larger driver.  It means
                    222:  *         more resource consumption for the fake commands.  However, the
                    223:  *         biggest problem is this.  Take a system where there is a CD-ROM
                    224:  *         on the SCSI bus.  Someone has a CD in the CD-ROM and is using it.
                    225:  *         For some reason the SCSI bus gets reset.  We don't touch the
                    226:  *         CD-ROM again for quite a period of time (so we don't renegotiate
                    227:  *         after the reset until we do touch the CD-ROM again).  In the
                    228:  *         time while we aren't using the CD-ROM, the current disc is
                    229:  *         removed and a new one put in.  When we go to check that disc, we
                    230:  *         will first have to renegotiate.  In so doing, we issue our fake
                    231:  *         SCSI command, which happens to be TEST_UNIT_READY.  The CD-ROM
                    232:  *         negotiates with us, then responds to our fake command with a
                    233:  *         CHECK_CONDITION status.  We REQUEST_SENSE from the CD-ROM, it
                    234:  *         then sends the SENSE data to our fake command to tell it that
                    235:  *         it has been through a disc change.  There, now we've cleared out
                    236:  *         the SENSE data along with our negotiation command, and when the
                    237:  *         real command executes, it won't pick up that the CD was changed.
                    238:  *         That's the biggest Con to this approach.  In the future, I could
                    239:  *         probably code around this problem though, so this option is still
                    240:  *         viable.
                    241:  *
                    242:  *  So, which command style should you use?  I would appreciate it if people
                    243:  *  could try out both types.  I want to know about any cases where one
                    244:  *  method works and the other doesn't.  If one method works on significantly
                    245:  *  more systems than another, then it will become the default.  If the second
                    246:  *  option turns out to work best, then I'll find a way to work around that
                    247:  *  big con I listed.
                    248:  *
                    249:  *  -- July 7, 02:33
                    250:  *    OK...I just added some code that should make the Con listed for the
                    251:  *    fake commands a non issue now.  However, it needs testing.  For now,
                    252:  *    I'm going to make the default to use the fake commands, we'll see how
                    253:  *    it goes.
                    254:  */
                    255:  
                    256: #define AIC7XXX_FAKE_NEGOTIATION_CMDS
                    257: 
                    258: /*
                    259:  * AIC7XXX_STRICT_PCI_SETUP
                    260:  *   Should we assume the PCI config options on our controllers are set with
                    261:  *   sane and proper values, or should we be anal about our PCI config
                    262:  *   registers and force them to what we want?  The main advantage to
                    263:  *   defining this option is on non-Intel hardware where the BIOS may not
                    264:  *   have been run to set things up, or if you have one of the BIOSless
                    265:  *   Adaptec controllers, such as a 2910, that don't get set up by the
                    266:  *   BIOS.  However, keep in mind that we really do set the most important
                    267:  *   items in the driver regardless of this setting, this only controls some
                    268:  *   of the more esoteric PCI options on these cards.  In that sense, I
                    269:  *   would default to leaving this off.  However, if people wish to try
                    270:  *   things both ways, that would also help me to know if there are some
                    271:  *   machines where it works one way but not another.
                    272:  *
                    273:  *   -- July 7, 17:09
                    274:  *     OK...I need this on my machine for testing, so the default is to
                    275:  *     leave it defined.
                    276:  *
                    277:  *   -- July 7, 18:49
                    278:  *     I needed it for testing, but it didn't make any difference, so back
                    279:  *     off she goes.
                    280:  *
                    281:  *   -- July 16, 23:04
                    282:  *     I turned it back on to try and compensate for the 2.1.x PCI code
                    283:  *     which no longer relies solely on the BIOS and now tries to set
                    284:  *     things itself.
                    285:  */
                    286: 
                    287: #define AIC7XXX_STRICT_PCI_SETUP
                    288: 
                    289: /*
                    290:  * AIC7XXX_VERBOSE_DEBUGGING
                    291:  *   This option enables a lot of extra printk();s in the code, surrounded
                    292:  *   by if (aic7xxx_verbose ...) statements.  Executing all of those if
                    293:  *   statements and the extra checks can get to where it actually does have
                    294:  *   an impact on CPU usage and such, as well as code size.  Disabling this
                    295:  *   define will keep some of those from becoming part of the code.
                    296:  *
                    297:  *   NOTE:  Currently, this option has no real effect, I will be adding the
                    298:  *   various #ifdef's in the code later when I've decided a section is
                    299:  *   complete and no longer needs debugging.  OK...a lot of things are now
                    300:  *   surrounded by this define, so turning this off does have an impact.
                    301:  */
                    302:  
                    303: /*
                    304:  * #define AIC7XXX_VERBOSE_DEBUGGING
                    305:  */
                    306:  
                    307: #if defined(MODULE) || defined(PCMCIA)
                    308: #include <linux/module.h>
                    309: #endif
                    310: 
                    311: #if defined(PCMCIA)
                    312: #  undef MODULE
                    313: #endif
                    314: 
                    315: #include <stdarg.h>
                    316: #include <asm/io.h>
                    317: #include <asm/irq.h>
                    318: #include <asm/byteorder.h>
                    319: #include <linux/version.h>
                    320: #include <linux/string.h>
                    321: #include <linux/errno.h>
                    322: #include <linux/kernel.h>
                    323: #include <linux/ioport.h>
                    324: #include <linux/delay.h>
                    325: #include <linux/sched.h>
                    326: #include <linux/pci.h>
                    327: #include <linux/proc_fs.h>
                    328: #include <linux/blk.h>
                    329: #include <linux/tqueue.h>
                    330: #include <linux/tasks.h>
                    331: #include "sd.h"
                    332: #include "scsi.h"
                    333: #include "hosts.h"
                    334: #include "aic7xxx.h"
                    335: 
                    336: #include "aic7xxx/sequencer.h"
                    337: #include "aic7xxx/scsi_message.h"
                    338: #include "aic7xxx_reg.h"
                    339: 
                    340: #include <linux/stat.h>
                    341: #include <linux/malloc.h>        /* for kmalloc() */
                    342: 
                    343: #include <linux/config.h>        /* for CONFIG_PCI */
                    344: 
                    345: /*
                    346:  * To generate the correct addresses for the controller to issue
                    347:  * on the bus.  Originally added for DEC Alpha support.
                    348:  */
                    349: #define VIRT_TO_BUS(a) (unsigned int)virt_to_bus((void *)(a))
                    350: 
                    351: struct proc_dir_entry proc_scsi_aic7xxx = {
                    352:     PROC_SCSI_AIC7XXX, 7, "aic7xxx",
                    353:     S_IFDIR | S_IRUGO | S_IXUGO, 2,
                    354:     0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL
                    355: };
                    356: 
                    357: #define AIC7XXX_C_VERSION  "5.1.4"
                    358: 
                    359: #define NUMBER(arr)     (sizeof(arr) / sizeof(arr[0]))
                    360: #define MIN(a,b)        (((a) < (b)) ? (a) : (b))
                    361: #define MAX(a,b)        (((a) > (b)) ? (a) : (b))
                    362: #define ALL_TARGETS -1
                    363: #define ALL_CHANNELS -1
                    364: #define ALL_LUNS -1
                    365: #define MAX_TARGETS  16
                    366: #define MAX_LUNS     8
                    367: #ifndef TRUE
                    368: #  define TRUE 1
                    369: #endif
                    370: #ifndef FALSE
                    371: #  define FALSE 0
                    372: #endif
                    373: 
                    374: #ifndef KERNEL_VERSION
                    375: #  define KERNEL_VERSION(x,y,z) (((x)<<16)+((y)<<8)+(z))
                    376: #endif
                    377: 
                    378: /*
                    379:  * We need the bios32.h file if we are kernel version 2.1.92 or less.  The
                    380:  * full set of pci_* changes wasn't in place until 2.1.93
                    381:  */
                    382: 
                    383: #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,1,92)
                    384: #  if defined(__sparc_v9__) || defined(__powerpc__)
                    385: #    error "PPC and Sparc platforms are only support under 2.1.92 and above"
                    386: #  endif
                    387: #  include <linux/bios32.h>
                    388: #endif
                    389: 
                    390: #if defined(__powerpc__)
                    391: #  define MMAPIO
                    392: #  ifdef mb
                    393: #    undef mb
                    394: #  endif
                    395: #  define mb() \
                    396:      __asm__ __volatile__("eieio" ::: "memory")
                    397: #elif defined(__i386__)
                    398: #  define MMAPIO
                    399: #  ifdef mb
                    400: #    undef mb
                    401: #  endif
                    402: #  define mb() \
                    403:      __asm__ __volatile__("lock ; addl $0,0(%%esp)": : :"memory")
                    404: #elif defined(__alpha__)
                    405: #  ifdef mb
                    406: #    undef mb
                    407: #  endif
                    408: #  define mb() \
                    409:      __asm__ __volatile__("mb": : :"memory")
                    410: #endif
                    411: 
                    412: #if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,0)
                    413: #  include <asm/spinlock.h>
                    414: #  include <linux/smp.h>
                    415: #  define cpuid smp_processor_id()
                    416: #  if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95)
                    417: #    define DRIVER_LOCK_INIT \
                    418:        spin_lock_init(&p->spin_lock);
                    419: #    define DRIVER_LOCK \
                    420:        if(!p->cpu_lock_count[cpuid]) { \
                    421:          spin_lock_irqsave(&p->spin_lock, cpu_flags); \
                    422:          p->cpu_lock_count[cpuid]++; \
                    423:        } else { \
                    424:          p->cpu_lock_count[cpuid]++; \
                    425:        }
                    426: #    define DRIVER_UNLOCK \
                    427:        if(--p->cpu_lock_count[cpuid] == 0) \
                    428:          spin_unlock_irqrestore(&p->spin_lock, cpu_flags);
                    429: #  else
                    430: #    define DRIVER_LOCK_INIT
                    431: #    define DRIVER_LOCK
                    432: #    define DRIVER_UNLOCK
                    433: #  endif
                    434: #else
                    435: #  define cpuid 0
                    436: #  define DRIVER_LOCK_INIT
                    437: #  define DRIVER_LOCK \
                    438:        save_flags(cpu_flags); \
                    439:        cli();
                    440: #  define DRIVER_UNLOCK \
                    441:        restore_flags(cpu_flags);
                    442: #  define le32_to_cpu(x) (x)
                    443: #  define cpu_to_le32(x) (x)
                    444: #endif
                    445: 
                    446: /*
                    447:  * You can try raising me if tagged queueing is enabled, or lowering
                    448:  * me if you only have 4 SCBs.
                    449:  */
                    450: #ifdef CONFIG_AIC7XXX_CMDS_PER_LUN
                    451: #define AIC7XXX_CMDS_PER_LUN CONFIG_AIC7XXX_CMDS_PER_LUN
                    452: #endif
                    453: 
                    454: /* Set this to the delay in seconds after SCSI bus reset. */
                    455: #ifdef CONFIG_AIC7XXX_RESET_DELAY
                    456: #define AIC7XXX_RESET_DELAY CONFIG_AIC7XXX_RESET_DELAY
                    457: #else
                    458: #define AIC7XXX_RESET_DELAY 5
                    459: #endif
                    460: 
                    461: /*
                    462:  * Control collection of SCSI transfer statistics for the /proc filesystem.
                    463:  *
                    464:  * NOTE: Do NOT enable this when running on kernels version 1.2.x and below.
                    465:  * NOTE: This does affect performance since it has to maintain statistics.
                    466:  */
                    467: #ifdef CONFIG_AIC7XXX_PROC_STATS
                    468: #define AIC7XXX_PROC_STATS
                    469: #endif
                    470: 
                    471: /*
                    472:  * NOTE: Uncommenting the define below no longer has any effect, the
                    473:  *       tagged queue value array is always active now.  I've added
                    474:  *       a setup option to set this particular array and I'm hoping
                    475:  *       insmod will be smart enough to set it properly as well.  It's
                    476:  *       by use of this array that a person can enable tagged queueing.
                    477:  *       The DEFAULT_TAG_COMMANDS define has been changed to disable
                    478:  *       tagged queueing by default, so if your devices can handle tagged
                    479:  *       queueing you will need to add a line to their lilo.conf file like:
                    480:  *       append="aic7xxx=verbose,tag_info:{{32,32,32,32},{32,32,32,32}}"
                    481:  *       which will result in the first four devices on the first two
                    482:  *       controllers being set to a tagged queue depth of 32.
                    483:  *
                    484:  * Set this for defining the number of tagged commands on a device
                    485:  * by device, and controller by controller basis.  The first set
                    486:  * of tagged commands will be used for the first detected aic7xxx
                    487:  * controller, the second set will be used for the second detected
                    488:  * aic7xxx controller, and so on.  These values will *only* be used
                    489:  * for targets that are tagged queueing capable; these values will
                    490:  * be ignored in all other cases.  The tag_commands is an array of
                    491:  * 16 to allow for wide and twin adapters.  Twin adapters will use
                    492:  * indexes 0-7 for channel 0, and indexes 8-15 for channel 1.
                    493:  *
                    494:  * *** Determining commands per LUN ***
                    495:  * 
                    496:  * When AIC7XXX_CMDS_PER_LUN is not defined, the driver will use its
                    497:  * own algorithm to determine the commands/LUN.  If SCB paging is
                    498:  * enabled, which is always now, the default is 8 commands per lun
                    499:  * that indicates it supports tagged queueing.  All non-tagged devices
                    500:  * use an internal queue depth of 3, with no more than one of those
                    501:  * three commands active at one time.
                    502:  */
                    503: /* #define AIC7XXX_TAGGED_QUEUEING_BY_DEVICE */
                    504: 
                    505: typedef struct
                    506: {
                    507:   unsigned char tag_commands[16];   /* Allow for wide/twin adapters. */
                    508: } adapter_tag_info_t;
                    509: 
                    510: /*
                    511:  * Make a define that will tell the driver not to use tagged queueing
                    512:  * by default.
                    513:  */
                    514: #define DEFAULT_TAG_COMMANDS {255, 255, 255, 255, 255, 255, 255, 255,\
                    515:                               255, 255, 255, 255, 255, 255, 255, 255}
                    516: 
                    517: /*
                    518:  * Modify this as you see fit for your system.  By setting tag_commands
                    519:  * to 0, the driver will use it's own algorithm for determining the
                    520:  * number of commands to use (see above).  When 255, the driver will
                    521:  * not enable tagged queueing for that particular device.  When positive
                    522:  * (> 0) and (< 255) the values in the array are used for the queue_depth.
                    523:  * Note that the maximum value for an entry is 254, but you're insane if
                    524:  * you try to use that many commands on one device.
                    525:  *
                    526:  * In this example, the first line will disable tagged queueing for all
                    527:  * the devices on the first probed aic7xxx adapter.
                    528:  *
                    529:  * The second line enables tagged queueing with 4 commands/LUN for IDs
                    530:  * (1, 2-11, 13-15), disables tagged queueing for ID 12, and tells the
                    531:  * driver to use its own algorithm for ID 1.
                    532:  *
                    533:  * The third line is the same as the first line.
                    534:  *
                    535:  * The fourth line disables tagged queueing for devices 0 and 3.  It
                    536:  * enables tagged queueing for the other IDs, with 16 commands/LUN
                    537:  * for IDs 1 and 4, 127 commands/LUN for ID 8, and 4 commands/LUN for
                    538:  * IDs 2, 5-7, and 9-15.
                    539:  */
                    540: 
                    541: /*
                    542:  * NOTE: The below structure is for reference only, the actual structure
                    543:  *       to modify in order to change things is located around line
                    544:  *       number 1305
                    545: adapter_tag_info_t aic7xxx_tag_info[] =
                    546: {
                    547:   {DEFAULT_TAG_COMMANDS},
                    548:   {{4, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 255, 4, 4, 4}},
                    549:   {DEFAULT_TAG_COMMANDS},
                    550:   {{255, 16, 4, 255, 16, 4, 4, 4, 127, 4, 4, 4, 4, 4, 4, 4}}
                    551: };
                    552: */
                    553: 
                    554: /*
                    555:  * Define an array of board names that can be indexed by aha_type.
                    556:  * Don't forget to change this when changing the types!
                    557:  */
                    558: static const char *board_names[] = {
                    559:   "AIC-7xxx Unknown",                                   /* AIC_NONE */
                    560:   "Adaptec AIC-7810 Hardware RAID Controller",          /* AIC_7810 */
                    561:   "Adaptec AIC-7770 SCSI host adapter",                 /* AIC_7770 */
                    562:   "Adaptec AHA-274X SCSI host adapter",                 /* AIC_7771 */
                    563:   "Adaptec AHA-284X SCSI host adapter",                 /* AIC_284x */
                    564:   "Adaptec AIC-7850 SCSI host adapter",                 /* AIC_7850 */
                    565:   "Adaptec AIC-7855 SCSI host adapter",                 /* AIC_7855 */
                    566:   "Adaptec AIC-7860 Ultra SCSI host adapter",           /* AIC_7860 */
                    567:   "Adaptec AHA-2940A Ultra SCSI host adapter",          /* AIC_7861 */
                    568:   "Adaptec AIC-7870 SCSI host adapter",                 /* AIC_7870 */
                    569:   "Adaptec AHA-294X SCSI host adapter",                 /* AIC_7871 */
                    570:   "Adaptec AHA-394X SCSI host adapter",                 /* AIC_7872 */
                    571:   "Adaptec AHA-398X SCSI host adapter",                 /* AIC_7873 */
                    572:   "Adaptec AHA-2944 SCSI host adapter",                 /* AIC_7874 */
                    573:   "Adaptec AIC-7880 Ultra SCSI host adapter",           /* AIC_7880 */
                    574:   "Adaptec AHA-294X Ultra SCSI host adapter",           /* AIC_7881 */
                    575:   "Adaptec AHA-394X Ultra SCSI host adapter",           /* AIC_7882 */
                    576:   "Adaptec AHA-398X Ultra SCSI host adapter",           /* AIC_7883 */
                    577:   "Adaptec AHA-2944 Ultra SCSI host adapter",           /* AIC_7884 */
                    578:   "Adaptec AIC-7895 Ultra SCSI host adapter",           /* AIC_7895 */
                    579:   "Adaptec AIC-7890/1 Ultra2 SCSI host adapter",        /* AIC_7890 */
                    580:   "Adaptec AHA-294X Ultra2 SCSI host adapter",          /* AIC_7890 */
                    581:   "Adaptec AIC-7896/7 Ultra2 SCSI host adapter",        /* AIC_7896 */
                    582:   "Adaptec AHA-394X Ultra2 SCSI host adapter"           /* AIC_7897 */
                    583: };
                    584: 
                    585: /*
                    586:  * There should be a specific return value for this in scsi.h, but
                    587:  * it seems that most drivers ignore it.
                    588:  */
                    589: #define DID_UNDERFLOW   DID_ERROR
                    590: 
                    591: /*
                    592:  *  What we want to do is have the higher level scsi driver requeue
                    593:  *  the command to us. There is no specific driver status for this
                    594:  *  condition, but the higher level scsi driver will requeue the
                    595:  *  command on a DID_BUS_BUSY error.
                    596:  *
                    597:  *  Upon further inspection and testing, it seems that DID_BUS_BUSY
                    598:  *  will *always* retry the command.  We can get into an infinite loop
                    599:  *  if this happens when we really want some sort of counter that
                    600:  *  will automatically abort/reset the command after so many retries.
                    601:  *  Using DID_ERROR will do just that.  (Made by a suggestion by
                    602:  *  Doug Ledford 8/1/96)
                    603:  */
                    604: #define DID_RETRY_COMMAND DID_ERROR
                    605: 
                    606: #define HSCSIID        0x07
                    607: #define SCSI_RESET     0x040
                    608: 
                    609: /*
                    610:  * EISA/VL-bus stuff
                    611:  */
                    612: #define MINSLOT                1
                    613: #define MAXSLOT                15
                    614: #define SLOTBASE(x)        ((x) << 12)
                    615: #define BASE_TO_SLOT(x) ((x) >> 12)
                    616: 
                    617: /*
                    618:  * Standard EISA Host ID regs  (Offset from slot base)
                    619:  */
                    620: #define AHC_HID0              0x80   /* 0,1: msb of ID2, 2-7: ID1      */
                    621: #define AHC_HID1              0x81   /* 0-4: ID3, 5-7: LSB ID2         */
                    622: #define AHC_HID2              0x82   /* product                        */
                    623: #define AHC_HID3              0x83   /* firmware revision              */
                    624: 
                    625: /*
                    626:  * AIC-7770 I/O range to reserve for a card
                    627:  */
                    628: #define MINREG                0xC00
                    629: #define MAXREG                0xCBF
                    630: 
                    631: #define INTDEF                0x5C      /* Interrupt Definition Register */
                    632: 
                    633: /*
                    634:  * AIC-78X0 PCI registers
                    635:  */
                    636: #define        CLASS_PROGIF_REVID        0x08
                    637: #define                DEVREVID        0x000000FFul
                    638: #define                PROGINFC        0x0000FF00ul
                    639: #define                SUBCLASS        0x00FF0000ul
                    640: #define                BASECLASS        0xFF000000ul
                    641: 
                    642: #define        CSIZE_LATTIME                0x0C
                    643: #define                CACHESIZE        0x0000003Ful        /* only 5 bits */
                    644: #define                LATTIME                0x0000FF00ul
                    645: 
                    646: #define        DEVCONFIG                0x40
                    647: #define                SCBSIZE32        0x00010000ul        /* aic789X only */
                    648: #define                MPORTMODE        0x00000400ul        /* aic7870 only */
                    649: #define                RAMPSM           0x00000200ul        /* aic7870 only */
                    650: #define                RAMPSM_ULTRA2    0x00000004
                    651: #define                VOLSENSE         0x00000100ul
                    652: #define                SCBRAMSEL        0x00000080ul
                    653: #define                SCBRAMSEL_ULTRA2 0x00000008
                    654: #define                MRDCEN           0x00000040ul
                    655: #define                EXTSCBTIME       0x00000020ul        /* aic7870 only */
                    656: #define                EXTSCBPEN        0x00000010ul        /* aic7870 only */
                    657: #define                BERREN           0x00000008ul
                    658: #define                DACEN            0x00000004ul
                    659: #define                STPWLEVEL        0x00000002ul
                    660: #define                DIFACTNEGEN      0x00000001ul        /* aic7870 only */
                    661: 
                    662: #define        SCAMCTL                  0x1a                /* Ultra2 only  */
                    663: #define        CCSCBBADDR               0xf0                /* aic7895/6/7  */
                    664: 
                    665: /*
                    666:  * Define the different types of SEEPROMs on aic7xxx adapters
                    667:  * and make it also represent the address size used in accessing
                    668:  * its registers.  The 93C46 chips have 1024 bits organized into
                    669:  * 64 16-bit words, while the 93C56 chips have 2048 bits organized
                    670:  * into 128 16-bit words.  The C46 chips use 6 bits to address
                    671:  * each word, while the C56 and C66 (4096 bits) use 8 bits to
                    672:  * address each word.
                    673:  */
                    674: typedef enum {C46 = 6, C56_66 = 8} seeprom_chip_type;
                    675: 
                    676: /*
                    677:  *
                    678:  * Define the format of the SEEPROM registers (16 bits).
                    679:  *
                    680:  */
                    681: struct seeprom_config {
                    682: 
                    683: /*
                    684:  * SCSI ID Configuration Flags
                    685:  */
                    686: #define CFXFER                0x0007      /* synchronous transfer rate */
                    687: #define CFSYNCH               0x0008      /* enable synchronous transfer */
                    688: #define CFDISC                0x0010      /* enable disconnection */
                    689: #define CFWIDEB               0x0020      /* wide bus device (wide card) */
                    690: #define CFSYNCHISULTRA        0x0040      /* CFSYNC is an ultra offset */
                    691: #define CFNEWULTRAFORMAT      0x0080      /* Use the Ultra2 SEEPROM format */
                    692: #define CFSTART               0x0100      /* send start unit SCSI command */
                    693: #define CFINCBIOS             0x0200      /* include in BIOS scan */
                    694: #define CFRNFOUND             0x0400      /* report even if not found */
                    695: #define CFMULTILUN            0x0800      /* probe mult luns in BIOS scan */
                    696: #define CFWBCACHEYES          0x4000      /* Enable W-Behind Cache on drive */
                    697: #define CFWBCACHENC           0xc000      /* Don't change W-Behind Cache */
                    698: /* UNUSED                0x3000 */
                    699:   unsigned short device_flags[16];        /* words 0-15 */
                    700: 
                    701: /*
                    702:  * BIOS Control Bits
                    703:  */
                    704: #define CFSUPREM        0x0001  /* support all removable drives */
                    705: #define CFSUPREMB       0x0002  /* support removable drives for boot only */
                    706: #define CFBIOSEN        0x0004  /* BIOS enabled */
                    707: /* UNUSED                0x0008 */
                    708: #define CFSM2DRV        0x0010  /* support more than two drives */
                    709: #define CF284XEXTEND    0x0020  /* extended translation (284x cards) */
                    710: /* UNUSED                0x0040 */
                    711: #define CFEXTEND        0x0080  /* extended translation enabled */
                    712: /* UNUSED                0xFF00 */
                    713:   unsigned short bios_control;  /* word 16 */
                    714: 
                    715: /*
                    716:  * Host Adapter Control Bits
                    717:  */
                    718: #define CFAUTOTERM      0x0001  /* Perform Auto termination */
                    719: #define CFULTRAEN       0x0002  /* Ultra SCSI speed enable (Ultra cards) */
                    720: #define CF284XSELTO     0x0003  /* Selection timeout (284x cards) */
                    721: #define CF284XFIFO      0x000C  /* FIFO Threshold (284x cards) */
                    722: #define CFSTERM         0x0004  /* SCSI low byte termination */
                    723: #define CFWSTERM        0x0008  /* SCSI high byte termination (wide card) */
                    724: #define CFSPARITY       0x0010  /* SCSI parity */
                    725: #define CF284XSTERM     0x0020  /* SCSI low byte termination (284x cards) */
                    726: #define CFRESETB        0x0040  /* reset SCSI bus at boot */
                    727: #define CFBPRIMARY      0x0100  /* Channel B primary on 7895 chipsets */
                    728: #define CFSEAUTOTERM    0x0400  /* aic7890 Perform SE Auto Term */
                    729: #define CFLVDSTERM      0x0800  /* aic7890 LVD Termination */
                    730: /* UNUSED                0xF280 */
                    731:   unsigned short adapter_control;        /* word 17 */
                    732: 
                    733: /*
                    734:  * Bus Release, Host Adapter ID
                    735:  */
                    736: #define CFSCSIID        0x000F                /* host adapter SCSI ID */
                    737: /* UNUSED                0x00F0 */
                    738: #define CFBRTIME        0xFF00                /* bus release time */
                    739:   unsigned short brtime_id;                /* word 18 */
                    740: 
                    741: /*
                    742:  * Maximum targets
                    743:  */
                    744: #define CFMAXTARG        0x00FF        /* maximum targets */
                    745: /* UNUSED                0xFF00 */
                    746:   unsigned short max_targets;                /* word 19 */
                    747: 
                    748:   unsigned short res_1[11];                /* words 20-30 */
                    749:   unsigned short checksum;                /* word 31 */
                    750: };
                    751: 
                    752: #define SELBUS_MASK                0x0a
                    753: #define         SELNARROW        0x00
                    754: #define         SELBUSB                0x08
                    755: #define SINGLE_BUS                0x00
                    756: 
                    757: #define SCB_TARGET(scb)         \
                    758:        (((scb)->hscb->target_channel_lun & TID) >> 4)
                    759: #define SCB_LUN(scb)            \
                    760:        ((scb)->hscb->target_channel_lun & LID)
                    761: #define SCB_IS_SCSIBUS_B(scb)   \
                    762:        (((scb)->hscb->target_channel_lun & SELBUSB) != 0)
                    763: 
                    764: /*
                    765:  * If an error occurs during a data transfer phase, run the command
                    766:  * to completion - it's easier that way - making a note of the error
                    767:  * condition in this location. This then will modify a DID_OK status
                    768:  * into an appropriate error for the higher-level SCSI code.
                    769:  */
                    770: #define aic7xxx_error(cmd)        ((cmd)->SCp.Status)
                    771: 
                    772: /*
                    773:  * Keep track of the targets returned status.
                    774:  */
                    775: #define aic7xxx_status(cmd)        ((cmd)->SCp.sent_command)
                    776: 
                    777: /*
                    778:  * The position of the SCSI commands scb within the scb array.
                    779:  */
                    780: #define aic7xxx_position(cmd)        ((cmd)->SCp.have_data_in)
                    781: 
                    782: /*
                    783:  * So we can keep track of our host structs
                    784:  */
                    785: static struct aic7xxx_host *first_aic7xxx = NULL;
                    786: 
                    787: /*
                    788:  * As of Linux 2.1, the mid-level SCSI code uses virtual addresses
                    789:  * in the scatter-gather lists.  We need to convert the virtual
                    790:  * addresses to physical addresses.
                    791:  */
                    792: struct hw_scatterlist {
                    793:   unsigned int address;
                    794:   unsigned int length;
                    795: };
                    796: 
                    797: /*
                    798:  * Maximum number of SG segments these cards can support.
                    799:  */
                    800: #define        AIC7XXX_MAX_SG 128
                    801: 
                    802: /*
                    803:  * The maximum number of SCBs we could have for ANY type
                    804:  * of card. DON'T FORGET TO CHANGE THE SCB MASK IN THE
                    805:  * SEQUENCER CODE IF THIS IS MODIFIED!
                    806:  */
                    807: #define AIC7XXX_MAXSCB        255
                    808: 
                    809: 
                    810: struct aic7xxx_hwscb {
                    811: /* ------------    Begin hardware supported fields    ---------------- */
                    812: /* 0*/  unsigned char control;
                    813: /* 1*/  unsigned char target_channel_lun;       /* 4/1/3 bits */
                    814: /* 2*/  unsigned char target_status;
                    815: /* 3*/  unsigned char SG_segment_count;
                    816: /* 4*/  unsigned int  SG_list_pointer;
                    817: /* 8*/  unsigned char residual_SG_segment_count;
                    818: /* 9*/  unsigned char residual_data_count[3];
                    819: /*12*/  unsigned int  data_pointer;
                    820: /*16*/  unsigned int  data_count;
                    821: /*20*/  unsigned int  SCSI_cmd_pointer;
                    822: /*24*/  unsigned char SCSI_cmd_length;
                    823: /*25*/  unsigned char tag;          /* Index into our kernel SCB array.
                    824:                                      * Also used as the tag for tagged I/O
                    825:                                      */
                    826: #define SCB_PIO_TRANSFER_SIZE  26   /* amount we need to upload/download
                    827:                                      * via PIO to initialize a transaction.
                    828:                                      */
                    829: /*26*/  unsigned char next;         /* Used to thread SCBs awaiting selection
                    830:                                      * or disconnected down in the sequencer.
                    831:                                      */
                    832: /*27*/  unsigned char prev;
                    833: /*28*/  unsigned int pad;           /*
                    834:                                      * Unused by the kernel, but we require
                    835:                                      * the padding so that the array of
                    836:                                      * hardware SCBs is alligned on 32 byte
                    837:                                      * boundaries so the sequencer can index
                    838:                                      */
                    839: };
                    840: 
                    841: typedef enum {
                    842:         SCB_FREE                = 0x0000,
                    843:         SCB_WAITINGQ            = 0x0002,
                    844:         SCB_ACTIVE              = 0x0004,
                    845:         SCB_SENSE               = 0x0008,
                    846:         SCB_ABORT               = 0x0010,
                    847:         SCB_DEVICE_RESET        = 0x0020,
                    848:         SCB_RESET               = 0x0040,
                    849:         SCB_RECOVERY_SCB        = 0x0080,
                    850:         SCB_WAS_BUSY            = 0x0100,
                    851:         SCB_MSGOUT_SENT         = 0x0200,
                    852:         SCB_MSGOUT_SDTR         = 0x0400,
                    853:         SCB_MSGOUT_WDTR         = 0x0800,
                    854:         SCB_MSGOUT_BITS         = SCB_MSGOUT_SENT | 
                    855:                                   SCB_MSGOUT_SDTR |
                    856:                                   SCB_MSGOUT_WDTR,
                    857:         SCB_QUEUED_ABORT        = 0x1000,
                    858:         SCB_QUEUED_FOR_DONE     = 0x2000
                    859: } scb_flag_type;
                    860: 
                    861: typedef enum {
                    862:         AHC_FNONE                 = 0x00000000,
                    863:         AHC_PAGESCBS              = 0x00000001,
                    864:         AHC_CHANNEL_B_PRIMARY     = 0x00000002,
                    865:         AHC_USEDEFAULTS           = 0x00000004,
                    866:         AHC_INDIRECT_PAGING       = 0x00000008,
                    867:         AHC_CHNLB                 = 0x00000020,
                    868:         AHC_CHNLC                 = 0x00000040,
                    869:         AHC_EXTEND_TRANS_A        = 0x00000100,
                    870:         AHC_EXTEND_TRANS_B        = 0x00000200,
                    871:         AHC_TERM_ENB_A            = 0x00000400,
                    872:         AHC_TERM_ENB_SE_LOW       = 0x00000400,
                    873:         AHC_TERM_ENB_B            = 0x00000800,
                    874:         AHC_TERM_ENB_SE_HIGH      = 0x00000800,
                    875:         AHC_HANDLING_REQINITS     = 0x00001000,
                    876:         AHC_TARGETMODE            = 0x00002000,
                    877:         AHC_NEWEEPROM_FMT         = 0x00004000,
                    878:  /*
                    879:   *  Here ends the FreeBSD defined flags and here begins the linux defined
                    880:   *  flags.  NOTE: I did not preserve the old flag name during this change
                    881:   *  specifically to force me to evaluate what flags were being used properly
                    882:   *  and what flags weren't.  This way, I could clean up the flag usage on
                    883:   *  a use by use basis.  Doug Ledford
                    884:   */
                    885:         AHC_A_SCANNED             = 0x00100000,
                    886:         AHC_B_SCANNED             = 0x00200000,
                    887:         AHC_MULTI_CHANNEL         = 0x00400000,
                    888:         AHC_BIOS_ENABLED          = 0x00800000,
                    889:         AHC_SEEPROM_FOUND         = 0x01000000,
                    890:         AHC_TERM_ENB_LVD          = 0x02000000,
                    891:         AHC_ABORT_PENDING         = 0x04000000,
                    892:         AHC_RESET_PENDING         = 0x08000000,
                    893: #define AHC_IN_ISR_BIT              28
                    894:         AHC_IN_ISR                = 0x10000000,
                    895:         AHC_IN_ABORT              = 0x20000000,
                    896:         AHC_IN_RESET              = 0x40000000,
                    897:         AHC_EXTERNAL_SRAM         = 0x80000000
                    898: } ahc_flag_type;
                    899: 
                    900: typedef enum {
                    901:   AHC_NONE             = 0x0000,
                    902:   AHC_CHIPID_MASK      = 0x00ff,
                    903:   AHC_AIC7770          = 0x0001,
                    904:   AHC_AIC7850          = 0x0002,
                    905:   AHC_AIC7860          = 0x0003,
                    906:   AHC_AIC7870          = 0x0004,
                    907:   AHC_AIC7880          = 0x0005,
                    908:   AHC_AIC7890          = 0x0006,
                    909:   AHC_AIC7895          = 0x0007,
                    910:   AHC_AIC7896          = 0x0008,
                    911:   AHC_VL               = 0x0100,
                    912:   AHC_EISA             = 0x0200,
                    913:   AHC_PCI              = 0x0400,
                    914: } ahc_chip;
                    915: 
                    916: typedef enum {
                    917:   AHC_FENONE           = 0x0000,
                    918:   AHC_ULTRA            = 0x0001,
                    919:   AHC_ULTRA2           = 0x0002,
                    920:   AHC_WIDE             = 0x0004,
                    921:   AHC_TWIN             = 0x0008,
                    922:   AHC_MORE_SRAM        = 0x0010,
                    923:   AHC_CMD_CHAN         = 0x0020,
                    924:   AHC_QUEUE_REGS       = 0x0040,
                    925:   AHC_SG_PRELOAD       = 0x0080,
                    926:   AHC_SPIOCAP          = 0x0100,
                    927:   AHC_AIC7770_FE       = AHC_FENONE,
                    928:   AHC_AIC7850_FE       = AHC_SPIOCAP,
                    929:   AHC_AIC7860_FE       = AHC_ULTRA|AHC_SPIOCAP,
                    930:   AHC_AIC7870_FE       = AHC_FENONE,
                    931:   AHC_AIC7880_FE       = AHC_ULTRA,
                    932:   AHC_AIC7890_FE       = AHC_MORE_SRAM|AHC_CMD_CHAN|AHC_ULTRA2|
                    933:                          AHC_QUEUE_REGS|AHC_SG_PRELOAD,
                    934:   AHC_AIC7895_FE       = AHC_MORE_SRAM|AHC_CMD_CHAN|AHC_ULTRA,
                    935:   AHC_AIC7896_FE       = AHC_AIC7890_FE,
                    936: } ahc_feature;
                    937: 
                    938: struct aic7xxx_scb {
                    939:         struct aic7xxx_hwscb  *hscb;          /* corresponding hardware scb */
                    940:         Scsi_Cmnd             *cmd;              /* Scsi_Cmnd for this scb */
                    941:         struct aic7xxx_scb    *q_next;        /* next scb in queue */
                    942:         volatile scb_flag_type flags;         /* current state of scb */
                    943:         struct hw_scatterlist *sg_list;       /* SG list in adapter format */
                    944:         void                  *kmalloc_ptr;
                    945:         unsigned char          tag_action;
                    946:         unsigned char          sg_count;
                    947:         unsigned char          sense_cmd[6];  /*
                    948:                                                * Allocate 6 characters for
                    949:                                                * sense command.
                    950:                                                */
                    951:         unsigned int           sg_length; /* We init this during buildscb so we
                    952:                                            * don't have to calculate anything
                    953:                                            * during underflow/overflow/stat code
                    954:                                            */
                    955: };
                    956: 
                    957: /*
                    958:  * Define a linked list of SCBs.
                    959:  */
                    960: typedef struct {
                    961:   struct aic7xxx_scb *head;
                    962:   struct aic7xxx_scb *tail;
                    963: } scb_queue_type;
                    964: 
                    965: static struct {
                    966:   unsigned char errno;
                    967:   const char *errmesg;
                    968: } hard_error[] = {
                    969:   { ILLHADDR,  "Illegal Host Access" },
                    970:   { ILLSADDR,  "Illegal Sequencer Address referenced" },
                    971:   { ILLOPCODE, "Illegal Opcode in sequencer program" },
                    972:   { SQPARERR,  "Sequencer Ram Parity Error" },
                    973:   { DPARERR,   "Data-Path Ram Parity Error" },
                    974:   { MPARERR,   "Scratch Ram/SCB Array Ram Parity Error" },
                    975:   { PCIERRSTAT,"PCI Error detected" },
                    976:   { CIOPARERR, "CIOBUS Parity Error" }
                    977: };
                    978: 
                    979: static unsigned char
                    980: generic_sense[] = { REQUEST_SENSE, 0, 0, 0, 255, 0 };
                    981: 
                    982: typedef struct {
                    983:   scb_queue_type free_scbs;        /*
                    984:                                     * SCBs assigned to free slot on
                    985:                                     * card (no paging required)
                    986:                                     */
                    987:   struct aic7xxx_scb   *scb_array[AIC7XXX_MAXSCB];
                    988:   struct aic7xxx_hwscb *hscbs;
                    989:   unsigned char  numscbs;          /* current number of scbs */
                    990:   unsigned char  maxhscbs;         /* hardware scbs */
                    991:   unsigned char  maxscbs;          /* max scbs including pageable scbs */
                    992:   void          *hscb_kmalloc_ptr;
                    993: } scb_data_type;
                    994: 
                    995: struct target_cmd {
                    996:   unsigned char mesg_bytes[4];
                    997:   unsigned char command[28];
                    998: };
                    999: 
                   1000: #define AHC_TRANS_CUR    0x0001
                   1001: #define AHC_TRANS_ACTIVE 0x0002
                   1002: #define AHC_TRANS_GOAL   0x0004
                   1003: #define AHC_TRANS_USER   0x0008
                   1004: #define AHC_TRANS_QUITE  0x0010
                   1005: typedef struct {
                   1006:   unsigned char cur_width;
                   1007:   unsigned char goal_width;
                   1008:   unsigned char cur_period;
                   1009:   unsigned char goal_period;
                   1010:   unsigned char cur_offset;
                   1011:   unsigned char goal_offset;
                   1012:   unsigned char user_width;
                   1013:   unsigned char user_period;
                   1014:   unsigned char user_offset;
                   1015: } transinfo_type;
                   1016: 
                   1017: /*
                   1018:  * Define a structure used for each host adapter.  Note, in order to avoid
                   1019:  * problems with architectures I can't test on (because I don't have one,
                   1020:  * such as the Alpha based systems) which happen to give faults for
                   1021:  * non-aligned memory accesses, care was taken to align this structure
                   1022:  * in a way that gauranteed all accesses larger than 8 bits were aligned
                   1023:  * on the appropriate boundary.  It's also organized to try and be more
                   1024:  * cache line efficient.  Be careful when changing this lest you might hurt
                   1025:  * overall performance and bring down the wrath of the masses.
                   1026:  */
                   1027: struct aic7xxx_host {
                   1028:   /*
                   1029:    *  This is the first 64 bytes in the host struct
                   1030:    */
                   1031: 
                   1032:   struct Scsi_Host        *host;             /* pointer to scsi host */
                   1033:   struct aic7xxx_host     *next;             /* allow for multiple IRQs */
                   1034:   int                      host_no;          /* SCSI host number */
                   1035:   unsigned long            base;             /* card base address */
                   1036:   volatile unsigned char  *maddr;            /* memory mapped address */
                   1037:   unsigned long            mbase;            /* I/O memory address */
                   1038:   volatile ahc_flag_type   flags;
                   1039: #if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,0)
                   1040:   spinlock_t               spin_lock;
                   1041: #endif
                   1042:   volatile unsigned char   cpu_lock_count[NR_CPUS];
                   1043:   ahc_chip                 chip;             /* chip type */
                   1044:   ahc_feature              features;         /* chip features */
                   1045:   unsigned long            last_reset;
                   1046:   unsigned long            isr_count;        /* Interrupt count */
                   1047:   unsigned long            spurious_int;
                   1048:   struct target_cmd       *targetcmds;
                   1049:   unsigned int             num_targetcmds;
                   1050:   unsigned short           discenable;       /* Targets allowed to disconnect */
                   1051:   unsigned short           tagenable;        /* Targets using tagged I/O */
                   1052:   unsigned short           orderedtag;       /* Ordered Q tags allowed */
                   1053:   volatile unsigned char   activescbs;       /* active scbs */
                   1054:   volatile unsigned char   max_activescbs;
                   1055:   unsigned char            unpause;          /* unpause value for HCNTRL */
                   1056:   unsigned char            pause;            /* pause value for HCNTRL */
                   1057:   volatile unsigned char   qoutfifonext;
                   1058:   volatile unsigned char   qinfifonext;
                   1059: 
                   1060:   /*
                   1061:    * MAX_TARGETS is currently == 16, so that makes these entries the next
                   1062:    * 64 bytes
                   1063:    */
                   1064: 
                   1065: #define  DEVICE_PRESENT                 0x01
                   1066: #define  BUS_DEVICE_RESET_PENDING       0x02
                   1067: #define  DEVICE_TIMEOUT                 0x04
                   1068: #define  DEVICE_PRINT_SDTR              0x08
                   1069: #define  DEVICE_PRINT_WDTR              0x10
                   1070: #define  DEVICE_SUCCESS                 0x20
                   1071: #define  DEVICE_TAGGED_SUCCESS          0x40
                   1072: #define  DEVICE_SCANNED                 0x80
                   1073:   volatile unsigned char   dev_flags[MAX_TARGETS];
                   1074:   volatile unsigned char   dev_active_cmds[MAX_TARGETS];
                   1075:   volatile unsigned char   dev_temp_queue_depth[MAX_TARGETS];
                   1076:   unsigned char            dev_commands_sent[MAX_TARGETS];
                   1077: 
                   1078:   /*
                   1079:    * The next 128 (or 256 on 64 bit machines)....
                   1080:    */
                   1081:   Scsi_Cmnd               *dev_wdtr_cmnd[MAX_TARGETS];
                   1082:   Scsi_Cmnd               *dev_sdtr_cmnd[MAX_TARGETS];
                   1083: 
                   1084:   /*
                   1085:    * The next 64.... 
                   1086:    */
                   1087: 
                   1088:   long                     dev_last_reset[MAX_TARGETS];
                   1089: 
                   1090:   /*
                   1091:    * The next 64....
                   1092:    */
                   1093: 
                   1094:   unsigned char            dev_mid_level_queue_depth[MAX_TARGETS];
                   1095:   unsigned char            dev_last_queue_full[MAX_TARGETS];
                   1096:   unsigned char            dev_last_queue_full_count[MAX_TARGETS];
                   1097:   unsigned char            dev_max_queue_depth[MAX_TARGETS];
                   1098: 
                   1099:   /*
                   1100:    * The next 128....
                   1101:    */
                   1102: 
                   1103:   volatile scb_queue_type  delayed_scbs[MAX_TARGETS];
                   1104: 
                   1105:   /*
                   1106:    *
                   1107:    */
                   1108: 
                   1109:   struct timer_list        dev_timer[MAX_TARGETS];
                   1110: 
                   1111:   /*
                   1112:    * The next 64....
                   1113:    */
                   1114: 
                   1115:   unsigned char            msg_buf[9];       /* The message for the target */
                   1116:   unsigned char            msg_type;
                   1117: #define MSG_TYPE_NONE              0x00
                   1118: #define MSG_TYPE_INITIATOR_MSGOUT  0x01
                   1119: #define MSG_TYPE_INITIATOR_MSGIN   0x02
                   1120:   unsigned char            msg_len;          /* Length of message */
                   1121:   unsigned char            msg_index;        /* Index into msg_buf array */
                   1122:   transinfo_type           transinfo[MAX_TARGETS];
                   1123:   volatile scb_queue_type  waiting_scbs;     /*
                   1124:                                               * SCBs waiting for space in
                   1125:                                               * the QINFIFO.
                   1126:                                               */
                   1127:   scb_data_type           *scb_data;
                   1128: 
                   1129:   struct aic7xxx_cmd_queue {
                   1130:     Scsi_Cmnd *head;
                   1131:     Scsi_Cmnd *tail;
                   1132:   } completeq;
                   1133: 
                   1134: 
                   1135:   /*
                   1136:    * We put the less frequently used host structure items after the more
                   1137:    * frequently used items to try and ease the burden on the cache subsystem.
                   1138:    * These entries are not *commonly* accessed, whereas the preceding entries
                   1139:    * are accessed very often.  The only exceptions are the qinfifo, qoutfifo,
                   1140:    * and untagged_scbs array.  But, they are often accessed only once and each
                   1141:    * access into these arrays is likely to blow a cache line, so they are put
                   1142:    * down here so we can minimize the number of cache lines required to hold
                   1143:    * the preceeding entries.
                   1144:    */
                   1145: 
                   1146:   volatile unsigned char   untagged_scbs[256];
                   1147:   volatile unsigned char   qoutfifo[256];
                   1148:   volatile unsigned char   qinfifo[256];
                   1149:   unsigned int             irq;              /* IRQ for this adapter */
                   1150:   volatile unsigned short  needsdtr;
                   1151:   volatile unsigned short  sdtr_pending;
                   1152:   volatile unsigned short  needwdtr;
                   1153:   volatile unsigned short  wdtr_pending;
                   1154:   int                      instance;         /* aic7xxx instance number */
                   1155:   int                      scsi_id;          /* host adapter SCSI ID */
                   1156:   int                      scsi_id_b;        /* channel B for twin adapters */
                   1157:   unsigned int             bios_address;
                   1158:   int                      board_name_index;
                   1159:   unsigned long            reset_start;
                   1160:   unsigned short           needsdtr_copy;    /* default config */
                   1161:   unsigned short           needwdtr_copy;    /* default config */
                   1162:   unsigned short           ultraenb;         /* Ultra mode target list */
                   1163:   unsigned short           bios_control;     /* bios control - SEEPROM */
                   1164:   unsigned short           adapter_control;  /* adapter control - SEEPROM */
                   1165: #if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,92)
                   1166:   struct pci_dev          *pdev;
                   1167: #endif
                   1168:   unsigned char            pci_bus;
                   1169:   unsigned char            pci_device_fn;
                   1170:   struct seeprom_config    sc;
                   1171:   unsigned short           sc_type;
                   1172:   unsigned short           sc_size;
                   1173: 
                   1174:   /*
                   1175:    * Statistics Kept:
                   1176:    *
                   1177:    * Total Xfers (count for each command that has a data xfer),
                   1178:    * broken down further by reads && writes.
                   1179:    *
                   1180:    * Binned sizes, writes && reads:
                   1181:    *    < 512, 512, 1-2K, 2-4K, 4-8K, 8-16K, 16-32K, 32-64K, 64K-128K, > 128K
                   1182:    *
                   1183:    * Total amounts read/written above 512 bytes (amts under ignored)
                   1184:    *
                   1185:    * NOTE: Enabling this feature is likely to cause a noticeable performance
                   1186:    * decrease as the accesses into the stats structures blows apart multiple
                   1187:    * cache lines and is CPU time consuming.  We keep the xfer count always
                   1188:    * for use by the aic7xxx_proc.c code, but only do the bins if the
                   1189:    * proc stats code is enabled.
                   1190:    */
                   1191:   struct aic7xxx_xferstats {
                   1192:     long xfers;                              /* total xfer count */
                   1193:     long w_total;                            /* total writes */
                   1194:     long w_total512;                         /* 512 byte blocks written */
                   1195:     long r_total;                            /* total reads */
                   1196:     long r_total512;                         /* 512 byte blocks read */
                   1197: #ifdef AIC7XXX_PROC_STATS
                   1198:     long w_bins[10];                         /* binned write */
                   1199:     long r_bins[10];                         /* binned reads */
                   1200: #endif /* AIC7XXX_PROC_STATS */
                   1201:   } stats[MAX_TARGETS][MAX_LUNS];            /* [(channel << 3)|target][lun] */
                   1202: };
                   1203: 
                   1204: /*
                   1205:  * Valid SCSIRATE values. (p. 3-17)
                   1206:  * Provides a mapping of transfer periods in ns/4 to the proper value to
                   1207:  * stick in the SCSIRATE reg to use that transfer rate.
                   1208:  */
                   1209: #define AHC_SYNCRATE_ULTRA2 0
                   1210: #define AHC_SYNCRATE_ULTRA  2
                   1211: #define AHC_SYNCRATE_FAST   5
                   1212: static struct aic7xxx_syncrate {
                   1213:   /* Rates in Ultra mode have bit 8 of sxfr set */
                   1214: #define                ULTRA_SXFR 0x100
                   1215:   int sxfr_ultra2;
                   1216:   int sxfr;
                   1217:   unsigned char period;
                   1218:   const char *rate[2];
                   1219: } aic7xxx_syncrates[] = {
                   1220:   { 0x13,  0x000,  10,  {"40.0", "80.0"} },
                   1221:   { 0x14,  0x000,  11,  {"33.0", "66.6"} },
                   1222:   { 0x15,  0x100,  12,  {"20.0", "40.0"} },
                   1223:   { 0x16,  0x110,  15,  {"16.0", "32.0"} },
                   1224:   { 0x17,  0x120,  18,  {"13.4", "26.8"} },
                   1225:   { 0x18,  0x000,  25,  {"10.0", "20.0"} },
                   1226:   { 0x19,  0x010,  31,  {"8.0",  "16.0"} },
                   1227:   { 0x1a,  0x020,  37,  {"6.67", "13.3"} },
                   1228:   { 0x1b,  0x030,  43,  {"5.7",  "11.4"} },
                   1229:   { 0x10,  0x040,  50,  {"5.0",  "10.0"} },
                   1230:   { 0x00,  0x050,  56,  {"4.4",  "8.8" } },
                   1231:   { 0x00,  0x060,  62,  {"4.0",  "8.0" } },
                   1232:   { 0x00,  0x070,  68,  {"3.6",  "7.2" } },
                   1233:   { 0x00,  0x000,  0,   {NULL, NULL}   },
                   1234: };
                   1235: 
                   1236: #define CTL_OF_SCB(scb) (((scb->hscb)->target_channel_lun >> 3) & 0x1),  \
                   1237:                         (((scb->hscb)->target_channel_lun >> 4) & 0xf), \
                   1238:                         ((scb->hscb)->target_channel_lun & 0x07)
                   1239: 
                   1240: #define CTL_OF_CMD(cmd) ((cmd->channel) & 0x01),  \
                   1241:                         ((cmd->target) & 0x0f), \
                   1242:                         ((cmd->lun) & 0x07)
                   1243: 
                   1244: #define TARGET_INDEX(cmd)  ((cmd)->target | ((cmd)->channel << 3))
                   1245: 
                   1246: /*
                   1247:  * A nice little define to make doing our printks a little easier
                   1248:  */
                   1249: 
                   1250: #define WARN_LEAD KERN_WARNING "(scsi%d:%d:%d:%d) "
                   1251: #define INFO_LEAD KERN_INFO "(scsi%d:%d:%d:%d) "
                   1252: 
                   1253: /*
                   1254:  * XXX - these options apply unilaterally to _all_ 274x/284x/294x
                   1255:  *       cards in the system.  This should be fixed.  Exceptions to this
                   1256:  *       rule are noted in the comments.
                   1257:  */
                   1258: 
                   1259: 
                   1260: /*
                   1261:  * Skip the scsi bus reset.  Non 0 make us skip the reset at startup.  This
                   1262:  * has no effect on any later resets that might occur due to things like
                   1263:  * SCSI bus timeouts.
                   1264:  */
                   1265: static unsigned int aic7xxx_no_reset = 0;
                   1266: /*
                   1267:  * Certain PCI motherboards will scan PCI devices from highest to lowest,
                   1268:  * others scan from lowest to highest, and they tend to do all kinds of
                   1269:  * strange things when they come into contact with PCI bridge chips.  The
                   1270:  * net result of all this is that the PCI card that is actually used to boot
                   1271:  * the machine is very hard to detect.  Most motherboards go from lowest
                   1272:  * PCI slot number to highest, and the first SCSI controller found is the
                   1273:  * one you boot from.  The only exceptions to this are when a controller
                   1274:  * has its BIOS disabled.  So, we by default sort all of our SCSI controllers
                   1275:  * from lowest PCI slot number to highest PCI slot number.  We also force
                   1276:  * all controllers with their BIOS disabled to the end of the list.  This
                   1277:  * works on *almost* all computers.  Where it doesn't work, we have this
                   1278:  * option.  Setting this option to non-0 will reverse the order of the sort
                   1279:  * to highest first, then lowest, but will still leave cards with their BIOS
                   1280:  * disabled at the very end.  That should fix everyone up unless there are
                   1281:  * really strange cirumstances.
                   1282:  */
                   1283: static int aic7xxx_reverse_scan = 0;
                   1284: /*
                   1285:  * This setting enables a hack to fix the IRQ settings on buggy 7895
                   1286:  * MB controller setups:
                   1287:  *    -1 == Disable this hack
                   1288:  *     0 == Use the Channel A IRQ for both channels
                   1289:  *     1 == Use the Channel B IRQ for both channels
                   1290:  */
                   1291: static unsigned int aic7xxx_extended = 0;
                   1292: /*
                   1293:  * The IRQ trigger method used on EISA controllers. Does not effect PCI cards.
                   1294:  *   -1 = Use detected settings.
                   1295:  *    0 = Force Edge triggered mode.
                   1296:  *    1 = Force Level triggered mode.
                   1297:  */
                   1298: static int aic7xxx_irq_trigger = -1;
                   1299: /*
                   1300:  * This variable is used to override the termination settings on a controller.
                   1301:  * This should not be used under normal conditions.  However, in the case
                   1302:  * that a controller does not have a readable SEEPROM (so that we can't
                   1303:  * read the SEEPROM settings directly) and that a controller has a buggered
                   1304:  * version of the cable detection logic, this can be used to force the 
                   1305:  * correct termination.  It is preferable to use the manual termination
                   1306:  * settings in the BIOS if possible, but some motherboard controllers store
                   1307:  * those settings in a format we can't read.  In other cases, auto term
                   1308:  * should also work, but the chipset was put together with no auto term
                   1309:  * logic (common on motherboard controllers).  In those cases, we have
                   1310:  * 32 bits here to work with.  That's good for 8 controllers/channels.  The
                   1311:  * bits are organized as 4 bits per channel, with scsi0 getting the lowest
                   1312:  * 4 bits in the int.  A 1 in a bit position indicates the termination setting
                   1313:  * that corresponds to that bit should be enabled, a 0 is disabled.
                   1314:  * It looks something like this:
                   1315:  *
                   1316:  *    0x0f =  1111-Single Ended Low Byte Termination on/off
                   1317:  *            ||\-Single Ended High Byte Termination on/off
                   1318:  *            |\-LVD Low Byte Termination on/off
                   1319:  *            \-LVD High Byte Termination on/off
                   1320:  *
                   1321:  * For non-Ultra2 controllers, the upper 2 bits are not important.  So, to
                   1322:  * enable both high byte and low byte termination on scsi0, I would need to
                   1323:  * make sure that the override_term variable was set to 0x03 (bits 0011).
                   1324:  * To make sure that all termination is enabled on an Ultra2 controller at
                   1325:  * scsi2 and only high byte termination on scsi1 and high and low byte
                   1326:  * termination on scsi0, I would set override_term=0xf23 (bits 1111 0010 0011)
                   1327:  *
                   1328:  * For the most part, users should never have to use this, that's why I
                   1329:  * left it fairly cryptic instead of easy to understand.  If you need it,
                   1330:  * most likely someone will be telling you what your's needs to be set to.
                   1331:  */
                   1332: static int aic7xxx_override_term = -1;
                   1333: /*
                   1334:  * Certain motherboard chipset controllers tend to screw
                   1335:  * up the polarity of the term enable output pin.  Use this variable
                   1336:  * to force the correct polarity for your system.  This is a bitfield variable
                   1337:  * similar to the previous one, but this one has one bit per channel instead
                   1338:  * of four.
                   1339:  *    0 = Force the setting to active low.
                   1340:  *    1 = Force setting to active high.
                   1341:  * Most Adaptec cards are active high, several motherboards are active low.
                   1342:  * To force a 2940 card at SCSI 0 to active high and a motherboard 7895
                   1343:  * controller at scsi1 and scsi2 to active low, and a 2910 card at scsi3
                   1344:  * to active high, you would need to set stpwlev=0x9 (bits 1001).
                   1345:  *
                   1346:  * People shouldn't need to use this, but if you are experiencing lots of
                   1347:  * SCSI timeout problems, this may help.  There is one sure way to test what
                   1348:  * this option needs to be.  Using a boot floppy to boot the system, configure
                   1349:  * your system to enable all SCSI termination (in the Adaptec SCSI BIOS) and
                   1350:  * if needed then also pass a value to override_term to make sure that the
                   1351:  * driver is enabling SCSI termination, then set this variable to either 0
                   1352:  * or 1.  When the driver boots, make sure there are *NO* SCSI cables
                   1353:  * connected to your controller.  If it finds and inits the controller
                   1354:  * without problem, then the setting you passed to stpwlev was correct.  If
                   1355:  * the driver goes into a reset loop and hangs the system, then you need the
                   1356:  * other setting for this variable.  If neither setting lets the machine
                   1357:  * boot then you have definite termination problems that may not be fixable.
                   1358:  */
                   1359: static int aic7xxx_stpwlev = -1;
                   1360: /*
                   1361:  * Set this to non-0 in order to force the driver to panic the kernel
                   1362:  * and print out debugging info on a SCSI abort or reset cycle.
                   1363:  */
                   1364: static int aic7xxx_panic_on_abort = 0;
                   1365: /*
                   1366:  * PCI bus parity checking of the Adaptec controllers.  This is somewhat
                   1367:  * dubious at best.  To my knowledge, this option has never actually
                   1368:  * solved a PCI parity problem, but on certain machines with broken PCI
                   1369:  * chipset configurations, it can generate tons of false error messages.
                   1370:  * It's included in the driver for completeness.
                   1371:  *   0 = Shut off PCI parity check
                   1372:  *  -1 = Normal polarity pci parity checking
                   1373:  *   1 = reverse polarity pci parity checking
                   1374:  *
                   1375:  * NOTE: you can't actually pass -1 on the lilo prompt.  So, to set this
                   1376:  * variable to -1 you would actually want to simply pass the variable
                   1377:  * name without a number.  That will invert the 0 which will result in
                   1378:  * -1.
                   1379:  */
                   1380: static int aic7xxx_pci_parity = 0;
                   1381: /*
                   1382:  * Set this to any non-0 value to cause us to dump the contents of all
                   1383:  * the card's registers in a hex dump format tailored to each model of
                   1384:  * controller.
                   1385:  * 
                   1386:  * NOTE: THE CONTROLLER IS LEFT IN AN UNUSEABLE STATE BY THIS OPTION.
                   1387:  *       YOU CANNOT BOOT UP WITH THIS OPTION, IT IS FOR DEBUGGING PURPOSES
                   1388:  *       ONLY
                   1389:  */
                   1390: static int aic7xxx_dump_card = 0;
                   1391: /*
                   1392:  * Set this to a non-0 value to make us dump out the 32 bit instruction
                   1393:  * registers on the card after completing the sequencer download.  This
                   1394:  * allows the actual sequencer download to be verified.  It is possible
                   1395:  * to use this option and still boot up and run your system.  This is
                   1396:  * only intended for debugging purposes.
                   1397:  */
                   1398: static int aic7xxx_dump_sequencer = 0;
                   1399: /*
                   1400:  * Certain newer motherboards have put new PCI based devices into the
                   1401:  * IO spaces that used to typically be occupied by VLB or EISA cards.
                   1402:  * This overlap can cause these newer motherboards to lock up when scanned
                   1403:  * for older EISA and VLB devices.  Setting this option to non-0 will
                   1404:  * cause the driver to skip scanning for any VLB or EISA controllers and
                   1405:  * only support the PCI controllers.  NOTE: this means that if the kernel
                   1406:  * os compiled with PCI support disabled, then setting this to non-0
                   1407:  * would result in never finding any devices :)
                   1408:  */
                   1409: static int aic7xxx_no_probe = 0;
                   1410: 
                   1411: /*
                   1412:  * So that insmod can find the variable and make it point to something
                   1413:  */
                   1414: #ifdef MODULE
                   1415: static char * aic7xxx = NULL;
                   1416: #if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,18)
                   1417: MODULE_PARM(aic7xxx, "s");
                   1418: #endif
                   1419: 
                   1420: /*
                   1421:  * Just in case someone uses commas to separate items on the insmod
                   1422:  * command line, we define a dummy buffer here to avoid having insmod
                   1423:  * write wild stuff into our code segment
                   1424:  */
                   1425: static char dummy_buffer[60] = "Please don't trounce on me insmod!!\n";
                   1426: 
                   1427: #endif
                   1428: 
                   1429: /*
                   1430:  * See the comments earlier in the file for what this item is all about
                   1431:  * If you have more than 4 controllers, you will need to increase the
                   1432:  * the number of items in the array below.  Additionally, if you don't
                   1433:  * want to have lilo pass a humongous config line to the aic7xxx driver,
                   1434:  * then you can get in and manually adjust these instead of leaving them
                   1435:  * at the default.  Pay attention to the comments earlier in this file
                   1436:  * concerning this array if you are going to hand modify these values.
                   1437:  */
                   1438: static adapter_tag_info_t aic7xxx_tag_info[] =
                   1439: {
                   1440:   {DEFAULT_TAG_COMMANDS},
                   1441:   {DEFAULT_TAG_COMMANDS},
                   1442:   {DEFAULT_TAG_COMMANDS},
                   1443:   {DEFAULT_TAG_COMMANDS},
                   1444:   {DEFAULT_TAG_COMMANDS},
                   1445:   {DEFAULT_TAG_COMMANDS},
                   1446:   {DEFAULT_TAG_COMMANDS},
                   1447:   {DEFAULT_TAG_COMMANDS},
                   1448:   {DEFAULT_TAG_COMMANDS},
                   1449:   {DEFAULT_TAG_COMMANDS},
                   1450:   {DEFAULT_TAG_COMMANDS},
                   1451:   {DEFAULT_TAG_COMMANDS},
                   1452:   {DEFAULT_TAG_COMMANDS},
                   1453:   {DEFAULT_TAG_COMMANDS},
                   1454:   {DEFAULT_TAG_COMMANDS},
                   1455:   {DEFAULT_TAG_COMMANDS}
                   1456: };
                   1457: 
                   1458: #define VERBOSE_NORMAL         0x0000
                   1459: #define VERBOSE_NEGOTIATION    0x0001
                   1460: #define VERBOSE_SEQINT         0x0002
                   1461: #define VERBOSE_SCSIINT        0x0004
                   1462: #define VERBOSE_PROBE          0x0008
                   1463: #define VERBOSE_PROBE2         0x0010
                   1464: #define VERBOSE_NEGOTIATION2   0x0020
                   1465: #define VERBOSE_MINOR_ERROR    0x0040
                   1466: #define VERBOSE_TRACING        0x0080
                   1467: #define VERBOSE_ABORT          0x0f00
                   1468: #define VERBOSE_ABORT_MID      0x0100
                   1469: #define VERBOSE_ABORT_FIND     0x0200
                   1470: #define VERBOSE_ABORT_PROCESS  0x0400
                   1471: #define VERBOSE_ABORT_RETURN   0x0800
                   1472: #define VERBOSE_RESET          0xf000
                   1473: #define VERBOSE_RESET_MID      0x1000
                   1474: #define VERBOSE_RESET_FIND     0x2000
                   1475: #define VERBOSE_RESET_PROCESS  0x4000
                   1476: #define VERBOSE_RESET_RETURN   0x8000
                   1477: static int aic7xxx_verbose = VERBOSE_NORMAL | VERBOSE_NEGOTIATION |
                   1478:            VERBOSE_PROBE;                     /* verbose messages */
                   1479: 
                   1480: 
                   1481: /****************************************************************************
                   1482:  *
                   1483:  * We're going to start putting in function declarations so that order of
                   1484:  * functions is no longer important.  As needed, they are added here.
                   1485:  *
                   1486:  ***************************************************************************/
                   1487: 
                   1488: static void aic7xxx_panic_abort(struct aic7xxx_host *p, Scsi_Cmnd *cmd);
                   1489: static void aic7xxx_print_card(struct aic7xxx_host *p);
                   1490: static void aic7xxx_print_scratch_ram(struct aic7xxx_host *p);
                   1491: static void aic7xxx_print_sequencer(struct aic7xxx_host *p, int downloaded);
                   1492: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   1493: static void aic7xxx_check_scbs(struct aic7xxx_host *p, char *buffer);
                   1494: #endif
                   1495: 
                   1496: /****************************************************************************
                   1497:  *
                   1498:  * These functions are now used.  They happen to be wrapped in useless
                   1499:  * inb/outb port read/writes around the real reads and writes because it
                   1500:  * seems that certain very fast CPUs have a problem dealing with us when
                   1501:  * going at full speed.
                   1502:  *
                   1503:  ***************************************************************************/
                   1504: 
                   1505: #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0)
                   1506: static inline void
                   1507: mdelay(int milliseconds)
                   1508: {
                   1509:   int i;
                   1510: 
                   1511:   for(i=0; i<milliseconds; i++)
                   1512:     udelay(1000);
                   1513: }
                   1514: #endif
                   1515: 
                   1516: static inline unsigned char
                   1517: aic_inb(struct aic7xxx_host *p, long port)
                   1518: {
                   1519: #ifdef MMAPIO
                   1520:   unsigned char x;
                   1521:   if(p->maddr)
                   1522:   {
                   1523:     x = p->maddr[port];
                   1524:   }
                   1525:   else
                   1526:   {
                   1527:     x = inb(p->base + port);
                   1528:   }
                   1529:   mb();
                   1530:   return(x);
                   1531: #else
                   1532:   return(inb(p->base + port));
                   1533: #endif
                   1534: }
                   1535: 
                   1536: static inline void
                   1537: aic_outb(struct aic7xxx_host *p, unsigned char val, long port)
                   1538: {
                   1539: #ifdef MMAPIO
                   1540:   if(p->maddr)
                   1541:   {
                   1542:     p->maddr[port] = val;
                   1543:   }
                   1544:   else
                   1545:   {
                   1546:     outb(val, p->base + port);
                   1547:   }
                   1548:   mb();
                   1549: #else
                   1550:   outb(val, p->base + port);
                   1551: #endif
                   1552: }
                   1553: 
                   1554: /*+F*************************************************************************
                   1555:  * Function:
                   1556:  *   aic7xxx_setup
                   1557:  *
                   1558:  * Description:
                   1559:  *   Handle Linux boot parameters. This routine allows for assigning a value
                   1560:  *   to a parameter with a ':' between the parameter and the value.
                   1561:  *   ie. aic7xxx=unpause:0x0A,extended
                   1562:  *-F*************************************************************************/
                   1563: void
                   1564: aic7xxx_setup(char *s, int *dummy)
                   1565: {
                   1566:   int   i, n;
                   1567:   char *p;
                   1568:   char *end;
                   1569: 
                   1570:   static struct {
                   1571:     const char *name;
                   1572:     unsigned int *flag;
                   1573:   } options[] = {
                   1574:     { "extended",    &aic7xxx_extended },
                   1575:     { "no_reset",    &aic7xxx_no_reset },
                   1576:     { "irq_trigger", &aic7xxx_irq_trigger },
                   1577:     { "verbose",     &aic7xxx_verbose },
                   1578:     { "reverse_scan",&aic7xxx_reverse_scan },
                   1579:     { "override_term", &aic7xxx_override_term },
                   1580:     { "stpwlev", &aic7xxx_stpwlev },
                   1581:     { "no_probe", &aic7xxx_no_probe },
                   1582:     { "panic_on_abort", &aic7xxx_panic_on_abort },
                   1583:     { "pci_parity", &aic7xxx_pci_parity },
                   1584:     { "dump_card", &aic7xxx_dump_card },
                   1585:     { "dump_sequencer", &aic7xxx_dump_sequencer },
                   1586:     { "tag_info",    NULL }
                   1587:   };
                   1588: 
                   1589:   end = strchr(s, '\0');
                   1590: 
                   1591:   for (p = strtok(s, ",."); p; p = strtok(NULL, ",."))
                   1592:   {
                   1593:     for (i = 0; i < NUMBER(options); i++)
                   1594:     {
                   1595:       n = strlen(options[i].name);
                   1596:       if (!strncmp(options[i].name, p, n))
                   1597:       {
                   1598:         if (!strncmp(p, "tag_info", n))
                   1599:         {
                   1600:           if (p[n] == ':')
                   1601:           {
                   1602:             char *base;
                   1603:             char *tok, *tok_end, *tok_end2;
                   1604:             char tok_list[] = { '.', ',', '{', '}', '\0' };
                   1605:             int i, instance = -1, device = -1;
                   1606:             unsigned char done = FALSE;
                   1607: 
                   1608:             base = p;
                   1609:             tok = base + n + 1;  /* Forward us just past the ':' */
                   1610:             tok_end = strchr(tok, '\0');
                   1611:             if (tok_end < end)
                   1612:               *tok_end = ',';
                   1613:             while(!done)
                   1614:             {
                   1615:               switch(*tok)
                   1616:               {
                   1617:                 case '{':
                   1618:                   if (instance == -1)
                   1619:                     instance = 0;
                   1620:                   else if (device == -1)
                   1621:                     device = 0;
                   1622:                   tok++;
                   1623:                   break;
                   1624:                 case '}':
                   1625:                   if (device != -1)
                   1626:                     device = -1;
                   1627:                   else if (instance != -1)
                   1628:                     instance = -1;
                   1629:                   tok++;
                   1630:                   break;
                   1631:                 case ',':
                   1632:                 case '.':
                   1633:                   if (instance == -1)
                   1634:                     done = TRUE;
                   1635:                   else if (device >= 0)
                   1636:                     device++;
                   1637:                   else if (instance >= 0)
                   1638:                     instance++;
                   1639:                   if ( (device >= MAX_TARGETS) || 
                   1640:                        (instance >= NUMBER(aic7xxx_tag_info)) )
                   1641:                     done = TRUE;
                   1642:                   tok++;
                   1643:                   if (!done)
                   1644:                   {
                   1645:                     base = tok;
                   1646:                   }
                   1647:                   break;
                   1648:                 case '\0':
                   1649:                   done = TRUE;
                   1650:                   break;
                   1651:                 default:
                   1652:                   done = TRUE;
                   1653:                   tok_end = strchr(tok, '\0');
                   1654:                   for(i=0; tok_list[i]; i++)
                   1655:                   {
                   1656:                     tok_end2 = strchr(tok, tok_list[i]);
                   1657:                     if ( (tok_end2) && (tok_end2 < tok_end) )
                   1658:                     {
                   1659:                       tok_end = tok_end2;
                   1660:                       done = FALSE;
                   1661:                     }
                   1662:                   }
                   1663:                   if ( (instance >= 0) && (device >= 0) &&
                   1664:                        (instance < NUMBER(aic7xxx_tag_info)) &&
                   1665:                        (device < MAX_TARGETS) )
                   1666:                     aic7xxx_tag_info[instance].tag_commands[device] =
                   1667:                       simple_strtoul(tok, NULL, 0) & 0xff;
                   1668:                   tok = tok_end;
                   1669:                   break;
                   1670:               }
                   1671:             }
                   1672:             while((p != base) && (p != NULL))
                   1673:               p = strtok(NULL, ",.");
                   1674:           }
                   1675:         }
                   1676:         else if (p[n] == ':')
                   1677:         {
                   1678:           *(options[i].flag) = simple_strtoul(p + n + 1, NULL, 0);
                   1679:         }
                   1680:         else if (!strncmp(p, "verbose", n))
                   1681:         {
                   1682:           *(options[i].flag) = 0xff09;
                   1683:         }
                   1684:         else
                   1685:         {
                   1686:           *(options[i].flag) = ~(*(options[i].flag));
                   1687:         }
                   1688:       }
                   1689:     }
                   1690:   }
                   1691: }
                   1692: 
                   1693: /*+F*************************************************************************
                   1694:  * Function:
                   1695:  *   pause_sequencer
                   1696:  *
                   1697:  * Description:
                   1698:  *   Pause the sequencer and wait for it to actually stop - this
                   1699:  *   is important since the sequencer can disable pausing for critical
                   1700:  *   sections.
                   1701:  *-F*************************************************************************/
                   1702: static inline void
                   1703: pause_sequencer(struct aic7xxx_host *p)
                   1704: {
                   1705:   aic_outb(p, p->pause, HCNTRL);
                   1706:   while ((aic_inb(p, HCNTRL) & PAUSE) == 0)
                   1707:   {
                   1708:     ;
                   1709:   }
                   1710: }
                   1711: 
                   1712: /*+F*************************************************************************
                   1713:  * Function:
                   1714:  *   unpause_sequencer
                   1715:  *
                   1716:  * Description:
                   1717:  *   Unpause the sequencer. Unremarkable, yet done often enough to
                   1718:  *   warrant an easy way to do it.
                   1719:  *-F*************************************************************************/
                   1720: static inline void
                   1721: unpause_sequencer(struct aic7xxx_host *p, int unpause_always)
                   1722: {
                   1723:   if (unpause_always ||
                   1724:       ( !(aic_inb(p, INTSTAT) & (SCSIINT | SEQINT | BRKADRINT)) &&
                   1725:         !(p->flags & AHC_HANDLING_REQINITS) ) )
                   1726:   {
                   1727:     aic_outb(p, p->unpause, HCNTRL);
                   1728:   }
                   1729: }
                   1730: 
                   1731: /*+F*************************************************************************
                   1732:  * Function:
                   1733:  *   restart_sequencer
                   1734:  *
                   1735:  * Description:
                   1736:  *   Restart the sequencer program from address zero.  This assumes
                   1737:  *   that the sequencer is already paused.
                   1738:  *-F*************************************************************************/
                   1739: static inline void
                   1740: restart_sequencer(struct aic7xxx_host *p)
                   1741: {
                   1742:   aic_outb(p, 0, SEQADDR0);
                   1743:   aic_outb(p, 0, SEQADDR1);
                   1744:   aic_outb(p, FASTMODE, SEQCTL);
                   1745: }
                   1746: 
                   1747: /*
                   1748:  * We include the aic7xxx_seq.c file here so that the other defines have
                   1749:  * already been made, and so that it comes before the code that actually
                   1750:  * downloads the instructions (since we don't typically use function
                   1751:  * prototype, our code has to be ordered that way, it's a left-over from
                   1752:  * the original driver days.....I should fix it some time DL).
                   1753:  */
                   1754: #include "aic7xxx_seq.c"
                   1755: 
                   1756: /*+F*************************************************************************
                   1757:  * Function:
                   1758:  *   aic7xxx_check_patch
                   1759:  *
                   1760:  * Description:
                   1761:  *   See if the next patch to download should be downloaded.
                   1762:  *-F*************************************************************************/
                   1763: static int
                   1764: aic7xxx_check_patch(struct aic7xxx_host *p,
                   1765:   struct sequencer_patch **start_patch, int start_instr, int *skip_addr)
                   1766: {
                   1767:   struct sequencer_patch *cur_patch;
                   1768:   struct sequencer_patch *last_patch;
                   1769:   int num_patches;
                   1770: 
                   1771:   num_patches = sizeof(sequencer_patches)/sizeof(struct sequencer_patch);
                   1772:   last_patch = &sequencer_patches[num_patches];
                   1773:   cur_patch = *start_patch;
                   1774: 
                   1775:   while ((cur_patch < last_patch) && (start_instr == cur_patch->begin))
                   1776:   {
                   1777:     if (cur_patch->patch_func(p) == 0)
                   1778:     {
                   1779:       /*
                   1780:        * Start rejecting code.
                   1781:        */
                   1782:       *skip_addr = start_instr + cur_patch->skip_instr;
                   1783:       cur_patch += cur_patch->skip_patch;
                   1784:     }
                   1785:     else
                   1786:     {
                   1787:       /*
                   1788:        * Found an OK patch.  Advance the patch pointer to the next patch
                   1789:        * and wait for our instruction pointer to get here.
                   1790:        */
                   1791:       cur_patch++;
                   1792:     }
                   1793:   }
                   1794: 
                   1795:   *start_patch = cur_patch;
                   1796:   if (start_instr < *skip_addr)
                   1797:     /*
                   1798:      * Still skipping
                   1799:      */
                   1800:     return (0);
                   1801:   return(1);
                   1802: }
                   1803: 
                   1804: 
                   1805: /*+F*************************************************************************
                   1806:  * Function:
                   1807:  *   aic7xxx_download_instr
                   1808:  *
                   1809:  * Description:
                   1810:  *   Find the next patch to download.
                   1811:  *-F*************************************************************************/
                   1812: static void
                   1813: aic7xxx_download_instr(struct aic7xxx_host *p, int instrptr,
                   1814:   unsigned char *dconsts)
                   1815: {
                   1816:   union ins_formats instr;
                   1817:   struct ins_format1 *fmt1_ins;
                   1818:   struct ins_format3 *fmt3_ins;
                   1819:   unsigned char opcode;
                   1820: 
                   1821:   instr = *(union ins_formats*) &seqprog[instrptr * 4];
                   1822: 
                   1823:   instr.integer = le32_to_cpu(instr.integer);
                   1824:   
                   1825:   fmt1_ins = &instr.format1;
                   1826:   fmt3_ins = NULL;
                   1827: 
                   1828:   /* Pull the opcode */
                   1829:   opcode = instr.format1.opcode;
                   1830:   switch (opcode)
                   1831:   {
                   1832:     case AIC_OP_JMP:
                   1833:     case AIC_OP_JC:
                   1834:     case AIC_OP_JNC:
                   1835:     case AIC_OP_CALL:
                   1836:     case AIC_OP_JNE:
                   1837:     case AIC_OP_JNZ:
                   1838:     case AIC_OP_JE:
                   1839:     case AIC_OP_JZ:
                   1840:     {
                   1841:       struct sequencer_patch *cur_patch;
                   1842:       int address_offset;
                   1843:       unsigned int address;
                   1844:       int skip_addr;
                   1845:       int i;
                   1846: 
                   1847:       fmt3_ins = &instr.format3;
                   1848:       address_offset = 0;
                   1849:       address = fmt3_ins->address;
                   1850:       cur_patch = sequencer_patches;
                   1851:       skip_addr = 0;
                   1852: 
                   1853:       for (i = 0; i < address;)
                   1854:       {
                   1855:         aic7xxx_check_patch(p, &cur_patch, i, &skip_addr);
                   1856:         if (skip_addr > i)
                   1857:         {
                   1858:           int end_addr;
                   1859: 
                   1860:           end_addr = MIN(address, skip_addr);
                   1861:           address_offset += end_addr - i;
                   1862:           i = skip_addr;
                   1863:         }
                   1864:         else
                   1865:         {
                   1866:           i++;
                   1867:         }
                   1868:       }
                   1869:       address -= address_offset;
                   1870:       fmt3_ins->address = address;
                   1871:       /* Fall Through to the next code section */
                   1872:     }
                   1873:     case AIC_OP_OR:
                   1874:     case AIC_OP_AND:
                   1875:     case AIC_OP_XOR:
                   1876:     case AIC_OP_ADD:
                   1877:     case AIC_OP_ADC:
                   1878:     case AIC_OP_BMOV:
                   1879:       if (fmt1_ins->parity != 0)
                   1880:       {
                   1881:         fmt1_ins->immediate = dconsts[fmt1_ins->immediate];
                   1882:       }
                   1883:       fmt1_ins->parity = 0;
                   1884:       /* Fall Through to the next code section */
                   1885:     case AIC_OP_ROL:
                   1886:       if ((p->features & AHC_ULTRA2) != 0)
                   1887:       {
                   1888:         int i, count;
                   1889: 
                   1890:         /* Calculate odd parity for the instruction */
                   1891:         for ( i=0, count=0; i < 31; i++)
                   1892:         {
                   1893:           unsigned int mask;
                   1894: 
                   1895:           mask = 0x01 << i;
                   1896:           if ((instr.integer & mask) != 0)
                   1897:             count++;
                   1898:         }
                   1899:         if (!(count & 0x01))
                   1900:           instr.format1.parity = 1;
                   1901:       }
                   1902:       else
                   1903:       {
                   1904:         if (fmt3_ins != NULL)
                   1905:         {
                   1906:           instr.integer =  fmt3_ins->immediate |
                   1907:                           (fmt3_ins->source << 8) |
                   1908:                           (fmt3_ins->address << 16) |
                   1909:                           (fmt3_ins->opcode << 25);
                   1910:         }
                   1911:         else
                   1912:         {
                   1913:           instr.integer =  fmt1_ins->immediate |
                   1914:                           (fmt1_ins->source << 8) |
                   1915:                           (fmt1_ins->destination << 16) |
                   1916:                           (fmt1_ins->ret << 24) |
                   1917:                           (fmt1_ins->opcode << 25);
                   1918:         }
                   1919:       }
                   1920:       aic_outb(p, (instr.integer & 0xff), SEQRAM);
                   1921:       aic_outb(p, ((instr.integer >> 8) & 0xff), SEQRAM);
                   1922:       aic_outb(p, ((instr.integer >> 16) & 0xff), SEQRAM);
                   1923:       aic_outb(p, ((instr.integer >> 24) & 0xff), SEQRAM);
                   1924:       break;
                   1925: 
                   1926:     default:
                   1927:       panic("aic7xxx: Unknown opcode encountered in sequencer program.");
                   1928:       break;
                   1929:   }
                   1930: }
                   1931: 
                   1932: 
                   1933: /*+F*************************************************************************
                   1934:  * Function:
                   1935:  *   aic7xxx_loadseq
                   1936:  *
                   1937:  * Description:
                   1938:  *   Load the sequencer code into the controller memory.
                   1939:  *-F*************************************************************************/
                   1940: static void
                   1941: aic7xxx_loadseq(struct aic7xxx_host *p)
                   1942: {
                   1943:   struct sequencer_patch *cur_patch;
                   1944:   int i;
                   1945:   int downloaded;
                   1946:   int skip_addr;
                   1947:   unsigned char download_consts[4] = {0, 0, 0, 0};
                   1948: 
                   1949:   if (aic7xxx_verbose & VERBOSE_PROBE)
                   1950:   {
                   1951:     printk(KERN_INFO "(scsi%d) Downloading sequencer code...", p->host_no);
                   1952:   }
                   1953:   download_consts[TMODE_NUMCMDS] = p->num_targetcmds;
                   1954:   cur_patch = &sequencer_patches[0];
                   1955:   downloaded = 0;
                   1956:   skip_addr = 0;
                   1957: 
                   1958:   aic_outb(p, PERRORDIS|LOADRAM|FAILDIS|FASTMODE, SEQCTL);
                   1959:   aic_outb(p, 0, SEQADDR0);
                   1960:   aic_outb(p, 0, SEQADDR1);
                   1961: 
                   1962:   for (i = 0; i < sizeof(seqprog) / 4;  i++)
                   1963:   {
                   1964:     if (aic7xxx_check_patch(p, &cur_patch, i, &skip_addr) == 0)
                   1965:     {
                   1966:       /* Skip this instruction for this configuration. */
                   1967:       continue;
                   1968:     }
                   1969:     aic7xxx_download_instr(p, i, &download_consts[0]);
                   1970:     downloaded++;
                   1971:   }
                   1972: 
                   1973:   aic_outb(p, 0, SEQADDR0);
                   1974:   aic_outb(p, 0, SEQADDR1);
                   1975:   aic_outb(p, FASTMODE | FAILDIS, SEQCTL);
                   1976:   unpause_sequencer(p, TRUE);
                   1977:   mdelay(1);
                   1978:   pause_sequencer(p);
                   1979:   aic_outb(p, FASTMODE, SEQCTL);
                   1980:   if (aic7xxx_verbose & VERBOSE_PROBE)
                   1981:   {
                   1982:     printk(" %d instructions downloaded\n", downloaded);
                   1983:   }
                   1984:   if (aic7xxx_dump_sequencer)
                   1985:     aic7xxx_print_sequencer(p, downloaded);
                   1986: }
                   1987: 
                   1988: /*+F*************************************************************************
                   1989:  * Function:
                   1990:  *   aic7xxx_print_sequencer
                   1991:  *
                   1992:  * Description:
                   1993:  *   Print the contents of the sequencer memory to the screen.
                   1994:  *-F*************************************************************************/
                   1995: static void
                   1996: aic7xxx_print_sequencer(struct aic7xxx_host *p, int downloaded)
                   1997: {
                   1998:   int i, k, temp;
                   1999:   
                   2000:   aic_outb(p, PERRORDIS|LOADRAM|FAILDIS|FASTMODE, SEQCTL);
                   2001:   aic_outb(p, 0, SEQADDR0);
                   2002:   aic_outb(p, 0, SEQADDR1);
                   2003: 
                   2004:   k = 0;
                   2005:   for (i=0; i < downloaded; i++)
                   2006:   {
                   2007:     if ( k == 0 )
                   2008:       printk("%03x: ", i);
                   2009:     temp = aic_inb(p, SEQRAM);
                   2010:     temp |= (aic_inb(p, SEQRAM) << 8);
                   2011:     temp |= (aic_inb(p, SEQRAM) << 16);
                   2012:     temp |= (aic_inb(p, SEQRAM) << 24);
                   2013:     printk("%08x", temp);
                   2014:     if ( ++k == 8 )
                   2015:     {
                   2016:       printk("\n");
                   2017:       k = 0;
                   2018:     }
                   2019:     else
                   2020:       printk(" ");
                   2021:   }
                   2022:   aic_outb(p, 0, SEQADDR0);
                   2023:   aic_outb(p, 0, SEQADDR1);
                   2024:   aic_outb(p, FASTMODE | FAILDIS, SEQCTL);
                   2025:   unpause_sequencer(p, TRUE);
                   2026:   mdelay(1);
                   2027:   pause_sequencer(p);
                   2028:   aic_outb(p, FASTMODE, SEQCTL);
                   2029:   printk("\n");
                   2030: }
                   2031: 
                   2032: /*+F*************************************************************************
                   2033:  * Function:
                   2034:  *   aic7xxx_delay
                   2035:  *
                   2036:  * Description:
                   2037:  *   Delay for specified amount of time.  We use mdelay because the timer
                   2038:  *   interrupt is not guaranteed to be enabled.  This will cause an
                   2039:  *   infinite loop since jiffies (clock ticks) is not updated.
                   2040:  *-F*************************************************************************/
                   2041: static void
                   2042: aic7xxx_delay(int seconds)
                   2043: {
                   2044:   mdelay(seconds * 1000);
                   2045: }
                   2046: 
                   2047: /*+F*************************************************************************
                   2048:  * Function:
                   2049:  *   aic7xxx_info
                   2050:  *
                   2051:  * Description:
                   2052:  *   Return a string describing the driver.
                   2053:  *-F*************************************************************************/
                   2054: const char *
                   2055: aic7xxx_info(struct Scsi_Host *dooh)
                   2056: {
                   2057:   static char buffer[256];
                   2058:   char *bp;
                   2059:   struct aic7xxx_host *p;
                   2060: 
                   2061:   bp = &buffer[0];
                   2062:   p = (struct aic7xxx_host *)dooh->hostdata;
                   2063:   memset(bp, 0, sizeof(buffer));
                   2064:   strcpy(bp, "Adaptec AHA274x/284x/294x (EISA/VLB/PCI-Fast SCSI) ");
                   2065:   strcat(bp, AIC7XXX_C_VERSION);
                   2066:   strcat(bp, "/");
                   2067:   strcat(bp, AIC7XXX_H_VERSION);
                   2068:   strcat(bp, "\n");
                   2069:   strcat(bp, "       <");
                   2070:   strcat(bp, board_names[p->board_name_index]);
                   2071:   strcat(bp, ">");
                   2072: 
                   2073:   return(bp);
                   2074: }
                   2075: 
                   2076: /*+F*************************************************************************
                   2077:  * Function:
                   2078:  *   aic7xxx_find_syncrate
                   2079:  *
                   2080:  * Description:
                   2081:  *   Look up the valid period to SCSIRATE conversion in our table
                   2082:  *-F*************************************************************************/
                   2083: static struct aic7xxx_syncrate *
                   2084: aic7xxx_find_syncrate(struct aic7xxx_host *p, unsigned int *period,
                   2085:   unsigned int maxsync)
                   2086: {
                   2087:   struct aic7xxx_syncrate *syncrate;
                   2088: 
                   2089:   syncrate = &aic7xxx_syncrates[maxsync];
                   2090:   while ( (syncrate->rate[0] != NULL) &&
                   2091:          (!(p->features & AHC_ULTRA2) || syncrate->sxfr_ultra2) )
                   2092:   {
                   2093:     if ( *period <= syncrate->period )
                   2094:     {
                   2095:       /*
                   2096:        * When responding to a target that requests sync, the requested rate
                   2097:        * may fall between two rates that we can output, but still be a rate
                   2098:        * that we can receive.  Because of this, we want to respond with the
                   2099:        * same rate that it sent to us even if the persiod we use to send
                   2100:        * data to it is lower.  Only lower the response period if we must.
                   2101:        */
                   2102:       if(syncrate == &aic7xxx_syncrates[maxsync])
                   2103:       {
                   2104:         *period = syncrate->period;
                   2105:       }
                   2106:       break;
                   2107:     }
                   2108:     syncrate++;
                   2109:   }
                   2110:   if ( (*period == 0) || (syncrate->rate[0] == NULL) ||
                   2111:        ((p->features & AHC_ULTRA2) && (syncrate->sxfr_ultra2 == 0)) )
                   2112:   {
                   2113:     /*
                   2114:      * Use async transfers for this target
                   2115:      */
                   2116:     *period = 0;
                   2117:     syncrate = NULL;
                   2118:   }
                   2119:   return (syncrate);
                   2120: }
                   2121: 
                   2122: 
                   2123: /*+F*************************************************************************
                   2124:  * Function:
                   2125:  *   aic7xxx_find_period
                   2126:  *
                   2127:  * Description:
                   2128:  *   Look up the valid SCSIRATE to period conversion in our table
                   2129:  *-F*************************************************************************/
                   2130: static unsigned int
                   2131: aic7xxx_find_period(struct aic7xxx_host *p, unsigned int scsirate,
                   2132:   unsigned int maxsync)
                   2133: {
                   2134:   struct aic7xxx_syncrate *syncrate;
                   2135: 
                   2136:   if ((p->features & AHC_ULTRA2) != 0)
                   2137:   {
                   2138:     scsirate &= SXFR_ULTRA2;
                   2139:   }
                   2140:   else
                   2141:   {
                   2142:     scsirate &= SXFR;
                   2143:   }
                   2144: 
                   2145:   syncrate = &aic7xxx_syncrates[maxsync];
                   2146:   while (syncrate->rate[0] != NULL)
                   2147:   {
                   2148:     if ((p->features & AHC_ULTRA2) != 0)
                   2149:     {
                   2150:       if (syncrate->sxfr_ultra2 == 0)
                   2151:         break;
                   2152:       else if (scsirate == syncrate->sxfr_ultra2)
                   2153:         return (syncrate->period);
                   2154:     }
                   2155:     else if (scsirate == (syncrate->sxfr & ~ULTRA_SXFR))
                   2156:     {
                   2157:       return (syncrate->period);
                   2158:     }
                   2159:     syncrate++;
                   2160:   }
                   2161:   return (0); /* async */
                   2162: }
                   2163: 
                   2164: /*+F*************************************************************************
                   2165:  * Function:
                   2166:  *   aic7xxx_validate_offset
                   2167:  *
                   2168:  * Description:
                   2169:  *   Set a valid offset value for a particular card in use and transfer
                   2170:  *   settings in use.
                   2171:  *-F*************************************************************************/
                   2172: static void
                   2173: aic7xxx_validate_offset(struct aic7xxx_host *p,
                   2174:   struct aic7xxx_syncrate *syncrate, unsigned int *offset, int wide)
                   2175: {
                   2176:   unsigned int maxoffset;
                   2177: 
                   2178:   /* Limit offset to what the card (and device) can do */
                   2179:   if (syncrate == NULL)
                   2180:   {
                   2181:     maxoffset = 0;
                   2182:   }
                   2183:   else if (p->features & AHC_ULTRA2)
                   2184:   {
                   2185:     maxoffset = MAX_OFFSET_ULTRA2;
                   2186:   }
                   2187:   else
                   2188:   {
                   2189:     if (wide)
                   2190:       maxoffset = MAX_OFFSET_16BIT;
                   2191:     else
                   2192:       maxoffset = MAX_OFFSET_8BIT;
                   2193:   }
                   2194:   *offset = MIN(*offset, maxoffset);
                   2195: }
                   2196: 
                   2197: /*+F*************************************************************************
                   2198:  * Function:
                   2199:  *   aic7xxx_set_syncrate
                   2200:  *
                   2201:  * Description:
                   2202:  *   Set the actual syncrate down in the card and in our host structs
                   2203:  *-F*************************************************************************/
                   2204: static void
                   2205: aic7xxx_set_syncrate(struct aic7xxx_host *p, struct aic7xxx_syncrate *syncrate,
                   2206:     int target, int channel, unsigned int period, unsigned int offset,
                   2207:     unsigned int type)
                   2208: {
                   2209:   unsigned char tindex;
                   2210:   unsigned short target_mask;
                   2211:   unsigned char lun;
                   2212:   unsigned int old_period, old_offset;
                   2213: 
                   2214:   tindex = target | (channel << 3);
                   2215:   target_mask = 0x01 << tindex;
                   2216:   lun = aic_inb(p, SCB_TCL) & 0x07;
                   2217: 
                   2218:   if (syncrate == NULL)
                   2219:   {
                   2220:     period = 0;
                   2221:     offset = 0;
                   2222:   }
                   2223: 
                   2224:   old_period = p->transinfo[tindex].cur_period;
                   2225:   old_offset = p->transinfo[tindex].cur_offset;
                   2226: 
                   2227:   
                   2228:   if (type & AHC_TRANS_CUR)
                   2229:   {
                   2230:     unsigned int scsirate;
                   2231: 
                   2232:     scsirate = aic_inb(p, TARG_SCSIRATE + tindex);
                   2233:     if (p->features & AHC_ULTRA2)
                   2234:     {
                   2235:       scsirate &= ~SXFR_ULTRA2;
                   2236:       if (syncrate != NULL)
                   2237:       {
                   2238:         scsirate |= syncrate->sxfr_ultra2;
                   2239:       }
                   2240:       if (type & AHC_TRANS_ACTIVE)
                   2241:       {
                   2242:         aic_outb(p, offset, SCSIOFFSET);
                   2243:       }
                   2244:       aic_outb(p, offset, TARG_OFFSET + tindex);
                   2245:     }
                   2246:     else /* Not an Ultra2 controller */
                   2247:     {
                   2248:       scsirate &= ~(SXFR|SOFS);
                   2249:       p->ultraenb &= ~target_mask;
                   2250:       if (syncrate != NULL)
                   2251:       {
                   2252:         if (syncrate->sxfr & ULTRA_SXFR)
                   2253:         {
                   2254:           p->ultraenb |= target_mask;
                   2255:         }
                   2256:         scsirate |= (syncrate->sxfr & SXFR);
                   2257:         scsirate |= (offset & SOFS);
                   2258:       }
                   2259:       if (type & AHC_TRANS_ACTIVE)
                   2260:       {
                   2261:         unsigned char sxfrctl0;
                   2262: 
                   2263:         sxfrctl0 = aic_inb(p, SXFRCTL0);
                   2264:         sxfrctl0 &= ~FAST20;
                   2265:         if (p->ultraenb & target_mask)
                   2266:           sxfrctl0 |= FAST20;
                   2267:         aic_outb(p, sxfrctl0, SXFRCTL0);
                   2268:       }
                   2269:       aic_outb(p, p->ultraenb & 0xff, ULTRA_ENB);
                   2270:       aic_outb(p, (p->ultraenb >> 8) & 0xff, ULTRA_ENB + 1 );
                   2271:     }
                   2272:     if (type & AHC_TRANS_ACTIVE)
                   2273:     {
                   2274:       aic_outb(p, scsirate, SCSIRATE);
                   2275:     }
                   2276:     aic_outb(p, scsirate, TARG_SCSIRATE + tindex);
                   2277:     p->transinfo[tindex].cur_period = period;
                   2278:     p->transinfo[tindex].cur_offset = offset;
                   2279:     if ( !(type & AHC_TRANS_QUITE) &&
                   2280:          (aic7xxx_verbose & VERBOSE_NEGOTIATION) &&
                   2281:          (p->dev_flags[tindex] & DEVICE_PRINT_SDTR) )
                   2282:     {
                   2283:       if (offset)
                   2284:       {
                   2285:         int rate_mod = (scsirate & WIDEXFER) ? 1 : 0;
                   2286:       
                   2287:         printk(INFO_LEAD "Synchronous at %s Mbyte/sec, "
                   2288:                "offset %d.\n", p->host_no, channel, target, lun,
                   2289:                syncrate->rate[rate_mod], offset);
                   2290:       }
                   2291:       else
                   2292:       {
                   2293:         printk(INFO_LEAD "Using asynchronous transfers.\n",
                   2294:                p->host_no, channel, target, lun);
                   2295:       }
                   2296:       p->dev_flags[tindex] &= ~DEVICE_PRINT_SDTR;
                   2297:     }
                   2298:   }
                   2299: 
                   2300:   if (type & AHC_TRANS_GOAL)
                   2301:   {
                   2302:     p->transinfo[tindex].goal_period = period;
                   2303:     p->transinfo[tindex].goal_offset = offset;
                   2304:   }
                   2305: 
                   2306:   if (type & AHC_TRANS_USER)
                   2307:   {
                   2308:     p->transinfo[tindex].user_period = period;
                   2309:     p->transinfo[tindex].user_offset = offset;
                   2310:   }
                   2311: }
                   2312: 
                   2313: /*+F*************************************************************************
                   2314:  * Function:
                   2315:  *   aic7xxx_set_width
                   2316:  *
                   2317:  * Description:
                   2318:  *   Set the actual width down in the card and in our host structs
                   2319:  *-F*************************************************************************/
                   2320: static void
                   2321: aic7xxx_set_width(struct aic7xxx_host *p, int target, int channel, int lun,
                   2322:     unsigned int width, unsigned int type)
                   2323: {
                   2324:   unsigned char tindex;
                   2325:   unsigned short target_mask;
                   2326:   unsigned int old_width, new_offset;
                   2327: 
                   2328:   tindex = target | (channel << 3);
                   2329:   target_mask = 1 << tindex;
                   2330:   
                   2331:   old_width = p->transinfo[tindex].cur_width;
                   2332: 
                   2333:   if (p->features & AHC_ULTRA2)
                   2334:     new_offset = MAX_OFFSET_ULTRA2;
                   2335:   else if (width == MSG_EXT_WDTR_BUS_16_BIT)
                   2336:     new_offset = MAX_OFFSET_16BIT;
                   2337:   else
                   2338:     new_offset = MAX_OFFSET_8BIT;
                   2339:   
                   2340:   if (type & AHC_TRANS_CUR) 
                   2341:   {
                   2342:     unsigned char scsirate;
                   2343: 
                   2344:     scsirate = aic_inb(p, TARG_SCSIRATE + tindex);
                   2345: 
                   2346:     scsirate &= ~WIDEXFER;
                   2347:     if (width == MSG_EXT_WDTR_BUS_16_BIT)
                   2348:       scsirate |= WIDEXFER;
                   2349: 
                   2350:     aic_outb(p, scsirate, TARG_SCSIRATE + tindex);
                   2351: 
                   2352:     if (type & AHC_TRANS_ACTIVE)
                   2353:       aic_outb(p, scsirate, SCSIRATE);
                   2354: 
                   2355:     p->transinfo[tindex].cur_width = width;
                   2356: 
                   2357:     if ((aic7xxx_verbose & VERBOSE_NEGOTIATION2) && 
                   2358:         (p->dev_flags[tindex] & DEVICE_PRINT_WDTR))
                   2359:     {
                   2360:       printk(INFO_LEAD "Using %s transfers\n", p->host_no, channel, target,
                   2361:         lun, (scsirate & WIDEXFER) ? "Wide(16bit)" : "Narrow(8bit)" );
                   2362:       p->dev_flags[tindex] &= ~DEVICE_PRINT_WDTR;
                   2363:     }
                   2364:   }
                   2365: 
                   2366:   if (type & AHC_TRANS_GOAL)
                   2367:     p->transinfo[tindex].goal_width = width;
                   2368:   if (type & AHC_TRANS_USER)
                   2369:     p->transinfo[tindex].user_width = width;
                   2370: 
                   2371:   /*
                   2372:    * Having just set the width, the SDTR should come next, and we need a valid
                   2373:    * offset for the SDTR.  So, we make sure we put a valid one in here now as
                   2374:    * the goal_offset.
                   2375:    */
                   2376:   if (p->transinfo[tindex].goal_offset)
                   2377:     p->transinfo[tindex].goal_offset = new_offset;
                   2378: 
                   2379: }
                   2380:       
                   2381: /*+F*************************************************************************
                   2382:  * Function:
                   2383:  *   scbq_init
                   2384:  *
                   2385:  * Description:
                   2386:  *   SCB queue initialization.
                   2387:  *
                   2388:  *-F*************************************************************************/
                   2389: static void
                   2390: scbq_init(volatile scb_queue_type *queue)
                   2391: {
                   2392:   queue->head = NULL;
                   2393:   queue->tail = NULL;
                   2394: }
                   2395: 
                   2396: /*+F*************************************************************************
                   2397:  * Function:
                   2398:  *   scbq_insert_head
                   2399:  *
                   2400:  * Description:
                   2401:  *   Add an SCB to the head of the list.
                   2402:  *
                   2403:  *-F*************************************************************************/
                   2404: static inline void
                   2405: scbq_insert_head(volatile scb_queue_type *queue, struct aic7xxx_scb *scb)
                   2406: {
                   2407: #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95)
                   2408:   unsigned long cpu_flags;
                   2409: #endif
                   2410: 
                   2411:   DRIVER_LOCK
                   2412:   scb->q_next = queue->head;
                   2413:   queue->head = scb;
                   2414:   if (queue->tail == NULL)       /* If list was empty, update tail. */
                   2415:     queue->tail = queue->head;
                   2416:   DRIVER_UNLOCK
                   2417: }
                   2418: 
                   2419: /*+F*************************************************************************
                   2420:  * Function:
                   2421:  *   scbq_remove_head
                   2422:  *
                   2423:  * Description:
                   2424:  *   Remove an SCB from the head of the list.
                   2425:  *
                   2426:  *-F*************************************************************************/
                   2427: static inline struct aic7xxx_scb *
                   2428: scbq_remove_head(volatile scb_queue_type *queue)
                   2429: {
                   2430:   struct aic7xxx_scb * scbp;
                   2431: #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95)
                   2432:   unsigned long cpu_flags;
                   2433: #endif
                   2434: 
                   2435:   DRIVER_LOCK
                   2436:   scbp = queue->head;
                   2437:   if (queue->head != NULL)
                   2438:     queue->head = queue->head->q_next;
                   2439:   if (queue->head == NULL)       /* If list is now empty, update tail. */
                   2440:     queue->tail = NULL;
                   2441:   DRIVER_UNLOCK
                   2442:   return(scbp);
                   2443: }
                   2444: 
                   2445: /*+F*************************************************************************
                   2446:  * Function:
                   2447:  *   scbq_remove
                   2448:  *
                   2449:  * Description:
                   2450:  *   Removes an SCB from the list.
                   2451:  *
                   2452:  *-F*************************************************************************/
                   2453: static inline void
                   2454: scbq_remove(volatile scb_queue_type *queue, struct aic7xxx_scb *scb)
                   2455: {
                   2456: #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95)
                   2457:   unsigned long cpu_flags;
                   2458: #endif
                   2459: 
                   2460:   DRIVER_LOCK
                   2461:   if (queue->head == scb)
                   2462:   {
                   2463:     /* At beginning of queue, remove from head. */
                   2464:     scbq_remove_head(queue);
                   2465:   }
                   2466:   else
                   2467:   {
                   2468:     struct aic7xxx_scb *curscb = queue->head;
                   2469: 
                   2470:     /*
                   2471:      * Search until the next scb is the one we're looking for, or
                   2472:      * we run out of queue.
                   2473:      */
                   2474:     while ((curscb != NULL) && (curscb->q_next != scb))
                   2475:     {
                   2476:       curscb = curscb->q_next;
                   2477:     }
                   2478:     if (curscb != NULL)
                   2479:     {
                   2480:       /* Found it. */
                   2481:       curscb->q_next = scb->q_next;
                   2482:       if (scb->q_next == NULL)
                   2483:       {
                   2484:         /* Update the tail when removing the tail. */
                   2485:         queue->tail = curscb;
                   2486:       }
                   2487:     }
                   2488:   }
                   2489:   DRIVER_UNLOCK
                   2490: }
                   2491: 
                   2492: /*+F*************************************************************************
                   2493:  * Function:
                   2494:  *   scbq_insert_tail
                   2495:  *
                   2496:  * Description:
                   2497:  *   Add an SCB at the tail of the list.
                   2498:  *
                   2499:  *-F*************************************************************************/
                   2500: static inline void
                   2501: scbq_insert_tail(volatile scb_queue_type *queue, struct aic7xxx_scb *scb)
                   2502: {
                   2503: #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95)
                   2504:   unsigned long cpu_flags;
                   2505: #endif
                   2506: 
                   2507:   DRIVER_LOCK
                   2508:   scb->q_next = NULL;
                   2509:   if (queue->tail != NULL)       /* Add the scb at the end of the list. */
                   2510:     queue->tail->q_next = scb;
                   2511:   queue->tail = scb;             /* Update the tail. */
                   2512:   if (queue->head == NULL)       /* If list was empty, update head. */
                   2513:     queue->head = queue->tail;
                   2514:   DRIVER_UNLOCK
                   2515: }
                   2516: 
                   2517: /*+F*************************************************************************
                   2518:  * Function:
                   2519:  *   aic7xxx_match_scb
                   2520:  *
                   2521:  * Description:
                   2522:  *   Checks to see if an scb matches the target/channel as specified.
                   2523:  *   If target is ALL_TARGETS (-1), then we're looking for any device
                   2524:  *   on the specified channel; this happens when a channel is going
                   2525:  *   to be reset and all devices on that channel must be aborted.
                   2526:  *-F*************************************************************************/
                   2527: static int
                   2528: aic7xxx_match_scb(struct aic7xxx_host *p, struct aic7xxx_scb *scb,
                   2529:     int target, int channel, int lun, unsigned char tag)
                   2530: {
                   2531:   int targ = (scb->hscb->target_channel_lun >> 4) & 0x0F;
                   2532:   int chan = (scb->hscb->target_channel_lun >> 3) & 0x01;
                   2533:   int slun = scb->hscb->target_channel_lun & 0x07;
                   2534:   int match;
                   2535: 
                   2536:   match = ((chan == channel) || (channel == ALL_CHANNELS));
                   2537:   if (match != 0)
                   2538:     match = ((targ == target) || (target == ALL_TARGETS));
                   2539:   if (match != 0)
                   2540:     match = ((lun == slun) || (lun == ALL_LUNS));
                   2541:   if (match != 0)
                   2542:     match = ((tag == scb->hscb->tag) || (tag == SCB_LIST_NULL));
                   2543: 
                   2544:   if (aic7xxx_verbose & (VERBOSE_ABORT_PROCESS | VERBOSE_RESET_PROCESS))
                   2545:   {
                   2546:     printk(KERN_INFO "(scsi%d:%d:%d:%d:tag%d) %s search criteria"
                   2547:       " (scsi%d:%d:%d:%d:tag%d)\n", p->host_no, CTL_OF_SCB(scb),
                   2548:       scb->hscb->tag, (match) ? "matches" : "doesn't match",
                   2549:       p->host_no, channel, target, lun, tag);
                   2550:   }
                   2551: 
                   2552:   return (match);
                   2553: }
                   2554: 
                   2555: /*+F*************************************************************************
                   2556:  * Function:
                   2557:  *   aic7xxx_add_curscb_to_free_list
                   2558:  *
                   2559:  * Description:
                   2560:  *   Adds the current scb (in SCBPTR) to the list of free SCBs.
                   2561:  *-F*************************************************************************/
                   2562: static void
                   2563: aic7xxx_add_curscb_to_free_list(struct aic7xxx_host *p)
                   2564: {
                   2565:   /*
                   2566:    * Invalidate the tag so that aic7xxx_find_scb doesn't think
                   2567:    * it's active
                   2568:    */
                   2569:   aic_outb(p, SCB_LIST_NULL, SCB_TAG);
                   2570:   aic_outb(p, 0, SCB_CONTROL);
                   2571: 
                   2572:   aic_outb(p, aic_inb(p, FREE_SCBH), SCB_NEXT);
                   2573:   aic_outb(p, aic_inb(p, SCBPTR), FREE_SCBH);
                   2574: }
                   2575: 
                   2576: /*+F*************************************************************************
                   2577:  * Function:
                   2578:  *   aic7xxx_rem_scb_from_disc_list
                   2579:  *
                   2580:  * Description:
                   2581:  *   Removes the current SCB from the disconnected list and adds it
                   2582:  *   to the free list.
                   2583:  *-F*************************************************************************/
                   2584: static unsigned char
                   2585: aic7xxx_rem_scb_from_disc_list(struct aic7xxx_host *p, unsigned char scbptr)
                   2586: {
                   2587:   unsigned char next;
                   2588:   unsigned char prev;
                   2589: 
                   2590:   aic_outb(p, scbptr, SCBPTR);
                   2591:   next = aic_inb(p, SCB_NEXT);
                   2592:   prev = aic_inb(p, SCB_PREV);
                   2593:   aic7xxx_add_curscb_to_free_list(p);
                   2594: 
                   2595:   if (prev != SCB_LIST_NULL)
                   2596:   {
                   2597:     aic_outb(p, prev, SCBPTR);
                   2598:     aic_outb(p, next, SCB_NEXT);
                   2599:   }
                   2600:   else
                   2601:   {
                   2602:     aic_outb(p, next, DISCONNECTED_SCBH);
                   2603:   }
                   2604: 
                   2605:   if (next != SCB_LIST_NULL)
                   2606:   {
                   2607:     aic_outb(p, next, SCBPTR);
                   2608:     aic_outb(p, prev, SCB_PREV);
                   2609:   }
                   2610:   return next;
                   2611: }
                   2612: 
                   2613: /*+F*************************************************************************
                   2614:  * Function:
                   2615:  *   aic7xxx_busy_target
                   2616:  *
                   2617:  * Description:
                   2618:  *   Set the specified target busy.
                   2619:  *-F*************************************************************************/
                   2620: static inline void
                   2621: aic7xxx_busy_target(struct aic7xxx_host *p, struct aic7xxx_scb *scb)
                   2622: {
                   2623:   p->untagged_scbs[scb->hscb->target_channel_lun] = scb->hscb->tag;
                   2624: }
                   2625: 
                   2626: /*+F*************************************************************************
                   2627:  * Function:
                   2628:  *   aic7xxx_index_busy_target
                   2629:  *
                   2630:  * Description:
                   2631:  *   Returns the index of the busy target, and optionally sets the
                   2632:  *   target inactive.
                   2633:  *-F*************************************************************************/
                   2634: static inline unsigned char
                   2635: aic7xxx_index_busy_target(struct aic7xxx_host *p, unsigned char tcl,
                   2636:     int unbusy)
                   2637: {
                   2638:   unsigned char busy_scbid;
                   2639: 
                   2640:   busy_scbid = p->untagged_scbs[tcl];
                   2641:   if (unbusy)
                   2642:   {
                   2643:     p->untagged_scbs[tcl] = SCB_LIST_NULL;
                   2644:   }
                   2645:   return (busy_scbid);
                   2646: }
                   2647: 
                   2648: /*+F*************************************************************************
                   2649:  * Function:
                   2650:  *   aic7xxx_find_scb
                   2651:  *
                   2652:  * Description:
                   2653:  *   Look through the SCB array of the card and attempt to find the
                   2654:  *   hardware SCB that corresponds to the passed in SCB.  Return
                   2655:  *   SCB_LIST_NULL if unsuccessful.  This routine assumes that the
                   2656:  *   card is already paused.
                   2657:  *-F*************************************************************************/
                   2658: static unsigned char
                   2659: aic7xxx_find_scb(struct aic7xxx_host *p, struct aic7xxx_scb *scb)
                   2660: {
                   2661:   unsigned char saved_scbptr;
                   2662:   unsigned char curindex;
                   2663: 
                   2664:   saved_scbptr = aic_inb(p, SCBPTR);
                   2665:   curindex = 0;
                   2666:   for (curindex = 0; curindex < p->scb_data->maxhscbs; curindex++)
                   2667:   {
                   2668:     aic_outb(p, curindex, SCBPTR);
                   2669:     if (aic_inb(p, SCB_TAG) == scb->hscb->tag)
                   2670:     {
                   2671:       break;
                   2672:     }
                   2673:   }
                   2674:   aic_outb(p, saved_scbptr, SCBPTR);
                   2675:   if (curindex >= p->scb_data->maxhscbs)
                   2676:   {
                   2677:     curindex = SCB_LIST_NULL;
                   2678:   }
                   2679: 
                   2680:   return (curindex);
                   2681: }
                   2682: 
                   2683: /*+F*************************************************************************
                   2684:  * Function:
                   2685:  *   aic7xxx_allocate_scb
                   2686:  *
                   2687:  * Description:
                   2688:  *   Get an SCB from the free list or by allocating a new one.
                   2689:  *-F*************************************************************************/
                   2690: static int
                   2691: aic7xxx_allocate_scb(struct aic7xxx_host *p)
                   2692: {
                   2693:   struct aic7xxx_scb   *scbp = NULL;
                   2694:   int scb_size = sizeof(struct aic7xxx_scb) +
                   2695:                  sizeof (struct hw_scatterlist) * AIC7XXX_MAX_SG;
                   2696:   int i;
                   2697:   int step = PAGE_SIZE / 1024;
                   2698:   unsigned long scb_count = 0;
                   2699:   struct hw_scatterlist *hsgp;
                   2700:   struct aic7xxx_scb *scb_ap;
                   2701:   unsigned long temp;
                   2702: 
                   2703: 
                   2704:   if (p->scb_data->numscbs < p->scb_data->maxscbs)
                   2705:   {
                   2706:     /*
                   2707:      * Calculate the optimal number of SCBs to allocate.
                   2708:      *
                   2709:      * NOTE: This formula works because the sizeof(sg_array) is always
                   2710:      * 1024.  Therefore, scb_size * i would always be > PAGE_SIZE *
                   2711:      * (i/step).  The (i-1) allows the left hand side of the equation
                   2712:      * to grow into the right hand side to a point of near perfect
                   2713:      * efficiency since scb_size * (i -1) is growing slightly faster
                   2714:      * than the right hand side.  If the number of SG array elements
                   2715:      * is changed, this function may not be near so efficient any more.
                   2716:      */
                   2717:     for ( i=step;; i *= 2 )
                   2718:     {
                   2719:       if ( (scb_size * (i-1)) >= ( (PAGE_SIZE * (i/step)) - 64 ) )
                   2720:       {
                   2721:         i /= 2;
                   2722:         break;
                   2723:       }
                   2724:     }
                   2725:     scb_count = MIN( (i-1), p->scb_data->maxscbs - p->scb_data->numscbs);
                   2726:     scb_ap = (struct aic7xxx_scb *)kmalloc(scb_size * scb_count, GFP_ATOMIC);
                   2727:     if (scb_ap != NULL)
                   2728:     {
                   2729: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   2730:       if (aic7xxx_verbose > 0xffff)
                   2731:       {
                   2732:         if (p->scb_data->numscbs == 0)
                   2733:           printk(INFO_LEAD "Allocating initial %ld SCB structures.\n",
                   2734:             p->host_no, -1, -1, -1, scb_count);
                   2735:         else
                   2736:           printk(INFO_LEAD "Allocating %ld additional SCB structures.\n",
                   2737:             p->host_no, -1, -1, -1, scb_count);
                   2738:       }
                   2739: #endif
                   2740:       memset(scb_ap, 0, scb_count * scb_size);
                   2741:       temp = (unsigned long) &scb_ap[scb_count];
                   2742:       temp += 1023;
                   2743:       temp &= ~1023;
                   2744:       hsgp = (struct hw_scatterlist *)temp;
                   2745:       for (i=0; i < scb_count; i++)
                   2746:       {
                   2747:         scbp = &scb_ap[i];
                   2748:         scbp->hscb = &p->scb_data->hscbs[p->scb_data->numscbs];
                   2749:         scbp->sg_list = &hsgp[i * AIC7XXX_MAX_SG];
                   2750:         memset(scbp->hscb, 0, sizeof(struct aic7xxx_hwscb));
                   2751:         scbp->hscb->tag = p->scb_data->numscbs;
                   2752:         /*
                   2753:          * Place in the scb array; never is removed
                   2754:          */
                   2755:         p->scb_data->scb_array[p->scb_data->numscbs++] = scbp;
                   2756:         scbq_insert_head(&p->scb_data->free_scbs, scbp);
                   2757:       }
                   2758:       scbp->kmalloc_ptr = scb_ap;
                   2759:     }
                   2760:     else
                   2761:     {
                   2762:       return(0);
                   2763:     }
                   2764:   }
                   2765:   return(scb_count);
                   2766: }
                   2767: 
                   2768: /*+F*************************************************************************
                   2769:  * Function:
                   2770:  *   aic7xxx_queue_cmd_complete
                   2771:  *
                   2772:  * Description:
                   2773:  *   Due to race conditions present in the SCSI subsystem, it is easier
                   2774:  *   to queue completed commands, then call scsi_done() on them when
                   2775:  *   we're finished.  This function queues the completed commands.
                   2776:  *-F*************************************************************************/
                   2777: static void
                   2778: aic7xxx_queue_cmd_complete(struct aic7xxx_host *p, Scsi_Cmnd *cmd)
                   2779: {
                   2780:   cmd->host_scribble = (char *)p->completeq.head;
                   2781:   p->completeq.head = cmd;
                   2782: }
                   2783: 
                   2784: /*+F*************************************************************************
                   2785:  * Function:
                   2786:  *   aic7xxx_done_cmds_complete
                   2787:  *
                   2788:  * Description:
                   2789:  *   Process the completed command queue.
                   2790:  *-F*************************************************************************/
                   2791: static void
                   2792: aic7xxx_done_cmds_complete(struct aic7xxx_host *p)
                   2793: {
                   2794:   Scsi_Cmnd *cmd;
                   2795: #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95)
                   2796:   unsigned int cpu_flags = 0;
                   2797:   
                   2798:   DRIVER_LOCK
                   2799:   while (p->completeq.head != NULL)
                   2800:   {
                   2801:     cmd = p->completeq.head;
                   2802:     p->completeq.head = (Scsi_Cmnd *)cmd->host_scribble;
                   2803:     cmd->host_scribble = NULL;
                   2804:     sti();
                   2805:     cmd->scsi_done(cmd);
                   2806:     cli();
                   2807:   }
                   2808:   DRIVER_UNLOCK
                   2809: #else
                   2810:   while (p->completeq.head != NULL)
                   2811:   {
                   2812:     cmd = p->completeq.head;
                   2813:     p->completeq.head = (Scsi_Cmnd *)cmd->host_scribble;
                   2814:     cmd->host_scribble = NULL;
                   2815:     cmd->scsi_done(cmd);
                   2816:   }
                   2817: #endif
                   2818: }
                   2819: 
                   2820: /*+F*************************************************************************
                   2821:  * Function:
                   2822:  *   aic7xxx_free_scb
                   2823:  *
                   2824:  * Description:
                   2825:  *   Free the scb and insert into the free scb list.
                   2826:  *-F*************************************************************************/
                   2827: static void
                   2828: aic7xxx_free_scb(struct aic7xxx_host *p, struct aic7xxx_scb *scb)
                   2829: {
                   2830: 
                   2831:   scb->flags = SCB_FREE;
                   2832:   scb->cmd = NULL;
                   2833:   scb->sg_count = 0;
                   2834:   scb->sg_length = 0;
                   2835:   scb->tag_action = 0;
                   2836:   scb->hscb->control = 0;
                   2837:   scb->hscb->target_status = 0;
                   2838:   scb->hscb->target_channel_lun = SCB_LIST_NULL;
                   2839: 
                   2840:   scbq_insert_head(&p->scb_data->free_scbs, scb);
                   2841: }
                   2842: 
                   2843: /*+F*************************************************************************
                   2844:  * Function:
                   2845:  *   aic7xxx_done
                   2846:  *
                   2847:  * Description:
                   2848:  *   Calls the higher level scsi done function and frees the scb.
                   2849:  *-F*************************************************************************/
                   2850: static void
                   2851: aic7xxx_done(struct aic7xxx_host *p, struct aic7xxx_scb *scb)
                   2852: {
                   2853:   Scsi_Cmnd *cmd = scb->cmd;
                   2854:   int tindex = TARGET_INDEX(cmd);
                   2855:   struct aic7xxx_scb *scbp;
                   2856:   unsigned char queue_depth;
                   2857: 
                   2858:   if (scb->flags & SCB_RECOVERY_SCB)
                   2859:   {
                   2860:     p->flags &= ~AHC_ABORT_PENDING;
                   2861:   }
                   2862:   if (scb->flags & SCB_RESET)
                   2863:   {
                   2864:       cmd->result = (DID_RESET << 16) | (cmd->result & 0xffff);
                   2865:   }
                   2866:   else if (scb->flags & SCB_ABORT)
                   2867:   {
                   2868:       cmd->result = (DID_RESET << 16) | (cmd->result & 0xffff);
                   2869:   }
                   2870:   else if (!(p->dev_flags[tindex] & DEVICE_SCANNED))
                   2871:   {
                   2872:     if ( (cmd->cmnd[0] == INQUIRY) && (cmd->result == DID_OK) )
                   2873:     {
                   2874:       char *buffer;
                   2875:       
                   2876:       if(cmd->use_sg)
                   2877:       {
                   2878:         struct scatterlist *sg;
                   2879: 
                   2880:         sg = (struct scatterlist *)cmd->request_buffer;
                   2881:         buffer = (char *)sg[0].address;
                   2882:       }
                   2883:       else
                   2884:       {
                   2885:         buffer = (char *)cmd->request_buffer;
                   2886:       }
                   2887: #define WIDE_INQUIRY_BITS 0x60
                   2888: #define SYNC_INQUIRY_BITS 0x10
                   2889:       if ( (buffer[7] & WIDE_INQUIRY_BITS) &&
                   2890:            (p->features & AHC_WIDE) )
                   2891:       {
                   2892:         p->needwdtr |= (1<<tindex);
                   2893:         p->needwdtr_copy |= (1<<tindex);
                   2894:         if ( (p->flags & AHC_SEEPROM_FOUND) &&
                   2895:              (p->transinfo[tindex].user_width != MSG_EXT_WDTR_BUS_16_BIT) )
                   2896:           p->transinfo[tindex].goal_width = MSG_EXT_WDTR_BUS_8_BIT;
                   2897:         else
                   2898:           p->transinfo[tindex].goal_width = MSG_EXT_WDTR_BUS_16_BIT;
                   2899:       }
                   2900:       else
                   2901:       {
                   2902:         p->needwdtr &= ~(1<<tindex);
                   2903:         p->needwdtr_copy &= ~(1<<tindex);
                   2904:         pause_sequencer(p);
                   2905:         aic7xxx_set_width(p, cmd->target, cmd->channel, cmd->lun,
                   2906:                           MSG_EXT_WDTR_BUS_8_BIT, (AHC_TRANS_ACTIVE |
                   2907:                                                    AHC_TRANS_GOAL |
                   2908:                                                    AHC_TRANS_CUR) );
                   2909:         unpause_sequencer(p, FALSE);
                   2910:       }
                   2911:       if (buffer[7] & SYNC_INQUIRY_BITS)
                   2912:       {
                   2913:         p->needsdtr |= (1<<tindex);
                   2914:         p->needsdtr_copy |= (1<<tindex);
                   2915: 
                   2916:         if (p->flags & AHC_SEEPROM_FOUND)
                   2917:           p->transinfo[tindex].goal_period = p->transinfo[tindex].user_period;
                   2918:         else if (p->features & AHC_ULTRA2)
                   2919:           p->transinfo[tindex].goal_period =
                   2920:             aic7xxx_syncrates[AHC_SYNCRATE_ULTRA2].period;
                   2921:         else if (p->features & AHC_ULTRA)
                   2922:           p->transinfo[tindex].goal_period =
                   2923:             aic7xxx_syncrates[AHC_SYNCRATE_ULTRA].period;
                   2924:         else
                   2925:           p->transinfo[tindex].goal_period =
                   2926:             aic7xxx_syncrates[AHC_SYNCRATE_FAST].period;
                   2927: 
                   2928:         if (p->features & AHC_ULTRA2)
                   2929:           p->transinfo[tindex].goal_offset = MAX_OFFSET_ULTRA2;
                   2930:         else if (p->transinfo[tindex].goal_width == MSG_EXT_WDTR_BUS_16_BIT)
                   2931:           p->transinfo[tindex].goal_offset = MAX_OFFSET_16BIT;
                   2932:         else
                   2933:           p->transinfo[tindex].goal_offset = MAX_OFFSET_8BIT;
                   2934:       }
                   2935:       else
                   2936:       {
                   2937:         p->needsdtr &= ~(1<<tindex);
                   2938:         p->needsdtr_copy &= ~(1<<tindex);
                   2939:         p->transinfo[tindex].goal_period = 0;
                   2940:         p->transinfo[tindex].goal_offset = 0;
                   2941:       }
                   2942:       p->dev_flags[tindex] |= DEVICE_SCANNED;
                   2943:       p->dev_flags[tindex] |= DEVICE_PRINT_WDTR | DEVICE_PRINT_SDTR;
                   2944: #undef WIDE_INQUIRY_BITS
                   2945: #undef SYNC_INQUIRY_BITS
                   2946:     }
                   2947:   }
                   2948:   else if ((scb->flags & (SCB_MSGOUT_WDTR | SCB_MSGOUT_SDTR)) != 0)
                   2949:   {
                   2950:     unsigned short mask;
                   2951:     int message_error = FALSE;
                   2952: 
                   2953:     mask = 0x01 << tindex;
                   2954:  
                   2955:     /*
                   2956:      * Check to see if we get an invalid message or a message error
                   2957:      * after failing to negotiate a wide or sync transfer message.
                   2958:      */
                   2959:     if ((scb->flags & SCB_SENSE) && 
                   2960:           ((scb->cmd->sense_buffer[12] == 0x43) ||  /* INVALID_MESSAGE */
                   2961:           (scb->cmd->sense_buffer[12] == 0x49))) /* MESSAGE_ERROR  */
                   2962:     {
                   2963:       message_error = TRUE;
                   2964:     }
                   2965: 
                   2966:     if (scb->flags & SCB_MSGOUT_WDTR)
                   2967:     {
                   2968:       p->wdtr_pending &= ~mask;
                   2969:       if (message_error)
                   2970:       {
                   2971:         if ( (aic7xxx_verbose & VERBOSE_NEGOTIATION2) &&
                   2972:              (p->dev_flags[tindex] & DEVICE_PRINT_WDTR) )
                   2973:         {
                   2974:           printk(INFO_LEAD "Device failed to complete Wide Negotiation "
                   2975:             "processing and\n", p->host_no, CTL_OF_SCB(scb));
                   2976:           printk(INFO_LEAD "returned a sense error code for invalid message, "
                   2977:             "disabling future\n", p->host_no, CTL_OF_SCB(scb));
                   2978:           printk(INFO_LEAD "Wide negotiation to this device.\n", p->host_no,
                   2979:             CTL_OF_SCB(scb));
                   2980:           p->dev_flags[tindex] &= ~DEVICE_PRINT_WDTR;
                   2981:         }
                   2982:         p->needwdtr &= ~mask;
                   2983:         p->needwdtr_copy &= ~mask;
                   2984:       }
                   2985:     }
                   2986:     if (scb->flags & SCB_MSGOUT_SDTR)
                   2987:     {
                   2988:       p->sdtr_pending &= ~mask;
                   2989:       if (message_error)
                   2990:       {
                   2991:         if ( (aic7xxx_verbose & VERBOSE_NEGOTIATION2) &&
                   2992:              (p->dev_flags[tindex] & DEVICE_PRINT_SDTR) )
                   2993:         {
                   2994:           printk(INFO_LEAD "Device failed to complete Sync Negotiation "
                   2995:             "processing and\n", p->host_no, CTL_OF_SCB(scb));
                   2996:           printk(INFO_LEAD "returned a sense error code for invalid message, "
                   2997:             "disabling future\n", p->host_no, CTL_OF_SCB(scb));
                   2998:           printk(INFO_LEAD "Sync negotiation to this device.\n", p->host_no,
                   2999:             CTL_OF_SCB(scb));
                   3000:           p->dev_flags[tindex] &= ~DEVICE_PRINT_SDTR;
                   3001:         }
                   3002:         p->needsdtr &= ~mask;
                   3003:         p->needsdtr_copy &= ~mask;
                   3004:       }
                   3005:     }
                   3006:   }
                   3007:   queue_depth = p->dev_temp_queue_depth[tindex];
                   3008:   if (queue_depth >= p->dev_active_cmds[tindex])
                   3009:   {
                   3010:     scbp = scbq_remove_head(&p->delayed_scbs[tindex]);
                   3011:     if (scbp)
                   3012:     {
                   3013:       if (queue_depth == 1)
                   3014:       {
                   3015:         /*
                   3016:          * Give extra preference to untagged devices, such as CD-R devices
                   3017:          * This makes it more likely that a drive *won't* stuff up while
                   3018:          * waiting on data at a critical time, such as CD-R writing and
                   3019:          * audio CD ripping operations.  Should also benefit tape drives.
                   3020:          */
                   3021:         scbq_insert_head(&p->waiting_scbs, scbp);
                   3022:       }
                   3023:       else
                   3024:       {
                   3025:         scbq_insert_tail(&p->waiting_scbs, scbp);
                   3026:       }
                   3027: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   3028:       if (aic7xxx_verbose > 0xffff)
                   3029:         printk(INFO_LEAD "Moving SCB from delayed to waiting queue.\n",
                   3030:                p->host_no, CTL_OF_SCB(scbp));
                   3031: #endif
                   3032:       if (queue_depth > p->dev_active_cmds[tindex])
                   3033:       {
                   3034:         scbp = scbq_remove_head(&p->delayed_scbs[tindex]);
                   3035:         if (scbp)
                   3036:           scbq_insert_tail(&p->waiting_scbs, scbp);
                   3037:       }
                   3038:     }
                   3039:   }
                   3040:   if ( !(scb->tag_action) && (p->tagenable & (1<<tindex)) )
                   3041:   {
                   3042:     p->dev_temp_queue_depth[tindex] = p->dev_max_queue_depth[tindex];
                   3043:   }
                   3044:   p->dev_active_cmds[tindex]--;
                   3045:   p->activescbs--;
                   3046: 
                   3047:   /*
                   3048:    * If this was an untagged I/O, unbusy the target so the sequencer won't
                   3049:    * mistake things later
                   3050:    */
                   3051:   if (aic7xxx_index_busy_target(p, scb->hscb->target_channel_lun, FALSE) ==
                   3052:       scb->hscb->tag)
                   3053:   {
                   3054:     aic7xxx_index_busy_target(p, scb->hscb->target_channel_lun, TRUE);
                   3055:   }
                   3056: 
                   3057:   {
                   3058:     int actual;
                   3059: 
                   3060:     /*
                   3061:      * XXX: we should actually know how much actually transferred
                   3062:      * XXX: for each command, but apparently that's too difficult.
                   3063:      * 
                   3064:      * We set a lower limit of 512 bytes on the transfer length.  We
                   3065:      * ignore anything less than this because we don't have a real
                   3066:      * reason to count it.  Read/Writes to tapes are usually about 20K
                   3067:      * and disks are a minimum of 512 bytes unless you want to count
                   3068:      * non-read/write commands (such as TEST_UNIT_READY) which we don't
                   3069:      */
                   3070:     actual = scb->sg_length;
                   3071:     if ((actual >= 512) && (((cmd->result >> 16) & 0xf) == DID_OK))
                   3072:     {
                   3073:       struct aic7xxx_xferstats *sp;
                   3074: #ifdef AIC7XXX_PROC_STATS
                   3075:       long *ptr;
                   3076:       int x;
                   3077: #endif /* AIC7XXX_PROC_STATS */
                   3078: 
                   3079:       sp = &p->stats[TARGET_INDEX(cmd)][cmd->lun & 0x7];
                   3080:       sp->xfers++;
                   3081: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   3082:       if ( (sp->xfers > 16) && (aic7xxx_verbose > 0xffff) )
                   3083:         aic7xxx_verbose &= 0xffff;
                   3084: #endif
                   3085: 
                   3086:       /*
                   3087:        * For block devices, cmd->request.cmd is always == either READ or
                   3088:        * WRITE.  For character devices, this isn't always set properly, so
                   3089:        * we check data_cmnd[0].  This catches the conditions for st.c, but
                   3090:        * I'm still not sure if request.cmd is valid for sg devices.
                   3091:        */
                   3092:       if ( (cmd->request.cmd == WRITE) || (cmd->data_cmnd[0] == WRITE_6) ||
                   3093:            (cmd->data_cmnd[0] == WRITE_FILEMARKS) )
                   3094:       {
                   3095:         sp->w_total++;
                   3096:         sp->w_total512 += (actual >> 9);
                   3097: #ifdef AIC7XXX_PROC_STATS
                   3098:         ptr = sp->w_bins;
                   3099: #endif /* AIC7XXX_PROC_STATS */
                   3100:       }
                   3101:       else
                   3102:       {
                   3103:         sp->r_total++;
                   3104:         sp->r_total512 += (actual >> 9);
                   3105: #ifdef AIC7XXX_PROC_STATS
                   3106:         ptr = sp->r_bins;
                   3107: #endif /* AIC7XXX_PROC_STATS */
                   3108:       }
                   3109: #ifdef AIC7XXX_PROC_STATS
                   3110:       for (x = 9; x <= 17; x++)
                   3111:       {
                   3112:         if (actual < (1 << x))
                   3113:         {
                   3114:           ptr[x - 9]++;
                   3115:           break;
                   3116:         }
                   3117:       }
                   3118:       if (x > 17)
                   3119:       {
                   3120:         ptr[x - 9]++;
                   3121:       }
                   3122: #endif /* AIC7XXX_PROC_STATS */
                   3123:     }
                   3124:   }
                   3125:   aic7xxx_free_scb(p, scb);
                   3126:   aic7xxx_queue_cmd_complete(p, cmd);
                   3127: 
                   3128: }
                   3129: 
                   3130: /*+F*************************************************************************
                   3131:  * Function:
                   3132:  *   aic7xxx_run_done_queue
                   3133:  *
                   3134:  * Description:
                   3135:  *   Calls the aic7xxx_done() for the Scsi_Cmnd of each scb in the
                   3136:  *   aborted list, and adds each scb to the free list.  If complete
                   3137:  *   is TRUE, we also process the commands complete list.
                   3138:  *-F*************************************************************************/
                   3139: static void
                   3140: aic7xxx_run_done_queue(struct aic7xxx_host *p, /*complete*/ int complete)
                   3141: {
                   3142:   struct aic7xxx_scb *scb;
                   3143:   int i, found = 0;
                   3144: 
                   3145:   for (i = 0; i < p->scb_data->numscbs; i++)
                   3146:   {
                   3147:     scb = p->scb_data->scb_array[i];
                   3148:     if (scb->flags & SCB_QUEUED_FOR_DONE)
                   3149:     {
                   3150:       if (aic7xxx_verbose & (VERBOSE_ABORT_PROCESS | VERBOSE_RESET_PROCESS))
                   3151:         printk(INFO_LEAD "Aborting scb %d\n",
                   3152:              p->host_no, CTL_OF_SCB(scb), scb->hscb->tag);
                   3153:       found++;
                   3154:       aic7xxx_done(p, scb);
                   3155:     }
                   3156:   }
                   3157:   if (aic7xxx_verbose & (VERBOSE_ABORT_RETURN | VERBOSE_RESET_RETURN))
                   3158:   {
                   3159:     printk(INFO_LEAD "%d commands found and queued for "
                   3160:         "completion.\n", p->host_no, -1, -1, -1, found);
                   3161:   }
                   3162:   if (complete)
                   3163:   {
                   3164:     aic7xxx_done_cmds_complete(p);
                   3165:   }
                   3166: }
                   3167: 
                   3168: /*+F*************************************************************************
                   3169:  * Function:
                   3170:  *   aic7xxx_abort_waiting_scb
                   3171:  *
                   3172:  * Description:
                   3173:  *   Manipulate the waiting for selection list and return the
                   3174:  *   scb that follows the one that we remove.
                   3175:  *-F*************************************************************************/
                   3176: static unsigned char
                   3177: aic7xxx_abort_waiting_scb(struct aic7xxx_host *p, struct aic7xxx_scb *scb,
                   3178:     unsigned char scbpos, unsigned char prev)
                   3179: {
                   3180:   unsigned char curscb, next;
                   3181: 
                   3182:   /*
                   3183:    * Select the SCB we want to abort and pull the next pointer out of it.
                   3184:    */
                   3185:   curscb = aic_inb(p, SCBPTR);
                   3186:   aic_outb(p, scbpos, SCBPTR);
                   3187:   next = aic_inb(p, SCB_NEXT);
                   3188: 
                   3189:   aic7xxx_add_curscb_to_free_list(p);
                   3190: 
                   3191:   /*
                   3192:    * Update the waiting list
                   3193:    */
                   3194:   if (prev == SCB_LIST_NULL)
                   3195:   {
                   3196:     /*
                   3197:      * First in the list
                   3198:      */
                   3199:     aic_outb(p, next, WAITING_SCBH);
                   3200:   }
                   3201:   else
                   3202:   {
                   3203:     /*
                   3204:      * Select the scb that pointed to us and update its next pointer.
                   3205:      */
                   3206:     aic_outb(p, prev, SCBPTR);
                   3207:     aic_outb(p, next, SCB_NEXT);
                   3208:   }
                   3209:   /*
                   3210:    * Point us back at the original scb position and inform the SCSI
                   3211:    * system that the command has been aborted.
                   3212:    */
                   3213:   aic_outb(p, curscb, SCBPTR);
                   3214:   return (next);
                   3215: }
                   3216: 
                   3217: /*+F*************************************************************************
                   3218:  * Function:
                   3219:  *   aic7xxx_search_qinfifo
                   3220:  *
                   3221:  * Description:
                   3222:  *   Search the queue-in FIFO for matching SCBs and conditionally
                   3223:  *   requeue.  Returns the number of matching SCBs.
                   3224:  *-F*************************************************************************/
                   3225: static int
                   3226: aic7xxx_search_qinfifo(struct aic7xxx_host *p, int target, int channel,
                   3227:     int lun, unsigned char tag, int flags, int requeue,
                   3228:     volatile scb_queue_type *queue)
                   3229: {
                   3230:   int      found;
                   3231:   unsigned char qinpos, qintail;
                   3232:   struct aic7xxx_scb *scbp;
                   3233: 
                   3234:   found = 0;
                   3235:   qinpos = aic_inb(p, QINPOS);
                   3236:   qintail = p->qinfifonext;
                   3237: 
                   3238:   p->qinfifonext = qinpos;
                   3239: 
                   3240:   while (qinpos != qintail)
                   3241:   {
                   3242:     scbp = p->scb_data->scb_array[p->qinfifo[qinpos++]];
                   3243:     if (aic7xxx_match_scb(p, scbp, target, channel, lun, tag))
                   3244:     {
                   3245:        /*
                   3246:         * We found an scb that needs to be removed.
                   3247:         */
                   3248:        if (requeue && (queue != NULL))
                   3249:        {
                   3250:          if (scbp->flags & SCB_WAITINGQ)
                   3251:          {
                   3252:            scbq_remove(queue, scbp);
                   3253:            scbq_remove(&p->waiting_scbs, scbp);
                   3254:            scbq_remove(&p->delayed_scbs[TARGET_INDEX(scbp->cmd)], scbp);
                   3255:            p->dev_active_cmds[TARGET_INDEX(scbp->cmd)]++;
                   3256:            p->activescbs++;
                   3257:          }
                   3258:          scbq_insert_tail(queue, scbp);
                   3259:          p->dev_active_cmds[TARGET_INDEX(scbp->cmd)]--;
                   3260:          p->activescbs--;
                   3261:          scbp->flags |= SCB_WAITINGQ;
                   3262:          if ( !(scbp->tag_action & TAG_ENB) )
                   3263:          {
                   3264:            aic7xxx_index_busy_target(p, scbp->hscb->target_channel_lun,
                   3265:              TRUE);
                   3266:          }
                   3267:        }
                   3268:        else if (requeue)
                   3269:        {
                   3270:          p->qinfifo[p->qinfifonext++] = scbp->hscb->tag;
                   3271:        }
                   3272:        else
                   3273:        {
                   3274:         /*
                   3275:          * Preserve any SCB_RECOVERY_SCB flags on this scb then set the
                   3276:          * flags we were called with, presumeably so aic7xxx_run_done_queue
                   3277:          * can find this scb
                   3278:          */
                   3279:          scbp->flags = flags | (scbp->flags & SCB_RECOVERY_SCB);
                   3280:          if (aic7xxx_index_busy_target(p, scbp->hscb->target_channel_lun,
                   3281:                                        FALSE) == scbp->hscb->tag)
                   3282:          {
                   3283:            aic7xxx_index_busy_target(p, scbp->hscb->target_channel_lun,
                   3284:              TRUE);
                   3285:          }
                   3286:        }
                   3287:        found++;
                   3288:     }
                   3289:     else
                   3290:     {
                   3291:       p->qinfifo[p->qinfifonext++] = scbp->hscb->tag;
                   3292:     }
                   3293:   }
                   3294:   /*
                   3295:    * Now that we've done the work, clear out any left over commands in the
                   3296:    * qinfifo and update the KERNEL_QINPOS down on the card.
                   3297:    *
                   3298:    *  NOTE: This routine expect the sequencer to already be paused when
                   3299:    *        it is run....make sure it's that way!
                   3300:    */
                   3301:   qinpos = p->qinfifonext;
                   3302:   while(qinpos != qintail)
                   3303:   {
                   3304:     p->qinfifo[qinpos++] = SCB_LIST_NULL;
                   3305:   }
                   3306:   if (p->features & AHC_QUEUE_REGS)
                   3307:     aic_outb(p, p->qinfifonext, HNSCB_QOFF);
                   3308:   else
                   3309:     aic_outb(p, p->qinfifonext, KERNEL_QINPOS);
                   3310: 
                   3311:   return (found);
                   3312: }
                   3313: 
                   3314: /*+F*************************************************************************
                   3315:  * Function:
                   3316:  *   aic7xxx_scb_on_qoutfifo
                   3317:  *
                   3318:  * Description:
                   3319:  *   Is the scb that was passed to us currently on the qoutfifo?
                   3320:  *-F*************************************************************************/
                   3321: static int
                   3322: aic7xxx_scb_on_qoutfifo(struct aic7xxx_host *p, struct aic7xxx_scb *scb)
                   3323: {
                   3324:   int i=0;
                   3325: 
                   3326:   while(p->qoutfifo[(p->qoutfifonext + i) & 0xff ] != SCB_LIST_NULL)
                   3327:   {
                   3328:     if(p->qoutfifo[(p->qoutfifonext + i) & 0xff ] == scb->hscb->tag)
                   3329:       return TRUE;
                   3330:     else
                   3331:       i++;
                   3332:   }
                   3333:   return FALSE;
                   3334: }
                   3335: 
                   3336: 
                   3337: /*+F*************************************************************************
                   3338:  * Function:
                   3339:  *   aic7xxx_reset_device
                   3340:  *
                   3341:  * Description:
                   3342:  *   The device at the given target/channel has been reset.  Abort
                   3343:  *   all active and queued scbs for that target/channel.  This function
                   3344:  *   need not worry about linked next pointers because if was a MSG_ABORT_TAG
                   3345:  *   then we had a tagged command (no linked next), if it was MSG_ABORT or
                   3346:  *   MSG_BUS_DEV_RESET then the device won't know about any commands any more
                   3347:  *   and no busy commands will exist, and if it was a bus reset, then nothing
                   3348:  *   knows about any linked next commands any more.  In all cases, we don't
                   3349:  *   need to worry about the linked next or busy scb, we just need to clear
                   3350:  *   them.
                   3351:  *-F*************************************************************************/
                   3352: static void
                   3353: aic7xxx_reset_device(struct aic7xxx_host *p, int target, int channel,
                   3354:                      int lun, unsigned char tag)
                   3355: {
                   3356:   struct aic7xxx_scb *scbp;
                   3357:   unsigned char active_scb, tcl;
                   3358:   int i = 0, j, init_lists = FALSE;
                   3359: 
                   3360:   /*
                   3361:    * Restore this when we're done
                   3362:    */
                   3363:   active_scb = aic_inb(p, SCBPTR);
                   3364: 
                   3365:   if (aic7xxx_verbose & (VERBOSE_RESET_PROCESS | VERBOSE_ABORT_PROCESS))
                   3366:     printk(INFO_LEAD "Reset device, active_scb %d\n",
                   3367:          p->host_no, channel, target, lun, active_scb);
                   3368:   /*
                   3369:    * Deal with the busy target and linked next issues.
                   3370:    */
                   3371:   {
                   3372:     int min_target, max_target;
                   3373:     struct aic7xxx_scb *scbp, *prev_scbp;
                   3374: 
                   3375:     /* Make all targets 'relative' to bus A. */
                   3376:     if (target == ALL_TARGETS)
                   3377:     {
                   3378:       switch (channel)
                   3379:       {
                   3380:         case 0:
                   3381:                  min_target = 0;
                   3382:                  max_target = (p->features & AHC_WIDE) ? 15 : 7;
                   3383:                  break;
                   3384:         case 1:
                   3385:                  min_target = 8;
                   3386:                  max_target = 15;
                   3387:                  break;
                   3388:         case ALL_CHANNELS:
                   3389:         default:
                   3390:                  min_target = 0;
                   3391:                  max_target = (p->features & (AHC_TWIN|AHC_WIDE)) ? 15 : 7;
                   3392:                  break;
                   3393:       }
                   3394:     }
                   3395:     else
                   3396:     { 
                   3397:       min_target = target | (channel << 3);
                   3398:       max_target = min_target;
                   3399:     }
                   3400: 
                   3401: 
                   3402:     for (i = min_target; i <= max_target; i++)
                   3403:     {
                   3404:       if (aic7xxx_verbose & (VERBOSE_ABORT_PROCESS | VERBOSE_RESET_PROCESS))
                   3405:         printk(INFO_LEAD "Cleaning up status information "
                   3406:           "and delayed_scbs.\n", p->host_no, channel, i, lun);
                   3407:       if ( !(p->dev_flags[i] & DEVICE_TAGGED_SUCCESS) &&
                   3408:             (p->dev_active_cmds[i]) &&
                   3409:             (p->tagenable & (0x01 << i)) )
                   3410:       {
                   3411:         printk(INFO_LEAD "Device appears to be choking on tagged commands.\n",
                   3412:           p->host_no, channel, i, lun);
                   3413:         printk(INFO_LEAD "Will use untagged I/O instead.\n", p->host_no,
                   3414:           channel, i, lun);
                   3415:         p->dev_max_queue_depth[i] = 1;
                   3416:         p->dev_temp_queue_depth[i] = 1;
                   3417:         p->tagenable &= ~(0x01 << i);
                   3418:         p->orderedtag &= ~(0x01 << i);
                   3419:       }
                   3420:       p->dev_flags[i] &= ~BUS_DEVICE_RESET_PENDING;
                   3421:       if ( tag == SCB_LIST_NULL )
                   3422:       {
                   3423:         p->dev_flags[i] |= DEVICE_PRINT_WDTR | DEVICE_PRINT_SDTR;
                   3424:         p->dev_last_reset[i] = jiffies;
                   3425:         p->dev_last_queue_full_count[i] = 0;
                   3426:         p->dev_last_queue_full[i] = 0;
                   3427:         p->dev_temp_queue_depth[i] =
                   3428:           p->dev_max_queue_depth[i];
                   3429:   /*
                   3430:    * In case this isn't a full bus reset, we want to add a 4 second timer in
                   3431:    * here so that we can delay all re-sent commands for this device for the
                   3432:    * 4 seconds and then have our timer routine pick them back up.
                   3433:    */
                   3434:         if(p->dev_timer[i].expires)
                   3435:         {
                   3436:           del_timer(&p->dev_timer[i]);
                   3437:         }
                   3438:         p->dev_timer[i].expires = jiffies + (4 * HZ);
                   3439:         add_timer(&p->dev_timer[i]);
                   3440:       }
                   3441:       for(j=0; j<MAX_LUNS; j++)
                   3442:       {
                   3443:         if (channel == 1)
                   3444:           tcl = ((i << 4) & 0x70) | (channel << 3) | j;
                   3445:         else
                   3446:           tcl = (i << 4) | (channel << 3) | j;
                   3447:         if ( (aic7xxx_index_busy_target(p, tcl, FALSE) == tag) ||
                   3448:              (tag == SCB_LIST_NULL) )
                   3449:           aic7xxx_index_busy_target(p, tcl, /* unbusy */ TRUE);
                   3450:       }
                   3451:       j = 0; 
                   3452:       prev_scbp = NULL; 
                   3453:       scbp = p->delayed_scbs[i].head;
                   3454:       while ( (scbp != NULL) && (j++ <= (p->scb_data->numscbs + 1)) )
                   3455:       {
                   3456:         prev_scbp = scbp;
                   3457:         scbp = scbp->q_next;
                   3458:         if ( prev_scbp == scbp )
                   3459:         {
                   3460:           if (aic7xxx_verbose & (VERBOSE_ABORT | VERBOSE_RESET))
                   3461:             printk(WARN_LEAD "Yikes!! scb->q_next == scb "
                   3462:               "in the delayed_scbs queue!\n", p->host_no, channel, i, lun);
                   3463:           scbp = NULL;
                   3464:           prev_scbp->q_next = NULL;
                   3465:           p->delayed_scbs[i].tail = prev_scbp;
                   3466:         }
                   3467:         if (aic7xxx_match_scb(p, prev_scbp, target, channel, lun, tag))
                   3468:         {
                   3469:           scbq_remove(&p->delayed_scbs[i], prev_scbp);
                   3470:           if (prev_scbp->flags & SCB_WAITINGQ)
                   3471:           {
                   3472:             p->dev_active_cmds[i]++;
                   3473:             p->activescbs++;
                   3474:           }
                   3475:           prev_scbp->flags &= ~(SCB_ACTIVE | SCB_WAITINGQ);
                   3476:           prev_scbp->flags |= SCB_RESET | SCB_QUEUED_FOR_DONE;
                   3477:         }
                   3478:       }
                   3479:       if ( j > (p->scb_data->maxscbs + 1) )
                   3480:       {
                   3481:         if (aic7xxx_verbose & (VERBOSE_ABORT | VERBOSE_RESET))
                   3482:           printk(WARN_LEAD "Yikes!! There's a loop in the "
                   3483:             "delayed_scbs queue!\n", p->host_no, channel, i, lun);
                   3484:         scbq_init(&p->delayed_scbs[i]);
                   3485:       }
                   3486:       if ( (p->delayed_scbs[i].head == NULL) &&
                   3487:            (p->dev_timer[i].expires) )
                   3488:       {
                   3489:         del_timer(&p->dev_timer[i]);
                   3490:         p->dev_timer[i].expires = 0;
                   3491:       }
                   3492:     }
                   3493:   }
                   3494: 
                   3495:   if (aic7xxx_verbose & (VERBOSE_ABORT_PROCESS | VERBOSE_RESET_PROCESS))
                   3496:     printk(INFO_LEAD "Cleaning QINFIFO.\n", p->host_no, channel, target, lun );
                   3497:   aic7xxx_search_qinfifo(p, target, channel, lun, tag,
                   3498:       SCB_RESET | SCB_QUEUED_FOR_DONE, /* requeue */ FALSE, NULL);
                   3499: 
                   3500: /*
                   3501:  *  Search the waiting_scbs queue for matches, this catches any SCB_QUEUED
                   3502:  *  ABORT/RESET commands.
                   3503:  */
                   3504:   if (aic7xxx_verbose & (VERBOSE_ABORT_PROCESS | VERBOSE_RESET_PROCESS))
                   3505:     printk(INFO_LEAD "Cleaning waiting_scbs.\n", p->host_no, channel,
                   3506:       target, lun );
                   3507:   {
                   3508:     struct aic7xxx_scb *scbp, *prev_scbp;
                   3509: 
                   3510:     j = 0; 
                   3511:     prev_scbp = NULL; 
                   3512:     scbp = p->waiting_scbs.head;
                   3513:     while ( (scbp != NULL) && (j++ <= (p->scb_data->numscbs + 1)) )
                   3514:     {
                   3515:       prev_scbp = scbp;
                   3516:       scbp = scbp->q_next;
                   3517:       if ( prev_scbp == scbp )
                   3518:       {
                   3519:         if (aic7xxx_verbose & (VERBOSE_ABORT | VERBOSE_RESET))
                   3520:           printk(WARN_LEAD "Yikes!! scb->q_next == scb "
                   3521:             "in the waiting_scbs queue!\n", p->host_no, CTL_OF_SCB(scbp));
                   3522:         scbp = NULL;
                   3523:         prev_scbp->q_next = NULL;
                   3524:         p->waiting_scbs.tail = prev_scbp;
                   3525:       }
                   3526:       if (aic7xxx_match_scb(p, prev_scbp, target, channel, lun, tag))
                   3527:       {
                   3528:         scbq_remove(&p->waiting_scbs, prev_scbp);
                   3529:         if (prev_scbp->flags & SCB_WAITINGQ)
                   3530:         {
                   3531:           p->dev_active_cmds[TARGET_INDEX(prev_scbp->cmd)]++;
                   3532:           p->activescbs++;
                   3533:         }
                   3534:         prev_scbp->flags &= ~(SCB_ACTIVE | SCB_WAITINGQ);
                   3535:         prev_scbp->flags |= SCB_RESET | SCB_QUEUED_FOR_DONE;
                   3536:       }
                   3537:     }
                   3538:     if ( j > (p->scb_data->maxscbs + 1) )
                   3539:     {
                   3540:       if (aic7xxx_verbose & (VERBOSE_ABORT | VERBOSE_RESET))
                   3541:         printk(WARN_LEAD "Yikes!! There's a loop in the "
                   3542:           "waiting_scbs queue!\n", p->host_no, channel, target, lun);
                   3543:       scbq_init(&p->waiting_scbs);
                   3544:     }
                   3545:   }
                   3546: 
                   3547: 
                   3548:   /*
                   3549:    * Search waiting for selection list.
                   3550:    */
                   3551:   if (aic7xxx_verbose & (VERBOSE_ABORT_PROCESS | VERBOSE_RESET_PROCESS))
                   3552:     printk(INFO_LEAD "Cleaning waiting for selection "
                   3553:       "list.\n", p->host_no, channel, target, lun);
                   3554:   {
                   3555:     unsigned char next, prev, scb_index;
                   3556: 
                   3557:     next = aic_inb(p, WAITING_SCBH);  /* Start at head of list. */
                   3558:     prev = SCB_LIST_NULL;
                   3559:     j = 0;
                   3560:     while ( (next != SCB_LIST_NULL) && (j++ <= (p->scb_data->maxscbs + 1)) )
                   3561:     {
                   3562:       aic_outb(p, next, SCBPTR);
                   3563:       scb_index = aic_inb(p, SCB_TAG);
                   3564:       if (scb_index >= p->scb_data->numscbs)
                   3565:       {
                   3566:        /*
                   3567:         * No aic7xxx_verbose check here.....we want to see this since it
                   3568:         * means either the kernel driver or the sequencer screwed things up
                   3569:         */
                   3570:         printk(WARN_LEAD "Waiting List inconsistency; SCB index=%d, "
                   3571:           "numscbs=%d\n", p->host_no, channel, target, lun, scb_index,
                   3572:           p->scb_data->numscbs);
                   3573:         next = aic_inb(p, SCB_NEXT);
                   3574:         aic7xxx_add_curscb_to_free_list(p);
                   3575:       }
                   3576:       else
                   3577:       {
                   3578:         scbp = p->scb_data->scb_array[scb_index];
                   3579:         if (aic7xxx_match_scb(p, scbp, target, channel, lun, tag))
                   3580:         {
                   3581:           next = aic7xxx_abort_waiting_scb(p, scbp, next, prev);
                   3582:           if (scbp->flags & SCB_WAITINGQ)
                   3583:           {
                   3584:             p->dev_active_cmds[TARGET_INDEX(scbp->cmd)]++;
                   3585:             p->activescbs++;
                   3586:           }
                   3587:           scbp->flags &= ~(SCB_ACTIVE | SCB_WAITINGQ);
                   3588:           scbp->flags |= SCB_RESET | SCB_QUEUED_FOR_DONE;
                   3589:           if (prev == SCB_LIST_NULL)
                   3590:           {
                   3591:             /*
                   3592:              * This is either the first scb on the waiting list, or we
                   3593:              * have already yanked the first and haven't left any behind.
                   3594:              * Either way, we need to turn off the selection hardware if
                   3595:              * it isn't already off.
                   3596:              */
                   3597:             aic_outb(p, aic_inb(p, SCSISEQ) & ~ENSELO, SCSISEQ);
                   3598:             aic_outb(p, CLRSELTIMEO, CLRSINT1);
                   3599:           }
                   3600:         }
                   3601:         else
                   3602:         {
                   3603:           prev = next;
                   3604:           next = aic_inb(p, SCB_NEXT);
                   3605:         }
                   3606:       }
                   3607:     }
                   3608:     if ( j > (p->scb_data->maxscbs + 1) )
                   3609:     {
                   3610:       printk(WARN_LEAD "Yikes!!  There is a loop in the waiting for "
                   3611:         "selection list!\n", p->host_no, channel, target, lun);
                   3612:       init_lists = TRUE;
                   3613:     }
                   3614:   }
                   3615: 
                   3616:   /*
                   3617:    * Go through disconnected list and remove any entries we have queued
                   3618:    * for completion, zeroing their control byte too.
                   3619:    */
                   3620:   if (aic7xxx_verbose & (VERBOSE_ABORT_PROCESS | VERBOSE_RESET_PROCESS))
                   3621:     printk(INFO_LEAD "Cleaning disconnected scbs "
                   3622:       "list.\n", p->host_no, channel, target, lun);
                   3623:   if (p->features & AHC_PAGESCBS)
                   3624:   {
                   3625:     unsigned char next, prev, scb_index;
                   3626: 
                   3627:     next = aic_inb(p, DISCONNECTED_SCBH);
                   3628:     prev = SCB_LIST_NULL;
                   3629:     j = 0;
                   3630:     while ( (next != SCB_LIST_NULL) && (j++ <= (p->scb_data->maxscbs + 1)) )
                   3631:     {
                   3632:       aic_outb(p, next, SCBPTR);
                   3633:       scb_index = aic_inb(p, SCB_TAG);
                   3634:       if (scb_index > p->scb_data->numscbs)
                   3635:       {
                   3636:         printk(WARN_LEAD "Disconnected List inconsistency; SCB index=%d, "
                   3637:           "numscbs=%d\n", p->host_no, channel, target, lun, scb_index,
                   3638:           p->scb_data->numscbs);
                   3639:         next = aic7xxx_rem_scb_from_disc_list(p, next);
                   3640:       }
                   3641:       else
                   3642:       {
                   3643:         scbp = p->scb_data->scb_array[scb_index];
                   3644:         if (aic7xxx_match_scb(p, scbp, target, channel, lun, tag))
                   3645:         {
                   3646:           next = aic7xxx_rem_scb_from_disc_list(p, next);
                   3647:           if (scbp->flags & SCB_WAITINGQ)
                   3648:           {
                   3649:             p->dev_active_cmds[TARGET_INDEX(scbp->cmd)]++;
                   3650:             p->activescbs++;
                   3651:           }
                   3652:           scbp->flags &= ~(SCB_ACTIVE | SCB_WAITINGQ);
                   3653:           scbp->flags |= SCB_RESET | SCB_QUEUED_FOR_DONE;
                   3654:           scbp->hscb->control = 0;
                   3655:         }
                   3656:         else
                   3657:         {
                   3658:           prev = next;
                   3659:           next = aic_inb(p, SCB_NEXT);
                   3660:         }
                   3661:       }
                   3662:     }
                   3663:     if ( j > (p->scb_data->maxscbs + 1) )
                   3664:     {
                   3665:       printk(WARN_LEAD "Yikes!!  There is a loop in the disconnected list!\n",
                   3666:         p->host_no, channel, target, lun);
                   3667:       init_lists = TRUE;
                   3668:     }
                   3669:   }
                   3670: 
                   3671:   /*
                   3672:    * Walk the free list making sure no entries on the free list have
                   3673:    * a valid SCB_TAG value or SCB_CONTROL byte.
                   3674:    */
                   3675:   if (p->features & AHC_PAGESCBS)
                   3676:   {
                   3677:     unsigned char next;
                   3678: 
                   3679:     j = 0;
                   3680:     next = aic_inb(p, FREE_SCBH);
                   3681:     if ( (next >= p->scb_data->maxhscbs) && (next != SCB_LIST_NULL) )
                   3682:     {
                   3683:       printk(WARN_LEAD "Bogus FREE_SCBH!.\n", p->host_no, channel,
                   3684:         target, lun);
                   3685:       init_lists = TRUE;
                   3686:       next = SCB_LIST_NULL;
                   3687:     }
                   3688:     while ( (next != SCB_LIST_NULL) && (j++ <= (p->scb_data->maxscbs + 1)) )
                   3689:     {
                   3690:       aic_outb(p, next, SCBPTR);
                   3691:       if (aic_inb(p, SCB_TAG) < p->scb_data->numscbs)
                   3692:       {
                   3693:         printk(WARN_LEAD "Free list inconsistency!.\n", p->host_no, channel,
                   3694:           target, lun);
                   3695:         init_lists = TRUE;
                   3696:         next = SCB_LIST_NULL;
                   3697:       }
                   3698:       else
                   3699:       {
                   3700:         aic_outb(p, SCB_LIST_NULL, SCB_TAG);
                   3701:         aic_outb(p, 0, SCB_CONTROL);
                   3702:         next = aic_inb(p, SCB_NEXT);
                   3703:       }
                   3704:     }
                   3705:     if ( j > (p->scb_data->maxscbs + 1) )
                   3706:     {
                   3707:       printk(WARN_LEAD "Yikes!!  There is a loop in the free list!\n",
                   3708:         p->host_no, channel, target, lun);
                   3709:       init_lists = TRUE;
                   3710:     }
                   3711:   }
                   3712: 
                   3713:   /*
                   3714:    * Go through the hardware SCB array looking for commands that
                   3715:    * were active but not on any list.
                   3716:    */
                   3717:   if (init_lists)
                   3718:   {
                   3719:     aic_outb(p, SCB_LIST_NULL, FREE_SCBH);
                   3720:     aic_outb(p, SCB_LIST_NULL, WAITING_SCBH);
                   3721:     aic_outb(p, SCB_LIST_NULL, DISCONNECTED_SCBH);
                   3722:   }
                   3723:   for (i = p->scb_data->maxhscbs - 1; i >= 0; i--)
                   3724:   {
                   3725:     unsigned char scbid;
                   3726: 
                   3727:     aic_outb(p, i, SCBPTR);
                   3728:     if (init_lists)
                   3729:     {
                   3730:       aic_outb(p, SCB_LIST_NULL, SCB_TAG);
                   3731:       aic_outb(p, SCB_LIST_NULL, SCB_NEXT);
                   3732:       aic_outb(p, SCB_LIST_NULL, SCB_PREV);
                   3733:       aic_outb(p, 0, SCB_CONTROL);
                   3734:       aic7xxx_add_curscb_to_free_list(p);
                   3735:     }
                   3736:     else
                   3737:     {
                   3738:       scbid = aic_inb(p, SCB_TAG);
                   3739:       if (scbid < p->scb_data->numscbs)
                   3740:       {
                   3741:         scbp = p->scb_data->scb_array[scbid];
                   3742:         if (aic7xxx_match_scb(p, scbp, target, channel, lun, tag))
                   3743:         {
                   3744:           aic_outb(p, 0, SCB_CONTROL);
                   3745:           aic_outb(p, SCB_LIST_NULL, SCB_TAG);
                   3746:           aic7xxx_add_curscb_to_free_list(p);
                   3747:         }
                   3748:       }
                   3749:     }
                   3750:   }
                   3751: 
                   3752:   /*
                   3753:    * Go through the entire SCB array now and look for commands for
                   3754:    * for this target that are stillactive.  These are other (most likely
                   3755:    * tagged) commands that were disconnected when the reset occurred.
                   3756:    * Any commands we find here we know this about, it wasn't on any queue,
                   3757:    * it wasn't in the qinfifo, it wasn't in the disconnected or waiting
                   3758:    * lists, so it really must have been a paged out SCB.  In that case,
                   3759:    * we shouldn't need to bother with updating any counters, just mark
                   3760:    * the correct flags and go on.
                   3761:    */
                   3762:   for (i = 0; i < p->scb_data->numscbs; i++)
                   3763:   {
                   3764:     scbp = p->scb_data->scb_array[i];
                   3765:     if ((scbp->flags & SCB_ACTIVE) &&
                   3766:         aic7xxx_match_scb(p, scbp, target, channel, lun, tag) &&
                   3767:         !aic7xxx_scb_on_qoutfifo(p, scbp))
                   3768:     {
                   3769:       if (scbp->flags & SCB_WAITINGQ)
                   3770:       {
                   3771:         scbq_remove(&p->waiting_scbs, scbp);
                   3772:         scbq_remove(&p->delayed_scbs[TARGET_INDEX(scbp->cmd)], scbp);
                   3773:         p->dev_active_cmds[TARGET_INDEX(scbp->cmd)]++;
                   3774:         p->activescbs++;
                   3775:       }
                   3776:       scbp->flags |= SCB_RESET | SCB_QUEUED_FOR_DONE;
                   3777:       scbp->flags &= ~(SCB_ACTIVE | SCB_WAITINGQ);
                   3778:     }
                   3779:   }
                   3780: 
                   3781:   aic_outb(p, active_scb, SCBPTR);
                   3782: }
                   3783: 
                   3784: 
                   3785: /*+F*************************************************************************
                   3786:  * Function:
                   3787:  *   aic7xxx_clear_intstat
                   3788:  *
                   3789:  * Description:
                   3790:  *   Clears the interrupt status.
                   3791:  *-F*************************************************************************/
                   3792: static void
                   3793: aic7xxx_clear_intstat(struct aic7xxx_host *p)
                   3794: {
                   3795:   /* Clear any interrupt conditions this may have caused. */
                   3796:   aic_outb(p, CLRSELDO | CLRSELDI | CLRSELINGO, CLRSINT0);
                   3797:   aic_outb(p, CLRSELTIMEO | CLRATNO | CLRSCSIRSTI | CLRBUSFREE | CLRSCSIPERR |
                   3798:        CLRPHASECHG | CLRREQINIT, CLRSINT1);
                   3799:   aic_outb(p, CLRSCSIINT | CLRSEQINT | CLRBRKADRINT | CLRPARERR, CLRINT);
                   3800: }
                   3801: 
                   3802: /*+F*************************************************************************
                   3803:  * Function:
                   3804:  *   aic7xxx_reset_current_bus
                   3805:  *
                   3806:  * Description:
                   3807:  *   Reset the current SCSI bus.
                   3808:  *-F*************************************************************************/
                   3809: static void
                   3810: aic7xxx_reset_current_bus(struct aic7xxx_host *p)
                   3811: {
                   3812: 
                   3813:   /* Disable reset interrupts. */
                   3814:   aic_outb(p, aic_inb(p, SIMODE1) & ~ENSCSIRST, SIMODE1);
                   3815: 
                   3816:   /* Turn off the bus' current operations, after all, we shouldn't have any
                   3817:    * valid commands left to cause a RSELI and SELO once we've tossed the
                   3818:    * bus away with this reset, so we might as well shut down the sequencer
                   3819:    * until the bus is restarted as oppossed to saving the current settings
                   3820:    * and restoring them (which makes no sense to me). */
                   3821: 
                   3822:   /* Turn on the bus reset. */
                   3823:   aic_outb(p, aic_inb(p, SCSISEQ) | SCSIRSTO, SCSISEQ);
                   3824:   while ( (aic_inb(p, SCSISEQ) & SCSIRSTO) == 0)
                   3825:     mdelay(5);
                   3826: 
                   3827:   mdelay(10);
                   3828: 
                   3829:   /* Turn off the bus reset. */
                   3830:   aic_outb(p, 0, SCSISEQ);
                   3831:   mdelay(5);
                   3832: 
                   3833:   aic7xxx_clear_intstat(p);
                   3834:   /* Re-enable reset interrupts. */
                   3835:   aic_outb(p, aic_inb(p, SIMODE1) | ENSCSIRST, SIMODE1);
                   3836: 
                   3837: }
                   3838: 
                   3839: /*+F*************************************************************************
                   3840:  * Function:
                   3841:  *   aic7xxx_reset_channel
                   3842:  *
                   3843:  * Description:
                   3844:  *   Reset the channel.
                   3845:  *-F*************************************************************************/
                   3846: static void
                   3847: aic7xxx_reset_channel(struct aic7xxx_host *p, int channel, int initiate_reset)
                   3848: {
                   3849:   unsigned long offset_min, offset_max;
                   3850:   unsigned char sblkctl;
                   3851:   int cur_channel;
                   3852: 
                   3853:   if (aic7xxx_verbose & VERBOSE_RESET_PROCESS)
                   3854:     printk(INFO_LEAD "Reset channel called, %s initiate reset.\n",
                   3855:       p->host_no, channel, -1, -1, (initiate_reset==TRUE) ? "will" : "won't" );
                   3856: 
                   3857: 
                   3858:   if (channel == 1)
                   3859:   {
                   3860:     p->needsdtr |= (p->needsdtr_copy & 0xFF00);
                   3861:     p->sdtr_pending &= 0x00FF;
                   3862:     offset_min = 8;
                   3863:     offset_max = 16;
                   3864:   }
                   3865:   else
                   3866:   {
                   3867:     if (p->features & AHC_WIDE)
                   3868:     {
                   3869:       p->needsdtr = p->needsdtr_copy;
                   3870:       p->needwdtr = p->needwdtr_copy;
                   3871:       p->sdtr_pending = 0x0;
                   3872:       p->wdtr_pending = 0x0;
                   3873:       offset_min = 0;
                   3874:       offset_max = 16;
                   3875:     }
                   3876:     else
                   3877:     {
                   3878:       /* Channel A */
                   3879:       p->needsdtr |= (p->needsdtr_copy & 0x00FF);
                   3880:       p->sdtr_pending &= 0xFF00;
                   3881:       offset_min = 0;
                   3882:       offset_max = 8;
                   3883:     }
                   3884:   }
                   3885: 
                   3886:   while (offset_min < offset_max)
                   3887:   {
                   3888:     /*
                   3889:      * Revert to async/narrow transfers until we renegotiate.
                   3890:      */
                   3891:     aic_outb(p, 0, TARG_SCSIRATE + offset_min);
                   3892:     if (p->features & AHC_ULTRA2)
                   3893:     {
                   3894:       aic_outb(p, 0, TARG_OFFSET + offset_min);
                   3895:     }
                   3896:     offset_min++;
                   3897:   }
                   3898: 
                   3899:   /*
                   3900:    * Reset the bus and unpause/restart the controller
                   3901:    */
                   3902:   sblkctl = aic_inb(p, SBLKCTL);
                   3903:   if ( (p->chip & AHC_CHIPID_MASK) == AHC_AIC7770 )
                   3904:     cur_channel = (sblkctl & SELBUSB) >> 3;
                   3905:   else
                   3906:     cur_channel = 0;
                   3907:   if ( (cur_channel != channel) && (p->features & AHC_TWIN) )
                   3908:   {
                   3909:     /*
                   3910:      * Case 1: Command for another bus is active
                   3911:      */
                   3912:     if (aic7xxx_verbose & VERBOSE_RESET_PROCESS)
                   3913:       printk(INFO_LEAD "Stealthily resetting idle channel.\n", p->host_no,
                   3914:         channel, -1, -1);
                   3915:     /*
                   3916:      * Stealthily reset the other bus without upsetting the current bus.
                   3917:      */
                   3918:     aic_outb(p, sblkctl ^ SELBUSB, SBLKCTL);
                   3919:     aic_outb(p, aic_inb(p, SIMODE1) & ~ENBUSFREE, SIMODE1);
                   3920:     if (initiate_reset)
                   3921:     {
                   3922:       aic7xxx_reset_current_bus(p);
                   3923:     }
                   3924:     aic_outb(p, aic_inb(p, SCSISEQ) & (ENSELI|ENRSELI|ENAUTOATNP), SCSISEQ);
                   3925:     aic7xxx_clear_intstat(p);
                   3926:     aic_outb(p, sblkctl, SBLKCTL);
                   3927:   }
                   3928:   else
                   3929:   {
                   3930:     /*
                   3931:      * Case 2: A command from this bus is active or we're idle.
                   3932:      */
                   3933:     if (aic7xxx_verbose & VERBOSE_RESET_PROCESS)
                   3934:       printk(INFO_LEAD "Resetting currently active channel.\n", p->host_no,
                   3935:         channel, -1, -1);
                   3936:     aic_outb(p, aic_inb(p, SIMODE1) & ~(ENBUSFREE|ENREQINIT),
                   3937:       SIMODE1);
                   3938:     p->flags &= ~AHC_HANDLING_REQINITS;
                   3939:     p->msg_type = MSG_TYPE_NONE;
                   3940:     p->msg_len = 0;
                   3941:     if (initiate_reset)
                   3942:     {
                   3943:       aic7xxx_reset_current_bus(p);
                   3944:     }
                   3945:     aic_outb(p, aic_inb(p, SCSISEQ) & (ENSELI|ENRSELI|ENAUTOATNP), SCSISEQ);
                   3946:     aic7xxx_clear_intstat(p);
                   3947:   }
                   3948:   if (aic7xxx_verbose & VERBOSE_RESET_RETURN)
                   3949:     printk(INFO_LEAD "Channel reset\n", p->host_no, channel, -1, -1);
                   3950:   /*
                   3951:    * Clean up all the state information for the pending transactions
                   3952:    * on this bus.
                   3953:    */
                   3954:   aic7xxx_reset_device(p, ALL_TARGETS, channel, ALL_LUNS, SCB_LIST_NULL);
                   3955: 
                   3956:   /*
                   3957:    * Convince Mid Level SCSI code to leave us be for a little bit...
                   3958:    */
                   3959:   p->last_reset = jiffies;
                   3960:   p->host->last_reset = (jiffies + (HZ * AIC7XXX_RESET_DELAY));
                   3961: 
                   3962:   if ( !(p->features & AHC_TWIN) )
                   3963:   {
                   3964:     restart_sequencer(p);
                   3965:   }
                   3966: 
                   3967:   return;
                   3968: }
                   3969: 
                   3970: /*+F*************************************************************************
                   3971:  * Function:
                   3972:  *   aic7xxx_run_waiting_queues
                   3973:  *
                   3974:  * Description:
                   3975:  *   Scan the awaiting_scbs queue downloading and starting as many
                   3976:  *   scbs as we can.
                   3977:  *-F*************************************************************************/
                   3978: static void
                   3979: aic7xxx_run_waiting_queues(struct aic7xxx_host *p)
                   3980: {
                   3981:   struct aic7xxx_scb *scb;
                   3982:   int tindex;
                   3983:   int sent;
                   3984: #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95)
                   3985:   unsigned long cpu_flags = 0;
                   3986: #endif
                   3987: 
                   3988: 
                   3989:   if (p->waiting_scbs.head == NULL)
                   3990:     return;
                   3991: 
                   3992:   sent = 0;
                   3993: 
                   3994:   /*
                   3995:    * First handle SCBs that are waiting but have been assigned a slot.
                   3996:    */
                   3997:   DRIVER_LOCK
                   3998:   while ((scb = scbq_remove_head(&p->waiting_scbs)) != NULL)
                   3999:   {
                   4000:     tindex = TARGET_INDEX(scb->cmd);
                   4001:     if ( !scb->tag_action && (p->tagenable & (1<<tindex)) )
                   4002:     {
                   4003: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   4004:       if (aic7xxx_verbose > 0xffff)
                   4005:         printk(INFO_LEAD "Reducing Queue depth for untagged command.\n",
                   4006:                p->host_no, CTL_OF_SCB(scb));
                   4007: #endif
                   4008:       p->dev_temp_queue_depth[tindex] = 1;
                   4009:     }
                   4010:     if ( (p->dev_active_cmds[tindex] >=
                   4011:           p->dev_temp_queue_depth[tindex]) ||
                   4012:          (p->dev_last_reset[tindex] >= (jiffies - (4 * HZ))) )
                   4013:     {
                   4014: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   4015:       if (aic7xxx_verbose > 0xffff)
                   4016:         printk(INFO_LEAD "Moving SCB to Delayed Queue.\n",
                   4017:                p->host_no, CTL_OF_SCB(scb));
                   4018: #endif
                   4019:       scbq_insert_tail(&p->delayed_scbs[tindex], scb);
                   4020:       if ( !(p->dev_timer[tindex].expires) &&
                   4021:            !(p->dev_active_cmds[tindex]) )
                   4022:       {
                   4023:         p->dev_timer[tindex].expires = p->dev_last_reset[tindex] + (4 * HZ);
                   4024:         add_timer(&p->dev_timer[tindex]);
                   4025:       }
                   4026:     }
                   4027:     else
                   4028:     {
                   4029:         scb->flags &= ~SCB_WAITINGQ;
                   4030: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   4031:         if (aic7xxx_verbose > 0xffff)
                   4032:           printk(INFO_LEAD "Sending command %d/0x%x to QINFIFO\n", p->host_no,
                   4033:                  CTL_OF_SCB(scb), scb->hscb->tag, scb->flags);
                   4034: #endif
                   4035:         p->dev_active_cmds[tindex]++;
                   4036:         p->activescbs++;
                   4037:         if ( !(scb->tag_action) )
                   4038:         {
                   4039:           aic7xxx_busy_target(p, scb);
                   4040:         }
                   4041:         p->qinfifo[p->qinfifonext++] = scb->hscb->tag;
                   4042:         sent++;
                   4043:     }
                   4044:   }
                   4045:   if (sent)
                   4046:   {
                   4047: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   4048:     if (aic7xxx_verbose > 0xffff)
                   4049:     {
                   4050:       printk(INFO_LEAD "Sending commands to QINFIFO\n", p->host_no,
                   4051:              -1, -1, -1);
                   4052:       if ( (p->isr_count < 16) && (aic7xxx_panic_on_abort) &&
                   4053:            (p->flags & AHC_PAGESCBS) )
                   4054:         aic7xxx_check_scbs(p, "While sending commands to QINFIFO");
                   4055:     }
                   4056: #endif
                   4057:     if (p->features & AHC_QUEUE_REGS)
                   4058:       aic_outb(p, p->qinfifonext, HNSCB_QOFF);
                   4059:     else
                   4060:     {
                   4061:       pause_sequencer(p);
                   4062:       aic_outb(p, p->qinfifonext, KERNEL_QINPOS);
                   4063:       unpause_sequencer(p, FALSE);
                   4064:     }
                   4065:     if (p->activescbs > p->max_activescbs)
                   4066:       p->max_activescbs = p->activescbs;
                   4067:   }
                   4068:   DRIVER_UNLOCK
                   4069: }
                   4070: 
                   4071: #ifdef CONFIG_PCI
                   4072: 
                   4073: #define  DPE 0x80
                   4074: #define  SSE 0x40
                   4075: #define  RMA 0x20
                   4076: #define  RTA 0x10
                   4077: #define  STA 0x08
                   4078: #define  DPR 0x01
                   4079: 
                   4080: /*+F*************************************************************************
                   4081:  * Function:
                   4082:  *   aic7xxx_pci_intr
                   4083:  *
                   4084:  * Description:
                   4085:  *   Check the scsi card for PCI errors and clear the interrupt
                   4086:  *
                   4087:  *   NOTE: If you don't have this function and a 2940 card encounters
                   4088:  *         a PCI error condition, the machine will end up locked as the
                   4089:  *         interrupt handler gets slammed with non-stop PCI error interrupts
                   4090:  *-F*************************************************************************/
                   4091: static void
                   4092: aic7xxx_pci_intr(struct aic7xxx_host *p)
                   4093: {
                   4094:   unsigned char status1;
                   4095: 
                   4096: #if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,92)
                   4097:   pci_read_config_byte(p->pdev, PCI_STATUS + 1, &status1);
                   4098: #else
                   4099:   pcibios_read_config_byte(p->pci_bus, p->pci_device_fn,
                   4100:                            PCI_STATUS + 1, &status1);
                   4101: #endif
                   4102: 
                   4103:   if ( (status1 & DPE) && (aic7xxx_verbose & VERBOSE_MINOR_ERROR) )
                   4104:     printk(WARN_LEAD "Data Parity Error during PCI address or PCI write"
                   4105:       "phase.\n", p->host_no, -1, -1, -1);
                   4106:   if ( (status1 & SSE) && (aic7xxx_verbose & VERBOSE_MINOR_ERROR) )
                   4107:     printk(WARN_LEAD "Signal System Error Detected\n", p->host_no,
                   4108:       -1, -1, -1);
                   4109:   if ( (status1 & RMA) && (aic7xxx_verbose & VERBOSE_MINOR_ERROR) )
                   4110:     printk(WARN_LEAD "Received a PCI Master Abort\n", p->host_no,
                   4111:       -1, -1, -1);
                   4112:   if ( (status1 & RTA) && (aic7xxx_verbose & VERBOSE_MINOR_ERROR) )
                   4113:     printk(WARN_LEAD "Received a PCI Target Abort\n", p->host_no,
                   4114:       -1, -1, -1);
                   4115:   if ( (status1 & STA) && (aic7xxx_verbose & VERBOSE_MINOR_ERROR) )
                   4116:     printk(WARN_LEAD "Signaled a PCI Target Abort\n", p->host_no,
                   4117:       -1, -1, -1);
                   4118:   if ( (status1 & DPR) && (aic7xxx_verbose & VERBOSE_MINOR_ERROR) )
                   4119:     printk(WARN_LEAD "Data Parity Error has been reported via PCI pin "
                   4120:       "PERR#\n", p->host_no, -1, -1, -1);
                   4121:   
                   4122: #if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,92)
                   4123:   pci_write_config_byte(p->pdev, PCI_STATUS + 1, status1);
                   4124: #else
                   4125:   pcibios_write_config_byte(p->pci_bus, p->pci_device_fn,
                   4126:                             PCI_STATUS + 1, status1);
                   4127: #endif
                   4128:   if (status1 & (DPR|RMA|RTA))
                   4129:     aic_outb(p,  CLRPARERR, CLRINT);
                   4130: 
                   4131:   if ( (aic7xxx_panic_on_abort) && (p->spurious_int > 500) )
                   4132:     aic7xxx_panic_abort(p, NULL);
                   4133: 
                   4134: }
                   4135: #endif /* CONFIG_PCI */
                   4136: 
                   4137: /*+F*************************************************************************
                   4138:  * Function:
                   4139:  *   aic7xxx_timer
                   4140:  *
                   4141:  * Description:
                   4142:  *   Take expired extries off of delayed queues and place on waiting queue
                   4143:  *   then run waiting queue to start commands.
                   4144:  ***************************************************************************/
                   4145: static void
                   4146: aic7xxx_timer(struct aic7xxx_host *p)
                   4147: {
                   4148:   int i, j;
                   4149:   unsigned long cpu_flags = 0;
                   4150:   struct aic7xxx_scb *scb;
                   4151: 
                   4152: #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95)   
                   4153:   DRIVER_LOCK
                   4154: #else
                   4155:   spin_lock_irqsave(&io_request_lock, cpu_flags);
                   4156: #endif
                   4157:   for(i=0; i<MAX_TARGETS; i++)
                   4158:   {
                   4159:     if ( (p->dev_timer[i].expires) && 
                   4160:           (p->dev_timer[i].expires <= jiffies) )
                   4161:     {
                   4162:       p->dev_timer[i].expires = 0;
                   4163:       if ( (p->dev_timer[i].prev != NULL) ||
                   4164:            (p->dev_timer[i].next != NULL) )
                   4165:       {
                   4166:         del_timer(&p->dev_timer[i]);
                   4167:       }
                   4168:       p->dev_temp_queue_depth[i] =  p->dev_max_queue_depth[i];
                   4169:       j = 0;
                   4170:       while ( ((scb = scbq_remove_head(&p->delayed_scbs[i])) != NULL) &&
                   4171:               (j++ < p->scb_data->numscbs) )
                   4172:       {
                   4173:         scbq_insert_tail(&p->waiting_scbs, scb);
                   4174:       }
                   4175:       if (j == p->scb_data->numscbs)
                   4176:       {
                   4177:         printk(INFO_LEAD "timer: Yikes, loop in delayed_scbs list.\n",
                   4178:           p->host_no, 0, i, -1);
                   4179:         scbq_init(&p->delayed_scbs[i]);
                   4180:         scbq_init(&p->waiting_scbs);
                   4181:         /*
                   4182:          * Well, things are screwed now, wait for a reset to clean the junk
                   4183:          * out.
                   4184:          */
                   4185:       }
                   4186:     }
                   4187:   }
                   4188:   aic7xxx_run_waiting_queues(p);
                   4189: #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95)   
                   4190:   DRIVER_UNLOCK
                   4191: #else
                   4192:   spin_unlock_irqrestore(&io_request_lock, cpu_flags);
                   4193: #endif
                   4194: }
                   4195: 
                   4196: /*+F*************************************************************************
                   4197:  * Function:
                   4198:  *   aic7xxx_construct_sdtr
                   4199:  *
                   4200:  * Description:
                   4201:  *   Constucts a synchronous data transfer message in the message
                   4202:  *   buffer on the sequencer.
                   4203:  *-F*************************************************************************/
                   4204: static void
                   4205: aic7xxx_construct_sdtr(struct aic7xxx_host *p, unsigned char period,
                   4206:         unsigned char offset)
                   4207: {
                   4208:   p->msg_buf[p->msg_index++] = MSG_EXTENDED;
                   4209:   p->msg_buf[p->msg_index++] = MSG_EXT_SDTR_LEN;
                   4210:   p->msg_buf[p->msg_index++] = MSG_EXT_SDTR;
                   4211:   p->msg_buf[p->msg_index++] = period;
                   4212:   p->msg_buf[p->msg_index++] = offset;
                   4213:   p->msg_len += 5;
                   4214: }
                   4215: 
                   4216: /*+F*************************************************************************
                   4217:  * Function:
                   4218:  *   aic7xxx_construct_wdtr
                   4219:  *
                   4220:  * Description:
                   4221:  *   Constucts a wide data transfer message in the message buffer
                   4222:  *   on the sequencer.
                   4223:  *-F*************************************************************************/
                   4224: static void
                   4225: aic7xxx_construct_wdtr(struct aic7xxx_host *p, unsigned char bus_width)
                   4226: {
                   4227:   p->msg_buf[p->msg_index++] = MSG_EXTENDED;
                   4228:   p->msg_buf[p->msg_index++] = MSG_EXT_WDTR_LEN;
                   4229:   p->msg_buf[p->msg_index++] = MSG_EXT_WDTR;
                   4230:   p->msg_buf[p->msg_index++] = bus_width;
                   4231:   p->msg_len += 4;
                   4232: }
                   4233: 
                   4234: /*+F*************************************************************************
                   4235:  * Function:
                   4236:  *   aic7xxx_calc_residual
                   4237:  *
                   4238:  * Description:
                   4239:  *   Calculate the residual data not yet transferred.
                   4240:  *-F*************************************************************************/
                   4241: static void
                   4242: aic7xxx_calculate_residual (struct aic7xxx_host *p, struct aic7xxx_scb *scb)
                   4243: {
                   4244:   struct aic7xxx_hwscb *hscb;
                   4245:   Scsi_Cmnd *cmd;
                   4246:   int actual, i;
                   4247: 
                   4248:   cmd = scb->cmd;
                   4249:   hscb = scb->hscb;
                   4250: 
                   4251:   /*
                   4252:    *  Don't destroy valid residual information with
                   4253:    *  residual coming from a check sense operation.
                   4254:    */
                   4255:   if (((scb->hscb->control & DISCONNECTED) == 0) &&
                   4256:       (scb->flags & SCB_SENSE) == 0)
                   4257:   {
                   4258:     /*
                   4259:      *  We had an underflow. At this time, there's only
                   4260:      *  one other driver that bothers to check for this,
                   4261:      *  and cmd->underflow seems to be set rather half-
                   4262:      *  heartedly in the higher-level SCSI code.
                   4263:      */
                   4264:     actual = scb->sg_length;
                   4265:     for (i=1; i < hscb->residual_SG_segment_count; i++)
                   4266:     {
                   4267:       actual -= scb->sg_list[scb->sg_count - i].length;
                   4268:     }
                   4269:     actual -= (hscb->residual_data_count[2] << 16) |
                   4270:               (hscb->residual_data_count[1] <<  8) |
                   4271:               hscb->residual_data_count[0];
                   4272: 
                   4273:     if (actual < cmd->underflow)
                   4274:     {
                   4275:       if (aic7xxx_verbose & VERBOSE_MINOR_ERROR)
                   4276:         printk(INFO_LEAD "Underflow - Wanted %u, %s %u, residual SG "
                   4277:           "count %d.\n", p->host_no, CTL_OF_SCB(scb), cmd->underflow,
                   4278:           (cmd->request.cmd == WRITE) ? "wrote" : "read", actual,
                   4279:           hscb->residual_SG_segment_count);
                   4280:       aic7xxx_error(cmd) = DID_RETRY_COMMAND;
                   4281:       aic7xxx_status(cmd) = hscb->target_status;
                   4282:     }
                   4283:   }
                   4284: 
                   4285:   /*
                   4286:    * Clean out the residual information in the SCB for the
                   4287:    * next consumer.
                   4288:    */
                   4289:   hscb->residual_data_count[2] = 0;
                   4290:   hscb->residual_data_count[1] = 0;
                   4291:   hscb->residual_data_count[0] = 0;
                   4292:   hscb->residual_SG_segment_count = 0;
                   4293: }
                   4294: 
                   4295: /*+F*************************************************************************
                   4296:  * Function:
                   4297:  *   aic7xxx_handle_device_reset
                   4298:  *
                   4299:  * Description:
                   4300:  *   Interrupt handler for sequencer interrupts (SEQINT).
                   4301:  *-F*************************************************************************/
                   4302: static void
                   4303: aic7xxx_handle_device_reset(struct aic7xxx_host *p, int target, int channel)
                   4304: {
                   4305:   unsigned short targ_mask;
                   4306:   unsigned char tindex = target;
                   4307: 
                   4308:   tindex |= ((channel & 0x01) << 3);
                   4309: 
                   4310:   targ_mask = (0x01 << tindex);
                   4311:   /*
                   4312:    * Go back to async/narrow transfers and renegotiate.
                   4313:    */
                   4314:   p->needsdtr |= (p->needsdtr_copy & targ_mask);
                   4315:   p->needwdtr |= (p->needwdtr_copy & targ_mask);
                   4316:   p->sdtr_pending &= ~targ_mask;
                   4317:   p->wdtr_pending &= ~targ_mask;
                   4318:   aic_outb(p, 0, TARG_SCSIRATE + tindex);
                   4319:   if (p->features & AHC_ULTRA2)
                   4320:     aic_outb(p, 0, TARG_OFFSET + tindex);
                   4321:   aic7xxx_reset_device(p, target, channel, ALL_LUNS, SCB_LIST_NULL);
                   4322:   if (aic7xxx_verbose & VERBOSE_RESET_PROCESS)
                   4323:     printk(INFO_LEAD "Bus Device Reset delivered.\n", p->host_no, channel,
                   4324:       target, -1);
                   4325:   aic7xxx_run_done_queue(p, /*complete*/ FALSE);
                   4326: }
                   4327: 
                   4328: /*+F*************************************************************************
                   4329:  * Function:
                   4330:  *   aic7xxx_handle_seqint
                   4331:  *
                   4332:  * Description:
                   4333:  *   Interrupt handler for sequencer interrupts (SEQINT).
                   4334:  *-F*************************************************************************/
                   4335: static void
                   4336: aic7xxx_handle_seqint(struct aic7xxx_host *p, unsigned char intstat)
                   4337: {
                   4338:   struct aic7xxx_scb *scb;
                   4339:   unsigned short target_mask;
                   4340:   unsigned char target, lun, tindex;
                   4341:   unsigned char queue_flag = FALSE;
                   4342:   char channel;
                   4343: 
                   4344:   target = ((aic_inb(p, SAVED_TCL) >> 4) & 0x0f);
                   4345:   if ( (p->chip & AHC_CHIPID_MASK) == AHC_AIC7770 )
                   4346:     channel = (aic_inb(p, SBLKCTL) & SELBUSB) >> 3;
                   4347:   else
                   4348:     channel = 0;
                   4349:   tindex = target + (channel << 3);
                   4350:   lun = aic_inb(p, SAVED_TCL) & 0x07;
                   4351:   target_mask = (0x01 << tindex);
                   4352: 
                   4353:   /*
                   4354:    * Go ahead and clear the SEQINT now, that avoids any interrupt race
                   4355:    * conditions later on in case we enable some other interrupt.
                   4356:    */
                   4357:   aic_outb(p, CLRSEQINT, CLRINT);
                   4358:   switch (intstat & SEQINT_MASK)
                   4359:   {
                   4360:     case NO_MATCH:
                   4361:       {
                   4362:         aic_outb(p, aic_inb(p, SCSISEQ) & (ENSELI|ENRSELI|ENAUTOATNP),
                   4363:                  SCSISEQ);
                   4364:         printk(WARN_LEAD "No active SCB for reconnecting target - Issuing "
                   4365:                "BUS DEVICE RESET.\n", p->host_no, channel, target, lun);
                   4366:         printk(WARN_LEAD "      SAVED_TCL=0x%x, ARG_1=0x%x, SEQADDR=0x%x\n",
                   4367:                p->host_no, channel, target, lun,
                   4368:                aic_inb(p, SAVED_TCL), aic_inb(p, ARG_1),
                   4369:                (aic_inb(p, SEQADDR1) << 8) | aic_inb(p, SEQADDR0));
                   4370:       }
                   4371:       break;
                   4372: 
                   4373:     case SEND_REJECT:
                   4374:       {
                   4375:         if (aic7xxx_verbose & VERBOSE_MINOR_ERROR)
                   4376:           printk(INFO_LEAD "Rejecting unknown message (0x%x) received from "
                   4377:             "target, SEQ_FLAGS=0x%x\n", p->host_no, channel, target, lun,
                   4378:             aic_inb(p, ACCUM), aic_inb(p, SEQ_FLAGS));
                   4379:       }
                   4380:       break;
                   4381: 
                   4382:     case NO_IDENT:
                   4383:       {
                   4384:         /*
                   4385:          * The reconnecting target either did not send an identify
                   4386:          * message, or did, but we didn't find an SCB to match and
                   4387:          * before it could respond to our ATN/abort, it hit a dataphase.
                   4388:          * The only safe thing to do is to blow it away with a bus
                   4389:          * reset.
                   4390:          */
                   4391:         if (aic7xxx_verbose & (VERBOSE_SEQINT | VERBOSE_RESET_MID))
                   4392:           printk(INFO_LEAD "Target did not send an IDENTIFY message; "
                   4393:             "LASTPHASE 0x%x, SAVED_TCL 0x%x\n", p->host_no, channel, target,
                   4394:             lun, aic_inb(p, LASTPHASE), aic_inb(p, SAVED_TCL));
                   4395: 
                   4396:         aic7xxx_reset_channel(p, channel, /*initiate reset*/ TRUE);
                   4397:         aic7xxx_run_done_queue(p, FALSE);
                   4398: 
                   4399:       }
                   4400:       break;
                   4401: 
                   4402:     case BAD_PHASE:
                   4403:       if (aic_inb(p, LASTPHASE) == P_BUSFREE)
                   4404:       {
                   4405:         if (aic7xxx_verbose & VERBOSE_SEQINT)
                   4406:           printk(INFO_LEAD "Missed busfree.\n", p->host_no, channel,
                   4407:             target, lun);
                   4408:         restart_sequencer(p);
                   4409:       }
                   4410:       else
                   4411:       {
                   4412:         if (aic7xxx_verbose & VERBOSE_SEQINT)
                   4413:           printk(INFO_LEAD "Unknown scsi bus phase, continuing\n", p->host_no,
                   4414:             channel, target, lun);
                   4415:       }
                   4416:       break;
                   4417: 
                   4418:     case EXTENDED_MSG:
                   4419:       {
                   4420:         p->msg_type = MSG_TYPE_INITIATOR_MSGIN;
                   4421:         p->msg_len = 0;
                   4422:         p->msg_index = 0;
                   4423: 
                   4424: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   4425:         if (aic7xxx_verbose > 0xffff)
                   4426:           printk(INFO_LEAD "Enabling REQINITs for MSG_IN\n", p->host_no,
                   4427:                  channel, target, lun);
                   4428: #endif
                   4429: 
                   4430:        /*      
                   4431:         * To actually receive the message, simply turn on
                   4432:         * REQINIT interrupts and let our interrupt handler
                   4433:         * do the rest (REQINIT should already be true).
                   4434:         */
                   4435:         p->flags |= AHC_HANDLING_REQINITS;
                   4436:         aic_outb(p, aic_inb(p, SIMODE1) | ENREQINIT, SIMODE1);
                   4437: 
                   4438:        /*
                   4439:         * We don't want the sequencer unpaused yet so we return early
                   4440:         */
                   4441:         return;
                   4442:       }
                   4443: 
                   4444:     case REJECT_MSG:
                   4445:       {
                   4446:         /*
                   4447:          * What we care about here is if we had an outstanding SDTR
                   4448:          * or WDTR message for this target. If we did, this is a
                   4449:          * signal that the target is refusing negotiation.
                   4450:          */
                   4451:         unsigned char scb_index;
                   4452:         unsigned char last_msg;
                   4453: 
                   4454:         scb_index = aic_inb(p, SCB_TAG);
                   4455:         scb = p->scb_data->scb_array[scb_index];
                   4456:         last_msg = aic_inb(p, LAST_MSG);
                   4457: 
                   4458:         if ( (last_msg == MSG_IDENTIFYFLAG) &&
                   4459:              (scb->tag_action) &&
                   4460:             !(scb->flags & SCB_MSGOUT_BITS) )
                   4461:         {
                   4462:           if ((scb->tag_action == MSG_ORDERED_Q_TAG) &&
                   4463:               (p->dev_flags[tindex] & DEVICE_TAGGED_SUCCESS))
                   4464:           {
                   4465:             /*
                   4466:              * OK...the device seems able to accept tagged commands, but
                   4467:              * not ordered tag commands, only simple tag commands.  So, we
                   4468:              * disable ordered tag commands and go on with life just like
                   4469:              * normal.
                   4470:              */
                   4471:             p->orderedtag &= ~target_mask;
                   4472:             scb->tag_action = MSG_SIMPLE_Q_TAG;
                   4473:             scb->hscb->control &= ~SCB_TAG_TYPE;
                   4474:             scb->hscb->control |= MSG_SIMPLE_Q_TAG;
                   4475:             aic_outb(p, scb->hscb->control, SCB_CONTROL);
                   4476:             /*
                   4477:              * OK..we set the tag type to simple tag command, now we re-assert
                   4478:              * ATNO and hope this will take us into the identify phase again
                   4479:              * so we can resend the tag type and info to the device.
                   4480:              */
                   4481:             aic_outb(p, MSG_IDENTIFYFLAG, MSG_OUT);
                   4482:             aic_outb(p, aic_inb(p, SCSISIGI) | ATNO, SCSISIGO);
                   4483:           }
                   4484:           else if ( (scb->tag_action == MSG_SIMPLE_Q_TAG) &&
                   4485:                    !(p->dev_flags[tindex] & DEVICE_TAGGED_SUCCESS) )
                   4486:           {
                   4487:             unsigned char i, reset = 0;
                   4488:             struct aic7xxx_scb *scbp;
                   4489:             int old_verbose;
                   4490:             /*
                   4491:              * Hmmmm....the device is flaking out on tagged commands.  The
                   4492:              * bad thing is that we already have tagged commands enabled in
                   4493:              * the device struct in the mid level code.  We also have a queue
                   4494:              * set according to the tagged queue depth.  Gonna have to live
                   4495:              * with it by controlling our queue depth internally and making
                   4496:              * sure we don't set the tagged command flag any more.
                   4497:              */
                   4498:             p->tagenable &= ~target_mask;
                   4499:             p->orderedtag &= ~target_mask;
                   4500:             p->dev_max_queue_depth[tindex] =
                   4501:                p->dev_temp_queue_depth[tindex] = 1;
                   4502:             /*
                   4503:              * We set this command up as a bus device reset.  However, we have
                   4504:              * to clear the tag type as it's causing us problems.  We shouldnt
                   4505:              * have to worry about any other commands being active, since if
                   4506:              * the device is refusing tagged commands, this should be the
                   4507:              * first tagged command sent to the device, however, we do have
                   4508:              * to worry about any other tagged commands that may already be
                   4509:              * in the qinfifo.  The easiest way to do this, is to issue a BDR,
                   4510:              * send all the commands back to the mid level code, then let them
                   4511:              * come back and get rebuilt as untagged commands.
                   4512:              */
                   4513:             scb->tag_action = 0;
                   4514:             scb->hscb->control &= ~(TAG_ENB | SCB_TAG_TYPE);
                   4515:             aic_outb(p,  scb->hscb->control, SCB_CONTROL);
                   4516: 
                   4517:             old_verbose = aic7xxx_verbose;
                   4518:             aic7xxx_verbose &= ~(VERBOSE_RESET|VERBOSE_ABORT);
                   4519:             for (i=0; i!=p->scb_data->numscbs; i++)
                   4520:             {
                   4521:               scbp = p->scb_data->scb_array[i];
                   4522:               if ((scbp->flags & SCB_ACTIVE) && (scbp != scb))
                   4523:               {
                   4524:                 if (aic7xxx_match_scb(p, scbp, target, channel, lun, i))
                   4525:                 {
                   4526:                   aic7xxx_reset_device(p, target, channel, lun, i);
                   4527:                   reset++;
                   4528:                 }
                   4529:                 aic7xxx_run_done_queue(p, FALSE);
                   4530:               }
                   4531:             }
                   4532:             aic7xxx_verbose = old_verbose;
                   4533:             /*
                   4534:              * Wait until after the for loop to set the busy index since
                   4535:              * aic7xxx_reset_device will clear the busy index during its
                   4536:              * operation.
                   4537:              */
                   4538:             aic7xxx_busy_target(p, scb);
                   4539:             printk(INFO_LEAD "Device is refusing tagged commands, using "
                   4540:               "untagged I/O.\n", p->host_no, channel, target, lun);
                   4541:             aic_outb(p, MSG_IDENTIFYFLAG, MSG_OUT);
                   4542:             aic_outb(p, aic_inb(p, SCSISIGI) | ATNO, SCSISIGO);
                   4543:           }
                   4544:         }
                   4545:         else if (scb->flags & SCB_MSGOUT_WDTR)
                   4546:         {
                   4547:           /*
                   4548:            * note 8bit xfers and clear flag
                   4549:            */
                   4550:           p->needwdtr &= ~target_mask;
                   4551:           p->needwdtr_copy &= ~target_mask;
                   4552:           p->wdtr_pending &= ~target_mask;
                   4553:           scb->flags &= ~SCB_MSGOUT_BITS;
                   4554:           aic7xxx_set_width(p, target, channel, lun, MSG_EXT_WDTR_BUS_8_BIT,
                   4555:             (AHC_TRANS_ACTIVE|AHC_TRANS_GOAL|AHC_TRANS_CUR));
                   4556:           aic7xxx_set_syncrate(p, NULL, target, channel, 0, 0,
                   4557:                                AHC_TRANS_ACTIVE|AHC_TRANS_CUR|AHC_TRANS_QUITE);
                   4558:           if ( (p->needsdtr_copy & target_mask) &&
                   4559:                !(p->sdtr_pending & target_mask) )
                   4560:           {
                   4561:             p->sdtr_pending |= target_mask;
                   4562:             scb->flags |= SCB_MSGOUT_SDTR;
                   4563:             aic_outb(p, HOST_MSG, MSG_OUT);
                   4564:             aic_outb(p, aic_inb(p, SCSISIGO) | ATNO, SCSISIGO);
                   4565:           }
                   4566:         }
                   4567:         else if (scb->flags & SCB_MSGOUT_SDTR)
                   4568:         {
                   4569:          /*
                   4570:           * note asynch xfers and clear flag
                   4571:           */
                   4572:           p->needsdtr &= ~target_mask;
                   4573:           p->needsdtr_copy &= ~target_mask;
                   4574:           p->sdtr_pending &= ~target_mask;
                   4575:           scb->flags &= ~SCB_MSGOUT_SDTR;
                   4576:           aic7xxx_set_syncrate(p, NULL, target, channel, 0, 0,
                   4577:             (AHC_TRANS_CUR|AHC_TRANS_ACTIVE|AHC_TRANS_GOAL));
                   4578:         }
                   4579:         else if (aic7xxx_verbose & VERBOSE_SEQINT)
                   4580:         {
                   4581:           /*
                   4582:            * Otherwise, we ignore it.
                   4583:            */
                   4584:           printk(INFO_LEAD "Received MESSAGE_REJECT for unknown cause.  "
                   4585:             "Ignoring.\n", p->host_no, channel, target, lun);
                   4586:         }
                   4587:       }
                   4588:       break;
                   4589: 
                   4590:     case BAD_STATUS:
                   4591:       {
                   4592:         unsigned char scb_index;
                   4593:         struct aic7xxx_hwscb *hscb;
                   4594:         Scsi_Cmnd *cmd;
                   4595: 
                   4596:         /* The sequencer will notify us when a command has an error that
                   4597:          * would be of interest to the kernel.  This allows us to leave
                   4598:          * the sequencer running in the common case of command completes
                   4599:          * without error.  The sequencer will have DMA'd the SCB back
                   4600:          * up to us, so we can reference the drivers SCB array.
                   4601:          *
                   4602:          * Set the default return value to 0 indicating not to send
                   4603:          * sense.  The sense code will change this if needed and this
                   4604:          * reduces code duplication.
                   4605:          */
                   4606:         aic_outb(p, 0, RETURN_1);
                   4607:         scb_index = aic_inb(p, SCB_TAG);
                   4608:         if (scb_index > p->scb_data->numscbs)
                   4609:         {
                   4610:           printk(WARN_LEAD "Invalid SCB during SEQINT 0x%02x, SCB_TAG %d.\n",
                   4611:             p->host_no, channel, target, lun, intstat, scb_index);
                   4612:           break;
                   4613:         }
                   4614:         scb = p->scb_data->scb_array[scb_index];
                   4615:         hscb = scb->hscb;
                   4616: 
                   4617:         if (!(scb->flags & SCB_ACTIVE) || (scb->cmd == NULL))
                   4618:         {
                   4619:           printk(WARN_LEAD "Invalid SCB during SEQINT 0x%x, scb %d, flags 0x%x,"
                   4620:             " cmd 0x%lx.\n", p->host_no, channel, target, lun, intstat,
                   4621:             scb_index, scb->flags, (unsigned long) scb->cmd);
                   4622:         }
                   4623:         else
                   4624:         {
                   4625:           cmd = scb->cmd;
                   4626:           hscb->target_status = aic_inb(p, SCB_TARGET_STATUS);
                   4627:           aic7xxx_status(cmd) = hscb->target_status;
                   4628: 
                   4629:           cmd->result = hscb->target_status;
                   4630: 
                   4631:           switch (status_byte(hscb->target_status))
                   4632:           {
                   4633:             case GOOD:
                   4634:               if (aic7xxx_verbose & VERBOSE_SEQINT)
                   4635:                 printk(INFO_LEAD "Interrupted for status of GOOD???\n",
                   4636:                   p->host_no, CTL_OF_SCB(scb));
                   4637:               break;
                   4638: 
                   4639:             case COMMAND_TERMINATED:
                   4640:             case CHECK_CONDITION:
                   4641:               if ( !(scb->flags & SCB_SENSE) )
                   4642:               {
                   4643:                 /*
                   4644:                  * XXX - How do we save the residual (if there is one).
                   4645:                  */
                   4646:                 if ( hscb->residual_SG_segment_count != 0 )
                   4647:                   aic7xxx_calculate_residual(p, scb);
                   4648: 
                   4649:                 /*
                   4650:                    * Send a sense command to the requesting target.
                   4651:                  * XXX - revisit this and get rid of the memcopys.
                   4652:                    */
                   4653:                 memcpy(&scb->sense_cmd[0], &generic_sense[0],
                   4654:                        sizeof(generic_sense));
                   4655: 
                   4656:                 scb->sense_cmd[1] = (cmd->lun << 5);
                   4657:                 scb->sense_cmd[4] = sizeof(cmd->sense_buffer);
                   4658: 
                   4659:                 scb->sg_list[0].address = 
                   4660:                   cpu_to_le32(VIRT_TO_BUS(&cmd->sense_buffer[0]));
                   4661:                 scb->sg_list[0].length = 
                   4662:                   cpu_to_le32(sizeof(cmd->sense_buffer));
                   4663: 
                   4664:                 /*
                   4665:                  * XXX - We should allow disconnection, but can't as it
                   4666:                  * might allow overlapped tagged commands.
                   4667:                  */
                   4668:                   /* hscb->control &= DISCENB; */
                   4669:                 hscb->control = 0;
                   4670:                 hscb->target_status = 0;
                   4671:                 hscb->SG_list_pointer = 
                   4672:                   cpu_to_le32(VIRT_TO_BUS(&scb->sg_list[0]));
                   4673:                 hscb->data_pointer = scb->sg_list[0].address;
                   4674:                 hscb->data_count = scb->sg_list[0].length;
                   4675:                 hscb->SCSI_cmd_pointer = 
                   4676:                   cpu_to_le32(VIRT_TO_BUS(&scb->sense_cmd[0]));
                   4677:                 hscb->SCSI_cmd_length = COMMAND_SIZE(scb->sense_cmd[0]);
                   4678:                 hscb->residual_SG_segment_count = 0;
                   4679:                 hscb->residual_data_count[0] = 0;
                   4680:                 hscb->residual_data_count[1] = 0;
                   4681:                 hscb->residual_data_count[2] = 0;
                   4682: 
                   4683:                 scb->sg_count = hscb->SG_segment_count = 1;
                   4684:                 scb->sg_length = sizeof(cmd->sense_buffer);
                   4685:                 scb->tag_action = 0;
                   4686:                 /*
                   4687:                  * This problem could be caused if the target has lost power
                   4688:                  * or found some other way to loose the negotiation settings,
                   4689:                  * so if needed, we'll re-negotiate while doing the sense cmd.
                   4690:                  * However, if this SCB already was attempting to negotiate,
                   4691:                  * then we assume this isn't the problem and skip this part.
                   4692:                  */
                   4693: #ifdef AIC7XXX_FAKE_NEGOTIATION_CMDS
                   4694:                 if ( (scb->cmd->cmnd[0] != TEST_UNIT_READY) &&
                   4695:                      (p->dev_flags[tindex] & DEVICE_SCANNED) &&
                   4696:                      !(p->wdtr_pending & target_mask) && 
                   4697:                      !(p->sdtr_pending & target_mask) )
                   4698:                 {
                   4699:                   p->needwdtr |= (p->needwdtr_copy & target_mask);
                   4700:                   p->needsdtr |= (p->needsdtr_copy & target_mask);
                   4701:                 }
                   4702:                 else if ( (scb->cmd == p->dev_wdtr_cmnd[tindex]) ||
                   4703:                           (scb->cmd == p->dev_sdtr_cmnd[tindex]) )
                   4704:                 {
                   4705:                   /*
                   4706:                    * This is already a negotiation command, so we must have
                   4707:                    * already done either WDTR or SDTR (or maybe both).  So
                   4708:                    * we simply check sdtr_pending and needsdtr to see if we
                   4709:                    * should throw out SDTR on this command.
                   4710:                    *
                   4711:                    * Note: Don't check the needsdtr_copy here, instead just
                   4712:                    * check to see if WDTR wiped out our SDTR and set needsdtr.
                   4713:                    * Even if WDTR did wipe out SDTR and set needsdtr, if
                   4714:                    * parse_msg() then turned around and started our SDTR
                   4715:                    * in back to back fasion, then conclusion of that should
                   4716:                    * have negated any needsdtr setting.  That's why we only
                   4717:                    * check needsdtr and sdtr_pending.
                   4718:                    */
                   4719:                   scb->flags &= ~SCB_MSGOUT_BITS;
                   4720:                   if ( (scb->cmd == p->dev_wdtr_cmnd[tindex]) &&
                   4721:                        !(p->sdtr_pending & target_mask) &&
                   4722:                        (p->needsdtr & target_mask) )
                   4723:                   {
                   4724:                     p->sdtr_pending |= target_mask;
                   4725:                     hscb->control |= MK_MESSAGE;
                   4726:                     scb->flags |= SCB_MSGOUT_SDTR;
                   4727:                   }
                   4728: 
                   4729:                   /*
                   4730:                    * This is the important part though.  We are getting sense
                   4731:                    * info back from this device.  It's going into a fake
                   4732:                    * command.  We need to put that into the real command
                   4733:                    * instead so that the mid level SCSI code can act upon it.
                   4734:                    * So, when we set up these fake commands, the next pointer
                   4735:                    * is used to point to the real command.  Use that to change
                   4736:                    * the address of our sense_buffer[] to the real command.
                   4737:                    * However, don't do this if the real command is also a
                   4738:                    * TEST_UNIT_READY as it will most likely pull down its own
                   4739:                    * SENSE information anyway.
                   4740:                    */
                   4741:                   if (cmd->next->cmnd[0] != TEST_UNIT_READY)
                   4742:                   {
                   4743:                     scb->sg_list[0].address = 
                   4744:                       cpu_to_le32(VIRT_TO_BUS(&cmd->next->sense_buffer[0]));
                   4745:                     hscb->data_pointer = scb->sg_list[0].address;
                   4746:                   }
                   4747:                 }
                   4748: #else
                   4749:                 if (  (scb->cmd->cmnd[0] != TEST_UNIT_READY) &&
                   4750:                      !(scb->flags & SCB_MSGOUT_BITS) && 
                   4751:                       (scb->cmd->lun == 0) &&
                   4752:                       (p->dev_flags[TARGET_INDEX(scb->cmd)] & DEVICE_SCANNED) )
                   4753:                 {
                   4754:                   if ( (p->needwdtr_copy & target_mask) &&
                   4755:                       !(p->wdtr_pending & target_mask) &&
                   4756:                       !(p->sdtr_pending & target_mask) )
                   4757:                   {
                   4758:                     p->needwdtr |= target_mask;
                   4759:                     p->wdtr_pending |= target_mask;
                   4760:                     hscb->control |= MK_MESSAGE;
                   4761:                     scb->flags |= SCB_MSGOUT_WDTR;
                   4762:                   }
                   4763:                   if ( p->needsdtr_copy & target_mask )
                   4764:                   {
                   4765:                     p->needsdtr |= target_mask;
                   4766:                     if ( !(p->wdtr_pending & target_mask) &&
                   4767:                          !(p->sdtr_pending & target_mask) )
                   4768:                     {
                   4769:                       p->sdtr_pending |= target_mask;
                   4770:                       hscb->control |= MK_MESSAGE;
                   4771:                       scb->flags |= SCB_MSGOUT_SDTR;
                   4772:                     }
                   4773:                   }
                   4774:                 }
                   4775:                 else
                   4776:                   scb->flags &= ~SCB_MSGOUT_BITS;
                   4777: #endif /* AIC7XXX_FAKE_NEGOTIATION_CMDS */
                   4778:                 scb->flags |= SCB_SENSE;
                   4779:                 /*
                   4780:                  * Ensure the target is busy since this will be an
                   4781:                  * an untagged request.
                   4782:                  */
                   4783: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   4784:                 if (aic7xxx_verbose > 0xffff)
                   4785:                 {
                   4786:                   if (scb->flags & SCB_MSGOUT_BITS)
                   4787:                     printk(INFO_LEAD "Requesting SENSE with %s\n", p->host_no,
                   4788:                            CTL_OF_SCB(scb), (scb->flags & SCB_MSGOUT_SDTR) ?
                   4789:                            "SDTR" : "WDTR");
                   4790:                   else
                   4791:                     printk(INFO_LEAD "Requesting SENSE, no MSG\n", p->host_no,
                   4792:                            CTL_OF_SCB(scb));
                   4793:                 }
                   4794: #endif
                   4795:                 aic7xxx_busy_target(p, scb);
                   4796:                 aic_outb(p, SEND_SENSE, RETURN_1);
                   4797:                 aic7xxx_error(cmd) = DID_OK;
                   4798:                 break;
                   4799:               }  /* first time sense, no errors */
                   4800:               aic7xxx_error(cmd) = DID_OK;
                   4801:               scb->flags &= ~SCB_SENSE;
                   4802:               break;
                   4803: 
                   4804:             case QUEUE_FULL:
                   4805:               queue_flag = TRUE;    /* Mark that this is a QUEUE_FULL and */
                   4806:             case BUSY:              /* drop through to here */
                   4807:             {
                   4808:               struct aic7xxx_scb *next_scbp, *prev_scbp;
                   4809:               unsigned char active_hscb, next_hscb, prev_hscb, scb_index;
                   4810:               /*
                   4811:                * We have to look three places for queued commands:
                   4812:                *  1: QINFIFO
                   4813:                *  2: p->waiting_scbs queue
                   4814:                *  3: WAITING_SCBS list on card (for commands that are started
                   4815:                *     but haven't yet made it to the device)
                   4816:                */
                   4817:               aic7xxx_search_qinfifo(p, target, channel, lun,
                   4818:                 SCB_LIST_NULL, 0, TRUE,
                   4819:                 &p->delayed_scbs[tindex]);
                   4820:               next_scbp = p->waiting_scbs.head;
                   4821:               while ( next_scbp != NULL )
                   4822:               {
                   4823:                 prev_scbp = next_scbp;
                   4824:                 next_scbp = next_scbp->q_next;
                   4825:                 if ( aic7xxx_match_scb(p, prev_scbp, target, channel, lun,
                   4826:                      SCB_LIST_NULL) )
                   4827:                 {
                   4828:                   scbq_remove(&p->waiting_scbs, prev_scbp);
                   4829:                   scbq_insert_tail(&p->delayed_scbs[tindex],
                   4830:                     prev_scbp);
                   4831:                 }
                   4832:               }
                   4833:               next_scbp = NULL;
                   4834:               active_hscb = aic_inb(p, SCBPTR);
                   4835:               prev_hscb = next_hscb = scb_index = SCB_LIST_NULL;
                   4836:               next_hscb = aic_inb(p, WAITING_SCBH);
                   4837:               while (next_hscb != SCB_LIST_NULL)
                   4838:               {
                   4839:                 aic_outb(p, next_hscb, SCBPTR);
                   4840:                 scb_index = aic_inb(p, SCB_TAG);
                   4841:                 if (scb_index < p->scb_data->numscbs)
                   4842:                 {
                   4843:                   next_scbp = p->scb_data->scb_array[scb_index];
                   4844:                   if (aic7xxx_match_scb(p, next_scbp, target, channel, lun,
                   4845:                       SCB_LIST_NULL) )
                   4846:                   {
                   4847:                     if (next_scbp->flags & SCB_WAITINGQ)
                   4848:                     {
                   4849:                       p->dev_active_cmds[tindex]++;
                   4850:                       p->activescbs--;
                   4851:                       scbq_remove(&p->delayed_scbs[tindex], next_scbp);
                   4852:                       scbq_remove(&p->waiting_scbs, next_scbp);
                   4853:                     }
                   4854:                     scbq_insert_head(&p->delayed_scbs[tindex],
                   4855:                       next_scbp);
                   4856:                     next_scbp->flags |= SCB_WAITINGQ;
                   4857:                     p->dev_active_cmds[tindex]--;
                   4858:                     p->activescbs--;
                   4859:                     next_hscb = aic_inb(p, SCB_NEXT);
                   4860:                     aic_outb(p, 0, SCB_CONTROL);
                   4861:                     aic_outb(p, SCB_LIST_NULL, SCB_TAG);
                   4862:                     aic7xxx_add_curscb_to_free_list(p);
                   4863:                     if (prev_hscb == SCB_LIST_NULL)
                   4864:                     {
                   4865:                       /* We were first on the list,
                   4866:                        * so we kill the selection
                   4867:                        * hardware.  Let the sequencer
                   4868:                        * re-init the hardware itself
                   4869:                        */
                   4870:                       aic_outb(p, aic_inb(p, SCSISEQ) & ~ENSELO, SCSISEQ);
                   4871:                       aic_outb(p, CLRSELTIMEO, CLRSINT1);
                   4872:                       aic_outb(p, next_hscb, WAITING_SCBH);
                   4873:                     }
                   4874:                     else
                   4875:                     {
                   4876:                       aic_outb(p, prev_hscb, SCBPTR);
                   4877:                       aic_outb(p, next_hscb, SCB_NEXT);
                   4878:                     }
                   4879:                   }
                   4880:                   else
                   4881:                   {
                   4882:                     prev_hscb = next_hscb;
                   4883:                     next_hscb = aic_inb(p, SCB_NEXT);
                   4884:                   }
                   4885:                 } /* scb_index >= p->scb_data->numscbs */
                   4886:               }
                   4887:               aic_outb(p, active_hscb, SCBPTR);
                   4888:               if (scb->flags & SCB_WAITINGQ)
                   4889:               {
                   4890:                 scbq_remove(&p->delayed_scbs[tindex], scb);
                   4891:                 scbq_remove(&p->waiting_scbs, scb);
                   4892:                 p->dev_active_cmds[tindex]++;
                   4893:                 p->activescbs++;
                   4894:               }
                   4895:               scbq_insert_head(&p->delayed_scbs[tindex], scb);
                   4896:               p->dev_active_cmds[tindex]--;
                   4897:               p->activescbs--;
                   4898:               scb->flags |= SCB_WAITINGQ | SCB_WAS_BUSY;
                   4899:                   
                   4900:               if (p->dev_timer[tindex].expires == 0) 
                   4901:               {
                   4902:                 if ( p->dev_active_cmds[tindex] )
                   4903:                 {
                   4904:                   p->dev_timer[tindex].expires = jiffies + (HZ * 2);
                   4905:                   add_timer(&p->dev_timer[tindex]);
                   4906:                 }
                   4907:                 else
                   4908:                 {
                   4909:                   p->dev_timer[tindex].expires = jiffies + (HZ / 2);
                   4910:                   add_timer(&p->dev_timer[tindex]);
                   4911:                 }
                   4912:               }
                   4913: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   4914:               if (aic7xxx_verbose & VERBOSE_MINOR_ERROR)
                   4915:               {
                   4916:                 if (queue_flag)
                   4917:                   printk(INFO_LEAD "Queue full received; queue depth %d, "
                   4918:                     "active %d\n", p->host_no, CTL_OF_SCB(scb),
                   4919:                     p->dev_max_queue_depth[tindex],
                   4920:                     p->dev_active_cmds[tindex]);
                   4921:                 else
                   4922:                   printk(INFO_LEAD "Target busy\n", p->host_no, CTL_OF_SCB(scb));
                   4923: 
                   4924:               }
                   4925: #endif
                   4926:               if (queue_flag)
                   4927:               {
                   4928:                 p->dev_temp_queue_depth[tindex] = 
                   4929:                   p->dev_active_cmds[tindex];
                   4930:                 if ( p->dev_last_queue_full[tindex] !=
                   4931:                      p->dev_active_cmds[tindex] )
                   4932:                 {
                   4933:                   p->dev_last_queue_full[tindex] = 
                   4934:                       p->dev_active_cmds[tindex];
                   4935:                   p->dev_last_queue_full_count[tindex] = 0;
                   4936:                 }
                   4937:                 else
                   4938:                 {
                   4939:                   p->dev_last_queue_full_count[tindex]++;
                   4940:                 }
                   4941:                 if ( (p->dev_last_queue_full_count[tindex] > 14) &&
                   4942:                      (p->dev_active_cmds[tindex] > 4) )
                   4943:                 {
                   4944:                   if (aic7xxx_verbose & VERBOSE_NEGOTIATION2)
                   4945:                     printk(INFO_LEAD "Queue depth reduced to %d\n", p->host_no,
                   4946:                       CTL_OF_SCB(scb), p->dev_active_cmds[tindex]);
                   4947:                   p->dev_max_queue_depth[tindex] = 
                   4948:                       p->dev_active_cmds[tindex];
                   4949:                   p->dev_last_queue_full[tindex] = 0;
                   4950:                   p->dev_last_queue_full_count[tindex] = 0;
                   4951:                 }
                   4952:               }
                   4953:               break;
                   4954:             }
                   4955:             
                   4956:             default:
                   4957:               if (aic7xxx_verbose & VERBOSE_SEQINT)
                   4958:                 printk(INFO_LEAD "Unexpected target status 0x%x.\n", p->host_no,
                   4959:                      CTL_OF_SCB(scb), scb->hscb->target_status);
                   4960:               if (!aic7xxx_error(cmd))
                   4961:               {
                   4962:                 aic7xxx_error(cmd) = DID_RETRY_COMMAND;
                   4963:               }
                   4964:               break;
                   4965:           }  /* end switch */
                   4966:         }  /* end else of */
                   4967:       }
                   4968:       break;
                   4969: 
                   4970:     case AWAITING_MSG:
                   4971:       {
                   4972:         unsigned char scb_index, msg_out;
                   4973: 
                   4974:         scb_index = aic_inb(p, SCB_TAG);
                   4975:         msg_out = aic_inb(p, MSG_OUT);
                   4976:         scb = p->scb_data->scb_array[scb_index];
                   4977:         p->msg_index = p->msg_len = 0;
                   4978:         /*
                   4979:          * This SCB had a MK_MESSAGE set in its control byte informing
                   4980:          * the sequencer that we wanted to send a special message to
                   4981:          * this target.
                   4982:          */
                   4983: 
                   4984:         if ( !(scb->flags & SCB_DEVICE_RESET) &&
                   4985:               (aic_inb(p, MSG_OUT) == MSG_IDENTIFYFLAG) &&
                   4986:               (scb->hscb->control & TAG_ENB) )
                   4987:         {
                   4988:           p->msg_buf[p->msg_index++] = scb->tag_action;
                   4989:           p->msg_buf[p->msg_index++] = scb->hscb->tag;
                   4990:           p->msg_len += 2;
                   4991:         }
                   4992: 
                   4993:         if (scb->flags & SCB_DEVICE_RESET)
                   4994:         {
                   4995:           p->msg_buf[p->msg_index++] = MSG_BUS_DEV_RESET;
                   4996:           p->msg_len++;
                   4997:           if (aic7xxx_verbose & VERBOSE_RESET_PROCESS)
                   4998:             printk(INFO_LEAD "Bus device reset mailed.\n",
                   4999:                  p->host_no, CTL_OF_SCB(scb));
                   5000:         }
                   5001:         else if (scb->flags & SCB_ABORT)
                   5002:         {
                   5003:           if (scb->tag_action)
                   5004:           {
                   5005:             p->msg_buf[p->msg_index++] = MSG_ABORT_TAG;
                   5006:           }
                   5007:           else
                   5008:           {
                   5009:             p->msg_buf[p->msg_index++] = MSG_ABORT;
                   5010:           }
                   5011:           p->msg_len++;
                   5012:           if (aic7xxx_verbose & VERBOSE_ABORT_PROCESS)
                   5013:             printk(INFO_LEAD "Abort message mailed.\n", p->host_no,
                   5014:               CTL_OF_SCB(scb));
                   5015:         }
                   5016:         else if (scb->flags & SCB_MSGOUT_WDTR)
                   5017:         {
                   5018: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   5019:           if (aic7xxx_verbose > 0xffff)
                   5020:             printk(INFO_LEAD "Sending WDTR message.\n", p->host_no,
                   5021:                    CTL_OF_SCB(scb));
                   5022: #endif
                   5023:           aic7xxx_construct_wdtr(p,
                   5024:             p->transinfo[TARGET_INDEX(scb->cmd)].goal_width);
                   5025:         }
                   5026:         else if (scb->flags & SCB_MSGOUT_SDTR)
                   5027:         {
                   5028:           unsigned int max_sync, period;
                   5029:           /*
                   5030:            * We need to set an accurate goal_offset instead of
                   5031:            * the ridiculously high one we default to.  We should
                   5032:            * now know if we are wide.  Plus, the WDTR code will 
                   5033:            * set our goal_offset for us as well.
                   5034:            */
                   5035:           if (p->transinfo[tindex].goal_offset)
                   5036:           {
                   5037:             if (p->features & AHC_ULTRA2)
                   5038:               p->transinfo[tindex].goal_offset = MAX_OFFSET_ULTRA2;
                   5039:             else if (p->transinfo[tindex].cur_width == MSG_EXT_WDTR_BUS_16_BIT)
                   5040:               p->transinfo[tindex].goal_offset = MAX_OFFSET_16BIT;
                   5041:             else
                   5042:               p->transinfo[tindex].goal_offset = MAX_OFFSET_8BIT;
                   5043:           }
                   5044:           /*
                   5045:            * Now that the device is selected, use the bits in SBLKCTL and
                   5046:            * SSTAT2 to determine the max sync rate for this device.
                   5047:            */
                   5048:           if (p->features & AHC_ULTRA2)
                   5049:           {
                   5050:             if ( (aic_inb(p, SBLKCTL) & ENAB40) &&
                   5051:                 !(aic_inb(p, SSTAT2) & EXP_ACTIVE) )
                   5052:             {
                   5053:               max_sync = AHC_SYNCRATE_ULTRA2;
                   5054:             }
                   5055:             else
                   5056:             {
                   5057:               max_sync = AHC_SYNCRATE_ULTRA;
                   5058:             }
                   5059:           }
                   5060:           else if (p->features & AHC_ULTRA)
                   5061:           {
                   5062:             max_sync = AHC_SYNCRATE_ULTRA;
                   5063:           }
                   5064:           else
                   5065:           {
                   5066:             max_sync = AHC_SYNCRATE_FAST;
                   5067:           }
                   5068:           period = p->transinfo[tindex].goal_period;
                   5069:           aic7xxx_find_syncrate(p, &period, max_sync);
                   5070: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   5071:           if (aic7xxx_verbose > 0xffff)
                   5072:             printk(INFO_LEAD "Sending SDTR %d/%d message.\n", p->host_no,
                   5073:                    CTL_OF_SCB(scb),
                   5074:                    p->transinfo[tindex].goal_period,
                   5075:                    p->transinfo[tindex].goal_offset);
                   5076: #endif
                   5077:           aic7xxx_construct_sdtr(p, period,
                   5078:             p->transinfo[tindex].goal_offset);
                   5079:         }
                   5080:         else 
                   5081:         {
                   5082:           sti();
                   5083:           panic("aic7xxx: AWAITING_MSG for an SCB that does "
                   5084:                 "not have a waiting message.\n");
                   5085:         }
                   5086:         /*
                   5087:          * We've set everything up to send our message, now to actually do
                   5088:          * so we need to enable reqinit interrupts and let the interrupt
                   5089:          * handler do the rest.  We don't want to unpause the sequencer yet
                   5090:          * though so we'll return early.  We also have to make sure that
                   5091:          * we clear the SEQINT *BEFORE* we set the REQINIT handler active
                   5092:          * or else it's possible on VLB cards to loose the first REQINIT
                   5093:          * interrupt.  Edge triggered EISA cards could also loose this
                   5094:          * interrupt, although PCI and level triggered cards should not
                   5095:          * have this problem since they continually interrupt the kernel
                   5096:          * until we take care of the situation.
                   5097:          */
                   5098:         scb->flags |= SCB_MSGOUT_SENT;
                   5099:         p->msg_index = 0;
                   5100:         p->msg_type = MSG_TYPE_INITIATOR_MSGOUT;
                   5101:         p->flags |= AHC_HANDLING_REQINITS;
                   5102:         aic_outb(p, aic_inb(p, SIMODE1) | ENREQINIT, SIMODE1);
                   5103:         return;
                   5104:       }
                   5105:       break;
                   5106: 
                   5107:     case DATA_OVERRUN:
                   5108:       {
                   5109:         unsigned char scb_index = aic_inb(p, SCB_TAG);
                   5110:         unsigned char lastphase = aic_inb(p, LASTPHASE);
                   5111:         unsigned int i;
                   5112: 
                   5113:         scb = (p->scb_data->scb_array[scb_index]);
                   5114:         /*
                   5115:          * XXX - What do we really want to do on an overrun?  The
                   5116:          *       mid-level SCSI code should handle this, but for now,
                   5117:          *       we'll just indicate that the command should retried.
                   5118:          *    If we retrieved sense info on this target, then the 
                   5119:          *    base SENSE info should have been saved prior to the
                   5120:          *    overrun error.  In that case, we return DID_OK and let
                   5121:          *    the mid level code pick up on the sense info.  Otherwise
                   5122:          *    we return DID_ERROR so the command will get retried.
                   5123:          */
                   5124:         if ( !(scb->flags & SCB_SENSE) )
                   5125:         {
                   5126:           printk(WARN_LEAD "Data overrun detected in %s phase, tag %d;\n",
                   5127:             p->host_no, CTL_OF_SCB(scb), 
                   5128:             (lastphase == P_DATAIN) ? "Data-In" : "Data-Out", scb->hscb->tag);
                   5129:           printk(KERN_WARNING "  %s seen Data Phase. Length=%d, NumSGs=%d.\n",
                   5130:             (aic_inb(p, SEQ_FLAGS) & DPHASE) ? "Have" : "Haven't",
                   5131:             scb->sg_length, scb->sg_count);
                   5132:           for (i = 0; i < scb->sg_count; i++)
                   5133:           {
                   5134:             printk(KERN_WARNING "     sg[%d] - Addr 0x%x : Length %d\n",
                   5135:                  i, 
                   5136:                  le32_to_cpu(scb->sg_list[i].address),
                   5137:                  le32_to_cpu(scb->sg_list[i].length) );
                   5138:           }
                   5139:           aic7xxx_error(scb->cmd) = DID_ERROR;
                   5140:         }
                   5141:         else
                   5142:           printk(INFO_LEAD "Data Overrun during SEND_SENSE operation.\n",
                   5143:             p->host_no, CTL_OF_SCB(scb));
                   5144:       }
                   5145:       break;
                   5146: 
                   5147: #if AIC7XXX_NOT_YET 
                   5148:     case TRACEPOINT:
                   5149:       {
                   5150:         printk(INFO_LEAD "Tracepoint #1 reached.\n", p->host_no, channel,
                   5151:           target, lun);
                   5152:       }
                   5153:       break;
                   5154: 
                   5155:     case TRACEPOINT2:
                   5156:       {
                   5157:         printk(INFO_LEAD "Tracepoint #2 reached.\n", p->host_no, channel,
                   5158:           target, lun);
                   5159:       }
                   5160:       break;
                   5161: 
                   5162:     /* XXX Fill these in later */
                   5163:     case MSG_BUFFER_BUSY:
                   5164:       printk("aic7xxx: Message buffer busy.\n");
                   5165:       break;
                   5166:     case MSGIN_PHASEMIS:
                   5167:       printk("aic7xxx: Message-in phasemis.\n");
                   5168:       break;
                   5169: #endif
                   5170: 
                   5171:     default:                   /* unknown */
                   5172:       printk(WARN_LEAD "Unknown SEQINT, INTSTAT 0x%x, SCSISIGI 0x%x.\n",
                   5173:              p->host_no, channel, target, lun, intstat,
                   5174:              aic_inb(p, SCSISIGI));
                   5175:       break;
                   5176:   }
                   5177: 
                   5178:   /*
                   5179:    * Clear the sequencer interrupt and unpause the sequencer.
                   5180:    */
                   5181:   unpause_sequencer(p, /* unpause always */ TRUE);
                   5182: }
                   5183: 
                   5184: /*+F*************************************************************************
                   5185:  * Function:
                   5186:  *   aic7xxx_parse_msg
                   5187:  *
                   5188:  * Description:
                   5189:  *   Parses incoming messages into actions on behalf of
                   5190:  *   aic7xxx_handle_reqinit
                   5191:  *_F*************************************************************************/
                   5192: static int
                   5193: aic7xxx_parse_msg(struct aic7xxx_host *p, struct aic7xxx_scb *scb)
                   5194: {
                   5195:   int reject, reply, done;
                   5196:   unsigned char target_scsirate, tindex;
                   5197:   unsigned short target_mask;
                   5198:   unsigned char target, channel, lun;
                   5199: 
                   5200:   target = scb->cmd->target;
                   5201:   channel = scb->cmd->channel;
                   5202:   lun = scb->cmd->lun;
                   5203:   reply = reject = done = FALSE;
                   5204:   tindex = TARGET_INDEX(scb->cmd);
                   5205:   target_scsirate = aic_inb(p, TARG_SCSIRATE + tindex);
                   5206:   target_mask = (0x01 << tindex);
                   5207: 
                   5208:   /*
                   5209:    * Parse as much of the message as is availible,
                   5210:    * rejecting it if we don't support it.  When
                   5211:    * the entire message is availible and has been
                   5212:    * handled, return TRUE indicating that we have
                   5213:    * parsed an entire message.
                   5214:    */
                   5215: 
                   5216:   if (p->msg_buf[0] != MSG_EXTENDED)
                   5217:   {
                   5218:     reject = TRUE;
                   5219:   }
                   5220: 
                   5221:   /*
                   5222:    * Just accept the length byte outright and perform
                   5223:    * more checking once we know the message type.
                   5224:    */
                   5225: 
                   5226:   if ( !reject && (p->msg_len > 2) )
                   5227:   {
                   5228:     switch(p->msg_buf[2])
                   5229:     {
                   5230:       case MSG_EXT_SDTR:
                   5231:       {
                   5232:         unsigned int period, offset;
                   5233:         unsigned char maxsync, saved_offset;
                   5234:         struct aic7xxx_syncrate *syncrate;
                   5235:         
                   5236:         if (p->msg_buf[1] != MSG_EXT_SDTR_LEN)
                   5237:         {
                   5238:           reject = TRUE;
                   5239:           break;
                   5240:         }
                   5241: 
                   5242:         if (p->msg_len < (MSG_EXT_SDTR_LEN + 2))
                   5243:         {
                   5244:           break;
                   5245:         }
                   5246: 
                   5247:         period = p->msg_buf[3];
                   5248:         saved_offset = offset = p->msg_buf[4];
                   5249: 
                   5250:         if (p->features & AHC_ULTRA2)
                   5251:         {
                   5252:           if ( (aic_inb(p, SBLKCTL) & ENAB40) &&
                   5253:                !(aic_inb(p, SSTAT2) & EXP_ACTIVE) )
                   5254:           {
                   5255:             maxsync = AHC_SYNCRATE_ULTRA2;
                   5256:           }
                   5257:           else
                   5258:           {
                   5259:             maxsync = AHC_SYNCRATE_ULTRA;
                   5260:           }
                   5261:         }
                   5262:         else if (p->features & AHC_ULTRA)
                   5263:         {
                   5264:           maxsync = AHC_SYNCRATE_ULTRA;
                   5265:         }
                   5266:         else
                   5267:         {
                   5268:           maxsync = AHC_SYNCRATE_FAST;
                   5269:         }
                   5270:   
                   5271: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   5272:         if (aic7xxx_verbose > 0xffff)
                   5273:         {
                   5274:           printk(INFO_LEAD "Finished receipt of SDTR, parsing %d/%d\n",
                   5275:                  p->host_no, CTL_OF_SCB(scb), period, offset);
                   5276:           syncrate = aic7xxx_find_syncrate(p, &period, maxsync);
                   5277:           printk(INFO_LEAD "After find_syncrate() %d/%d\n",
                   5278:                  p->host_no, CTL_OF_SCB(scb), period, offset);
                   5279:           aic7xxx_validate_offset(p, syncrate, &offset,
                   5280:                                   target_scsirate & WIDEXFER);
                   5281:           printk(INFO_LEAD "After validate_offset() %d/%d\n",
                   5282:                  p->host_no, CTL_OF_SCB(scb), period, offset);
                   5283:           aic7xxx_set_syncrate(p, syncrate, target, channel, period,
                   5284:                                offset, AHC_TRANS_ACTIVE|AHC_TRANS_CUR);
                   5285:           printk(INFO_LEAD "Final values of Period/Offset as set: %d/%d\n",
                   5286:                  p->host_no, CTL_OF_SCB(scb), period, offset);
                   5287:         }
                   5288:         else
                   5289:         {
                   5290:           syncrate = aic7xxx_find_syncrate(p, &period, maxsync);
                   5291:           aic7xxx_validate_offset(p, syncrate, &offset,
                   5292:                                   target_scsirate & WIDEXFER);
                   5293:           aic7xxx_set_syncrate(p, syncrate, target, channel, period,
                   5294:                                offset, AHC_TRANS_ACTIVE|AHC_TRANS_CUR);
                   5295:         }
                   5296: #else
                   5297:         syncrate = aic7xxx_find_syncrate(p, &period, maxsync);
                   5298:         aic7xxx_validate_offset(p, syncrate, &offset,
                   5299:                                 target_scsirate & WIDEXFER);
                   5300:         aic7xxx_set_syncrate(p, syncrate, target, channel, period,
                   5301:                              offset, AHC_TRANS_ACTIVE|AHC_TRANS_CUR);
                   5302: #endif
                   5303: 
                   5304:         if (offset == 0)
                   5305:         {
                   5306:           /*
                   5307:            * Uhh ohh, things fell through to async....update the goal
                   5308:            * items and the needsdtr_copy to reflect this...
                   5309:            */
                   5310:           aic7xxx_set_syncrate(p, syncrate, target, channel, period,
                   5311:                  offset, AHC_TRANS_GOAL|AHC_TRANS_QUITE);
                   5312:           p->needsdtr_copy &= ~target_mask;
                   5313:         }
                   5314:         /*
                   5315:          * Did we start this, if not, or if we went to low and had to
                   5316:          * go async, then send an SDTR back to the target
                   5317:          */
                   5318:         p->needsdtr &= ~target_mask;
                   5319:         p->sdtr_pending &= ~target_mask;
                   5320:         if ( ((scb->flags & (SCB_MSGOUT_SENT|SCB_MSGOUT_SDTR)) ==
                   5321:               (SCB_MSGOUT_SENT|SCB_MSGOUT_SDTR)) &&
                   5322:              (offset == saved_offset) )
                   5323:         {
                   5324:           scb->flags &= ~SCB_MSGOUT_BITS;
                   5325:         }
                   5326:         else
                   5327:         {
                   5328:           /*
                   5329:            * Send a reply SDTR back.  Even if we sent the first one, it
                   5330:            * is valid to send another one out immediately to re-negotiate
                   5331:            * things, and a few devices don't like getting rejects after
                   5332:            * we already sent them one SDTR.  Just send an SDTR for async
                   5333:            * this time if need be (or for the correct params if we didn't
                   5334:            * start all of this).  If this is a Reject Reply type message,
                   5335:            * then we've put the async settings into the goal area for
                   5336:            * future reference (when we get the AWAITING_MSG interrupt).
                   5337:            * If this is a case where we are responding to the target's
                   5338:            * initiated SDTR, then leave our own goal and user values in
                   5339:            * place (unless the device hasn't been scanned yet, in which
                   5340:            * case, put the user values into the goal values so we don't
                   5341:            * send out an Async message).
                   5342:            */
                   5343:           if ( !(p->dev_flags[tindex] & DEVICE_SCANNED) )
                   5344:           {
                   5345:             p->transinfo[tindex].goal_width =
                   5346:               p->transinfo[tindex].user_width;
                   5347:             p->transinfo[tindex].goal_period =
                   5348:               p->transinfo[tindex].user_period;
                   5349:             p->transinfo[tindex].goal_offset =
                   5350:               p->transinfo[tindex].user_offset;
                   5351:             p->needwdtr_copy |= target_mask;
                   5352:             p->needsdtr_copy |= target_mask;
                   5353:           }
                   5354:           scb->flags &= ~SCB_MSGOUT_BITS;
                   5355:           scb->flags |= SCB_MSGOUT_SDTR;
                   5356:           aic_outb(p, HOST_MSG, MSG_OUT);
                   5357:           aic_outb(p, aic_inb(p, SCSISIGO) | ATNO, SCSISIGO);
                   5358:         }
                   5359:         done = TRUE;
                   5360:         break;
                   5361:       }
                   5362:       case MSG_EXT_WDTR:
                   5363:       {
                   5364:         unsigned char bus_width;
                   5365:           
                   5366:         if (p->msg_buf[1] != MSG_EXT_WDTR_LEN)
                   5367:         {
                   5368:           reject = TRUE;
                   5369:           break;
                   5370:         }
                   5371: 
                   5372:         if (p->msg_len < (MSG_EXT_WDTR_LEN + 2))
                   5373:         {
                   5374:           break;
                   5375:         }
                   5376: 
                   5377:         bus_width = p->msg_buf[3];
                   5378:         if ( (scb->flags & (SCB_MSGOUT_SENT|SCB_MSGOUT_WDTR)) ==
                   5379:              (SCB_MSGOUT_SENT|SCB_MSGOUT_WDTR) )
                   5380:         {
                   5381:           switch(bus_width)
                   5382:           {
                   5383:             default:
                   5384:             {
                   5385:               reject = TRUE;
                   5386:               if ( (aic7xxx_verbose & VERBOSE_NEGOTIATION2) &&
                   5387:                    ((p->dev_flags[tindex] & DEVICE_PRINT_WDTR) ||
                   5388:                     (aic7xxx_verbose > 0xffff)) )
                   5389:               {
                   5390:                 printk(INFO_LEAD "Requesting %d bit transfers, rejecting.\n",
                   5391:                   p->host_no, CTL_OF_SCB(scb), 8 * (0x01 << bus_width));
                   5392:                 p->dev_flags[tindex] &= ~DEVICE_PRINT_WDTR;
                   5393:               }
                   5394:             } /* We fall through on purpose */
                   5395:             case MSG_EXT_WDTR_BUS_8_BIT:
                   5396:             {
                   5397:               bus_width = MSG_EXT_WDTR_BUS_8_BIT;
                   5398:               p->needwdtr_copy &= ~target_mask;
                   5399:               break;
                   5400:             }
                   5401:             case MSG_EXT_WDTR_BUS_16_BIT:
                   5402:             {
                   5403:               break;
                   5404:             }
                   5405:           }
                   5406:           scb->flags &= ~SCB_MSGOUT_BITS;
                   5407:           p->wdtr_pending &= ~target_mask;
                   5408:           p->needwdtr &= ~target_mask;
                   5409:         }
                   5410:         else
                   5411:         {
                   5412:           scb->flags &= ~SCB_MSGOUT_BITS;
                   5413:           scb->flags |= SCB_MSGOUT_WDTR;
                   5414:           reply = TRUE;
                   5415:           if ( !(p->dev_flags[tindex] & DEVICE_SCANNED) )
                   5416:           {
                   5417:             /* 
                   5418:              * Well, we now know the WDTR and SYNC caps of this device since
                   5419:              * it contacted us first, mark it as such and copy the user stuff
                   5420:              * over to the goal stuff.
                   5421:              */
                   5422:             p->transinfo[tindex].goal_width =
                   5423:               p->transinfo[tindex].user_width;
                   5424:             p->transinfo[tindex].goal_period =
                   5425:               p->transinfo[tindex].user_period;
                   5426:             p->transinfo[tindex].goal_offset =
                   5427:               p->transinfo[tindex].user_offset;
                   5428:             p->needwdtr_copy |= target_mask;
                   5429:             p->needsdtr_copy |= target_mask;
                   5430:           }
                   5431:           switch(bus_width)
                   5432:           {
                   5433:             default:
                   5434:             {
                   5435:               if ( (p->features & AHC_WIDE) &&
                   5436:                    (p->transinfo[tindex].goal_width ==
                   5437:                     MSG_EXT_WDTR_BUS_16_BIT) )
                   5438:               {
                   5439:                 bus_width = MSG_EXT_WDTR_BUS_16_BIT;
                   5440:                 break;
                   5441:               }
                   5442:             } /* Fall through if we aren't a wide card */
                   5443:             case MSG_EXT_WDTR_BUS_8_BIT:
                   5444:             {
                   5445:               p->needwdtr_copy &= ~target_mask;
                   5446:               bus_width = MSG_EXT_WDTR_BUS_8_BIT;
                   5447:               break;
                   5448:             }
                   5449:           }
                   5450:           p->needwdtr &= ~target_mask;
                   5451:           p->wdtr_pending &= ~target_mask;
                   5452:           aic_outb(p, HOST_MSG, MSG_OUT);
                   5453:           aic_outb(p, aic_inb(p, SCSISIGO) | ATNO, SCSISIGO);
                   5454:         }
                   5455:         aic7xxx_set_width(p, target, channel, lun, bus_width,
                   5456:                           AHC_TRANS_ACTIVE|AHC_TRANS_CUR);
                   5457:         
                   5458:         /*
                   5459:          * By virtue of the SCSI spec, a WDTR message negates any existing
                   5460:          * SDTR negotiations.  So, even if needsdtr isn't marked for this
                   5461:          * device, we still have to do a new SDTR message if the device
                   5462:          * supports SDTR at all.  Therefore, we check needsdtr_copy instead
                   5463:          * of needstr.
                   5464:          */
                   5465:         aic7xxx_set_syncrate(p, NULL, target, channel, 0, 0,
                   5466:                              AHC_TRANS_ACTIVE|AHC_TRANS_CUR|AHC_TRANS_QUITE);
                   5467:         if ( (p->needsdtr_copy & target_mask) &&
                   5468:             !(p->sdtr_pending & target_mask))
                   5469:         {
                   5470:           p->needsdtr |= target_mask;
                   5471:           if ( !reject && !reply )
                   5472:           {
                   5473:             scb->flags &= ~SCB_MSGOUT_WDTR;
                   5474:             if (p->transinfo[tindex].goal_period)
                   5475:             {
                   5476:               p->sdtr_pending |= target_mask;
                   5477:               scb->flags |= SCB_MSGOUT_SDTR;
                   5478:               aic_outb(p, HOST_MSG, MSG_OUT);
                   5479:               aic_outb(p, aic_inb(p, SCSISIGO) | ATNO, SCSISIGO);
                   5480:             }
                   5481:           }
                   5482:         }
                   5483:         done = TRUE;
                   5484:         break;
                   5485:       }
                   5486:       default:
                   5487:       {
                   5488:         reject = TRUE;
                   5489:         break;
                   5490:       }
                   5491:     } /* end of switch(p->msg_type) */
                   5492:   } /* end of if (!reject && (p->msg_len > 2)) */
                   5493: 
                   5494:   if (reject)
                   5495:   {
                   5496:     aic_outb(p, MSG_MESSAGE_REJECT, MSG_OUT);
                   5497:     aic_outb(p, aic_inb(p, SCSISIGO) | ATNO, SCSISIGO);
                   5498:     done = TRUE;
                   5499:   }
                   5500:   return(done);
                   5501: }
                   5502: 
                   5503: 
                   5504: /*+F*************************************************************************
                   5505:  * Function:
                   5506:  *   aic7xxx_handle_reqinit
                   5507:  *
                   5508:  * Description:
                   5509:  *   Interrupt handler for REQINIT interrupts (used to transfer messages to
                   5510:  *    and from devices).
                   5511:  *_F*************************************************************************/
                   5512: static void
                   5513: aic7xxx_handle_reqinit(struct aic7xxx_host *p, struct aic7xxx_scb *scb)
                   5514: {
                   5515:   unsigned char lastbyte;
                   5516:   unsigned char phasemis;
                   5517:   int done = FALSE;
                   5518: 
                   5519:   switch(p->msg_type)
                   5520:   {
                   5521:     case MSG_TYPE_INITIATOR_MSGOUT:
                   5522:       {
                   5523:         if (p->msg_len == 0)
                   5524:           panic("aic7xxx: REQINIT with no active message!\n");
                   5525: 
                   5526:         lastbyte = (p->msg_index == (p->msg_len - 1));
                   5527:         phasemis = ( aic_inb(p, SCSISIGI) & PHASE_MASK) != P_MESGOUT;
                   5528: 
                   5529:         if (lastbyte || phasemis)
                   5530:         {
                   5531:           /* Time to end the message */
                   5532:           p->msg_len = 0;
                   5533:           p->msg_type = MSG_TYPE_NONE;
                   5534:           /*
                   5535:            * NOTE-TO-MYSELF: If you clear the REQINIT after you
                   5536:            * disable REQINITs, then cases of REJECT_MSG stop working
                   5537:            * and hang the bus
                   5538:            */
                   5539:           aic_outb(p, aic_inb(p, SIMODE1) & ~ENREQINIT, SIMODE1);
                   5540:           aic_outb(p, CLRSCSIINT, CLRINT);
                   5541:           p->flags &= ~AHC_HANDLING_REQINITS;
                   5542: 
                   5543:           if (phasemis == 0)
                   5544:           {
                   5545:             aic_outb(p, p->msg_buf[p->msg_index], SINDEX);
                   5546:             aic_outb(p, 0, RETURN_1);
                   5547: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   5548:             if (aic7xxx_verbose > 0xffff)
                   5549:               printk(INFO_LEAD "Completed sending of REQINIT message.\n",
                   5550:                      p->host_no, CTL_OF_SCB(scb));
                   5551: #endif
                   5552:           }
                   5553:           else
                   5554:           {
                   5555:             aic_outb(p, MSGOUT_PHASEMIS, RETURN_1);
                   5556: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   5557:             if (aic7xxx_verbose > 0xffff)
                   5558:               printk(INFO_LEAD "PHASEMIS while sending REQINIT message.\n",
                   5559:                      p->host_no, CTL_OF_SCB(scb));
                   5560: #endif
                   5561:           }
                   5562:           unpause_sequencer(p, TRUE);
                   5563:         }
                   5564:         else
                   5565:         {
                   5566:           /*
                   5567:            * Present the byte on the bus (clearing REQINIT) but don't
                   5568:            * unpause the sequencer.
                   5569:            */
                   5570:           aic_outb(p, CLRREQINIT, CLRSINT1);
                   5571:           aic_outb(p, CLRSCSIINT, CLRINT);
                   5572:           aic_outb(p,  p->msg_buf[p->msg_index++], SCSIDATL);
                   5573:         }
                   5574:         break;
                   5575:       }
                   5576:     case MSG_TYPE_INITIATOR_MSGIN:
                   5577:       {
                   5578:         phasemis = ( aic_inb(p, SCSISIGI) & PHASE_MASK ) != P_MESGIN;
                   5579: 
                   5580:         if (phasemis == 0)
                   5581:         {
                   5582:           p->msg_len++;
                   5583:           /* Pull the byte in without acking it */
                   5584:           p->msg_buf[p->msg_index] = aic_inb(p, SCSIBUSL);
                   5585:           done = aic7xxx_parse_msg(p, scb);
                   5586:           /* Ack the byte */
                   5587:           aic_outb(p, CLRREQINIT, CLRSINT1);
                   5588:           aic_outb(p, CLRSCSIINT, CLRINT);
                   5589:           aic_inb(p, SCSIDATL);
                   5590:           p->msg_index++;
                   5591:         }
                   5592:         if (phasemis || done)
                   5593:         {
                   5594: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   5595:           if (aic7xxx_verbose > 0xffff)
                   5596:           {
                   5597:             if (phasemis)
                   5598:               printk(INFO_LEAD "PHASEMIS while receiving REQINIT message.\n",
                   5599:                      p->host_no, CTL_OF_SCB(scb));
                   5600:             else
                   5601:               printk(INFO_LEAD "Completed receipt of REQINIT message.\n",
                   5602:                      p->host_no, CTL_OF_SCB(scb));
                   5603:           }
                   5604: #endif
                   5605:           /* Time to end our message session */
                   5606:           p->msg_len = 0;
                   5607:           p->msg_type = MSG_TYPE_NONE;
                   5608:           aic_outb(p, aic_inb(p, SIMODE1) & ~ENREQINIT, SIMODE1);
                   5609:           aic_outb(p, CLRSCSIINT, CLRINT);
                   5610:           p->flags &= ~AHC_HANDLING_REQINITS;
                   5611:           unpause_sequencer(p, TRUE);
                   5612:         }
                   5613:         break;
                   5614:       }
                   5615:     default:
                   5616:       {
                   5617:         panic("aic7xxx: Unknown REQINIT message type.\n");
                   5618:         break;
                   5619:       }
                   5620:   } /* End of switch(p->msg_type) */
                   5621: }
                   5622: 
                   5623: /*+F*************************************************************************
                   5624:  * Function:
                   5625:  *   aic7xxx_handle_scsiint
                   5626:  *
                   5627:  * Description:
                   5628:  *   Interrupt handler for SCSI interrupts (SCSIINT).
                   5629:  *-F*************************************************************************/
                   5630: static void
                   5631: aic7xxx_handle_scsiint(struct aic7xxx_host *p, unsigned char intstat)
                   5632: {
                   5633:   unsigned char scb_index;
                   5634:   unsigned char status;
                   5635:   struct aic7xxx_scb *scb;
                   5636: 
                   5637:   scb_index = aic_inb(p, SCB_TAG);
                   5638:   status = aic_inb(p, SSTAT1);
                   5639: 
                   5640:   if (scb_index < p->scb_data->numscbs)
                   5641:   {
                   5642:     scb = p->scb_data->scb_array[scb_index];
                   5643:     if ((scb->flags & SCB_ACTIVE) == 0)
                   5644:     {
                   5645:       scb = NULL;
                   5646:     }
                   5647:   }
                   5648:   else
                   5649:   {
                   5650:     scb = NULL;
                   5651:   }
                   5652: 
                   5653: 
                   5654:   if ((status & SCSIRSTI) != 0)
                   5655:   {
                   5656:     int channel;
                   5657: 
                   5658:     if ( (p->chip & AHC_CHIPID_MASK) == AHC_AIC7770 )
                   5659:       channel = (aic_inb(p, SBLKCTL) & SELBUSB) >> 3;
                   5660:     else
                   5661:       channel = 0;
                   5662: 
                   5663:     if (aic7xxx_verbose & VERBOSE_RESET)
                   5664:       printk(WARN_LEAD "Someone else reset the channel!!\n",
                   5665:            p->host_no, channel, -1, -1);
                   5666:     /*
                   5667:      * Go through and abort all commands for the channel, but do not
                   5668:      * reset the channel again.
                   5669:      */
                   5670:     aic7xxx_reset_channel(p, channel, /* Initiate Reset */ FALSE);
                   5671:     aic7xxx_run_done_queue(p, FALSE);
                   5672:     scb = NULL;
                   5673:   }
                   5674:   else if ( ((status & BUSFREE) != 0) && ((status & SELTO) == 0) )
                   5675:   {
                   5676:     /*
                   5677:      * First look at what phase we were last in.  If it's message-out,
                   5678:      * chances are pretty good that the bus free was in response to
                   5679:      * one of our abort requests.
                   5680:      */
                   5681:     unsigned char lastphase = aic_inb(p, LASTPHASE);
                   5682:     unsigned char saved_tcl = aic_inb(p, SAVED_TCL);
                   5683:     unsigned char target = (saved_tcl >> 4) & 0x0F;
                   5684:     int channel;
                   5685:     int printerror = TRUE;
                   5686: 
                   5687:     if ( (p->chip & AHC_CHIPID_MASK) == AHC_AIC7770 )
                   5688:       channel = (aic_inb(p, SBLKCTL) & SELBUSB) >> 3;
                   5689:     else
                   5690:       channel = 0;
                   5691: 
                   5692:     aic_outb(p, aic_inb(p, SCSISEQ) & (ENSELI|ENRSELI|ENAUTOATNP),
                   5693:              SCSISEQ);
                   5694:     if (lastphase == P_MESGOUT)
                   5695:     {
                   5696:       unsigned char message;
                   5697: 
                   5698:       message = aic_inb(p, SINDEX);
                   5699: 
                   5700:       if ((message == MSG_ABORT) || (message == MSG_ABORT_TAG))
                   5701:       {
                   5702:         if (aic7xxx_verbose & VERBOSE_ABORT_PROCESS)
                   5703:           printk(INFO_LEAD "SCB %d abort delivered.\n", p->host_no,
                   5704:             CTL_OF_SCB(scb), scb->hscb->tag);
                   5705:         aic7xxx_reset_device(p, target, channel, ALL_LUNS,
                   5706:                 (message == MSG_ABORT) ? SCB_LIST_NULL : scb->hscb->tag );
                   5707:         aic7xxx_run_done_queue(p, FALSE);
                   5708:         scb = NULL;
                   5709:         printerror = 0;
                   5710:       }
                   5711:       else if (message == MSG_BUS_DEV_RESET)
                   5712:       {
                   5713:         aic7xxx_handle_device_reset(p, target, channel);
                   5714:         scb = NULL;
                   5715:         printerror = 0;
                   5716:       }
                   5717:     }
                   5718:     if (printerror != 0)
                   5719:     {
                   5720:       if (scb != NULL)
                   5721:       {
                   5722:         unsigned char tag;
                   5723: 
                   5724:         if ((scb->hscb->control & TAG_ENB) != 0)
                   5725:         {
                   5726:           tag = scb->hscb->tag;
                   5727:         }
                   5728:         else
                   5729:         {
                   5730:           tag = SCB_LIST_NULL;
                   5731:         }
                   5732:         aic7xxx_reset_device(p, target, channel, ALL_LUNS, tag);
                   5733:         aic7xxx_run_done_queue(p, FALSE);
                   5734:       }
                   5735:       printk(INFO_LEAD "Unexpected busfree, LASTPHASE = 0x%x, "
                   5736:              "SEQADDR = 0x%x\n", p->host_no, channel, target, -1, lastphase,
                   5737:              (aic_inb(p, SEQADDR1) << 8) | aic_inb(p, SEQADDR0));
                   5738:       scb = NULL;
                   5739:     }
                   5740:     aic_outb(p, MSG_NOOP, MSG_OUT);
                   5741:     aic_outb(p, aic_inb(p, SIMODE1) & ~(ENBUSFREE|ENREQINIT),
                   5742:       SIMODE1);
                   5743:     p->flags &= ~AHC_HANDLING_REQINITS;
                   5744:     aic_outb(p, CLRBUSFREE, CLRSINT1);
                   5745:     aic_outb(p, CLRSCSIINT, CLRINT);
                   5746:     restart_sequencer(p);
                   5747:     unpause_sequencer(p, TRUE);
                   5748:   }
                   5749:   else if ((status & SELTO) != 0)
                   5750:   {
                   5751:     unsigned char scbptr;
                   5752:     unsigned char nextscb;
                   5753:     Scsi_Cmnd *cmd;
                   5754: 
                   5755:     scbptr = aic_inb(p, WAITING_SCBH);
                   5756:     if (scbptr > p->scb_data->maxhscbs)
                   5757:     {
                   5758:       /*
                   5759:        * I'm still trying to track down exactly how this happens, but until
                   5760:        * I find it, this code will make sure we aren't passing bogus values
                   5761:        * into the SCBPTR register, even if that register will just wrap
                   5762:        * things around, we still don't like having out of range variables.
                   5763:        *
                   5764:        * NOTE: Don't check the aic7xxx_verbose variable, I want this message
                   5765:        * to always be displayed.
                   5766:        */
                   5767:       printk(INFO_LEAD "Invalid WAITING_SCBH value %d, improvising.\n",
                   5768:              p->host_no, -1, -1, -1, scbptr);
                   5769:       if (p->scb_data->maxhscbs > 4)
                   5770:         scbptr &= (p->scb_data->maxhscbs - 1);
                   5771:       else
                   5772:         scbptr &= 0x03;
                   5773:     }
                   5774:     aic_outb(p, scbptr, SCBPTR);
                   5775:     scb_index = aic_inb(p, SCB_TAG);
                   5776: 
                   5777:     scb = NULL;
                   5778:     if (scb_index < p->scb_data->numscbs)
                   5779:     {
                   5780:       scb = p->scb_data->scb_array[scb_index];
                   5781:       if ((scb->flags & SCB_ACTIVE) == 0)
                   5782:       {
                   5783:         scb = NULL;
                   5784:       }
                   5785:     }
                   5786:     if (scb == NULL)
                   5787:     {
                   5788:       printk(WARN_LEAD "Referenced SCB %d not valid during SELTO.\n",
                   5789:              p->host_no, -1, -1, -1, scb_index);
                   5790:       printk(KERN_WARNING "        SCSISEQ = 0x%x SEQADDR = 0x%x SSTAT0 = 0x%x "
                   5791:              "SSTAT1 = 0x%x\n", aic_inb(p, SCSISEQ),
                   5792:              aic_inb(p, SEQADDR0) | (aic_inb(p, SEQADDR1) << 8),
                   5793:              aic_inb(p, SSTAT0), aic_inb(p, SSTAT1));
                   5794:       if (aic7xxx_panic_on_abort)
                   5795:         aic7xxx_panic_abort(p, NULL);
                   5796:     }
                   5797:     else
                   5798:     {
                   5799:       cmd = scb->cmd;
                   5800:       cmd->result = (DID_TIME_OUT << 16);
                   5801: 
                   5802:       /*
                   5803:        * Clear out this hardware SCB
                   5804:        */
                   5805:       aic_outb(p, 0, SCB_CONTROL);
                   5806: 
                   5807:       /*
                   5808:        * Clear out a few values in the card that are in an undetermined
                   5809:        * state.
                   5810:        */
                   5811:       aic_outb(p, MSG_NOOP, MSG_OUT);
                   5812: 
                   5813:       /*
                   5814:        * Shift the waiting for selection queue forward
                   5815:        */
                   5816:       nextscb = aic_inb(p, SCB_NEXT);
                   5817:       aic_outb(p, nextscb, WAITING_SCBH);
                   5818: 
                   5819:       /*
                   5820:        * Put this SCB back on the free list.
                   5821:        */
                   5822:       aic7xxx_add_curscb_to_free_list(p);
                   5823:       /*
                   5824:        * XXX - If we queued an abort tag, go clean up the disconnected list.
                   5825:        * We know that this particular SCB had to be the queued abort since
                   5826:        * the disconnected SCB would have gotten a reconnect instead.
                   5827:        * However, if this is an abort command, then DID_TIMEOUT isn't
                   5828:        * appropriate, neither is returning the command for that matter.
                   5829:        * What we need to do then is to let the command timeout again so
                   5830:        * we get a reset since this abort just failed.
                   5831:        */
                   5832: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   5833:       if (aic7xxx_verbose > 0xffff)
                   5834:         printk(INFO_LEAD "Selection Timeout.\n", p->host_no, CTL_OF_SCB(scb));
                   5835: #endif
                   5836:       if (p->flags & SCB_QUEUED_ABORT)
                   5837:       {
                   5838:         cmd->result = 0;
                   5839:         scb->flags &= ~SCB_QUEUED_ABORT;
                   5840:         scb = NULL;
                   5841:       }
                   5842:     }
                   5843:     /*
                   5844:      * Restarting the sequencer will stop the selection and make sure devices
                   5845:      * are allowed to reselect in.
                   5846:      */
                   5847:     aic_outb(p, 0, SCSISEQ);
                   5848:     aic_outb(p, aic_inb(p, SIMODE1) & ~(ENREQINIT|ENBUSFREE), SIMODE1);
                   5849:     p->flags &= ~AHC_HANDLING_REQINITS;
                   5850:     aic_outb(p, CLRSELTIMEO | CLRBUSFREE, CLRSINT1);
                   5851:     aic_outb(p, CLRSCSIINT, CLRINT);
                   5852:     restart_sequencer(p);
                   5853:     unpause_sequencer(p, TRUE);
                   5854:   }
                   5855:   else if (scb == NULL)
                   5856:   {
                   5857:     printk(WARN_LEAD "aic7xxx_isr - referenced scb not valid "
                   5858:            "during scsiint 0x%x scb(%d)\n"
                   5859:            "      SIMODE0 0x%x, SIMODE1 0x%x, SSTAT0 0x%x, SEQADDR 0x%x\n",
                   5860:            p->host_no, -1, -1, -1, status, scb_index, aic_inb(p, SIMODE0),
                   5861:            aic_inb(p, SIMODE1), aic_inb(p, SSTAT0),
                   5862:            (aic_inb(p, SEQADDR1) << 8) | aic_inb(p, SEQADDR0));
                   5863:     /*
                   5864:      * Turn off the interrupt and set status to zero, so that it
                   5865:      * falls through the rest of the SCSIINT code.
                   5866:      */
                   5867:     aic_outb(p, status, CLRSINT1);
                   5868:     aic_outb(p, CLRSCSIINT, CLRINT);
                   5869:     unpause_sequencer(p, /* unpause always */ TRUE);
                   5870:     scb = NULL;
                   5871:   }
                   5872:   else if (status & SCSIPERR)
                   5873:   {
                   5874:     /*
                   5875:      * Determine the bus phase and queue an appropriate message.
                   5876:      */
                   5877:     char  *phase;
                   5878:     Scsi_Cmnd *cmd;
                   5879:     unsigned char mesg_out = MSG_NOOP;
                   5880:     unsigned char lastphase = aic_inb(p, LASTPHASE);
                   5881: 
                   5882:     cmd = scb->cmd;
                   5883:     switch (lastphase)
                   5884:     {
                   5885:       case P_DATAOUT:
                   5886:         phase = "Data-Out";
                   5887:         break;
                   5888:       case P_DATAIN:
                   5889:         phase = "Data-In";
                   5890:         mesg_out = MSG_INITIATOR_DET_ERR;
                   5891:         break;
                   5892:       case P_COMMAND:
                   5893:         phase = "Command";
                   5894:         break;
                   5895:       case P_MESGOUT:
                   5896:         phase = "Message-Out";
                   5897:         break;
                   5898:       case P_STATUS:
                   5899:         phase = "Status";
                   5900:         mesg_out = MSG_INITIATOR_DET_ERR;
                   5901:         break;
                   5902:       case P_MESGIN:
                   5903:         phase = "Message-In";
                   5904:         mesg_out = MSG_PARITY_ERROR;
                   5905:         break;
                   5906:       default:
                   5907:         phase = "unknown";
                   5908:         break;
                   5909:     }
                   5910: 
                   5911:     /*
                   5912:      * A parity error has occurred during a data
                   5913:      * transfer phase. Flag it and continue.
                   5914:      */
                   5915:     printk(WARN_LEAD "Parity error during %s phase.\n",
                   5916:            p->host_no, CTL_OF_SCB(scb), phase);
                   5917: 
                   5918:     /*
                   5919:      * We've set the hardware to assert ATN if we get a parity
                   5920:      * error on "in" phases, so all we need to do is stuff the
                   5921:      * message buffer with the appropriate message.  "In" phases
                   5922:      * have set mesg_out to something other than MSG_NOP.
                   5923:      */
                   5924:     if (mesg_out != MSG_NOOP)
                   5925:     {
                   5926:       aic_outb(p, mesg_out, MSG_OUT);
                   5927:       scb = NULL;
                   5928:     }
                   5929:     aic_outb(p, CLRSCSIPERR, CLRSINT1);
                   5930:     aic_outb(p, CLRSCSIINT, CLRINT);
                   5931:     unpause_sequencer(p, /* unpause_always */ TRUE);
                   5932:   }
                   5933:   else if ( (status & REQINIT) &&
                   5934:             (p->flags & AHC_HANDLING_REQINITS) )
                   5935:   {
                   5936: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   5937:     if (aic7xxx_verbose > 0xffff)
                   5938:       printk(INFO_LEAD "Handling REQINIT, SSTAT1=0x%x.\n", p->host_no,
                   5939:              CTL_OF_SCB(scb), aic_inb(p, SSTAT1));
                   5940: #endif
                   5941:     aic7xxx_handle_reqinit(p, scb);
                   5942:     return;
                   5943:   }
                   5944:   else
                   5945:   {
                   5946:     /*
                   5947:      * We don't know what's going on. Turn off the
                   5948:      * interrupt source and try to continue.
                   5949:      */
                   5950:     if (aic7xxx_verbose & VERBOSE_SCSIINT)
                   5951:       printk(INFO_LEAD "Unknown SCSIINT status, SSTAT1(0x%x).\n",
                   5952:         p->host_no, -1, -1, -1, status);
                   5953:     aic_outb(p, status, CLRSINT1);
                   5954:     aic_outb(p, CLRSCSIINT, CLRINT);
                   5955:     unpause_sequencer(p, /* unpause always */ TRUE);
                   5956:     scb = NULL;
                   5957:   }
                   5958:   if (scb != NULL)
                   5959:   {
                   5960:     aic7xxx_done(p, scb);
                   5961:   }
                   5962: }
                   5963: 
                   5964: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   5965: static void
                   5966: aic7xxx_check_scbs(struct aic7xxx_host *p, char *buffer)
                   5967: {
                   5968:   unsigned char saved_scbptr, free_scbh, dis_scbh, wait_scbh, temp;
                   5969:   int i, bogus, lost;
                   5970:   static unsigned char scb_status[AIC7XXX_MAXSCB];
                   5971: 
                   5972: #define SCB_NO_LIST 0
                   5973: #define SCB_FREE_LIST 1
                   5974: #define SCB_WAITING_LIST 2
                   5975: #define SCB_DISCONNECTED_LIST 4
                   5976: #define SCB_CURRENTLY_ACTIVE 8
                   5977: 
                   5978:   /*
                   5979:    * Note, these checks will fail on a regular basis once the machine moves
                   5980:    * beyond the bus scan phase.  The problem is race conditions concerning
                   5981:    * the scbs and where they are linked in.  When you have 30 or so commands
                   5982:    * outstanding on the bus, and run this twice with every interrupt, the
                   5983:    * chances get pretty good that you'll catch the sequencer with an SCB
                   5984:    * only partially linked in.  Therefore, once we pass the scan phase
                   5985:    * of the bus, we really should disable this function.
                   5986:    */
                   5987:   bogus = FALSE;
                   5988:   memset(&scb_status[0], 0, sizeof(scb_status));
                   5989:   pause_sequencer(p);
                   5990:   saved_scbptr = aic_inb(p, SCBPTR);
                   5991:   if (saved_scbptr >= p->scb_data->maxhscbs)
                   5992:   {
                   5993:     printk("Bogus SCBPTR %d\n", saved_scbptr);
                   5994:     bogus = TRUE;
                   5995:   }
                   5996:   scb_status[saved_scbptr] = SCB_CURRENTLY_ACTIVE;
                   5997:   free_scbh = aic_inb(p, FREE_SCBH);
                   5998:   if ( (free_scbh != SCB_LIST_NULL) &&
                   5999:        (free_scbh >= p->scb_data->maxhscbs) )
                   6000:   {
                   6001:     printk("Bogus FREE_SCBH %d\n", free_scbh);
                   6002:     bogus = TRUE;
                   6003:   }
                   6004:   else
                   6005:   {
                   6006:     temp = free_scbh;
                   6007:     while( (temp != SCB_LIST_NULL) && (temp < p->scb_data->maxhscbs) )
                   6008:     {
                   6009:       if(scb_status[temp] & 0x07)
                   6010:       {
                   6011:         printk("HSCB %d on multiple lists, status 0x%02x", temp,
                   6012:                scb_status[temp] | SCB_FREE_LIST);
                   6013:         bogus = TRUE;
                   6014:       }
                   6015:       scb_status[temp] |= SCB_FREE_LIST;
                   6016:       aic_outb(p, temp, SCBPTR);
                   6017:       temp = aic_inb(p, SCB_NEXT);
                   6018:     }
                   6019:   }
                   6020: 
                   6021:   dis_scbh = aic_inb(p, DISCONNECTED_SCBH);
                   6022:   if ( (dis_scbh != SCB_LIST_NULL) &&
                   6023:        (dis_scbh >= p->scb_data->maxhscbs) )
                   6024:   {
                   6025:     printk("Bogus DISCONNECTED_SCBH %d\n", dis_scbh);
                   6026:     bogus = TRUE;
                   6027:   }
                   6028:   else
                   6029:   {
                   6030:     temp = dis_scbh;
                   6031:     while( (temp != SCB_LIST_NULL) && (temp < p->scb_data->maxhscbs) )
                   6032:     {
                   6033:       if(scb_status[temp] & 0x07)
                   6034:       {
                   6035:         printk("HSCB %d on multiple lists, status 0x%02x", temp,
                   6036:                scb_status[temp] | SCB_DISCONNECTED_LIST);
                   6037:         bogus = TRUE;
                   6038:       }
                   6039:       scb_status[temp] |= SCB_DISCONNECTED_LIST;
                   6040:       aic_outb(p, temp, SCBPTR);
                   6041:       temp = aic_inb(p, SCB_NEXT);
                   6042:     }
                   6043:   }
                   6044:   
                   6045:   wait_scbh = aic_inb(p, WAITING_SCBH);
                   6046:   if ( (wait_scbh != SCB_LIST_NULL) &&
                   6047:        (wait_scbh >= p->scb_data->maxhscbs) )
                   6048:   {
                   6049:     printk("Bogus WAITING_SCBH %d\n", wait_scbh);
                   6050:     bogus = TRUE;
                   6051:   }
                   6052:   else
                   6053:   {
                   6054:     temp = wait_scbh;
                   6055:     while( (temp != SCB_LIST_NULL) && (temp < p->scb_data->maxhscbs) )
                   6056:     {
                   6057:       if(scb_status[temp] & 0x07)
                   6058:       {
                   6059:         printk("HSCB %d on multiple lists, status 0x%02x", temp,
                   6060:                scb_status[temp] | SCB_WAITING_LIST);
                   6061:         bogus = TRUE;
                   6062:       }
                   6063:       scb_status[temp] |= SCB_WAITING_LIST;
                   6064:       aic_outb(p, temp, SCBPTR);
                   6065:       temp = aic_inb(p, SCB_NEXT);
                   6066:     }
                   6067:   }
                   6068: 
                   6069:   lost=0;
                   6070:   for(i=0; i < p->scb_data->maxhscbs; i++)
                   6071:   {
                   6072:     aic_outb(p, i, SCBPTR);
                   6073:     temp = aic_inb(p, SCB_NEXT);
                   6074:     if ( ((temp != SCB_LIST_NULL) &&
                   6075:           (temp >= p->scb_data->maxhscbs)) )
                   6076:     {
                   6077:       printk("HSCB %d bad, SCB_NEXT invalid(%d).\n", i, temp);
                   6078:       bogus = TRUE;
                   6079:     }
                   6080:     if ( temp == i )
                   6081:     {
                   6082:       printk("HSCB %d bad, SCB_NEXT points to self.\n", i);
                   6083:       bogus = TRUE;
                   6084:     }
                   6085:     temp = aic_inb(p, SCB_PREV);
                   6086:     if ((temp != SCB_LIST_NULL) &&
                   6087:         (temp >= p->scb_data->maxhscbs))
                   6088:     {
                   6089:       printk("HSCB %d bad, SCB_PREV invalid(%d).\n", i, temp);
                   6090:       bogus = TRUE;
                   6091:     }
                   6092:     if (scb_status[i] == 0)
                   6093:       lost++;
                   6094:     if (lost > 1)
                   6095:     {
                   6096:       printk("Too many lost scbs.\n");
                   6097:       bogus=TRUE;
                   6098:     }
                   6099:   }
                   6100:   aic_outb(p, saved_scbptr, SCBPTR);
                   6101:   unpause_sequencer(p, FALSE);
                   6102:   if (bogus)
                   6103:   {
                   6104:     printk("Bogus parameters found in card SCB array structures.\n");
                   6105:     printk("%s\n", buffer);
                   6106:     aic7xxx_panic_abort(p, NULL);
                   6107:   }
                   6108:   return;
                   6109: }
                   6110: #endif
                   6111: 
                   6112: /*+F*************************************************************************
                   6113:  * Function:
                   6114:  *   aic7xxx_isr
                   6115:  *
                   6116:  * Description:
                   6117:  *   SCSI controller interrupt handler.
                   6118:  *-F*************************************************************************/
                   6119: static void
                   6120: aic7xxx_isr(int irq, void *dev_id, struct pt_regs *regs)
                   6121: {
                   6122:   struct aic7xxx_host *p;
                   6123:   unsigned char intstat;
                   6124: 
                   6125:   p = (struct aic7xxx_host *)dev_id;
                   6126: 
                   6127:   /*
                   6128:    * Just a few sanity checks.  Make sure that we have an int pending.
                   6129:    * Also, if PCI, then we are going to check for a PCI bus error status
                   6130:    * should we get too many spurious interrupts.
                   6131:    */
                   6132:   if (!((intstat = aic_inb(p, INTSTAT)) & INT_PEND))
                   6133:   {
                   6134: #ifdef CONFIG_PCI
                   6135:     if ( (p->chip & AHC_PCI) && (p->spurious_int > 500) &&
                   6136:         !(p->flags & AHC_HANDLING_REQINITS) )
                   6137:     {
                   6138:       if ( aic_inb(p, ERROR) & PCIERRSTAT )
                   6139:       {
                   6140:         aic7xxx_pci_intr(p);
                   6141:       }
                   6142:       p->spurious_int = 0;
                   6143:     }
                   6144:     else if ( !(p->flags & AHC_HANDLING_REQINITS) )
                   6145:     {
                   6146:       p->spurious_int++;
                   6147:     }
                   6148: #endif
                   6149:     return;
                   6150:   }
                   6151: 
                   6152:   p->spurious_int = 0;
                   6153: 
                   6154:   /*
                   6155:    * Keep track of interrupts for /proc/scsi
                   6156:    */
                   6157:   p->isr_count++;
                   6158: 
                   6159: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   6160:   if ( (p->isr_count < 16) && (aic7xxx_verbose > 0xffff) &&
                   6161:        (aic7xxx_panic_on_abort) && (p->flags & AHC_PAGESCBS) )
                   6162:     aic7xxx_check_scbs(p, "Bogus settings at start of interrupt.");
                   6163: #endif
                   6164: 
                   6165:   /*
                   6166:    * Handle all the interrupt sources - especially for SCSI
                   6167:    * interrupts, we won't get a second chance at them.
                   6168:    */
                   6169:   if (intstat & CMDCMPLT)
                   6170:   {
                   6171:     struct aic7xxx_scb *scb = NULL;
                   6172:     Scsi_Cmnd *cmd;
                   6173:     unsigned char scb_index;
                   6174: 
                   6175: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   6176:     if(aic7xxx_verbose > 0xffff)
                   6177:       printk(INFO_LEAD "Command Complete Int.\n", p->host_no, -1, -1, -1);
                   6178: #endif
                   6179:     
                   6180:     /*
                   6181:      * Clear interrupt status before running the completion loop.
                   6182:      * This eliminates a race condition whereby a command could
                   6183:      * complete between the last check of qoutfifo and the
                   6184:      * CLRCMDINT statement.  This would result in us thinking the
                   6185:      * qoutfifo was empty when it wasn't, and in actuality be a lost
                   6186:      * completion interrupt.  With multiple devices or tagged queueing
                   6187:      * this could be very bad if we caught all but the last completion
                   6188:      * and no more are imediately sent.
                   6189:      */
                   6190:     aic_outb(p, CLRCMDINT, CLRINT);
                   6191:     /*
                   6192:      * The sequencer will continue running when it
                   6193:      * issues this interrupt. There may be >1 commands
                   6194:      * finished, so loop until we've processed them all.
                   6195:      */
                   6196: 
                   6197:     while (p->qoutfifo[p->qoutfifonext] != SCB_LIST_NULL)
                   6198:     {
                   6199:       scb_index = p->qoutfifo[p->qoutfifonext];
                   6200:       p->qoutfifo[p->qoutfifonext++] = SCB_LIST_NULL;
                   6201:       if ( scb_index >= p->scb_data->numscbs )
                   6202:         scb = NULL;
                   6203:       else
                   6204:         scb = p->scb_data->scb_array[scb_index];
                   6205:       if (scb == NULL)
                   6206:       {
                   6207:         printk(WARN_LEAD "CMDCMPLT with invalid SCB index %d\n", p->host_no,
                   6208:           -1, -1, -1, scb_index);
                   6209:         continue;
                   6210:       }
                   6211:       else if (!(scb->flags & SCB_ACTIVE) || (scb->cmd == NULL))
                   6212:       {
                   6213:         printk(WARN_LEAD "CMDCMPLT without command for SCB %d, SCB flags "
                   6214:           "0x%x, cmd 0x%lx\n", p->host_no, -1, -1, -1, scb_index, scb->flags,
                   6215:           (unsigned long) scb->cmd);
                   6216:         continue;
                   6217:       }
                   6218:       else if (scb->flags & SCB_QUEUED_ABORT)
                   6219:       {
                   6220:         pause_sequencer(p);
                   6221:         if ( ((aic_inb(p, LASTPHASE) & PHASE_MASK) != P_BUSFREE) &&
                   6222:              (aic_inb(p, SCB_TAG) == scb->hscb->tag) )
                   6223:         {
                   6224:           unpause_sequencer(p, FALSE);
                   6225:           continue;
                   6226:         }
                   6227:         aic7xxx_reset_device(p, scb->cmd->target, scb->cmd->channel,
                   6228:           scb->cmd->lun, scb->hscb->tag);
                   6229:         scb->flags &= ~(SCB_QUEUED_FOR_DONE | SCB_RESET | SCB_ABORT |
                   6230:           SCB_QUEUED_ABORT);
                   6231:         unpause_sequencer(p, FALSE);
                   6232:       }
                   6233:       else if (scb->flags & SCB_ABORT)
                   6234:       {
                   6235:         /*
                   6236:          * We started to abort this, but it completed on us, let it
                   6237:          * through as successful
                   6238:          */
                   6239:         scb->flags &= ~(SCB_ABORT|SCB_RESET);
                   6240:       }
                   6241:       switch (status_byte(scb->hscb->target_status))
                   6242:       {
                   6243:         case QUEUE_FULL:
                   6244:         case BUSY:
                   6245:           scb->hscb->target_status = 0;
                   6246:           scb->cmd->result = 0;
                   6247:           aic7xxx_error(scb->cmd) = DID_OK;
                   6248:           break;
                   6249:         default:
                   6250:           cmd = scb->cmd;
                   6251:           if (scb->hscb->residual_SG_segment_count != 0)
                   6252:           {
                   6253:             aic7xxx_calculate_residual(p, scb);
                   6254:           }
                   6255:           cmd->result |= (aic7xxx_error(cmd) << 16);
                   6256:           if (scb->tag_action)
                   6257:             p->dev_flags[TARGET_INDEX(cmd)] |= 
                   6258:                DEVICE_TAGGED_SUCCESS | DEVICE_SUCCESS | DEVICE_PRESENT;
                   6259:           else
                   6260:             p->dev_flags[TARGET_INDEX(cmd)] |= 
                   6261:                DEVICE_SUCCESS | DEVICE_PRESENT;
                   6262:           aic7xxx_done(p, scb);
                   6263:           break;
                   6264:       }      
                   6265:     }
                   6266:   }
                   6267: 
                   6268:   if (intstat & BRKADRINT)
                   6269:   {
                   6270:     int i;
                   6271:     unsigned char errno = aic_inb(p, ERROR);
                   6272: 
                   6273:     printk(KERN_ERR "(scsi%d) BRKADRINT error(0x%x):\n", p->host_no, errno);
                   6274:     for (i = 0; i < NUMBER(hard_error); i++)
                   6275:     {
                   6276:       if (errno & hard_error[i].errno)
                   6277:       {
                   6278:         printk(KERN_ERR "  %s\n", hard_error[i].errmesg);
                   6279:       }
                   6280:     }
                   6281:     printk(KERN_ERR "(scsi%d)   SEQADDR=0x%x\n", p->host_no,
                   6282:       (((aic_inb(p, SEQADDR1) << 8) & 0x100) | aic_inb(p, SEQADDR0)));
                   6283:     if (aic7xxx_panic_on_abort)
                   6284:       aic7xxx_panic_abort(p, NULL);
                   6285: #ifdef CONFIG_PCI
                   6286:     if (errno & PCIERRSTAT)
                   6287:       aic7xxx_pci_intr(p);
                   6288: #endif
                   6289:     if (errno & (SQPARERR | ILLOPCODE | ILLSADDR))
                   6290:     {
                   6291:       sti();
                   6292:       panic("aic7xxx: unrecoverable BRKADRINT.\n");
                   6293:     }
                   6294:     if (errno & ILLHADDR)
                   6295:     {
                   6296:       printk(KERN_ERR "(scsi%d) BUG! Driver accessed chip without first "
                   6297:              "pausing controller!\n", p->host_no);
                   6298:     }
                   6299: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   6300:     if (errno & DPARERR)
                   6301:     {
                   6302:       if (aic_inb(p, DMAPARAMS) & DIRECTION)
                   6303:         printk("(scsi%d) while DMAing SCB from host to card.\n", p->host_no);
                   6304:       else
                   6305:         printk("(scsi%d) while DMAing SCB from card to host.\n", p->host_no);
                   6306:     }
                   6307: #endif
                   6308:     aic_outb(p, CLRPARERR | CLRBRKADRINT, CLRINT);
                   6309:     unpause_sequencer(p, FALSE);
                   6310:   }
                   6311: 
                   6312:   if (intstat & SEQINT)
                   6313:   {
                   6314:     aic7xxx_handle_seqint(p, intstat);
                   6315:   }
                   6316: 
                   6317:   if (intstat & SCSIINT)
                   6318:   {
                   6319:     aic7xxx_handle_scsiint(p, intstat);
                   6320:   }
                   6321: 
                   6322: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   6323:   if ( (p->isr_count < 16) && (aic7xxx_verbose > 0xffff) &&
                   6324:        (aic7xxx_panic_on_abort) && (p->flags & AHC_PAGESCBS) )
                   6325:     aic7xxx_check_scbs(p, "Bogus settings at end of interrupt.");
                   6326: #endif
                   6327: 
                   6328: }
                   6329: 
                   6330: /*+F*************************************************************************
                   6331:  * Function:
                   6332:  *   do_aic7xxx_isr
                   6333:  *
                   6334:  * Description:
                   6335:  *   This is a gross hack to solve a problem in linux kernels 2.1.85 and
                   6336:  *   above.  Please, children, do not try this at home, and if you ever see
                   6337:  *   anything like it, please inform the Gross Hack Police immediately
                   6338:  *-F*************************************************************************/
                   6339: static void
                   6340: do_aic7xxx_isr(int irq, void *dev_id, struct pt_regs *regs)
                   6341: {
                   6342:   unsigned long cpu_flags;
                   6343:   struct aic7xxx_host *p;
                   6344:   
                   6345:   p = (struct aic7xxx_host *)dev_id;
                   6346:   if(!p)
                   6347:     return;
                   6348: #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,95)
                   6349:   spin_lock_irqsave(&io_request_lock, cpu_flags);
                   6350:   if(test_and_set_bit(AHC_IN_ISR_BIT, &p->flags))
                   6351:   {
                   6352:     return;
                   6353:   }
                   6354:   do
                   6355:   {
                   6356:     aic7xxx_isr(irq, dev_id, regs);
                   6357:   } while ( (aic_inb(p, INTSTAT) & INT_PEND) );
                   6358:   aic7xxx_done_cmds_complete(p);
                   6359:   aic7xxx_run_waiting_queues(p);
                   6360:   clear_bit(AHC_IN_ISR_BIT, &p->flags);
                   6361:   spin_unlock_irqrestore(&io_request_lock, cpu_flags);
                   6362: #else
                   6363:   if(set_bit(AHC_IN_ISR_BIT, (int *)&p->flags))
                   6364:   {
                   6365:     return;
                   6366:   }
                   6367:   DRIVER_LOCK
                   6368:   do
                   6369:   {
                   6370:     aic7xxx_isr(irq, dev_id, regs);
                   6371:   } while ( (aic_inb(p, INTSTAT) & INT_PEND) );
                   6372:   DRIVER_UNLOCK
                   6373:   aic7xxx_done_cmds_complete(p);
                   6374:   aic7xxx_run_waiting_queues(p);
                   6375:   clear_bit(AHC_IN_ISR_BIT, (int *)&p->flags);
                   6376: #endif
                   6377: }
                   6378: 
                   6379: /*+F*************************************************************************
                   6380:  * Function:
                   6381:  *   aic7xxx_device_queue_depth
                   6382:  *
                   6383:  * Description:
                   6384:  *   Determines the queue depth for a given device.  There are two ways
                   6385:  *   a queue depth can be obtained for a tagged queueing device.  One
                   6386:  *   way is the default queue depth which is determined by whether
                   6387:  *   AIC7XXX_CMDS_PER_LUN is defined.  If it is defined, then it is used
                   6388:  *   as the default queue depth.  Otherwise, we use either 4 or 8 as the
                   6389:  *   default queue depth (dependent on the number of hardware SCBs).
                   6390:  *   The other way we determine queue depth is through the use of the
                   6391:  *   aic7xxx_tag_info array which is enabled by defining
                   6392:  *   AIC7XXX_TAGGED_QUEUEING_BY_DEVICE.  This array can be initialized
                   6393:  *   with queue depths for individual devices.  It also allows tagged
                   6394:  *   queueing to be [en|dis]abled for a specific adapter.
                   6395:  *-F*************************************************************************/
                   6396: static void
                   6397: aic7xxx_device_queue_depth(struct aic7xxx_host *p, Scsi_Device *device)
                   6398: {
                   6399:   int default_depth = 3;
                   6400:   unsigned char tindex;
                   6401:   unsigned short target_mask;
                   6402: 
                   6403:   tindex = device->id | (device->channel << 3);
                   6404:   target_mask = (1 << tindex);
                   6405: 
                   6406:   device->queue_depth = default_depth;
                   6407:   p->dev_mid_level_queue_depth[tindex] = 3;
                   6408:   p->dev_temp_queue_depth[tindex] = 1;
                   6409:   p->dev_max_queue_depth[tindex] = 1;
                   6410:   p->tagenable &= ~target_mask;
                   6411: 
                   6412:   if (device->tagged_supported)
                   6413:   {
                   6414:     int tag_enabled = TRUE;
                   6415: 
                   6416: #ifdef AIC7XXX_CMDS_PER_LUN
                   6417:     default_depth = AIC7XXX_CMDS_PER_LUN;
                   6418: #else
                   6419:     default_depth = 8;  /* Not many SCBs to work with. */
                   6420: #endif
                   6421:  
                   6422:     if (!(p->discenable & target_mask))
                   6423:     {
                   6424:       if (aic7xxx_verbose & VERBOSE_NEGOTIATION2)
                   6425:         printk(INFO_LEAD "Disconnection disabled, unable to "
                   6426:              "enable tagged queueing.\n",
                   6427:              p->host_no, device->channel, device->id, device->lun);
                   6428:     }
                   6429:     else
                   6430:     {
                   6431:       if (p->instance >= NUMBER(aic7xxx_tag_info))
                   6432:       {
                   6433:         static int print_warning = TRUE;
                   6434:         if(print_warning)
                   6435:         {
                   6436:           printk(KERN_INFO "aic7xxx: WARNING, insufficient tag_info instances for"
                   6437:                            " installed controllers.\n");
                   6438:           printk(KERN_INFO "aic7xxx: Please update the aic7xxx_tag_info array in"
                   6439:                            " the aic7xxx.c source file.\n");
                   6440:           print_warning = FALSE;
                   6441:         }
                   6442:         device->queue_depth = default_depth;
                   6443:       }
                   6444:       else
                   6445:       {
                   6446: 
                   6447:         if (aic7xxx_tag_info[p->instance].tag_commands[tindex] == 255)
                   6448:         {
                   6449:           tag_enabled = FALSE;
                   6450:           device->queue_depth = 3;  /* Tagged queueing is disabled. */
                   6451:         }
                   6452:         else if (aic7xxx_tag_info[p->instance].tag_commands[tindex] == 0)
                   6453:         {
                   6454:           device->queue_depth = default_depth;
                   6455:         }
                   6456:         else
                   6457:         {
                   6458:           device->queue_depth =
                   6459:             aic7xxx_tag_info[p->instance].tag_commands[tindex];
                   6460:         }
                   6461:       }
                   6462:       if ((device->tagged_queue == 0) && tag_enabled)
                   6463:       {
                   6464:         if (aic7xxx_verbose & VERBOSE_NEGOTIATION2)
                   6465:         {
                   6466:               printk(INFO_LEAD "Enabled tagged queuing, queue depth %d.\n",
                   6467:                 p->host_no, device->channel, device->id,
                   6468:                 device->lun, device->queue_depth);
                   6469:         }
                   6470:         p->dev_max_queue_depth[tindex] = device->queue_depth;
                   6471:         p->dev_temp_queue_depth[tindex] = device->queue_depth;
                   6472:         p->dev_mid_level_queue_depth[tindex] = device->queue_depth;
                   6473:         p->tagenable |= target_mask;
                   6474:         p->orderedtag |= target_mask;
                   6475:         device->tagged_queue = 1;
                   6476:         device->current_tag = SCB_LIST_NULL;
                   6477:       }
                   6478:     }
                   6479:   }
                   6480: }
                   6481: 
                   6482: /*+F*************************************************************************
                   6483:  * Function:
                   6484:  *   aic7xxx_select_queue_depth
                   6485:  *
                   6486:  * Description:
                   6487:  *   Sets the queue depth for each SCSI device hanging off the input
                   6488:  *   host adapter.  We use a queue depth of 2 for devices that do not
                   6489:  *   support tagged queueing.  If AIC7XXX_CMDS_PER_LUN is defined, we
                   6490:  *   use that for tagged queueing devices; otherwise we use our own
                   6491:  *   algorithm for determining the queue depth based on the maximum
                   6492:  *   SCBs for the controller.
                   6493:  *-F*************************************************************************/
                   6494: static void
                   6495: aic7xxx_select_queue_depth(struct Scsi_Host *host,
                   6496:     Scsi_Device *scsi_devs)
                   6497: {
                   6498:   Scsi_Device *device;
                   6499:   struct aic7xxx_host *p = (struct aic7xxx_host *) host->hostdata;
                   6500:   int scbnum;
                   6501: 
                   6502:   scbnum = 0;
                   6503:   for (device = scsi_devs; device != NULL; device = device->next)
                   6504:   {
                   6505:     if (device->host == host)
                   6506:     {
                   6507:       aic7xxx_device_queue_depth(p, device);
                   6508:       scbnum += device->queue_depth;
                   6509:     }
                   6510:   }
                   6511:   while (scbnum > p->scb_data->numscbs)
                   6512:   {
                   6513:     /*
                   6514:      * Pre-allocate the needed SCBs to get around the possibility of having
                   6515:      * to allocate some when memory is more or less exhausted and we need
                   6516:      * the SCB in order to perform a swap operation (possible deadlock)
                   6517:      */
                   6518:     if ( aic7xxx_allocate_scb(p) == 0 )
                   6519:       return;
                   6520:   }
                   6521: }
                   6522: 
                   6523: /*+F*************************************************************************
                   6524:  * Function:
                   6525:  *   aic7xxx_probe
                   6526:  *
                   6527:  * Description:
                   6528:  *   Probing for EISA boards: it looks like the first two bytes
                   6529:  *   are a manufacturer code - three characters, five bits each:
                   6530:  *
                   6531:  *               BYTE 0   BYTE 1   BYTE 2   BYTE 3
                   6532:  *              ?1111122 22233333 PPPPPPPP RRRRRRRR
                   6533:  *
                   6534:  *   The characters are baselined off ASCII '@', so add that value
                   6535:  *   to each to get the real ASCII code for it. The next two bytes
                   6536:  *   appear to be a product and revision number, probably vendor-
                   6537:  *   specific. This is what is being searched for at each port,
                   6538:  *   and what should probably correspond to the ID= field in the
                   6539:  *   ECU's .cfg file for the card - if your card is not detected,
                   6540:  *   make sure your signature is listed in the array.
                   6541:  *
                   6542:  *   The fourth byte's lowest bit seems to be an enabled/disabled
                   6543:  *   flag (rest of the bits are reserved?).
                   6544:  *
                   6545:  * NOTE:  This function is only needed on Intel and Alpha platforms,
                   6546:  *   the other platforms we support don't have EISA/VLB busses.  So,
                   6547:  *   we #ifdef this entire function to avoid compiler warnings about
                   6548:  *   an unused function.
                   6549:  *-F*************************************************************************/
                   6550: #if defined(__i386__) || defined(__alpha__)
                   6551: static int
                   6552: aic7xxx_probe(int slot, int base, ahc_flag_type *flags)
                   6553: {
                   6554:   int i;
                   6555:   unsigned char buf[4];
                   6556: 
                   6557:   static struct {
                   6558:     int n;
                   6559:     unsigned char signature[sizeof(buf)];
                   6560:     ahc_chip type;
                   6561:     int bios_disabled;
                   6562:   } AIC7xxx[] = {
                   6563:     { 4, { 0x04, 0x90, 0x77, 0x70 },
                   6564:       AHC_AIC7770|AHC_EISA, FALSE },  /* mb 7770  */
                   6565:     { 4, { 0x04, 0x90, 0x77, 0x71 },
                   6566:       AHC_AIC7770|AHC_EISA, FALSE }, /* host adapter 274x */
                   6567:     { 4, { 0x04, 0x90, 0x77, 0x56 },
                   6568:       AHC_AIC7770|AHC_VL, FALSE }, /* 284x BIOS enabled */
                   6569:     { 4, { 0x04, 0x90, 0x77, 0x57 },
                   6570:       AHC_AIC7770|AHC_VL, TRUE }   /* 284x BIOS disabled */
                   6571:   };
                   6572: 
                   6573:   /*
                   6574:    * The VL-bus cards need to be primed by
                   6575:    * writing before a signature check.
                   6576:    */
                   6577:   for (i = 0; i < sizeof(buf); i++)
                   6578:   {
                   6579:     outb(0x80 + i, base);
                   6580:     buf[i] = inb(base + i);
                   6581:   }
                   6582: 
                   6583:   for (i = 0; i < NUMBER(AIC7xxx); i++)
                   6584:   {
                   6585:     /*
                   6586:      * Signature match on enabled card?
                   6587:      */
                   6588:     if (!memcmp(buf, AIC7xxx[i].signature, AIC7xxx[i].n))
                   6589:     {
                   6590:       if (inb(base + 4) & 1)
                   6591:       {
                   6592:         if (AIC7xxx[i].bios_disabled)
                   6593:         {
                   6594:           *flags |= AHC_USEDEFAULTS;
                   6595:         }
                   6596:         else
                   6597:         {
                   6598:           *flags |= AHC_BIOS_ENABLED;
                   6599:         }
                   6600:         return (i);
                   6601:       }
                   6602: 
                   6603:       printk("aic7xxx: <Adaptec 7770 SCSI Host Adapter> "
                   6604:              "disabled at slot %d, ignored.\n", slot);
                   6605:     }
                   6606:   }
                   6607: 
                   6608:   return (-1);
                   6609: }
                   6610: #endif /* (__i386__) || (__alpha__) */
                   6611: 
                   6612: 
                   6613: /*+F*************************************************************************
                   6614:  * Function:
                   6615:  *   read_2840_seeprom
                   6616:  *
                   6617:  * Description:
                   6618:  *   Reads the 2840 serial EEPROM and returns 1 if successful and 0 if
                   6619:  *   not successful.
                   6620:  *
                   6621:  *   See read_seeprom (for the 2940) for the instruction set of the 93C46
                   6622:  *   chip.
                   6623:  *
                   6624:  *   The 2840 interface to the 93C46 serial EEPROM is through the
                   6625:  *   STATUS_2840 and SEECTL_2840 registers.  The CS_2840, CK_2840, and
                   6626:  *   DO_2840 bits of the SEECTL_2840 register are connected to the chip
                   6627:  *   select, clock, and data out lines respectively of the serial EEPROM.
                   6628:  *   The DI_2840 bit of the STATUS_2840 is connected to the data in line
                   6629:  *   of the serial EEPROM.  The EEPROM_TF bit of STATUS_2840 register is
                   6630:  *   useful in that it gives us an 800 nsec timer.  After a read from the
                   6631:  *   SEECTL_2840 register the timing flag is cleared and goes high 800 nsec
                   6632:  *   later.
                   6633:  *-F*************************************************************************/
                   6634: static int
                   6635: read_284x_seeprom(struct aic7xxx_host *p, struct seeprom_config *sc)
                   6636: {
                   6637:   int i = 0, k = 0;
                   6638:   unsigned char temp;
                   6639:   unsigned short checksum = 0;
                   6640:   unsigned short *seeprom = (unsigned short *) sc;
                   6641:   struct seeprom_cmd {
                   6642:     unsigned char len;
                   6643:     unsigned char bits[3];
                   6644:   };
                   6645:   struct seeprom_cmd seeprom_read = {3, {1, 1, 0}};
                   6646: 
                   6647: #define CLOCK_PULSE(p) \
                   6648:   while ((aic_inb(p, STATUS_2840) & EEPROM_TF) == 0)        \
                   6649:   {                                                \
                   6650:     ;  /* Do nothing */                                \
                   6651:   }                                                \
                   6652:   (void) aic_inb(p, SEECTL_2840);
                   6653: 
                   6654:   /*
                   6655:    * Read the first 32 registers of the seeprom.  For the 2840,
                   6656:    * the 93C46 SEEPROM is a 1024-bit device with 64 16-bit registers
                   6657:    * but only the first 32 are used by Adaptec BIOS.  The loop
                   6658:    * will range from 0 to 31.
                   6659:    */
                   6660:   for (k = 0; k < (sizeof(*sc) / 2); k++)
                   6661:   {
                   6662:     /*
                   6663:      * Send chip select for one clock cycle.
                   6664:      */
                   6665:     aic_outb(p, CK_2840 | CS_2840, SEECTL_2840);
                   6666:     CLOCK_PULSE(p);
                   6667: 
                   6668:     /*
                   6669:      * Now we're ready to send the read command followed by the
                   6670:      * address of the 16-bit register we want to read.
                   6671:      */
                   6672:     for (i = 0; i < seeprom_read.len; i++)
                   6673:     {
                   6674:       temp = CS_2840 | seeprom_read.bits[i];
                   6675:       aic_outb(p, temp, SEECTL_2840);
                   6676:       CLOCK_PULSE(p);
                   6677:       temp = temp ^ CK_2840;
                   6678:       aic_outb(p, temp, SEECTL_2840);
                   6679:       CLOCK_PULSE(p);
                   6680:     }
                   6681:     /*
                   6682:      * Send the 6 bit address (MSB first, LSB last).
                   6683:      */
                   6684:     for (i = 5; i >= 0; i--)
                   6685:     {
                   6686:       temp = k;
                   6687:       temp = (temp >> i) & 1;  /* Mask out all but lower bit. */
                   6688:       temp = CS_2840 | temp;
                   6689:       aic_outb(p, temp, SEECTL_2840);
                   6690:       CLOCK_PULSE(p);
                   6691:       temp = temp ^ CK_2840;
                   6692:       aic_outb(p, temp, SEECTL_2840);
                   6693:       CLOCK_PULSE(p);
                   6694:     }
                   6695: 
                   6696:     /*
                   6697:      * Now read the 16 bit register.  An initial 0 precedes the
                   6698:      * register contents which begins with bit 15 (MSB) and ends
                   6699:      * with bit 0 (LSB).  The initial 0 will be shifted off the
                   6700:      * top of our word as we let the loop run from 0 to 16.
                   6701:      */
                   6702:     for (i = 0; i <= 16; i++)
                   6703:     {
                   6704:       temp = CS_2840;
                   6705:       aic_outb(p, temp, SEECTL_2840);
                   6706:       CLOCK_PULSE(p);
                   6707:       temp = temp ^ CK_2840;
                   6708:       seeprom[k] = (seeprom[k] << 1) | (aic_inb(p, STATUS_2840) & DI_2840);
                   6709:       aic_outb(p, temp, SEECTL_2840);
                   6710:       CLOCK_PULSE(p);
                   6711:     }
                   6712:     /*
                   6713:      * The serial EEPROM has a checksum in the last word.  Keep a
                   6714:      * running checksum for all words read except for the last
                   6715:      * word.  We'll verify the checksum after all words have been
                   6716:      * read.
                   6717:      */
                   6718:     if (k < (sizeof(*sc) / 2) - 1)
                   6719:     {
                   6720:       checksum = checksum + seeprom[k];
                   6721:     }
                   6722: 
                   6723:     /*
                   6724:      * Reset the chip select for the next command cycle.
                   6725:      */
                   6726:     aic_outb(p, 0, SEECTL_2840);
                   6727:     CLOCK_PULSE(p);
                   6728:     aic_outb(p, CK_2840, SEECTL_2840);
                   6729:     CLOCK_PULSE(p);
                   6730:     aic_outb(p, 0, SEECTL_2840);
                   6731:     CLOCK_PULSE(p);
                   6732:   }
                   6733: 
                   6734: #if 0
                   6735:   printk("Computed checksum 0x%x, checksum read 0x%x\n", checksum, sc->checksum);
                   6736:   printk("Serial EEPROM:");
                   6737:   for (k = 0; k < (sizeof(*sc) / 2); k++)
                   6738:   {
                   6739:     if (((k % 8) == 0) && (k != 0))
                   6740:     {
                   6741:       printk("\n              ");
                   6742:     }
                   6743:     printk(" 0x%x", seeprom[k]);
                   6744:   }
                   6745:   printk("\n");
                   6746: #endif
                   6747: 
                   6748:   if (checksum != sc->checksum)
                   6749:   {
                   6750:     printk("aic7xxx: SEEPROM checksum error, ignoring SEEPROM settings.\n");
                   6751:     return (0);
                   6752:   }
                   6753: 
                   6754:   return (1);
                   6755: #undef CLOCK_PULSE
                   6756: }
                   6757: 
                   6758: /*+F*************************************************************************
                   6759:  * Function:
                   6760:  *   acquire_seeprom
                   6761:  *
                   6762:  * Description:
                   6763:  *   Acquires access to the memory port on PCI controllers.
                   6764:  *-F*************************************************************************/
                   6765: static int
                   6766: acquire_seeprom(struct aic7xxx_host *p)
                   6767: {
                   6768:   int wait;
                   6769: 
                   6770:   /*
                   6771:    * Request access of the memory port.  When access is
                   6772:    * granted, SEERDY will go high.  We use a 1 second
                   6773:    * timeout which should be near 1 second more than
                   6774:    * is needed.  Reason: after the 7870 chip reset, there
                   6775:    * should be no contention.
                   6776:    */
                   6777:   aic_outb(p, SEEMS, SEECTL);
                   6778:   wait = 1000;  /* 1000 msec = 1 second */
                   6779:   while ((wait > 0) && ((aic_inb(p, SEECTL) & SEERDY) == 0))
                   6780:   {
                   6781:     wait--;
                   6782:     mdelay(1);  /* 1 msec */
                   6783:   }
                   6784:   if ((aic_inb(p, SEECTL) & SEERDY) == 0)
                   6785:   {
                   6786:     aic_outb(p, 0, SEECTL);
                   6787:     return (0);
                   6788:   }
                   6789:   return (1);
                   6790: }
                   6791: 
                   6792: /*+F*************************************************************************
                   6793:  * Function:
                   6794:  *   release_seeprom
                   6795:  *
                   6796:  * Description:
                   6797:  *   Releases access to the memory port on PCI controllers.
                   6798:  *-F*************************************************************************/
                   6799: static void
                   6800: release_seeprom(struct aic7xxx_host *p)
                   6801: {
                   6802:   aic_outb(p, 0, SEECTL);
                   6803: }
                   6804: 
                   6805: /*+F*************************************************************************
                   6806:  * Function:
                   6807:  *   read_seeprom
                   6808:  *
                   6809:  * Description:
                   6810:  *   Reads the serial EEPROM and returns 1 if successful and 0 if
                   6811:  *   not successful.
                   6812:  *
                   6813:  *   The instruction set of the 93C46/56/66 chips is as follows:
                   6814:  *
                   6815:  *               Start  OP
                   6816:  *     Function   Bit  Code  Address    Data     Description
                   6817:  *     -------------------------------------------------------------------
                   6818:  *     READ        1    10   A5 - A0             Reads data stored in memory,
                   6819:  *                                               starting at specified address
                   6820:  *     EWEN        1    00   11XXXX              Write enable must precede
                   6821:  *                                               all programming modes
                   6822:  *     ERASE       1    11   A5 - A0             Erase register A5A4A3A2A1A0
                   6823:  *     WRITE       1    01   A5 - A0   D15 - D0  Writes register
                   6824:  *     ERAL        1    00   10XXXX              Erase all registers
                   6825:  *     WRAL        1    00   01XXXX    D15 - D0  Writes to all registers
                   6826:  *     EWDS        1    00   00XXXX              Disables all programming
                   6827:  *                                               instructions
                   6828:  *     *Note: A value of X for address is a don't care condition.
                   6829:  *     *Note: The 93C56 and 93C66 have 8 address bits.
                   6830:  * 
                   6831:  *
                   6832:  *   The 93C46 has a four wire interface: clock, chip select, data in, and
                   6833:  *   data out.  In order to perform one of the above functions, you need
                   6834:  *   to enable the chip select for a clock period (typically a minimum of
                   6835:  *   1 usec, with the clock high and low a minimum of 750 and 250 nsec
                   6836:  *   respectively.  While the chip select remains high, you can clock in
                   6837:  *   the instructions (above) starting with the start bit, followed by the
                   6838:  *   OP code, Address, and Data (if needed).  For the READ instruction, the
                   6839:  *   requested 16-bit register contents is read from the data out line but
                   6840:  *   is preceded by an initial zero (leading 0, followed by 16-bits, MSB
                   6841:  *   first).  The clock cycling from low to high initiates the next data
                   6842:  *   bit to be sent from the chip.
                   6843:  *
                   6844:  *   The 78xx interface to the 93C46 serial EEPROM is through the SEECTL
                   6845:  *   register.  After successful arbitration for the memory port, the
                   6846:  *   SEECS bit of the SEECTL register is connected to the chip select.
                   6847:  *   The SEECK, SEEDO, and SEEDI are connected to the clock, data out,
                   6848:  *   and data in lines respectively.  The SEERDY bit of SEECTL is useful
                   6849:  *   in that it gives us an 800 nsec timer.  After a write to the SEECTL
                   6850:  *   register, the SEERDY goes high 800 nsec later.  The one exception
                   6851:  *   to this is when we first request access to the memory port.  The
                   6852:  *   SEERDY goes high to signify that access has been granted and, for
                   6853:  *   this case, has no implied timing.
                   6854:  *-F*************************************************************************/
                   6855: static int
                   6856: read_seeprom(struct aic7xxx_host *p, int offset, 
                   6857:     unsigned short *scarray, unsigned int len, seeprom_chip_type chip)
                   6858: {
                   6859:   int i = 0, k;
                   6860:   unsigned char temp;
                   6861:   unsigned short checksum = 0;
                   6862:   struct seeprom_cmd {
                   6863:     unsigned char len;
                   6864:     unsigned char bits[3];
                   6865:   };
                   6866:   struct seeprom_cmd seeprom_read = {3, {1, 1, 0}};
                   6867: 
                   6868: #define CLOCK_PULSE(p) \
                   6869:   while ((aic_inb(p, SEECTL) & SEERDY) == 0)        \
                   6870:   {                                                \
                   6871:     ;  /* Do nothing */                                \
                   6872:   }
                   6873: 
                   6874:   /*
                   6875:    * Request access of the memory port.
                   6876:    */
                   6877:   if (acquire_seeprom(p) == 0)
                   6878:   {
                   6879:     return (0);
                   6880:   }
                   6881: 
                   6882:   /*
                   6883:    * Read 'len' registers of the seeprom.  For the 7870, the 93C46
                   6884:    * SEEPROM is a 1024-bit device with 64 16-bit registers but only
                   6885:    * the first 32 are used by Adaptec BIOS.  Some adapters use the
                   6886:    * 93C56 SEEPROM which is a 2048-bit device.  The loop will range
                   6887:    * from 0 to 'len' - 1.
                   6888:    */
                   6889:   for (k = 0; k < len; k++)
                   6890:   {
                   6891:     /*
                   6892:      * Send chip select for one clock cycle.
                   6893:      */
                   6894:     aic_outb(p, SEEMS | SEECK | SEECS, SEECTL);
                   6895:     CLOCK_PULSE(p);
                   6896: 
                   6897:     /*
                   6898:      * Now we're ready to send the read command followed by the
                   6899:      * address of the 16-bit register we want to read.
                   6900:      */
                   6901:     for (i = 0; i < seeprom_read.len; i++)
                   6902:     {
                   6903:       temp = SEEMS | SEECS | (seeprom_read.bits[i] << 1);
                   6904:       aic_outb(p, temp, SEECTL);
                   6905:       CLOCK_PULSE(p);
                   6906:       temp = temp ^ SEECK;
                   6907:       aic_outb(p, temp, SEECTL);
                   6908:       CLOCK_PULSE(p);
                   6909:     }
                   6910:     /*
                   6911:      * Send the 6 or 8 bit address (MSB first, LSB last).
                   6912:      */
                   6913:     for (i = ((int) chip - 1); i >= 0; i--)
                   6914:     {
                   6915:       temp = k + offset;
                   6916:       temp = (temp >> i) & 1;  /* Mask out all but lower bit. */
                   6917:       temp = SEEMS | SEECS | (temp << 1);
                   6918:       aic_outb(p, temp, SEECTL);
                   6919:       CLOCK_PULSE(p);
                   6920:       temp = temp ^ SEECK;
                   6921:       aic_outb(p, temp, SEECTL);
                   6922:       CLOCK_PULSE(p);
                   6923:     }
                   6924: 
                   6925:     /*
                   6926:      * Now read the 16 bit register.  An initial 0 precedes the
                   6927:      * register contents which begins with bit 15 (MSB) and ends
                   6928:      * with bit 0 (LSB).  The initial 0 will be shifted off the
                   6929:      * top of our word as we let the loop run from 0 to 16.
                   6930:      */
                   6931:     for (i = 0; i <= 16; i++)
                   6932:     {
                   6933:       temp = SEEMS | SEECS;
                   6934:       aic_outb(p, temp, SEECTL);
                   6935:       CLOCK_PULSE(p);
                   6936:       temp = temp ^ SEECK;
                   6937:       scarray[k] = (scarray[k] << 1) | (aic_inb(p, SEECTL) & SEEDI);
                   6938:       aic_outb(p, temp, SEECTL);
                   6939:       CLOCK_PULSE(p);
                   6940:     }
                   6941: 
                   6942:     /*
                   6943:      * The serial EEPROM should have a checksum in the last word.
                   6944:      * Keep a running checksum for all words read except for the
                   6945:      * last word.  We'll verify the checksum after all words have
                   6946:      * been read.
                   6947:      */
                   6948:     if (k < (len - 1))
                   6949:     {
                   6950:       checksum = checksum + scarray[k];
                   6951:     }
                   6952: 
                   6953:     /*
                   6954:      * Reset the chip select for the next command cycle.
                   6955:      */
                   6956:     aic_outb(p, SEEMS, SEECTL);
                   6957:     CLOCK_PULSE(p);
                   6958:     aic_outb(p, SEEMS | SEECK, SEECTL);
                   6959:     CLOCK_PULSE(p);
                   6960:     aic_outb(p, SEEMS, SEECTL);
                   6961:     CLOCK_PULSE(p);
                   6962:   }
                   6963: 
                   6964:   /*
                   6965:    * Release access to the memory port and the serial EEPROM.
                   6966:    */
                   6967:   release_seeprom(p);
                   6968: 
                   6969: #if 0
                   6970:   printk("Computed checksum 0x%x, checksum read 0x%x\n",
                   6971:          checksum, scarray[len - 1]);
                   6972:   printk("Serial EEPROM:");
                   6973:   for (k = 0; k < len; k++)
                   6974:   {
                   6975:     if (((k % 8) == 0) && (k != 0))
                   6976:     {
                   6977:       printk("\n              ");
                   6978:     }
                   6979:     printk(" 0x%x", scarray[k]);
                   6980:   }
                   6981:   printk("\n");
                   6982: #endif
                   6983:   if (checksum != scarray[len - 1])
                   6984:   {
                   6985:     return (0);
                   6986:   }
                   6987: 
                   6988:   return (1);
                   6989: #undef CLOCK_PULSE
                   6990: }
                   6991: 
                   6992: /*+F*************************************************************************
                   6993:  * Function:
                   6994:  *   write_brdctl
                   6995:  *
                   6996:  * Description:
                   6997:  *   Writes a value to the BRDCTL register.
                   6998:  *-F*************************************************************************/
                   6999: static void
                   7000: write_brdctl(struct aic7xxx_host *p, unsigned char value)
                   7001: {
                   7002:   unsigned char brdctl;
                   7003: 
                   7004:   if ((p->chip & AHC_CHIPID_MASK) == AHC_AIC7895)
                   7005:   {
                   7006:     brdctl = BRDSTB;
                   7007:     if (p->flags & AHC_CHNLB)
                   7008:       brdctl |= BRDCS;
                   7009:   }
                   7010:   else if (p->features & AHC_ULTRA2)
                   7011:     brdctl = 0;
                   7012:   else
                   7013:     brdctl = BRDSTB | BRDCS;
                   7014:   aic_outb(p, brdctl, BRDCTL);
                   7015:   udelay(1);
                   7016:   brdctl |= value;
                   7017:   aic_outb(p, brdctl, BRDCTL);
                   7018:   udelay(1);
                   7019:   if (p->features & AHC_ULTRA2)
                   7020:     brdctl |= BRDSTB_ULTRA2;
                   7021:   else
                   7022:     brdctl &= ~BRDSTB;
                   7023:   aic_outb(p, brdctl, BRDCTL);
                   7024:   udelay(1);
                   7025:   if (p->features & AHC_ULTRA2)
                   7026:     brdctl = 0;
                   7027:   else
                   7028:     brdctl &= ~BRDCS;
                   7029:   aic_outb(p, brdctl, BRDCTL);
                   7030:   udelay(1);
                   7031: }
                   7032: 
                   7033: /*+F*************************************************************************
                   7034:  * Function:
                   7035:  *   read_brdctl
                   7036:  *
                   7037:  * Description:
                   7038:  *   Reads the BRDCTL register.
                   7039:  *-F*************************************************************************/
                   7040: static unsigned char
                   7041: read_brdctl(struct aic7xxx_host *p)
                   7042: {
                   7043:   unsigned char brdctl, value;
                   7044: 
                   7045:   if ((p->chip & AHC_CHIPID_MASK) == AHC_AIC7895)
                   7046:   {
                   7047:     brdctl = BRDRW;
                   7048:     if (p->flags & AHC_CHNLB)
                   7049:       brdctl |= BRDCS;
                   7050:   }
                   7051:   else if (p->features & AHC_ULTRA2)
                   7052:     brdctl = BRDRW_ULTRA2;
                   7053:   else
                   7054:     brdctl = BRDRW | BRDCS;
                   7055:   aic_outb(p, brdctl, BRDCTL);
                   7056:   udelay(1);
                   7057:   value = aic_inb(p, BRDCTL);
                   7058:   aic_outb(p, 0, BRDCTL);
                   7059:   udelay(1);
                   7060:   return (value);
                   7061: }
                   7062: 
                   7063: /*+F*************************************************************************
                   7064:  * Function:
                   7065:  *   aic785x_cable_detect
                   7066:  *
                   7067:  * Description:
                   7068:  *   Detect the cables that are present on aic785x class controller chips
                   7069:  *-F*************************************************************************/
                   7070: static void
                   7071: aic785x_cable_detect(struct aic7xxx_host *p, int *int_50,
                   7072:     int *ext_present, int *eeprom)
                   7073: {
                   7074:   unsigned char brdctl;
                   7075: 
                   7076:   aic_outb(p, BRDRW | BRDCS, BRDCTL);
                   7077:   udelay(1);
                   7078:   aic_outb(p, 0, BRDCTL);
                   7079:   udelay(1);
                   7080:   brdctl = aic_inb(p, BRDCTL);
                   7081:   udelay(1);
                   7082:   *int_50 = !(brdctl & BRDDAT5);
                   7083:   *ext_present = !(brdctl & BRDDAT6);
                   7084:   *eeprom = (aic_inb(p, SPIOCAP) & EEPROM);
                   7085: }
                   7086: 
                   7087: /*+F*************************************************************************
                   7088:  * Function:
                   7089:  *   aic787x_cable_detect
                   7090:  *
                   7091:  * Description:
                   7092:  *   Detect the cables that are present on aic787x class controller chips
                   7093:  *
                   7094:  * NOTE: This functions assumes the SEEPROM will have already been aquired
                   7095:  *       prior to invocation of this function.
                   7096:  *-F*************************************************************************/
                   7097: static void
                   7098: aic787x_cable_detect(struct aic7xxx_host *p, int *int_50, int *int_68,
                   7099:     int *ext_present, int *eeprom)
                   7100: {
                   7101:   unsigned char brdctl;
                   7102: 
                   7103:   /*
                   7104:    * First read the status of our cables.  Set the rom bank to
                   7105:    * 0 since the bank setting serves as a multiplexor for the
                   7106:    * cable detection logic.  BRDDAT5 controls the bank switch.
                   7107:    */
                   7108:   write_brdctl(p, 0);
                   7109: 
                   7110:   /*
                   7111:    * Now we read the state of the two internal connectors.  BRDDAT6
                   7112:    * is internal 50, BRDDAT7 is internal 68.  For each, the cable is
                   7113:    * present if the bit is 0
                   7114:    */
                   7115:   brdctl = read_brdctl(p);
                   7116:   *int_50 = !(brdctl & BRDDAT6);
                   7117:   *int_68 = !(brdctl & BRDDAT7);
                   7118: 
                   7119:   /*
                   7120:    * Set the bank bit in brdctl and then read the external cable state
                   7121:    * and the EEPROM status
                   7122:    */
                   7123:   write_brdctl(p, BRDDAT5);
                   7124:   brdctl = read_brdctl(p);
                   7125: 
                   7126:   *ext_present = !(brdctl & BRDDAT6);
                   7127:   *eeprom = !(brdctl & BRDDAT7);
                   7128: 
                   7129:   /*
                   7130:    * We're done, the calling function will release the SEEPROM for us
                   7131:    */
                   7132: }
                   7133: 
                   7134: /*+F*************************************************************************
                   7135:  * Function:
                   7136:  *   aic787x_ultra2_term_detect
                   7137:  *
                   7138:  * Description:
                   7139:  *   Detect the termination settings present on ultra2 class controllers
                   7140:  *
                   7141:  * NOTE: This functions assumes the SEEPROM will have already been aquired
                   7142:  *       prior to invocation of this function.
                   7143:  *-F*************************************************************************/
                   7144: static void
                   7145: aic7xxx_ultra2_term_detect(struct aic7xxx_host *p, int *enableSE_low,
                   7146:                            int *enableSE_high, int *enableLVD_low,
                   7147:                            int *enableLVD_high, int *eprom_present)
                   7148: {
                   7149:   unsigned char brdctl;
                   7150: 
                   7151:   brdctl = read_brdctl(p);
                   7152: 
                   7153:   *eprom_present  = (brdctl & BRDDAT7);
                   7154:   *enableSE_high  = (brdctl & BRDDAT6);
                   7155:   *enableSE_low   = (brdctl & BRDDAT5);
                   7156:   *enableLVD_high = (brdctl & BRDDAT4);
                   7157:   *enableLVD_low  = (brdctl & BRDDAT3);
                   7158: }
                   7159: 
                   7160: /*+F*************************************************************************
                   7161:  * Function:
                   7162:  *   configure_termination
                   7163:  *
                   7164:  * Description:
                   7165:  *   Configures the termination settings on PCI adapters that have
                   7166:  *   SEEPROMs available.
                   7167:  *-F*************************************************************************/
                   7168: static void
                   7169: configure_termination(struct aic7xxx_host *p)
                   7170: {
                   7171:   int internal50_present = 0;
                   7172:   int internal68_present = 0;
                   7173:   int external_present = 0;
                   7174:   int eprom_present = 0;
                   7175:   int enableSE_low = 0;
                   7176:   int enableSE_high = 0;
                   7177:   int enableLVD_low = 0;
                   7178:   int enableLVD_high = 0;
                   7179:   unsigned char brddat = 0;
                   7180:   unsigned char max_target = 0;
                   7181:   unsigned char sxfrctl1 = aic_inb(p, SXFRCTL1);
                   7182: 
                   7183:   if (acquire_seeprom(p))
                   7184:   {
                   7185:     if (p->features & (AHC_WIDE|AHC_TWIN))
                   7186:       max_target = 16;
                   7187:     else
                   7188:       max_target = 8;
                   7189:     aic_outb(p, SEEMS | SEECS, SEECTL);
                   7190:     sxfrctl1 &= ~STPWEN;
                   7191:     if ( (p->adapter_control & CFAUTOTERM) ||
                   7192:          (p->features & AHC_ULTRA2) )
                   7193:     {
                   7194:       if ( (p->adapter_control & CFAUTOTERM) && !(p->features & AHC_ULTRA2) )
                   7195:       {
                   7196:         printk(KERN_INFO "(scsi%d) Warning - detected auto-termination\n",
                   7197:                p->host_no);
                   7198:         printk(KERN_INFO "(scsi%d) Please verify driver detected settings are "
                   7199:           "correct.\n", p->host_no);
                   7200:         printk(KERN_INFO "(scsi%d) If not, then please properly set the device "
                   7201:           "termination\n", p->host_no);
                   7202:         printk(KERN_INFO "(scsi%d) in the Adaptec SCSI BIOS by hitting CTRL-A "
                   7203:           "when prompted\n", p->host_no);
                   7204:         printk(KERN_INFO "(scsi%d) during machine bootup.\n", p->host_no);
                   7205:       }
                   7206:       /* Configure auto termination. */
                   7207: 
                   7208:       if (p->features & AHC_ULTRA2)
                   7209:       {
                   7210:         if (aic7xxx_override_term == -1)
                   7211:           aic7xxx_ultra2_term_detect(p, &enableSE_low, &enableSE_high,
                   7212:                                      &enableLVD_low, &enableLVD_high,
                   7213:                                      &eprom_present);
                   7214:         if (!(p->adapter_control & CFSEAUTOTERM))
                   7215:         {
                   7216:           enableSE_low = (p->adapter_control & CFSTERM);
                   7217:           enableSE_high = (p->adapter_control & CFWSTERM);
                   7218:         }
                   7219:         if (!(p->adapter_control & CFAUTOTERM))
                   7220:         {
                   7221:           enableLVD_low = enableLVD_high = (p->adapter_control & CFLVDSTERM);
                   7222:         }
                   7223:         internal50_present = 0;
                   7224:         internal68_present = 1;
                   7225:         external_present = 1;
                   7226:       }
                   7227:       else if ( (p->chip & AHC_CHIPID_MASK) >= AHC_AIC7870 )
                   7228:       {
                   7229:         aic787x_cable_detect(p, &internal50_present, &internal68_present,
                   7230:           &external_present, &eprom_present);
                   7231:       }
                   7232:       else
                   7233:       {
                   7234:         aic785x_cable_detect(p, &internal50_present, &external_present,
                   7235:           &eprom_present);
                   7236:       }
                   7237:       
                   7238:       if (max_target <= 8)
                   7239:         internal68_present = 0;
                   7240: 
                   7241:       if ( !(p->features & AHC_ULTRA2) )
                   7242:       {
                   7243:         if (max_target > 8)
                   7244:         {
                   7245:           printk(KERN_INFO "(scsi%d) Cables present (Int-50 %s, Int-68 %s, "
                   7246:                  "Ext-68 %s)\n", p->host_no,
                   7247:                  internal50_present ? "YES" : "NO",
                   7248:                  internal68_present ? "YES" : "NO",
                   7249:                  external_present ? "YES" : "NO");
                   7250:         }
                   7251:         else
                   7252:         {
                   7253:           printk(KERN_INFO "(scsi%d) Cables present (Int-50 %s, Ext-50 %s)\n",
                   7254:                  p->host_no,
                   7255:                  internal50_present ? "YES" : "NO",
                   7256:                  external_present ? "YES" : "NO");
                   7257:         }
                   7258:       }
                   7259:       if (aic7xxx_verbose & VERBOSE_PROBE2)
                   7260:         printk(KERN_INFO "(scsi%d) EEPROM %s present.\n", p->host_no,
                   7261:              eprom_present ? "is" : "is not");
                   7262: 
                   7263:       /*
                   7264:        * Now set the termination based on what we found.  BRDDAT6
                   7265:        * controls wide termination enable.
                   7266:        * Flash Enable = BRDDAT7
                   7267:        * SE High Term Enable = BRDDAT6
                   7268:        * SE Low Term Enable = BRDDAT5 (7890)
                   7269:        * LVD High Term Enable = BRDDAT4 (7890)
                   7270:        */
                   7271:       if ( !(p->features & AHC_ULTRA2) &&
                   7272:            (internal50_present && internal68_present && external_present) )
                   7273:       {
                   7274:         printk(KERN_INFO "(scsi%d) Illegal cable configuration!!  Only two\n",
                   7275:                p->host_no);
                   7276:         printk(KERN_INFO "(scsi%d) connectors on the SCSI controller may be "
                   7277:                "in use at a time!\n", p->host_no);
                   7278:         /*
                   7279:          * Force termination (low and high byte) on.  This is safer than
                   7280:          * leaving it completely off, especially since this message comes
                   7281:          * most often from motherboard controllers that don't even have 3
                   7282:          * connectors, but instead are failing the cable detection.
                   7283:          */
                   7284:         internal50_present = external_present = 0;
                   7285:         enableSE_high = enableSE_low = 1;
                   7286:       }
                   7287: 
                   7288:       if ((max_target > 8) &&
                   7289:           ((external_present == 0) || (internal68_present == 0) ||
                   7290:            (enableSE_high != 0)))
                   7291:       {
                   7292:         brddat |= BRDDAT6;
                   7293:         p->flags |= AHC_TERM_ENB_SE_HIGH;
                   7294:         if (aic7xxx_verbose & VERBOSE_PROBE2)
                   7295:           printk(KERN_INFO "(scsi%d) SE High byte termination Enabled\n",
                   7296:                  p->host_no);
                   7297:       }
                   7298: 
                   7299:       if ( (((internal50_present ? 1 : 0) +
                   7300:              (internal68_present ? 1 : 0) +
                   7301:              (external_present   ? 1 : 0)) <= 1) ||
                   7302:            (enableSE_low != 0) )
                   7303:       {
                   7304:         if (p->features & AHC_ULTRA2)
                   7305:           brddat |= BRDDAT5;
                   7306:         else
                   7307:           sxfrctl1 |= STPWEN;
                   7308:         p->flags |= AHC_TERM_ENB_SE_LOW;
                   7309:         if (aic7xxx_verbose & VERBOSE_PROBE2)
                   7310:           printk(KERN_INFO "(scsi%d) SE Low byte termination Enabled\n",
                   7311:                  p->host_no);
                   7312:       }
                   7313: 
                   7314:       if (enableLVD_low != 0)
                   7315:       {
                   7316:         sxfrctl1 |= STPWEN;
                   7317:         p->flags |= AHC_TERM_ENB_LVD;
                   7318:         if (aic7xxx_verbose & VERBOSE_PROBE2)
                   7319:           printk(KERN_INFO "(scsi%d) LVD Low byte termination Enabled\n",
                   7320:                  p->host_no);
                   7321:       }
                   7322:           
                   7323:       if (enableLVD_high != 0)
                   7324:       {
                   7325:         brddat |= BRDDAT4;
                   7326:         if (aic7xxx_verbose & VERBOSE_PROBE2)
                   7327:           printk(KERN_INFO "(scsi%d) LVD High byte termination Enabled\n",
                   7328:                  p->host_no);
                   7329:       }
                   7330:     }
                   7331:     else
                   7332:     {
                   7333:       if (p->adapter_control & CFSTERM)
                   7334:       {
                   7335:         if (p->features & AHC_ULTRA2)
                   7336:           brddat |= BRDDAT5;
                   7337:         else
                   7338:           sxfrctl1 |= STPWEN;
                   7339:         if (aic7xxx_verbose & VERBOSE_PROBE2)
                   7340:           printk(KERN_INFO "(scsi%d) SE Low byte termination Enabled\n",
                   7341:                  p->host_no);
                   7342:       }
                   7343: 
                   7344:       if (p->adapter_control & CFWSTERM)
                   7345:       {
                   7346:         brddat |= BRDDAT6;
                   7347:         if (aic7xxx_verbose & VERBOSE_PROBE2)
                   7348:           printk(KERN_INFO "(scsi%d) SE High byte termination Enabled\n",
                   7349:                  p->host_no);
                   7350:       }
                   7351:     }
                   7352:     write_brdctl(p, brddat);
                   7353:     release_seeprom(p);
                   7354:     aic_outb(p, sxfrctl1, SXFRCTL1);
                   7355:   }
                   7356: }
                   7357: 
                   7358: /*+F*************************************************************************
                   7359:  * Function:
                   7360:  *   detect_maxscb
                   7361:  *
                   7362:  * Description:
                   7363:  *   Detects the maximum number of SCBs for the controller and returns
                   7364:  *   the count and a mask in p (p->maxscbs, p->qcntmask).
                   7365:  *-F*************************************************************************/
                   7366: static void
                   7367: detect_maxscb(struct aic7xxx_host *p)
                   7368: {
                   7369:   int i;
                   7370: 
                   7371:   /*
                   7372:    * It's possible that we've already done this for multichannel
                   7373:    * adapters.
                   7374:    */
                   7375:   if (p->scb_data->maxhscbs == 0)
                   7376:   {
                   7377:     /*
                   7378:      * We haven't initialized the SCB settings yet.  Walk the SCBs to
                   7379:      * determince how many there are.
                   7380:      */
                   7381:     aic_outb(p, 0, FREE_SCBH);
                   7382: 
                   7383:     for (i = 0; i < AIC7XXX_MAXSCB; i++)
                   7384:     {
                   7385:       aic_outb(p, i, SCBPTR);
                   7386:       aic_outb(p, i, SCB_CONTROL);
                   7387:       if (aic_inb(p, SCB_CONTROL) != i)
                   7388:         break;
                   7389:       aic_outb(p, 0, SCBPTR);
                   7390:       if (aic_inb(p, SCB_CONTROL) != 0)
                   7391:         break;
                   7392: 
                   7393:       aic_outb(p, i, SCBPTR);
                   7394:       aic_outb(p, 0, SCB_CONTROL);   /* Clear the control byte. */
                   7395:       aic_outb(p, i + 1, SCB_NEXT);  /* Set the next pointer. */
                   7396:       aic_outb(p, i - 1, SCB_PREV);  /* Set the prev pointer. */
                   7397:       aic_outb(p, SCB_LIST_NULL, SCB_TAG);  /* Make the tag invalid. */
                   7398:       aic_outb(p, SCB_LIST_NULL, SCB_BUSYTARGETS);  /* no busy untagged */
                   7399:       aic_outb(p, SCB_LIST_NULL, SCB_BUSYTARGETS+1);/* targets active yet */
                   7400:       aic_outb(p, SCB_LIST_NULL, SCB_BUSYTARGETS+2);
                   7401:       aic_outb(p, SCB_LIST_NULL, SCB_BUSYTARGETS+3);
                   7402:     }
                   7403: 
                   7404:     /* Make sure the last SCB terminates the free list. */
                   7405:     aic_outb(p, i - 1, SCBPTR);
                   7406:     aic_outb(p, SCB_LIST_NULL, SCB_NEXT);
                   7407: 
                   7408:     /* Ensure we clear the first (0) SCBs control byte. */
                   7409:     aic_outb(p, 0, SCBPTR);
                   7410:     aic_outb(p, 0, SCB_CONTROL);
                   7411: 
                   7412:     p->scb_data->maxhscbs = i;
                   7413:     /*
                   7414:      * Use direct indexing instead for speed
                   7415:      */
                   7416:     if ( i == AIC7XXX_MAXSCB )
                   7417:       p->flags &= ~AHC_PAGESCBS;
                   7418:   }
                   7419: 
                   7420: }
                   7421: 
                   7422: /*+F*************************************************************************
                   7423:  * Function:
                   7424:  *   aic7xxx_register
                   7425:  *
                   7426:  * Description:
                   7427:  *   Register a Adaptec aic7xxx chip SCSI controller with the kernel.
                   7428:  *-F*************************************************************************/
                   7429: static int
                   7430: aic7xxx_register(Scsi_Host_Template *template, struct aic7xxx_host *p,
                   7431:   int reset_delay)
                   7432: {
                   7433:   int i, result;
                   7434:   int max_targets;
                   7435:   int found = 1;
                   7436:   unsigned char term, scsi_conf;
                   7437:   struct Scsi_Host *host;
                   7438: 
                   7439:   /*
                   7440:    * Lock out other contenders for our i/o space.
                   7441:    */
                   7442:   request_region(p->base, MAXREG - MINREG, "aic7xxx");
                   7443: 
                   7444: 
                   7445:   host = p->host;
                   7446: 
                   7447:   p->scb_data->maxscbs = AIC7XXX_MAXSCB;
                   7448:   host->can_queue = AIC7XXX_MAXSCB;
                   7449:   host->cmd_per_lun = 3;
                   7450:   host->sg_tablesize = AIC7XXX_MAX_SG;
                   7451:   host->select_queue_depths = aic7xxx_select_queue_depth;
                   7452:   host->this_id = p->scsi_id;
                   7453:   host->io_port = p->base;
                   7454:   host->n_io_port = 0xFF;
                   7455:   host->base = (unsigned char *) p->mbase;
                   7456:   host->irq = p->irq;
                   7457:   if (p->features & AHC_WIDE)
                   7458:   {
                   7459:     host->max_id = 16;
                   7460:   }
                   7461:   if (p->features & AHC_TWIN)
                   7462:   {
                   7463:     host->max_channel = 1;
                   7464:   }
                   7465: 
                   7466:   p->host = host;
                   7467:   p->last_reset = 0;
                   7468:   p->host_no = host->host_no;
                   7469:   host->unique_id = p->instance;
                   7470:   p->isr_count = 0;
                   7471:   p->next = NULL;
                   7472:   p->completeq.head = NULL;
                   7473:   p->completeq.tail = NULL;
                   7474:   scbq_init(&p->scb_data->free_scbs);
                   7475:   scbq_init(&p->waiting_scbs);
                   7476: 
                   7477:   for (i = 0; i < NUMBER(p->untagged_scbs); i++)
                   7478:   {
                   7479:     p->untagged_scbs[i] = SCB_LIST_NULL;
                   7480:     p->qinfifo[i] = SCB_LIST_NULL;
                   7481:     p->qoutfifo[i] = SCB_LIST_NULL;
                   7482:   }
                   7483:   /*
                   7484:    * We currently have no commands of any type
                   7485:    */
                   7486:   p->qinfifonext = 0;
                   7487:   p->qoutfifonext = 0;
                   7488: 
                   7489:   for (i = 0; i < MAX_TARGETS; i++)
                   7490:   {
                   7491:     p->dev_commands_sent[i] = 0;
                   7492:     p->dev_flags[i] = 0;
                   7493:     p->dev_active_cmds[i] = 0;
                   7494:     p->dev_last_reset[i] = 0;
                   7495:     p->dev_last_queue_full[i] = 0;
                   7496:     p->dev_last_queue_full_count[i] = 0;
                   7497:     p->dev_max_queue_depth[i] = 1;
                   7498:     p->dev_temp_queue_depth[i] = 1;
                   7499:     p->dev_mid_level_queue_depth[i] = 3;
                   7500:     scbq_init(&p->delayed_scbs[i]);
                   7501:     init_timer(&p->dev_timer[i]);
                   7502:     p->dev_timer[i].expires = 0;
                   7503:     p->dev_timer[i].data = (unsigned long)p;
                   7504:     p->dev_timer[i].function = (void *)aic7xxx_timer;
                   7505:   }
                   7506: 
                   7507:   printk(KERN_INFO "(scsi%d) <%s> found at ", p->host_no,
                   7508:     board_names[p->board_name_index]);
                   7509:   switch(p->chip)
                   7510:   {
                   7511:     case (AHC_AIC7770|AHC_EISA):
                   7512:       printk("EISA slot %d\n", p->pci_device_fn);
                   7513:       break;
                   7514:     case (AHC_AIC7770|AHC_VL):
                   7515:       printk("VLB slot %d\n", p->pci_device_fn);
                   7516:       break;
                   7517:     default:
                   7518:       printk("PCI %d/%d\n", PCI_SLOT(p->pci_device_fn),
                   7519:         PCI_FUNC(p->pci_device_fn));
                   7520:       break;
                   7521:   }
                   7522:   if (p->features & AHC_TWIN)
                   7523:   {
                   7524:     printk(KERN_INFO "(scsi%d) Twin Channel, A SCSI ID %d, B SCSI ID %d, ",
                   7525:            p->host_no, p->scsi_id, p->scsi_id_b);
                   7526:   }
                   7527:   else
                   7528:   {
                   7529:     char *channel;
                   7530: 
                   7531:     channel = "";
                   7532: 
                   7533:     if ((p->flags & AHC_MULTI_CHANNEL) != 0)
                   7534:     {
                   7535:       channel = " A";
                   7536: 
                   7537:       if ( (p->flags & (AHC_CHNLB|AHC_CHNLC)) != 0 )
                   7538:       {
                   7539:         channel = (p->flags & AHC_CHNLB) ? " B" : " C";
                   7540:       }
                   7541:     }
                   7542:     if (p->features & AHC_WIDE)
                   7543:     {
                   7544:       printk(KERN_INFO "(scsi%d) Wide ", p->host_no);
                   7545:     }
                   7546:     else
                   7547:     {
                   7548:       printk(KERN_INFO "(scsi%d) Narrow ", p->host_no);
                   7549:     }
                   7550:     printk("Channel%s, SCSI ID=%d, ", channel, p->scsi_id);
                   7551:   }
                   7552:   aic_outb(p, 0, SEQ_FLAGS);
                   7553: 
                   7554:   /*
                   7555:    * Detect SCB parameters and initialize the SCB array.
                   7556:    */
                   7557:   detect_maxscb(p);
                   7558:   printk("%d/%d SCBs\n", p->scb_data->maxhscbs, p->scb_data->maxscbs);
                   7559:   if (aic7xxx_verbose & VERBOSE_PROBE2)
                   7560:   {
                   7561:     printk(KERN_INFO "(scsi%d) BIOS %sabled, IO Port 0x%lx, IRQ %d\n",
                   7562:       p->host_no, (p->flags & AHC_BIOS_ENABLED) ? "en" : "dis",
                   7563:       p->base, p->irq);
                   7564:     printk(KERN_INFO "(scsi%d) IO Memory at 0x%lx, MMAP Memory at 0x%lx\n",
                   7565:       p->host_no, p->mbase, (unsigned long)p->maddr);
                   7566:   }
                   7567: 
                   7568: #ifdef CONFIG_PCI
                   7569:   /*
                   7570:    * Now that we know our instance number, we can set the flags we need to
                   7571:    * force termination if need be.
                   7572:    */
                   7573:   if (aic7xxx_stpwlev != -1)
                   7574:   {
                   7575:     /*
                   7576:      * This option only applies to PCI controllers.
                   7577:      */
                   7578:     if ( (p->chip & ~AHC_CHIPID_MASK) == AHC_PCI)
                   7579:     {
                   7580:       unsigned char devconfig;
                   7581: 
                   7582: #if LINUX_KERNEL_VERSION > KERNEL_VERSION(2,1,92)
                   7583:       pci_read_config_byte(p->pdev, DEVCONFIG, &devconfig);
                   7584: #else
                   7585:       pcibios_read_config_byte(p->pci_bus, p->pci_device_fn,
                   7586:                                DEVCONFIG, &devconfig);
                   7587: #endif
                   7588:       if ( (aic7xxx_stpwlev >> p->instance) & 0x01 )
                   7589:       {
                   7590:         devconfig |= 0x02;
                   7591:         if (aic7xxx_verbose & VERBOSE_PROBE2)
                   7592:           printk("(scsi%d) Force setting STPWLEV bit\n", p->host_no);
                   7593:       }
                   7594:       else
                   7595:       {
                   7596:         devconfig &= ~0x02;
                   7597:         if (aic7xxx_verbose & VERBOSE_PROBE2)
                   7598:           printk("(scsi%d) Force clearing STPWLEV bit\n", p->host_no);
                   7599:       }
                   7600: #if LINUX_KERNEL_VERSION > KERNEL_VERSION(2,1,92)
                   7601:       pci_write_config_byte(p->pdev, DEVCONFIG, devconfig);
                   7602: #else
                   7603:       pcibios_write_config_byte(p->pci_bus, p->pci_device_fn,
                   7604:                                 DEVCONFIG, devconfig);
                   7605: #endif
                   7606:     }
                   7607:   }
                   7608: #endif
                   7609: 
                   7610:   /*
                   7611:    * That took care of devconfig and stpwlev, now for the actual termination
                   7612:    * settings.
                   7613:    */
                   7614:   if (aic7xxx_override_term != -1)
                   7615:   {
                   7616:     /*
                   7617:      * Again, this only applies to PCI controllers.  We don't have problems
                   7618:      * with the termination on 274x controllers to the best of my knowledge.
                   7619:      */
                   7620:     if ( (p->chip & ~AHC_CHIPID_MASK) == AHC_PCI)
                   7621:     {
                   7622:       unsigned char term_override;
                   7623: 
                   7624:       term_override = ( (aic7xxx_override_term >> (p->instance * 4)) & 0x0f);
                   7625:       p->adapter_control &= 
                   7626:         ~(CFSTERM|CFWSTERM|CFLVDSTERM|CFAUTOTERM|CFSEAUTOTERM);
                   7627:       if ( (p->features & AHC_ULTRA2) && (term_override & 0x0c) )
                   7628:       {
                   7629:         p->adapter_control |= CFLVDSTERM;
                   7630:       }
                   7631:       if (term_override & 0x02)
                   7632:       {
                   7633:         p->adapter_control |= CFWSTERM;
                   7634:       }
                   7635:       if (term_override & 0x01)
                   7636:       {
                   7637:         p->adapter_control |= CFSTERM;
                   7638:       }
                   7639:     }
                   7640:   }
                   7641: 
                   7642:   if ( (p->flags & AHC_SEEPROM_FOUND) || (aic7xxx_override_term != -1) )
                   7643:   {
                   7644:     if (p->features & AHC_SPIOCAP)
                   7645:     {
                   7646:       if ( aic_inb(p, SPIOCAP) & SSPIOCPS )
                   7647:       /*
                   7648:        * Update the settings in sxfrctl1 to match the termination
                   7649:        * settings.
                   7650:        */
                   7651:         configure_termination(p);
                   7652:     }
                   7653:     else if ((p->chip & AHC_CHIPID_MASK) >= AHC_AIC7870)
                   7654:     {
                   7655:       configure_termination(p);
                   7656:     }
                   7657:   }
                   7658: 
                   7659:   /*
                   7660:    * Clear out any possible pending interrupts.
                   7661:    */
                   7662:   aic7xxx_clear_intstat(p);
                   7663: 
                   7664:   /*
                   7665:    * Set the SCSI Id, SXFRCTL0, SXFRCTL1, and SIMODE1, for both channels
                   7666:    */
                   7667:   if (p->features & AHC_TWIN)
                   7668:   {
                   7669:     /* Select channel B */
                   7670:     aic_outb(p, aic_inb(p, SBLKCTL) | SELBUSB, SBLKCTL);
                   7671: 
                   7672:     term = ((p->flags & AHC_TERM_ENB_B) != 0) ? STPWEN : 0;
                   7673:     aic_outb(p, p->scsi_id_b, SCSIID);
                   7674:     scsi_conf = aic_inb(p, SCSICONF + 1);
                   7675:     aic_outb(p, DFON | SPIOEN, SXFRCTL0);
                   7676:     aic_outb(p, (scsi_conf & ENSPCHK) | term | 
                   7677:          ENSTIMER | ACTNEGEN, SXFRCTL1);
                   7678:     aic_outb(p, 0, SIMODE0);
                   7679:     aic_outb(p, ENSELTIMO | ENSCSIRST | ENSCSIPERR, SIMODE1);
                   7680:     aic_outb(p, 0, SCSIRATE);
                   7681: 
                   7682:     /* Select channel A */
                   7683:     aic_outb(p, aic_inb(p, SBLKCTL) & ~SELBUSB, SBLKCTL);
                   7684:   }
                   7685: 
                   7686:   term = ((p->flags & AHC_TERM_ENB_SE_LOW) != 0) ? STPWEN : 0;
                   7687:   if (p->features & AHC_ULTRA2)
                   7688:     aic_outb(p, p->scsi_id, SCSIID_ULTRA2);
                   7689:   else
                   7690:     aic_outb(p, p->scsi_id, SCSIID);
                   7691:   scsi_conf = aic_inb(p, SCSICONF);
                   7692:   aic_outb(p, DFON | SPIOEN, SXFRCTL0);
                   7693:   aic_outb(p, (scsi_conf & ENSPCHK) | term | 
                   7694:        ENSTIMER | ACTNEGEN, SXFRCTL1);
                   7695:   aic_outb(p, 0, SIMODE0);
                   7696:   aic_outb(p, ENSELTIMO | ENSCSIRST | ENSCSIPERR, SIMODE1);
                   7697:   aic_outb(p, 0, SCSIRATE);
                   7698:   if ( p->features & AHC_ULTRA2)
                   7699:     aic_outb(p, 0, SCSIOFFSET);
                   7700: 
                   7701:   /*
                   7702:    * Look at the information that board initialization or the board
                   7703:    * BIOS has left us. In the lower four bits of each target's
                   7704:    * scratch space any value other than 0 indicates that we should
                   7705:    * initiate synchronous transfers. If it's zero, the user or the
                   7706:    * BIOS has decided to disable synchronous negotiation to that
                   7707:    * target so we don't activate the needsdtr flag.
                   7708:    */
                   7709:   if ((p->features & (AHC_TWIN|AHC_WIDE)) == 0)
                   7710:   {
                   7711:     max_targets = 8;
                   7712:   }
                   7713:   else
                   7714:   {
                   7715:     max_targets = 16;
                   7716:   }
                   7717: 
                   7718:   if (!(aic7xxx_no_reset))
                   7719:   {
                   7720:     /*
                   7721:      * If we reset the bus, then clear the transfer settings, else leave
                   7722:      * them be
                   7723:      */
                   7724:     for (i = 0; i < max_targets; i++)
                   7725:     {
                   7726:       aic_outb(p, 0, TARG_SCSIRATE + i);
                   7727:       if (p->features & AHC_ULTRA2)
                   7728:       {
                   7729:         aic_outb(p, 0, TARG_OFFSET + i);
                   7730:       }
                   7731:       p->transinfo[i].cur_offset = 0;
                   7732:       p->transinfo[i].cur_period = 0;
                   7733:       p->transinfo[i].cur_width = MSG_EXT_WDTR_BUS_8_BIT;
                   7734:     }
                   7735: 
                   7736:     /*
                   7737:      * If we reset the bus, then clear the transfer settings, else leave
                   7738:      * them be.
                   7739:      */
                   7740:     aic_outb(p, 0, ULTRA_ENB);
                   7741:     aic_outb(p, 0, ULTRA_ENB + 1);
                   7742:     p->ultraenb = 0;
                   7743:   }
                   7744: 
                   7745:   /*
                   7746:    * Allocate enough hardware scbs to handle the maximum number of
                   7747:    * concurrent transactions we can have.  We have to make sure that
                   7748:    * the allocated memory is contiguous memory.  The Linux kmalloc
                   7749:    * routine should only allocate contiguous memory, but note that
                   7750:    * this could be a problem if kmalloc() is changed.
                   7751:    */
                   7752:   {
                   7753:     size_t array_size;
                   7754:     unsigned int hscb_physaddr;
                   7755:     unsigned long temp;
                   7756: 
                   7757:     array_size = p->scb_data->maxscbs * sizeof(struct aic7xxx_hwscb);
                   7758:     if (p->scb_data->hscbs == NULL)
                   7759:     {
                   7760:       /*
                   7761:        * A little padding so we can align thing the way we want
                   7762:        */
                   7763:       p->scb_data->hscbs = kmalloc(array_size + 0x1f, GFP_ATOMIC);
                   7764:     }
                   7765:     if (p->scb_data->hscbs == NULL)
                   7766:     {
                   7767:       printk("(scsi%d) Unable to allocate hardware SCB array; "
                   7768:              "failing detection.\n", p->host_no);
                   7769:       p->irq = 0;
                   7770:       return(0);
                   7771:     }
                   7772:     /*
                   7773:      * Save the actual kmalloc buffer pointer off, then align our
                   7774:      * buffer to a 32 byte boundary
                   7775:      */
                   7776:     p->scb_data->hscb_kmalloc_ptr = p->scb_data->hscbs;
                   7777:     temp = (unsigned long)p->scb_data->hscbs;
                   7778:     temp += 0x1f;
                   7779:     temp &= ~0x1f;
                   7780:     p->scb_data->hscbs = (struct aic7xxx_hwscb *)temp;
                   7781:     /* At least the control byte of each SCB needs to be 0. */
                   7782:     memset(p->scb_data->hscbs, 0, array_size);
                   7783: 
                   7784:     /* Tell the sequencer where it can find the hardware SCB array. */
                   7785:     hscb_physaddr = VIRT_TO_BUS(p->scb_data->hscbs);
                   7786:     aic_outb(p, hscb_physaddr & 0xFF, HSCB_ADDR);
                   7787:     aic_outb(p, (hscb_physaddr >> 8) & 0xFF, HSCB_ADDR + 1);
                   7788:     aic_outb(p, (hscb_physaddr >> 16) & 0xFF, HSCB_ADDR + 2);
                   7789:     aic_outb(p, (hscb_physaddr >> 24) & 0xFF, HSCB_ADDR + 3);
                   7790: 
                   7791:     /* Set up the fifo areas at the same time */
                   7792:     hscb_physaddr = VIRT_TO_BUS(&p->untagged_scbs[0]);
                   7793:     aic_outb(p, hscb_physaddr & 0xFF, SCBID_ADDR);
                   7794:     aic_outb(p, (hscb_physaddr >> 8) & 0xFF, SCBID_ADDR + 1);
                   7795:     aic_outb(p, (hscb_physaddr >> 16) & 0xFF, SCBID_ADDR + 2);
                   7796:     aic_outb(p, (hscb_physaddr >> 24) & 0xFF, SCBID_ADDR + 3);
                   7797:   }
                   7798: 
                   7799:   /* The Q-FIFOs we just set up are all empty */
                   7800:   aic_outb(p, 0, QINPOS);
                   7801:   aic_outb(p, 0, KERNEL_QINPOS);
                   7802:   aic_outb(p, 0, QOUTPOS);
                   7803: 
                   7804:   if(p->features & AHC_QUEUE_REGS)
                   7805:   {
                   7806:     aic_outb(p, SCB_QSIZE_256, QOFF_CTLSTA);
                   7807:     aic_outb(p, 0, SDSCB_QOFF);
                   7808:     aic_outb(p, 0, SNSCB_QOFF);
                   7809:     aic_outb(p, 0, HNSCB_QOFF);
                   7810:   }
                   7811: 
                   7812:   /*
                   7813:    * We don't have any waiting selections or disconnected SCBs.
                   7814:    */
                   7815:   aic_outb(p, SCB_LIST_NULL, WAITING_SCBH);
                   7816:   aic_outb(p, SCB_LIST_NULL, DISCONNECTED_SCBH);
                   7817: 
                   7818:   /*
                   7819:    * Message out buffer starts empty
                   7820:    */
                   7821:   aic_outb(p, MSG_NOOP, MSG_OUT);
                   7822:   aic_outb(p, MSG_NOOP, LAST_MSG);
                   7823: 
                   7824:   /*
                   7825:    * Set all the other asundry items that haven't been set yet.
                   7826:    * This includes just dumping init values to a lot of registers simply
                   7827:    * to make sure they've been touched and are ready for use parity wise
                   7828:    * speaking.
                   7829:    */
                   7830:   aic_outb(p, 0, TMODE_CMDADDR);
                   7831:   aic_outb(p, 0, TMODE_CMDADDR + 1);
                   7832:   aic_outb(p, 0, TMODE_CMDADDR + 2);
                   7833:   aic_outb(p, 0, TMODE_CMDADDR + 3);
                   7834:   aic_outb(p, 0, TMODE_CMDADDR_NEXT);
                   7835: 
                   7836:   /*
                   7837:    * Link us into the list of valid hosts
                   7838:    */
                   7839:   p->next = first_aic7xxx;
                   7840:   first_aic7xxx = p;
                   7841: 
                   7842:   /*
                   7843:    * Clear out any possible pending interrupts, again.
                   7844:    */
                   7845:   aic7xxx_clear_intstat(p);
                   7846: 
                   7847:   /*
                   7848:    * Allocate the first set of scbs for this controller.  This is to stream-
                   7849:    * line code elsewhere in the driver.  If we have to check for the existence
                   7850:    * of scbs in certain code sections, it slows things down.  However, as
                   7851:    * soon as we register the IRQ for this card, we could get an interrupt that
                   7852:    * includes possibly the SCSI_RSTI interrupt.  If we catch that interrupt
                   7853:    * then we are likely to segfault if we don't have at least one chunk of
                   7854:    * SCBs allocated or add checks all through the reset code to make sure
                   7855:    * that the SCBs have been allocated which is an invalid running condition
                   7856:    * and therefore I think it's preferable to simply pre-allocate the first
                   7857:    * chunk of SCBs.
                   7858:    */
                   7859:   aic7xxx_allocate_scb(p);
                   7860: 
                   7861:   /*
                   7862:    * Load the sequencer program, then re-enable the board -
                   7863:    * resetting the AIC-7770 disables it, leaving the lights
                   7864:    * on with nobody home.
                   7865:    */
                   7866:   aic7xxx_loadseq(p);
                   7867: 
                   7868:   if ( (p->chip & AHC_CHIPID_MASK) == AHC_AIC7770 )
                   7869:   {
                   7870:     aic_outb(p, ENABLE, BCTL);  /* Enable the boards BUS drivers. */
                   7871:   }
                   7872: 
                   7873:   if ( !(aic7xxx_no_reset) )
                   7874:   {
                   7875:     if (p->features & AHC_TWIN)
                   7876:     {
                   7877:       if (aic7xxx_verbose & VERBOSE_PROBE2)
                   7878:         printk(KERN_INFO "(scsi%d) Resetting channel B\n", p->host_no);
                   7879:       aic_outb(p, aic_inb(p, SBLKCTL) | SELBUSB, SBLKCTL);
                   7880:       aic7xxx_reset_current_bus(p);
                   7881:       aic_outb(p, aic_inb(p, SBLKCTL) & ~SELBUSB, SBLKCTL);
                   7882:     }
                   7883:     /* Reset SCSI bus A. */
                   7884:     if (aic7xxx_verbose & VERBOSE_PROBE2)
                   7885:     {  /* In case we are a 3940, 3985, or 7895, print the right channel */
                   7886:       char *channel = "";
                   7887:       if (p->flags & AHC_MULTI_CHANNEL)
                   7888:       {
                   7889:         channel = " A";
                   7890:         if (p->flags & (AHC_CHNLB|AHC_CHNLC))
                   7891:           channel = (p->flags & AHC_CHNLB) ? " B" : " C";
                   7892:       }
                   7893:       printk(KERN_INFO "(scsi%d) Resetting channel%s\n", p->host_no, channel);
                   7894:     }
                   7895:     
                   7896:     /*
                   7897:      * Some of the new Ultra2 chipsets need a longer delay after a chip
                   7898:      * reset than just the init setup creates, so we have to delay here
                   7899:      * before we go into a reset in order to make the chips happy.
                   7900:      */
                   7901:     if (p->features & AHC_ULTRA2)
                   7902:       mdelay(250);
                   7903:     aic7xxx_reset_current_bus(p);
                   7904: 
                   7905:     /*
                   7906:      * Delay for the reset delay.
                   7907:      */
                   7908:     if (!reset_delay)
                   7909:       aic7xxx_delay(AIC7XXX_RESET_DELAY);
                   7910:   }
                   7911:   else
                   7912:   {
                   7913:     if (!reset_delay)
                   7914:     {
                   7915:       printk(KERN_INFO "(scsi%d) Not resetting SCSI bus.  Note: Don't use "
                   7916:              "the no_reset\n", p->host_no);
                   7917:       printk(KERN_INFO "(scsi%d) option unless you have a verifiable need "
                   7918:              "for it.\n", p->host_no);
                   7919:       printk(KERN_INFO "(scsi%d) The no_reset option is known to break some "
                   7920:              "systems,\n", p->host_no);
                   7921:       printk(KERN_INFO "(scsi%d) and is not supported by the driver author\n",
                   7922:              p->host_no);
                   7923:       aic7xxx_delay(AIC7XXX_RESET_DELAY);
                   7924:     }
                   7925:   }
                   7926:   
                   7927:   /*
                   7928:    * Register IRQ with the kernel.  Only allow sharing IRQs with
                   7929:    * PCI devices.
                   7930:    */
                   7931:   if (!(p->chip & AHC_PCI))
                   7932:   {
                   7933:     result = (request_irq(p->irq, do_aic7xxx_isr, 0, "aic7xxx", p));
                   7934:   }
                   7935:   else
                   7936:   {
                   7937:     result = (request_irq(p->irq, do_aic7xxx_isr, SA_SHIRQ,
                   7938:               "aic7xxx", p));
                   7939:     if (result < 0)
                   7940:     {
                   7941:       result = (request_irq(p->irq, do_aic7xxx_isr, SA_INTERRUPT | SA_SHIRQ,
                   7942:               "aic7xxx", p));
                   7943:     }
                   7944:   }
                   7945:   if (result < 0)
                   7946:   {
                   7947:     printk(KERN_WARNING "(scsi%d) Couldn't register IRQ %d, ignoring "
                   7948:            "controller.\n", p->host_no, p->irq);
                   7949:     p->irq = 0;
                   7950:     return (0);
                   7951:   }
                   7952: 
                   7953:   unpause_sequencer(p, /* unpause_always */ TRUE);
                   7954: 
                   7955:   return (found);
                   7956: }
                   7957: 
                   7958: /*+F*************************************************************************
                   7959:  * Function:
                   7960:  *   aic7xxx_chip_reset
                   7961:  *
                   7962:  * Description:
                   7963:  *   Perform a chip reset on the aic7xxx SCSI controller.  The controller
                   7964:  *   is paused upon return.
                   7965:  *-F*************************************************************************/
                   7966: int
                   7967: aic7xxx_chip_reset(struct aic7xxx_host *p)
                   7968: {
                   7969:   unsigned char sblkctl;
                   7970:   int wait;
                   7971: 
                   7972:   /*
                   7973:    * For some 274x boards, we must clear the CHIPRST bit and pause
                   7974:    * the sequencer. For some reason, this makes the driver work.
                   7975:    */
                   7976:   aic_outb(p, PAUSE | CHIPRST, HCNTRL);
                   7977: 
                   7978:   /*
                   7979:    * In the future, we may call this function as a last resort for
                   7980:    * error handling.  Let's be nice and not do any unecessary delays.
                   7981:    */
                   7982:   wait = 1000;  /* 1 second (1000 * 1 msec) */
                   7983:   while (--wait && !(aic_inb(p, HCNTRL) & CHIPRSTACK))
                   7984:   {
                   7985:     mdelay(1);  /* 1 msec */
                   7986:   }
                   7987: 
                   7988:   pause_sequencer(p);
                   7989: 
                   7990:   sblkctl = aic_inb(p, SBLKCTL) & (SELBUSB|SELWIDE);
                   7991:   if (p->chip & AHC_PCI)
                   7992:     sblkctl &= ~SELBUSB;
                   7993:   switch( sblkctl )
                   7994:   {
                   7995:     case 0:  /* normal narrow card */
                   7996:       break;
                   7997:     case 2:  /* Wide card */
                   7998:       p->features |= AHC_WIDE;
                   7999:       break;
                   8000:     case 8:  /* Twin card */
                   8001:       p->features |= AHC_TWIN;
                   8002:       p->flags |= AHC_MULTI_CHANNEL;
                   8003:       break;
                   8004:     default: /* hmmm...we don't know what this is */
                   8005:       printk(KERN_WARNING "aic7xxx: Unsupported adapter type %d, ignoring.\n",
                   8006:         aic_inb(p, SBLKCTL) & 0x0a);
                   8007:       return(-1);
                   8008:   }
                   8009:   return(0);
                   8010: }
                   8011: 
                   8012: /*+F*************************************************************************
                   8013:  * Function:
                   8014:  *   aic7xxx_alloc
                   8015:  *
                   8016:  * Description:
                   8017:  *   Allocate and initialize a host structure.  Returns NULL upon error
                   8018:  *   and a pointer to a aic7xxx_host struct upon success.
                   8019:  *-F*************************************************************************/
                   8020: static struct aic7xxx_host *
                   8021: aic7xxx_alloc(Scsi_Host_Template *sht, struct aic7xxx_host *temp)
                   8022: {
                   8023:   struct aic7xxx_host *p = NULL;
                   8024:   struct Scsi_Host *host;
                   8025:   int i;
                   8026: 
                   8027:   /*
                   8028:    * Allocate a storage area by registering us with the mid-level
                   8029:    * SCSI layer.
                   8030:    */
                   8031:   host = scsi_register(sht, sizeof(struct aic7xxx_host));
                   8032: 
                   8033:   if (host != NULL)
                   8034:   {
                   8035:     p = (struct aic7xxx_host *) host->hostdata;
                   8036:     memset(p, 0, sizeof(struct aic7xxx_host));
                   8037:     *p = *temp;
                   8038:     p->host = host;
                   8039: 
                   8040:     p->scb_data = kmalloc(sizeof(scb_data_type), GFP_ATOMIC);
                   8041:     if (p->scb_data != NULL)
                   8042:     {
                   8043:       memset(p->scb_data, 0, sizeof(scb_data_type));
                   8044:       scbq_init (&p->scb_data->free_scbs);
                   8045:     }
                   8046:     else
                   8047:     {
                   8048:       /*
                   8049:        * For some reason we don't have enough memory.  Free the
                   8050:        * allocated memory for the aic7xxx_host struct, and return NULL.
                   8051:        */
                   8052:       release_region(p->base, MAXREG - MINREG);
                   8053:       scsi_unregister(host);
                   8054:       return(NULL);
                   8055:     }
                   8056:     p->host_no = host->host_no;
                   8057:     p->tagenable = 0;
                   8058:     p->orderedtag = 0;
                   8059:     for (i=0; i<MAX_TARGETS; i++)
                   8060:     {
                   8061:       p->transinfo[i].goal_period = 0;
                   8062:       p->transinfo[i].goal_offset = 0;
                   8063:       p->transinfo[i].goal_width = MSG_EXT_WDTR_BUS_8_BIT;
                   8064:     }
                   8065:     DRIVER_LOCK_INIT
                   8066:   }
                   8067:   return (p);
                   8068: }
                   8069: 
                   8070: /*+F*************************************************************************
                   8071:  * Function:
                   8072:  *   aic7xxx_free
                   8073:  *
                   8074:  * Description:
                   8075:  *   Frees and releases all resources associated with an instance of
                   8076:  *   the driver (struct aic7xxx_host *).
                   8077:  *-F*************************************************************************/
                   8078: static void
                   8079: aic7xxx_free(struct aic7xxx_host *p)
                   8080: {
                   8081:   int i;
                   8082: 
                   8083:   /*
                   8084:    * Free the allocated hardware SCB space.
                   8085:    */
                   8086:   if (p->scb_data != NULL)
                   8087:   {
                   8088:     if (p->scb_data->hscbs != NULL)
                   8089:     {
                   8090:       kfree(p->scb_data->hscb_kmalloc_ptr);
                   8091:       p->scb_data->hscbs = p->scb_data->hscb_kmalloc_ptr = NULL;
                   8092:     }
                   8093:     /*
                   8094:      * Free the driver SCBs.  These were allocated on an as-need
                   8095:      * basis.  We allocated these in groups depending on how many
                   8096:      * we could fit into a given amount of RAM.  The tail SCB for
                   8097:      * these allocations has a pointer to the alloced area.
                   8098:      */
                   8099:     for (i = 0; i < p->scb_data->numscbs; i++)
                   8100:     {
                   8101:       if (p->scb_data->scb_array[i]->kmalloc_ptr != NULL)
                   8102:         kfree(p->scb_data->scb_array[i]->kmalloc_ptr);
                   8103:       p->scb_data->scb_array[i] = NULL;
                   8104:     }
                   8105:   
                   8106:     /*
                   8107:      * Free the SCB data area.
                   8108:      */
                   8109:     kfree(p->scb_data);
                   8110:   }
                   8111: 
                   8112:   /*
                   8113:    * Free any alloced Scsi_Cmnd structures that might be around for
                   8114:    * negotiation purposes....
                   8115:    */
                   8116:   for (i = 0; i < MAX_TARGETS; i++)
                   8117:   {
                   8118:     if(p->dev_wdtr_cmnd[i])
                   8119:       kfree(p->dev_wdtr_cmnd[i]);
                   8120:     if(p->dev_sdtr_cmnd[i])
                   8121:       kfree(p->dev_sdtr_cmnd[i]);
                   8122:   }
                   8123: 
                   8124: }
                   8125: 
                   8126: /*+F*************************************************************************
                   8127:  * Function:
                   8128:  *   aic7xxx_load_seeprom
                   8129:  *
                   8130:  * Description:
                   8131:  *   Load the seeprom and configure adapter and target settings.
                   8132:  *   Returns 1 if the load was successful and 0 otherwise.
                   8133:  *-F*************************************************************************/
                   8134: static void
                   8135: aic7xxx_load_seeprom(struct aic7xxx_host *p, unsigned char *sxfrctl1)
                   8136: {
                   8137:   int have_seeprom = 0;
                   8138:   int i, max_targets, mask;
                   8139:   unsigned char scsirate, scsi_conf;
                   8140:   unsigned short scarray[128];
                   8141:   struct seeprom_config *sc = (struct seeprom_config *) scarray;
                   8142: 
                   8143:   if (aic7xxx_verbose & VERBOSE_PROBE2)
                   8144:   {
                   8145:     printk(KERN_INFO "aic7xxx: Loading serial EEPROM...");
                   8146:   }
                   8147:   switch (p->chip)
                   8148:   {
                   8149:     case (AHC_AIC7770|AHC_EISA):  /* None of these adapters have seeproms. */
                   8150:       if (aic_inb(p, SCSICONF) & TERM_ENB)
                   8151:         p->flags |= AHC_TERM_ENB_A;
                   8152:       if ( (p->features & AHC_TWIN) && (aic_inb(p, SCSICONF + 1) & TERM_ENB) )
                   8153:         p->flags |= AHC_TERM_ENB_B;
                   8154:       break;
                   8155: 
                   8156:     case (AHC_AIC7770|AHC_VL):
                   8157:       have_seeprom = read_284x_seeprom(p, (struct seeprom_config *) scarray);
                   8158:       break;
                   8159: 
                   8160:     default:
                   8161:       have_seeprom = read_seeprom(p, (p->flags & (AHC_CHNLB|AHC_CHNLC)),
                   8162:                                   scarray, p->sc_size, p->sc_type);
                   8163:       if (!have_seeprom)
                   8164:       {
                   8165:         if(p->sc_type == C46)
                   8166:           have_seeprom = read_seeprom(p, (p->flags & (AHC_CHNLB|AHC_CHNLC)),
                   8167:                                       scarray, p->sc_size, C56_66);
                   8168:         else
                   8169:           have_seeprom = read_seeprom(p, (p->flags & (AHC_CHNLB|AHC_CHNLC)),
                   8170:                                       scarray, p->sc_size, C46);
                   8171:       }
                   8172:       break;
                   8173:   }
                   8174: 
                   8175:   if (!have_seeprom)
                   8176:   {
                   8177:     if (aic7xxx_verbose & VERBOSE_PROBE2)
                   8178:     {
                   8179:       printk("\naic7xxx: No SEEPROM available.\n");
                   8180:     }
                   8181:     p->flags |= AHC_NEWEEPROM_FMT;
                   8182:     if (aic_inb(p, SCSISEQ) == 0)
                   8183:     {
                   8184:       p->flags |= AHC_USEDEFAULTS;
                   8185:       p->flags &= ~AHC_BIOS_ENABLED;
                   8186:       p->scsi_id = p->scsi_id_b = 7;
                   8187:       *sxfrctl1 |= STPWEN;
                   8188:       if (aic7xxx_verbose & VERBOSE_PROBE2)
                   8189:       {
                   8190:         printk("aic7xxx: Using default values.\n");
                   8191:       }
                   8192:     }
                   8193:     else if (aic7xxx_verbose & VERBOSE_PROBE2)
                   8194:     {
                   8195:       printk("aic7xxx: Using leftover BIOS values.\n");
                   8196:     }
                   8197:     if ( *sxfrctl1 & STPWEN )
                   8198:     {
                   8199:       p->flags |= AHC_TERM_ENB_SE_LOW | AHC_TERM_ENB_SE_HIGH;
                   8200:       sc->adapter_control &= ~CFAUTOTERM;
                   8201:       sc->adapter_control |= CFSTERM | CFWSTERM | CFLVDSTERM;
                   8202:     }
                   8203:     p->flags |= AHC_EXTEND_TRANS_A | AHC_EXTEND_TRANS_B;
                   8204:   }
                   8205:   else
                   8206:   {
                   8207:     if (aic7xxx_verbose & VERBOSE_PROBE2)
                   8208:     {
                   8209:       printk("done\n");
                   8210:     }
                   8211: 
                   8212:     /*
                   8213:      * Note things in our flags
                   8214:      */
                   8215:     p->flags |= AHC_SEEPROM_FOUND;
                   8216: 
                   8217:     /*
                   8218:      * Update the settings in sxfrctl1 to match the termination settings.
                   8219:      */
                   8220:     *sxfrctl1 = 0;
                   8221: 
                   8222:     /*
                   8223:      * Get our SCSI ID from the SEEPROM setting...
                   8224:      */
                   8225:     p->scsi_id = (sc->brtime_id & CFSCSIID);
                   8226: 
                   8227:     /*
                   8228:      * First process the settings that are different between the VLB
                   8229:      * and PCI adapter seeproms.
                   8230:      */
                   8231:     if ((p->chip & AHC_CHIPID_MASK) == AHC_AIC7770)
                   8232:     {
                   8233:       /* VLB adapter seeproms */
                   8234:       if (sc->bios_control & CF284XEXTEND)
                   8235:         p->flags |= AHC_EXTEND_TRANS_A;
                   8236: 
                   8237:       if (sc->adapter_control & CF284XSTERM)
                   8238:       {
                   8239:         *sxfrctl1 |= STPWEN;
                   8240:         p->flags |= AHC_TERM_ENB_SE_LOW | AHC_TERM_ENB_SE_HIGH;
                   8241:       }
                   8242:     }
                   8243:     else
                   8244:     {
                   8245:       /* PCI adapter seeproms */
                   8246:       if (sc->bios_control & CFEXTEND)
                   8247:         p->flags |= AHC_EXTEND_TRANS_A;
                   8248:       if (sc->bios_control & CFBIOSEN)
                   8249:         p->flags |= AHC_BIOS_ENABLED;
                   8250:       else
                   8251:         p->flags &= ~AHC_BIOS_ENABLED;
                   8252: 
                   8253:       if (sc->adapter_control & CFSTERM)
                   8254:       {
                   8255:         *sxfrctl1 |= STPWEN;
                   8256:         p->flags |= AHC_TERM_ENB_SE_LOW | AHC_TERM_ENB_SE_HIGH;
                   8257:       }
                   8258:     }
                   8259:     p->sc = *sc;
                   8260:   }
                   8261: 
                   8262:   p->discenable = 0;
                   8263:     
                   8264:   /*
                   8265:    * Limit to 16 targets just in case.  The 2842 for one is known to
                   8266:    * blow the max_targets setting, future cards might also.
                   8267:    */
                   8268:   max_targets = MIN(sc->max_targets & CFMAXTARG,
                   8269:                    ((p->features & (AHC_TWIN | AHC_WIDE)) ? 16 : 8));
                   8270: 
                   8271:   if (have_seeprom)
                   8272:   {
                   8273:     for (i = 0; i < max_targets; i++)
                   8274:     {
                   8275:       if( ((p->features & AHC_ULTRA) &&
                   8276:           !(sc->adapter_control & CFULTRAEN) &&
                   8277:            (sc->device_flags[i] & CFSYNCHISULTRA)) ||
                   8278:           (sc->device_flags[i] & CFNEWULTRAFORMAT) )
                   8279:       {
                   8280:         p->flags |= AHC_NEWEEPROM_FMT;
                   8281:         break;
                   8282:       }
                   8283:     }
                   8284:   }
                   8285: 
                   8286:   for (i = 0; i < max_targets; i++)
                   8287:   {
                   8288:     mask = (0x01 << i);
                   8289:     if (!have_seeprom)
                   8290:     {
                   8291:       if(aic_inb(p, SCSISEQ) != 0)
                   8292:       {
                   8293:         /*
                   8294:          * OK...the BIOS set things up and left behind the settings we need.
                   8295:          * Just make our sc->device_flags[i] entry match what the card has
                   8296:          * set for this device.
                   8297:          */
                   8298:         p->discenable = 
                   8299:           ~(aic_inb(p, DISC_DSB) | (aic_inb(p, DISC_DSB + 1) << 8) );
                   8300:         p->ultraenb =
                   8301:           (aic_inb(p, ULTRA_ENB) | (aic_inb(p, ULTRA_ENB + 1) << 8) );
                   8302:         sc->device_flags[i] = (p->discenable & mask) ? CFDISC : 0;
                   8303:         if (aic_inb(p, TARG_SCSIRATE + i) & WIDEXFER)
                   8304:           sc->device_flags[i] |= CFWIDEB;
                   8305:         if (p->features & AHC_ULTRA2)
                   8306:         {
                   8307:           if (aic_inb(p, TARG_OFFSET + i))
                   8308:           {
                   8309:             sc->device_flags[i] |= CFSYNCH;
                   8310:             sc->device_flags[i] |= (aic_inb(p, TARG_SCSIRATE + i) & 0x07);
                   8311:             if ( (aic_inb(p, TARG_SCSIRATE + i) & 0x18) == 0x18 )
                   8312:               sc->device_flags[i] |= CFSYNCHISULTRA;
                   8313:           }
                   8314:         }
                   8315:         else
                   8316:         {
                   8317:           if (aic_inb(p, TARG_SCSIRATE + i) & ~WIDEXFER)
                   8318:           {
                   8319:             sc->device_flags[i] |= CFSYNCH;
                   8320:             if (p->features & AHC_ULTRA)
                   8321:               sc->device_flags[i] |= ((p->ultraenb & mask) ?
                   8322:                                       CFSYNCHISULTRA : 0);
                   8323:           }
                   8324:         }
                   8325:       }
                   8326:       else
                   8327:       {
                   8328:         /*
                   8329:          * Assume the BIOS has NOT been run on this card and nothing between
                   8330:          * the card and the devices is configured yet.
                   8331:          */
                   8332:         sc->device_flags[i] = CFDISC;
                   8333:         if (p->features & AHC_WIDE)
                   8334:           sc->device_flags[i] |= CFWIDEB;
                   8335:         if (p->features & AHC_ULTRA2)
                   8336:           sc->device_flags[i] |= 3;
                   8337:         else if (p->features & AHC_ULTRA)
                   8338:           sc->device_flags[i] |= CFSYNCHISULTRA;
                   8339:         sc->device_flags[i] |= CFSYNCH;
                   8340:         aic_outb(p, 0, TARG_SCSIRATE + i);
                   8341:         if (p->features & AHC_ULTRA2)
                   8342:           aic_outb(p, 0, TARG_OFFSET + i);
                   8343:       }
                   8344:     }
                   8345:     if (sc->device_flags[i] & CFDISC)
                   8346:     {
                   8347:       p->discenable |= mask;
                   8348:     }
                   8349:     if (p->flags & AHC_NEWEEPROM_FMT)
                   8350:     {
                   8351:       if (sc->device_flags[i] & CFSYNCHISULTRA)
                   8352:       {
                   8353:         p->ultraenb |= mask;
                   8354:       }
                   8355:       else if (sc->device_flags[i] & CFNEWULTRAFORMAT)
                   8356:       {
                   8357:         if ( (sc->device_flags[i] & (CFSYNCHISULTRA | CFXFER)) == 0x03 )
                   8358:         {
                   8359:           sc->device_flags[i] &= ~CFXFER;
                   8360:           sc->device_flags[i] |= CFSYNCHISULTRA;
                   8361:           p->ultraenb |= mask;
                   8362:         }
                   8363:       }
                   8364:     }
                   8365:     else if (sc->adapter_control & CFULTRAEN)
                   8366:     {
                   8367:       p->ultraenb |= mask;
                   8368:     }
                   8369:     if ( (sc->device_flags[i] & CFSYNCH) == 0)
                   8370:     {
                   8371:       sc->device_flags[i] &= ~CFXFER;
                   8372:       p->ultraenb &= ~mask;
                   8373:       p->transinfo[i].user_offset = 0;
                   8374:       p->transinfo[i].user_period = 0;
                   8375:       p->transinfo[i].cur_offset = 0;
                   8376:       p->transinfo[i].cur_period = 0;
                   8377:       p->needsdtr_copy &= ~mask;
                   8378:     }
                   8379:     else
                   8380:     {
                   8381:       if (p->features & AHC_ULTRA2)
                   8382:       {
                   8383:         p->transinfo[i].user_offset = MAX_OFFSET_ULTRA2;
                   8384:         p->transinfo[i].cur_offset = aic_inb(p, TARG_OFFSET + i);
                   8385:         scsirate = (sc->device_flags[i] & CFXFER) |
                   8386:                    ((p->ultraenb & mask) ? 0x18 : 0x10);
                   8387:         p->transinfo[i].user_period = aic7xxx_find_period(p, scsirate,
                   8388:                                        AHC_SYNCRATE_ULTRA2);
                   8389:         p->transinfo[i].cur_period = aic7xxx_find_period(p,
                   8390:                                        aic_inb(p, TARG_SCSIRATE + i),
                   8391:                                        AHC_SYNCRATE_ULTRA2);
                   8392:       }
                   8393:       else
                   8394:       {
                   8395:         scsirate = (sc->device_flags[i] & CFXFER) << 4;
                   8396:         if (sc->device_flags[i] & CFWIDEB)
                   8397:           p->transinfo[i].user_offset = MAX_OFFSET_16BIT;
                   8398:         else
                   8399:           p->transinfo[i].user_offset = MAX_OFFSET_8BIT;
                   8400:         if (p->features & AHC_ULTRA)
                   8401:         {
                   8402:           short ultraenb;
                   8403:           ultraenb = aic_inb(p, ULTRA_ENB) |
                   8404:             (aic_inb(p, ULTRA_ENB + 1) << 8);
                   8405:           p->transinfo[i].user_period = aic7xxx_find_period(p,
                   8406:                                           scsirate,
                   8407:                                           (p->ultraenb & mask) ?
                   8408:                                           AHC_SYNCRATE_ULTRA :
                   8409:                                           AHC_SYNCRATE_FAST);
                   8410:           p->transinfo[i].cur_period = aic7xxx_find_period(p,
                   8411:                                          aic_inb(p, TARG_SCSIRATE + i),
                   8412:                                          (ultraenb & mask) ? 
                   8413:                                          AHC_SYNCRATE_ULTRA :
                   8414:                                          AHC_SYNCRATE_FAST);
                   8415:         }
                   8416:         else
                   8417:           p->transinfo[i].user_period = aic7xxx_find_period(p,
                   8418:                                           scsirate, AHC_SYNCRATE_FAST);
                   8419:       }
                   8420:       p->needsdtr_copy |= mask;
                   8421:     }
                   8422:     if ( (sc->device_flags[i] & CFWIDEB) && (p->features & AHC_WIDE) )
                   8423:     {
                   8424:       p->transinfo[i].user_width = MSG_EXT_WDTR_BUS_16_BIT;
                   8425:       p->needwdtr_copy |= mask;
                   8426:     }
                   8427:     else
                   8428:     {
                   8429:       p->transinfo[i].user_width = MSG_EXT_WDTR_BUS_8_BIT;
                   8430:       p->needwdtr_copy &= ~mask;
                   8431:     }
                   8432:     p->transinfo[i].cur_width =
                   8433:       (aic_inb(p, TARG_SCSIRATE + i) & WIDEXFER) ?
                   8434:       MSG_EXT_WDTR_BUS_16_BIT : MSG_EXT_WDTR_BUS_8_BIT;
                   8435:   }
                   8436:   aic_outb(p, ~(p->discenable & 0xFF), DISC_DSB);
                   8437:   aic_outb(p, ~((p->discenable >> 8) & 0xFF), DISC_DSB + 1);
                   8438:   p->needwdtr = p->needwdtr_copy;
                   8439:   p->needsdtr = p->needsdtr_copy;
                   8440:   p->wdtr_pending = p->sdtr_pending = 0;
                   8441: 
                   8442:   /*
                   8443:    * We set the p->ultraenb from the SEEPROM to begin with, but now we make
                   8444:    * it match what is already down in the card.  If we are doing a reset
                   8445:    * on the card then this will get put back to a default state anyway.
                   8446:    * This allows us to not have to pre-emptively negotiate when using the
                   8447:    * no_reset option.
                   8448:    */
                   8449:   if (p->features & AHC_ULTRA)
                   8450:     p->ultraenb = aic_inb(p, ULTRA_ENB) | (aic_inb(p, ULTRA_ENB + 1) << 8);
                   8451: 
                   8452:   
                   8453:   scsi_conf = (p->scsi_id & HSCSIID);
                   8454: 
                   8455:   if(have_seeprom)
                   8456:   {
                   8457:     p->adapter_control = sc->adapter_control;
                   8458:     p->bios_control = sc->bios_control;
                   8459: 
                   8460:     switch (p->chip & AHC_CHIPID_MASK)
                   8461:     {
                   8462:       case AHC_AIC7895:
                   8463:       case AHC_AIC7896:
                   8464:         if (p->adapter_control & CFBPRIMARY)
                   8465:           p->flags |= AHC_CHANNEL_B_PRIMARY;
                   8466:       default:
                   8467:         break;
                   8468:     }
                   8469: 
                   8470:     if (sc->adapter_control & CFSPARITY)
                   8471:       scsi_conf |= ENSPCHK;
                   8472:   }
                   8473:   else
                   8474:   {
                   8475:     scsi_conf |= ENSPCHK | RESET_SCSI;
                   8476:   }
                   8477: 
                   8478:   /*
                   8479:    * Only set the SCSICONF and SCSICONF + 1 registers if we are a PCI card.
                   8480:    * The 2842 and 2742 cards already have these registers set and we don't
                   8481:    * want to muck with them since we don't set all the bits they do.
                   8482:    */
                   8483:   if ( (p->chip & ~AHC_CHIPID_MASK) == AHC_PCI )
                   8484:   {
                   8485:     /* Set the host ID */
                   8486:     aic_outb(p, scsi_conf, SCSICONF);
                   8487:     /* In case we are a wide card */
                   8488:     aic_outb(p, p->scsi_id, SCSICONF + 1);
                   8489:   }
                   8490: }
                   8491: 
                   8492: /*+F*************************************************************************
                   8493:  * Function:
                   8494:  *   aic7xxx_detect
                   8495:  *
                   8496:  * Description:
                   8497:  *   Try to detect and register an Adaptec 7770 or 7870 SCSI controller.
                   8498:  *
                   8499:  * XXX - This should really be called aic7xxx_probe().  A sequence of
                   8500:  *       probe(), attach()/detach(), and init() makes more sense than
                   8501:  *       one do-it-all function.  This may be useful when (and if) the
                   8502:  *       mid-level SCSI code is overhauled.
                   8503:  *-F*************************************************************************/
                   8504: int
                   8505: aic7xxx_detect(Scsi_Host_Template *template)
                   8506: {
                   8507:   struct aic7xxx_host *temp_p = NULL;
                   8508:   struct aic7xxx_host *current_p = NULL;
                   8509:   struct aic7xxx_host *list_p = NULL;
                   8510:   int found = 0;
                   8511: #if defined(__i386__) || defined(__alpha__)
                   8512:   ahc_flag_type flags = 0;
                   8513:   int type;
                   8514: #endif
                   8515:   unsigned char sxfrctl1;
                   8516: #if defined(__i386__) || defined(__alpha__)
                   8517:   unsigned char hcntrl, hostconf;
                   8518:   unsigned int slot, base;
                   8519: #endif
                   8520: 
                   8521: #ifdef MODULE
                   8522:   /*
                   8523:    * If we are called as a module, the aic7xxx pointer may not be null
                   8524:    * and it would point to our bootup string, just like on the lilo
                   8525:    * command line.  IF not NULL, then process this config string with
                   8526:    * aic7xxx_setup
                   8527:    */
                   8528:   if(aic7xxx)
                   8529:     aic7xxx_setup(aic7xxx, NULL);
                   8530:   if(dummy_buffer[0] != 'P')
                   8531:     printk(KERN_WARNING "aic7xxx: Please read the file /usr/src/linux/drivers"
                   8532:       "/scsi/README.aic7xxx\n"
                   8533:       "aic7xxx: to see the proper way to specify options to the aic7xxx "
                   8534:       "module\n"
                   8535:       "aic7xxx: Specifically, don't use any commas when passing arguments to\n"
                   8536:       "aic7xxx: insmod or else it might trash certain memory areas.\n");
                   8537: #endif
                   8538: 
                   8539:   template->proc_dir = &proc_scsi_aic7xxx;
                   8540:   template->sg_tablesize = AIC7XXX_MAX_SG;
                   8541: 
                   8542: 
                   8543: #if defined(__i386__) || defined(__alpha__)
                   8544:   /*
                   8545:    * EISA/VL-bus card signature probe.
                   8546:    */
                   8547:   slot = MINSLOT;
                   8548:   while ( (slot <= MAXSLOT) && !(aic7xxx_no_probe) )
                   8549:   {
                   8550:     base = SLOTBASE(slot) + MINREG;
                   8551: 
                   8552:     if (check_region(base, MAXREG - MINREG))
                   8553:     {
                   8554:       /*
                   8555:        * Some other driver has staked a
                   8556:        * claim to this i/o region already.
                   8557:        */
                   8558:       slot++;
                   8559:       continue; /* back to the beginning of the for loop */
                   8560:     }
                   8561:     flags = 0;
                   8562:     type = aic7xxx_probe(slot, base + AHC_HID0, &flags);
                   8563:     if (type == -1)
                   8564:     {
                   8565:       slot++;
                   8566:       continue;
                   8567:     }
                   8568:     temp_p = kmalloc(sizeof(struct aic7xxx_host), GFP_ATOMIC);
                   8569:     if (temp_p == NULL)
                   8570:     {
                   8571:       printk(KERN_WARNING "aic7xxx: Unable to allocate device space.\n");
                   8572:       slot++;
                   8573:       continue; /* back to the beginning of the while loop */
                   8574:     }
                   8575:     /*
                   8576:      * Pause the card preserving the IRQ type.  Allow the operator
                   8577:      * to override the IRQ trigger.
                   8578:      */
                   8579:     if (aic7xxx_irq_trigger == 1)
                   8580:       hcntrl = IRQMS;  /* Level */
                   8581:     else if (aic7xxx_irq_trigger == 0)
                   8582:       hcntrl = 0;  /* Edge */
                   8583:     else
                   8584:       hcntrl = inb(base + HCNTRL) & IRQMS;  /* Default */
                   8585:     memset(temp_p, 0, sizeof(struct aic7xxx_host));
                   8586:     temp_p->unpause = hcntrl | INTEN;
                   8587:     temp_p->pause = hcntrl | PAUSE | INTEN;
                   8588:     temp_p->base = base;
                   8589:     temp_p->mbase = 0;
                   8590:     temp_p->maddr = 0;
                   8591:     temp_p->pci_bus = 0;
                   8592:     temp_p->pci_device_fn = slot;
                   8593:     aic_outb(temp_p, hcntrl | PAUSE, HCNTRL);
                   8594:     while( (aic_inb(temp_p, HCNTRL) & PAUSE) == 0 ) ;
                   8595:     if (aic7xxx_chip_reset(temp_p) == -1)
                   8596:       temp_p->irq = 0;
                   8597:     else
                   8598:       temp_p->irq = aic_inb(temp_p, INTDEF) & 0x0F;
                   8599:     temp_p->flags |= AHC_PAGESCBS;
                   8600: 
                   8601:     switch (temp_p->irq)
                   8602:     {
                   8603:       case 9:
                   8604:       case 10:
                   8605:       case 11:
                   8606:       case 12:
                   8607:       case 14:
                   8608:       case 15:
                   8609:         break;
                   8610: 
                   8611:       default:
                   8612:         printk(KERN_WARNING "aic7xxx: Host adapter uses unsupported IRQ "
                   8613:           "level %d, ignoring.\n", temp_p->irq);
                   8614:         kfree(temp_p);
                   8615:         slot++;
                   8616:         continue; /* back to the beginning of the while loop */
                   8617:     }
                   8618: 
                   8619:     /*
                   8620:      * We are commited now, everything has been checked and this card
                   8621:      * has been found, now we just set it up
                   8622:      */
                   8623: 
                   8624:     /*
                   8625:      * Insert our new struct into the list at the end
                   8626:      */
                   8627:     if (list_p == NULL)
                   8628:     {
                   8629:       list_p = current_p = temp_p;
                   8630:     }
                   8631:     else
                   8632:     {
                   8633:       current_p = list_p;
                   8634:       while (current_p->next != NULL)
                   8635:         current_p = current_p->next;
                   8636:       current_p->next = temp_p;
                   8637:     }
                   8638:     if (aic7xxx_extended)
                   8639:     {
                   8640:       temp_p->flags |= AHC_EXTEND_TRANS_A;
                   8641:       if (temp_p->flags & AHC_MULTI_CHANNEL)
                   8642:         temp_p->flags |= AHC_EXTEND_TRANS_B;
                   8643:     }
                   8644: 
                   8645:     switch (type)
                   8646:     {
                   8647:       case 0:
                   8648:         temp_p->board_name_index = 2;
                   8649:         if (aic7xxx_verbose & VERBOSE_PROBE2)
                   8650:           printk("aic7xxx: <%s> at EISA %d\n",
                   8651:                board_names[2], slot);
                   8652:         /* FALLTHROUGH */
                   8653:       case 1:
                   8654:       {
                   8655:         temp_p->chip = AHC_AIC7770 | AHC_EISA;
                   8656:         temp_p->features |= AHC_AIC7770_FE;
                   8657:         temp_p->bios_control = aic_inb(temp_p, HA_274_BIOSCTRL);
                   8658: 
                   8659:         /*
                   8660:          * Get the primary channel information.  Right now we don't
                   8661:          * do anything with this, but someday we will be able to inform
                   8662:          * the mid-level SCSI code which channel is primary.
                   8663:          */
                   8664:         if (temp_p->board_name_index == 0)
                   8665:         {
                   8666:           temp_p->board_name_index = 3;
                   8667:           if (aic7xxx_verbose & VERBOSE_PROBE2)
                   8668:             printk("aic7xxx: <%s> at EISA %d\n",
                   8669:                  board_names[3], slot);
                   8670:         }
                   8671:         if (temp_p->bios_control & CHANNEL_B_PRIMARY)
                   8672:         {
                   8673:           temp_p->flags |= AHC_CHANNEL_B_PRIMARY;
                   8674:         }
                   8675: 
                   8676:         if ((temp_p->bios_control & BIOSMODE) == BIOSDISABLED)
                   8677:         {
                   8678:           temp_p->flags &= ~AHC_BIOS_ENABLED;
                   8679:         }
                   8680:         else
                   8681:         {
                   8682:           temp_p->flags &= ~AHC_USEDEFAULTS;
                   8683:           temp_p->flags |= AHC_BIOS_ENABLED;
                   8684:           if ( (temp_p->bios_control & 0x20) == 0 )
                   8685:           {
                   8686:             temp_p->bios_address = 0xcc000;
                   8687:             temp_p->bios_address += (0x4000 * (temp_p->bios_control & 0x07));
                   8688:           }
                   8689:           else
                   8690:           {
                   8691:             temp_p->bios_address = 0xd0000;
                   8692:             temp_p->bios_address += (0x8000 * (temp_p->bios_control & 0x06));
                   8693:           }
                   8694:         }
                   8695:         temp_p->adapter_control = aic_inb(temp_p, SCSICONF) << 8;
                   8696:         temp_p->adapter_control |= aic_inb(temp_p, SCSICONF + 1);
                   8697:         if (temp_p->features & AHC_WIDE)
                   8698:         {
                   8699:           temp_p->scsi_id = temp_p->adapter_control & HWSCSIID;
                   8700:           temp_p->scsi_id_b = temp_p->scsi_id;
                   8701:         }
                   8702:         else
                   8703:         {
                   8704:           temp_p->scsi_id = (temp_p->adapter_control >> 8) & HSCSIID;
                   8705:           temp_p->scsi_id_b = temp_p->adapter_control & HSCSIID;
                   8706:         }
                   8707:         aic7xxx_load_seeprom(temp_p, &sxfrctl1);
                   8708:         break;
                   8709:       }
                   8710: 
                   8711:       case 2:
                   8712:       case 3:
                   8713:         temp_p->chip = AHC_AIC7770 | AHC_VL;
                   8714:         temp_p->features |= AHC_AIC7770_FE;
                   8715:         if (type == 2)
                   8716:           temp_p->flags |= AHC_BIOS_ENABLED;
                   8717:         else
                   8718:           temp_p->flags &= ~AHC_BIOS_ENABLED;
                   8719:         if (aic_inb(temp_p, SCSICONF) & TERM_ENB)
                   8720:           sxfrctl1 = STPWEN;
                   8721:         aic7xxx_load_seeprom(temp_p, &sxfrctl1);
                   8722:         temp_p->board_name_index = 4;
                   8723:         if (aic7xxx_verbose & VERBOSE_PROBE2)
                   8724:           printk("aic7xxx: <%s> at VLB %d\n",
                   8725:                board_names[2], slot);
                   8726:         switch( aic_inb(temp_p, STATUS_2840) & BIOS_SEL )
                   8727:         {
                   8728:           case 0x00:
                   8729:             temp_p->bios_address = 0xe0000;
                   8730:             break;
                   8731:           case 0x20:
                   8732:             temp_p->bios_address = 0xc8000;
                   8733:             break;
                   8734:           case 0x40:
                   8735:             temp_p->bios_address = 0xd0000;
                   8736:             break;
                   8737:           case 0x60:
                   8738:             temp_p->bios_address = 0xd8000;
                   8739:             break;
                   8740:           default:
                   8741:             break; /* can't get here */
                   8742:         }
                   8743:         break;
                   8744: 
                   8745:       default:  /* Won't get here. */
                   8746:         break;
                   8747:     }
                   8748:     if (aic7xxx_verbose & VERBOSE_PROBE2)
                   8749:     {
                   8750:       printk(KERN_INFO "aic7xxx: BIOS %sabled, IO Port 0x%lx, IRQ %d (%s)\n",
                   8751:         (temp_p->flags & AHC_USEDEFAULTS) ? "dis" : "en", temp_p->base,
                   8752:         temp_p->irq,
                   8753:         (temp_p->pause & IRQMS) ? "level sensitive" : "edge triggered");
                   8754:       printk(KERN_INFO "aic7xxx: Extended translation %sabled.\n",
                   8755:              (temp_p->flags & AHC_EXTEND_TRANS_A) ? "en" : "dis");
                   8756:     }
                   8757: 
                   8758:     /*
                   8759:      * Set the FIFO threshold and the bus off time.
                   8760:      */
                   8761:     hostconf = aic_inb(temp_p, HOSTCONF);
                   8762:     aic_outb(temp_p, hostconf & DFTHRSH, BUSSPD);
                   8763:     aic_outb(temp_p, (hostconf << 2) & BOFF, BUSTIME);
                   8764:     slot++;
                   8765:     found++;
                   8766:   }
                   8767: 
                   8768: #endif /* defined(__i386__) || defined(__alpha__) */
                   8769: 
                   8770: #ifdef CONFIG_PCI
                   8771:   /*
                   8772:    * PCI-bus probe.
                   8773:    */
                   8774: #if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,92)
                   8775:   if (pci_present())
                   8776: #else
                   8777:   if (pcibios_present())
                   8778: #endif
                   8779:   {
                   8780:     struct
                   8781:     {
                   8782:       unsigned short      vendor_id;
                   8783:       unsigned short      device_id;
                   8784:       ahc_chip            chip;
                   8785:       ahc_flag_type       flags;
                   8786:       ahc_feature         features;
                   8787:       int                 board_name_index;
                   8788:       unsigned short      seeprom_size;
                   8789:       unsigned short      seeprom_type;
                   8790:     } const aic_pdevs[] = {
                   8791:       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7810, AHC_NONE,
                   8792:        AHC_FNONE, AHC_FENONE,                                1,
                   8793:        32, C46 },
                   8794:       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7850, AHC_AIC7850,
                   8795:        AHC_PAGESCBS, AHC_AIC7850_FE,                         5,
                   8796:        32, C46 },
                   8797:       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7855, AHC_AIC7850,
                   8798:        AHC_PAGESCBS, AHC_AIC7850_FE,                         6,
                   8799:        32, C46 },
                   8800:       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7860, AHC_AIC7860,
                   8801:        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED,
                   8802:        AHC_AIC7860_FE,                                       7,
                   8803:        32, C46 },
                   8804:       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7861, AHC_AIC7860,
                   8805:        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED,
                   8806:        AHC_AIC7860_FE,                                       8,
                   8807:        32, C46 },
                   8808:       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7870, AHC_AIC7870,
                   8809:        AHC_PAGESCBS | AHC_BIOS_ENABLED, AHC_AIC7870_FE,      9,
                   8810:        32, C46 },
                   8811:       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7871, AHC_AIC7870,
                   8812:        AHC_PAGESCBS | AHC_BIOS_ENABLED, AHC_AIC7870_FE,     10,
                   8813:        32, C46 },
                   8814:       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7872, AHC_AIC7870,
                   8815:        AHC_PAGESCBS | AHC_BIOS_ENABLED | AHC_MULTI_CHANNEL,
                   8816:        AHC_AIC7870_FE,                                      11,
                   8817:        32, C56_66 },
                   8818:       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7873, AHC_AIC7870,
                   8819:        AHC_PAGESCBS | AHC_BIOS_ENABLED | AHC_MULTI_CHANNEL,
                   8820:        AHC_AIC7870_FE,                                      12,
                   8821:        32, C56_66 },
                   8822:       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7874, AHC_AIC7870,
                   8823:        AHC_PAGESCBS | AHC_BIOS_ENABLED, AHC_AIC7870_FE,     13,
                   8824:        32, C46 },
                   8825:       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7880, AHC_AIC7880,
                   8826:        AHC_PAGESCBS | AHC_BIOS_ENABLED, AHC_AIC7880_FE,     14,
                   8827:        32, C46 },
                   8828:       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7881, AHC_AIC7880,
                   8829:        AHC_PAGESCBS | AHC_BIOS_ENABLED, AHC_AIC7880_FE,     15,
                   8830:        32, C46 },
                   8831:       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7882, AHC_AIC7880,
                   8832:        AHC_PAGESCBS | AHC_BIOS_ENABLED | AHC_MULTI_CHANNEL,
                   8833:        AHC_AIC7880_FE,                                      16,
                   8834:        32, C56_66 },
                   8835:       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7883, AHC_AIC7880,
                   8836:        AHC_PAGESCBS | AHC_BIOS_ENABLED | AHC_MULTI_CHANNEL,
                   8837:        AHC_AIC7880_FE,                                      17,
                   8838:        32, C56_66 },
                   8839:       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7884, AHC_AIC7880,
                   8840:        AHC_PAGESCBS | AHC_BIOS_ENABLED, AHC_AIC7880_FE,     18,
                   8841:        32, C46 },
                   8842:       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7895, AHC_AIC7895,
                   8843:        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED | AHC_MULTI_CHANNEL,
                   8844:        AHC_AIC7895_FE,                                      19,
                   8845:        32, C56_66 },
                   8846:       {PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_7890, AHC_AIC7890,
                   8847:        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED,
                   8848:        AHC_AIC7890_FE,                                      20,
                   8849:        32, C46 },
                   8850:       {PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_2940U2, AHC_AIC7890,
                   8851:        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED,
                   8852:        AHC_AIC7890_FE,                                      21,
                   8853:        32, C46 },
                   8854:       {PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_7896, AHC_AIC7896,
                   8855:        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED | AHC_MULTI_CHANNEL,
                   8856:        AHC_AIC7896_FE,                                      22,
                   8857:        32, C56_66 },
                   8858:       {PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_3940U2, AHC_AIC7896,
                   8859:        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED | AHC_MULTI_CHANNEL,
                   8860:        AHC_AIC7896_FE,                                      23,
                   8861:        32, C56_66 },
                   8862:     };
                   8863: 
                   8864:     unsigned short command;
                   8865:     unsigned int  devconfig, i, oldverbose;
                   8866: #ifdef MMAPIO
                   8867:     unsigned long page_offset, base;
                   8868: #endif
                   8869: #if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,92)
                   8870:     struct pci_dev *pdev = NULL;
                   8871: #else
                   8872:     int index;
                   8873:     unsigned int piobase, mmapbase;
                   8874:     unsigned char pci_bus, pci_devfn, pci_irq;
                   8875: #endif
                   8876: 
                   8877:     for (i = 0; i < NUMBER(aic_pdevs); i++)
                   8878:     {
                   8879: #if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,92)
                   8880:       pdev = NULL;
                   8881:       while ((pdev = pci_find_device(aic_pdevs[i].vendor_id,
                   8882:                                      aic_pdevs[i].device_id,
                   8883:                                      pdev)))
                   8884: #else
                   8885:       index = 0;
                   8886:       while (!(pcibios_find_device(aic_pdevs[i].vendor_id,
                   8887:                                    aic_pdevs[i].device_id,
                   8888:                                    index++, &pci_bus, &pci_devfn)) )
                   8889: #endif
                   8890:       {
                   8891:         if ( i == 0 ) /* We found one, but it's the 7810 RAID cont. */
                   8892:         {
                   8893:           if (aic7xxx_verbose & (VERBOSE_PROBE|VERBOSE_PROBE2))
                   8894:           {
                   8895:             printk(KERN_INFO "aic7xxx: The 7810 RAID controller is not "
                   8896:               "supported by\n");
                   8897:             printk(KERN_INFO "         this driver, we are ignoring it.\n");
                   8898:           }
                   8899:         }
                   8900:         else if ( (temp_p = kmalloc(sizeof(struct aic7xxx_host),
                   8901:                                     GFP_ATOMIC)) != NULL )
                   8902:         {
                   8903:           memset(temp_p, 0, sizeof(struct aic7xxx_host));
                   8904:           temp_p->chip = aic_pdevs[i].chip | AHC_PCI;
                   8905:           temp_p->flags = aic_pdevs[i].flags;
                   8906:           temp_p->features = aic_pdevs[i].features;
                   8907:           temp_p->board_name_index = aic_pdevs[i].board_name_index;
                   8908:           temp_p->sc_size = aic_pdevs[i].seeprom_size;
                   8909:           temp_p->sc_type = aic_pdevs[i].seeprom_type;
                   8910: 
                   8911:           /*
                   8912:            * Read sundry information from PCI BIOS.
                   8913:            */
                   8914: #if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,92)
                   8915:           temp_p->irq = pdev->irq;
                   8916:           temp_p->pdev = pdev;
                   8917:           temp_p->pci_bus = pdev->bus->number;
                   8918:           temp_p->pci_device_fn = pdev->devfn;
                   8919:           temp_p->base = pdev->base_address[0];
                   8920:           temp_p->mbase = pdev->base_address[1];
                   8921:           if (aic7xxx_verbose & VERBOSE_PROBE2)
                   8922:             printk("aic7xxx: <%s> at PCI %d/%d\n", 
                   8923:               board_names[aic_pdevs[i].board_name_index],
                   8924:               PCI_SLOT(temp_p->pdev->devfn),
                   8925:               PCI_FUNC(temp_p->pdev->devfn));
                   8926:           pci_read_config_word(pdev, PCI_COMMAND, &command);
                   8927:           if (aic7xxx_verbose & VERBOSE_PROBE2)
                   8928:           {
                   8929:             printk("aic7xxx: Initial PCI_COMMAND value was 0x%x\n",
                   8930:               (int)command);
                   8931:           }
                   8932: #ifdef AIC7XXX_STRICT_PCI_SETUP
                   8933:           command |= PCI_COMMAND_SERR | PCI_COMMAND_PARITY |
                   8934:             PCI_COMMAND_INVALIDATE | PCI_COMMAND_MASTER |
                   8935:             PCI_COMMAND_MEMORY | PCI_COMMAND_IO;
                   8936: #else
                   8937:           command |= PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY | PCI_COMMAND_IO;
                   8938: #endif
                   8939:           if (aic7xxx_pci_parity == 0)
                   8940:             command &= ~(PCI_COMMAND_SERR | PCI_COMMAND_PARITY);
                   8941:           pci_write_config_word(pdev, PCI_COMMAND, command);
                   8942: #ifdef AIC7XXX_STRICT_PCI_SETUP
                   8943:           pci_read_config_dword(pdev, DEVCONFIG, &devconfig);
                   8944:           if (aic7xxx_verbose & VERBOSE_PROBE2)
                   8945:           {
                   8946:             printk("aic7xxx: Initial DEVCONFIG value was 0x%x\n", devconfig);
                   8947:           }
                   8948:           devconfig |= 0x80000000;
                   8949:           if ((aic7xxx_pci_parity == 0) || (aic7xxx_pci_parity == -1))
                   8950:           {
                   8951:             devconfig &= ~(0x00000008);
                   8952:           }
                   8953:           else
                   8954:           {
                   8955:             devconfig |= 0x00000008;
                   8956:           }
                   8957:           pci_write_config_dword(pdev, DEVCONFIG, devconfig);
                   8958: #endif /* AIC7XXX_STRICT_PCI_SETUP */
                   8959: #else  /* LINUX_VERSION_CODE > KERNEL_VERSION(2,1,92) */
                   8960:           temp_p->pci_bus = pci_bus;
                   8961:           temp_p->pci_device_fn = pci_devfn;
                   8962:           if (aic7xxx_verbose & VERBOSE_PROBE2)
                   8963:             printk("aic7xxx: <%s> at PCI %d/%d\n", 
                   8964:               board_names[aic_pdevs[i].board_name_index],
                   8965:               PCI_SLOT(temp_p->pci_device_fn),
                   8966:               PCI_FUNC(temp_p->pci_device_fn));
                   8967:           pcibios_read_config_byte(pci_bus, pci_devfn, PCI_INTERRUPT_LINE,
                   8968:             &pci_irq);
                   8969:           temp_p->irq = pci_irq;
                   8970:           pcibios_read_config_dword(pci_bus, pci_devfn, PCI_BASE_ADDRESS_0,
                   8971:             &piobase);
                   8972:           temp_p->base = piobase;
                   8973:           pcibios_read_config_dword(pci_bus, pci_devfn, PCI_BASE_ADDRESS_1,
                   8974:             &mmapbase);
                   8975:           temp_p->mbase = mmapbase;
                   8976:           pcibios_read_config_word(pci_bus, pci_devfn, PCI_COMMAND, &command);
                   8977:           if (aic7xxx_verbose & VERBOSE_PROBE2)
                   8978:           {
                   8979:             printk("aic7xxx: Initial PCI_COMMAND value was 0x%x\n",
                   8980:               (int)command);
                   8981:           }
                   8982: #ifdef AIC7XXX_STRICT_PCI_SETUP
                   8983:           command |= PCI_COMMAND_SERR | PCI_COMMAND_PARITY |
                   8984:             PCI_COMMAND_INVALIDATE | PCI_COMMAND_MASTER |
                   8985:             PCI_COMMAND_MEMORY | PCI_COMMAND_IO;
                   8986: #else
                   8987:           command |= PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY | PCI_COMMAND_IO;
                   8988: #endif
                   8989:           if (aic7xxx_pci_parity == 0)
                   8990:             command &= ~(PCI_COMMAND_SERR | PCI_COMMAND_PARITY);
                   8991:           pcibios_write_config_word(pci_bus, pci_devfn, PCI_COMMAND, command);
                   8992: #ifdef AIC7XXX_STRICT_PCI_SETUP
                   8993:           pcibios_read_config_dword(pci_bus, pci_devfn, DEVCONFIG, &devconfig);
                   8994:           if (aic7xxx_verbose & VERBOSE_PROBE2)
                   8995:           {
                   8996:             printk("aic7xxx: Initial DEVCONFIG value was 0x%x\n", devconfig);
                   8997:           }
                   8998:           devconfig |= 0x80000000;
                   8999:           if ((aic7xxx_pci_parity == 0) || (aic7xxx_pci_parity == -1))
                   9000:           {
                   9001:             devconfig &= ~(0x00000008);
                   9002:           }
                   9003:           else
                   9004:           {
                   9005:             devconfig |= 0x00000008;
                   9006:           }
                   9007:           pcibios_write_config_dword(pci_bus, pci_devfn, DEVCONFIG, devconfig);
                   9008: #endif /* AIC7XXX_STRICT_PCI_SETUP */
                   9009: #endif /* LINUIX_VERSION_CODE > KERNEL_VERSION(2,1,92) */
                   9010: 
                   9011:           /*
                   9012:            * The first bit (LSB) of PCI_BASE_ADDRESS_0 is always set, so
                   9013:            * we mask it off.
                   9014:            */
                   9015:           temp_p->base &= PCI_BASE_ADDRESS_IO_MASK;
                   9016:           temp_p->mbase &= PCI_BASE_ADDRESS_MEM_MASK;
                   9017:           temp_p->unpause = INTEN;
                   9018:           temp_p->pause = temp_p->unpause | PAUSE;
                   9019: 
                   9020: #ifdef MMAPIO
                   9021:           base = temp_p->mbase & PAGE_MASK;
                   9022:           page_offset = temp_p->mbase - base;
                   9023: #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,0)
                   9024:           temp_p->maddr = ioremap_nocache(base, page_offset + 256);
                   9025: #else
                   9026:           temp_p->maddr = vremap(base, page_offset + 256);
                   9027: #endif
                   9028:           if(temp_p->maddr)
                   9029:           {
                   9030:             temp_p->maddr += page_offset;
                   9031:           }
                   9032: #endif
                   9033: 
                   9034:           pause_sequencer(temp_p);
                   9035: 
                   9036:           /*
                   9037:            * Clear out any pending PCI error status messages.  Also set
                   9038:            * verbose to 0 so that we don't emit strange PCI error messages
                   9039:            * while cleaning out the current status bits.
                   9040:            */
                   9041:           oldverbose = aic7xxx_verbose;
                   9042:           aic7xxx_verbose = 0;
                   9043:           aic7xxx_pci_intr(temp_p);
                   9044:           aic7xxx_verbose = oldverbose;
                   9045: 
                   9046:           temp_p->bios_address = 0;
                   9047: 
                   9048:           /*
                   9049:            * Remember how the card was setup in case there is no seeprom.
                   9050:            */
                   9051:           if (temp_p->features & AHC_ULTRA2)
                   9052:             temp_p->scsi_id = aic_inb(temp_p, SCSIID_ULTRA2) & OID;
                   9053:           else
                   9054:             temp_p->scsi_id = aic_inb(temp_p, SCSIID) & OID;
                   9055:           /*
                   9056:            * Get current termination setting
                   9057:            */
                   9058:           sxfrctl1 = aic_inb(temp_p, SXFRCTL1) & STPWEN;
                   9059: 
                   9060:           if (aic7xxx_chip_reset(temp_p) == -1)
                   9061:           {
                   9062:             kfree(temp_p);
                   9063:             temp_p = NULL;
                   9064:             continue;
                   9065:           }
                   9066: 
                   9067:           /*
                   9068:            * Doing a switch based upon i is really gross, but since Justin
                   9069:            * changed around the chip ID stuff, we can't use that any more.
                   9070:            * Since we don't scan the devices the same way as FreeBSD, we end
                   9071:            * up doing this gross hack in order to avoid totally splitting
                   9072:            * away from Justin's init code in ahc_pci.c
                   9073:            */
                   9074:           switch (i)
                   9075:           {
                   9076:             case 7:   /* 3940 */
                   9077:             case 12:  /* 3940-Ultra */
                   9078:               switch(PCI_SLOT(temp_p->pci_device_fn))
                   9079:               {
                   9080:                 case 5:
                   9081:                   temp_p->flags |= AHC_CHNLB;
                   9082:                   break;
                   9083:                 default:
                   9084:                   break;
                   9085:               }
                   9086:               break;
                   9087: 
                   9088:             case 8:   /* 3985 */
                   9089:             case 13:  /* 3985-Ultra */
                   9090:               switch(PCI_SLOT(temp_p->pci_device_fn))
                   9091:               {
                   9092:                 case 8:
                   9093:                   temp_p->flags |= AHC_CHNLB;
                   9094:                   break;
                   9095:                 case 12:
                   9096:                   temp_p->flags |= AHC_CHNLC;
                   9097:                   break;
                   9098:                 default:
                   9099:                   break;
                   9100:               }
                   9101:               break;
                   9102: 
                   9103:             case 15:
                   9104:             case 18:
                   9105:             case 19:
                   9106: #if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,92)
                   9107:               if (PCI_FUNC(temp_p->pdev->devfn) != 0)
                   9108:               {
                   9109:                 temp_p->flags |= AHC_CHNLB;
                   9110:               }
                   9111:               /*
                   9112:                * The 7895 is the only chipset that sets the SCBSIZE32 param
                   9113:                * in the DEVCONFIG register.  The Ultra2 chipsets use
                   9114:                * the DSCOMMAND0 register instead.
                   9115:                */
                   9116:               if ((temp_p->chip & AHC_CHIPID_MASK) == AHC_AIC7895)
                   9117:               {
                   9118:                 pci_read_config_dword(pdev, DEVCONFIG, &devconfig);
                   9119:                 devconfig |= SCBSIZE32;
                   9120:                 pci_write_config_dword(pdev, DEVCONFIG, devconfig);
                   9121:               }
                   9122: #else
                   9123:               if (PCI_FUNC(temp_p->pci_device_fn) != 0)
                   9124:               {
                   9125:                 temp_p->flags |= AHC_CHNLB;
                   9126:               }
                   9127:               /*
                   9128:                * The 7895 is the only chipset that sets the SCBSIZE32 param
                   9129:                * in the DEVCONFIG register.  The Ultra2 chipsets use
                   9130:                * the DSCOMMAND0 register instead.
                   9131:                */
                   9132:               if ((temp_p->chip & AHC_CHIPID_MASK) == AHC_AIC7895)
                   9133:               {
                   9134:                 pcibios_read_config_dword(pci_bus, pci_devfn, DEVCONFIG,
                   9135:                   &devconfig);
                   9136:                 devconfig |= SCBSIZE32;
                   9137:                 pcibios_write_config_dword(pci_bus, pci_devfn, DEVCONFIG,
                   9138:                   devconfig);
                   9139:               }
                   9140: #endif
                   9141:               break;
                   9142:             default:
                   9143:               break;
                   9144:           }
                   9145: 
                   9146:           /*
                   9147:            * Loading of the SEEPROM needs to come after we've set the flags
                   9148:            * to indicate possible CHNLB and CHNLC assigments.  Otherwise,
                   9149:            * on 394x and 398x cards we'll end up reading the wrong settings
                   9150:            * for channels B and C
                   9151:            */
                   9152:           switch (temp_p->chip & AHC_CHIPID_MASK)
                   9153:           {
                   9154:             case AHC_AIC7890:
                   9155:             case AHC_AIC7896:
                   9156:               aic_outb(temp_p, 0, SCAMCTL);
                   9157:               /*
                   9158:                * We used to set DPARCKEN in this register, but after talking
                   9159:                * to a tech from Adaptec, I found out they don't use that
                   9160:                * particular bit in their own register settings, and when you
                   9161:                * combine that with the fact that I determined that we were
                   9162:                * seeing Data-Path Parity Errors on things we shouldn't see
                   9163:                * them on, I think there is a bug in the silicon and the way
                   9164:                * to work around it is to disable this particular check.  Also
                   9165:                * This bug only showed up on certain commands, so it seems to
                   9166:                * be pattern related or some such.  The commands we would
                   9167:                * typically send as a linux TEST_UNIT_READY or INQUIRY command
                   9168:                * could cause it to be triggered, while regular commands that
                   9169:                * actually made reasonable use of the SG array capabilities
                   9170:                * seemed not to cause the problem.
                   9171:                */
                   9172:               /*
                   9173:               aic_outb(temp_p, aic_inb(temp_p, DSCOMMAND0) |
                   9174:                                CACHETHEN | DPARCKEN | MPARCKEN |
                   9175:                                USCBSIZE32 | CIOPARCKEN,
                   9176:                                DSCOMMAND0);
                   9177:                */
                   9178:               aic_outb(temp_p, (aic_inb(temp_p, DSCOMMAND0) |
                   9179:                                 CACHETHEN | MPARCKEN | USCBSIZE32 |
                   9180:                                 CIOPARCKEN) & ~DPARCKEN, DSCOMMAND0);
                   9181:               /* FALLTHROUGH */
                   9182:             default:
                   9183:               /*
                   9184:                * We attempt to read a SEEPROM on *everything*.  If we fail,
                   9185:                * then we fail, but this covers things like 2910c cards that
                   9186:                * now have SEEPROMs with their 7856 chipset that we would
                   9187:                * otherwise ignore.  They still don't have a BIOS, but they
                   9188:                * have a SEEPROM that the SCSISelect utility on the Adaptec
                   9189:                * diskettes can configure.
                   9190:                */
                   9191:               aic7xxx_load_seeprom(temp_p, &sxfrctl1);
                   9192:               break;
                   9193:             case AHC_AIC7850:
                   9194:             case AHC_AIC7860:
                   9195:               /*
                   9196:                * Set the DSCOMMAND0 register on these cards different from
                   9197:                * on the 789x cards.  Also, read the SEEPROM as well.
                   9198:                */
                   9199:               aic_outb(temp_p, (aic_inb(temp_p, DSCOMMAND0) |
                   9200:                                 CACHETHEN | MPARCKEN) & ~DPARCKEN,
                   9201:                        DSCOMMAND0);
                   9202:               aic7xxx_load_seeprom(temp_p, &sxfrctl1);
                   9203:               break;
                   9204:             case AHC_AIC7880:
                   9205:               /*
                   9206:                * Only set the DSCOMMAND0 register if this is a Rev B.
                   9207:                * chipset.  For those, we also enable Ultra mode by
                   9208:                * force due to brain-damage on the part of some BIOSes
                   9209:                * We overload the devconfig variable here since we can.
                   9210:                */
                   9211: #if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,92)
                   9212:               pci_read_config_dword(pdev, DEVCONFIG, &devconfig);
                   9213: #else
                   9214:               pcibios_read_config_dword(pci_bus, pci_devfn, DEVCONFIG,
                   9215:                                         &devconfig);
                   9216: #endif
                   9217:               if ((devconfig & 0xff) >= 1)
                   9218:               {
                   9219:                 aic_outb(temp_p, (aic_inb(temp_p, DSCOMMAND0) |
                   9220:                                   CACHETHEN | MPARCKEN) & ~DPARCKEN,
                   9221:                          DSCOMMAND0);
                   9222:               }
                   9223:               aic7xxx_load_seeprom(temp_p, &sxfrctl1);
                   9224:               break;
                   9225:           }
                   9226:           
                   9227: 
                   9228:           /*
                   9229:            * and then we need another switch based on the type in order to
                   9230:            * make sure the channel B primary flag is set properly on 7895
                   9231:            * controllers....Arrrgggghhh!!!  We also have to catch the fact
                   9232:            * that when you disable the BIOS on the 7895 on the Intel DK440LX
                   9233:            * motherboard, and possibly others, it only sets the BIOS disabled
                   9234:            * bit on the A channel...I think I'm starting to lean towards
                   9235:            * going postal....
                   9236:            */
                   9237:           switch(temp_p->chip & AHC_CHIPID_MASK)
                   9238:           {
                   9239:             case AHC_AIC7895:
                   9240:             case AHC_AIC7896:
                   9241:               current_p = list_p;
                   9242:               while(current_p != NULL)
                   9243:               {
                   9244:                 if ( (current_p->pci_bus == temp_p->pci_bus) &&
                   9245:                      (PCI_SLOT(current_p->pci_device_fn) ==
                   9246:                       PCI_SLOT(temp_p->pci_device_fn)) )
                   9247:                 {
                   9248:                   if ( PCI_FUNC(current_p->pci_device_fn) == 0 )
                   9249:                   {
                   9250:                     temp_p->flags |= 
                   9251:                       (current_p->flags & AHC_CHANNEL_B_PRIMARY);
                   9252:                     temp_p->flags &= ~(AHC_BIOS_ENABLED|AHC_USEDEFAULTS);
                   9253:                     temp_p->flags |=
                   9254:                       (current_p->flags & (AHC_BIOS_ENABLED|AHC_USEDEFAULTS));
                   9255:                   }
                   9256:                   else
                   9257:                   {
                   9258:                     current_p->flags |=
                   9259:                       (temp_p->flags & AHC_CHANNEL_B_PRIMARY);
                   9260:                     current_p->flags &= ~(AHC_BIOS_ENABLED|AHC_USEDEFAULTS);
                   9261:                     current_p->flags |=
                   9262:                       (temp_p->flags & (AHC_BIOS_ENABLED|AHC_USEDEFAULTS));
                   9263:                   }
                   9264:                 }
                   9265:                 current_p = current_p->next;
                   9266:               }
                   9267:               break;
                   9268:             default:
                   9269:               break;
                   9270:           }
                   9271: 
                   9272:           /*
                   9273:            * We do another switch based on i so that we can exclude all
                   9274:            * 3895 devices from the next option since the 3895 cards use
                   9275:            * shared external SCB RAM while all other cards have dedicated
                   9276:            * external SCB RAM per channel.  Also exclude the 7850 and
                   9277:            * 7860 based stuff since they can have garbage in the bit
                   9278:            * that indicates external RAM and get some of this stuff
                   9279:            * wrong as a result.
                   9280:            */
                   9281:           switch(temp_p->chip & AHC_CHIPID_MASK)
                   9282:           {
                   9283:             default:
                   9284:               break;
                   9285:             case AHC_AIC7895:
                   9286:             case AHC_AIC7896:
                   9287: #if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,92)
                   9288:               pci_read_config_dword(pdev, DEVCONFIG, &devconfig);
                   9289: #else
                   9290:               pcibios_read_config_dword(pci_bus, pci_devfn, DEVCONFIG,
                   9291:                                         &devconfig);
                   9292: #endif
                   9293:               if (temp_p->features & AHC_ULTRA2)
                   9294:               {
                   9295:                 if (aic_inb(temp_p, DSCOMMAND0) & RAMPSM_ULTRA2)
                   9296:                 {
                   9297:                   aic_outb(temp_p,
                   9298:                            aic_inb(temp_p, DSCOMMAND0) & ~SCBRAMSEL_ULTRA2,
                   9299:                            DSCOMMAND0);
                   9300:                   temp_p->flags |= AHC_EXTERNAL_SRAM;
                   9301:                   devconfig |= EXTSCBPEN;
                   9302:                 }
                   9303:               }
                   9304:               else if (devconfig & RAMPSM)
                   9305:               {
                   9306:                 devconfig &= ~SCBRAMSEL;
                   9307:                 devconfig |= EXTSCBPEN;
                   9308:                 temp_p->flags |= AHC_EXTERNAL_SRAM;
                   9309:               }
                   9310: #if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,92)
                   9311:               pci_write_config_dword(pdev, DEVCONFIG, devconfig);
                   9312: #else
                   9313:               pcibios_write_config_dword(pci_bus, pci_devfn, DEVCONFIG,
                   9314:                                          devconfig);
                   9315: #endif
                   9316:               if ( (temp_p->flags & AHC_EXTERNAL_SRAM) &&
                   9317:                    (temp_p->flags & AHC_CHNLB) )
                   9318:                 aic_outb(temp_p, 1, CCSCBBADDR);
                   9319:               break;
                   9320:           }
                   9321: 
                   9322:           /*
                   9323:            * Take the LED out of diagnostic mode
                   9324:            */
                   9325:           aic_outb(temp_p, 
                   9326:             (aic_inb(temp_p, SBLKCTL) & ~(DIAGLEDEN | DIAGLEDON)),
                   9327:             SBLKCTL);
                   9328: 
                   9329:           /*
                   9330:            * We don't know where this is set in the SEEPROM or by the
                   9331:            * BIOS, so we default to 100%.  On Ultra2 controllers, use 75%
                   9332:            * instead.
                   9333:            */
                   9334:           if (temp_p->features & AHC_ULTRA2)
                   9335:           {
                   9336:             aic_outb(temp_p, RD_DFTHRSH_75 | WR_DFTHRSH_75, DFF_THRSH);
                   9337:           }
                   9338:           else
                   9339:           {
                   9340:             aic_outb(temp_p, DFTHRSH_100, DSPCISTATUS);
                   9341:           }
                   9342: 
                   9343:           if (aic7xxx_extended)
                   9344:             temp_p->flags |= AHC_EXTEND_TRANS_A;
                   9345: 
                   9346:           if ( list_p == NULL )
                   9347:           {
                   9348:             list_p = current_p = temp_p;
                   9349:           }
                   9350:           else
                   9351:           {
                   9352:             current_p = list_p;
                   9353:             while(current_p->next != NULL)
                   9354:               current_p = current_p->next;
                   9355:             current_p->next = temp_p;
                   9356:           }
                   9357:           temp_p->next = NULL;
                   9358:           found++;
                   9359:         }  /* Found an Adaptec PCI device. */
                   9360:         else /* Well, we found one, but we couldn't get any memory */
                   9361:         {
                   9362:           printk("aic7xxx: Found <%s>\n", 
                   9363:             board_names[aic_pdevs[i].board_name_index]);
                   9364:           printk(KERN_INFO "aic7xxx: Unable to allocate device memory, "
                   9365:             "skipping.\n");
                   9366:         }
                   9367:       } /* while(pdev=....) */
                   9368:     } /* for PCI_DEVICES */
                   9369:   } /* PCI BIOS present */
                   9370: #endif CONFIG_PCI
                   9371:   /*
                   9372:    * Now, we re-order the probed devices by BIOS address and BUS class.
                   9373:    * In general, we follow this algorithm to make the adapters show up
                   9374:    * in the same order under linux that the computer finds them.
                   9375:    *  1: All VLB/EISA cards with BIOS_ENABLED first, according to BIOS
                   9376:    *     address, going from lowest to highest.
                   9377:    *  2: All PCI controllers with BIOS_ENABLED next, according to BIOS
                   9378:    *     address, going from lowest to highest.
                   9379:    *  3: Remaining VLB/EISA controllers going in slot order.
                   9380:    *  4: Remaining PCI controllers, going in PCI device order (reversable)
                   9381:    */
                   9382: 
                   9383:   {
                   9384:     struct aic7xxx_host *sort_list[4] = { NULL, NULL, NULL, NULL };
                   9385:     struct aic7xxx_host *vlb, *pci;
                   9386:     struct aic7xxx_host *prev_p;
                   9387:     struct aic7xxx_host *p;
                   9388:     unsigned char left;
                   9389: 
                   9390:     prev_p = vlb = pci = NULL;
                   9391: 
                   9392:     temp_p = list_p;
                   9393:     while (temp_p != NULL)
                   9394:     {
                   9395:       switch(temp_p->chip & ~AHC_CHIPID_MASK)
                   9396:       {
                   9397:         case AHC_EISA:
                   9398:         case AHC_VL:
                   9399:         {
                   9400:           p = temp_p;
                   9401:           if (p->flags & AHC_BIOS_ENABLED)
                   9402:             vlb = sort_list[0];
                   9403:           else
                   9404:             vlb = sort_list[2];
                   9405: 
                   9406:           if (vlb == NULL)
                   9407:           {
                   9408:             vlb = temp_p;
                   9409:             temp_p = temp_p->next;
                   9410:             vlb->next = NULL;
                   9411:           }
                   9412:           else
                   9413:           {
                   9414:             current_p = vlb;
                   9415:             prev_p = NULL;
                   9416:             while ( (current_p != NULL) &&
                   9417:                     (current_p->bios_address < temp_p->bios_address))
                   9418:             {
                   9419:               prev_p = current_p;
                   9420:               current_p = current_p->next;
                   9421:             }
                   9422:             if (prev_p != NULL)
                   9423:             {
                   9424:               prev_p->next = temp_p;
                   9425:               temp_p = temp_p->next;
                   9426:               prev_p->next->next = current_p;
                   9427:             }
                   9428:             else
                   9429:             {
                   9430:               vlb = temp_p;
                   9431:               temp_p = temp_p->next;
                   9432:               vlb->next = current_p;
                   9433:             }
                   9434:           }
                   9435:           
                   9436:           if (p->flags & AHC_BIOS_ENABLED)
                   9437:             sort_list[0] = vlb;
                   9438:           else
                   9439:             sort_list[2] = vlb;
                   9440:           
                   9441:           break;
                   9442:         }
                   9443:         default:  /* All PCI controllers fall through to default */
                   9444:         {
                   9445: 
                   9446:           p = temp_p;
                   9447:           if (p->flags & AHC_BIOS_ENABLED) 
                   9448:             pci = sort_list[1];
                   9449:           else
                   9450:             pci = sort_list[3];
                   9451: 
                   9452:           if (pci == NULL)
                   9453:           {
                   9454:             pci = temp_p;
                   9455:             temp_p = temp_p->next;
                   9456:             pci->next = NULL;
                   9457:           }
                   9458:           else
                   9459:           {
                   9460:             current_p = pci;
                   9461:             prev_p = NULL;
                   9462:             if (!aic7xxx_reverse_scan)
                   9463:             {
                   9464:               while ( (current_p != NULL) &&
                   9465:                       ( (PCI_SLOT(current_p->pci_device_fn) |
                   9466:                         (current_p->pci_bus << 8)) < 
                   9467:                         (PCI_SLOT(temp_p->pci_device_fn) |
                   9468:                         (temp_p->pci_bus << 8)) ) )
                   9469:               {
                   9470:                 prev_p = current_p;
                   9471:                 current_p = current_p->next;
                   9472:               }
                   9473:             }
                   9474:             else
                   9475:             {
                   9476:               while ( (current_p != NULL) &&
                   9477:                       ( (PCI_SLOT(current_p->pci_device_fn) |
                   9478:                         (current_p->pci_bus << 8)) > 
                   9479:                         (PCI_SLOT(temp_p->pci_device_fn) |
                   9480:                         (temp_p->pci_bus << 8)) ) )
                   9481:               {
                   9482:                 prev_p = current_p;
                   9483:                 current_p = current_p->next;
                   9484:               }
                   9485:             }
                   9486:             /*
                   9487:              * Are we dealing with a 7985 where we need to sort the
                   9488:              * channels as well, if so, the bios_address values should
                   9489:              * be the same
                   9490:              */
                   9491:             if ( (current_p) && (temp_p->flags & AHC_MULTI_CHANNEL) &&
                   9492:                  (temp_p->pci_bus == current_p->pci_bus) &&
                   9493:                  (PCI_SLOT(temp_p->pci_device_fn) ==
                   9494:                   PCI_SLOT(current_p->pci_device_fn)) )
                   9495:             {
                   9496:               if (temp_p->flags & AHC_CHNLB)
                   9497:               {
                   9498:                 if ( !(temp_p->flags & AHC_CHANNEL_B_PRIMARY) )
                   9499:                 {
                   9500:                   prev_p = current_p;
                   9501:                   current_p = current_p->next;
                   9502:                 }
                   9503:               }
                   9504:               else
                   9505:               {
                   9506:                 if (temp_p->flags & AHC_CHANNEL_B_PRIMARY)
                   9507:                 {
                   9508:                   prev_p = current_p;
                   9509:                   current_p = current_p->next;
                   9510:                 }
                   9511:               }
                   9512:             }
                   9513:             if (prev_p != NULL)
                   9514:             {
                   9515:               prev_p->next = temp_p;
                   9516:               temp_p = temp_p->next;
                   9517:               prev_p->next->next = current_p;
                   9518:             }
                   9519:             else
                   9520:             {
                   9521:               pci = temp_p;
                   9522:               temp_p = temp_p->next;
                   9523:               pci->next = current_p;
                   9524:             }
                   9525:           }
                   9526: 
                   9527:           if (p->flags & AHC_BIOS_ENABLED)
                   9528:             sort_list[1] = pci;
                   9529:           else
                   9530:             sort_list[3] = pci;
                   9531: 
                   9532:           break;
                   9533:         }
                   9534:       }  /* End of switch(temp_p->type) */
                   9535:     } /* End of while (temp_p != NULL) */
                   9536:     /*
                   9537:      * At this point, the cards have been broken into 4 sorted lists, now
                   9538:      * we run through the lists in order and register each controller
                   9539:      */
                   9540:     {
                   9541:       int i;
                   9542:       
                   9543:       left = found;
                   9544:       for (i=0; i<NUMBER(sort_list); i++)
                   9545:       {
                   9546:         temp_p = sort_list[i];
                   9547:         while(temp_p != NULL)
                   9548:         {
                   9549:           template->name = board_names[temp_p->board_name_index];
                   9550:           p = aic7xxx_alloc(template, temp_p);
                   9551:           if (p != NULL)
                   9552:           {
                   9553:             p->instance = found - left;
                   9554:             if (aic7xxx_register(template, p, (--left)) == 0)
                   9555:             {
                   9556:               found--;
                   9557:               aic7xxx_release(p->host);
                   9558:               scsi_unregister(p->host);
                   9559:             }
                   9560:             else if (aic7xxx_dump_card)
                   9561:             {
                   9562:               pause_sequencer(p);
                   9563:               aic7xxx_print_card(p);
                   9564:               aic7xxx_print_scratch_ram(p);
                   9565:               unpause_sequencer(p, TRUE);
                   9566:             }
                   9567:           }
                   9568:           current_p = temp_p;
                   9569:           temp_p = (struct aic7xxx_host *)temp_p->next;
                   9570:           kfree(current_p);
                   9571:         }
                   9572:       }
                   9573:     }
                   9574:   }
                   9575:   return (found);
                   9576: }
                   9577: 
                   9578: #ifdef AIC7XXX_FAKE_NEGOTIATION_CMDS
                   9579: 
                   9580: /*+F*************************************************************************
                   9581:  * Function:
                   9582:  *   aic7xxx_negotiation_complete
                   9583:  *
                   9584:  * Description:
                   9585:  *   Handle completion events for our Negotiation commands.  Clear out the
                   9586:  *   struct and get it ready for its next use.
                   9587:  *-F*************************************************************************/
                   9588: static void
                   9589: aic7xxx_negotiation_complete(Scsi_Cmnd *cmd)
                   9590: {
                   9591:   return;
                   9592: }
                   9593: 
                   9594: /*+F*************************************************************************
                   9595:  * Function:
                   9596:  *   aic7xxx_build_negotiation_command
                   9597:  *
                   9598:  * Description:
                   9599:  *   Build a Scsi_Cmnd structure to perform negotiation with or else send
                   9600:  *   a pre-built command specifically for this purpose.
                   9601:  *-F*************************************************************************/
                   9602: static void
                   9603: aic7xxx_build_negotiation_cmnd(struct aic7xxx_host *p, Scsi_Cmnd *old_cmd,
                   9604:   int tindex)
                   9605: {
                   9606: 
                   9607:   if ( (p->needwdtr & (1<<tindex)) && !(p->wdtr_pending & (1<<tindex)) )
                   9608:   {
                   9609:     if(p->dev_wdtr_cmnd[tindex] == NULL)
                   9610:     {
                   9611:       Scsi_Cmnd *cmd;
                   9612: 
                   9613:       if (!(p->dev_wdtr_cmnd[tindex] = kmalloc(sizeof(Scsi_Cmnd), GFP_ATOMIC)) )
                   9614:       {
                   9615:         return;
                   9616:       }
                   9617:       cmd = p->dev_wdtr_cmnd[tindex];
                   9618:       memset(cmd, 0, sizeof(Scsi_Cmnd));
                   9619:       memcpy(cmd, old_cmd, sizeof(Scsi_Cmnd));
                   9620:       memset(&cmd->cmnd[0], 0, sizeof(cmd->cmnd));
                   9621:       memset(&cmd->data_cmnd[0], 0, sizeof(cmd->data_cmnd));
                   9622:       cmd->lun = 0;
                   9623:       cmd->request_bufflen = 0;
                   9624:       cmd->request_buffer = NULL;
                   9625:       cmd->use_sg = cmd->old_use_sg = cmd->sglist_len = 0;
                   9626:       cmd->bufflen = 0;
                   9627:       cmd->buffer = NULL;
                   9628:       cmd->underflow = 0;
                   9629:       cmd->cmd_len = 6;
                   9630:     }
                   9631:     /*
                   9632:      * Before sending this thing out, we also amke the cmd->next pointer
                   9633:      * point to the real command so we can stuff any possible SENSE data
                   9634:      * intp the real command instead of this fake command.  This has to be
                   9635:      * done each time the command is built, not just the first time, hence
                   9636:      * it's outside of the above if()...
                   9637:      */
                   9638:     p->dev_wdtr_cmnd[tindex]->next = old_cmd;
                   9639:     aic7xxx_queue(p->dev_wdtr_cmnd[tindex], 
                   9640:                   aic7xxx_negotiation_complete);
                   9641:   }
                   9642:   else if ( (p->needsdtr & (1<<tindex)) && !(p->sdtr_pending & (1<<tindex)) &&
                   9643:             !(p->wdtr_pending & (1<<tindex)) )
                   9644:   {
                   9645:     if(p->dev_sdtr_cmnd[tindex] == NULL)
                   9646:     {
                   9647:       Scsi_Cmnd *cmd;
                   9648: 
                   9649:       if (!(p->dev_sdtr_cmnd[tindex] = kmalloc(sizeof(Scsi_Cmnd), GFP_ATOMIC)) )
                   9650:       {
                   9651:         return;
                   9652:       }
                   9653:       cmd = p->dev_sdtr_cmnd[tindex];
                   9654:       memset(cmd, 0, sizeof(Scsi_Cmnd));
                   9655:       memcpy(cmd, old_cmd, sizeof(Scsi_Cmnd));
                   9656:       memset(&cmd->cmnd[0], 0, sizeof(cmd->cmnd));
                   9657:       memset(&cmd->data_cmnd[0], 0, sizeof(cmd->data_cmnd));
                   9658:       cmd->lun = 0;
                   9659:       cmd->request_bufflen = 0;
                   9660:       cmd->request_buffer = NULL;
                   9661:       cmd->use_sg = cmd->old_use_sg = cmd->sglist_len = 0;
                   9662:       cmd->bufflen = 0;
                   9663:       cmd->buffer = NULL;
                   9664:       cmd->underflow = 0;
                   9665:       cmd->cmd_len = 6;
                   9666:     }
                   9667:     /*
                   9668:      * Before sending this thing out, we also amke the cmd->next pointer
                   9669:      * point to the real command so we can stuff any possible SENSE data
                   9670:      * intp the real command instead of this fake command.  This has to be
                   9671:      * done each time the command is built, not just the first time, hence
                   9672:      * it's outside of the above if()...
                   9673:      */
                   9674:     p->dev_sdtr_cmnd[tindex]->next = old_cmd;
                   9675:     aic7xxx_queue(p->dev_sdtr_cmnd[tindex], 
                   9676:                   aic7xxx_negotiation_complete);
                   9677:   }
                   9678: }
                   9679: 
                   9680: #endif
                   9681: 
                   9682: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   9683: /*+F*************************************************************************
                   9684:  * Function:
                   9685:  *   aic7xxx_print_scb
                   9686:  *
                   9687:  * Description:
                   9688:  *   Dump the byte codes for an about to be sent SCB.
                   9689:  *-F*************************************************************************/
                   9690: static void
                   9691: aic7xxx_print_scb(struct aic7xxx_host *p, struct aic7xxx_scb *scb)
                   9692: {
                   9693:   int i;
                   9694:   unsigned char *x;  
                   9695: 
                   9696:   x = (unsigned char *)&scb->hscb->control;
                   9697: 
                   9698:   for(i=0; i<32; i++)
                   9699:   {
                   9700:     printk("%02x ", x[i]);
                   9701:   }
                   9702:   printk("\n");
                   9703: }
                   9704: #endif
                   9705: 
                   9706: /*+F*************************************************************************
                   9707:  * Function:
                   9708:  *   aic7xxx_buildscb
                   9709:  *
                   9710:  * Description:
                   9711:  *   Build a SCB.
                   9712:  *-F*************************************************************************/
                   9713: static void
                   9714: aic7xxx_buildscb(struct aic7xxx_host *p, Scsi_Cmnd *cmd,
                   9715:     struct aic7xxx_scb *scb)
                   9716: {
                   9717:   unsigned short mask;
                   9718:   struct aic7xxx_hwscb *hscb;
                   9719: 
                   9720:   mask = (0x01 << TARGET_INDEX(cmd));
                   9721:   hscb = scb->hscb;
                   9722: 
                   9723:   /*
                   9724:    * Setup the control byte if we need negotiation and have not
                   9725:    * already requested it.
                   9726:    */
                   9727:   hscb->control = 0;
                   9728:   scb->tag_action = 0;
                   9729:   if (p->discenable & mask)
                   9730:   {
                   9731:     hscb->control |= DISCENB;
                   9732:     if (p->tagenable & mask)
                   9733:     {
                   9734:       cmd->tag = hscb->tag;
                   9735:       p->dev_commands_sent[TARGET_INDEX(cmd)]++;
                   9736:       if (p->dev_commands_sent[TARGET_INDEX(cmd)] < 200)
                   9737:       {
                   9738:         hscb->control |= MSG_SIMPLE_Q_TAG;
                   9739:         scb->tag_action = MSG_SIMPLE_Q_TAG;
                   9740:       }
                   9741:       else
                   9742:       {
                   9743:         if (p->orderedtag & mask)
                   9744:         {
                   9745:           hscb->control |= MSG_ORDERED_Q_TAG;
                   9746:           scb->tag_action = MSG_ORDERED_Q_TAG;
                   9747:         }
                   9748:         else
                   9749:         {
                   9750:           hscb->control |= MSG_SIMPLE_Q_TAG;
                   9751:           scb->tag_action = MSG_SIMPLE_Q_TAG;
                   9752:         }
                   9753:         p->dev_commands_sent[TARGET_INDEX(cmd)] = 0;
                   9754:       }
                   9755:     }
                   9756:   }
                   9757:   if (p->dev_flags[TARGET_INDEX(cmd)] & DEVICE_SCANNED)
                   9758:   {
                   9759: #ifdef AIC7XXX_FAKE_NEGOTIATION_CMDS
                   9760:     if ( (p->needwdtr & mask) && !(p->wdtr_pending & mask) )
                   9761:     {
                   9762:       if (cmd == p->dev_wdtr_cmnd[TARGET_INDEX(cmd)])
                   9763:       {
                   9764:         p->wdtr_pending |= mask;
                   9765:         scb->flags |= SCB_MSGOUT_WDTR;
                   9766:         hscb->control &= DISCENB;
                   9767:         hscb->control |= MK_MESSAGE;
                   9768:         scb->tag_action = 0;
                   9769:       }
                   9770:       else
                   9771:       {
                   9772:         aic7xxx_build_negotiation_cmnd(p, cmd, TARGET_INDEX(cmd));
                   9773:       }
                   9774:     }
                   9775:     else if ( (p->needsdtr & mask) && !(p->sdtr_pending & mask) &&
                   9776:               !(p->wdtr_pending & mask) )
                   9777:     {
                   9778:       if (cmd == p->dev_sdtr_cmnd[TARGET_INDEX(cmd)])
                   9779:       {
                   9780:         p->sdtr_pending |= mask;
                   9781:         scb->flags |= SCB_MSGOUT_SDTR;
                   9782:         hscb->control &= DISCENB;
                   9783:         hscb->control |= MK_MESSAGE;
                   9784:         scb->tag_action = 0;
                   9785:       }
                   9786:       else if (cmd != p->dev_wdtr_cmnd[TARGET_INDEX(cmd)])
                   9787:       {
                   9788:         aic7xxx_build_negotiation_cmnd(p, cmd, TARGET_INDEX(cmd));
                   9789:       }
                   9790:     }
                   9791: #else
                   9792:     if ( (p->needwdtr & mask) && !(p->wdtr_pending & mask) &&
                   9793:          !(p->sdtr_pending & mask) && (cmd->lun == 0) )
                   9794:     {
                   9795:       p->wdtr_pending |= mask;
                   9796:       scb->flags |= SCB_MSGOUT_WDTR;
                   9797:       hscb->control &= DISCENB;
                   9798:       hscb->control |= MK_MESSAGE;
                   9799:       scb->tag_action = 0;
                   9800: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   9801:       if (aic7xxx_verbose > 0xffff)
                   9802:         printk(INFO_LEAD "Building WDTR command.\n", p->host_no,
                   9803:                CTL_OF_CMD(cmd));
                   9804: #endif
                   9805:     }
                   9806:     else if ( (p->needsdtr & mask) && !(p->wdtr_pending & mask) &&
                   9807:               !(p->sdtr_pending & mask) && (cmd->lun == 0) )
                   9808:     {
                   9809:       p->sdtr_pending |= mask;
                   9810:       scb->flags |= SCB_MSGOUT_SDTR;
                   9811:       hscb->control &= DISCENB;
                   9812:       hscb->control |= MK_MESSAGE;
                   9813:       scb->tag_action = 0;
                   9814: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   9815:       if (aic7xxx_verbose > 0xffff)
                   9816:         printk(INFO_LEAD "Building SDTR command.\n", p->host_no,
                   9817:                CTL_OF_CMD(cmd));
                   9818: #endif
                   9819:     }
                   9820: #endif
                   9821:   }
                   9822:   hscb->target_channel_lun = ((cmd->target << 4) & 0xF0) |
                   9823:         ((cmd->channel & 0x01) << 3) | (cmd->lun & 0x07);
                   9824: 
                   9825:   /*
                   9826:    * The interpretation of request_buffer and request_bufflen
                   9827:    * changes depending on whether or not use_sg is zero; a
                   9828:    * non-zero use_sg indicates the number of elements in the
                   9829:    * scatter-gather array.
                   9830:    */
                   9831: 
                   9832:   /*
                   9833:    * XXX - this relies on the host data being stored in a
                   9834:    *       little-endian format.
                   9835:    */
                   9836:   hscb->SCSI_cmd_length = cmd->cmd_len;
                   9837:   hscb->SCSI_cmd_pointer = cpu_to_le32(VIRT_TO_BUS(cmd->cmnd));
                   9838: 
                   9839:   if (cmd->use_sg)
                   9840:   {
                   9841:     struct scatterlist *sg;  /* Must be mid-level SCSI code scatterlist */
                   9842: 
                   9843:     /*
                   9844:      * We must build an SG list in adapter format, as the kernel's SG list
                   9845:      * cannot be used directly because of data field size (__alpha__)
                   9846:      * differences and the kernel SG list uses virtual addresses where
                   9847:      * we need physical addresses.
                   9848:      */
                   9849:     int i;
                   9850: 
                   9851:     sg = (struct scatterlist *)cmd->request_buffer;
                   9852:     scb->sg_length = 0;
                   9853:     /*
                   9854:      * Copy the segments into the SG array.  NOTE!!! - We used to
                   9855:      * have the first entry both in the data_pointer area and the first
                   9856:      * SG element.  That has changed somewhat.  We still have the first
                   9857:      * entry in both places, but now we download the address of
                   9858:      * scb->sg_list[1] instead of 0 to the sg pointer in the hscb.
                   9859:      */
                   9860:     for (i = 0; i < cmd->use_sg; i++)
                   9861:     {
                   9862:       scb->sg_list[i].address = cpu_to_le32(VIRT_TO_BUS(sg[i].address));
                   9863:       scb->sg_list[i].length = cpu_to_le32(sg[i].length);
                   9864:       scb->sg_length += sg[i].length;
                   9865:     }
                   9866:     /* Copy the first SG into the data pointer area. */
                   9867:     hscb->data_pointer = scb->sg_list[0].address;
                   9868:     hscb->data_count = scb->sg_list[0].length;
                   9869:     scb->sg_count = cmd->use_sg;
                   9870:     hscb->SG_segment_count = cmd->use_sg;
                   9871:     hscb->SG_list_pointer = cpu_to_le32(VIRT_TO_BUS(&scb->sg_list[1]));
                   9872: 
                   9873:   }
                   9874:   else
                   9875:   {
                   9876:     if (cmd->request_bufflen)
                   9877:     {
                   9878:       scb->sg_count = 1;
                   9879:       scb->sg_list[0].address = cpu_to_le32(VIRT_TO_BUS(cmd->request_buffer));
                   9880:       scb->sg_list[0].length = cpu_to_le32(cmd->request_bufflen);
                   9881:       scb->sg_length = cmd->request_bufflen;
                   9882:       hscb->SG_segment_count = 1;
                   9883:       hscb->SG_list_pointer = cpu_to_le32(VIRT_TO_BUS(&scb->sg_list[0]));
                   9884:       hscb->data_count = scb->sg_list[0].length;
                   9885:       hscb->data_pointer = scb->sg_list[0].address;
                   9886:     }
                   9887:     else
                   9888:     {
                   9889:       scb->sg_count = 0;
                   9890:       scb->sg_length = 0;
                   9891:       hscb->SG_segment_count = 0;
                   9892:       hscb->SG_list_pointer = 0;
                   9893:       hscb->data_count = 0;
                   9894:       hscb->data_pointer = 0;
                   9895:     }
                   9896:   }
                   9897: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   9898:   if((cmd->cmnd[0] == TEST_UNIT_READY) && (aic7xxx_verbose & VERBOSE_PROBE2))
                   9899:   {
                   9900:     aic7xxx_print_scb(p, scb);
                   9901:   }
                   9902: #endif
                   9903: }
                   9904: 
                   9905: /*+F*************************************************************************
                   9906:  * Function:
                   9907:  *   aic7xxx_queue
                   9908:  *
                   9909:  * Description:
                   9910:  *   Queue a SCB to the controller.
                   9911:  *-F*************************************************************************/
                   9912: int
                   9913: aic7xxx_queue(Scsi_Cmnd *cmd, void (*fn)(Scsi_Cmnd *))
                   9914: {
                   9915:   struct aic7xxx_host *p;
                   9916:   struct aic7xxx_scb *scb;
                   9917: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   9918:   int tindex = TARGET_INDEX(cmd);
                   9919: #endif
                   9920: #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95)
                   9921:   unsigned long cpu_flags = 0;
                   9922: #endif
                   9923: 
                   9924:   p = (struct aic7xxx_host *) cmd->host->hostdata;
                   9925:   /*
                   9926:    * Check to see if channel was scanned.
                   9927:    */
                   9928:   
                   9929: #ifdef AIC7XXX_VERBOSE_DEBUGGING
                   9930:   if (!(p->flags & AHC_A_SCANNED) && (cmd->channel == 0))
                   9931:   {
                   9932:     if (aic7xxx_verbose & VERBOSE_PROBE2)
                   9933:       printk(INFO_LEAD "Scanning channel for devices.\n",
                   9934:         p->host_no, 0, -1, -1);
                   9935:     p->flags |= AHC_A_SCANNED;
                   9936:   }
                   9937:   else
                   9938:   {
                   9939:     if (!(p->flags & AHC_B_SCANNED) && (cmd->channel == 1))
                   9940:     {
                   9941:       if (aic7xxx_verbose & VERBOSE_PROBE2)
                   9942:         printk(INFO_LEAD "Scanning channel for devices.\n",
                   9943:           p->host_no, 1, -1, -1);
                   9944:       p->flags |= AHC_B_SCANNED;
                   9945:     }
                   9946:   }
                   9947: 
                   9948:   if (p->dev_active_cmds[tindex] > (cmd->device->queue_depth + 1))
                   9949:   {
                   9950:     printk(WARN_LEAD "Commands queued exceeds queue "
                   9951:            "depth, active=%d\n",
                   9952:            p->host_no, CTL_OF_CMD(cmd), 
                   9953:            p->dev_active_cmds[tindex]);
                   9954:     if ( p->dev_active_cmds[tindex] > 220 )
                   9955:       p->dev_active_cmds[tindex] = 0;
                   9956:   }
                   9957: #endif
                   9958: 
                   9959:   scb = scbq_remove_head(&p->scb_data->free_scbs);
                   9960:   if (scb == NULL)
                   9961:   {
                   9962:     DRIVER_LOCK
                   9963:     aic7xxx_allocate_scb(p);
                   9964:     DRIVER_UNLOCK
                   9965:     scb = scbq_remove_head(&p->scb_data->free_scbs);
                   9966:   }
                   9967:   if (scb == NULL)
                   9968:   {
                   9969:     printk(WARN_LEAD "Couldn't get a free SCB.\n", p->host_no,
                   9970:            CTL_OF_CMD(cmd));
                   9971:     cmd->result = (DID_BUS_BUSY << 16);
                   9972:     DRIVER_LOCK
                   9973:     aic7xxx_queue_cmd_complete(p, cmd);
                   9974:     DRIVER_UNLOCK
                   9975:     return 0;
                   9976:   }
                   9977:   else
                   9978:   {
                   9979:     scb->cmd = cmd;
                   9980:     aic7xxx_position(cmd) = scb->hscb->tag;
                   9981: 
                   9982:     /*
                   9983:      * Construct the SCB beforehand, so the sequencer is
                   9984:      * paused a minimal amount of time.
                   9985:      */
                   9986:     aic7xxx_buildscb(p, cmd, scb);
                   9987: 
                   9988:     /*
                   9989:      * Make sure the Scsi_Cmnd pointer is saved, the struct it points to
                   9990:      * is set up properly, and the parity error flag is reset, then send
                   9991:      * the SCB to the sequencer and watch the fun begin.
                   9992:      */
                   9993:     cmd->scsi_done = fn;
                   9994:     cmd->result = DID_OK;
                   9995:     memset(cmd->sense_buffer, 0, sizeof(cmd->sense_buffer));
                   9996:     aic7xxx_error(cmd) = DID_OK;
                   9997:     aic7xxx_status(cmd) = 0;
                   9998:     cmd->host_scribble = NULL;
                   9999: 
                   10000:     scb->flags |= SCB_ACTIVE | SCB_WAITINGQ;
                   10001: 
                   10002:     DRIVER_LOCK
                   10003:     scbq_insert_tail(&p->waiting_scbs, scb);
                   10004:     if ( (p->flags & (AHC_IN_ISR | AHC_IN_ABORT | AHC_IN_RESET)) == 0)
                   10005:     {
                   10006:       aic7xxx_run_waiting_queues(p);
                   10007:     }
                   10008:     DRIVER_UNLOCK
                   10009:   }
                   10010:   return (0);
                   10011: }
                   10012: 
                   10013: /*+F*************************************************************************
                   10014:  * Function:
                   10015:  *   aic7xxx_bus_device_reset
                   10016:  *
                   10017:  * Description:
                   10018:  *   Abort or reset the current SCSI command(s).  If the scb has not
                   10019:  *   previously been aborted, then we attempt to send a BUS_DEVICE_RESET
                   10020:  *   message to the target.  If the scb has previously been unsuccessfully
                   10021:  *   aborted, then we will reset the channel and have all devices renegotiate.
                   10022:  *   Returns an enumerated type that indicates the status of the operation.
                   10023:  *-F*************************************************************************/
                   10024: static int
                   10025: aic7xxx_bus_device_reset(struct aic7xxx_host *p, Scsi_Cmnd *cmd)
                   10026: {
                   10027:   struct aic7xxx_scb   *scb;
                   10028:   struct aic7xxx_hwscb *hscb;
                   10029:   int result = -1;
                   10030:   int channel;
                   10031:   unsigned char saved_scbptr, lastphase;
                   10032:   unsigned char hscb_index;
                   10033:   int disconnected;
                   10034: 
                   10035:   scb = (p->scb_data->scb_array[aic7xxx_position(cmd)]);
                   10036:   hscb = scb->hscb;
                   10037: 
                   10038:   lastphase = aic_inb(p, LASTPHASE);
                   10039:   if (aic7xxx_verbose & VERBOSE_RESET_PROCESS)
                   10040:   {
                   10041:     printk(INFO_LEAD "Bus Device reset, scb flags 0x%x, ",
                   10042:          p->host_no, CTL_OF_SCB(scb), scb->flags);
                   10043:     switch (lastphase)
                   10044:     {
                   10045:       case P_DATAOUT:
                   10046:         printk("Data-Out phase\n");
                   10047:         break;
                   10048:       case P_DATAIN:
                   10049:         printk("Data-In phase\n");
                   10050:         break;
                   10051:       case P_COMMAND:
                   10052:         printk("Command phase\n");
                   10053:         break;
                   10054:       case P_MESGOUT:
                   10055:         printk("Message-Out phase\n");
                   10056:         break;
                   10057:       case P_STATUS:
                   10058:         printk("Status phase\n");
                   10059:         break;
                   10060:       case P_MESGIN:
                   10061:         printk("Message-In phase\n");
                   10062:         break;
                   10063:       default:
                   10064:       /*
                   10065:        * We're not in a valid phase, so assume we're idle.
                   10066:        */
                   10067:         printk("while idle, LASTPHASE = 0x%x\n", lastphase);
                   10068:         break;
                   10069:     }
                   10070:     printk(INFO_LEAD "SCSISIGI 0x%x, SEQADDR 0x%x, SSTAT0 0x%x, SSTAT1 "
                   10071:          "0x%x\n", p->host_no, CTL_OF_SCB(scb),
                   10072:          aic_inb(p, SCSISIGI),
                   10073:          aic_inb(p, SEQADDR0) | (aic_inb(p, SEQADDR1) << 8),
                   10074:          aic_inb(p, SSTAT0), aic_inb(p, SSTAT1));
                   10075:   }
                   10076: 
                   10077:   channel = cmd->channel;
                   10078: 
                   10079:     /*
                   10080:      * Send a Device Reset Message:
                   10081:      * The target that is holding up the bus may not be the same as
                   10082:      * the one that triggered this timeout (different commands have
                   10083:      * different timeout lengths).  Our strategy here is to queue an
                   10084:      * abort message to the timed out target if it is disconnected.
                   10085:      * Otherwise, if we have an active target we stuff the message buffer
                   10086:      * with an abort message and assert ATN in the hopes that the target
                   10087:      * will let go of the bus and go to the mesgout phase.  If this
                   10088:      * fails, we'll get another timeout a few seconds later which will
                   10089:      * attempt a bus reset.
                   10090:      */
                   10091:   saved_scbptr = aic_inb(p, SCBPTR);
                   10092:   disconnected = FALSE;
                   10093: 
                   10094:   if (lastphase != P_BUSFREE)
                   10095:   {
                   10096:     if (aic_inb(p, SCB_TAG) >= p->scb_data->numscbs)
                   10097:     {
                   10098:       printk(WARN_LEAD "Invalid SCB ID %d is active, "
                   10099:              "SCB flags = 0x%x.\n", p->host_no,
                   10100:             CTL_OF_CMD(cmd), scb->hscb->tag, scb->flags);
                   10101:       return(SCSI_RESET_ERROR);
                   10102:     }
                   10103:     if (scb->hscb->tag == aic_inb(p, SCB_TAG))
                   10104:     { 
                   10105:       if ( (lastphase != P_MESGOUT) && (lastphase != P_MESGIN) )
                   10106:       {
                   10107:         if (aic7xxx_verbose & VERBOSE_RESET_PROCESS)
                   10108:           printk(INFO_LEAD "Device reset message in "
                   10109:                 "message buffer\n", p->host_no, CTL_OF_SCB(scb));
                   10110:         scb->flags |= SCB_RESET | SCB_DEVICE_RESET;
                   10111:         aic7xxx_error(scb->cmd) = DID_RESET;
                   10112:         p->dev_flags[TARGET_INDEX(scb->cmd)] &= 
                   10113:                 ~DEVICE_SUCCESS;
                   10114:         p->dev_flags[TARGET_INDEX(scb->cmd)] |= 
                   10115:                 BUS_DEVICE_RESET_PENDING;
                   10116:         /* Send the abort message to the active SCB. */
                   10117:         aic_outb(p, HOST_MSG, MSG_OUT);
                   10118:         aic_outb(p, lastphase | ATNO, SCSISIGO);
                   10119:         return(SCSI_RESET_PENDING);
                   10120:       }
                   10121:       else
                   10122:       {
                   10123:         /* We want to send out the message, but it could screw an already */
                   10124:         /* in place and being used message.  Instead, we return an error  */
                   10125:         /* to try and start the bus reset phase since this command is     */
                   10126:         /* probably hung (aborts failed, and now reset is failing).  We   */
                   10127:         /* also make sure to set BUS_DEVICE_RESET_PENDING so we won't try */
                   10128:         /* any more on this device, but instead will escalate to a bus or */
                   10129:         /* host reset (additionally, we won't try to abort any more).     */
                   10130:         printk(WARN_LEAD "Device reset, Message buffer "
                   10131:                 "in use\n", p->host_no, CTL_OF_SCB(scb));
                   10132:         scb->flags |= SCB_RESET | SCB_DEVICE_RESET;
                   10133:         aic7xxx_error(scb->cmd) = DID_RESET;
                   10134:         p->dev_flags[TARGET_INDEX(scb->cmd)] &= 
                   10135:                 ~DEVICE_SUCCESS;
                   10136:         p->dev_flags[TARGET_INDEX(scb->cmd)] |= 
                   10137:                 BUS_DEVICE_RESET_PENDING;
                   10138:         return(SCSI_RESET_ERROR);
                   10139:       }
                   10140:     }
                   10141:   } /* if (last_phase != P_BUSFREE).....indicates we are idle and can work */
                   10142:   hscb_index = aic7xxx_find_scb(p, scb);
                   10143:   if (hscb_index == SCB_LIST_NULL)
                   10144:   {
                   10145:     disconnected = (aic7xxx_scb_on_qoutfifo(p, scb)) ? FALSE : TRUE;
                   10146:   }
                   10147:   else
                   10148:   {
                   10149:     aic_outb(p, hscb_index, SCBPTR);
                   10150:     if (aic_inb(p, SCB_CONTROL) & DISCONNECTED)
                   10151:     {
                   10152:       disconnected = TRUE;
                   10153:     }
                   10154:   }
                   10155:   if (disconnected)
                   10156:   {
                   10157:         /*
                   10158:          * Simply set the MK_MESSAGE flag and the SEQINT handler will do
                   10159:          * the rest on a reconnect.
                   10160:          */
                   10161:     scb->hscb->control |= MK_MESSAGE;
                   10162:     scb->flags |= SCB_RESET | SCB_DEVICE_RESET;
                   10163:     p->dev_flags[TARGET_INDEX(scb->cmd)] &= ~DEVICE_SUCCESS;
                   10164:     p->dev_flags[TARGET_INDEX(scb->cmd)] |= 
                   10165:         BUS_DEVICE_RESET_PENDING;
                   10166:     if (hscb_index != SCB_LIST_NULL)
                   10167:     {
                   10168:       unsigned char scb_control;
                   10169: 
                   10170:       aic_outb(p, hscb_index, SCBPTR);
                   10171:       scb_control = aic_inb(p, SCB_CONTROL);
                   10172:       aic_outb(p, scb_control | MK_MESSAGE, SCB_CONTROL);
                   10173:     }
                   10174:         /*
                   10175:          * Actually requeue this SCB in case we can select the
                   10176:          * device before it reconnects.  If the transaction we
                   10177:          * want to abort is not tagged, then this will be the only
                   10178:          * outstanding command and we can simply shove it on the
                   10179:          * qoutfifo and be done.  If it is tagged, then it goes right
                   10180:          * in with all the others, no problem :)  We need to add it
                   10181:          * to the qinfifo and let the sequencer know it is there.
                   10182:          * Now, the only problem left to deal with is, *IF* this
                   10183:          * command completes, in spite of the MK_MESSAGE bit in the
                   10184:          * control byte, then we need to pick that up in the interrupt
                   10185:          * routine and clean things up.  This *shouldn't* ever happen.
                   10186:          */
                   10187:     if (aic7xxx_verbose & VERBOSE_RESET_PROCESS)
                   10188:       printk(INFO_LEAD "Queueing device reset "
                   10189:            "command.\n", p->host_no, CTL_OF_SCB(scb));
                   10190:     p->qinfifo[p->qinfifonext++] = scb->hscb->tag;
                   10191:     if (p->features & AHC_QUEUE_REGS)
                   10192:       aic_outb(p, p->qinfifonext, HNSCB_QOFF);
                   10193:     else
                   10194:       aic_outb(p, p->qinfifonext, KERNEL_QINPOS);
                   10195:     scb->flags |= SCB_QUEUED_ABORT;
                   10196:     result = SCSI_RESET_PENDING;
                   10197:   }
                   10198:   else if (result == -1)
                   10199:   {
                   10200:     result = SCSI_RESET_ERROR;
                   10201:   }
                   10202:   aic_outb(p, saved_scbptr, SCBPTR);
                   10203:   return (result);
                   10204: }
                   10205: 
                   10206: 
                   10207: /*+F*************************************************************************
                   10208:  * Function:
                   10209:  *   aic7xxx_panic_abort
                   10210:  *
                   10211:  * Description:
                   10212:  *   Abort the current SCSI command(s).
                   10213:  *-F*************************************************************************/
                   10214: void
                   10215: aic7xxx_panic_abort(struct aic7xxx_host *p, Scsi_Cmnd *cmd)
                   10216: {
                   10217: #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0)
                   10218:   int i, mask, found, need_tag;
                   10219:   struct aic7xxx_scb *scb;
                   10220:   unsigned char qinpos, hscbp;
                   10221: 
                   10222:   found = FALSE;
                   10223: #endif
                   10224: 
                   10225:   printk("aic7xxx driver version %s/%s\n", AIC7XXX_C_VERSION,
                   10226:          UTS_RELEASE);
                   10227:   printk("Controller type:\n    %s\n", board_names[p->board_name_index]);
                   10228:   printk("p->flags=0x%x, p->chip=0x%x, p->features=0x%x, "
                   10229:          "sequencer %s paused\n",
                   10230:      p->flags, p->chip, p->features,
                   10231:     (aic_inb(p, HCNTRL) & PAUSE) ? "is" : "isn't" );
                   10232:   pause_sequencer(p);
                   10233:   disable_irq(p->irq);
                   10234:   aic7xxx_print_card(p);
                   10235:   aic7xxx_print_scratch_ram(p);
                   10236: #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0)
                   10237:   for(i=0; i<MAX_TARGETS; i++)
                   10238:   {
                   10239:     if(p->dev_flags[i] & DEVICE_PRESENT)
                   10240:     {
                   10241:       mask = (0x01 << i);
                   10242:       printk(INFO_LEAD "dev_flags=0x%x, WDTR:%c/%c/%c, SDTR:%c/%c/%c,"
                   10243:              " q_depth=%d:%d:%d\n",
                   10244:         p->host_no, 0, i, 0, p->dev_flags[i],
                   10245:         (p->wdtr_pending & mask) ? 'Y' : 'N',
                   10246:         (p->needwdtr & mask) ? 'Y' : 'N',
                   10247:         (p->needwdtr_copy & mask) ? 'Y' : 'N',
                   10248:         (p->sdtr_pending & mask) ? 'Y' : 'N',
                   10249:         (p->needsdtr & mask) ? 'Y' : 'N',
                   10250:         (p->needsdtr_copy & mask) ? 'Y' : 'N',
                   10251:         p->dev_active_cmds[i],
                   10252:         p->dev_max_queue_depth[i], p->dev_mid_level_queue_depth[i]);
                   10253:       printk(INFO_LEAD "targ_scsirate=0x%x", p->host_no, 0, i, 0,
                   10254:              aic_inb(p, TARG_SCSIRATE + i));
                   10255:       if (p->features & AHC_ULTRA2)
                   10256:         printk(", targ_offset=%d", aic_inb(p, TARG_OFFSET + i));
                   10257:       printk("\n");
                   10258:     }
                   10259:   }
                   10260:   /*
                   10261:    * Search for this command and see if we can't track it down, it's the
                   10262:    * one causing the timeout.  Print out this command first, then all other
                   10263:    * active commands afterwords.
                   10264:    */
                   10265:   need_tag = -1;
                   10266:   if ( cmd )
                   10267:   {
                   10268:     scb = p->scb_data->scb_array[aic7xxx_position(cmd)];
                   10269:     if ( (scb->flags & SCB_ACTIVE) && (scb->cmd == cmd) )
                   10270:     {
                   10271:       printk("Timed out command is scb #%d:\n", scb->hscb->tag);
                   10272:       printk("Tag%d: flags=0x%x, control=0x%x, TCL=0x%x, %s\n", scb->hscb->tag,
                   10273:              scb->flags, scb->hscb->control, scb->hscb->target_channel_lun,
                   10274:              (scb->flags & SCB_WAITINGQ) ? "WAITINGQ" : "Sent" );
                   10275:       need_tag = scb->hscb->tag;
                   10276:       if (scb->flags & SCB_WAITINGQ) found=TRUE;
                   10277:     }
                   10278:   }
                   10279:   printk("QINFIFO: (TAG) ");
                   10280:   qinpos = aic_inb(p, QINPOS);
                   10281:   while ( qinpos != p->qinfifonext )
                   10282:   {
                   10283:     if (p->qinfifo[qinpos] == need_tag)
                   10284:       found=TRUE;
                   10285:     printk("%d ", p->qinfifo[qinpos++]);
                   10286:   }  
                   10287:   printk("\n");
                   10288:   printk("Current SCB: (SCBPTR/TAG/CONTROL) %d/%d/0x%x\n", aic_inb(p, SCBPTR),
                   10289:          aic_inb(p, SCB_TAG), aic_inb(p, SCB_CONTROL) );
                   10290:   if (aic_inb(p, SCB_TAG) == need_tag)  found=TRUE;
                   10291:   printk("WAITING_SCBS: (SCBPTR/TAG/CONTROL) %d->",
                   10292:          hscbp = aic_inb(p, WAITING_SCBH));
                   10293:   while (hscbp != SCB_LIST_NULL)
                   10294:   {
                   10295:     aic_outb(p, hscbp, SCBPTR);
                   10296:     printk("%d/%d/0x%x ", hscbp, aic_inb(p, SCB_TAG), aic_inb(p, SCB_CONTROL));
                   10297:     hscbp = aic_inb(p, SCB_NEXT);
                   10298:     if (aic_inb(p, SCB_TAG) == need_tag)  found=TRUE;
                   10299:   }
                   10300:   printk("\n");
                   10301:   printk("DISCONNECTED_SCBS: (SCBPTR/TAG/CONTROL) %d->",
                   10302:          hscbp = aic_inb(p, DISCONNECTED_SCBH));
                   10303:   while (hscbp != SCB_LIST_NULL)
                   10304:   {
                   10305:     aic_outb(p, hscbp, SCBPTR);
                   10306:     printk("%d/%d/0x%x ", hscbp, aic_inb(p, SCB_TAG), aic_inb(p, SCB_CONTROL));
                   10307:     hscbp = aic_inb(p, SCB_NEXT);
                   10308:     if (aic_inb(p, SCB_TAG) == need_tag)  found=TRUE;
                   10309:   }
                   10310:   printk("\n");
                   10311:   printk("FREE_SCBS: (SCBPTR/TAG/CONTROL) %d->",
                   10312:          hscbp = aic_inb(p, FREE_SCBH));
                   10313:   while (hscbp != SCB_LIST_NULL)
                   10314:   {
                   10315:     aic_outb(p, hscbp, SCBPTR);
                   10316:     printk("%d/%d/0x%x ", hscbp, aic_inb(p, SCB_TAG), aic_inb(p, SCB_CONTROL));
                   10317:     hscbp = aic_inb(p, SCB_NEXT);
                   10318:   }
                   10319:   printk("\n");
                   10320: 
                   10321:   if (found == FALSE)
                   10322:   {
                   10323:     /*
                   10324:      * We haven't found the offending SCB yet, and it should be around
                   10325:      * somewhere, so go look for it in the cards SCBs.
                   10326:      */
                   10327:     printk("SCBPTR CONTROL TAG PREV NEXT\n");
                   10328:     for(i=0; i<p->scb_data->maxhscbs; i++)
                   10329:     {
                   10330:       aic_outb(p, i, SCBPTR);
                   10331:       printk("   %3d      %02x  %02x   %02x   %02x\n", i,
                   10332:              aic_inb(p, SCB_CONTROL), aic_inb(p, SCB_TAG),
                   10333:              aic_inb(p, SCB_PREV), aic_inb(p, SCB_NEXT));
                   10334:     }
                   10335:   }
                   10336:   
                   10337: 
                   10338:   for (i=0; i < p->scb_data->numscbs; i++)
                   10339:   {
                   10340:     scb = p->scb_data->scb_array[i];
                   10341:     if ( (scb->flags & SCB_ACTIVE) && (scb->cmd != cmd) )
                   10342:     {
                   10343:       printk("Tag%d: flags=0x%x, control=0x%x, TCL=0x%x, %s\n", scb->hscb->tag,
                   10344:              scb->flags, scb->hscb->control, scb->hscb->target_channel_lun,
                   10345:              (scb->flags & SCB_WAITINGQ) ? "WAITINGQ" : "Sent" );
                   10346:     }
                   10347:   }
                   10348: #endif
                   10349:   sti();
                   10350:   for(;;) barrier();
                   10351: }
                   10352: 
                   10353: /*+F*************************************************************************
                   10354:  * Function:
                   10355:  *   aic7xxx_abort
                   10356:  *
                   10357:  * Description:
                   10358:  *   Abort the current SCSI command(s).
                   10359:  *-F*************************************************************************/
                   10360: int
                   10361: aic7xxx_abort(Scsi_Cmnd *cmd)
                   10362: {
                   10363:   struct aic7xxx_scb  *scb = NULL;
                   10364:   struct aic7xxx_host *p;
                   10365:   int    result, found=0;
                   10366:   unsigned char tmp_char, saved_hscbptr, next_hscbptr, prev_hscbptr;
                   10367: #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95)
                   10368:   unsigned long cpu_flags = 0;
                   10369: #endif
                   10370:   Scsi_Cmnd *cmd_next, *cmd_prev;
                   10371: 
                   10372:   p = (struct aic7xxx_host *) cmd->host->hostdata;
                   10373:   scb = (p->scb_data->scb_array[aic7xxx_position(cmd)]);
                   10374: 
                   10375:   /*
                   10376:    * I added a new config option to the driver: "panic_on_abort" that will
                   10377:    * cause the driver to panic and the machine to stop on the first abort
                   10378:    * or reset call into the driver.  At that point, it prints out a lot of
                   10379:    * usefull information for me which I can then use to try and debug the
                   10380:    * problem.  Simply enable the boot time prompt in order to activate this
                   10381:    * code.
                   10382:    */
                   10383:   if (aic7xxx_panic_on_abort)
                   10384:     aic7xxx_panic_abort(p, cmd);
                   10385: 
                   10386:   DRIVER_LOCK
                   10387: 
                   10388: /*
                   10389:  *  Run the isr to grab any command in the QOUTFIFO and any other misc.
                   10390:  *  assundry tasks.  This should also set up the bh handler if there is
                   10391:  *  anything to be done, but it won't run until we are done here since
                   10392:  *  we are following a straight code path without entering the scheduler
                   10393:  *  code.
                   10394:  */
                   10395: 
                   10396:   pause_sequencer(p);
                   10397:   while ( (aic_inb(p, INTSTAT) & INT_PEND) && !(p->flags & AHC_IN_ISR))
                   10398:   {
                   10399:     aic7xxx_isr(p->irq, p, (void *)NULL);
                   10400:     pause_sequencer(p);
                   10401:     aic7xxx_done_cmds_complete(p);
                   10402:   }
                   10403: 
                   10404:   if ((scb == NULL) || (cmd->serial_number != cmd->serial_number_at_timeout))
                   10405:                       /*  Totally bogus cmd since it points beyond our  */
                   10406:   {                   /*  valid SCB range or doesn't even match it's own*/
                   10407:                       /*  timeout serial number.                        */
                   10408:     if (aic7xxx_verbose & VERBOSE_ABORT_MID)
                   10409:       printk(INFO_LEAD "Abort called with bogus Scsi_Cmnd "
                   10410:         "pointer.\n", p->host_no, CTL_OF_CMD(cmd));
                   10411:     unpause_sequencer(p, FALSE);
                   10412:     DRIVER_UNLOCK
                   10413:     return(SCSI_ABORT_NOT_RUNNING);
                   10414:   }
                   10415:   if (scb->cmd != cmd)  /*  Hmmm...either this SCB is currently free with a */
                   10416:   {                     /*  NULL cmd pointer (NULLed out when freed) or it  */
                   10417:                         /*  has already been recycled for another command   */
                   10418:                         /*  Either way, this SCB has nothing to do with this*/
                   10419:                         /*  command and we need to deal with cmd without    */
                   10420:                         /*  touching the SCB.                               */
                   10421:                         /*  The theory here is to return a value that will  */
                   10422:                         /*  make the queued for complete command actually   */
                   10423:                         /*  finish successfully, or to indicate that we     */
                   10424:                         /*  don't have this cmd any more and the mid level  */
                   10425:                         /*  code needs to find it.                          */
                   10426:     cmd_next = p->completeq.head;
                   10427:     cmd_prev = NULL;
                   10428:     while (cmd_next != NULL) 
                   10429:     {
                   10430:       if (cmd_next == cmd) 
                   10431:       {
                   10432:         if (aic7xxx_verbose & VERBOSE_ABORT_PROCESS)
                   10433:           printk(INFO_LEAD "Abort called for command "
                   10434:           "on completeq, completing.\n", p->host_no, CTL_OF_CMD(cmd));
                   10435:         if ( cmd_prev == NULL )
                   10436:           p->completeq.head = (Scsi_Cmnd *)cmd_next->host_scribble;
                   10437:         else
                   10438:           cmd_prev->host_scribble = cmd_next->host_scribble;
                   10439:         cmd_next->scsi_done(cmd_next);
                   10440:         unpause_sequencer(p, FALSE);
                   10441:         DRIVER_UNLOCK
                   10442:         return(SCSI_ABORT_NOT_RUNNING); /* It's already back as a successful
                   10443:                                          * completion */
                   10444:       }                                  
                   10445:       cmd_prev = cmd_next;
                   10446:       cmd_next = (Scsi_Cmnd *)cmd_next->host_scribble;
                   10447:     }
                   10448:     if (aic7xxx_verbose & VERBOSE_ABORT_MID)
                   10449:       printk(INFO_LEAD "Abort called for already completed"
                   10450:         " command.\n", p->host_no, CTL_OF_CMD(cmd));
                   10451:     unpause_sequencer(p, FALSE);
                   10452:     DRIVER_UNLOCK
                   10453:     return(SCSI_ABORT_NOT_RUNNING);
                   10454:   }
                   10455:     
                   10456: /*   At this point we know the following:
                   10457:  *     the SCB pointer is valid
                   10458:  *     the command pointer passed in to us and the scb->cmd pointer match
                   10459:  *     this then means that the command we need to abort is the same as the
                   10460:  *     command held by the scb pointer and is a valid abort request.
                   10461:  *   Now, we just have to figure out what to do from here.  Current plan is:
                   10462:  *     if we have already been here on this command, escalate to a reset
                   10463:  *     if scb is on waiting list or QINFIFO, send it back as aborted, but
                   10464:  *       we also need to be aware of the possibility that we could be using
                   10465:  *       a faked negotiation command that is holding this command up,  if
                   10466:  *       so we need to take care of that command instead, which means we
                   10467:  *       would then treat this one like it was sitting around disconnected
                   10468:  *       instead.
                   10469:  *     if scb is on WAITING_SCB list in sequencer, free scb and send back
                   10470:  *     if scb is disconnected and not completed, abort with abort message
                   10471:  *     if scb is currently running, then it may be causing the bus to hang
                   10472:  *       so we want a return value that indicates a reset would be appropriate
                   10473:  *       if the command does not finish shortly
                   10474:  *     if scb is already complete but not on completeq, we're screwed because
                   10475:  *       this can't happen (except if the command is in the QOUTFIFO, in which
                   10476:  *       case we would like it to complete successfully instead of having to
                   10477:  *       to be re-done)
                   10478:  *   All other scenarios already dealt with by previous code.
                   10479:  */
                   10480: 
                   10481:   if ( scb->flags & (SCB_ABORT | SCB_RESET | SCB_QUEUED_ABORT) )
                   10482:   {
                   10483:     if (aic7xxx_verbose & VERBOSE_ABORT_PROCESS)
                   10484:       printk(INFO_LEAD "SCB aborted once already, "
                   10485:         "escalating.\n", p->host_no, CTL_OF_SCB(scb));
                   10486:     unpause_sequencer(p, FALSE);
                   10487:     DRIVER_UNLOCK
                   10488:     return(SCSI_ABORT_SNOOZE);
                   10489:   }
                   10490:   if ( (p->flags & (AHC_RESET_PENDING | AHC_ABORT_PENDING)) || 
                   10491:           (p->dev_flags[TARGET_INDEX(scb->cmd)] & 
                   10492:            BUS_DEVICE_RESET_PENDING) )
                   10493:   {
                   10494:     if (aic7xxx_verbose & VERBOSE_ABORT_PROCESS)
                   10495:       printk(INFO_LEAD "Reset/Abort pending for this "
                   10496:         "device, not wasting our time.\n", p->host_no, CTL_OF_SCB(scb));
                   10497:     unpause_sequencer(p, FALSE);
                   10498:     DRIVER_UNLOCK
                   10499:     return(SCSI_ABORT_PENDING);
                   10500:   }
                   10501: 
                   10502:   found = 0;
                   10503:   p->flags |= AHC_IN_ABORT;
                   10504:   if (aic7xxx_verbose & VERBOSE_ABORT)
                   10505:     printk(INFO_LEAD "Aborting scb %d, flags 0x%x\n",
                   10506:          p->host_no, CTL_OF_SCB(scb), scb->hscb->tag, scb->flags);
                   10507: 
                   10508: /*
                   10509:  *   First, let's check to see if the currently running command is our target
                   10510:  *    since if it is, the return is fairly easy and quick since we don't want
                   10511:  *    to touch the command in case it might complete, but we do want a timeout
                   10512:  *    in case it's actually hung, so we really do nothing, but tell the mid
                   10513:  *    level code to reset the timeout.
                   10514:  */
                   10515: 
                   10516:   if ( scb->hscb->tag == aic_inb(p, SCB_TAG) )
                   10517:   {
                   10518:    /*
                   10519:     *  Check to see if the sequencer is just sitting on this command, or
                   10520:     *   if it's actively being run.
                   10521:     */
                   10522:     result = aic_inb(p, LASTPHASE);
                   10523:     switch (result)
                   10524:     {
                   10525:       case P_DATAOUT:    /*    For any of these cases, we can assume we are */
                   10526:       case P_DATAIN:     /*    an active command and act according.  For    */
                   10527:       case P_COMMAND:    /*    anything else we are going to fall on through*/
                   10528:       case P_STATUS:     /*    The SCSI_ABORT_SNOOZE will give us two abort */
                   10529:       case P_MESGOUT:    /*    chances to finish and then escalate to a     */
                   10530:       case P_MESGIN:     /*    reset call                                   */
                   10531:         if (aic7xxx_verbose & VERBOSE_ABORT_PROCESS)
                   10532:           printk(INFO_LEAD "SCB is currently active.  "
                   10533:                 "Waiting on completion.\n", p->host_no, CTL_OF_SCB(scb));
                   10534:         unpause_sequencer(p, FALSE);
                   10535:         p->flags &= ~AHC_IN_ABORT;
                   10536:         scb->flags |= SCB_RECOVERY_SCB; /*  Note the fact that we've been  */
                   10537:         p->flags |= AHC_ABORT_PENDING;  /*  here so we will know not to    */
                   10538:         DRIVER_UNLOCK                   /*  muck with other SCBs if this   */
                   10539:         return(SCSI_ABORT_PENDING);     /*  one doesn't complete and clear */
                   10540:         break;                          /*  out.                           */
                   10541:       default:
                   10542:         break;
                   10543:     }
                   10544:   }
                   10545: 
                   10546:   if ((found == 0) && (scb->flags & SCB_WAITINGQ))
                   10547:   {
                   10548:     int tindex = TARGET_INDEX(cmd);
                   10549: #ifdef AIC7XXX_FAKE_NEGOTIATION_CMDS
                   10550:     unsigned short mask;
                   10551: 
                   10552:     mask = (1 << tindex);
                   10553: 
                   10554:     if (p->wdtr_pending & mask)
                   10555:     {
                   10556:       if (p->dev_wdtr_cmnd[tindex]->next != cmd)
                   10557:         found = 1;
                   10558:       else
                   10559:         found = 0;
                   10560:     }
                   10561:     else if (p->sdtr_pending & mask)
                   10562:     {
                   10563:       if (p->dev_sdtr_cmnd[tindex]->next != cmd)
                   10564:         found = 1;
                   10565:       else
                   10566:         found = 0;
                   10567:     }
                   10568:     else
                   10569:     {
                   10570:       found = 1;
                   10571:     }
                   10572:     if (found == 0)
                   10573:     {
                   10574:       /*
                   10575:        * OK..this means the command we are currently getting an abort
                   10576:        * for has an outstanding negotiation command in front of it.
                   10577:        * We don't really have a way to tie back into the negotiation
                   10578:        * commands, so we just send this back as pending, then it
                   10579:        * will get reset in 2 seconds.
                   10580:        */
                   10581:       unpause_sequencer(p, TRUE);
                   10582:       scb->flags |= SCB_ABORT;
                   10583:       DRIVER_UNLOCK
                   10584:       return(SCSI_ABORT_PENDING);
                   10585:     }
                   10586: #endif
                   10587:     if (aic7xxx_verbose & VERBOSE_ABORT_PROCESS) 
                   10588:       printk(INFO_LEAD "SCB found on waiting list and "
                   10589:           "aborted.\n", p->host_no, CTL_OF_SCB(scb));
                   10590:     scbq_remove(&p->waiting_scbs, scb);
                   10591:     scbq_remove(&p->delayed_scbs[tindex], scb);
                   10592:     p->dev_active_cmds[tindex]++;
                   10593:     p->activescbs++;
                   10594:     scb->flags &= ~(SCB_WAITINGQ | SCB_ACTIVE);
                   10595:     scb->flags |= SCB_ABORT | SCB_QUEUED_FOR_DONE;
                   10596:     found = 1;
                   10597:   }
                   10598: 
                   10599: /*
                   10600:  *  We just checked the waiting_q, now for the QINFIFO
                   10601:  */
                   10602:   if ( found == 0 )
                   10603:   {
                   10604:     if ( ((found = aic7xxx_search_qinfifo(p, cmd->target, 
                   10605:                      cmd->channel,
                   10606:                      cmd->lun, scb->hscb->tag, SCB_ABORT | SCB_QUEUED_FOR_DONE,
                   10607:                      FALSE, NULL)) != 0) &&
                   10608:                     (aic7xxx_verbose & VERBOSE_ABORT_PROCESS))
                   10609:       printk(INFO_LEAD "SCB found in QINFIFO and "
                   10610:         "aborted.\n", p->host_no, CTL_OF_SCB(scb));
                   10611:   }
                   10612: 
                   10613: /*
                   10614:  *  QINFIFO, waitingq, completeq done.  Next, check WAITING_SCB list in card
                   10615:  */
                   10616: 
                   10617:   if ( found == 0 )
                   10618:   {
                   10619:     unsigned char scb_next_ptr;
                   10620:     prev_hscbptr = SCB_LIST_NULL;
                   10621:     saved_hscbptr = aic_inb(p, SCBPTR);
                   10622:     next_hscbptr = aic_inb(p, WAITING_SCBH);
                   10623:     while ( next_hscbptr != SCB_LIST_NULL )
                   10624:     {
                   10625:       aic_outb(p,  next_hscbptr, SCBPTR );
                   10626:       if ( scb->hscb->tag == aic_inb(p, SCB_TAG) )
                   10627:       {
                   10628:         found = 1;
                   10629:         if (aic7xxx_verbose & VERBOSE_ABORT_PROCESS)
                   10630:           printk(INFO_LEAD "SCB found on hardware waiting"
                   10631:             " list and aborted.\n", p->host_no, CTL_OF_SCB(scb));
                   10632:         if ( prev_hscbptr == SCB_LIST_NULL )
                   10633:         {
                   10634:             aic_outb(p, aic_inb(p, SCB_NEXT), WAITING_SCBH);
                   10635:             /* stop the selection since we just
                   10636:              * grabbed the scb out from under the
                   10637:              * card
                   10638:              */
                   10639:             aic_outb(p, aic_inb(p, SCSISEQ) & ~ENSELO, SCSISEQ);
                   10640:             aic_outb(p, CLRSELTIMEO, CLRSINT1);
                   10641:         }
                   10642:         else
                   10643:         {
                   10644:             scb_next_ptr = aic_inb(p, SCB_NEXT);
                   10645:             aic_outb(p, prev_hscbptr, SCBPTR);
                   10646:             aic_outb(p, scb_next_ptr, SCB_NEXT);
                   10647:             aic_outb(p, next_hscbptr, SCBPTR);
                   10648:         }
                   10649:         aic_outb(p, SCB_LIST_NULL, SCB_TAG);
                   10650:         aic_outb(p, 0, SCB_CONTROL);
                   10651:         aic7xxx_add_curscb_to_free_list(p);
                   10652:         scb->flags = SCB_ABORT | SCB_QUEUED_FOR_DONE;
                   10653:         break;
                   10654:       }
                   10655:       prev_hscbptr = next_hscbptr;
                   10656:       next_hscbptr = aic_inb(p, SCB_NEXT);
                   10657:     }
                   10658:     aic_outb(p,  saved_hscbptr, SCBPTR );
                   10659:   }
                   10660:         
                   10661: /*
                   10662:  *  Hmmm...completeq, QOUTFIFO, QINFIFO, WAITING_SCBH, waitingq all checked.
                   10663:  *  OK...the sequencer's paused, interrupts are off, and we haven't found the
                   10664:  *  command anyplace where it could be easily aborted.  Time for the hard
                   10665:  *  work.  We also know the command is valid.  This essentially means the
                   10666:  *  command is disconnected, or connected but not into any phases yet, which
                   10667:  *  we know due to the tests we ran earlier on the current active scb phase.
                   10668:  *  At this point we can queue the abort tag and go on with life.
                   10669:  */
                   10670: 
                   10671:   if ( found == 0 )
                   10672:   {
                   10673:     p->flags |= AHC_ABORT_PENDING;
                   10674:     scb->flags |= SCB_QUEUED_ABORT | SCB_ABORT | SCB_RECOVERY_SCB;
                   10675:     scb->hscb->control |= MK_MESSAGE;
                   10676:     result=aic7xxx_find_scb(p, scb);
                   10677:     if ( result != SCB_LIST_NULL ) 
                   10678:     {
                   10679:       saved_hscbptr = aic_inb(p, SCBPTR);
                   10680:       aic_outb(p, result, SCBPTR);
                   10681:       tmp_char = aic_inb(p, SCB_CONTROL);
                   10682:       aic_outb(p,  tmp_char | MK_MESSAGE, SCB_CONTROL);
                   10683:       aic_outb(p, saved_hscbptr, SCBPTR);
                   10684:     }
                   10685:     if (aic7xxx_verbose & VERBOSE_ABORT_PROCESS)
                   10686:       printk(INFO_LEAD "SCB disconnected.  Queueing Abort"
                   10687:         " SCB.\n", p->host_no, CTL_OF_SCB(scb));
                   10688:     p->qinfifo[p->qinfifonext++] = scb->hscb->tag;
                   10689:     if (p->features & AHC_QUEUE_REGS)
                   10690:       aic_outb(p, p->qinfifonext, HNSCB_QOFF);
                   10691:     else
                   10692:       aic_outb(p, p->qinfifonext, KERNEL_QINPOS);
                   10693:   }
                   10694:   if (found)
                   10695:   {
                   10696:     aic7xxx_run_done_queue(p, TRUE);
                   10697:     aic7xxx_run_waiting_queues(p);
                   10698:   }
                   10699:   p->flags &= ~AHC_IN_ABORT;
                   10700:   unpause_sequencer(p, FALSE);
                   10701:   DRIVER_UNLOCK
                   10702: 
                   10703: /*
                   10704:  *  On the return value.  If we found the command and aborted it, then we know
                   10705:  *  it's already sent back and there is no reason for a further timeout, so
                   10706:  *  we use SCSI_ABORT_SUCCESS.  On the queued abort side, we aren't so certain
                   10707:  *  there hasn't been a bus hang or something that might keep the abort from
                   10708:  *  from completing.  Therefore, we use SCSI_ABORT_PENDING.  The first time this
                   10709:  *  is passed back, the timeout on the command gets extended, the second time
                   10710:  *  we pass this back, the mid level SCSI code calls our reset function, which
                   10711:  *  would shake loose a hung bus.
                   10712:  */
                   10713:   if ( found != 0 )
                   10714:     return(SCSI_ABORT_SUCCESS);
                   10715:   else
                   10716:     return(SCSI_ABORT_PENDING); 
                   10717: }
                   10718: 
                   10719: 
                   10720: /*+F*************************************************************************
                   10721:  * Function:
                   10722:  *   aic7xxx_reset
                   10723:  *
                   10724:  * Description:
                   10725:  *   Resetting the bus always succeeds - is has to, otherwise the
                   10726:  *   kernel will panic! Try a surgical technique - sending a BUS
                   10727:  *   DEVICE RESET message - on the offending target before pulling
                   10728:  *   the SCSI bus reset line.
                   10729:  *-F*************************************************************************/
                   10730: int
                   10731: aic7xxx_reset(Scsi_Cmnd *cmd, unsigned int flags)
                   10732: {
                   10733:   struct aic7xxx_scb *scb = NULL;
                   10734:   struct aic7xxx_host *p;
                   10735:   int    tindex;
                   10736:   int    result = -1;
                   10737: #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95)
                   10738:   unsigned long cpu_flags = 0;
                   10739: #endif
                   10740: #define DEVICE_RESET 0x01
                   10741: #define BUS_RESET    0x02
                   10742: #define HOST_RESET   0x04
                   10743: #define FAIL         0x08
                   10744: #define RESET_DELAY  0x10
                   10745:   int        action;
                   10746:   Scsi_Cmnd *cmd_prev, *cmd_next;
                   10747: 
                   10748: 
                   10749:   if ( cmd == NULL )
                   10750:   {
                   10751:     printk(KERN_WARNING "(scsi?:?:?:?) Reset called with NULL Scsi_Cmnd "
                   10752:       "pointer, failing.\n");
                   10753:     return(SCSI_RESET_SNOOZE);
                   10754:   }
                   10755: 
                   10756:   p = (struct aic7xxx_host *) cmd->host->hostdata;
                   10757:   scb = (p->scb_data->scb_array[aic7xxx_position(cmd)]);
                   10758:   tindex = TARGET_INDEX(cmd);
                   10759: 
                   10760:   /*
                   10761:    * I added a new config option to the driver: "panic_on_abort" that will
                   10762:    * cause the driver to panic and the machine to stop on the first abort
                   10763:    * or reset call into the driver.  At that point, it prints out a lot of
                   10764:    * usefull information for me which I can then use to try and debug the
                   10765:    * problem.  Simply enable the boot time prompt in order to activate this
                   10766:    * code.
                   10767:    */
                   10768:   if (aic7xxx_panic_on_abort)
                   10769:     aic7xxx_panic_abort(p, cmd);
                   10770: 
                   10771:   DRIVER_LOCK
                   10772: 
                   10773:   pause_sequencer(p);
                   10774:   while ( (aic_inb(p, INTSTAT) & INT_PEND) && !(p->flags & AHC_IN_ISR))
                   10775:   {
                   10776:     aic7xxx_isr(p->irq, p, (void *)NULL );
                   10777:     pause_sequencer(p);
                   10778:     aic7xxx_done_cmds_complete(p);
                   10779:   }
                   10780: 
                   10781:   if (scb == NULL)
                   10782:   {
                   10783:     if (aic7xxx_verbose & VERBOSE_RESET_MID)
                   10784:       printk(INFO_LEAD "Reset called with bogus Scsi_Cmnd"
                   10785:            "->SCB mapping, improvising.\n", p->host_no, CTL_OF_CMD(cmd));
                   10786:     if ( flags & SCSI_RESET_SUGGEST_HOST_RESET )
                   10787:     {
                   10788:       action = HOST_RESET;
                   10789:     }
                   10790:     else
                   10791:     {
                   10792:       action = BUS_RESET;
                   10793:     }
                   10794:   }
                   10795:   else if (scb->cmd != cmd) 
                   10796:   {
                   10797:     if (aic7xxx_verbose & VERBOSE_RESET_MID)
                   10798:     printk(INFO_LEAD "Reset called with recycled SCB "
                   10799:         "for cmd.\n", p->host_no, CTL_OF_CMD(cmd));
                   10800:     cmd_prev = NULL;
                   10801:     cmd_next = p->completeq.head;
                   10802:     while ( cmd_next != NULL )
                   10803:     {
                   10804:       if (cmd_next == cmd)
                   10805:       {
                   10806:         if (aic7xxx_verbose & VERBOSE_RESET_RETURN)
                   10807:           printk(INFO_LEAD "Reset, found cmd on completeq"
                   10808:           ", completing.\n", p->host_no, CTL_OF_CMD(cmd));
                   10809:         unpause_sequencer(p, FALSE);
                   10810:         DRIVER_UNLOCK
                   10811:         return(SCSI_RESET_NOT_RUNNING);
                   10812:       }
                   10813:       cmd_prev = cmd_next;
                   10814:       cmd_next = (Scsi_Cmnd *)cmd_next->host_scribble;
                   10815:     }
                   10816:     if ( !(flags & SCSI_RESET_SYNCHRONOUS) )
                   10817:     {
                   10818:       if (aic7xxx_verbose & VERBOSE_RESET_RETURN)
                   10819:         printk(INFO_LEAD "Reset, cmd not found,"
                   10820:           " failing.\n", p->host_no, CTL_OF_CMD(cmd));
                   10821:       unpause_sequencer(p, FALSE);
                   10822:       DRIVER_UNLOCK
                   10823:       return(SCSI_RESET_NOT_RUNNING);
                   10824:     }
                   10825:     else
                   10826:     {
                   10827:       if (aic7xxx_verbose & VERBOSE_RESET_MID)
                   10828:         printk(INFO_LEAD "Reset called, no scb, "
                   10829:           "flags 0x%x\n", p->host_no, CTL_OF_CMD(cmd), flags);
                   10830:       scb = NULL;
                   10831:       action = HOST_RESET;
                   10832:     }
                   10833:   }
                   10834:   else
                   10835:   {
                   10836:     if (aic7xxx_verbose & VERBOSE_RESET_MID)
                   10837:       printk(INFO_LEAD "Reset called, scb %d, flags "
                   10838:         "0x%x\n", p->host_no, CTL_OF_SCB(scb), scb->hscb->tag, scb->flags);
                   10839:     if ( aic7xxx_scb_on_qoutfifo(p, scb) )
                   10840:     {
                   10841:       if(aic7xxx_verbose & VERBOSE_RESET_RETURN)
                   10842:         printk(INFO_LEAD "SCB on qoutfifo, returning.\n", p->host_no,
                   10843:           CTL_OF_SCB(scb));
                   10844:       unpause_sequencer(p, FALSE);
                   10845:       DRIVER_UNLOCK
                   10846:       return(SCSI_RESET_NOT_RUNNING);
                   10847:     }
                   10848:     if ( flags & SCSI_RESET_SUGGEST_HOST_RESET )
                   10849:     {
                   10850:       action = HOST_RESET;
                   10851:     }
                   10852:     else if ( flags & SCSI_RESET_SUGGEST_BUS_RESET )
                   10853:     {
                   10854:       action = BUS_RESET;
                   10855:     }
                   10856:     else 
                   10857:     {
                   10858:       action = DEVICE_RESET;
                   10859:     }
                   10860:   }
                   10861:   if ( (action & DEVICE_RESET) && 
                   10862:         (p->dev_flags[tindex] & BUS_DEVICE_RESET_PENDING) )
                   10863:   {
                   10864:     if (aic7xxx_verbose & VERBOSE_RESET_PROCESS)
                   10865:       printk(INFO_LEAD "Bus device reset already sent to "
                   10866:         "device, escalating.\n", p->host_no, CTL_OF_CMD(cmd));
                   10867:     action = BUS_RESET;
                   10868:   }
                   10869:   if ( (action & DEVICE_RESET) &&
                   10870:        (scb->flags & SCB_QUEUED_ABORT) )
                   10871:   {
                   10872:     if (aic7xxx_verbose & VERBOSE_RESET_PROCESS)
                   10873:     {
                   10874:       printk(INFO_LEAD "Have already attempted to reach "
                   10875:         "device with queued\n", p->host_no, CTL_OF_CMD(cmd));
                   10876:       printk(INFO_LEAD "message, will escalate to bus "
                   10877:         "reset.\n", p->host_no, CTL_OF_CMD(cmd));
                   10878:     }
                   10879:     action = BUS_RESET;
                   10880:   }
                   10881:   if ( (action & DEVICE_RESET) && 
                   10882:        (p->flags & (AHC_RESET_PENDING | AHC_ABORT_PENDING)) )
                   10883:   {
                   10884:     if (aic7xxx_verbose & VERBOSE_RESET_PROCESS)
                   10885:      printk(INFO_LEAD "Bus device reset stupid when "
                   10886:         "other action has failed.\n", p->host_no, CTL_OF_CMD(cmd));
                   10887:     action = BUS_RESET;
                   10888:   }
                   10889:   if ( (action & BUS_RESET) && !(p->features & AHC_TWIN) )
                   10890:   {
                   10891:     action = HOST_RESET;
                   10892:   }
                   10893:   if ( ((jiffies - p->dev_last_reset[tindex]) < (HZ * 3)) &&
                   10894:        !(action & (HOST_RESET | BUS_RESET)))
                   10895:   {
                   10896:     if (aic7xxx_verbose & VERBOSE_RESET_PROCESS)
                   10897:     {
                   10898:       printk(INFO_LEAD "Reset called too soon after last "
                   10899:         "reset without requesting\n", p->host_no, CTL_OF_CMD(cmd));
                   10900:       printk(INFO_LEAD "bus or host reset, escalating.\n", p->host_no,
                   10901:         CTL_OF_CMD(cmd));
                   10902:     }
                   10903:     action = BUS_RESET;
                   10904:   }
                   10905:   if ( ((jiffies - p->last_reset) < (HZ * 3)) &&
                   10906:         (action & (HOST_RESET | BUS_RESET)) )
                   10907:   {
                   10908:     if (aic7xxx_verbose & VERBOSE_RESET_PROCESS)
                   10909:       printk(INFO_LEAD "Reset called too soon after "
                   10910:         "last bus reset, delaying.\n", p->host_no, CTL_OF_CMD(cmd));
                   10911:     action = RESET_DELAY;
                   10912:   }
                   10913:   if ( (action & (BUS_RESET | HOST_RESET)) && (p->flags & AHC_IN_RESET)
                   10914:         && ((jiffies - p->reset_start) > (2 * HZ * 3)) )
                   10915:   {
                   10916:     printk(KERN_ERR "(scsi%d:%d:%d:%d) Yikes!!  Card must have left to go "
                   10917:         "back to Adaptec!!\n", p->host_no, CTL_OF_CMD(cmd));
                   10918:     unpause_sequencer(p, FALSE);
                   10919:     DRIVER_UNLOCK
                   10920:     return(SCSI_RESET_SNOOZE);
                   10921:   }
                   10922: /*
                   10923:  *  By this point, we want to already know what we are going to do and
                   10924:  *  only have the following code implement our course of action.
                   10925:  */
                   10926:   switch (action)
                   10927:   {
                   10928:     case RESET_DELAY:
                   10929:       unpause_sequencer(p, FALSE);
                   10930:       DRIVER_UNLOCK
                   10931:       return(SCSI_RESET_PENDING);
                   10932:       break;
                   10933:     case FAIL:
                   10934:       unpause_sequencer(p, FALSE);
                   10935:       DRIVER_UNLOCK
                   10936:       return(SCSI_RESET_ERROR);
                   10937:       break;
                   10938:     case DEVICE_RESET:
                   10939:       p->flags |= AHC_IN_RESET;
                   10940:       result = aic7xxx_bus_device_reset(p, cmd);
                   10941:       aic7xxx_run_done_queue(p, TRUE);
                   10942:       /*  We can't rely on run_waiting_queues to unpause the sequencer for
                   10943:        *  PCI based controllers since we use AAP */
                   10944:       aic7xxx_run_waiting_queues(p);
                   10945:       unpause_sequencer(p, FALSE);
                   10946:       p->flags &= ~AHC_IN_RESET;
                   10947:       DRIVER_UNLOCK
                   10948:       return(result);
                   10949:       break;
                   10950:     case BUS_RESET:
                   10951:     case HOST_RESET:
                   10952:     default:
                   10953:       p->reset_start = jiffies;
                   10954:       p->flags |= AHC_IN_RESET;
                   10955:       aic7xxx_reset_channel(p, cmd->channel, TRUE);
                   10956:       if ( (p->features & AHC_TWIN) && (action & HOST_RESET) )
                   10957:       {
                   10958:         aic7xxx_reset_channel(p, cmd->channel ^ 0x01, TRUE);
                   10959:         restart_sequencer(p);
                   10960:       }
                   10961:       p->last_reset = jiffies;
                   10962:       if (action != HOST_RESET)
                   10963:         result = SCSI_RESET_SUCCESS | SCSI_RESET_BUS_RESET;
                   10964:       else
                   10965:       {
                   10966:         result = SCSI_RESET_SUCCESS | SCSI_RESET_HOST_RESET;
                   10967:         aic_outb(p,  aic_inb(p, SIMODE1) & ~(ENREQINIT|ENBUSFREE),
                   10968:           SIMODE1);
                   10969:         aic7xxx_clear_intstat(p);
                   10970:         p->flags &= ~AHC_HANDLING_REQINITS;
                   10971:         p->msg_type = MSG_TYPE_NONE;
                   10972:         p->msg_index = 0;
                   10973:         p->msg_len = 0;
                   10974:       }
                   10975:       aic7xxx_run_done_queue(p, TRUE);
                   10976:       p->flags &= ~AHC_IN_RESET;
                   10977:       /*  We can't rely on run_waiting_queues to unpause the sequencer for
                   10978:        *  PCI based controllers since we use AAP */
                   10979:       aic7xxx_run_waiting_queues(p);
                   10980:       unpause_sequencer(p, FALSE);
                   10981:       DRIVER_UNLOCK
                   10982:       return(result);
                   10983:       break;
                   10984:   }
                   10985: }
                   10986: 
                   10987: /*+F*************************************************************************
                   10988:  * Function:
                   10989:  *   aic7xxx_biosparam
                   10990:  *
                   10991:  * Description:
                   10992:  *   Return the disk geometry for the given SCSI device.
                   10993:  *-F*************************************************************************/
                   10994: int
                   10995: aic7xxx_biosparam(Disk *disk, kdev_t dev, int geom[])
                   10996: {
                   10997:   int heads, sectors, cylinders;
                   10998:   struct aic7xxx_host *p;
                   10999: 
                   11000:   p = (struct aic7xxx_host *) disk->device->host->hostdata;
                   11001: 
                   11002:   /*
                   11003:    * XXX - if I could portably find the card's configuration
                   11004:    *       information, then this could be autodetected instead
                   11005:    *       of left to a boot-time switch.
                   11006:    */
                   11007:   heads = 64;
                   11008:   sectors = 32;
                   11009:   cylinders = disk->capacity / (heads * sectors);
                   11010: 
                   11011:   if ((p->flags & AHC_EXTEND_TRANS_A) && (cylinders > 1024))
                   11012:   {
                   11013:     heads = 255;
                   11014:     sectors = 63;
                   11015:     cylinders = disk->capacity / (heads * sectors);
                   11016:   }
                   11017: 
                   11018:   geom[0] = heads;
                   11019:   geom[1] = sectors;
                   11020:   geom[2] = cylinders;
                   11021: 
                   11022:   return (0);
                   11023: }
                   11024: 
                   11025: /*+F*************************************************************************
                   11026:  * Function:
                   11027:  *   aic7xxx_release
                   11028:  *
                   11029:  * Description:
                   11030:  *   Free the passed in Scsi_Host memory structures prior to unloading the
                   11031:  *   module.
                   11032:  *-F*************************************************************************/
                   11033: int
                   11034: aic7xxx_release(struct Scsi_Host *host)
                   11035: {
                   11036:   struct aic7xxx_host *p = (struct aic7xxx_host *) host->hostdata;
                   11037:   struct aic7xxx_host *next, *prev;
                   11038: 
                   11039:   if(p->irq)
                   11040:     free_irq(p->irq, p);
                   11041:   release_region(p->base, MAXREG - MINREG);
                   11042: #ifdef MMAPIO
                   11043:   if(p->maddr)
                   11044:   {
                   11045: #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0)
                   11046:     vfree((void *) (((unsigned long) p->maddr) & PAGE_MASK));
                   11047: #else
                   11048:     iounmap((void *) (((unsigned long) p->maddr) & PAGE_MASK));
                   11049: #endif
                   11050:   }
                   11051: #endif /* MMAPIO */
                   11052:   prev = NULL;
                   11053:   next = first_aic7xxx;
                   11054:   while(next != NULL)
                   11055:   {
                   11056:     if(next == p)
                   11057:     {
                   11058:       if(prev == NULL)
                   11059:         first_aic7xxx = next->next;
                   11060:       else
                   11061:         prev->next = next->next;
                   11062:     }
                   11063:     else
                   11064:     {
                   11065:       prev = next;
                   11066:     }
                   11067:     next = next->next;
                   11068:   }
                   11069:   aic7xxx_free(p);
                   11070:   return(0);
                   11071: }
                   11072: 
                   11073: /*+F*************************************************************************
                   11074:  * Function:
                   11075:  *   aic7xxx_print_card
                   11076:  *
                   11077:  * Description:
                   11078:  *   Print out all of the control registers on the card
                   11079:  *
                   11080:  *   NOTE: This function is not yet safe for use on the VLB and EISA
                   11081:  *   controllers, so it isn't used on those controllers at all.
                   11082:  *-F*************************************************************************/
                   11083: static void
                   11084: aic7xxx_print_card(struct aic7xxx_host *p)
                   11085: {
                   11086:   int i, j, k, chip;
                   11087:   static struct register_ranges {
                   11088:     int num_ranges;
                   11089:     int range_val[32];
                   11090:   } cards_ds[] = {
                   11091:     { 0, {0,} }, /* none */
                   11092:     {10, {0x00, 0x05, 0x08, 0x11, 0x18, 0x19, 0x1f, 0x1f, 0x60, 0x60, /*7771*/
                   11093:           0x62, 0x66, 0x80, 0x8e, 0x90, 0x95, 0x97, 0x97, 0x9b, 0x9f} },
                   11094:     { 9, {0x00, 0x05, 0x08, 0x11, 0x18, 0x1f, 0x60, 0x60, 0x62, 0x66, /*7850*/
                   11095:           0x80, 0x8e, 0x90, 0x95, 0x97, 0x97, 0x9a, 0x9f} },
                   11096:     { 9, {0x00, 0x05, 0x08, 0x11, 0x18, 0x1f, 0x60, 0x60, 0x62, 0x66, /*7860*/
                   11097:           0x80, 0x8e, 0x90, 0x95, 0x97, 0x97, 0x9a, 0x9f} },
                   11098:     {10, {0x00, 0x05, 0x08, 0x11, 0x18, 0x19, 0x1c, 0x1f, 0x60, 0x60, /*7870*/
                   11099:           0x62, 0x66, 0x80, 0x8e, 0x90, 0x95, 0x97, 0x97, 0x9a, 0x9f} },
                   11100:     {10, {0x00, 0x05, 0x08, 0x11, 0x18, 0x1a, 0x1c, 0x1f, 0x60, 0x60, /*7880*/
                   11101:           0x62, 0x66, 0x80, 0x8e, 0x90, 0x95, 0x97, 0x97, 0x9a, 0x9f} },
                   11102:     {16, {0x00, 0x05, 0x08, 0x11, 0x18, 0x1f, 0x60, 0x60, 0x62, 0x66, /*7890*/
                   11103:           0x84, 0x8e, 0x90, 0x95, 0x97, 0x97, 0x9a, 0x9a, 0x9f, 0x9f,
                   11104:           0xe0, 0xf1, 0xf4, 0xf4, 0xf6, 0xf6, 0xf8, 0xf8, 0xfa, 0xfc,
                   11105:           0xfe, 0xff} },
                   11106:     {12, {0x00, 0x05, 0x08, 0x11, 0x18, 0x19, 0x1b, 0x1f, 0x60, 0x60, /*7895*/
                   11107:           0x62, 0x66, 0x80, 0x8e, 0x90, 0x95, 0x97, 0x97, 0x9a, 0x9a,
                   11108:           0x9f, 0x9f, 0xe0, 0xf1} },
                   11109:     {16, {0x00, 0x05, 0x08, 0x11, 0x18, 0x1f, 0x60, 0x60, 0x62, 0x66, /*7896*/
                   11110:           0x84, 0x8e, 0x90, 0x95, 0x97, 0x97, 0x9a, 0x9a, 0x9f, 0x9f,
                   11111:           0xe0, 0xf1, 0xf4, 0xf4, 0xf6, 0xf6, 0xf8, 0xf8, 0xfa, 0xfc,
                   11112:           0xfe, 0xff} },
                   11113:   };
                   11114: #ifdef CONFIG_PCI
                   11115:   static struct register_ranges cards_ns[] = {
                   11116:     { 0, {0,} }, /* none */
                   11117:     { 0, {0,} }, /* 7771 */
                   11118:     { 7, {0x04, 0x08, 0x0c, 0x0e, 0x10, 0x17, 0x28, 0x2b, 0x30, 0x33,
                   11119:           0x3c, 0x41, 0x43, 0x47} },
                   11120:     { 7, {0x04, 0x08, 0x0c, 0x0e, 0x10, 0x17, 0x28, 0x2b, 0x30, 0x33,
                   11121:           0x3c, 0x41, 0x43, 0x47} },
                   11122:     { 5, {0x04, 0x08, 0x0c, 0x0e, 0x10, 0x17, 0x30, 0x33, 0x3c, 0x41} },
                   11123:     { 5, {0x04, 0x08, 0x0c, 0x0e, 0x10, 0x17, 0x30, 0x34, 0x3c, 0x47} },
                   11124:     { 5, {0x04, 0x08, 0x0c, 0x1b, 0x30, 0x34, 0x3c, 0x43, 0xdc, 0xe3} },
                   11125:     { 6, {0x04, 0x08, 0x0c, 0x0e, 0x10, 0x17, 0x30, 0x34, 0x3c, 0x47,
                   11126:           0xdc, 0xe3} },
                   11127:     { 6, {0x04, 0x08, 0x0c, 0x1b, 0x30, 0x34, 0x3c, 0x43, 0xdc, 0xe3,
                   11128:           0xff, 0xff} }
                   11129:   };
                   11130: #endif
                   11131:   chip = p->chip & AHC_CHIPID_MASK;
                   11132:   /*
                   11133:    * Let's run through the PCI space first....
                   11134:    */
                   11135:   printk("%s at ",
                   11136:          board_names[p->board_name_index]);
                   11137:   switch(p->chip & ~AHC_CHIPID_MASK)
                   11138:   {
                   11139:     case AHC_VL:
                   11140:       printk("VLB Slot %d.\n", p->pci_device_fn);
                   11141:       break;
                   11142:     case AHC_EISA:
                   11143:       printk("EISA Slot %d.\n", p->pci_device_fn);
                   11144:       break;
                   11145:     case AHC_PCI:
                   11146:     default:
                   11147:       printk("PCI %d/%d.\n", PCI_SLOT(p->pci_device_fn),
                   11148:              PCI_FUNC(p->pci_device_fn));
                   11149:       break;
                   11150:   }
                   11151: 
                   11152: #ifdef CONFIG_PCI
                   11153:   {
                   11154:     unsigned char temp;
                   11155:     
                   11156:     printk("PCI Dump:\n");
                   11157:     k=0;
                   11158:     for(i=0; i<cards_ns[chip].num_ranges; i++)
                   11159:     {
                   11160:       for(j  = cards_ns[chip].range_val[ i * 2 ];
                   11161:           j <= cards_ns[chip].range_val[ i * 2 + 1 ] ;
                   11162:           j++)
                   11163:       {
                   11164: #if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,92)
                   11165:         pci_read_config_byte(p->pdev, j, &temp);
                   11166: #else
                   11167:         pcibios_read_config_byte(p->pci_bus, p->pci_device_fn, j, &temp);
                   11168: #endif
                   11169:         printk("%02x:%02x ", j, temp);
                   11170:         if(++k == 13)
                   11171:         {
                   11172:           printk("\n");
                   11173:           k = 0;
                   11174:         }
                   11175:       }
                   11176:     }
                   11177:   }
                   11178:   if(k != 0)
                   11179:     printk("\n");
                   11180: #endif /* CONFIG_PCI */
                   11181: 
                   11182:   /*
                   11183:    * Now the registers on the card....
                   11184:    */
                   11185:   printk("Card Dump:\n");
                   11186:   k = 0;
                   11187:   for(i=0; i<cards_ds[chip].num_ranges; i++)
                   11188:   {
                   11189:     for(j  = cards_ds[chip].range_val[ i * 2 ];
                   11190:         j <= cards_ds[chip].range_val[ i * 2 + 1 ] ;
                   11191:         j++)
                   11192:     {
                   11193:       printk("%02x:%02x ", j, aic_inb(p, j));
                   11194:       if(++k == 13)
                   11195:       {
                   11196:         printk("\n");
                   11197:         k=0;
                   11198:       }
                   11199:     }
                   11200:   }
                   11201:   if(k != 0)
                   11202:     printk("\n");
                   11203:   if (p->flags & AHC_SEEPROM_FOUND)
                   11204:   {
                   11205:     unsigned short *sc1;
                   11206:     sc1 = (unsigned short *)&p->sc;
                   11207:     
                   11208:     printk("SEEPROM dump.\n");
                   11209:     for(i=1; i<=32; i++)
                   11210:     {
                   11211:       printk("0x%04x", sc1[i-1]);
                   11212:       if ( (i % 8) == 0 )
                   11213:         printk("\n");
                   11214:       else
                   11215:         printk("  ");
                   11216:     }
                   11217:   }
                   11218: 
                   11219:   /*
                   11220:    * If this was an Ultra2 controller, then we just hosed the card in terms
                   11221:    * of the QUEUE REGS.  This function is only called at init time or by
                   11222:    * the panic_abort function, so it's safe to assume a generic init time
                   11223:    * setting here
                   11224:    */
                   11225: 
                   11226:   if(p->features & AHC_QUEUE_REGS)
                   11227:   {
                   11228:     aic_outb(p, 0, SDSCB_QOFF);
                   11229:     aic_outb(p, 0, SNSCB_QOFF);
                   11230:     aic_outb(p, 0, HNSCB_QOFF);
                   11231:   }
                   11232: 
                   11233: }
                   11234: 
                   11235: /*+F*************************************************************************
                   11236:  * Function:
                   11237:  *   aic7xxx_print_scratch_ram
                   11238:  *
                   11239:  * Description:
                   11240:  *   Print out the scratch RAM values on the card.
                   11241:  *-F*************************************************************************/
                   11242: static void
                   11243: aic7xxx_print_scratch_ram(struct aic7xxx_host *p)
                   11244: {
                   11245:   int i, k;
                   11246: 
                   11247:   k = 0;
                   11248:   printk("Scratch RAM:\n");
                   11249:   for(i = SRAM_BASE; i < SEQCTL; i++)
                   11250:   {
                   11251:     printk("%02x:%02x ", i, aic_inb(p, i));
                   11252:     if(++k == 13)
                   11253:     {
                   11254:       printk("\n");
                   11255:       k=0;
                   11256:     }
                   11257:   }
                   11258:   if (p->features & AHC_MORE_SRAM)
                   11259:   {
                   11260:     for(i = TARG_OFFSET; i < 0x80; i++)
                   11261:     {
                   11262:       printk("%02x:%02x ", i, aic_inb(p, i));
                   11263:       if(++k == 13)
                   11264:       {
                   11265:         printk("\n");
                   11266:         k=0;
                   11267:       }
                   11268:     }
                   11269:   }
                   11270:   printk("\n");
                   11271: }
                   11272: 
                   11273: 
                   11274: #include "aic7xxx_proc.c"
                   11275: 
                   11276: #ifdef MODULE
                   11277: /* Eventually this will go into an include file, but this will be later */
                   11278: Scsi_Host_Template driver_template = AIC7XXX;
                   11279: 
                   11280: #include "scsi_module.c"
                   11281: #endif
                   11282: 
                   11283: /*
                   11284:  * Overrides for Emacs so that we almost follow Linus's tabbing style.
                   11285:  * Emacs will notice this stuff at the end of the file and automatically
                   11286:  * adjust the settings for this buffer only.  This must remain at the end
                   11287:  * of the file.
                   11288:  * ---------------------------------------------------------------------------
                   11289:  * Local variables:
                   11290:  * c-indent-level: 2
                   11291:  * c-brace-imaginary-offset: 0
                   11292:  * c-brace-offset: -2
                   11293:  * c-argdecl-indent: 2
                   11294:  * c-label-offset: -2
                   11295:  * c-continued-statement-offset: 2
                   11296:  * c-continued-brace-offset: 0
                   11297:  * indent-tabs-mode: nil
                   11298:  * tab-width: 8
                   11299:  * End:
                   11300:  */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.