aic7xxx_old.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:392k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  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 (deischen@iworks.InterWorks.org):
  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 General 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.119 1997/06/27 19:39:18 gibbs 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, deischen@iworks.InterWorks.org, 1/23/97
  95.  *
  96.  *  $Id: aic7xxx.c,v 4.1 1997/06/12 08:23:42 deang Exp $
  97.  *-M*************************************************************************/
  98. /*+M**************************************************************************
  99.  *
  100.  * Further driver modifications made by Doug Ledford <dledford@redhat.com>
  101.  *
  102.  * Copyright (c) 1997-1999 Doug Ledford
  103.  *
  104.  * These changes are released under the same licensing terms as the FreeBSD
  105.  * driver written by Justin Gibbs.  Please see his Copyright notice above
  106.  * for the exact terms and conditions covering my changes as well as the
  107.  * warranty statement.
  108.  *
  109.  * Modifications made to the aic7xxx.c,v 4.1 driver from Dan Eischen include
  110.  * but are not limited to:
  111.  *
  112.  *  1: Import of the latest FreeBSD sequencer code for this driver
  113.  *  2: Modification of kernel code to accomodate different sequencer semantics
  114.  *  3: Extensive changes throughout kernel portion of driver to improve
  115.  *     abort/reset processing and error hanndling
  116.  *  4: Other work contributed by various people on the Internet
  117.  *  5: Changes to printk information and verbosity selection code
  118.  *  6: General reliability related changes, especially in IRQ management
  119.  *  7: Modifications to the default probe/attach order for supported cards
  120.  *  8: SMP friendliness has been improved
  121.  *
  122.  * Overall, this driver represents a significant departure from the official
  123.  * aic7xxx driver released by Dan Eischen in two ways.  First, in the code
  124.  * itself.  A diff between the two version of the driver is now a several
  125.  * thousand line diff.  Second, in approach to solving the same problem.  The
  126.  * problem is importing the FreeBSD aic7xxx driver code to linux can be a
  127.  * difficult and time consuming process, that also can be error prone.  Dan
  128.  * Eischen's official driver uses the approach that the linux and FreeBSD
  129.  * drivers should be as identical as possible.  To that end, his next version
  130.  * of this driver will be using a mid-layer code library that he is developing
  131.  * to moderate communications between the linux mid-level SCSI code and the
  132.  * low level FreeBSD driver.  He intends to be able to essentially drop the
  133.  * FreeBSD driver into the linux kernel with only a few minor tweaks to some
  134.  * include files and the like and get things working, making for fast easy
  135.  * imports of the FreeBSD code into linux.
  136.  *
  137.  * I disagree with Dan's approach.  Not that I don't think his way of doing
  138.  * things would be nice, easy to maintain, and create a more uniform driver
  139.  * between FreeBSD and Linux.  I have no objection to those issues.  My
  140.  * disagreement is on the needed functionality.  There simply are certain
  141.  * things that are done differently in FreeBSD than linux that will cause
  142.  * problems for this driver regardless of any middle ware Dan implements.
  143.  * The biggest example of this at the moment is interrupt semantics.  Linux
  144.  * doesn't provide the same protection techniques as FreeBSD does, nor can
  145.  * they be easily implemented in any middle ware code since they would truly
  146.  * belong in the kernel proper and would effect all drivers.  For the time
  147.  * being, I see issues such as these as major stumbling blocks to the 
  148.  * reliability of code based upon such middle ware.  Therefore, I choose to
  149.  * use a different approach to importing the FreeBSD code that doesn't
  150.  * involve any middle ware type code.  My approach is to import the sequencer
  151.  * code from FreeBSD wholesale.  Then, to only make changes in the kernel
  152.  * portion of the driver as they are needed for the new sequencer semantics.
  153.  * In this way, the portion of the driver that speaks to the rest of the
  154.  * linux kernel is fairly static and can be changed/modified to solve
  155.  * any problems one might encounter without concern for the FreeBSD driver.
  156.  *
  157.  * Note: If time and experience should prove me wrong that the middle ware
  158.  * code Dan writes is reliable in its operation, then I'll retract my above
  159.  * statements.  But, for those that don't know, I'm from Missouri (in the US)
  160.  * and our state motto is "The Show-Me State".  Well, before I will put
  161.  * faith into it, you'll have to show me that it works :)
  162.  *
  163.  *_M*************************************************************************/
  164. /*
  165.  * The next three defines are user configurable.  These should be the only
  166.  * defines a user might need to get in here and change.  There are other
  167.  * defines buried deeper in the code, but those really shouldn't need touched
  168.  * under normal conditions.
  169.  */
  170. /*
  171.  * AIC7XXX_STRICT_PCI_SETUP
  172.  *   Should we assume the PCI config options on our controllers are set with
  173.  *   sane and proper values, or should we be anal about our PCI config
  174.  *   registers and force them to what we want?  The main advantage to
  175.  *   defining this option is on non-Intel hardware where the BIOS may not
  176.  *   have been run to set things up, or if you have one of the BIOSless
  177.  *   Adaptec controllers, such as a 2910, that don't get set up by the
  178.  *   BIOS.  However, keep in mind that we really do set the most important
  179.  *   items in the driver regardless of this setting, this only controls some
  180.  *   of the more esoteric PCI options on these cards.  In that sense, I
  181.  *   would default to leaving this off.  However, if people wish to try
  182.  *   things both ways, that would also help me to know if there are some
  183.  *   machines where it works one way but not another.
  184.  *
  185.  *   -- July 7, 17:09
  186.  *     OK...I need this on my machine for testing, so the default is to
  187.  *     leave it defined.
  188.  *
  189.  *   -- July 7, 18:49
  190.  *     I needed it for testing, but it didn't make any difference, so back
  191.  *     off she goes.
  192.  *
  193.  *   -- July 16, 23:04
  194.  *     I turned it back on to try and compensate for the 2.1.x PCI code
  195.  *     which no longer relies solely on the BIOS and now tries to set
  196.  *     things itself.
  197.  */
  198. #define AIC7XXX_STRICT_PCI_SETUP
  199. /*
  200.  * AIC7XXX_VERBOSE_DEBUGGING
  201.  *   This option enables a lot of extra printk();s in the code, surrounded
  202.  *   by if (aic7xxx_verbose ...) statements.  Executing all of those if
  203.  *   statements and the extra checks can get to where it actually does have
  204.  *   an impact on CPU usage and such, as well as code size.  Disabling this
  205.  *   define will keep some of those from becoming part of the code.
  206.  *
  207.  *   NOTE:  Currently, this option has no real effect, I will be adding the
  208.  *   various #ifdef's in the code later when I've decided a section is
  209.  *   complete and no longer needs debugging.  OK...a lot of things are now
  210.  *   surrounded by this define, so turning this off does have an impact.
  211.  */
  212.  
  213. /*
  214.  * #define AIC7XXX_VERBOSE_DEBUGGING
  215.  */
  216.  
  217. #include <linux/module.h>
  218. #include <stdarg.h>
  219. #include <asm/io.h>
  220. #include <asm/irq.h>
  221. #include <asm/byteorder.h>
  222. #include <linux/version.h>
  223. #include <linux/string.h>
  224. #include <linux/errno.h>
  225. #include <linux/kernel.h>
  226. #include <linux/ioport.h>
  227. #include <linux/delay.h>
  228. #include <linux/sched.h>
  229. #include <linux/pci.h>
  230. #include <linux/proc_fs.h>
  231. #include <linux/blk.h>
  232. #include <linux/tqueue.h>
  233. #include <linux/init.h>
  234. #include <linux/spinlock.h>
  235. #include <linux/smp.h>
  236. #include <linux/blk.h>
  237. #include "sd.h"
  238. #include "scsi.h"
  239. #include "hosts.h"
  240. #include "aic7xxx_old/aic7xxx.h"
  241. #include "aic7xxx_old/sequencer.h"
  242. #include "aic7xxx_old/scsi_message.h"
  243. #include "aic7xxx_old/aic7xxx_reg.h"
  244. #include <scsi/scsicam.h>
  245. #include <linux/stat.h>
  246. #include <linux/slab.h>        /* for kmalloc() */
  247. #include <linux/config.h>        /* for CONFIG_PCI */
  248. /*
  249.  * To generate the correct addresses for the controller to issue
  250.  * on the bus.  Originally added for DEC Alpha support.
  251.  */
  252. #define VIRT_TO_BUS(a) (unsigned int)virt_to_bus((void *)(a))
  253. #define AIC7XXX_C_VERSION  "5.2.4"
  254. #define NUMBER(arr)     (sizeof(arr) / sizeof(arr[0]))
  255. #define MIN(a,b)        (((a) < (b)) ? (a) : (b))
  256. #define MAX(a,b)        (((a) > (b)) ? (a) : (b))
  257. #define ALL_TARGETS -1
  258. #define ALL_CHANNELS -1
  259. #define ALL_LUNS -1
  260. #define MAX_TARGETS  16
  261. #define MAX_LUNS     8
  262. #ifndef TRUE
  263. #  define TRUE 1
  264. #endif
  265. #ifndef FALSE
  266. #  define FALSE 0
  267. #endif
  268. #if defined(__powerpc__) || defined(__i386__) || defined(__x86_64__)
  269. #  define MMAPIO
  270. #endif
  271. #  if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95)
  272. #    define cpuid smp_processor_id()
  273. #    define DRIVER_LOCK_INIT 
  274.        spin_lock_init(&p->spin_lock);
  275. #    define DRIVER_LOCK 
  276.        if(!p->cpu_lock_count[cpuid]) { 
  277.          spin_lock_irqsave(&p->spin_lock, cpu_flags); 
  278.          p->cpu_lock_count[cpuid]++; 
  279.        } else { 
  280.          p->cpu_lock_count[cpuid]++; 
  281.        }
  282. #    define DRIVER_UNLOCK 
  283.        if(--p->cpu_lock_count[cpuid] == 0) 
  284.          spin_unlock_irqrestore(&p->spin_lock, cpu_flags);
  285. #  else
  286. #    define DRIVER_LOCK_INIT
  287. #    define DRIVER_LOCK
  288. #    define DRIVER_UNLOCK
  289. #  endif
  290. /*
  291.  * You can try raising me if tagged queueing is enabled, or lowering
  292.  * me if you only have 4 SCBs.
  293.  */
  294. #ifdef CONFIG_AIC7XXX_OLD_CMDS_PER_DEVICE
  295. #define AIC7XXX_CMDS_PER_DEVICE CONFIG_AIC7XXX_OLD_CMDS_PER_DEVICE
  296. #else
  297. #define AIC7XXX_CMDS_PER_DEVICE 32
  298. #endif
  299. /*
  300.  * Control collection of SCSI transfer statistics for the /proc filesystem.
  301.  *
  302.  * NOTE: Do NOT enable this when running on kernels version 1.2.x and below.
  303.  * NOTE: This does affect performance since it has to maintain statistics.
  304.  */
  305. #ifdef CONFIG_AIC7XXX_OLD_PROC_STATS
  306. #define AIC7XXX_PROC_STATS
  307. #endif
  308. /*
  309.  * *** Determining commands per LUN ***
  310.  * 
  311.  * When AIC7XXX_CMDS_PER_DEVICE is not defined, the driver will use its
  312.  * own algorithm to determine the commands/LUN.  If SCB paging is
  313.  * enabled, which is always now, the default is 8 commands per lun
  314.  * that indicates it supports tagged queueing.  All non-tagged devices
  315.  * use an internal queue depth of 3, with no more than one of those
  316.  * three commands active at one time.
  317.  */
  318. typedef struct
  319. {
  320.   unsigned char tag_commands[16];   /* Allow for wide/twin adapters. */
  321. } adapter_tag_info_t;
  322. /*
  323.  * Make a define that will tell the driver not to use tagged queueing
  324.  * by default.
  325.  */
  326. #ifdef CONFIG_AIC7XXX_OLD_TCQ_ON_BY_DEFAULT
  327. #define DEFAULT_TAG_COMMANDS {0, 0, 0, 0, 0, 0, 0, 0,
  328.                               0, 0, 0, 0, 0, 0, 0, 0}
  329. #else
  330. #define DEFAULT_TAG_COMMANDS {255, 255, 255, 255, 255, 255, 255, 255,
  331.                               255, 255, 255, 255, 255, 255, 255, 255}
  332. #endif
  333. /*
  334.  * Modify this as you see fit for your system.  By setting tag_commands
  335.  * to 0, the driver will use it's own algorithm for determining the
  336.  * number of commands to use (see above).  When 255, the driver will
  337.  * not enable tagged queueing for that particular device.  When positive
  338.  * (> 0) and (< 255) the values in the array are used for the queue_depth.
  339.  * Note that the maximum value for an entry is 254, but you're insane if
  340.  * you try to use that many commands on one device.
  341.  *
  342.  * In this example, the first line will disable tagged queueing for all
  343.  * the devices on the first probed aic7xxx adapter.
  344.  *
  345.  * The second line enables tagged queueing with 4 commands/LUN for IDs
  346.  * (1, 2-11, 13-15), disables tagged queueing for ID 12, and tells the
  347.  * driver to use its own algorithm for ID 1.
  348.  *
  349.  * The third line is the same as the first line.
  350.  *
  351.  * The fourth line disables tagged queueing for devices 0 and 3.  It
  352.  * enables tagged queueing for the other IDs, with 16 commands/LUN
  353.  * for IDs 1 and 4, 127 commands/LUN for ID 8, and 4 commands/LUN for
  354.  * IDs 2, 5-7, and 9-15.
  355.  */
  356. /*
  357.  * NOTE: The below structure is for reference only, the actual structure
  358.  *       to modify in order to change things is found after this fake one.
  359.  *
  360. adapter_tag_info_t aic7xxx_tag_info[] =
  361. {
  362.   {DEFAULT_TAG_COMMANDS},
  363.   {{4, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 255, 4, 4, 4}},
  364.   {DEFAULT_TAG_COMMANDS},
  365.   {{255, 16, 4, 255, 16, 4, 4, 4, 127, 4, 4, 4, 4, 4, 4, 4}}
  366. };
  367. */
  368. static adapter_tag_info_t aic7xxx_tag_info[] =
  369. {
  370.   {DEFAULT_TAG_COMMANDS},
  371.   {DEFAULT_TAG_COMMANDS},
  372.   {DEFAULT_TAG_COMMANDS},
  373.   {DEFAULT_TAG_COMMANDS},
  374.   {DEFAULT_TAG_COMMANDS},
  375.   {DEFAULT_TAG_COMMANDS},
  376.   {DEFAULT_TAG_COMMANDS},
  377.   {DEFAULT_TAG_COMMANDS},
  378.   {DEFAULT_TAG_COMMANDS},
  379.   {DEFAULT_TAG_COMMANDS},
  380.   {DEFAULT_TAG_COMMANDS},
  381.   {DEFAULT_TAG_COMMANDS},
  382.   {DEFAULT_TAG_COMMANDS},
  383.   {DEFAULT_TAG_COMMANDS},
  384.   {DEFAULT_TAG_COMMANDS},
  385.   {DEFAULT_TAG_COMMANDS}
  386. };
  387. /*
  388.  * Define an array of board names that can be indexed by aha_type.
  389.  * Don't forget to change this when changing the types!
  390.  */
  391. static const char *board_names[] = {
  392.   "AIC-7xxx Unknown",                                   /* AIC_NONE */
  393.   "Adaptec AIC-7810 Hardware RAID Controller",          /* AIC_7810 */
  394.   "Adaptec AIC-7770 SCSI host adapter",                 /* AIC_7770 */
  395.   "Adaptec AHA-274X SCSI host adapter",                 /* AIC_7771 */
  396.   "Adaptec AHA-284X SCSI host adapter",                 /* AIC_284x */
  397.   "Adaptec AIC-7850 SCSI host adapter",                 /* AIC_7850 */
  398.   "Adaptec AIC-7855 SCSI host adapter",                 /* AIC_7855 */
  399.   "Adaptec AIC-7860 Ultra SCSI host adapter",           /* AIC_7860 */
  400.   "Adaptec AHA-2940A Ultra SCSI host adapter",          /* AIC_7861 */
  401.   "Adaptec AIC-7870 SCSI host adapter",                 /* AIC_7870 */
  402.   "Adaptec AHA-294X SCSI host adapter",                 /* AIC_7871 */
  403.   "Adaptec AHA-394X SCSI host adapter",                 /* AIC_7872 */
  404.   "Adaptec AHA-398X SCSI host adapter",                 /* AIC_7873 */
  405.   "Adaptec AHA-2944 SCSI host adapter",                 /* AIC_7874 */
  406.   "Adaptec AIC-7880 Ultra SCSI host adapter",           /* AIC_7880 */
  407.   "Adaptec AHA-294X Ultra SCSI host adapter",           /* AIC_7881 */
  408.   "Adaptec AHA-394X Ultra SCSI host adapter",           /* AIC_7882 */
  409.   "Adaptec AHA-398X Ultra SCSI host adapter",           /* AIC_7883 */
  410.   "Adaptec AHA-2944 Ultra SCSI host adapter",           /* AIC_7884 */
  411.   "Adaptec AHA-2940UW Pro Ultra SCSI host adapter",     /* AIC_7887 */
  412.   "Adaptec AIC-7895 Ultra SCSI host adapter",           /* AIC_7895 */
  413.   "Adaptec AIC-7890/1 Ultra2 SCSI host adapter",        /* AIC_7890 */
  414.   "Adaptec AHA-293X Ultra2 SCSI host adapter",          /* AIC_7890 */
  415.   "Adaptec AHA-294X Ultra2 SCSI host adapter",          /* AIC_7890 */
  416.   "Adaptec AIC-7896/7 Ultra2 SCSI host adapter",        /* AIC_7896 */
  417.   "Adaptec AHA-394X Ultra2 SCSI host adapter",          /* AIC_7897 */
  418.   "Adaptec AHA-395X Ultra2 SCSI host adapter",          /* AIC_7897 */
  419.   "Adaptec PCMCIA SCSI controller",                     /* card bus stuff */
  420.   "Adaptec AIC-7892 Ultra 160/m SCSI host adapter",     /* AIC_7892 */
  421.   "Adaptec AIC-7899 Ultra 160/m SCSI host adapter",     /* AIC_7899 */
  422. };
  423. /*
  424.  * There should be a specific return value for this in scsi.h, but
  425.  * it seems that most drivers ignore it.
  426.  */
  427. #define DID_UNDERFLOW   DID_ERROR
  428. /*
  429.  *  What we want to do is have the higher level scsi driver requeue
  430.  *  the command to us. There is no specific driver status for this
  431.  *  condition, but the higher level scsi driver will requeue the
  432.  *  command on a DID_BUS_BUSY error.
  433.  *
  434.  *  Upon further inspection and testing, it seems that DID_BUS_BUSY
  435.  *  will *always* retry the command.  We can get into an infinite loop
  436.  *  if this happens when we really want some sort of counter that
  437.  *  will automatically abort/reset the command after so many retries.
  438.  *  Using DID_ERROR will do just that.  (Made by a suggestion by
  439.  *  Doug Ledford 8/1/96)
  440.  */
  441. #define DID_RETRY_COMMAND DID_ERROR
  442. #define HSCSIID        0x07
  443. #define SCSI_RESET     0x040
  444. /*
  445.  * EISA/VL-bus stuff
  446.  */
  447. #define MINSLOT                1
  448. #define MAXSLOT                15
  449. #define SLOTBASE(x)        ((x) << 12)
  450. #define BASE_TO_SLOT(x) ((x) >> 12)
  451. /*
  452.  * Standard EISA Host ID regs  (Offset from slot base)
  453.  */
  454. #define AHC_HID0              0x80   /* 0,1: msb of ID2, 2-7: ID1      */
  455. #define AHC_HID1              0x81   /* 0-4: ID3, 5-7: LSB ID2         */
  456. #define AHC_HID2              0x82   /* product                        */
  457. #define AHC_HID3              0x83   /* firmware revision              */
  458. /*
  459.  * AIC-7770 I/O range to reserve for a card
  460.  */
  461. #define MINREG                0xC00
  462. #define MAXREG                0xCFF
  463. #define INTDEF                0x5C      /* Interrupt Definition Register */
  464. /*
  465.  * AIC-78X0 PCI registers
  466.  */
  467. #define        CLASS_PROGIF_REVID        0x08
  468. #define                DEVREVID        0x000000FFul
  469. #define                PROGINFC        0x0000FF00ul
  470. #define                SUBCLASS        0x00FF0000ul
  471. #define                BASECLASS        0xFF000000ul
  472. #define        CSIZE_LATTIME                0x0C
  473. #define                CACHESIZE        0x0000003Ful        /* only 5 bits */
  474. #define                LATTIME                0x0000FF00ul
  475. #define        DEVCONFIG                0x40
  476. #define                SCBSIZE32        0x00010000ul        /* aic789X only */
  477. #define                MPORTMODE        0x00000400ul        /* aic7870 only */
  478. #define                RAMPSM           0x00000200ul        /* aic7870 only */
  479. #define                RAMPSM_ULTRA2    0x00000004
  480. #define                VOLSENSE         0x00000100ul
  481. #define                SCBRAMSEL        0x00000080ul
  482. #define                SCBRAMSEL_ULTRA2 0x00000008
  483. #define                MRDCEN           0x00000040ul
  484. #define                EXTSCBTIME       0x00000020ul        /* aic7870 only */
  485. #define                EXTSCBPEN        0x00000010ul        /* aic7870 only */
  486. #define                BERREN           0x00000008ul
  487. #define                DACEN            0x00000004ul
  488. #define                STPWLEVEL        0x00000002ul
  489. #define                DIFACTNEGEN      0x00000001ul        /* aic7870 only */
  490. #define        SCAMCTL                  0x1a                /* Ultra2 only  */
  491. #define        CCSCBBADDR               0xf0                /* aic7895/6/7  */
  492. /*
  493.  * Define the different types of SEEPROMs on aic7xxx adapters
  494.  * and make it also represent the address size used in accessing
  495.  * its registers.  The 93C46 chips have 1024 bits organized into
  496.  * 64 16-bit words, while the 93C56 chips have 2048 bits organized
  497.  * into 128 16-bit words.  The C46 chips use 6 bits to address
  498.  * each word, while the C56 and C66 (4096 bits) use 8 bits to
  499.  * address each word.
  500.  */
  501. typedef enum {C46 = 6, C56_66 = 8} seeprom_chip_type;
  502. /*
  503.  *
  504.  * Define the format of the SEEPROM registers (16 bits).
  505.  *
  506.  */
  507. struct seeprom_config {
  508. /*
  509.  * SCSI ID Configuration Flags
  510.  */
  511. #define CFXFER                0x0007      /* synchronous transfer rate */
  512. #define CFSYNCH               0x0008      /* enable synchronous transfer */
  513. #define CFDISC                0x0010      /* enable disconnection */
  514. #define CFWIDEB               0x0020      /* wide bus device (wide card) */
  515. #define CFSYNCHISULTRA        0x0040      /* CFSYNC is an ultra offset */
  516. #define CFNEWULTRAFORMAT      0x0080      /* Use the Ultra2 SEEPROM format */
  517. #define CFSTART               0x0100      /* send start unit SCSI command */
  518. #define CFINCBIOS             0x0200      /* include in BIOS scan */
  519. #define CFRNFOUND             0x0400      /* report even if not found */
  520. #define CFMULTILUN            0x0800      /* probe mult luns in BIOS scan */
  521. #define CFWBCACHEYES          0x4000      /* Enable W-Behind Cache on drive */
  522. #define CFWBCACHENC           0xc000      /* Don't change W-Behind Cache */
  523. /* UNUSED                0x3000 */
  524.   unsigned short device_flags[16];        /* words 0-15 */
  525. /*
  526.  * BIOS Control Bits
  527.  */
  528. #define CFSUPREM        0x0001  /* support all removable drives */
  529. #define CFSUPREMB       0x0002  /* support removable drives for boot only */
  530. #define CFBIOSEN        0x0004  /* BIOS enabled */
  531. /* UNUSED                0x0008 */
  532. #define CFSM2DRV        0x0010  /* support more than two drives */
  533. #define CF284XEXTEND    0x0020  /* extended translation (284x cards) */
  534. /* UNUSED                0x0040 */
  535. #define CFEXTEND        0x0080  /* extended translation enabled */
  536. /* UNUSED                0xFF00 */
  537.   unsigned short bios_control;  /* word 16 */
  538. /*
  539.  * Host Adapter Control Bits
  540.  */
  541. #define CFAUTOTERM      0x0001  /* Perform Auto termination */
  542. #define CFULTRAEN       0x0002  /* Ultra SCSI speed enable (Ultra cards) */
  543. #define CF284XSELTO     0x0003  /* Selection timeout (284x cards) */
  544. #define CF284XFIFO      0x000C  /* FIFO Threshold (284x cards) */
  545. #define CFSTERM         0x0004  /* SCSI low byte termination */
  546. #define CFWSTERM        0x0008  /* SCSI high byte termination (wide card) */
  547. #define CFSPARITY       0x0010  /* SCSI parity */
  548. #define CF284XSTERM     0x0020  /* SCSI low byte termination (284x cards) */
  549. #define CFRESETB        0x0040  /* reset SCSI bus at boot */
  550. #define CFBPRIMARY      0x0100  /* Channel B primary on 7895 chipsets */
  551. #define CFSEAUTOTERM    0x0400  /* aic7890 Perform SE Auto Term */
  552. #define CFLVDSTERM      0x0800  /* aic7890 LVD Termination */
  553. /* UNUSED                0xF280 */
  554.   unsigned short adapter_control;        /* word 17 */
  555. /*
  556.  * Bus Release, Host Adapter ID
  557.  */
  558. #define CFSCSIID        0x000F                /* host adapter SCSI ID */
  559. /* UNUSED                0x00F0 */
  560. #define CFBRTIME        0xFF00                /* bus release time */
  561.   unsigned short brtime_id;                /* word 18 */
  562. /*
  563.  * Maximum targets
  564.  */
  565. #define CFMAXTARG        0x00FF        /* maximum targets */
  566. /* UNUSED                0xFF00 */
  567.   unsigned short max_targets;                /* word 19 */
  568.   unsigned short res_1[11];                /* words 20-30 */
  569.   unsigned short checksum;                /* word 31 */
  570. };
  571. #define SELBUS_MASK                0x0a
  572. #define         SELNARROW        0x00
  573. #define         SELBUSB                0x08
  574. #define SINGLE_BUS                0x00
  575. #define SCB_TARGET(scb)         
  576.        (((scb)->hscb->target_channel_lun & TID) >> 4)
  577. #define SCB_LUN(scb)            
  578.        ((scb)->hscb->target_channel_lun & LID)
  579. #define SCB_IS_SCSIBUS_B(scb)   
  580.        (((scb)->hscb->target_channel_lun & SELBUSB) != 0)
  581. /*
  582.  * If an error occurs during a data transfer phase, run the command
  583.  * to completion - it's easier that way - making a note of the error
  584.  * condition in this location. This then will modify a DID_OK status
  585.  * into an appropriate error for the higher-level SCSI code.
  586.  */
  587. #define aic7xxx_error(cmd)        ((cmd)->SCp.Status)
  588. /*
  589.  * Keep track of the targets returned status.
  590.  */
  591. #define aic7xxx_status(cmd)        ((cmd)->SCp.sent_command)
  592. /*
  593.  * The position of the SCSI commands scb within the scb array.
  594.  */
  595. #define aic7xxx_position(cmd)        ((cmd)->SCp.have_data_in)
  596. /*
  597.  * The stored DMA mapping for single-buffer data transfers.
  598.  */
  599. #define aic7xxx_mapping(cmd)      ((cmd)->SCp.phase)
  600. /*
  601.  * So we can keep track of our host structs
  602.  */
  603. static struct aic7xxx_host *first_aic7xxx = NULL;
  604. /*
  605.  * As of Linux 2.1, the mid-level SCSI code uses virtual addresses
  606.  * in the scatter-gather lists.  We need to convert the virtual
  607.  * addresses to physical addresses.
  608.  */
  609. struct hw_scatterlist {
  610.   unsigned int address;
  611.   unsigned int length;
  612. };
  613. /*
  614.  * Maximum number of SG segments these cards can support.
  615.  */
  616. #define        AIC7XXX_MAX_SG 128
  617. /*
  618.  * The maximum number of SCBs we could have for ANY type
  619.  * of card. DON'T FORGET TO CHANGE THE SCB MASK IN THE
  620.  * SEQUENCER CODE IF THIS IS MODIFIED!
  621.  */
  622. #define AIC7XXX_MAXSCB        255
  623. struct aic7xxx_hwscb {
  624. /* ------------    Begin hardware supported fields    ---------------- */
  625. /* 0*/  unsigned char control;
  626. /* 1*/  unsigned char target_channel_lun;       /* 4/1/3 bits */
  627. /* 2*/  unsigned char target_status;
  628. /* 3*/  unsigned char SG_segment_count;
  629. /* 4*/  unsigned int  SG_list_pointer;
  630. /* 8*/  unsigned char residual_SG_segment_count;
  631. /* 9*/  unsigned char residual_data_count[3];
  632. /*12*/  unsigned int  data_pointer;
  633. /*16*/  unsigned int  data_count;
  634. /*20*/  unsigned int  SCSI_cmd_pointer;
  635. /*24*/  unsigned char SCSI_cmd_length;
  636. /*25*/  unsigned char tag;          /* Index into our kernel SCB array.
  637.                                      * Also used as the tag for tagged I/O
  638.                                      */
  639. #define SCB_PIO_TRANSFER_SIZE  26   /* amount we need to upload/download
  640.                                      * via PIO to initialize a transaction.
  641.                                      */
  642. /*26*/  unsigned char next;         /* Used to thread SCBs awaiting selection
  643.                                      * or disconnected down in the sequencer.
  644.                                      */
  645. /*27*/  unsigned char prev;
  646. /*28*/  unsigned int pad;           /*
  647.                                      * Unused by the kernel, but we require
  648.                                      * the padding so that the array of
  649.                                      * hardware SCBs is aligned on 32 byte
  650.                                      * boundaries so the sequencer can index
  651.                                      */
  652. };
  653. typedef enum {
  654.         SCB_FREE                = 0x0000,
  655.         SCB_DTR_SCB             = 0x0001,
  656.         SCB_WAITINGQ            = 0x0002,
  657.         SCB_ACTIVE              = 0x0004,
  658.         SCB_SENSE               = 0x0008,
  659.         SCB_ABORT               = 0x0010,
  660.         SCB_DEVICE_RESET        = 0x0020,
  661.         SCB_RESET               = 0x0040,
  662.         SCB_RECOVERY_SCB        = 0x0080,
  663.         SCB_MSGOUT_PPR          = 0x0100,
  664.         SCB_MSGOUT_SENT         = 0x0200,
  665.         SCB_MSGOUT_SDTR         = 0x0400,
  666.         SCB_MSGOUT_WDTR         = 0x0800,
  667.         SCB_MSGOUT_BITS         = SCB_MSGOUT_PPR |
  668.                                   SCB_MSGOUT_SENT | 
  669.                                   SCB_MSGOUT_SDTR |
  670.                                   SCB_MSGOUT_WDTR,
  671.         SCB_QUEUED_ABORT        = 0x1000,
  672.         SCB_QUEUED_FOR_DONE     = 0x2000,
  673.         SCB_WAS_BUSY            = 0x4000
  674. } scb_flag_type;
  675. typedef enum {
  676.         AHC_FNONE                 = 0x00000000,
  677.         AHC_PAGESCBS              = 0x00000001,
  678.         AHC_CHANNEL_B_PRIMARY     = 0x00000002,
  679.         AHC_USEDEFAULTS           = 0x00000004,
  680.         AHC_INDIRECT_PAGING       = 0x00000008,
  681.         AHC_CHNLB                 = 0x00000020,
  682.         AHC_CHNLC                 = 0x00000040,
  683.         AHC_EXTEND_TRANS_A        = 0x00000100,
  684.         AHC_EXTEND_TRANS_B        = 0x00000200,
  685.         AHC_TERM_ENB_A            = 0x00000400,
  686.         AHC_TERM_ENB_SE_LOW       = 0x00000400,
  687.         AHC_TERM_ENB_B            = 0x00000800,
  688.         AHC_TERM_ENB_SE_HIGH      = 0x00000800,
  689.         AHC_HANDLING_REQINITS     = 0x00001000,
  690.         AHC_TARGETMODE            = 0x00002000,
  691.         AHC_NEWEEPROM_FMT         = 0x00004000,
  692.  /*
  693.   *  Here ends the FreeBSD defined flags and here begins the linux defined
  694.   *  flags.  NOTE: I did not preserve the old flag name during this change
  695.   *  specifically to force me to evaluate what flags were being used properly
  696.   *  and what flags weren't.  This way, I could clean up the flag usage on
  697.   *  a use by use basis.  Doug Ledford
  698.   */
  699.         AHC_MOTHERBOARD           = 0x00020000,
  700.         AHC_NO_STPWEN             = 0x00040000,
  701.         AHC_RESET_DELAY           = 0x00080000,
  702.         AHC_A_SCANNED             = 0x00100000,
  703.         AHC_B_SCANNED             = 0x00200000,
  704.         AHC_MULTI_CHANNEL         = 0x00400000,
  705.         AHC_BIOS_ENABLED          = 0x00800000,
  706.         AHC_SEEPROM_FOUND         = 0x01000000,
  707.         AHC_TERM_ENB_LVD          = 0x02000000,
  708.         AHC_ABORT_PENDING         = 0x04000000,
  709.         AHC_RESET_PENDING         = 0x08000000,
  710. #define AHC_IN_ISR_BIT              28
  711.         AHC_IN_ISR                = 0x10000000,
  712.         AHC_IN_ABORT              = 0x20000000,
  713.         AHC_IN_RESET              = 0x40000000,
  714.         AHC_EXTERNAL_SRAM         = 0x80000000
  715. } ahc_flag_type;
  716. typedef enum {
  717.   AHC_NONE             = 0x0000,
  718.   AHC_CHIPID_MASK      = 0x00ff,
  719.   AHC_AIC7770          = 0x0001,
  720.   AHC_AIC7850          = 0x0002,
  721.   AHC_AIC7860          = 0x0003,
  722.   AHC_AIC7870          = 0x0004,
  723.   AHC_AIC7880          = 0x0005,
  724.   AHC_AIC7890          = 0x0006,
  725.   AHC_AIC7895          = 0x0007,
  726.   AHC_AIC7896          = 0x0008,
  727.   AHC_AIC7892          = 0x0009,
  728.   AHC_AIC7899          = 0x000a,
  729.   AHC_VL               = 0x0100,
  730.   AHC_EISA             = 0x0200,
  731.   AHC_PCI              = 0x0400,
  732. } ahc_chip;
  733. typedef enum {
  734.   AHC_FENONE           = 0x0000,
  735.   AHC_ULTRA            = 0x0001,
  736.   AHC_ULTRA2           = 0x0002,
  737.   AHC_WIDE             = 0x0004,
  738.   AHC_TWIN             = 0x0008,
  739.   AHC_MORE_SRAM        = 0x0010,
  740.   AHC_CMD_CHAN         = 0x0020,
  741.   AHC_QUEUE_REGS       = 0x0040,
  742.   AHC_SG_PRELOAD       = 0x0080,
  743.   AHC_SPIOCAP          = 0x0100,
  744.   AHC_ULTRA3           = 0x0200,
  745.   AHC_NEW_AUTOTERM     = 0x0400,
  746.   AHC_AIC7770_FE       = AHC_FENONE,
  747.   AHC_AIC7850_FE       = AHC_SPIOCAP,
  748.   AHC_AIC7860_FE       = AHC_ULTRA|AHC_SPIOCAP,
  749.   AHC_AIC7870_FE       = AHC_FENONE,
  750.   AHC_AIC7880_FE       = AHC_ULTRA,
  751.   AHC_AIC7890_FE       = AHC_MORE_SRAM|AHC_CMD_CHAN|AHC_ULTRA2|
  752.                          AHC_QUEUE_REGS|AHC_SG_PRELOAD|AHC_NEW_AUTOTERM,
  753.   AHC_AIC7895_FE       = AHC_MORE_SRAM|AHC_CMD_CHAN|AHC_ULTRA,
  754.   AHC_AIC7896_FE       = AHC_AIC7890_FE,
  755.   AHC_AIC7892_FE       = AHC_AIC7890_FE|AHC_ULTRA3,
  756.   AHC_AIC7899_FE       = AHC_AIC7890_FE|AHC_ULTRA3,
  757. } ahc_feature;
  758. #define SCB_DMA_ADDR(scb, addr) ((unsigned long)(addr) + (scb)->scb_dma->dma_offset)
  759. struct aic7xxx_scb_dma {
  760. unsigned long        dma_offset;    /* Correction you have to add
  761.        * to virtual address to get
  762.        * dma handle in this region */
  763. dma_addr_t        dma_address;   /* DMA handle of the start,
  764.        * for unmap */
  765. unsigned int        dma_len;       /* DMA length */
  766. };
  767. typedef enum {
  768.   AHC_BUG_NONE            = 0x0000,
  769.   AHC_BUG_TMODE_WIDEODD   = 0x0001,
  770.   AHC_BUG_AUTOFLUSH       = 0x0002,
  771.   AHC_BUG_CACHETHEN       = 0x0004,
  772.   AHC_BUG_CACHETHEN_DIS   = 0x0008,
  773.   AHC_BUG_PCI_2_1_RETRY   = 0x0010,
  774.   AHC_BUG_PCI_MWI         = 0x0020,
  775.   AHC_BUG_SCBCHAN_UPLOAD  = 0x0040,
  776. } ahc_bugs;
  777. struct aic7xxx_scb {
  778.         struct aic7xxx_hwscb  *hscb;          /* corresponding hardware scb */
  779.         Scsi_Cmnd             *cmd;              /* Scsi_Cmnd for this scb */
  780.         struct aic7xxx_scb    *q_next;        /* next scb in queue */
  781.         volatile scb_flag_type flags;         /* current state of scb */
  782.         struct hw_scatterlist *sg_list;       /* SG list in adapter format */
  783.         unsigned char          tag_action;
  784.         unsigned char          sg_count;
  785.         unsigned char          *sense_cmd;    /*
  786.                                                * Allocate 6 characters for
  787.                                                * sense command.
  788.                                                */
  789. unsigned char        *cmnd;
  790.         unsigned int           sg_length; /* We init this during buildscb so we
  791.                                            * don't have to calculate anything
  792.                                            * during underflow/overflow/stat code
  793.                                            */
  794.         void                  *kmalloc_ptr;
  795. struct aic7xxx_scb_dma *scb_dma;
  796. };
  797. /*
  798.  * Define a linked list of SCBs.
  799.  */
  800. typedef struct {
  801.   struct aic7xxx_scb *head;
  802.   struct aic7xxx_scb *tail;
  803. } scb_queue_type;
  804. static struct {
  805.   unsigned char errno;
  806.   const char *errmesg;
  807. } hard_error[] = {
  808.   { ILLHADDR,  "Illegal Host Access" },
  809.   { ILLSADDR,  "Illegal Sequencer Address referenced" },
  810.   { ILLOPCODE, "Illegal Opcode in sequencer program" },
  811.   { SQPARERR,  "Sequencer Ram Parity Error" },
  812.   { DPARERR,   "Data-Path Ram Parity Error" },
  813.   { MPARERR,   "Scratch Ram/SCB Array Ram Parity Error" },
  814.   { PCIERRSTAT,"PCI Error detected" },
  815.   { CIOPARERR, "CIOBUS Parity Error" }
  816. };
  817. static unsigned char
  818. generic_sense[] = { REQUEST_SENSE, 0, 0, 0, 255, 0 };
  819. typedef struct {
  820.   scb_queue_type free_scbs;        /*
  821.                                     * SCBs assigned to free slot on
  822.                                     * card (no paging required)
  823.                                     */
  824.   struct aic7xxx_scb   *scb_array[AIC7XXX_MAXSCB];
  825.   struct aic7xxx_hwscb *hscbs;
  826.   unsigned char  numscbs;          /* current number of scbs */
  827.   unsigned char  maxhscbs;         /* hardware scbs */
  828.   unsigned char  maxscbs;          /* max scbs including pageable scbs */
  829.   dma_addr_t  hscbs_dma;    /* DMA handle to hscbs */
  830.   unsigned int   hscbs_dma_len;    /* length of the above DMA area */
  831.   void          *hscb_kmalloc_ptr;
  832. } scb_data_type;
  833. struct target_cmd {
  834.   unsigned char mesg_bytes[4];
  835.   unsigned char command[28];
  836. };
  837. #define AHC_TRANS_CUR    0x0001
  838. #define AHC_TRANS_ACTIVE 0x0002
  839. #define AHC_TRANS_GOAL   0x0004
  840. #define AHC_TRANS_USER   0x0008
  841. #define AHC_TRANS_QUITE  0x0010
  842. typedef struct {
  843.   unsigned char cur_width;
  844.   unsigned char goal_width;
  845.   unsigned char cur_period;
  846.   unsigned char goal_period;
  847.   unsigned char cur_offset;
  848.   unsigned char goal_offset;
  849.   unsigned char cur_options;
  850.   unsigned char goal_options;
  851.   unsigned char user_width;
  852.   unsigned char user_period;
  853.   unsigned char user_offset;
  854.   unsigned char user_options;
  855. } transinfo_type;
  856. /*
  857.  * Define a structure used for each host adapter.  Note, in order to avoid
  858.  * problems with architectures I can't test on (because I don't have one,
  859.  * such as the Alpha based systems) which happen to give faults for
  860.  * non-aligned memory accesses, care was taken to align this structure
  861.  * in a way that gauranteed all accesses larger than 8 bits were aligned
  862.  * on the appropriate boundary.  It's also organized to try and be more
  863.  * cache line efficient.  Be careful when changing this lest you might hurt
  864.  * overall performance and bring down the wrath of the masses.
  865.  */
  866. struct aic7xxx_host {
  867.   /*
  868.    *  This is the first 64 bytes in the host struct
  869.    */
  870.   /*
  871.    * We are grouping things here....first, items that get either read or
  872.    * written with nearly every interrupt
  873.    */
  874.   volatile long            flags;
  875.   ahc_feature              features;         /* chip features */
  876.   unsigned long            base;             /* card base address */
  877.   volatile unsigned char  *maddr;            /* memory mapped address */
  878.   unsigned long            isr_count;        /* Interrupt count */
  879.   unsigned long            spurious_int;
  880.   scb_data_type           *scb_data;
  881.   volatile unsigned short  needppr;
  882.   volatile unsigned short  needsdtr;
  883.   volatile unsigned short  needwdtr;
  884.   volatile unsigned short  dtr_pending;
  885.   struct aic7xxx_cmd_queue {
  886.     Scsi_Cmnd *head;
  887.     Scsi_Cmnd *tail;
  888.   } completeq;
  889.   /*
  890.    * Things read/written on nearly every entry into aic7xxx_queue()
  891.    */
  892.   volatile scb_queue_type  waiting_scbs;
  893.   unsigned short           discenable;       /* Targets allowed to disconnect */
  894.   unsigned short           tagenable;        /* Targets using tagged I/O */
  895.   unsigned short           orderedtag;       /* Ordered Q tags allowed */
  896.   unsigned char            unpause;          /* unpause value for HCNTRL */
  897.   unsigned char            pause;            /* pause value for HCNTRL */
  898.   volatile unsigned char   qoutfifonext;
  899.   volatile unsigned char   activescbs;       /* active scbs */
  900.   volatile unsigned char   max_activescbs;
  901.   volatile unsigned char   qinfifonext;
  902.   volatile unsigned char  *untagged_scbs;
  903.   volatile unsigned char  *qoutfifo;
  904.   volatile unsigned char  *qinfifo;
  905. #define  DEVICE_PRESENT                 0x01
  906. #define  BUS_DEVICE_RESET_PENDING       0x02
  907. #define  DEVICE_RESET_DELAY             0x04
  908. #define  DEVICE_PRINT_DTR               0x08
  909. #define  DEVICE_WAS_BUSY                0x10
  910. #define  DEVICE_SCSI_3                  0x20
  911. #define  DEVICE_DTR_SCANNED             0x40
  912.   volatile unsigned char   dev_flags[MAX_TARGETS];
  913.   volatile unsigned char   dev_active_cmds[MAX_TARGETS];
  914.   volatile unsigned char   dev_temp_queue_depth[MAX_TARGETS];
  915.   unsigned char            dev_commands_sent[MAX_TARGETS];
  916.   unsigned int             dev_timer_active; /* Which devs have a timer set */
  917.   struct timer_list        dev_timer;
  918.   unsigned long            dev_expires[MAX_TARGETS];
  919.   spinlock_t               spin_lock;
  920.   volatile unsigned char   cpu_lock_count[NR_CPUS];
  921.   unsigned char            dev_last_queue_full[MAX_TARGETS];
  922.   unsigned char            dev_last_queue_full_count[MAX_TARGETS];
  923.   unsigned char            dev_max_queue_depth[MAX_TARGETS];
  924.   volatile scb_queue_type  delayed_scbs[MAX_TARGETS];
  925.   unsigned char            msg_buf[13];      /* The message for the target */
  926.   unsigned char            msg_type;
  927. #define MSG_TYPE_NONE              0x00
  928. #define MSG_TYPE_INITIATOR_MSGOUT  0x01
  929. #define MSG_TYPE_INITIATOR_MSGIN   0x02
  930.   unsigned char            msg_len;          /* Length of message */
  931.   unsigned char            msg_index;        /* Index into msg_buf array */
  932.   transinfo_type           transinfo[MAX_TARGETS];
  933.   /*
  934.    * We put the less frequently used host structure items after the more
  935.    * frequently used items to try and ease the burden on the cache subsystem.
  936.    * These entries are not *commonly* accessed, whereas the preceding entries
  937.    * are accessed very often.
  938.    */
  939.   unsigned int             irq;              /* IRQ for this adapter */
  940.   int                      instance;         /* aic7xxx instance number */
  941.   int                      scsi_id;          /* host adapter SCSI ID */
  942.   int                      scsi_id_b;        /* channel B for twin adapters */
  943.   unsigned int             bios_address;
  944.   int                      board_name_index;
  945.   unsigned short           needppr_copy;     /* default config */
  946.   unsigned short           needsdtr_copy;    /* default config */
  947.   unsigned short           needwdtr_copy;    /* default config */
  948.   unsigned short           ultraenb;         /* Ultra mode target list */
  949.   unsigned short           bios_control;     /* bios control - SEEPROM */
  950.   unsigned short           adapter_control;  /* adapter control - SEEPROM */
  951.   struct pci_dev   *pdev;
  952.   unsigned char            pci_bus;
  953.   unsigned char            pci_device_fn;
  954.   struct seeprom_config    sc;
  955.   unsigned short           sc_type;
  956.   unsigned short           sc_size;
  957.   struct aic7xxx_host     *next;             /* allow for multiple IRQs */
  958.   struct Scsi_Host        *host;             /* pointer to scsi host */
  959.   int                      host_no;          /* SCSI host number */
  960.   unsigned long            mbase;            /* I/O memory address */
  961.   ahc_chip                 chip;             /* chip type */
  962.   ahc_bugs                 bugs;
  963.   dma_addr_t    fifo_dma;      /* DMA handle for fifo arrays */
  964.   /*
  965.    * Statistics Kept:
  966.    *
  967.    * Total Xfers (count for each command that has a data xfer),
  968.    * broken down further by reads && writes.
  969.    *
  970.    * Binned sizes, writes && reads:
  971.    *    < 512, 512, 1-2K, 2-4K, 4-8K, 8-16K, 16-32K, 32-64K, 64K-128K, > 128K
  972.    *
  973.    * Total amounts read/written above 512 bytes (amts under ignored)
  974.    *
  975.    * NOTE: Enabling this feature is likely to cause a noticeable performance
  976.    * decrease as the accesses into the stats structures blows apart multiple
  977.    * cache lines and is CPU time consuming.
  978.    *
  979.    * NOTE: Since it doesn't really buy us much, but consumes *tons* of RAM
  980.    * and blows apart all sorts of cache lines, I modified this so that we
  981.    * no longer look at the LUN.  All LUNs now go into the same bin on each
  982.    * device for stats purposes.
  983.    */
  984.   struct aic7xxx_xferstats {
  985.     long w_total;                          /* total writes */
  986.     long r_total;                          /* total reads */
  987. #ifdef AIC7XXX_PROC_STATS
  988.     long w_bins[8];                       /* binned write */
  989.     long r_bins[8];                       /* binned reads */
  990. #endif /* AIC7XXX_PROC_STATS */
  991.   } stats[MAX_TARGETS];                    /* [(channel << 3)|target] */
  992. #if 0
  993.   struct target_cmd       *targetcmds;
  994.   unsigned int             num_targetcmds;
  995. #endif
  996. };
  997. /*
  998.  * Valid SCSIRATE values. (p. 3-17)
  999.  * Provides a mapping of transfer periods in ns/4 to the proper value to
  1000.  * stick in the SCSIRATE reg to use that transfer rate.
  1001.  */
  1002. #define AHC_SYNCRATE_ULTRA3 0
  1003. #define AHC_SYNCRATE_ULTRA2 1
  1004. #define AHC_SYNCRATE_ULTRA  3
  1005. #define AHC_SYNCRATE_FAST   6
  1006. #define AHC_SYNCRATE_CRC 0x40
  1007. #define AHC_SYNCRATE_SE  0x10
  1008. static struct aic7xxx_syncrate {
  1009.   /* Rates in Ultra mode have bit 8 of sxfr set */
  1010. #define                ULTRA_SXFR 0x100
  1011.   int sxfr_ultra2;
  1012.   int sxfr;
  1013.   unsigned char period;
  1014.   const char *rate[2];
  1015. } aic7xxx_syncrates[] = {
  1016.   { 0x42,  0x000,   9,  {"80.0", "160.0"} },
  1017.   { 0x13,  0x000,  10,  {"40.0", "80.0"} },
  1018.   { 0x14,  0x000,  11,  {"33.0", "66.6"} },
  1019.   { 0x15,  0x100,  12,  {"20.0", "40.0"} },
  1020.   { 0x16,  0x110,  15,  {"16.0", "32.0"} },
  1021.   { 0x17,  0x120,  18,  {"13.4", "26.8"} },
  1022.   { 0x18,  0x000,  25,  {"10.0", "20.0"} },
  1023.   { 0x19,  0x010,  31,  {"8.0",  "16.0"} },
  1024.   { 0x1a,  0x020,  37,  {"6.67", "13.3"} },
  1025.   { 0x1b,  0x030,  43,  {"5.7",  "11.4"} },
  1026.   { 0x10,  0x040,  50,  {"5.0",  "10.0"} },
  1027.   { 0x00,  0x050,  56,  {"4.4",  "8.8" } },
  1028.   { 0x00,  0x060,  62,  {"4.0",  "8.0" } },
  1029.   { 0x00,  0x070,  68,  {"3.6",  "7.2" } },
  1030.   { 0x00,  0x000,  0,   {NULL, NULL}   },
  1031. };
  1032. #define CTL_OF_SCB(scb) (((scb->hscb)->target_channel_lun >> 3) & 0x1),  
  1033.                         (((scb->hscb)->target_channel_lun >> 4) & 0xf), 
  1034.                         ((scb->hscb)->target_channel_lun & 0x07)
  1035. #define CTL_OF_CMD(cmd) ((cmd->channel) & 0x01),  
  1036.                         ((cmd->target) & 0x0f), 
  1037.                         ((cmd->lun) & 0x07)
  1038. #define TARGET_INDEX(cmd)  ((cmd)->target | ((cmd)->channel << 3))
  1039. /*
  1040.  * A nice little define to make doing our printks a little easier
  1041.  */
  1042. #define WARN_LEAD KERN_WARNING "(scsi%d:%d:%d:%d) "
  1043. #define INFO_LEAD KERN_INFO "(scsi%d:%d:%d:%d) "
  1044. /*
  1045.  * XXX - these options apply unilaterally to _all_ 274x/284x/294x
  1046.  *       cards in the system.  This should be fixed.  Exceptions to this
  1047.  *       rule are noted in the comments.
  1048.  */
  1049. /*
  1050.  * Skip the scsi bus reset.  Non 0 make us skip the reset at startup.  This
  1051.  * has no effect on any later resets that might occur due to things like
  1052.  * SCSI bus timeouts.
  1053.  */
  1054. static unsigned int aic7xxx_no_reset = 0;
  1055. /*
  1056.  * Certain PCI motherboards will scan PCI devices from highest to lowest,
  1057.  * others scan from lowest to highest, and they tend to do all kinds of
  1058.  * strange things when they come into contact with PCI bridge chips.  The
  1059.  * net result of all this is that the PCI card that is actually used to boot
  1060.  * the machine is very hard to detect.  Most motherboards go from lowest
  1061.  * PCI slot number to highest, and the first SCSI controller found is the
  1062.  * one you boot from.  The only exceptions to this are when a controller
  1063.  * has its BIOS disabled.  So, we by default sort all of our SCSI controllers
  1064.  * from lowest PCI slot number to highest PCI slot number.  We also force
  1065.  * all controllers with their BIOS disabled to the end of the list.  This
  1066.  * works on *almost* all computers.  Where it doesn't work, we have this
  1067.  * option.  Setting this option to non-0 will reverse the order of the sort
  1068.  * to highest first, then lowest, but will still leave cards with their BIOS
  1069.  * disabled at the very end.  That should fix everyone up unless there are
  1070.  * really strange cirumstances.
  1071.  */
  1072. static int aic7xxx_reverse_scan = 0;
  1073. /*
  1074.  * Should we force EXTENDED translation on a controller.
  1075.  *     0 == Use whatever is in the SEEPROM or default to off
  1076.  *     1 == Use whatever is in the SEEPROM or default to on
  1077.  */
  1078. static unsigned int aic7xxx_extended = 0;
  1079. /*
  1080.  * The IRQ trigger method used on EISA controllers. Does not effect PCI cards.
  1081.  *   -1 = Use detected settings.
  1082.  *    0 = Force Edge triggered mode.
  1083.  *    1 = Force Level triggered mode.
  1084.  */
  1085. static int aic7xxx_irq_trigger = -1;
  1086. /*
  1087.  * This variable is used to override the termination settings on a controller.
  1088.  * This should not be used under normal conditions.  However, in the case
  1089.  * that a controller does not have a readable SEEPROM (so that we can't
  1090.  * read the SEEPROM settings directly) and that a controller has a buggered
  1091.  * version of the cable detection logic, this can be used to force the 
  1092.  * correct termination.  It is preferable to use the manual termination
  1093.  * settings in the BIOS if possible, but some motherboard controllers store
  1094.  * those settings in a format we can't read.  In other cases, auto term
  1095.  * should also work, but the chipset was put together with no auto term
  1096.  * logic (common on motherboard controllers).  In those cases, we have
  1097.  * 32 bits here to work with.  That's good for 8 controllers/channels.  The
  1098.  * bits are organized as 4 bits per channel, with scsi0 getting the lowest
  1099.  * 4 bits in the int.  A 1 in a bit position indicates the termination setting
  1100.  * that corresponds to that bit should be enabled, a 0 is disabled.
  1101.  * It looks something like this:
  1102.  *
  1103.  *    0x0f =  1111-Single Ended Low Byte Termination on/off
  1104.  *            ||-Single Ended High Byte Termination on/off
  1105.  *            |-LVD Low Byte Termination on/off
  1106.  *            -LVD High Byte Termination on/off
  1107.  *
  1108.  * For non-Ultra2 controllers, the upper 2 bits are not important.  So, to
  1109.  * enable both high byte and low byte termination on scsi0, I would need to
  1110.  * make sure that the override_term variable was set to 0x03 (bits 0011).
  1111.  * To make sure that all termination is enabled on an Ultra2 controller at
  1112.  * scsi2 and only high byte termination on scsi1 and high and low byte
  1113.  * termination on scsi0, I would set override_term=0xf23 (bits 1111 0010 0011)
  1114.  *
  1115.  * For the most part, users should never have to use this, that's why I
  1116.  * left it fairly cryptic instead of easy to understand.  If you need it,
  1117.  * most likely someone will be telling you what your's needs to be set to.
  1118.  */
  1119. static int aic7xxx_override_term = -1;
  1120. /*
  1121.  * Certain motherboard chipset controllers tend to screw
  1122.  * up the polarity of the term enable output pin.  Use this variable
  1123.  * to force the correct polarity for your system.  This is a bitfield variable
  1124.  * similar to the previous one, but this one has one bit per channel instead
  1125.  * of four.
  1126.  *    0 = Force the setting to active low.
  1127.  *    1 = Force setting to active high.
  1128.  * Most Adaptec cards are active high, several motherboards are active low.
  1129.  * To force a 2940 card at SCSI 0 to active high and a motherboard 7895
  1130.  * controller at scsi1 and scsi2 to active low, and a 2910 card at scsi3
  1131.  * to active high, you would need to set stpwlev=0x9 (bits 1001).
  1132.  *
  1133.  * People shouldn't need to use this, but if you are experiencing lots of
  1134.  * SCSI timeout problems, this may help.  There is one sure way to test what
  1135.  * this option needs to be.  Using a boot floppy to boot the system, configure
  1136.  * your system to enable all SCSI termination (in the Adaptec SCSI BIOS) and
  1137.  * if needed then also pass a value to override_term to make sure that the
  1138.  * driver is enabling SCSI termination, then set this variable to either 0
  1139.  * or 1.  When the driver boots, make sure there are *NO* SCSI cables
  1140.  * connected to your controller.  If it finds and inits the controller
  1141.  * without problem, then the setting you passed to stpwlev was correct.  If
  1142.  * the driver goes into a reset loop and hangs the system, then you need the
  1143.  * other setting for this variable.  If neither setting lets the machine
  1144.  * boot then you have definite termination problems that may not be fixable.
  1145.  */
  1146. static int aic7xxx_stpwlev = -1;
  1147. /*
  1148.  * Set this to non-0 in order to force the driver to panic the kernel
  1149.  * and print out debugging info on a SCSI abort or reset cycle.
  1150.  */
  1151. static int aic7xxx_panic_on_abort = 0;
  1152. /*
  1153.  * PCI bus parity checking of the Adaptec controllers.  This is somewhat
  1154.  * dubious at best.  To my knowledge, this option has never actually
  1155.  * solved a PCI parity problem, but on certain machines with broken PCI
  1156.  * chipset configurations, it can generate tons of false error messages.
  1157.  * It's included in the driver for completeness.
  1158.  *   0 = Shut off PCI parity check
  1159.  *  -1 = Normal polarity pci parity checking
  1160.  *   1 = reverse polarity pci parity checking
  1161.  *
  1162.  * NOTE: you can't actually pass -1 on the lilo prompt.  So, to set this
  1163.  * variable to -1 you would actually want to simply pass the variable
  1164.  * name without a number.  That will invert the 0 which will result in
  1165.  * -1.
  1166.  */
  1167. static int aic7xxx_pci_parity = 0;
  1168. /*
  1169.  * Set this to any non-0 value to cause us to dump the contents of all
  1170.  * the card's registers in a hex dump format tailored to each model of
  1171.  * controller.
  1172.  * 
  1173.  * NOTE: THE CONTROLLER IS LEFT IN AN UNUSEABLE STATE BY THIS OPTION.
  1174.  *       YOU CANNOT BOOT UP WITH THIS OPTION, IT IS FOR DEBUGGING PURPOSES
  1175.  *       ONLY
  1176.  */
  1177. static int aic7xxx_dump_card = 0;
  1178. /*
  1179.  * Set this to a non-0 value to make us dump out the 32 bit instruction
  1180.  * registers on the card after completing the sequencer download.  This
  1181.  * allows the actual sequencer download to be verified.  It is possible
  1182.  * to use this option and still boot up and run your system.  This is
  1183.  * only intended for debugging purposes.
  1184.  */
  1185. static int aic7xxx_dump_sequencer = 0;
  1186. /*
  1187.  * Certain newer motherboards have put new PCI based devices into the
  1188.  * IO spaces that used to typically be occupied by VLB or EISA cards.
  1189.  * This overlap can cause these newer motherboards to lock up when scanned
  1190.  * for older EISA and VLB devices.  Setting this option to non-0 will
  1191.  * cause the driver to skip scanning for any VLB or EISA controllers and
  1192.  * only support the PCI controllers.  NOTE: this means that if the kernel
  1193.  * os compiled with PCI support disabled, then setting this to non-0
  1194.  * would result in never finding any devices :)
  1195.  */
  1196. static int aic7xxx_no_probe = 0;
  1197. /*
  1198.  * On some machines, enabling the external SCB RAM isn't reliable yet.  I
  1199.  * haven't had time to make test patches for things like changing the
  1200.  * timing mode on that external RAM either.  Some of those changes may
  1201.  * fix the problem.  Until then though, we default to external SCB RAM
  1202.  * off and give a command line option to enable it.
  1203.  */
  1204. static int aic7xxx_scbram = 0;
  1205. /*
  1206.  * So that we can set how long each device is given as a selection timeout.
  1207.  * The table of values goes like this:
  1208.  *   0 - 256ms
  1209.  *   1 - 128ms
  1210.  *   2 - 64ms
  1211.  *   3 - 32ms
  1212.  * We default to 64ms because it's fast.  Some old SCSI-I devices need a
  1213.  * longer time.  The final value has to be left shifted by 3, hence 0x10
  1214.  * is the final value.
  1215.  */
  1216. static int aic7xxx_seltime = 0x10;
  1217. /*
  1218.  * So that insmod can find the variable and make it point to something
  1219.  */
  1220. #ifdef MODULE
  1221. static char * aic7xxx = NULL;
  1222. MODULE_PARM(aic7xxx, "s");
  1223. /*
  1224.  * Just in case someone uses commas to separate items on the insmod
  1225.  * command line, we define a dummy buffer here to avoid having insmod
  1226.  * write wild stuff into our code segment
  1227.  */
  1228. static char dummy_buffer[60] = "Please don't trounce on me insmod!!n";
  1229. #endif
  1230. #define VERBOSE_NORMAL         0x0000
  1231. #define VERBOSE_NEGOTIATION    0x0001
  1232. #define VERBOSE_SEQINT         0x0002
  1233. #define VERBOSE_SCSIINT        0x0004
  1234. #define VERBOSE_PROBE          0x0008
  1235. #define VERBOSE_PROBE2         0x0010
  1236. #define VERBOSE_NEGOTIATION2   0x0020
  1237. #define VERBOSE_MINOR_ERROR    0x0040
  1238. #define VERBOSE_TRACING        0x0080
  1239. #define VERBOSE_ABORT          0x0f00
  1240. #define VERBOSE_ABORT_MID      0x0100
  1241. #define VERBOSE_ABORT_FIND     0x0200
  1242. #define VERBOSE_ABORT_PROCESS  0x0400
  1243. #define VERBOSE_ABORT_RETURN   0x0800
  1244. #define VERBOSE_RESET          0xf000
  1245. #define VERBOSE_RESET_MID      0x1000
  1246. #define VERBOSE_RESET_FIND     0x2000
  1247. #define VERBOSE_RESET_PROCESS  0x4000
  1248. #define VERBOSE_RESET_RETURN   0x8000
  1249. static int aic7xxx_verbose = VERBOSE_NORMAL | VERBOSE_NEGOTIATION |
  1250.            VERBOSE_PROBE;                     /* verbose messages */
  1251. /****************************************************************************
  1252.  *
  1253.  * We're going to start putting in function declarations so that order of
  1254.  * functions is no longer important.  As needed, they are added here.
  1255.  *
  1256.  ***************************************************************************/
  1257. static void aic7xxx_panic_abort(struct aic7xxx_host *p, Scsi_Cmnd *cmd);
  1258. static void aic7xxx_print_card(struct aic7xxx_host *p);
  1259. static void aic7xxx_print_scratch_ram(struct aic7xxx_host *p);
  1260. static void aic7xxx_print_sequencer(struct aic7xxx_host *p, int downloaded);
  1261. #ifdef AIC7XXX_VERBOSE_DEBUGGING
  1262. static void aic7xxx_check_scbs(struct aic7xxx_host *p, char *buffer);
  1263. #endif
  1264. /****************************************************************************
  1265.  *
  1266.  * These functions are now used.  They happen to be wrapped in useless
  1267.  * inb/outb port read/writes around the real reads and writes because it
  1268.  * seems that certain very fast CPUs have a problem dealing with us when
  1269.  * going at full speed.
  1270.  *
  1271.  ***************************************************************************/
  1272. static inline unsigned char
  1273. aic_inb(struct aic7xxx_host *p, long port)
  1274. {
  1275. #ifdef MMAPIO
  1276.   unsigned char x;
  1277.   if(p->maddr)
  1278.   {
  1279.     x = readb(p->maddr + port);
  1280.   }
  1281.   else
  1282.   {
  1283.     x = inb(p->base + port);
  1284.   }
  1285.   return(x);
  1286. #else
  1287.   return(inb(p->base + port));
  1288. #endif
  1289. }
  1290. static inline void
  1291. aic_outb(struct aic7xxx_host *p, unsigned char val, long port)
  1292. {
  1293. #ifdef MMAPIO
  1294.   if(p->maddr)
  1295.   {
  1296.     writeb(val, p->maddr + port);
  1297.     mb(); /* locked operation in order to force CPU ordering */
  1298.     readb(p->maddr + HCNTRL); /* dummy read to flush the PCI write */
  1299.   }
  1300.   else
  1301.   {
  1302.     outb(val, p->base + port);
  1303.     mb(); /* locked operation in order to force CPU ordering */
  1304.   }
  1305. #else
  1306.   outb(val, p->base + port);
  1307.   mb(); /* locked operation in order to force CPU ordering */
  1308. #endif
  1309. }
  1310. /*+F*************************************************************************
  1311.  * Function:
  1312.  *   aic7xxx_setup
  1313.  *
  1314.  * Description:
  1315.  *   Handle Linux boot parameters. This routine allows for assigning a value
  1316.  *   to a parameter with a ':' between the parameter and the value.
  1317.  *   ie. aic7xxx=unpause:0x0A,extended
  1318.  *-F*************************************************************************/
  1319. static int
  1320. aic7xxx_setup(char *s)
  1321. {
  1322.   int   i, n;
  1323.   char *p;
  1324.   char *end;
  1325.   static struct {
  1326.     const char *name;
  1327.     unsigned int *flag;
  1328.   } options[] = {
  1329.     { "extended",    &aic7xxx_extended },
  1330.     { "no_reset",    &aic7xxx_no_reset },
  1331.     { "irq_trigger", &aic7xxx_irq_trigger },
  1332.     { "verbose",     &aic7xxx_verbose },
  1333.     { "reverse_scan",&aic7xxx_reverse_scan },
  1334.     { "override_term", &aic7xxx_override_term },
  1335.     { "stpwlev", &aic7xxx_stpwlev },
  1336.     { "no_probe", &aic7xxx_no_probe },
  1337.     { "panic_on_abort", &aic7xxx_panic_on_abort },
  1338.     { "pci_parity", &aic7xxx_pci_parity },
  1339.     { "dump_card", &aic7xxx_dump_card },
  1340.     { "dump_sequencer", &aic7xxx_dump_sequencer },
  1341.     { "scbram", &aic7xxx_scbram },
  1342.     { "seltime", &aic7xxx_seltime },
  1343.     { "tag_info",    NULL }
  1344.   };
  1345.   end = strchr(s, '');
  1346.   for (p = strtok(s, ",."); p; p = strtok(NULL, ",."))
  1347.   {
  1348.     for (i = 0; i < NUMBER(options); i++)
  1349.     {
  1350.       n = strlen(options[i].name);
  1351.       if (!strncmp(options[i].name, p, n))
  1352.       {
  1353.         if (!strncmp(p, "tag_info", n))
  1354.         {
  1355.           if (p[n] == ':')
  1356.           {
  1357.             char *base;
  1358.             char *tok, *tok_end, *tok_end2;
  1359.             char tok_list[] = { '.', ',', '{', '}', '' };
  1360.             int i, instance = -1, device = -1;
  1361.             unsigned char done = FALSE;
  1362.             base = p;
  1363.             tok = base + n + 1;  /* Forward us just past the ':' */
  1364.             tok_end = strchr(tok, '');
  1365.             if (tok_end < end)
  1366.               *tok_end = ',';
  1367.             while(!done)
  1368.             {
  1369.               switch(*tok)
  1370.               {
  1371.                 case '{':
  1372.                   if (instance == -1)
  1373.                     instance = 0;
  1374.                   else if (device == -1)
  1375.                     device = 0;
  1376.                   tok++;
  1377.                   break;
  1378.                 case '}':
  1379.                   if (device != -1)
  1380.                     device = -1;
  1381.                   else if (instance != -1)
  1382.                     instance = -1;
  1383.                   tok++;
  1384.                   break;
  1385.                 case ',':
  1386.                 case '.':
  1387.                   if (instance == -1)
  1388.                     done = TRUE;
  1389.                   else if (device >= 0)
  1390.                     device++;
  1391.                   else if (instance >= 0)
  1392.                     instance++;
  1393.                   if ( (device >= MAX_TARGETS) || 
  1394.                        (instance >= NUMBER(aic7xxx_tag_info)) )
  1395.                     done = TRUE;
  1396.                   tok++;
  1397.                   if (!done)
  1398.                   {
  1399.                     base = tok;
  1400.                   }
  1401.                   break;
  1402.                 case '':
  1403.                   done = TRUE;
  1404.                   break;
  1405.                 default:
  1406.                   done = TRUE;
  1407.                   tok_end = strchr(tok, '');
  1408.                   for(i=0; tok_list[i]; i++)
  1409.                   {
  1410.                     tok_end2 = strchr(tok, tok_list[i]);
  1411.                     if ( (tok_end2) && (tok_end2 < tok_end) )
  1412.                     {
  1413.                       tok_end = tok_end2;
  1414.                       done = FALSE;
  1415.                     }
  1416.                   }
  1417.                   if ( (instance >= 0) && (device >= 0) &&
  1418.                        (instance < NUMBER(aic7xxx_tag_info)) &&
  1419.                        (device < MAX_TARGETS) )
  1420.                     aic7xxx_tag_info[instance].tag_commands[device] =
  1421.                       simple_strtoul(tok, NULL, 0) & 0xff;
  1422.                   tok = tok_end;
  1423.                   break;
  1424.               }
  1425.             }
  1426.             while((p != base) && (p != NULL))
  1427.               p = strtok(NULL, ",.");
  1428.           }
  1429.         }
  1430.         else if (p[n] == ':')
  1431.         {
  1432.           *(options[i].flag) = simple_strtoul(p + n + 1, NULL, 0);
  1433.           if(!strncmp(p, "seltime", n))
  1434.           {
  1435.             *(options[i].flag) = (*(options[i].flag) % 4) << 3;
  1436.           }
  1437.         }
  1438.         else if (!strncmp(p, "verbose", n))
  1439.         {
  1440.           *(options[i].flag) = 0xff29;
  1441.         }
  1442.         else
  1443.         {
  1444.           *(options[i].flag) = ~(*(options[i].flag));
  1445.           if(!strncmp(p, "seltime", n))
  1446.           {
  1447.             *(options[i].flag) = (*(options[i].flag) % 4) << 3;
  1448.           }
  1449.         }
  1450.       }
  1451.     }
  1452.   }
  1453.   return 1;
  1454. }
  1455. __setup("aic7xxx=", aic7xxx_setup);
  1456. /*+F*************************************************************************
  1457.  * Function:
  1458.  *   pause_sequencer
  1459.  *
  1460.  * Description:
  1461.  *   Pause the sequencer and wait for it to actually stop - this
  1462.  *   is important since the sequencer can disable pausing for critical
  1463.  *   sections.
  1464.  *-F*************************************************************************/
  1465. static void
  1466. pause_sequencer(struct aic7xxx_host *p)
  1467. {
  1468.   aic_outb(p, p->pause, HCNTRL);
  1469.   while ((aic_inb(p, HCNTRL) & PAUSE) == 0)
  1470.   {
  1471.     ;
  1472.   }
  1473.   if(p->features & AHC_ULTRA2)
  1474.   {
  1475.     aic_inb(p, CCSCBCTL);
  1476.   }
  1477. }
  1478. /*+F*************************************************************************
  1479.  * Function:
  1480.  *   unpause_sequencer
  1481.  *
  1482.  * Description:
  1483.  *   Unpause the sequencer. Unremarkable, yet done often enough to
  1484.  *   warrant an easy way to do it.
  1485.  *-F*************************************************************************/
  1486. static void
  1487. unpause_sequencer(struct aic7xxx_host *p, int unpause_always)
  1488. {
  1489.   if (unpause_always ||
  1490.       ( !(aic_inb(p, INTSTAT) & (SCSIINT | SEQINT | BRKADRINT)) &&
  1491.         !(p->flags & AHC_HANDLING_REQINITS) ) )
  1492.   {
  1493.     aic_outb(p, p->unpause, HCNTRL);
  1494.   }
  1495. }
  1496. /*+F*************************************************************************
  1497.  * Function:
  1498.  *   restart_sequencer
  1499.  *
  1500.  * Description:
  1501.  *   Restart the sequencer program from address zero.  This assumes
  1502.  *   that the sequencer is already paused.
  1503.  *-F*************************************************************************/
  1504. static void
  1505. restart_sequencer(struct aic7xxx_host *p)
  1506. {
  1507.   aic_outb(p, 0, SEQADDR0);
  1508.   aic_outb(p, 0, SEQADDR1);
  1509.   aic_outb(p, FASTMODE, SEQCTL);
  1510. }
  1511. /*
  1512.  * We include the aic7xxx_seq.c file here so that the other defines have
  1513.  * already been made, and so that it comes before the code that actually
  1514.  * downloads the instructions (since we don't typically use function
  1515.  * prototype, our code has to be ordered that way, it's a left-over from
  1516.  * the original driver days.....I should fix it some time DL).
  1517.  */
  1518. #include "aic7xxx_old/aic7xxx_seq.c"
  1519. /*+F*************************************************************************
  1520.  * Function:
  1521.  *   aic7xxx_check_patch
  1522.  *
  1523.  * Description:
  1524.  *   See if the next patch to download should be downloaded.
  1525.  *-F*************************************************************************/
  1526. static int
  1527. aic7xxx_check_patch(struct aic7xxx_host *p,
  1528.   struct sequencer_patch **start_patch, int start_instr, int *skip_addr)
  1529. {
  1530.   struct sequencer_patch *cur_patch;
  1531.   struct sequencer_patch *last_patch;
  1532.   int num_patches;
  1533.   num_patches = sizeof(sequencer_patches)/sizeof(struct sequencer_patch);
  1534.   last_patch = &sequencer_patches[num_patches];
  1535.   cur_patch = *start_patch;
  1536.   while ((cur_patch < last_patch) && (start_instr == cur_patch->begin))
  1537.   {
  1538.     if (cur_patch->patch_func(p) == 0)
  1539.     {
  1540.       /*
  1541.        * Start rejecting code.
  1542.        */
  1543.       *skip_addr = start_instr + cur_patch->skip_instr;
  1544.       cur_patch += cur_patch->skip_patch;
  1545.     }
  1546.     else
  1547.     {
  1548.       /*
  1549.        * Found an OK patch.  Advance the patch pointer to the next patch
  1550.        * and wait for our instruction pointer to get here.
  1551.        */
  1552.       cur_patch++;
  1553.     }
  1554.   }
  1555.   *start_patch = cur_patch;
  1556.   if (start_instr < *skip_addr)
  1557.     /*
  1558.      * Still skipping
  1559.      */
  1560.     return (0);
  1561.   return(1);
  1562. }
  1563. /*+F*************************************************************************
  1564.  * Function:
  1565.  *   aic7xxx_download_instr
  1566.  *
  1567.  * Description:
  1568.  *   Find the next patch to download.
  1569.  *-F*************************************************************************/
  1570. static void
  1571. aic7xxx_download_instr(struct aic7xxx_host *p, int instrptr,
  1572.   unsigned char *dconsts)
  1573. {
  1574.   union ins_formats instr;
  1575.   struct ins_format1 *fmt1_ins;
  1576.   struct ins_format3 *fmt3_ins;
  1577.   unsigned char opcode;
  1578.   instr = *(union ins_formats*) &seqprog[instrptr * 4];
  1579.   instr.integer = le32_to_cpu(instr.integer);
  1580.   
  1581.   fmt1_ins = &instr.format1;
  1582.   fmt3_ins = NULL;
  1583.   /* Pull the opcode */
  1584.   opcode = instr.format1.opcode;
  1585.   switch (opcode)
  1586.   {
  1587.     case AIC_OP_JMP:
  1588.     case AIC_OP_JC:
  1589.     case AIC_OP_JNC:
  1590.     case AIC_OP_CALL:
  1591.     case AIC_OP_JNE:
  1592.     case AIC_OP_JNZ:
  1593.     case AIC_OP_JE:
  1594.     case AIC_OP_JZ:
  1595.     {
  1596.       struct sequencer_patch *cur_patch;
  1597.       int address_offset;
  1598.       unsigned int address;
  1599.       int skip_addr;
  1600.       int i;
  1601.       fmt3_ins = &instr.format3;
  1602.       address_offset = 0;
  1603.       address = fmt3_ins->address;
  1604.       cur_patch = sequencer_patches;
  1605.       skip_addr = 0;
  1606.       for (i = 0; i < address;)
  1607.       {
  1608.         aic7xxx_check_patch(p, &cur_patch, i, &skip_addr);
  1609.         if (skip_addr > i)
  1610.         {
  1611.           int end_addr;
  1612.           end_addr = MIN(address, skip_addr);
  1613.           address_offset += end_addr - i;
  1614.           i = skip_addr;
  1615.         }
  1616.         else
  1617.         {
  1618.           i++;
  1619.         }
  1620.       }
  1621.       address -= address_offset;
  1622.       fmt3_ins->address = address;
  1623.       /* Fall Through to the next code section */
  1624.     }
  1625.     case AIC_OP_OR:
  1626.     case AIC_OP_AND:
  1627.     case AIC_OP_XOR:
  1628.     case AIC_OP_ADD:
  1629.     case AIC_OP_ADC:
  1630.     case AIC_OP_BMOV:
  1631.       if (fmt1_ins->parity != 0)
  1632.       {
  1633.         fmt1_ins->immediate = dconsts[fmt1_ins->immediate];
  1634.       }
  1635.       fmt1_ins->parity = 0;
  1636.       /* Fall Through to the next code section */
  1637.     case AIC_OP_ROL:
  1638.       if ((p->features & AHC_ULTRA2) != 0)
  1639.       {
  1640.         int i, count;
  1641.         /* Calculate odd parity for the instruction */
  1642.         for ( i=0, count=0; i < 31; i++)
  1643.         {
  1644.           unsigned int mask;
  1645.           mask = 0x01 << i;
  1646.           if ((instr.integer & mask) != 0)
  1647.             count++;
  1648.         }
  1649.         if (!(count & 0x01))
  1650.           instr.format1.parity = 1;
  1651.       }
  1652.       else
  1653.       {
  1654.         if (fmt3_ins != NULL)
  1655.         {
  1656.           instr.integer =  fmt3_ins->immediate |
  1657.                           (fmt3_ins->source << 8) |
  1658.                           (fmt3_ins->address << 16) |
  1659.                           (fmt3_ins->opcode << 25);
  1660.         }
  1661.         else
  1662.         {
  1663.           instr.integer =  fmt1_ins->immediate |
  1664.                           (fmt1_ins->source << 8) |
  1665.                           (fmt1_ins->destination << 16) |
  1666.                           (fmt1_ins->ret << 24) |
  1667.                           (fmt1_ins->opcode << 25);
  1668.         }
  1669.       }
  1670.       aic_outb(p, (instr.integer & 0xff), SEQRAM);
  1671.       aic_outb(p, ((instr.integer >> 8) & 0xff), SEQRAM);
  1672.       aic_outb(p, ((instr.integer >> 16) & 0xff), SEQRAM);
  1673.       aic_outb(p, ((instr.integer >> 24) & 0xff), SEQRAM);
  1674.       udelay(10);
  1675.       break;
  1676.     default:
  1677.       panic("aic7xxx: Unknown opcode encountered in sequencer program.");
  1678.       break;
  1679.   }
  1680. }
  1681. /*+F*************************************************************************
  1682.  * Function:
  1683.  *   aic7xxx_loadseq
  1684.  *
  1685.  * Description:
  1686.  *   Load the sequencer code into the controller memory.
  1687.  *-F*************************************************************************/
  1688. static void
  1689. aic7xxx_loadseq(struct aic7xxx_host *p)
  1690. {
  1691.   struct sequencer_patch *cur_patch;
  1692.   int i;
  1693.   int downloaded;
  1694.   int skip_addr;
  1695.   unsigned char download_consts[4] = {0, 0, 0, 0};
  1696.   if (aic7xxx_verbose & VERBOSE_PROBE)
  1697.   {
  1698.     printk(KERN_INFO "(scsi%d) Downloading sequencer code...", p->host_no);
  1699.   }
  1700. #if 0
  1701.   download_consts[TMODE_NUMCMDS] = p->num_targetcmds;
  1702. #endif
  1703.   download_consts[TMODE_NUMCMDS] = 0;
  1704.   cur_patch = &sequencer_patches[0];
  1705.   downloaded = 0;
  1706.   skip_addr = 0;
  1707.   aic_outb(p, PERRORDIS|LOADRAM|FAILDIS|FASTMODE, SEQCTL);
  1708.   aic_outb(p, 0, SEQADDR0);
  1709.   aic_outb(p, 0, SEQADDR1);
  1710.   for (i = 0; i < sizeof(seqprog) / 4;  i++)
  1711.   {
  1712.     if (aic7xxx_check_patch(p, &cur_patch, i, &skip_addr) == 0)
  1713.     {
  1714.       /* Skip this instruction for this configuration. */
  1715.       continue;
  1716.     }
  1717.     aic7xxx_download_instr(p, i, &download_consts[0]);
  1718.     downloaded++;
  1719.   }
  1720.   aic_outb(p, 0, SEQADDR0);
  1721.   aic_outb(p, 0, SEQADDR1);
  1722.   aic_outb(p, FASTMODE | FAILDIS, SEQCTL);
  1723.   unpause_sequencer(p, TRUE);
  1724.   mdelay(1);
  1725.   pause_sequencer(p);
  1726.   aic_outb(p, FASTMODE, SEQCTL);
  1727.   if (aic7xxx_verbose & VERBOSE_PROBE)
  1728.   {
  1729.     printk(" %d instructions downloadedn", downloaded);
  1730.   }
  1731.   if (aic7xxx_dump_sequencer)
  1732.     aic7xxx_print_sequencer(p, downloaded);
  1733. }
  1734. /*+F*************************************************************************
  1735.  * Function:
  1736.  *   aic7xxx_print_sequencer
  1737.  *
  1738.  * Description:
  1739.  *   Print the contents of the sequencer memory to the screen.
  1740.  *-F*************************************************************************/
  1741. static void
  1742. aic7xxx_print_sequencer(struct aic7xxx_host *p, int downloaded)
  1743. {
  1744.   int i, k, temp;
  1745.   
  1746.   aic_outb(p, PERRORDIS|LOADRAM|FAILDIS|FASTMODE, SEQCTL);
  1747.   aic_outb(p, 0, SEQADDR0);
  1748.   aic_outb(p, 0, SEQADDR1);
  1749.   k = 0;
  1750.   for (i=0; i < downloaded; i++)
  1751.   {
  1752.     if ( k == 0 )
  1753.       printk("%03x: ", i);
  1754.     temp = aic_inb(p, SEQRAM);
  1755.     temp |= (aic_inb(p, SEQRAM) << 8);
  1756.     temp |= (aic_inb(p, SEQRAM) << 16);
  1757.     temp |= (aic_inb(p, SEQRAM) << 24);
  1758.     printk("%08x", temp);
  1759.     if ( ++k == 8 )
  1760.     {
  1761.       printk("n");
  1762.       k = 0;
  1763.     }
  1764.     else
  1765.       printk(" ");
  1766.   }
  1767.   aic_outb(p, 0, SEQADDR0);
  1768.   aic_outb(p, 0, SEQADDR1);
  1769.   aic_outb(p, FASTMODE | FAILDIS, SEQCTL);
  1770.   unpause_sequencer(p, TRUE);
  1771.   mdelay(1);
  1772.   pause_sequencer(p);
  1773.   aic_outb(p, FASTMODE, SEQCTL);
  1774.   printk("n");
  1775. }
  1776. /*+F*************************************************************************
  1777.  * Function:
  1778.  *   aic7xxx_info
  1779.  *
  1780.  * Description:
  1781.  *   Return a string describing the driver.
  1782.  *-F*************************************************************************/
  1783. const char *
  1784. aic7xxx_info(struct Scsi_Host *dooh)
  1785. {
  1786.   static char buffer[256];
  1787.   char *bp;
  1788.   struct aic7xxx_host *p;
  1789.   bp = &buffer[0];
  1790.   p = (struct aic7xxx_host *)dooh->hostdata;
  1791.   memset(bp, 0, sizeof(buffer));
  1792.   strcpy(bp, "Adaptec AHA274x/284x/294x (EISA/VLB/PCI-Fast SCSI) ");
  1793.   strcat(bp, AIC7XXX_C_VERSION);
  1794.   strcat(bp, "/");
  1795.   strcat(bp, AIC7XXX_H_VERSION);
  1796.   strcat(bp, "n");
  1797.   strcat(bp, "       <");
  1798.   strcat(bp, board_names[p->board_name_index]);
  1799.   strcat(bp, ">");
  1800.   return(bp);
  1801. }
  1802. /*+F*************************************************************************
  1803.  * Function:
  1804.  *   aic7xxx_find_syncrate
  1805.  *
  1806.  * Description:
  1807.  *   Look up the valid period to SCSIRATE conversion in our table
  1808.  *-F*************************************************************************/
  1809. static struct aic7xxx_syncrate *
  1810. aic7xxx_find_syncrate(struct aic7xxx_host *p, unsigned int *period,
  1811.   unsigned int maxsync, unsigned char *options)
  1812. {
  1813.   struct aic7xxx_syncrate *syncrate;
  1814.   int done = FALSE;
  1815.   switch(*options)
  1816.   {
  1817.     case MSG_EXT_PPR_OPTION_DT_CRC:
  1818.     case MSG_EXT_PPR_OPTION_DT_UNITS:
  1819.       if(!(p->features & AHC_ULTRA3))
  1820.       {
  1821.         *options = 0;
  1822.         maxsync = MAX(maxsync, AHC_SYNCRATE_ULTRA2);
  1823.       }
  1824.       break;
  1825.     case MSG_EXT_PPR_OPTION_DT_CRC_QUICK:
  1826.     case MSG_EXT_PPR_OPTION_DT_UNITS_QUICK:
  1827.       if(!(p->features & AHC_ULTRA3))
  1828.       {
  1829.         *options = 0;
  1830.         maxsync = MAX(maxsync, AHC_SYNCRATE_ULTRA2);
  1831.       }
  1832.       else
  1833.       {
  1834.         /*
  1835.          * we don't support the Quick Arbitration variants of dual edge
  1836.          * clocking.  As it turns out, we want to send back the
  1837.          * same basic option, but without the QA attribute.
  1838.          * We know that we are responding because we would never set
  1839.          * these options ourself, we would only respond to them.
  1840.          */
  1841.         switch(*options)
  1842.         {
  1843.           case MSG_EXT_PPR_OPTION_DT_CRC_QUICK:
  1844.             *options = MSG_EXT_PPR_OPTION_DT_CRC;
  1845.             break;
  1846.           case MSG_EXT_PPR_OPTION_DT_UNITS_QUICK:
  1847.             *options = MSG_EXT_PPR_OPTION_DT_UNITS;
  1848.             break;
  1849.         }
  1850.       }
  1851.       break;
  1852.     default:
  1853.       *options = 0;
  1854.       maxsync = MAX(maxsync, AHC_SYNCRATE_ULTRA2);
  1855.       break;
  1856.   }
  1857.   syncrate = &aic7xxx_syncrates[maxsync];
  1858.   while ( (syncrate->rate[0] != NULL) &&
  1859.          (!(p->features & AHC_ULTRA2) || syncrate->sxfr_ultra2) )
  1860.   {
  1861.     if (*period <= syncrate->period) 
  1862.     {
  1863.       switch(*options)
  1864.       {
  1865.         case MSG_EXT_PPR_OPTION_DT_CRC:
  1866.         case MSG_EXT_PPR_OPTION_DT_UNITS:
  1867.           if(!(syncrate->sxfr_ultra2 & AHC_SYNCRATE_CRC))
  1868.           {
  1869.             done = TRUE;
  1870.             /*
  1871.              * oops, we went too low for the CRC/DualEdge signalling, so
  1872.              * clear the options byte
  1873.              */
  1874.             *options = 0;
  1875.             /*
  1876.              * We'll be sending a reply to this packet to set the options
  1877.              * properly, so unilaterally set the period as well.
  1878.              */
  1879.             *period = syncrate->period;
  1880.           }
  1881.           else
  1882.           {
  1883.             done = TRUE;
  1884.             if(syncrate == &aic7xxx_syncrates[maxsync])
  1885.             {
  1886.               *period = syncrate->period;
  1887.             }
  1888.           }
  1889.           break;
  1890.         default:
  1891.           if(!(syncrate->sxfr_ultra2 & AHC_SYNCRATE_CRC))
  1892.           {
  1893.             done = TRUE;
  1894.             if(syncrate == &aic7xxx_syncrates[maxsync])
  1895.             {
  1896.               *period = syncrate->period;
  1897.             }
  1898.           }
  1899.           break;
  1900.       }
  1901.       if(done)
  1902.       {
  1903.         break;
  1904.       }
  1905.     }
  1906.     syncrate++;
  1907.   }
  1908.   if ( (*period == 0) || (syncrate->rate[0] == NULL) ||
  1909.        ((p->features & AHC_ULTRA2) && (syncrate->sxfr_ultra2 == 0)) )
  1910.   {
  1911.     /*
  1912.      * Use async transfers for this target
  1913.      */
  1914.     *options = 0;
  1915.     *period = 255;
  1916.     syncrate = NULL;
  1917.   }
  1918.   return (syncrate);
  1919. }
  1920. /*+F*************************************************************************
  1921.  * Function:
  1922.  *   aic7xxx_find_period
  1923.  *
  1924.  * Description:
  1925.  *   Look up the valid SCSIRATE to period conversion in our table
  1926.  *-F*************************************************************************/
  1927. static unsigned int
  1928. aic7xxx_find_period(struct aic7xxx_host *p, unsigned int scsirate,
  1929.   unsigned int maxsync)
  1930. {
  1931.   struct aic7xxx_syncrate *syncrate;
  1932.   if (p->features & AHC_ULTRA2)
  1933.   {
  1934.     scsirate &= SXFR_ULTRA2;
  1935.   }
  1936.   else
  1937.   {
  1938.     scsirate &= SXFR;
  1939.   }
  1940.   syncrate = &aic7xxx_syncrates[maxsync];
  1941.   while (syncrate->rate[0] != NULL)
  1942.   {
  1943.     if (p->features & AHC_ULTRA2)
  1944.     {
  1945.       if (syncrate->sxfr_ultra2 == 0)
  1946.         break;
  1947.       else if (scsirate == syncrate->sxfr_ultra2)
  1948.         return (syncrate->period);
  1949.       else if (scsirate == (syncrate->sxfr_ultra2 & ~AHC_SYNCRATE_CRC))
  1950.         return (syncrate->period);
  1951.     }
  1952.     else if (scsirate == (syncrate->sxfr & ~ULTRA_SXFR))
  1953.     {
  1954.       return (syncrate->period);
  1955.     }
  1956.     syncrate++;
  1957.   }
  1958.   return (0); /* async */
  1959. }
  1960. /*+F*************************************************************************
  1961.  * Function:
  1962.  *   aic7xxx_validate_offset
  1963.  *
  1964.  * Description:
  1965.  *   Set a valid offset value for a particular card in use and transfer
  1966.  *   settings in use.
  1967.  *-F*************************************************************************/
  1968. static void
  1969. aic7xxx_validate_offset(struct aic7xxx_host *p,
  1970.   struct aic7xxx_syncrate *syncrate, unsigned int *offset, int wide)
  1971. {
  1972.   unsigned int maxoffset;
  1973.   /* Limit offset to what the card (and device) can do */
  1974.   if (syncrate == NULL)
  1975.   {
  1976.     maxoffset = 0;
  1977.   }
  1978.   else if (p->features & AHC_ULTRA2)
  1979.   {
  1980.     maxoffset = MAX_OFFSET_ULTRA2;
  1981.   }
  1982.   else
  1983.   {
  1984.     if (wide)
  1985.       maxoffset = MAX_OFFSET_16BIT;
  1986.     else
  1987.       maxoffset = MAX_OFFSET_8BIT;
  1988.   }
  1989.   *offset = MIN(*offset, maxoffset);
  1990. }
  1991. /*+F*************************************************************************
  1992.  * Function:
  1993.  *   aic7xxx_set_syncrate
  1994.  *
  1995.  * Description:
  1996.  *   Set the actual syncrate down in the card and in our host structs
  1997.  *-F*************************************************************************/
  1998. static void
  1999. aic7xxx_set_syncrate(struct aic7xxx_host *p, struct aic7xxx_syncrate *syncrate,
  2000.     int target, int channel, unsigned int period, unsigned int offset,
  2001.     unsigned char options, unsigned int type)
  2002. {
  2003.   unsigned char tindex;
  2004.   unsigned short target_mask;
  2005.   unsigned char lun, old_options;
  2006.   unsigned int old_period, old_offset;
  2007.   tindex = target | (channel << 3);
  2008.   target_mask = 0x01 << tindex;
  2009.   lun = aic_inb(p, SCB_TCL) & 0x07;
  2010.   if (syncrate == NULL)
  2011.   {
  2012.     period = 0;
  2013.     offset = 0;
  2014.   }
  2015.   old_period = p->transinfo[tindex].cur_period;
  2016.   old_offset = p->transinfo[tindex].cur_offset;
  2017.   old_options = p->transinfo[tindex].cur_options;
  2018.   
  2019.   if (type & AHC_TRANS_CUR)
  2020.   {
  2021.     unsigned int scsirate;
  2022.     scsirate = aic_inb(p, TARG_SCSIRATE + tindex);
  2023.     if (p->features & AHC_ULTRA2)
  2024.     {
  2025.       scsirate &= ~SXFR_ULTRA2;
  2026.       if (syncrate != NULL)
  2027.       {
  2028.         switch(options)
  2029.         {
  2030.           case MSG_EXT_PPR_OPTION_DT_UNITS:
  2031.             /*
  2032.              * mask off the CRC bit in the xfer settings
  2033.              */
  2034.             scsirate |= (syncrate->sxfr_ultra2 & ~AHC_SYNCRATE_CRC);
  2035.             break;
  2036.           default:
  2037.             scsirate |= syncrate->sxfr_ultra2;
  2038.             break;
  2039.         }
  2040.       }
  2041.       if (type & AHC_TRANS_ACTIVE)
  2042.       {
  2043.         aic_outb(p, offset, SCSIOFFSET);
  2044.       }
  2045.       aic_outb(p, offset, TARG_OFFSET + tindex);
  2046.     }
  2047.     else /* Not an Ultra2 controller */
  2048.     {
  2049.       scsirate &= ~(SXFR|SOFS);
  2050.       p->ultraenb &= ~target_mask;
  2051.       if (syncrate != NULL)
  2052.       {
  2053.         if (syncrate->sxfr & ULTRA_SXFR)
  2054.         {
  2055.           p->ultraenb |= target_mask;
  2056.         }
  2057.         scsirate |= (syncrate->sxfr & SXFR);
  2058.         scsirate |= (offset & SOFS);
  2059.       }
  2060.       if (type & AHC_TRANS_ACTIVE)
  2061.       {
  2062.         unsigned char sxfrctl0;
  2063.         sxfrctl0 = aic_inb(p, SXFRCTL0);
  2064.         sxfrctl0 &= ~FAST20;
  2065.         if (p->ultraenb & target_mask)
  2066.           sxfrctl0 |= FAST20;
  2067.         aic_outb(p, sxfrctl0, SXFRCTL0);
  2068.       }
  2069.       aic_outb(p, p->ultraenb & 0xff, ULTRA_ENB);
  2070.       aic_outb(p, (p->ultraenb >> 8) & 0xff, ULTRA_ENB + 1 );
  2071.     }
  2072.     if (type & AHC_TRANS_ACTIVE)
  2073.     {
  2074.       aic_outb(p, scsirate, SCSIRATE);
  2075.     }
  2076.     aic_outb(p, scsirate, TARG_SCSIRATE + tindex);
  2077.     p->transinfo[tindex].cur_period = period;
  2078.     p->transinfo[tindex].cur_offset = offset;
  2079.     p->transinfo[tindex].cur_options = options;
  2080.     if ( !(type & AHC_TRANS_QUITE) &&
  2081.          (aic7xxx_verbose & VERBOSE_NEGOTIATION) &&
  2082.          (p->dev_flags[tindex] & DEVICE_PRINT_DTR) )
  2083.     {
  2084.       if (offset)
  2085.       {
  2086.         int rate_mod = (scsirate & WIDEXFER) ? 1 : 0;
  2087.       
  2088.         printk(INFO_LEAD "Synchronous at %s Mbyte/sec, "
  2089.                "offset %d.n", p->host_no, channel, target, lun,
  2090.                syncrate->rate[rate_mod], offset);
  2091.       }
  2092.       else
  2093.       {
  2094.         printk(INFO_LEAD "Using asynchronous transfers.n",
  2095.                p->host_no, channel, target, lun);
  2096.       }
  2097.       p->dev_flags[tindex] &= ~DEVICE_PRINT_DTR;
  2098.     }
  2099.   }
  2100.   if (type & AHC_TRANS_GOAL)
  2101.   {
  2102.     p->transinfo[tindex].goal_period = period;
  2103.     p->transinfo[tindex].goal_offset = offset;
  2104.     p->transinfo[tindex].goal_options = options;
  2105.   }
  2106.   if (type & AHC_TRANS_USER)
  2107.   {
  2108.     p->transinfo[tindex].user_period = period;
  2109.     p->transinfo[tindex].user_offset = offset;
  2110.     p->transinfo[tindex].user_options = options;
  2111.   }
  2112. }
  2113. /*+F*************************************************************************
  2114.  * Function:
  2115.  *   aic7xxx_set_width
  2116.  *
  2117.  * Description:
  2118.  *   Set the actual width down in the card and in our host structs
  2119.  *-F*************************************************************************/
  2120. static void
  2121. aic7xxx_set_width(struct aic7xxx_host *p, int target, int channel, int lun,
  2122.     unsigned int width, unsigned int type)
  2123. {
  2124.   unsigned char tindex;
  2125.   unsigned short target_mask;
  2126.   unsigned int old_width;
  2127.   tindex = target | (channel << 3);
  2128.   target_mask = 1 << tindex;
  2129.   
  2130.   old_width = p->transinfo[tindex].cur_width;
  2131.   if (type & AHC_TRANS_CUR) 
  2132.   {
  2133.     unsigned char scsirate;
  2134.     scsirate = aic_inb(p, TARG_SCSIRATE + tindex);
  2135.     scsirate &= ~WIDEXFER;
  2136.     if (width == MSG_EXT_WDTR_BUS_16_BIT)
  2137.       scsirate |= WIDEXFER;
  2138.     aic_outb(p, scsirate, TARG_SCSIRATE + tindex);
  2139.     if (type & AHC_TRANS_ACTIVE)
  2140.       aic_outb(p, scsirate, SCSIRATE);
  2141.     p->transinfo[tindex].cur_width = width;
  2142.     if ( !(type & AHC_TRANS_QUITE) &&
  2143.           (aic7xxx_verbose & VERBOSE_NEGOTIATION2) && 
  2144.           (p->dev_flags[tindex] & DEVICE_PRINT_DTR) )
  2145.     {
  2146.       printk(INFO_LEAD "Using %s transfersn", p->host_no, channel, target,
  2147.         lun, (scsirate & WIDEXFER) ? "Wide(16bit)" : "Narrow(8bit)" );
  2148.     }
  2149.   }
  2150.   if (type & AHC_TRANS_GOAL)
  2151.     p->transinfo[tindex].goal_width = width;
  2152.   if (type & AHC_TRANS_USER)
  2153.     p->transinfo[tindex].user_width = width;
  2154.   if (p->transinfo[tindex].goal_offset)
  2155.   {
  2156.     if (p->features & AHC_ULTRA2)
  2157.     {
  2158.       p->transinfo[tindex].goal_offset = MAX_OFFSET_ULTRA2;
  2159.     }
  2160.     else if (width == MSG_EXT_WDTR_BUS_16_BIT)
  2161.     {
  2162.       p->transinfo[tindex].goal_offset = MAX_OFFSET_16BIT;
  2163.     }
  2164.     else
  2165.     {
  2166.       p->transinfo[tindex].goal_offset = MAX_OFFSET_8BIT;
  2167.     }
  2168.   }
  2169. }
  2170.       
  2171. /*+F*************************************************************************
  2172.  * Function:
  2173.  *   scbq_init
  2174.  *
  2175.  * Description:
  2176.  *   SCB queue initialization.
  2177.  *
  2178.  *-F*************************************************************************/
  2179. static void
  2180. scbq_init(volatile scb_queue_type *queue)
  2181. {
  2182.   queue->head = NULL;
  2183.   queue->tail = NULL;
  2184. }
  2185. /*+F*************************************************************************
  2186.  * Function:
  2187.  *   scbq_insert_head
  2188.  *
  2189.  * Description:
  2190.  *   Add an SCB to the head of the list.
  2191.  *
  2192.  *-F*************************************************************************/
  2193. static inline void
  2194. scbq_insert_head(volatile scb_queue_type *queue, struct aic7xxx_scb *scb)
  2195. {
  2196. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95)
  2197.   unsigned long cpu_flags;
  2198. #endif
  2199.   DRIVER_LOCK
  2200.   scb->q_next = queue->head;
  2201.   queue->head = scb;
  2202.   if (queue->tail == NULL)       /* If list was empty, update tail. */
  2203.     queue->tail = queue->head;
  2204.   DRIVER_UNLOCK
  2205. }
  2206. /*+F*************************************************************************
  2207.  * Function:
  2208.  *   scbq_remove_head
  2209.  *
  2210.  * Description:
  2211.  *   Remove an SCB from the head of the list.
  2212.  *
  2213.  *-F*************************************************************************/
  2214. static inline struct aic7xxx_scb *
  2215. scbq_remove_head(volatile scb_queue_type *queue)
  2216. {
  2217.   struct aic7xxx_scb * scbp;
  2218. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95)
  2219.   unsigned long cpu_flags;
  2220. #endif
  2221.   DRIVER_LOCK
  2222.   scbp = queue->head;
  2223.   if (queue->head != NULL)
  2224.     queue->head = queue->head->q_next;
  2225.   if (queue->head == NULL)       /* If list is now empty, update tail. */
  2226.     queue->tail = NULL;
  2227.   DRIVER_UNLOCK
  2228.   return(scbp);
  2229. }
  2230. /*+F*************************************************************************
  2231.  * Function:
  2232.  *   scbq_remove
  2233.  *
  2234.  * Description:
  2235.  *   Removes an SCB from the list.
  2236.  *
  2237.  *-F*************************************************************************/
  2238. static inline void
  2239. scbq_remove(volatile scb_queue_type *queue, struct aic7xxx_scb *scb)
  2240. {
  2241. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95)
  2242.   unsigned long cpu_flags;
  2243. #endif
  2244.   DRIVER_LOCK
  2245.   if (queue->head == scb)
  2246.   {
  2247.     /* At beginning of queue, remove from head. */
  2248.     scbq_remove_head(queue);
  2249.   }
  2250.   else
  2251.   {
  2252.     struct aic7xxx_scb *curscb = queue->head;
  2253.     /*
  2254.      * Search until the next scb is the one we're looking for, or
  2255.      * we run out of queue.
  2256.      */
  2257.     while ((curscb != NULL) && (curscb->q_next != scb))
  2258.     {
  2259.       curscb = curscb->q_next;
  2260.     }
  2261.     if (curscb != NULL)
  2262.     {
  2263.       /* Found it. */
  2264.       curscb->q_next = scb->q_next;
  2265.       if (scb->q_next == NULL)
  2266.       {
  2267.         /* Update the tail when removing the tail. */
  2268.         queue->tail = curscb;
  2269.       }
  2270.     }
  2271.   }
  2272.   DRIVER_UNLOCK
  2273. }
  2274. /*+F*************************************************************************
  2275.  * Function:
  2276.  *   scbq_insert_tail
  2277.  *
  2278.  * Description:
  2279.  *   Add an SCB at the tail of the list.
  2280.  *
  2281.  *-F*************************************************************************/
  2282. static inline void
  2283. scbq_insert_tail(volatile scb_queue_type *queue, struct aic7xxx_scb *scb)
  2284. {
  2285. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95)
  2286.   unsigned long cpu_flags;
  2287. #endif
  2288.   DRIVER_LOCK
  2289.   scb->q_next = NULL;
  2290.   if (queue->tail != NULL)       /* Add the scb at the end of the list. */
  2291.     queue->tail->q_next = scb;
  2292.   queue->tail = scb;             /* Update the tail. */
  2293.   if (queue->head == NULL)       /* If list was empty, update head. */
  2294.     queue->head = queue->tail;
  2295.   DRIVER_UNLOCK
  2296. }
  2297. /*+F*************************************************************************
  2298.  * Function:
  2299.  *   aic7xxx_match_scb
  2300.  *
  2301.  * Description:
  2302.  *   Checks to see if an scb matches the target/channel as specified.
  2303.  *   If target is ALL_TARGETS (-1), then we're looking for any device
  2304.  *   on the specified channel; this happens when a channel is going
  2305.  *   to be reset and all devices on that channel must be aborted.
  2306.  *-F*************************************************************************/
  2307. static int
  2308. aic7xxx_match_scb(struct aic7xxx_host *p, struct aic7xxx_scb *scb,
  2309.     int target, int channel, int lun, unsigned char tag)
  2310. {
  2311.   int targ = (scb->hscb->target_channel_lun >> 4) & 0x0F;
  2312.   int chan = (scb->hscb->target_channel_lun >> 3) & 0x01;
  2313.   int slun = scb->hscb->target_channel_lun & 0x07;
  2314.   int match;
  2315.   match = ((chan == channel) || (channel == ALL_CHANNELS));
  2316.   if (match != 0)
  2317.     match = ((targ == target) || (target == ALL_TARGETS));
  2318.   if (match != 0)
  2319.     match = ((lun == slun) || (lun == ALL_LUNS));
  2320.   if (match != 0)
  2321.     match = ((tag == scb->hscb->tag) || (tag == SCB_LIST_NULL));
  2322.   return (match);
  2323. }
  2324. /*+F*************************************************************************
  2325.  * Function:
  2326.  *   aic7xxx_add_curscb_to_free_list
  2327.  *
  2328.  * Description:
  2329.  *   Adds the current scb (in SCBPTR) to the list of free SCBs.
  2330.  *-F*************************************************************************/
  2331. static void
  2332. aic7xxx_add_curscb_to_free_list(struct aic7xxx_host *p)
  2333. {
  2334.   /*
  2335.    * Invalidate the tag so that aic7xxx_find_scb doesn't think
  2336.    * it's active
  2337.    */
  2338.   aic_outb(p, SCB_LIST_NULL, SCB_TAG);
  2339.   aic_outb(p, 0, SCB_CONTROL);
  2340.   aic_outb(p, aic_inb(p, FREE_SCBH), SCB_NEXT);
  2341.   aic_outb(p, aic_inb(p, SCBPTR), FREE_SCBH);
  2342. }
  2343. /*+F*************************************************************************
  2344.  * Function:
  2345.  *   aic7xxx_rem_scb_from_disc_list
  2346.  *
  2347.  * Description:
  2348.  *   Removes the current SCB from the disconnected list and adds it
  2349.  *   to the free list.
  2350.  *-F*************************************************************************/
  2351. static unsigned char
  2352. aic7xxx_rem_scb_from_disc_list(struct aic7xxx_host *p, unsigned char scbptr,
  2353.                                unsigned char prev)
  2354. {
  2355.   unsigned char next;
  2356.   aic_outb(p, scbptr, SCBPTR);
  2357.   next = aic_inb(p, SCB_NEXT);
  2358.   aic7xxx_add_curscb_to_free_list(p);
  2359.   if (prev != SCB_LIST_NULL)
  2360.   {
  2361.     aic_outb(p, prev, SCBPTR);
  2362.     aic_outb(p, next, SCB_NEXT);
  2363.   }
  2364.   else
  2365.   {
  2366.     aic_outb(p, next, DISCONNECTED_SCBH);
  2367.   }
  2368.   return next;
  2369. }
  2370. /*+F*************************************************************************
  2371.  * Function:
  2372.  *   aic7xxx_busy_target
  2373.  *
  2374.  * Description:
  2375.  *   Set the specified target busy.
  2376.  *-F*************************************************************************/
  2377. static inline void
  2378. aic7xxx_busy_target(struct aic7xxx_host *p, struct aic7xxx_scb *scb)
  2379. {
  2380.   p->untagged_scbs[scb->hscb->target_channel_lun] = scb->hscb->tag;
  2381. }
  2382. /*+F*************************************************************************
  2383.  * Function:
  2384.  *   aic7xxx_index_busy_target
  2385.  *
  2386.  * Description:
  2387.  *   Returns the index of the busy target, and optionally sets the
  2388.  *   target inactive.
  2389.  *-F*************************************************************************/
  2390. static inline unsigned char
  2391. aic7xxx_index_busy_target(struct aic7xxx_host *p, unsigned char tcl,
  2392.     int unbusy)
  2393. {
  2394.   unsigned char busy_scbid;
  2395.   busy_scbid = p->untagged_scbs[tcl];
  2396.   if (unbusy)
  2397.   {
  2398.     p->untagged_scbs[tcl] = SCB_LIST_NULL;
  2399.   }
  2400.   return (busy_scbid);
  2401. }
  2402. /*+F*************************************************************************
  2403.  * Function:
  2404.  *   aic7xxx_find_scb
  2405.  *
  2406.  * Description:
  2407.  *   Look through the SCB array of the card and attempt to find the
  2408.  *   hardware SCB that corresponds to the passed in SCB.  Return
  2409.  *   SCB_LIST_NULL if unsuccessful.  This routine assumes that the
  2410.  *   card is already paused.
  2411.  *-F*************************************************************************/
  2412. static unsigned char
  2413. aic7xxx_find_scb(struct aic7xxx_host *p, struct aic7xxx_scb *scb)
  2414. {
  2415.   unsigned char saved_scbptr;
  2416.   unsigned char curindex;
  2417.   saved_scbptr = aic_inb(p, SCBPTR);
  2418.   curindex = 0;
  2419.   for (curindex = 0; curindex < p->scb_data->maxhscbs; curindex++)
  2420.   {
  2421.     aic_outb(p, curindex, SCBPTR);
  2422.     if (aic_inb(p, SCB_TAG) == scb->hscb->tag)
  2423.     {
  2424.       break;
  2425.     }
  2426.   }
  2427.   aic_outb(p, saved_scbptr, SCBPTR);
  2428.   if (curindex >= p->scb_data->maxhscbs)
  2429.   {
  2430.     curindex = SCB_LIST_NULL;
  2431.   }
  2432.   return (curindex);
  2433. }
  2434. /*+F*************************************************************************
  2435.  * Function:
  2436.  *   aic7xxx_allocate_scb
  2437.  *
  2438.  * Description:
  2439.  *   Get an SCB from the free list or by allocating a new one.
  2440.  *-F*************************************************************************/
  2441. static int
  2442. aic7xxx_allocate_scb(struct aic7xxx_host *p)
  2443. {
  2444.   struct aic7xxx_scb   *scbp = NULL;
  2445.   int scb_size = (sizeof (struct hw_scatterlist) * AIC7XXX_MAX_SG) + 12 + 6;
  2446.   int i;
  2447.   int step = PAGE_SIZE / 1024;
  2448.   unsigned long scb_count = 0;
  2449.   struct hw_scatterlist *hsgp;
  2450.   struct aic7xxx_scb *scb_ap;
  2451.   struct aic7xxx_scb_dma *scb_dma;
  2452.   unsigned char *bufs;
  2453.   if (p->scb_data->numscbs < p->scb_data->maxscbs)
  2454.   {
  2455.     /*
  2456.      * Calculate the optimal number of SCBs to allocate.
  2457.      *
  2458.      * NOTE: This formula works because the sizeof(sg_array) is always
  2459.      * 1024.  Therefore, scb_size * i would always be > PAGE_SIZE *
  2460.      * (i/step).  The (i-1) allows the left hand side of the equation
  2461.      * to grow into the right hand side to a point of near perfect
  2462.      * efficiency since scb_size * (i -1) is growing slightly faster
  2463.      * than the right hand side.  If the number of SG array elements
  2464.      * is changed, this function may not be near so efficient any more.
  2465.      *
  2466.      * Since the DMA'able buffers are now allocated in a seperate
  2467.      * chunk this algorithm has been modified to match.  The '12'
  2468.      * and '6' factors in scb_size are for the DMA'able command byte
  2469.      * and sensebuffers respectively.  -DaveM
  2470.      */
  2471.     for ( i=step;; i *= 2 )
  2472.     {
  2473.       if ( (scb_size * (i-1)) >= ( (PAGE_SIZE * (i/step)) - 64 ) )
  2474.       {
  2475.         i /= 2;
  2476.         break;
  2477.       }
  2478.     }
  2479.     scb_count = MIN( (i-1), p->scb_data->maxscbs - p->scb_data->numscbs);
  2480.     scb_ap = (struct aic7xxx_scb *)kmalloc(sizeof (struct aic7xxx_scb) * scb_count
  2481.    + sizeof(struct aic7xxx_scb_dma), GFP_ATOMIC);
  2482.     if (scb_ap == NULL)
  2483.       return(0);
  2484.     scb_dma = (struct aic7xxx_scb_dma *)&scb_ap[scb_count];
  2485.     hsgp = (struct hw_scatterlist *)
  2486.       pci_alloc_consistent(p->pdev, scb_size * scb_count,
  2487.    &scb_dma->dma_address);
  2488.     if (hsgp == NULL)
  2489.     {
  2490.       kfree(scb_ap);
  2491.       return(0);
  2492.     }
  2493.     bufs = (unsigned char *)&hsgp[scb_count * AIC7XXX_MAX_SG];
  2494. #ifdef AIC7XXX_VERBOSE_DEBUGGING
  2495.     if (aic7xxx_verbose > 0xffff)
  2496.     {
  2497.       if (p->scb_data->numscbs == 0)
  2498. printk(INFO_LEAD "Allocating initial %ld SCB structures.n",
  2499.   p->host_no, -1, -1, -1, scb_count);
  2500.       else
  2501. printk(INFO_LEAD "Allocating %ld additional SCB structures.n",
  2502.   p->host_no, -1, -1, -1, scb_count);
  2503.     }
  2504. #endif
  2505.     memset(scb_ap, 0, sizeof (struct aic7xxx_scb) * scb_count);
  2506.     scb_dma->dma_offset = (unsigned long)scb_dma->dma_address
  2507.   - (unsigned long)hsgp;
  2508.     scb_dma->dma_len = scb_size * scb_count;
  2509.     for (i=0; i < scb_count; i++)
  2510.     {
  2511.       scbp = &scb_ap[i];
  2512.       scbp->hscb = &p->scb_data->hscbs[p->scb_data->numscbs];
  2513.       scbp->sg_list = &hsgp[i * AIC7XXX_MAX_SG];
  2514.       scbp->sense_cmd = bufs;
  2515.       scbp->cmnd = bufs + 6;
  2516.       bufs += 12 + 6;
  2517.       scbp->scb_dma = scb_dma;
  2518.       memset(scbp->hscb, 0, sizeof(struct aic7xxx_hwscb));
  2519.       scbp->hscb->tag = p->scb_data->numscbs;
  2520.       /*
  2521.        * Place in the scb array; never is removed
  2522.        */
  2523.       p->scb_data->scb_array[p->scb_data->numscbs++] = scbp;
  2524.       scbq_insert_tail(&p->scb_data->free_scbs, scbp);
  2525.     }
  2526.     scbp->kmalloc_ptr = scb_ap;
  2527.   }
  2528.   return(scb_count);
  2529. }
  2530. /*+F*************************************************************************
  2531.  * Function:
  2532.  *   aic7xxx_queue_cmd_complete
  2533.  *
  2534.  * Description:
  2535.  *   Due to race conditions present in the SCSI subsystem, it is easier
  2536.  *   to queue completed commands, then call scsi_done() on them when
  2537.  *   we're finished.  This function queues the completed commands.
  2538.  *-F*************************************************************************/
  2539. static void
  2540. aic7xxx_queue_cmd_complete(struct aic7xxx_host *p, Scsi_Cmnd *cmd)
  2541. {
  2542.   cmd->host_scribble = (char *)p->completeq.head;
  2543.   p->completeq.head = cmd;
  2544. }
  2545. /*+F*************************************************************************
  2546.  * Function:
  2547.  *   aic7xxx_done_cmds_complete
  2548.  *
  2549.  * Description:
  2550.  *   Process the completed command queue.
  2551.  *-F*************************************************************************/
  2552. static void
  2553. aic7xxx_done_cmds_complete(struct aic7xxx_host *p)
  2554. {
  2555.   Scsi_Cmnd *cmd;
  2556. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95)
  2557.   unsigned int cpu_flags = 0;
  2558. #endif
  2559.   
  2560.   DRIVER_LOCK
  2561.   while (p->completeq.head != NULL)
  2562.   {
  2563.     cmd = p->completeq.head;
  2564.     p->completeq.head = (Scsi_Cmnd *)cmd->host_scribble;
  2565.     cmd->host_scribble = NULL;
  2566.     cmd->scsi_done(cmd);
  2567.   }
  2568.   DRIVER_UNLOCK
  2569. }
  2570. /*+F*************************************************************************
  2571.  * Function:
  2572.  *   aic7xxx_free_scb
  2573.  *
  2574.  * Description:
  2575.  *   Free the scb and insert into the free scb list.
  2576.  *-F*************************************************************************/
  2577. static void
  2578. aic7xxx_free_scb(struct aic7xxx_host *p, struct aic7xxx_scb *scb)
  2579. {
  2580.   scb->flags = SCB_FREE;
  2581.   scb->cmd = NULL;
  2582.   scb->sg_count = 0;
  2583.   scb->sg_length = 0;
  2584.   scb->tag_action = 0;
  2585.   scb->hscb->control = 0;
  2586.   scb->hscb->target_status = 0;
  2587.   scb->hscb->target_channel_lun = SCB_LIST_NULL;
  2588.   scbq_insert_head(&p->scb_data->free_scbs, scb);
  2589. }
  2590. /*+F*************************************************************************
  2591.  * Function:
  2592.  *   aic7xxx_done
  2593.  *
  2594.  * Description:
  2595.  *   Calls the higher level scsi done function and frees the scb.
  2596.  *-F*************************************************************************/
  2597. static void
  2598. aic7xxx_done(struct aic7xxx_host *p, struct aic7xxx_scb *scb)
  2599. {
  2600.   Scsi_Cmnd *cmd = scb->cmd;
  2601.   int tindex = TARGET_INDEX(cmd);
  2602.   struct aic7xxx_scb *scbp;
  2603.   unsigned char queue_depth;
  2604.   if (cmd->use_sg > 1)
  2605.   {
  2606.     struct scatterlist *sg;
  2607.     sg = (struct scatterlist *)cmd->request_buffer;
  2608.     pci_unmap_sg(p->pdev, sg, cmd->use_sg, scsi_to_pci_dma_dir(cmd->sc_data_direction));
  2609.   }
  2610.   else if (cmd->request_bufflen)
  2611.     pci_unmap_single(p->pdev, aic7xxx_mapping(cmd),
  2612.      cmd->request_bufflen,
  2613.                      scsi_to_pci_dma_dir(cmd->sc_data_direction));
  2614.   if (scb->flags & SCB_SENSE)
  2615.   {
  2616.     pci_unmap_single(p->pdev,
  2617.                      le32_to_cpu(scb->sg_list[0].address),
  2618.                      sizeof(cmd->sense_buffer),
  2619.                      PCI_DMA_FROMDEVICE);
  2620.   }
  2621.   if (scb->flags & SCB_RECOVERY_SCB)
  2622.   {
  2623.     p->flags &= ~AHC_ABORT_PENDING;
  2624.   }
  2625.   if (scb->flags & (SCB_RESET|SCB_ABORT))
  2626.   {
  2627.     cmd->result |= (DID_RESET << 16);
  2628.   }
  2629.   if (!(p->dev_flags[tindex] & DEVICE_PRESENT))
  2630.   {
  2631.     if ( (cmd->cmnd[0] == INQUIRY) && (cmd->result == DID_OK) )
  2632.     {
  2633.     
  2634.       p->dev_flags[tindex] |= DEVICE_PRESENT;
  2635. #define WIDE_INQUIRY_BITS 0x60
  2636. #define SYNC_INQUIRY_BITS 0x10
  2637. #define SCSI_VERSION_BITS 0x07
  2638. #define SCSI_DT_BIT       0x04
  2639.       if(!(p->dev_flags[tindex] & DEVICE_DTR_SCANNED)) {
  2640.         char *buffer;
  2641.         if(cmd->use_sg)
  2642.         {
  2643.           struct scatterlist *sg;
  2644.           sg = (struct scatterlist *)cmd->request_buffer;
  2645.           buffer = (char *)sg[0].address;
  2646.         }
  2647.         else
  2648.         {
  2649.           buffer = (char *)cmd->request_buffer;
  2650.         }
  2651.         if ( (buffer[7] & WIDE_INQUIRY_BITS) &&
  2652.              (p->features & AHC_WIDE) )
  2653.         {
  2654.           p->needwdtr |= (1<<tindex);
  2655.           p->needwdtr_copy |= (1<<tindex);
  2656.           p->transinfo[tindex].goal_width = p->transinfo[tindex].user_width;
  2657.         }
  2658.         else
  2659.         {
  2660.           p->needwdtr &= ~(1<<tindex);
  2661.           p->needwdtr_copy &= ~(1<<tindex);
  2662.           pause_sequencer(p);
  2663.           aic7xxx_set_width(p, cmd->target, cmd->channel, cmd->lun,
  2664.                             MSG_EXT_WDTR_BUS_8_BIT, (AHC_TRANS_ACTIVE |
  2665.                                                      AHC_TRANS_GOAL |
  2666.                                                      AHC_TRANS_CUR) );
  2667.           unpause_sequencer(p, FALSE);
  2668.         }
  2669.         if ( (buffer[7] & SYNC_INQUIRY_BITS) &&
  2670.               p->transinfo[tindex].user_offset )
  2671.         {
  2672.           p->transinfo[tindex].goal_period = p->transinfo[tindex].user_period;
  2673.           p->transinfo[tindex].goal_options = p->transinfo[tindex].user_options;
  2674.           if (p->features & AHC_ULTRA2)
  2675.             p->transinfo[tindex].goal_offset = MAX_OFFSET_ULTRA2;
  2676.           else if (p->transinfo[tindex].goal_width == MSG_EXT_WDTR_BUS_16_BIT)
  2677.             p->transinfo[tindex].goal_offset = MAX_OFFSET_16BIT;
  2678.           else
  2679.             p->transinfo[tindex].goal_offset = MAX_OFFSET_8BIT;
  2680.           if ( (((buffer[2] & SCSI_VERSION_BITS) >= 3) ||
  2681.                  (buffer[56] & SCSI_DT_BIT) ||
  2682.                  (p->dev_flags[tindex] & DEVICE_SCSI_3) ) &&
  2683.                  (p->transinfo[tindex].user_period <= 9) &&
  2684.                  (p->transinfo[tindex].user_options) )
  2685.           {
  2686.             p->needppr |= (1<<tindex);
  2687.             p->needppr_copy |= (1<<tindex);
  2688.             p->needsdtr &= ~(1<<tindex);
  2689.             p->needsdtr_copy &= ~(1<<tindex);
  2690.             p->needwdtr &= ~(1<<tindex);
  2691.             p->needwdtr_copy &= ~(1<<tindex);
  2692.             p->dev_flags[tindex] |= DEVICE_SCSI_3;
  2693.           }
  2694.           else
  2695.           {
  2696.             p->needsdtr |= (1<<tindex);
  2697.             p->needsdtr_copy |= (1<<tindex);
  2698.             p->transinfo[tindex].goal_period = 
  2699.               MAX(10, p->transinfo[tindex].goal_period);
  2700.             p->transinfo[tindex].goal_options = 0;
  2701.           }
  2702.         }
  2703.         else
  2704.         {
  2705.           p->needsdtr &= ~(1<<tindex);
  2706.           p->needsdtr_copy &= ~(1<<tindex);
  2707.           p->transinfo[tindex].goal_period = 255;
  2708.           p->transinfo[tindex].goal_offset = 0;
  2709.           p->transinfo[tindex].goal_options = 0;
  2710.         }
  2711.         p->dev_flags[tindex] |= DEVICE_DTR_SCANNED;
  2712.         p->dev_flags[tindex] |= DEVICE_PRINT_DTR;
  2713.       }
  2714. #undef WIDE_INQUIRY_BITS
  2715. #undef SYNC_INQUIRY_BITS
  2716. #undef SCSI_VERSION_BITS
  2717. #undef SCSI_DT_BIT
  2718.     }
  2719.   }
  2720.   if ((scb->flags & SCB_MSGOUT_BITS) != 0)
  2721.   {
  2722.     unsigned short mask;
  2723.     int message_error = FALSE;
  2724.     mask = 0x01 << tindex;
  2725.  
  2726.     /*
  2727.      * Check to see if we get an invalid message or a message error
  2728.      * after failing to negotiate a wide or sync transfer message.
  2729.      */
  2730.     if ((scb->flags & SCB_SENSE) && 
  2731.           ((scb->cmd->sense_buffer[12] == 0x43) ||  /* INVALID_MESSAGE */
  2732.           (scb->cmd->sense_buffer[12] == 0x49))) /* MESSAGE_ERROR  */
  2733.     {
  2734.       message_error = TRUE;
  2735.     }
  2736.     if (scb->flags & SCB_MSGOUT_WDTR)
  2737.     {
  2738.       if (message_error)
  2739.       {
  2740.         if ( (aic7xxx_verbose & VERBOSE_NEGOTIATION2) &&
  2741.              (p->dev_flags[tindex] & DEVICE_PRINT_DTR) )
  2742.         {
  2743.           printk(INFO_LEAD "Device failed to complete Wide Negotiation "
  2744.             "processing andn", p->host_no, CTL_OF_SCB(scb));
  2745.           printk(INFO_LEAD "returned a sense error code for invalid message, "
  2746.             "disabling futuren", p->host_no, CTL_OF_SCB(scb));
  2747.           printk(INFO_LEAD "Wide negotiation to this device.n", p->host_no,
  2748.             CTL_OF_SCB(scb));
  2749.         }
  2750.         p->needwdtr &= ~mask;
  2751.         p->needwdtr_copy &= ~mask;
  2752.       }
  2753.     }
  2754.     if (scb->flags & SCB_MSGOUT_SDTR)
  2755.     {
  2756.       if (message_error)
  2757.       {
  2758.         if ( (aic7xxx_verbose & VERBOSE_NEGOTIATION2) &&
  2759.              (p->dev_flags[tindex] & DEVICE_PRINT_DTR) )
  2760.         {
  2761.           printk(INFO_LEAD "Device failed to complete Sync Negotiation "
  2762.             "processing andn", p->host_no, CTL_OF_SCB(scb));
  2763.           printk(INFO_LEAD "returned a sense error code for invalid message, "
  2764.             "disabling futuren", p->host_no, CTL_OF_SCB(scb));
  2765.           printk(INFO_LEAD "Sync negotiation to this device.n", p->host_no,
  2766.             CTL_OF_SCB(scb));
  2767.           p->dev_flags[tindex] &= ~DEVICE_PRINT_DTR;
  2768.         }
  2769.         p->needsdtr &= ~mask;
  2770.         p->needsdtr_copy &= ~mask;
  2771.       }
  2772.     }
  2773.     if (scb->flags & SCB_MSGOUT_PPR)
  2774.     {
  2775.       if(message_error)
  2776.       {
  2777.         if ( (aic7xxx_verbose & VERBOSE_NEGOTIATION2) &&
  2778.              (p->dev_flags[tindex] & DEVICE_PRINT_DTR) )
  2779.         {
  2780.           printk(INFO_LEAD "Device failed to complete Parallel Protocol "
  2781.             "Request processing andn", p->host_no, CTL_OF_SCB(scb));
  2782.           printk(INFO_LEAD "returned a sense error code for invalid message, "
  2783.             "disabling futuren", p->host_no, CTL_OF_SCB(scb));
  2784.           printk(INFO_LEAD "Parallel Protocol Request negotiation to this "
  2785.             "device.n", p->host_no, CTL_OF_SCB(scb));
  2786.         }
  2787.         /*
  2788.          * Disable PPR negotiation and revert back to WDTR and SDTR setup
  2789.          */