Annotation of Gnu-Mach/linux/src/drivers/scsi/aic7xxx.c, revision 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.