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

嵌入式Linux

开发平台:

Unix_Linux

  1.                                       scarray, p->sc_size, C56_66);
  2.         else
  3.           have_seeprom = read_seeprom(p, (p->flags & (AHC_CHNLB|AHC_CHNLC)),
  4.                                       scarray, p->sc_size, C46);
  5.       }
  6.       if (!have_seeprom)
  7.       {
  8.         p->sc_size = 128;
  9.         have_seeprom = read_seeprom(p, 4*(p->flags & (AHC_CHNLB|AHC_CHNLC)),
  10.                                     scarray, p->sc_size, p->sc_type);
  11.         if (!have_seeprom)
  12.         {
  13.           if(p->sc_type == C46)
  14.             have_seeprom = read_seeprom(p, 4*(p->flags & (AHC_CHNLB|AHC_CHNLC)),
  15.                                         scarray, p->sc_size, C56_66);
  16.           else
  17.             have_seeprom = read_seeprom(p, 4*(p->flags & (AHC_CHNLB|AHC_CHNLC)),
  18.                                         scarray, p->sc_size, C46);
  19.         }
  20.       }
  21.       break;
  22.   }
  23.   if (!have_seeprom)
  24.   {
  25.     if (aic7xxx_verbose & VERBOSE_PROBE2)
  26.     {
  27.       printk("naic7xxx: No SEEPROM available.n");
  28.     }
  29.     p->flags |= AHC_NEWEEPROM_FMT;
  30.     if (aic_inb(p, SCSISEQ) == 0)
  31.     {
  32.       p->flags |= AHC_USEDEFAULTS;
  33.       p->flags &= ~AHC_BIOS_ENABLED;
  34.       p->scsi_id = p->scsi_id_b = 7;
  35.       *sxfrctl1 |= STPWEN;
  36.       if (aic7xxx_verbose & VERBOSE_PROBE2)
  37.       {
  38.         printk("aic7xxx: Using default values.n");
  39.       }
  40.     }
  41.     else if (aic7xxx_verbose & VERBOSE_PROBE2)
  42.     {
  43.       printk("aic7xxx: Using leftover BIOS values.n");
  44.     }
  45.     if ( ((p->chip & ~AHC_CHIPID_MASK) == AHC_PCI) && (*sxfrctl1 & STPWEN) )
  46.     {
  47.       p->flags |= AHC_TERM_ENB_SE_LOW | AHC_TERM_ENB_SE_HIGH;
  48.       sc->adapter_control &= ~CFAUTOTERM;
  49.       sc->adapter_control |= CFSTERM | CFWSTERM | CFLVDSTERM;
  50.     }
  51.     if (aic7xxx_extended)
  52.       p->flags |= (AHC_EXTEND_TRANS_A | AHC_EXTEND_TRANS_B);
  53.     else
  54.       p->flags &= ~(AHC_EXTEND_TRANS_A | AHC_EXTEND_TRANS_B);
  55.   }
  56.   else
  57.   {
  58.     if (aic7xxx_verbose & VERBOSE_PROBE2)
  59.     {
  60.       printk("donen");
  61.     }
  62.     /*
  63.      * Note things in our flags
  64.      */
  65.     p->flags |= AHC_SEEPROM_FOUND;
  66.     /*
  67.      * Update the settings in sxfrctl1 to match the termination settings.
  68.      */
  69.     *sxfrctl1 = 0;
  70.     /*
  71.      * Get our SCSI ID from the SEEPROM setting...
  72.      */
  73.     p->scsi_id = (sc->brtime_id & CFSCSIID);
  74.     /*
  75.      * First process the settings that are different between the VLB
  76.      * and PCI adapter seeproms.
  77.      */
  78.     if ((p->chip & AHC_CHIPID_MASK) == AHC_AIC7770)
  79.     {
  80.       /* VLB adapter seeproms */
  81.       if (sc->bios_control & CF284XEXTEND)
  82.         p->flags |= AHC_EXTEND_TRANS_A;
  83.       if (sc->adapter_control & CF284XSTERM)
  84.       {
  85.         *sxfrctl1 |= STPWEN;
  86.         p->flags |= AHC_TERM_ENB_SE_LOW | AHC_TERM_ENB_SE_HIGH;
  87.       }
  88.     }
  89.     else
  90.     {
  91.       /* PCI adapter seeproms */
  92.       if (sc->bios_control & CFEXTEND)
  93.         p->flags |= AHC_EXTEND_TRANS_A;
  94.       if (sc->bios_control & CFBIOSEN)
  95.         p->flags |= AHC_BIOS_ENABLED;
  96.       else
  97.         p->flags &= ~AHC_BIOS_ENABLED;
  98.       if (sc->adapter_control & CFSTERM)
  99.       {
  100.         *sxfrctl1 |= STPWEN;
  101.         p->flags |= AHC_TERM_ENB_SE_LOW | AHC_TERM_ENB_SE_HIGH;
  102.       }
  103.     }
  104.     memcpy(&p->sc, sc, sizeof(struct seeprom_config));
  105.   }
  106.   p->discenable = 0;
  107.     
  108.   /*
  109.    * Limit to 16 targets just in case.  The 2842 for one is known to
  110.    * blow the max_targets setting, future cards might also.
  111.    */
  112.   max_targets = ((p->features & (AHC_TWIN | AHC_WIDE)) ? 16 : 8);
  113.   if (have_seeprom)
  114.   {
  115.     for (i = 0; i < max_targets; i++)
  116.     {
  117.       if( ((p->features & AHC_ULTRA) &&
  118.           !(sc->adapter_control & CFULTRAEN) &&
  119.            (sc->device_flags[i] & CFSYNCHISULTRA)) ||
  120.           (sc->device_flags[i] & CFNEWULTRAFORMAT) )
  121.       {
  122.         p->flags |= AHC_NEWEEPROM_FMT;
  123.         break;
  124.       }
  125.     }
  126.   }
  127.   for (i = 0; i < max_targets; i++)
  128.   {
  129.     mask = (0x01 << i);
  130.     if (!have_seeprom)
  131.     {
  132.       if (aic_inb(p, SCSISEQ) != 0)
  133.       {
  134.         /*
  135.          * OK...the BIOS set things up and left behind the settings we need.
  136.          * Just make our sc->device_flags[i] entry match what the card has
  137.          * set for this device.
  138.          */
  139.         p->discenable = 
  140.           ~(aic_inb(p, DISC_DSB) | (aic_inb(p, DISC_DSB + 1) << 8) );
  141.         p->ultraenb =
  142.           (aic_inb(p, ULTRA_ENB) | (aic_inb(p, ULTRA_ENB + 1) << 8) );
  143.         sc->device_flags[i] = (p->discenable & mask) ? CFDISC : 0;
  144.         if (aic_inb(p, TARG_SCSIRATE + i) & WIDEXFER)
  145.           sc->device_flags[i] |= CFWIDEB;
  146.         if (p->features & AHC_ULTRA2)
  147.         {
  148.           if (aic_inb(p, TARG_OFFSET + i))
  149.           {
  150.             sc->device_flags[i] |= CFSYNCH;
  151.             sc->device_flags[i] |= (aic_inb(p, TARG_SCSIRATE + i) & 0x07);
  152.             if ( (aic_inb(p, TARG_SCSIRATE + i) & 0x18) == 0x18 )
  153.               sc->device_flags[i] |= CFSYNCHISULTRA;
  154.           }
  155.         }
  156.         else
  157.         {
  158.           if (aic_inb(p, TARG_SCSIRATE + i) & ~WIDEXFER)
  159.           {
  160.             sc->device_flags[i] |= CFSYNCH;
  161.             if (p->features & AHC_ULTRA)
  162.               sc->device_flags[i] |= ((p->ultraenb & mask) ?
  163.                                       CFSYNCHISULTRA : 0);
  164.           }
  165.         }
  166.       }
  167.       else
  168.       {
  169.         /*
  170.          * Assume the BIOS has NOT been run on this card and nothing between
  171.          * the card and the devices is configured yet.
  172.          */
  173.         sc->device_flags[i] = CFDISC;
  174.         if (p->features & AHC_WIDE)
  175.           sc->device_flags[i] |= CFWIDEB;
  176.         if (p->features & AHC_ULTRA3)
  177.           sc->device_flags[i] |= 2;
  178.         else if (p->features & AHC_ULTRA2)
  179.           sc->device_flags[i] |= 3;
  180.         else if (p->features & AHC_ULTRA)
  181.           sc->device_flags[i] |= CFSYNCHISULTRA;
  182.         sc->device_flags[i] |= CFSYNCH;
  183.         aic_outb(p, 0, TARG_SCSIRATE + i);
  184.         if (p->features & AHC_ULTRA2)
  185.           aic_outb(p, 0, TARG_OFFSET + i);
  186.       }
  187.     }
  188.     if (sc->device_flags[i] & CFDISC)
  189.     {
  190.       p->discenable |= mask;
  191.     }
  192.     if (p->flags & AHC_NEWEEPROM_FMT)
  193.     {
  194.       if ( !(p->features & AHC_ULTRA2) )
  195.       {
  196.         /*
  197.          * I know of two different Ultra BIOSes that do this differently.
  198.          * One on the Gigabyte 6BXU mb that wants flags[i] & CFXFER to
  199.          * be == to 0x03 and SYNCHISULTRA to be true to mean 40MByte/s
  200.          * while on the IBM Netfinity 5000 they want the same thing
  201.          * to be something else, while flags[i] & CFXFER == 0x03 and
  202.          * SYNCHISULTRA false should be 40MByte/s.  So, we set both to
  203.          * 40MByte/s and the lower speeds be damned.  People will have
  204.          * to select around the conversely mapped lower speeds in order
  205.          * to select lower speeds on these boards.
  206.          */
  207.         if ( (sc->device_flags[i] & CFNEWULTRAFORMAT) &&
  208.             ((sc->device_flags[i] & CFXFER) == 0x03) )
  209.         {
  210.           sc->device_flags[i] &= ~CFXFER;
  211.           sc->device_flags[i] |= CFSYNCHISULTRA;
  212.         }
  213.         if (sc->device_flags[i] & CFSYNCHISULTRA)
  214.         {
  215.           p->ultraenb |= mask;
  216.         }
  217.       }
  218.       else if ( !(sc->device_flags[i] & CFNEWULTRAFORMAT) &&
  219.                  (p->features & AHC_ULTRA2) &&
  220.  (sc->device_flags[i] & CFSYNCHISULTRA) )
  221.       {
  222.         p->ultraenb |= mask;
  223.       }
  224.     }
  225.     else if (sc->adapter_control & CFULTRAEN)
  226.     {
  227.       p->ultraenb |= mask;
  228.     }
  229.     if ( (sc->device_flags[i] & CFSYNCH) == 0)
  230.     {
  231.       sc->device_flags[i] &= ~CFXFER;
  232.       p->ultraenb &= ~mask;
  233.       p->transinfo[i].user_offset = 0;
  234.       p->transinfo[i].user_period = 0;
  235.       p->transinfo[i].user_options = 0;
  236.       p->transinfo[i].cur_offset = 0;
  237.       p->transinfo[i].cur_period = 0;
  238.       p->transinfo[i].cur_options = 0;
  239.       p->needsdtr_copy &= ~mask;
  240.     }
  241.     else
  242.     {
  243.       if (p->features & AHC_ULTRA3)
  244.       {
  245.         p->transinfo[i].user_offset = MAX_OFFSET_ULTRA2;
  246.         p->transinfo[i].cur_offset = aic_inb(p, TARG_OFFSET + i);
  247.         if( (sc->device_flags[i] & CFXFER) < 0x03 )
  248.         {
  249.           scsirate = (sc->device_flags[i] & CFXFER);
  250.           p->transinfo[i].user_options = MSG_EXT_PPR_OPTION_DT_CRC;
  251.           if( (aic_inb(p, TARG_SCSIRATE + i) & CFXFER) < 0x03 )
  252.           {
  253.             p->transinfo[i].cur_options = 
  254.               ((aic_inb(p, TARG_SCSIRATE + i) & 0x40) ?
  255.                  MSG_EXT_PPR_OPTION_DT_CRC : MSG_EXT_PPR_OPTION_DT_UNITS);
  256.           }
  257.           else
  258.           {
  259.             p->transinfo[i].cur_options = 0;
  260.           }
  261.         }
  262.         else
  263.         {
  264.           scsirate = (sc->device_flags[i] & CFXFER) |
  265.                      ((p->ultraenb & mask) ? 0x18 : 0x10);
  266.           p->transinfo[i].user_options = 0;
  267.           p->transinfo[i].cur_options = 0;
  268.         }
  269.         p->transinfo[i].user_period = aic7xxx_find_period(p, scsirate,
  270.                                        AHC_SYNCRATE_ULTRA3);
  271.         p->transinfo[i].cur_period = aic7xxx_find_period(p,
  272.                                        aic_inb(p, TARG_SCSIRATE + i),
  273.                                        AHC_SYNCRATE_ULTRA3);
  274.       }
  275.       else if (p->features & AHC_ULTRA2)
  276.       {
  277.         p->transinfo[i].user_offset = MAX_OFFSET_ULTRA2;
  278.         p->transinfo[i].cur_offset = aic_inb(p, TARG_OFFSET + i);
  279.         scsirate = (sc->device_flags[i] & CFXFER) |
  280.                    ((p->ultraenb & mask) ? 0x18 : 0x10);
  281.         p->transinfo[i].user_options = 0;
  282.         p->transinfo[i].cur_options = 0;
  283.         p->transinfo[i].user_period = aic7xxx_find_period(p, scsirate,
  284.                                        AHC_SYNCRATE_ULTRA2);
  285.         p->transinfo[i].cur_period = aic7xxx_find_period(p,
  286.                                        aic_inb(p, TARG_SCSIRATE + i),
  287.                                        AHC_SYNCRATE_ULTRA2);
  288.       }
  289.       else
  290.       {
  291.         scsirate = (sc->device_flags[i] & CFXFER) << 4;
  292.         p->transinfo[i].user_options = 0;
  293.         p->transinfo[i].cur_options = 0;
  294.         p->transinfo[i].user_offset = MAX_OFFSET_8BIT;
  295.         if (p->features & AHC_ULTRA)
  296.         {
  297.           short ultraenb;
  298.           ultraenb = aic_inb(p, ULTRA_ENB) |
  299.             (aic_inb(p, ULTRA_ENB + 1) << 8);
  300.           p->transinfo[i].user_period = aic7xxx_find_period(p,
  301.                                           scsirate,
  302.                                           (p->ultraenb & mask) ?
  303.                                           AHC_SYNCRATE_ULTRA :
  304.                                           AHC_SYNCRATE_FAST);
  305.           p->transinfo[i].cur_period = aic7xxx_find_period(p,
  306.                                          aic_inb(p, TARG_SCSIRATE + i),
  307.                                          (ultraenb & mask) ? 
  308.                                          AHC_SYNCRATE_ULTRA :
  309.                                          AHC_SYNCRATE_FAST);
  310.         }
  311.         else
  312.           p->transinfo[i].user_period = aic7xxx_find_period(p,
  313.                                           scsirate, AHC_SYNCRATE_FAST);
  314.       }
  315.       p->needsdtr_copy |= mask;
  316.     }
  317.     if ( (sc->device_flags[i] & CFWIDEB) && (p->features & AHC_WIDE) )
  318.     {
  319.       p->transinfo[i].user_width = MSG_EXT_WDTR_BUS_16_BIT;
  320.       p->needwdtr_copy |= mask;
  321.     }
  322.     else
  323.     {
  324.       p->transinfo[i].user_width = MSG_EXT_WDTR_BUS_8_BIT;
  325.       p->needwdtr_copy &= ~mask;
  326.     }
  327.     p->transinfo[i].cur_width =
  328.       (aic_inb(p, TARG_SCSIRATE + i) & WIDEXFER) ?
  329.       MSG_EXT_WDTR_BUS_16_BIT : MSG_EXT_WDTR_BUS_8_BIT;
  330.   }
  331.   aic_outb(p, ~(p->discenable & 0xFF), DISC_DSB);
  332.   aic_outb(p, ~((p->discenable >> 8) & 0xFF), DISC_DSB + 1);
  333.   p->needppr = p->needppr_copy = 0;
  334.   p->needwdtr = p->needwdtr_copy;
  335.   p->needsdtr = p->needsdtr_copy;
  336.   p->dtr_pending = 0;
  337.   /*
  338.    * We set the p->ultraenb from the SEEPROM to begin with, but now we make
  339.    * it match what is already down in the card.  If we are doing a reset
  340.    * on the card then this will get put back to a default state anyway.
  341.    * This allows us to not have to pre-emptively negotiate when using the
  342.    * no_reset option.
  343.    */
  344.   if (p->features & AHC_ULTRA)
  345.     p->ultraenb = aic_inb(p, ULTRA_ENB) | (aic_inb(p, ULTRA_ENB + 1) << 8);
  346.   
  347.   scsi_conf = (p->scsi_id & HSCSIID);
  348.   if(have_seeprom)
  349.   {
  350.     p->adapter_control = sc->adapter_control;
  351.     p->bios_control = sc->bios_control;
  352.     switch (p->chip & AHC_CHIPID_MASK)
  353.     {
  354.       case AHC_AIC7895:
  355.       case AHC_AIC7896:
  356.       case AHC_AIC7899:
  357.         if (p->adapter_control & CFBPRIMARY)
  358.           p->flags |= AHC_CHANNEL_B_PRIMARY;
  359.       default:
  360.         break;
  361.     }
  362.     if (sc->adapter_control & CFSPARITY)
  363.       scsi_conf |= ENSPCHK;
  364.   }
  365.   else
  366.   {
  367.     scsi_conf |= ENSPCHK | RESET_SCSI;
  368.   }
  369.   /*
  370.    * Only set the SCSICONF and SCSICONF + 1 registers if we are a PCI card.
  371.    * The 2842 and 2742 cards already have these registers set and we don't
  372.    * want to muck with them since we don't set all the bits they do.
  373.    */
  374.   if ( (p->chip & ~AHC_CHIPID_MASK) == AHC_PCI )
  375.   {
  376.     /* Set the host ID */
  377.     aic_outb(p, scsi_conf, SCSICONF);
  378.     /* In case we are a wide card */
  379.     aic_outb(p, p->scsi_id, SCSICONF + 1);
  380.   }
  381. }
  382. /*+F*************************************************************************
  383.  * Function:
  384.  *   aic7xxx_configure_bugs
  385.  *
  386.  * Description:
  387.  *   Take the card passed in and set the appropriate bug flags based upon
  388.  *   the card model.  Also make any changes needed to device registers or
  389.  *   PCI registers while we are here.
  390.  *-F*************************************************************************/
  391. static void
  392. aic7xxx_configure_bugs(struct aic7xxx_host *p)
  393. {
  394.   unsigned short tmp_word;
  395.  
  396.   switch(p->chip & AHC_CHIPID_MASK)
  397.   {
  398.     case AHC_AIC7860:
  399.       p->bugs |= AHC_BUG_PCI_2_1_RETRY;
  400.       /* fall through */
  401.     case AHC_AIC7850:
  402.     case AHC_AIC7870:
  403.       p->bugs |= AHC_BUG_TMODE_WIDEODD | AHC_BUG_CACHETHEN | AHC_BUG_PCI_MWI;
  404.       break;
  405.     case AHC_AIC7880:
  406.       p->bugs |= AHC_BUG_TMODE_WIDEODD | AHC_BUG_PCI_2_1_RETRY |
  407.                  AHC_BUG_CACHETHEN | AHC_BUG_PCI_MWI;
  408.       break;
  409.     case AHC_AIC7890:
  410.       p->bugs |= AHC_BUG_AUTOFLUSH | AHC_BUG_CACHETHEN;
  411.       break;
  412.     case AHC_AIC7892:
  413.       p->bugs |= AHC_BUG_SCBCHAN_UPLOAD;
  414.       break;
  415.     case AHC_AIC7895:
  416.       p->bugs |= AHC_BUG_TMODE_WIDEODD | AHC_BUG_PCI_2_1_RETRY |
  417.                  AHC_BUG_CACHETHEN | AHC_BUG_PCI_MWI;
  418.       break;
  419.     case AHC_AIC7896:
  420.       p->bugs |= AHC_BUG_CACHETHEN_DIS;
  421.       break;
  422.     case AHC_AIC7899:
  423.       p->bugs |= AHC_BUG_SCBCHAN_UPLOAD;
  424.       break;
  425.     default:
  426.       /* Nothing to do */
  427.       break;
  428.   }
  429.   /*
  430.    * Now handle the bugs that require PCI register or card register tweaks
  431.    */
  432.   pci_read_config_word(p->pdev, PCI_COMMAND, &tmp_word);
  433.   if(p->bugs & AHC_BUG_PCI_MWI)
  434.   {
  435.     tmp_word &= ~PCI_COMMAND_INVALIDATE;
  436.   }
  437.   else
  438.   {
  439.     tmp_word |= PCI_COMMAND_INVALIDATE;
  440.   }
  441.   pci_write_config_word(p->pdev, PCI_COMMAND, tmp_word);
  442.   if(p->bugs & AHC_BUG_CACHETHEN)
  443.   {
  444.     aic_outb(p, aic_inb(p, DSCOMMAND0) & ~CACHETHEN, DSCOMMAND0);
  445.   }
  446.   else if (p->bugs & AHC_BUG_CACHETHEN_DIS)
  447.   {
  448.     aic_outb(p, aic_inb(p, DSCOMMAND0) | CACHETHEN, DSCOMMAND0);
  449.   }
  450.   return;
  451. }
  452. /*+F*************************************************************************
  453.  * Function:
  454.  *   aic7xxx_detect
  455.  *
  456.  * Description:
  457.  *   Try to detect and register an Adaptec 7770 or 7870 SCSI controller.
  458.  *
  459.  * XXX - This should really be called aic7xxx_probe().  A sequence of
  460.  *       probe(), attach()/detach(), and init() makes more sense than
  461.  *       one do-it-all function.  This may be useful when (and if) the
  462.  *       mid-level SCSI code is overhauled.
  463.  *-F*************************************************************************/
  464. int
  465. aic7xxx_detect(Scsi_Host_Template *template)
  466. {
  467.   struct aic7xxx_host *temp_p = NULL;
  468.   struct aic7xxx_host *current_p = NULL;
  469.   struct aic7xxx_host *list_p = NULL;
  470.   int found = 0;
  471. #if defined(__i386__) || defined(__alpha__)
  472.   ahc_flag_type flags = 0;
  473.   int type;
  474. #endif
  475.   unsigned char sxfrctl1;
  476. #if defined(__i386__) || defined(__alpha__)
  477.   unsigned char hcntrl, hostconf;
  478.   unsigned int slot, base;
  479. #endif
  480. #ifdef MODULE
  481.   /*
  482.    * If we are called as a module, the aic7xxx pointer may not be null
  483.    * and it would point to our bootup string, just like on the lilo
  484.    * command line.  IF not NULL, then process this config string with
  485.    * aic7xxx_setup
  486.    */
  487.   if(aic7xxx)
  488.     aic7xxx_setup(aic7xxx);
  489.   if(dummy_buffer[0] != 'P')
  490.     printk(KERN_WARNING "aic7xxx: Please read the file /usr/src/linux/drivers"
  491.       "/scsi/README.aic7xxxn"
  492.       "aic7xxx: to see the proper way to specify options to the aic7xxx "
  493.       "modulen"
  494.       "aic7xxx: Specifically, don't use any commas when passing arguments ton"
  495.       "aic7xxx: insmod or else it might trash certain memory areas.n");
  496. #endif
  497.   template->proc_name = "aic7xxx";
  498.   template->sg_tablesize = AIC7XXX_MAX_SG;
  499. #ifdef CONFIG_PCI
  500.   /*
  501.    * PCI-bus probe.
  502.    */
  503.   if (pci_present())
  504.   {
  505.     struct
  506.     {
  507.       unsigned short      vendor_id;
  508.       unsigned short      device_id;
  509.       ahc_chip            chip;
  510.       ahc_flag_type       flags;
  511.       ahc_feature         features;
  512.       int                 board_name_index;
  513.       unsigned short      seeprom_size;
  514.       unsigned short      seeprom_type;
  515.     } const aic_pdevs[] = {
  516.       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7810, AHC_NONE,
  517.        AHC_FNONE, AHC_FENONE,                                1,
  518.        32, C46 },
  519.       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7850, AHC_AIC7850,
  520.        AHC_PAGESCBS, AHC_AIC7850_FE,                         5,
  521.        32, C46 },
  522.       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7855, AHC_AIC7850,
  523.        AHC_PAGESCBS, AHC_AIC7850_FE,                         6,
  524.        32, C46 },
  525.       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7821, AHC_AIC7860,
  526.        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED,
  527.        AHC_AIC7860_FE,                                       7,
  528.        32, C46 },
  529.       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_3860, AHC_AIC7860,
  530.        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED,
  531.        AHC_AIC7860_FE,                                       7,
  532.        32, C46 },
  533.       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_38602, AHC_AIC7860,
  534.        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED,
  535.        AHC_AIC7860_FE,                                       7,
  536.        32, C46 },
  537.       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_38602, AHC_AIC7860,
  538.        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED,
  539.        AHC_AIC7860_FE,                                       7,
  540.        32, C46 },
  541.       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7860, AHC_AIC7860,
  542.        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED | AHC_MOTHERBOARD,
  543.        AHC_AIC7860_FE,                                       7,
  544.        32, C46 },
  545.       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7861, AHC_AIC7860,
  546.        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED,
  547.        AHC_AIC7860_FE,                                       8,
  548.        32, C46 },
  549.       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7870, AHC_AIC7870,
  550.        AHC_PAGESCBS | AHC_BIOS_ENABLED | AHC_MOTHERBOARD,
  551.        AHC_AIC7870_FE,                                       9,
  552.        32, C46 },
  553.       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7871, AHC_AIC7870,
  554.        AHC_PAGESCBS | AHC_BIOS_ENABLED, AHC_AIC7870_FE,     10,
  555.        32, C46 },
  556.       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7872, AHC_AIC7870,
  557.        AHC_PAGESCBS | AHC_BIOS_ENABLED | AHC_MULTI_CHANNEL,
  558.        AHC_AIC7870_FE,                                      11,
  559.        32, C56_66 },
  560.       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7873, AHC_AIC7870,
  561.        AHC_PAGESCBS | AHC_BIOS_ENABLED | AHC_MULTI_CHANNEL,
  562.        AHC_AIC7870_FE,                                      12,
  563.        32, C56_66 },
  564.       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7874, AHC_AIC7870,
  565.        AHC_PAGESCBS | AHC_BIOS_ENABLED, AHC_AIC7870_FE,     13,
  566.        32, C46 },
  567.       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7880, AHC_AIC7880,
  568.        AHC_PAGESCBS | AHC_BIOS_ENABLED | AHC_MOTHERBOARD,
  569.        AHC_AIC7880_FE,                                      14,
  570.        32, C46 },
  571.       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7881, AHC_AIC7880,
  572.        AHC_PAGESCBS | AHC_BIOS_ENABLED, AHC_AIC7880_FE,     15,
  573.        32, C46 },
  574.       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7882, AHC_AIC7880,
  575.        AHC_PAGESCBS | AHC_BIOS_ENABLED | AHC_MULTI_CHANNEL,
  576.        AHC_AIC7880_FE,                                      16,
  577.        32, C56_66 },
  578.       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7883, AHC_AIC7880,
  579.        AHC_PAGESCBS | AHC_BIOS_ENABLED | AHC_MULTI_CHANNEL,
  580.        AHC_AIC7880_FE,                                      17,
  581.        32, C56_66 },
  582.       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7884, AHC_AIC7880,
  583.        AHC_PAGESCBS | AHC_BIOS_ENABLED, AHC_AIC7880_FE,     18,
  584.        32, C46 },
  585.       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7885, AHC_AIC7880,
  586.        AHC_PAGESCBS | AHC_BIOS_ENABLED, AHC_AIC7880_FE,     18,
  587.        32, C46 },
  588.       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7886, AHC_AIC7880,
  589.        AHC_PAGESCBS | AHC_BIOS_ENABLED, AHC_AIC7880_FE,     18,
  590.        32, C46 },
  591.       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7887, AHC_AIC7880,
  592.        AHC_PAGESCBS | AHC_BIOS_ENABLED, AHC_AIC7880_FE | AHC_NEW_AUTOTERM, 19,
  593.        32, C46 },
  594.       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7888, AHC_AIC7880,
  595.        AHC_PAGESCBS | AHC_BIOS_ENABLED, AHC_AIC7880_FE,     18,
  596.        32, C46 },
  597.       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7895, AHC_AIC7895,
  598.        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED | AHC_MULTI_CHANNEL,
  599.        AHC_AIC7895_FE,                                      20,
  600.        32, C56_66 },
  601.       {PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_7890, AHC_AIC7890,
  602.        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED,
  603.        AHC_AIC7890_FE,                                      21,
  604.        32, C46 },
  605.       {PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_7890B, AHC_AIC7890,
  606.        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED,
  607.        AHC_AIC7890_FE,                                      21,
  608.        32, C46 },
  609.       {PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_2930U2, AHC_AIC7890,
  610.        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED,
  611.        AHC_AIC7890_FE,                                      22,
  612.        32, C46 },
  613.       {PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_2940U2, AHC_AIC7890,
  614.        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED,
  615.        AHC_AIC7890_FE,                                      23,
  616.        32, C46 },
  617.       {PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_7896, AHC_AIC7896,
  618.        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED | AHC_MULTI_CHANNEL,
  619.        AHC_AIC7896_FE,                                      24,
  620.        32, C56_66 },
  621.       {PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_3940U2, AHC_AIC7896,
  622.        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED | AHC_MULTI_CHANNEL,
  623.        AHC_AIC7896_FE,                                      25,
  624.        32, C56_66 },
  625.       {PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_3950U2D, AHC_AIC7896,
  626.        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED | AHC_MULTI_CHANNEL,
  627.        AHC_AIC7896_FE,                                      26,
  628.        32, C56_66 },
  629.       {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_1480A, AHC_AIC7860,
  630.        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED | AHC_NO_STPWEN,
  631.        AHC_AIC7860_FE,                                      27,
  632.        32, C46 },
  633.       {PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_7892A, AHC_AIC7892,
  634.        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED,
  635.        AHC_AIC7892_FE,                                      28,
  636.        32, C46 },
  637.       {PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_7892B, AHC_AIC7892,
  638.        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED,
  639.        AHC_AIC7892_FE,                                      28,
  640.        32, C46 },
  641.       {PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_7892D, AHC_AIC7892,
  642.        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED,
  643.        AHC_AIC7892_FE,                                      28,
  644.        32, C46 },
  645.       {PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_7892P, AHC_AIC7892,
  646.        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED,
  647.        AHC_AIC7892_FE,                                      28,
  648.        32, C46 },
  649.       {PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_7899A, AHC_AIC7899,
  650.        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED | AHC_MULTI_CHANNEL,
  651.        AHC_AIC7899_FE,                                      29,
  652.        32, C56_66 },
  653.       {PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_7899B, AHC_AIC7899,
  654.        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED | AHC_MULTI_CHANNEL,
  655.        AHC_AIC7899_FE,                                      29,
  656.        32, C56_66 },
  657.       {PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_7899D, AHC_AIC7899,
  658.        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED | AHC_MULTI_CHANNEL,
  659.        AHC_AIC7899_FE,                                      29,
  660.        32, C56_66 },
  661.       {PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_7899P, AHC_AIC7899,
  662.        AHC_PAGESCBS | AHC_NEWEEPROM_FMT | AHC_BIOS_ENABLED | AHC_MULTI_CHANNEL,
  663.        AHC_AIC7899_FE,                                      29,
  664.        32, C56_66 },
  665.     };
  666.     unsigned short command;
  667.     unsigned int  devconfig, i, oldverbose;
  668.     struct pci_dev *pdev = NULL;
  669.     for (i = 0; i < NUMBER(aic_pdevs); i++)
  670.     {
  671.       pdev = NULL;
  672.       while ((pdev = pci_find_device(aic_pdevs[i].vendor_id,
  673.                                      aic_pdevs[i].device_id,
  674.                                      pdev))) {
  675. if (pci_enable_device(pdev))
  676. continue;
  677.         if ( i == 0 ) /* We found one, but it's the 7810 RAID cont. */
  678.         {
  679.           if (aic7xxx_verbose & (VERBOSE_PROBE|VERBOSE_PROBE2))
  680.           {
  681.             printk(KERN_INFO "aic7xxx: The 7810 RAID controller is not "
  682.               "supported byn");
  683.             printk(KERN_INFO "         this driver, we are ignoring it.n");
  684.           }
  685.         }
  686.         else if ( (temp_p = kmalloc(sizeof(struct aic7xxx_host),
  687.                                     GFP_ATOMIC)) != NULL )
  688.         {
  689.           memset(temp_p, 0, sizeof(struct aic7xxx_host));
  690.           temp_p->chip = aic_pdevs[i].chip | AHC_PCI;
  691.           temp_p->flags = aic_pdevs[i].flags;
  692.           temp_p->features = aic_pdevs[i].features;
  693.           temp_p->board_name_index = aic_pdevs[i].board_name_index;
  694.           temp_p->sc_size = aic_pdevs[i].seeprom_size;
  695.           temp_p->sc_type = aic_pdevs[i].seeprom_type;
  696.           /*
  697.            * Read sundry information from PCI BIOS.
  698.            */
  699.           temp_p->irq = pdev->irq;
  700.           temp_p->pdev = pdev;
  701.           temp_p->pci_bus = pdev->bus->number;
  702.           temp_p->pci_device_fn = pdev->devfn;
  703.           temp_p->base = pci_resource_start(pdev, 0);
  704.           temp_p->mbase = pci_resource_start(pdev, 1);
  705.           current_p = list_p;
  706.   while(current_p && temp_p)
  707.   {
  708.     if ( ((current_p->pci_bus == temp_p->pci_bus) &&
  709.           (current_p->pci_device_fn == temp_p->pci_device_fn)) ||
  710.                  (temp_p->base && (current_p->base == temp_p->base)) ||
  711.                  (temp_p->mbase && (current_p->mbase == temp_p->mbase)) )
  712.     {
  713.               /* duplicate PCI entry, skip it */
  714.       kfree(temp_p);
  715.       temp_p = NULL;
  716.     }
  717.     current_p = current_p->next;
  718.   }
  719.   if ( temp_p == NULL )
  720.             continue;
  721.           if (aic7xxx_verbose & VERBOSE_PROBE2)
  722.             printk("aic7xxx: <%s> at PCI %d/%dn", 
  723.               board_names[aic_pdevs[i].board_name_index],
  724.               PCI_SLOT(pdev->devfn),
  725.               PCI_FUNC(pdev->devfn));
  726.           pci_read_config_word(pdev, PCI_COMMAND, &command);
  727.           if (aic7xxx_verbose & VERBOSE_PROBE2)
  728.           {
  729.             printk("aic7xxx: Initial PCI_COMMAND value was 0x%xn",
  730.               (int)command);
  731.           }
  732. #ifdef AIC7XXX_STRICT_PCI_SETUP
  733.           command |= PCI_COMMAND_SERR | PCI_COMMAND_PARITY |
  734.             PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY | PCI_COMMAND_IO;
  735. #else
  736.           command |= PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY | PCI_COMMAND_IO;
  737. #endif
  738.           command &= ~PCI_COMMAND_INVALIDATE;
  739.           if (aic7xxx_pci_parity == 0)
  740.             command &= ~(PCI_COMMAND_SERR | PCI_COMMAND_PARITY);
  741.           pci_write_config_word(pdev, PCI_COMMAND, command);
  742. #ifdef AIC7XXX_STRICT_PCI_SETUP
  743.           pci_read_config_dword(pdev, DEVCONFIG, &devconfig);
  744.           if (aic7xxx_verbose & VERBOSE_PROBE2)
  745.           {
  746.             printk("aic7xxx: Initial DEVCONFIG value was 0x%xn", devconfig);
  747.           }
  748.           devconfig |= 0x80000040;
  749.           pci_write_config_dword(pdev, DEVCONFIG, devconfig);
  750. #endif /* AIC7XXX_STRICT_PCI_SETUP */
  751.           if(temp_p->base && check_region(temp_p->base, MAXREG - MINREG))
  752.           {
  753.             printk("aic7xxx: <%s> at PCI %d/%d/%dn", 
  754.               board_names[aic_pdevs[i].board_name_index],
  755.               temp_p->pci_bus,
  756.               PCI_SLOT(temp_p->pci_device_fn),
  757.               PCI_FUNC(temp_p->pci_device_fn));
  758.             printk("aic7xxx: I/O ports already in use, ignoring.n");
  759.             kfree(temp_p);
  760.             temp_p = NULL;
  761.             continue;
  762.           }
  763.           temp_p->unpause = INTEN;
  764.           temp_p->pause = temp_p->unpause | PAUSE;
  765.           if ( ((temp_p->base == 0) &&
  766.                 (temp_p->mbase == 0)) ||
  767.                (temp_p->irq == 0) )
  768.           {
  769.             printk("aic7xxx: <%s> at PCI %d/%d/%dn", 
  770.               board_names[aic_pdevs[i].board_name_index],
  771.               temp_p->pci_bus,
  772.               PCI_SLOT(temp_p->pci_device_fn),
  773.               PCI_FUNC(temp_p->pci_device_fn));
  774.             printk("aic7xxx: Controller disabled by BIOS, ignoring.n");
  775.             kfree(temp_p);
  776.             temp_p = NULL;
  777.             continue;
  778.           }
  779. #ifdef MMAPIO
  780.           if ( !(temp_p->base) || !(temp_p->flags & AHC_MULTI_CHANNEL) ||
  781.                ((temp_p->chip != (AHC_AIC7870 | AHC_PCI)) &&
  782.                 (temp_p->chip != (AHC_AIC7880 | AHC_PCI))) )
  783.           {
  784.             unsigned long page_offset, base;
  785.             base = temp_p->mbase & PAGE_MASK;
  786.             page_offset = temp_p->mbase - base;
  787.             temp_p->maddr = ioremap_nocache(base, page_offset + 256);
  788.             if(temp_p->maddr)
  789.             {
  790.               temp_p->maddr += page_offset;
  791.               /*
  792.                * We need to check the I/O with the MMAPed address.  Some machines
  793.                * simply fail to work with MMAPed I/O and certain controllers.
  794.                */
  795.               if(aic_inb(temp_p, HCNTRL) == 0xff)
  796.               {
  797.                 /*
  798.                  * OK.....we failed our test....go back to programmed I/O
  799.                  */
  800.                 printk(KERN_INFO "aic7xxx: <%s> at PCI %d/%d/%dn", 
  801.                   board_names[aic_pdevs[i].board_name_index],
  802.                   temp_p->pci_bus,
  803.                   PCI_SLOT(temp_p->pci_device_fn),
  804.                   PCI_FUNC(temp_p->pci_device_fn));
  805.                 printk(KERN_INFO "aic7xxx: MMAPed I/O failed, reverting to "
  806.                                  "Programmed I/O.n");
  807.                 iounmap((void *) (((unsigned long) temp_p->maddr) & PAGE_MASK));
  808.                 temp_p->maddr = 0;
  809.                 if(temp_p->base == 0)
  810.                 {
  811.                   printk("aic7xxx: <%s> at PCI %d/%d/%dn", 
  812.                     board_names[aic_pdevs[i].board_name_index],
  813.                     temp_p->pci_bus,
  814.                     PCI_SLOT(temp_p->pci_device_fn),
  815.                     PCI_FUNC(temp_p->pci_device_fn));
  816.                   printk("aic7xxx: Controller disabled by BIOS, ignoring.n");
  817.                   kfree(temp_p);
  818.                   temp_p = NULL;
  819.                   continue;
  820.                 }
  821.               }
  822.             }
  823.           }
  824. #endif
  825.           /*
  826.            * Lock out other contenders for our i/o space.
  827.            */
  828.           if(temp_p->base)
  829.             request_region(temp_p->base, MAXREG - MINREG, "aic7xxx");
  830.           /*
  831.            * We HAVE to make sure the first pause_sequencer() and all other
  832.            * subsequent I/O that isn't PCI config space I/O takes place
  833.            * after the MMAPed I/O region is configured and tested.  The
  834.            * problem is the PowerPC architecture that doesn't support
  835.            * programmed I/O at all, so we have to have the MMAP I/O set up
  836.            * for this pause to even work on those machines.
  837.            */
  838.           pause_sequencer(temp_p);
  839.           /*
  840.            * Clear out any pending PCI error status messages.  Also set
  841.            * verbose to 0 so that we don't emit strange PCI error messages
  842.            * while cleaning out the current status bits.
  843.            */
  844.           oldverbose = aic7xxx_verbose;
  845.           aic7xxx_verbose = 0;
  846.           aic7xxx_pci_intr(temp_p);
  847.           aic7xxx_verbose = oldverbose;
  848.           temp_p->bios_address = 0;
  849.           /*
  850.            * Remember how the card was setup in case there is no seeprom.
  851.            */
  852.           if (temp_p->features & AHC_ULTRA2)
  853.             temp_p->scsi_id = aic_inb(temp_p, SCSIID_ULTRA2) & OID;
  854.           else
  855.             temp_p->scsi_id = aic_inb(temp_p, SCSIID) & OID;
  856.           /*
  857.            * Get current termination setting
  858.            */
  859.           sxfrctl1 = aic_inb(temp_p, SXFRCTL1);
  860.           if (aic7xxx_chip_reset(temp_p) == -1)
  861.           {
  862.             release_region(temp_p->base, MAXREG - MINREG);
  863.             kfree(temp_p);
  864.             temp_p = NULL;
  865.             continue;
  866.           }
  867.           /*
  868.            * Very quickly put the term setting back into the register since
  869.            * the chip reset may cause odd things to happen.  This is to keep
  870.            * LVD busses with lots of drives from draining the power out of
  871.            * the diffsense line before we get around to running the
  872.            * configure_termination() function.  Also restore the STPWLEVEL
  873.            * bit of DEVCONFIG
  874.            */
  875.           aic_outb(temp_p, sxfrctl1, SXFRCTL1);
  876.           pci_write_config_dword(temp_p->pdev, DEVCONFIG, devconfig);
  877.           sxfrctl1 &= STPWEN;
  878.           /*
  879.            * We need to set the CHNL? assignments before loading the SEEPROM
  880.            * The 3940 and 3985 cards (original stuff, not any of the later
  881.            * stuff) are 7870 and 7880 class chips.  The Ultra2 stuff falls
  882.            * under 7896 and 7897.  The 7895 is in a class by itself :)
  883.            */
  884.           switch (temp_p->chip & AHC_CHIPID_MASK)
  885.           {
  886.             case AHC_AIC7870: /* 3840 / 3985 */
  887.             case AHC_AIC7880: /* 3840 UW / 3985 UW */
  888.               if(temp_p->flags & AHC_MULTI_CHANNEL)
  889.               {
  890.                 switch(PCI_SLOT(temp_p->pci_device_fn))
  891.                 {
  892.                   case 5:
  893.                     temp_p->flags |= AHC_CHNLB;
  894.                     break;
  895.                   case 8:
  896.                     temp_p->flags |= AHC_CHNLB;
  897.                     break;
  898.                   case 12:
  899.                     temp_p->flags |= AHC_CHNLC;
  900.                     break;
  901.                   default:
  902.                     break;
  903.                 }
  904.               }
  905.               break;
  906.             case AHC_AIC7895: /* 7895 */
  907.             case AHC_AIC7896: /* 7896/7 */
  908.             case AHC_AIC7899: /* 7899 */
  909.               if (PCI_FUNC(pdev->devfn) != 0)
  910.               {
  911.                 temp_p->flags |= AHC_CHNLB;
  912.               }
  913.               /*
  914.                * The 7895 is the only chipset that sets the SCBSIZE32 param
  915.                * in the DEVCONFIG register.  The Ultra2 chipsets use
  916.                * the DSCOMMAND0 register instead.
  917.                */
  918.               if ((temp_p->chip & AHC_CHIPID_MASK) == AHC_AIC7895)
  919.               {
  920.                 pci_read_config_dword(pdev, DEVCONFIG, &devconfig);
  921.                 devconfig |= SCBSIZE32;
  922.                 pci_write_config_dword(pdev, DEVCONFIG, devconfig);
  923.               }
  924.               break;
  925.             default:
  926.               break;
  927.           }
  928.           /*
  929.            * Loading of the SEEPROM needs to come after we've set the flags
  930.            * to indicate possible CHNLB and CHNLC assigments.  Otherwise,
  931.            * on 394x and 398x cards we'll end up reading the wrong settings
  932.            * for channels B and C
  933.            */
  934.           switch (temp_p->chip & AHC_CHIPID_MASK)
  935.           {
  936.             case AHC_AIC7892:
  937.             case AHC_AIC7899:
  938.               aic_outb(temp_p, 0, SCAMCTL);
  939.               /*
  940.                * Switch to the alt mode of the chip...
  941.                */
  942.               aic_outb(temp_p, aic_inb(temp_p, SFUNCT) | ALT_MODE, SFUNCT);
  943.               /*
  944.                * Set our options...the last two items set our CRC after x byte
  945.        * count in target mode...
  946.                */
  947.               aic_outb(temp_p, AUTO_MSGOUT_DE | DIS_MSGIN_DUALEDGE, OPTIONMODE);
  948.       aic_outb(temp_p, 0x00, 0x0b);
  949.       aic_outb(temp_p, 0x10, 0x0a);
  950.               /*
  951.                * switch back to normal mode...
  952.                */
  953.               aic_outb(temp_p, aic_inb(temp_p, SFUNCT) & ~ALT_MODE, SFUNCT);
  954.               aic_outb(temp_p, CRCVALCHKEN | CRCENDCHKEN | CRCREQCHKEN |
  955.        TARGCRCENDEN | TARGCRCCNTEN,
  956.                        CRCCONTROL1);
  957.               aic_outb(temp_p, ((aic_inb(temp_p, DSCOMMAND0) | USCBSIZE32 |
  958.                                  MPARCKEN | CIOPARCKEN | CACHETHEN) & 
  959.                                ~DPARCKEN), DSCOMMAND0);
  960.               aic7xxx_load_seeprom(temp_p, &sxfrctl1);
  961.               break;
  962.             case AHC_AIC7890:
  963.             case AHC_AIC7896:
  964.               aic_outb(temp_p, 0, SCAMCTL);
  965.               aic_outb(temp_p, (aic_inb(temp_p, DSCOMMAND0) |
  966.                                 CACHETHEN | MPARCKEN | USCBSIZE32 |
  967.                                 CIOPARCKEN) & ~DPARCKEN, DSCOMMAND0);
  968.               aic7xxx_load_seeprom(temp_p, &sxfrctl1);
  969.               break;
  970.             case AHC_AIC7850:
  971.             case AHC_AIC7860:
  972.               /*
  973.                * Set the DSCOMMAND0 register on these cards different from
  974.                * on the 789x cards.  Also, read the SEEPROM as well.
  975.                */
  976.               aic_outb(temp_p, (aic_inb(temp_p, DSCOMMAND0) |
  977.                                 CACHETHEN | MPARCKEN) & ~DPARCKEN,
  978.                        DSCOMMAND0);
  979.               /* FALLTHROUGH */
  980.             default:
  981.               aic7xxx_load_seeprom(temp_p, &sxfrctl1);
  982.               break;
  983.             case AHC_AIC7880:
  984.               /*
  985.                * Check the rev of the chipset before we change DSCOMMAND0
  986.                */
  987.               pci_read_config_dword(pdev, DEVCONFIG, &devconfig);
  988.               if ((devconfig & 0xff) >= 1)
  989.               {
  990.                 aic_outb(temp_p, (aic_inb(temp_p, DSCOMMAND0) |
  991.                                   CACHETHEN | MPARCKEN) & ~DPARCKEN,
  992.                          DSCOMMAND0);
  993.               }
  994.               aic7xxx_load_seeprom(temp_p, &sxfrctl1);
  995.               break;
  996.           }
  997.           
  998.           /*
  999.            * and then we need another switch based on the type in order to
  1000.            * make sure the channel B primary flag is set properly on 7895
  1001.            * controllers....Arrrgggghhh!!!  We also have to catch the fact
  1002.            * that when you disable the BIOS on the 7895 on the Intel DK440LX
  1003.            * motherboard, and possibly others, it only sets the BIOS disabled
  1004.            * bit on the A channel...I think I'm starting to lean towards
  1005.            * going postal....
  1006.            */
  1007.           switch(temp_p->chip & AHC_CHIPID_MASK)
  1008.           {
  1009.             case AHC_AIC7895:
  1010.             case AHC_AIC7896:
  1011.             case AHC_AIC7899:
  1012.               current_p = list_p;
  1013.               while(current_p != NULL)
  1014.               {
  1015.                 if ( (current_p->pci_bus == temp_p->pci_bus) &&
  1016.                      (PCI_SLOT(current_p->pci_device_fn) ==
  1017.                       PCI_SLOT(temp_p->pci_device_fn)) )
  1018.                 {
  1019.                   if ( PCI_FUNC(current_p->pci_device_fn) == 0 )
  1020.                   {
  1021.                     temp_p->flags |= 
  1022.                       (current_p->flags & AHC_CHANNEL_B_PRIMARY);
  1023.                     temp_p->flags &= ~(AHC_BIOS_ENABLED|AHC_USEDEFAULTS);
  1024.                     temp_p->flags |=
  1025.                       (current_p->flags & (AHC_BIOS_ENABLED|AHC_USEDEFAULTS));
  1026.                   }
  1027.                   else
  1028.                   {
  1029.                     current_p->flags |=
  1030.                       (temp_p->flags & AHC_CHANNEL_B_PRIMARY);
  1031.                     current_p->flags &= ~(AHC_BIOS_ENABLED|AHC_USEDEFAULTS);
  1032.                     current_p->flags |=
  1033.                       (temp_p->flags & (AHC_BIOS_ENABLED|AHC_USEDEFAULTS));
  1034.                   }
  1035.                 }
  1036.                 current_p = current_p->next;
  1037.               }
  1038.               break;
  1039.             default:
  1040.               break;
  1041.           }
  1042.           /*
  1043.            * We only support external SCB RAM on the 7895/6/7 chipsets.
  1044.            * We could support it on the 7890/1 easy enough, but I don't
  1045.            * know of any 7890/1 based cards that have it.  I do know
  1046.            * of 7895/6/7 cards that have it and they work properly.
  1047.            */
  1048.           switch(temp_p->chip & AHC_CHIPID_MASK)
  1049.           {
  1050.             default:
  1051.               break;
  1052.             case AHC_AIC7895:
  1053.             case AHC_AIC7896:
  1054.             case AHC_AIC7899:
  1055.               pci_read_config_dword(pdev, DEVCONFIG, &devconfig);
  1056.               if (temp_p->features & AHC_ULTRA2)
  1057.               {
  1058.                 if ( (aic_inb(temp_p, DSCOMMAND0) & RAMPSM_ULTRA2) &&
  1059.                      (aic7xxx_scbram) )
  1060.                 {
  1061.                   aic_outb(temp_p,
  1062.                            aic_inb(temp_p, DSCOMMAND0) & ~SCBRAMSEL_ULTRA2,
  1063.                            DSCOMMAND0);
  1064.                   temp_p->flags |= AHC_EXTERNAL_SRAM;
  1065.                   devconfig |= EXTSCBPEN;
  1066.                 }
  1067.                 else if (aic_inb(temp_p, DSCOMMAND0) & RAMPSM_ULTRA2)
  1068.                 {
  1069.                   printk(KERN_INFO "aic7xxx: <%s> at PCI %d/%d/%dn", 
  1070.                     board_names[aic_pdevs[i].board_name_index],
  1071.                     temp_p->pci_bus,
  1072.                     PCI_SLOT(temp_p->pci_device_fn),
  1073.                     PCI_FUNC(temp_p->pci_device_fn));
  1074.                   printk("aic7xxx: external SCB RAM detected, "
  1075.                          "but not enabledn");
  1076.                 }
  1077.               }
  1078.               else
  1079.               {
  1080.                 if ((devconfig & RAMPSM) && (aic7xxx_scbram))
  1081.                 {
  1082.                   devconfig &= ~SCBRAMSEL;
  1083.                   devconfig |= EXTSCBPEN;
  1084.                   temp_p->flags |= AHC_EXTERNAL_SRAM;
  1085.                 }
  1086.                 else if (devconfig & RAMPSM)
  1087.                 {
  1088.                   printk(KERN_INFO "aic7xxx: <%s> at PCI %d/%d/%dn", 
  1089.                     board_names[aic_pdevs[i].board_name_index],
  1090.                     temp_p->pci_bus,
  1091.                     PCI_SLOT(temp_p->pci_device_fn),
  1092.                     PCI_FUNC(temp_p->pci_device_fn));
  1093.                   printk("aic7xxx: external SCB RAM detected, "
  1094.                          "but not enabledn");
  1095.                 }
  1096.               }
  1097.               pci_write_config_dword(pdev, DEVCONFIG, devconfig);
  1098.               if ( (temp_p->flags & AHC_EXTERNAL_SRAM) &&
  1099.                    (temp_p->flags & AHC_CHNLB) )
  1100.                 aic_outb(temp_p, 1, CCSCBBADDR);
  1101.               break;
  1102.           }
  1103.           /*
  1104.            * Take the LED out of diagnostic mode
  1105.            */
  1106.           aic_outb(temp_p, 
  1107.             (aic_inb(temp_p, SBLKCTL) & ~(DIAGLEDEN | DIAGLEDON)),
  1108.             SBLKCTL);
  1109.           /*
  1110.            * We don't know where this is set in the SEEPROM or by the
  1111.            * BIOS, so we default to 100%.  On Ultra2 controllers, use 75%
  1112.            * instead.
  1113.            */
  1114.           if (temp_p->features & AHC_ULTRA2)
  1115.           {
  1116.             aic_outb(temp_p, RD_DFTHRSH_MAX | WR_DFTHRSH_MAX, DFF_THRSH);
  1117.           }
  1118.           else
  1119.           {
  1120.             aic_outb(temp_p, DFTHRSH_100, DSPCISTATUS);
  1121.           }
  1122.           /*
  1123.            * Call our function to fixup any bugs that exist on this chipset.
  1124.            * This may muck with PCI settings and other device settings, so
  1125.            * make sure it's after all the other PCI and device register
  1126.            * tweaks so it can back out bad settings on specific broken cards.
  1127.            */
  1128.           aic7xxx_configure_bugs(temp_p);
  1129.           if ( list_p == NULL )
  1130.           {
  1131.             list_p = current_p = temp_p;
  1132.           }
  1133.           else
  1134.           {
  1135.             current_p = list_p;
  1136.             while(current_p->next != NULL)
  1137.               current_p = current_p->next;
  1138.             current_p->next = temp_p;
  1139.           }
  1140.           temp_p->next = NULL;
  1141.           found++;
  1142.         }  /* Found an Adaptec PCI device. */
  1143.         else /* Well, we found one, but we couldn't get any memory */
  1144.         {
  1145.           printk("aic7xxx: Found <%s>n", 
  1146.             board_names[aic_pdevs[i].board_name_index]);
  1147.           printk(KERN_INFO "aic7xxx: Unable to allocate device memory, "
  1148.             "skipping.n");
  1149.         }
  1150.       } /* while(pdev=....) */
  1151.     } /* for PCI_DEVICES */
  1152.   } /* PCI BIOS present */
  1153. #endif /* CONFIG_PCI */
  1154. #if defined(__i386__) || defined(__alpha__)
  1155.   /*
  1156.    * EISA/VL-bus card signature probe.
  1157.    */
  1158.   slot = MINSLOT;
  1159.   while ( (slot <= MAXSLOT) && 
  1160.          !(aic7xxx_no_probe) )
  1161.   {
  1162.     base = SLOTBASE(slot) + MINREG;
  1163.     if (check_region(base, MAXREG - MINREG))
  1164.     {
  1165.       /*
  1166.        * Some other driver has staked a
  1167.        * claim to this i/o region already.
  1168.        */
  1169.       slot++;
  1170.       continue; /* back to the beginning of the for loop */
  1171.     }
  1172.     flags = 0;
  1173.     type = aic7xxx_probe(slot, base + AHC_HID0, &flags);
  1174.     if (type == -1)
  1175.     {
  1176.       slot++;
  1177.       continue;
  1178.     }
  1179.     temp_p = kmalloc(sizeof(struct aic7xxx_host), GFP_ATOMIC);
  1180.     if (temp_p == NULL)
  1181.     {
  1182.       printk(KERN_WARNING "aic7xxx: Unable to allocate device space.n");
  1183.       slot++;
  1184.       continue; /* back to the beginning of the while loop */
  1185.     }
  1186.     /*
  1187.      * Lock out other contenders for our i/o space.
  1188.      */
  1189.     request_region(base, MAXREG - MINREG, "aic7xxx");
  1190.     /*
  1191.      * Pause the card preserving the IRQ type.  Allow the operator
  1192.      * to override the IRQ trigger.
  1193.      */
  1194.     if (aic7xxx_irq_trigger == 1)
  1195.       hcntrl = IRQMS;  /* Level */
  1196.     else if (aic7xxx_irq_trigger == 0)
  1197.       hcntrl = 0;  /* Edge */
  1198.     else
  1199.       hcntrl = inb(base + HCNTRL) & IRQMS;  /* Default */
  1200.     memset(temp_p, 0, sizeof(struct aic7xxx_host));
  1201.     temp_p->unpause = hcntrl | INTEN;
  1202.     temp_p->pause = hcntrl | PAUSE | INTEN;
  1203.     temp_p->base = base;
  1204.     temp_p->mbase = 0;
  1205.     temp_p->maddr = 0;
  1206.     temp_p->pci_bus = 0;
  1207.     temp_p->pci_device_fn = slot;
  1208.     aic_outb(temp_p, hcntrl | PAUSE, HCNTRL);
  1209.     while( (aic_inb(temp_p, HCNTRL) & PAUSE) == 0 ) ;
  1210.     if (aic7xxx_chip_reset(temp_p) == -1)
  1211.       temp_p->irq = 0;
  1212.     else
  1213.       temp_p->irq = aic_inb(temp_p, INTDEF) & 0x0F;
  1214.     temp_p->flags |= AHC_PAGESCBS;
  1215.     switch (temp_p->irq)
  1216.     {
  1217.       case 9:
  1218.       case 10:
  1219.       case 11:
  1220.       case 12:
  1221.       case 14:
  1222.       case 15:
  1223.         break;
  1224.       default:
  1225.         printk(KERN_WARNING "aic7xxx: Host adapter uses unsupported IRQ "
  1226.           "level %d, ignoring.n", temp_p->irq);
  1227.         kfree(temp_p);
  1228.         release_region(base, MAXREG - MINREG);
  1229.         slot++;
  1230.         continue; /* back to the beginning of the while loop */
  1231.     }
  1232.     /*
  1233.      * We are commited now, everything has been checked and this card
  1234.      * has been found, now we just set it up
  1235.      */
  1236.     /*
  1237.      * Insert our new struct into the list at the end
  1238.      */
  1239.     if (list_p == NULL)
  1240.     {
  1241.       list_p = current_p = temp_p;
  1242.     }
  1243.     else
  1244.     {
  1245.       current_p = list_p;
  1246.       while (current_p->next != NULL)
  1247.         current_p = current_p->next;
  1248.       current_p->next = temp_p;
  1249.     }
  1250.     switch (type)
  1251.     {
  1252.       case 0:
  1253.         temp_p->board_name_index = 2;
  1254.         if (aic7xxx_verbose & VERBOSE_PROBE2)
  1255.           printk("aic7xxx: <%s> at EISA %dn",
  1256.                board_names[2], slot);
  1257.         /* FALLTHROUGH */
  1258.       case 1:
  1259.       {
  1260.         temp_p->chip = AHC_AIC7770 | AHC_EISA;
  1261.         temp_p->features |= AHC_AIC7770_FE;
  1262.         temp_p->bios_control = aic_inb(temp_p, HA_274_BIOSCTRL);
  1263.         /*
  1264.          * Get the primary channel information.  Right now we don't
  1265.          * do anything with this, but someday we will be able to inform
  1266.          * the mid-level SCSI code which channel is primary.
  1267.          */
  1268.         if (temp_p->board_name_index == 0)
  1269.         {
  1270.           temp_p->board_name_index = 3;
  1271.           if (aic7xxx_verbose & VERBOSE_PROBE2)
  1272.             printk("aic7xxx: <%s> at EISA %dn",
  1273.                  board_names[3], slot);
  1274.         }
  1275.         if (temp_p->bios_control & CHANNEL_B_PRIMARY)
  1276.         {
  1277.           temp_p->flags |= AHC_CHANNEL_B_PRIMARY;
  1278.         }
  1279.         if ((temp_p->bios_control & BIOSMODE) == BIOSDISABLED)
  1280.         {
  1281.           temp_p->flags &= ~AHC_BIOS_ENABLED;
  1282.         }
  1283.         else
  1284.         {
  1285.           temp_p->flags &= ~AHC_USEDEFAULTS;
  1286.           temp_p->flags |= AHC_BIOS_ENABLED;
  1287.           if ( (temp_p->bios_control & 0x20) == 0 )
  1288.           {
  1289.             temp_p->bios_address = 0xcc000;
  1290.             temp_p->bios_address += (0x4000 * (temp_p->bios_control & 0x07));
  1291.           }
  1292.           else
  1293.           {
  1294.             temp_p->bios_address = 0xd0000;
  1295.             temp_p->bios_address += (0x8000 * (temp_p->bios_control & 0x06));
  1296.           }
  1297.         }
  1298.         temp_p->adapter_control = aic_inb(temp_p, SCSICONF) << 8;
  1299.         temp_p->adapter_control |= aic_inb(temp_p, SCSICONF + 1);
  1300.         if (temp_p->features & AHC_WIDE)
  1301.         {
  1302.           temp_p->scsi_id = temp_p->adapter_control & HWSCSIID;
  1303.           temp_p->scsi_id_b = temp_p->scsi_id;
  1304.         }
  1305.         else
  1306.         {
  1307.           temp_p->scsi_id = (temp_p->adapter_control >> 8) & HSCSIID;
  1308.           temp_p->scsi_id_b = temp_p->adapter_control & HSCSIID;
  1309.         }
  1310.         aic7xxx_load_seeprom(temp_p, &sxfrctl1);
  1311.         break;
  1312.       }
  1313.       case 2:
  1314.       case 3:
  1315.         temp_p->chip = AHC_AIC7770 | AHC_VL;
  1316.         temp_p->features |= AHC_AIC7770_FE;
  1317.         if (type == 2)
  1318.           temp_p->flags |= AHC_BIOS_ENABLED;
  1319.         else
  1320.           temp_p->flags &= ~AHC_BIOS_ENABLED;
  1321.         if (aic_inb(temp_p, SCSICONF) & TERM_ENB)
  1322.           sxfrctl1 = STPWEN;
  1323.         aic7xxx_load_seeprom(temp_p, &sxfrctl1);
  1324.         temp_p->board_name_index = 4;
  1325.         if (aic7xxx_verbose & VERBOSE_PROBE2)
  1326.           printk("aic7xxx: <%s> at VLB %dn",
  1327.                board_names[2], slot);
  1328.         switch( aic_inb(temp_p, STATUS_2840) & BIOS_SEL )
  1329.         {
  1330.           case 0x00:
  1331.             temp_p->bios_address = 0xe0000;
  1332.             break;
  1333.           case 0x20:
  1334.             temp_p->bios_address = 0xc8000;
  1335.             break;
  1336.           case 0x40:
  1337.             temp_p->bios_address = 0xd0000;
  1338.             break;
  1339.           case 0x60:
  1340.             temp_p->bios_address = 0xd8000;
  1341.             break;
  1342.           default:
  1343.             break; /* can't get here */
  1344.         }
  1345.         break;
  1346.       default:  /* Won't get here. */
  1347.         break;
  1348.     }
  1349.     if (aic7xxx_verbose & VERBOSE_PROBE2)
  1350.     {
  1351.       printk(KERN_INFO "aic7xxx: BIOS %sabled, IO Port 0x%lx, IRQ %d (%s)n",
  1352.         (temp_p->flags & AHC_USEDEFAULTS) ? "dis" : "en", temp_p->base,
  1353.         temp_p->irq,
  1354.         (temp_p->pause & IRQMS) ? "level sensitive" : "edge triggered");
  1355.       printk(KERN_INFO "aic7xxx: Extended translation %sabled.n",
  1356.              (temp_p->flags & AHC_EXTEND_TRANS_A) ? "en" : "dis");
  1357.     }
  1358.     /*
  1359.      * All the 7770 based chipsets have this bug
  1360.      */
  1361.     temp_p->bugs |= AHC_BUG_TMODE_WIDEODD;
  1362.     /*
  1363.      * Set the FIFO threshold and the bus off time.
  1364.      */
  1365.     hostconf = aic_inb(temp_p, HOSTCONF);
  1366.     aic_outb(temp_p, hostconf & DFTHRSH, BUSSPD);
  1367.     aic_outb(temp_p, (hostconf << 2) & BOFF, BUSTIME);
  1368.     slot++;
  1369.     found++;
  1370.   }
  1371. #endif /* defined(__i386__) || defined(__alpha__) */
  1372.   /*
  1373.    * Now, we re-order the probed devices by BIOS address and BUS class.
  1374.    * In general, we follow this algorithm to make the adapters show up
  1375.    * in the same order under linux that the computer finds them.
  1376.    *  1: All VLB/EISA cards with BIOS_ENABLED first, according to BIOS
  1377.    *     address, going from lowest to highest.
  1378.    *  2: All PCI controllers with BIOS_ENABLED next, according to BIOS
  1379.    *     address, going from lowest to highest.
  1380.    *  3: Remaining VLB/EISA controllers going in slot order.
  1381.    *  4: Remaining PCI controllers, going in PCI device order (reversable)
  1382.    */
  1383.   {
  1384.     struct aic7xxx_host *sort_list[4] = { NULL, NULL, NULL, NULL };
  1385.     struct aic7xxx_host *vlb, *pci;
  1386.     struct aic7xxx_host *prev_p;
  1387.     struct aic7xxx_host *p;
  1388.     unsigned char left;
  1389.     prev_p = vlb = pci = NULL;
  1390.     temp_p = list_p;
  1391.     while (temp_p != NULL)
  1392.     {
  1393.       switch(temp_p->chip & ~AHC_CHIPID_MASK)
  1394.       {
  1395.         case AHC_EISA:
  1396.         case AHC_VL:
  1397.         {
  1398.           p = temp_p;
  1399.           if (p->flags & AHC_BIOS_ENABLED)
  1400.             vlb = sort_list[0];
  1401.           else
  1402.             vlb = sort_list[2];
  1403.           if (vlb == NULL)
  1404.           {
  1405.             vlb = temp_p;
  1406.             temp_p = temp_p->next;
  1407.             vlb->next = NULL;
  1408.           }
  1409.           else
  1410.           {
  1411.             current_p = vlb;
  1412.             prev_p = NULL;
  1413.             while ( (current_p != NULL) &&
  1414.                     (current_p->bios_address < temp_p->bios_address))
  1415.             {
  1416.               prev_p = current_p;
  1417.               current_p = current_p->next;
  1418.             }
  1419.             if (prev_p != NULL)
  1420.             {
  1421.               prev_p->next = temp_p;
  1422.               temp_p = temp_p->next;
  1423.               prev_p->next->next = current_p;
  1424.             }
  1425.             else
  1426.             {
  1427.               vlb = temp_p;
  1428.               temp_p = temp_p->next;
  1429.               vlb->next = current_p;
  1430.             }
  1431.           }
  1432.           
  1433.           if (p->flags & AHC_BIOS_ENABLED)
  1434.             sort_list[0] = vlb;
  1435.           else
  1436.             sort_list[2] = vlb;
  1437.           
  1438.           break;
  1439.         }
  1440.         default:  /* All PCI controllers fall through to default */
  1441.         {
  1442.           p = temp_p;
  1443.           if (p->flags & AHC_BIOS_ENABLED) 
  1444.             pci = sort_list[1];
  1445.           else
  1446.             pci = sort_list[3];
  1447.           if (pci == NULL)
  1448.           {
  1449.             pci = temp_p;
  1450.             temp_p = temp_p->next;
  1451.             pci->next = NULL;
  1452.           }
  1453.           else
  1454.           {
  1455.             current_p = pci;
  1456.             prev_p = NULL;
  1457.             if (!aic7xxx_reverse_scan)
  1458.             {
  1459.               while ( (current_p != NULL) &&
  1460.                       ( (PCI_SLOT(current_p->pci_device_fn) |
  1461.                         (current_p->pci_bus << 8)) < 
  1462.                         (PCI_SLOT(temp_p->pci_device_fn) |
  1463.                         (temp_p->pci_bus << 8)) ) )
  1464.               {
  1465.                 prev_p = current_p;
  1466.                 current_p = current_p->next;
  1467.               }
  1468.             }
  1469.             else
  1470.             {
  1471.               while ( (current_p != NULL) &&
  1472.                       ( (PCI_SLOT(current_p->pci_device_fn) |
  1473.                         (current_p->pci_bus << 8)) > 
  1474.                         (PCI_SLOT(temp_p->pci_device_fn) |
  1475.                         (temp_p->pci_bus << 8)) ) )
  1476.               {
  1477.                 prev_p = current_p;
  1478.                 current_p = current_p->next;
  1479.               }
  1480.             }
  1481.             /*
  1482.              * Are we dealing with a 7895/6/7/9 where we need to sort the
  1483.              * channels as well, if so, the bios_address values should
  1484.              * be the same
  1485.              */
  1486.             if ( (current_p) && (temp_p->flags & AHC_MULTI_CHANNEL) &&
  1487.                  (temp_p->pci_bus == current_p->pci_bus) &&
  1488.                  (PCI_SLOT(temp_p->pci_device_fn) ==
  1489.                   PCI_SLOT(current_p->pci_device_fn)) )
  1490.             {
  1491.               if (temp_p->flags & AHC_CHNLB)
  1492.               {
  1493.                 if ( !(temp_p->flags & AHC_CHANNEL_B_PRIMARY) )
  1494.                 {
  1495.                   prev_p = current_p;
  1496.                   current_p = current_p->next;
  1497.                 }
  1498.               }
  1499.               else
  1500.               {
  1501.                 if (temp_p->flags & AHC_CHANNEL_B_PRIMARY)
  1502.                 {
  1503.                   prev_p = current_p;
  1504.                   current_p = current_p->next;
  1505.                 }
  1506.               }
  1507.             }
  1508.             if (prev_p != NULL)
  1509.             {
  1510.               prev_p->next = temp_p;
  1511.               temp_p = temp_p->next;
  1512.               prev_p->next->next = current_p;
  1513.             }
  1514.             else
  1515.             {
  1516.               pci = temp_p;
  1517.               temp_p = temp_p->next;
  1518.               pci->next = current_p;
  1519.             }
  1520.           }
  1521.           if (p->flags & AHC_BIOS_ENABLED)
  1522.             sort_list[1] = pci;
  1523.           else
  1524.             sort_list[3] = pci;
  1525.           break;
  1526.         }
  1527.       }  /* End of switch(temp_p->type) */
  1528.     } /* End of while (temp_p != NULL) */
  1529.     /*
  1530.      * At this point, the cards have been broken into 4 sorted lists, now
  1531.      * we run through the lists in order and register each controller
  1532.      */
  1533.     {
  1534.       int i;
  1535.       
  1536.       left = found;
  1537.       for (i=0; i<NUMBER(sort_list); i++)
  1538.       {
  1539.         temp_p = sort_list[i];
  1540.         while(temp_p != NULL)
  1541.         {
  1542.           template->name = board_names[temp_p->board_name_index];
  1543.           p = aic7xxx_alloc(template, temp_p);
  1544.           if (p != NULL)
  1545.           {
  1546.             p->instance = found - left;
  1547.             if (aic7xxx_register(template, p, (--left)) == 0)
  1548.             {
  1549.               found--;
  1550.               aic7xxx_release(p->host);
  1551.               scsi_unregister(p->host);
  1552.             }
  1553.             else if (aic7xxx_dump_card)
  1554.             {
  1555.               pause_sequencer(p);
  1556.               aic7xxx_print_card(p);
  1557.               aic7xxx_print_scratch_ram(p);
  1558.               unpause_sequencer(p, TRUE);
  1559.             }
  1560.           }
  1561.           current_p = temp_p;
  1562.           temp_p = (struct aic7xxx_host *)temp_p->next;
  1563.           kfree(current_p);
  1564.         }
  1565.       }
  1566.     }
  1567.   }
  1568.   return (found);
  1569. }
  1570. #ifdef AIC7XXX_VERBOSE_DEBUGGING
  1571. /*+F*************************************************************************
  1572.  * Function:
  1573.  *   aic7xxx_print_scb
  1574.  *
  1575.  * Description:
  1576.  *   Dump the byte codes for an about to be sent SCB.
  1577.  *-F*************************************************************************/
  1578. static void
  1579. aic7xxx_print_scb(struct aic7xxx_host *p, struct aic7xxx_scb *scb)
  1580. {
  1581.   int i;
  1582.   unsigned char *x;  
  1583.   x = (unsigned char *)&scb->hscb->control;
  1584.   for(i=0; i<32; i++)
  1585.   {
  1586.     printk("%02x ", x[i]);
  1587.   }
  1588.   printk("n");
  1589. }
  1590. #endif
  1591. /*+F*************************************************************************
  1592.  * Function:
  1593.  *   aic7xxx_buildscb
  1594.  *
  1595.  * Description:
  1596.  *   Build a SCB.
  1597.  *-F*************************************************************************/
  1598. static void
  1599. aic7xxx_buildscb(struct aic7xxx_host *p, Scsi_Cmnd *cmd,
  1600.     struct aic7xxx_scb *scb)
  1601. {
  1602.   unsigned short mask;
  1603.   struct aic7xxx_hwscb *hscb;
  1604.   unsigned char tindex = TARGET_INDEX(cmd);
  1605.   mask = (0x01 << tindex);
  1606.   hscb = scb->hscb;
  1607.   /*
  1608.    * Setup the control byte if we need negotiation and have not
  1609.    * already requested it.
  1610.    */
  1611.   hscb->control = 0;
  1612.   scb->tag_action = 0;
  1613.   if (p->discenable & mask)
  1614.   {
  1615.     hscb->control |= DISCENB;
  1616.     if ( (p->tagenable & mask) &&
  1617.          (cmd->cmnd[0] != TEST_UNIT_READY) )
  1618.     {
  1619.       p->dev_commands_sent[tindex]++;
  1620.       if (p->dev_commands_sent[tindex] < 200)
  1621.       {
  1622.         hscb->control |= MSG_SIMPLE_Q_TAG;
  1623.         scb->tag_action = MSG_SIMPLE_Q_TAG;
  1624.       }
  1625.       else
  1626.       {
  1627.         if (p->orderedtag & mask)
  1628.         {
  1629.           hscb->control |= MSG_ORDERED_Q_TAG;
  1630.           scb->tag_action = MSG_ORDERED_Q_TAG;
  1631.         }
  1632.         else
  1633.         {
  1634.           hscb->control |= MSG_SIMPLE_Q_TAG;
  1635.           scb->tag_action = MSG_SIMPLE_Q_TAG;
  1636.         }
  1637.         p->dev_commands_sent[tindex] = 0;
  1638.       }
  1639.     }
  1640.   }
  1641.   if ( !(p->dtr_pending & mask) &&
  1642.         ( (p->needppr & mask) ||
  1643.           (p->needwdtr & mask) ||
  1644.           (p->needsdtr & mask) ) &&
  1645.         (p->dev_flags[tindex] & DEVICE_DTR_SCANNED) )
  1646.   {
  1647.     p->dtr_pending |= mask;
  1648.     scb->tag_action = 0;
  1649.     hscb->control &= DISCENB;
  1650.     hscb->control |= MK_MESSAGE;
  1651.     if(p->needppr & mask)
  1652.     {
  1653.       scb->flags |= SCB_MSGOUT_PPR;
  1654.     }
  1655.     else if(p->needwdtr & mask)
  1656.     {
  1657.       scb->flags |= SCB_MSGOUT_WDTR;
  1658.     }
  1659.     else if(p->needsdtr & mask)
  1660.     {
  1661.       scb->flags |= SCB_MSGOUT_SDTR;
  1662.     }
  1663.     scb->flags |= SCB_DTR_SCB;
  1664.   }
  1665.   hscb->target_channel_lun = ((cmd->target << 4) & 0xF0) |
  1666.         ((cmd->channel & 0x01) << 3) | (cmd->lun & 0x07);
  1667.   /*
  1668.    * The interpretation of request_buffer and request_bufflen
  1669.    * changes depending on whether or not use_sg is zero; a
  1670.    * non-zero use_sg indicates the number of elements in the
  1671.    * scatter-gather array.
  1672.    */
  1673.   /*
  1674.    * XXX - this relies on the host data being stored in a
  1675.    *       little-endian format.
  1676.    */
  1677.   hscb->SCSI_cmd_length = cmd->cmd_len;
  1678.   memcpy(scb->cmnd, cmd->cmnd, cmd->cmd_len);
  1679.   hscb->SCSI_cmd_pointer = cpu_to_le32(SCB_DMA_ADDR(scb, scb->cmnd));
  1680.   if (cmd->use_sg)
  1681.   {
  1682.     struct scatterlist *sg;  /* Must be mid-level SCSI code scatterlist */
  1683.     /*
  1684.      * We must build an SG list in adapter format, as the kernel's SG list
  1685.      * cannot be used directly because of data field size (__alpha__)
  1686.      * differences and the kernel SG list uses virtual addresses where
  1687.      * we need physical addresses.
  1688.      */
  1689.     int i, use_sg;
  1690.     sg = (struct scatterlist *)cmd->request_buffer;
  1691.     scb->sg_length = 0;
  1692.     use_sg = pci_map_sg(p->pdev, sg, cmd->use_sg, scsi_to_pci_dma_dir(cmd->sc_data_direction));
  1693.     /*
  1694.      * Copy the segments into the SG array.  NOTE!!! - We used to
  1695.      * have the first entry both in the data_pointer area and the first
  1696.      * SG element.  That has changed somewhat.  We still have the first
  1697.      * entry in both places, but now we download the address of
  1698.      * scb->sg_list[1] instead of 0 to the sg pointer in the hscb.
  1699.      */
  1700.     for (i = 0; i < use_sg; i++)
  1701.     {
  1702.       unsigned int len = sg_dma_len(sg+i);
  1703.       scb->sg_list[i].address = cpu_to_le32(sg_dma_address(sg+i));
  1704.       scb->sg_list[i].length = cpu_to_le32(len);
  1705.       scb->sg_length += len;
  1706.     }
  1707.     /* Copy the first SG into the data pointer area. */
  1708.     hscb->data_pointer = scb->sg_list[0].address;
  1709.     hscb->data_count = scb->sg_list[0].length;
  1710.     scb->sg_count = i;
  1711.     hscb->SG_segment_count = i;
  1712.     hscb->SG_list_pointer = cpu_to_le32(SCB_DMA_ADDR(scb, &scb->sg_list[1]));
  1713.   }
  1714.   else
  1715.   {
  1716.     if (cmd->request_bufflen)
  1717.     {
  1718.       unsigned int address = pci_map_single(p->pdev, cmd->request_buffer,
  1719.     cmd->request_bufflen,
  1720.                                             scsi_to_pci_dma_dir(cmd->sc_data_direction));
  1721.       aic7xxx_mapping(cmd) = address;
  1722.       scb->sg_list[0].address = cpu_to_le32(address);
  1723.       scb->sg_list[0].length = cpu_to_le32(cmd->request_bufflen);
  1724.       scb->sg_count = 1;
  1725.       scb->sg_length = cmd->request_bufflen;
  1726.       hscb->SG_segment_count = 1;
  1727.       hscb->SG_list_pointer = cpu_to_le32(SCB_DMA_ADDR(scb, &scb->sg_list[0]));
  1728.       hscb->data_count = scb->sg_list[0].length;
  1729.       hscb->data_pointer = scb->sg_list[0].address;
  1730.     }
  1731.     else
  1732.     {
  1733.       scb->sg_count = 0;
  1734.       scb->sg_length = 0;
  1735.       hscb->SG_segment_count = 0;
  1736.       hscb->SG_list_pointer = 0;
  1737.       hscb->data_count = 0;
  1738.       hscb->data_pointer = 0;
  1739.     }
  1740.   }
  1741. }
  1742. /*+F*************************************************************************
  1743.  * Function:
  1744.  *   aic7xxx_queue
  1745.  *
  1746.  * Description:
  1747.  *   Queue a SCB to the controller.
  1748.  *-F*************************************************************************/
  1749. int
  1750. aic7xxx_queue(Scsi_Cmnd *cmd, void (*fn)(Scsi_Cmnd *))
  1751. {
  1752.   struct aic7xxx_host *p;
  1753.   struct aic7xxx_scb *scb;
  1754. #ifdef AIC7XXX_VERBOSE_DEBUGGING
  1755.   int tindex = TARGET_INDEX(cmd);
  1756. #endif
  1757. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95)
  1758.   unsigned long cpu_flags = 0;
  1759. #endif
  1760.   p = (struct aic7xxx_host *) cmd->host->hostdata;
  1761.   /*
  1762.    * Check to see if channel was scanned.
  1763.    */
  1764.   
  1765. #ifdef AIC7XXX_VERBOSE_DEBUGGING
  1766.   if (!(p->flags & AHC_A_SCANNED) && (cmd->channel == 0))
  1767.   {
  1768.     if (aic7xxx_verbose & VERBOSE_PROBE2)
  1769.       printk(INFO_LEAD "Scanning channel for devices.n",
  1770.         p->host_no, 0, -1, -1);
  1771.     p->flags |= AHC_A_SCANNED;
  1772.   }
  1773.   else
  1774.   {
  1775.     if (!(p->flags & AHC_B_SCANNED) && (cmd->channel == 1))
  1776.     {
  1777.       if (aic7xxx_verbose & VERBOSE_PROBE2)
  1778.         printk(INFO_LEAD "Scanning channel for devices.n",
  1779.           p->host_no, 1, -1, -1);
  1780.       p->flags |= AHC_B_SCANNED;
  1781.     }
  1782.   }
  1783.   if (p->dev_active_cmds[tindex] > (cmd->device->queue_depth + 1))
  1784.   {
  1785.     printk(WARN_LEAD "Commands queued exceeds queue "
  1786.            "depth, active=%dn",
  1787.            p->host_no, CTL_OF_CMD(cmd), 
  1788.            p->dev_active_cmds[tindex]);
  1789.     if ( p->dev_active_cmds[tindex] > 220 )
  1790.       p->dev_active_cmds[tindex] = 0;
  1791.   }
  1792. #endif
  1793.   scb = scbq_remove_head(&p->scb_data->free_scbs);
  1794.   if (scb == NULL)
  1795.   {
  1796.     DRIVER_LOCK
  1797.     aic7xxx_allocate_scb(p);
  1798.     DRIVER_UNLOCK
  1799.     scb = scbq_remove_head(&p->scb_data->free_scbs);
  1800.     if(scb == NULL)
  1801.       printk(WARN_LEAD "Couldn't get a free SCB.n", p->host_no,
  1802.              CTL_OF_CMD(cmd));
  1803.   }
  1804.   while (scb == NULL)
  1805.   {
  1806.     /*
  1807.      * Well, all SCBs are currently active on the bus.  So, we spin here
  1808.      * running the interrupt handler until one completes and becomes free.
  1809.      * We can do this safely because we either A) hold the driver lock (in
  1810.      * 2.0 kernels) or we have the io_request_lock held (in 2.2 and later
  1811.      * kernels) and so either way, we won't take any other interrupts and
  1812.      * the queue path will block until we release it.  Also, we would worry
  1813.      * about running the completion queues, but obviously there are plenty
  1814.      * of commands outstanding to trigger a later interrupt that will do
  1815.      * that for us, so skip it here.
  1816.      */
  1817.     DRIVER_LOCK
  1818.     aic7xxx_isr(p->irq, p, NULL);
  1819.     DRIVER_UNLOCK
  1820.     scb = scbq_remove_head(&p->scb_data->free_scbs);
  1821.   }
  1822.   scb->cmd = cmd;
  1823.   aic7xxx_position(cmd) = scb->hscb->tag;
  1824.   /*
  1825.    * Make sure the Scsi_Cmnd pointer is saved, the struct it points to
  1826.    * is set up properly, and the parity error flag is reset, then send
  1827.    * the SCB to the sequencer and watch the fun begin.
  1828.    */
  1829.   cmd->scsi_done = fn;
  1830.   cmd->result = DID_OK;
  1831.   memset(cmd->sense_buffer, 0, sizeof(cmd->sense_buffer));
  1832.   aic7xxx_error(cmd) = DID_OK;
  1833.   aic7xxx_status(cmd) = 0;
  1834.   cmd->host_scribble = NULL;
  1835.   /*
  1836.    * Construct the SCB beforehand, so the sequencer is
  1837.    * paused a minimal amount of time.
  1838.    */
  1839.   aic7xxx_buildscb(p, cmd, scb);
  1840.   scb->flags |= SCB_ACTIVE | SCB_WAITINGQ;
  1841.   DRIVER_LOCK
  1842.   scbq_insert_tail(&p->waiting_scbs, scb);
  1843.   if ( (p->flags & (AHC_IN_ISR | AHC_IN_ABORT | AHC_IN_RESET)) == 0)
  1844.   {
  1845.     aic7xxx_run_waiting_queues(p);
  1846.   }
  1847.   DRIVER_UNLOCK
  1848.   return (0);
  1849. }
  1850. /*+F*************************************************************************
  1851.  * Function:
  1852.  *   aic7xxx_bus_device_reset
  1853.  *
  1854.  * Description:
  1855.  *   Abort or reset the current SCSI command(s).  If the scb has not
  1856.  *   previously been aborted, then we attempt to send a BUS_DEVICE_RESET
  1857.  *   message to the target.  If the scb has previously been unsuccessfully
  1858.  *   aborted, then we will reset the channel and have all devices renegotiate.
  1859.  *   Returns an enumerated type that indicates the status of the operation.
  1860.  *-F*************************************************************************/
  1861. static int
  1862. aic7xxx_bus_device_reset(struct aic7xxx_host *p, Scsi_Cmnd *cmd)
  1863. {
  1864.   struct aic7xxx_scb   *scb;
  1865.   struct aic7xxx_hwscb *hscb;
  1866.   int result = -1;
  1867.   int channel;
  1868.   unsigned char saved_scbptr, lastphase;
  1869.   unsigned char hscb_index;
  1870.   int disconnected;
  1871.   scb = (p->scb_data->scb_array[aic7xxx_position(cmd)]);
  1872.   hscb = scb->hscb;
  1873.   lastphase = aic_inb(p, LASTPHASE);
  1874.   if (aic7xxx_verbose & VERBOSE_RESET_PROCESS)
  1875.   {
  1876.     printk(INFO_LEAD "Bus Device reset, scb flags 0x%x, ",
  1877.          p->host_no, CTL_OF_SCB(scb), scb->flags);
  1878.     switch (lastphase)
  1879.     {
  1880.       case P_DATAOUT:
  1881.         printk("Data-Out phasen");
  1882.         break;
  1883.       case P_DATAIN:
  1884.         printk("Data-In phasen");
  1885.         break;
  1886.       case P_COMMAND:
  1887.         printk("Command phasen");
  1888.         break;
  1889.       case P_MESGOUT:
  1890.         printk("Message-Out phasen");
  1891.         break;
  1892.       case P_STATUS:
  1893.         printk("Status phasen");
  1894.         break;
  1895.       case P_MESGIN:
  1896.         printk("Message-In phasen");
  1897.         break;
  1898.       default:
  1899.       /*
  1900.        * We're not in a valid phase, so assume we're idle.
  1901.        */
  1902.         printk("while idle, LASTPHASE = 0x%xn", lastphase);
  1903.         break;
  1904.     }
  1905.     printk(INFO_LEAD "SCSISIGI 0x%x, SEQADDR 0x%x, SSTAT0 0x%x, SSTAT1 "
  1906.          "0x%xn", p->host_no, CTL_OF_SCB(scb),
  1907.          aic_inb(p, SCSISIGI),
  1908.          aic_inb(p, SEQADDR0) | (aic_inb(p, SEQADDR1) << 8),
  1909.          aic_inb(p, SSTAT0), aic_inb(p, SSTAT1));
  1910.     printk(INFO_LEAD "SG_CACHEPTR 0x%x, SSTAT2 0x%x, STCNT 0x%xn", p->host_no,
  1911.          CTL_OF_SCB(scb),
  1912.          (p->features & AHC_ULTRA2) ? aic_inb(p, SG_CACHEPTR) : 0,
  1913.          aic_inb(p, SSTAT2),
  1914.          aic_inb(p, STCNT + 2) << 16 | aic_inb(p, STCNT + 1) << 8 |
  1915.          aic_inb(p, STCNT));
  1916.   }
  1917.   channel = cmd->channel;
  1918.     /*
  1919.      * Send a Device Reset Message:
  1920.      * The target that is holding up the bus may not be the same as
  1921.      * the one that triggered this timeout (different commands have
  1922.      * different timeout lengths).  Our strategy here is to queue an
  1923.      * abort message to the timed out target if it is disconnected.
  1924.      * Otherwise, if we have an active target we stuff the message buffer
  1925.      * with an abort message and assert ATN in the hopes that the target
  1926.      * will let go of the bus and go to the mesgout phase.  If this
  1927.      * fails, we'll get another timeout a few seconds later which will
  1928.      * attempt a bus reset.
  1929.      */
  1930.   saved_scbptr = aic_inb(p, SCBPTR);
  1931.   disconnected = FALSE;
  1932.   if (lastphase != P_BUSFREE)
  1933.   {
  1934.     if (aic_inb(p, SCB_TAG) >= p->scb_data->numscbs)
  1935.     {
  1936.       printk(WARN_LEAD "Invalid SCB ID %d is active, "
  1937.              "SCB flags = 0x%x.n", p->host_no,
  1938.             CTL_OF_CMD(cmd), scb->hscb->tag, scb->flags);
  1939.       return(SCSI_RESET_ERROR);
  1940.     }
  1941.     if (scb->hscb->tag == aic_inb(p, SCB_TAG))
  1942.     { 
  1943.       if ( (lastphase != P_MESGOUT) && (lastphase != P_MESGIN) )
  1944.       {
  1945.         if (aic7xxx_verbose & VERBOSE_RESET_PROCESS)
  1946.           printk(INFO_LEAD "Device reset message in "
  1947.                 "message buffern", p->host_no, CTL_OF_SCB(scb));
  1948.         scb->flags |= SCB_RESET | SCB_DEVICE_RESET;
  1949.         aic7xxx_error(scb->cmd) = DID_RESET;
  1950.         p->dev_flags[TARGET_INDEX(scb->cmd)] |= 
  1951.                 BUS_DEVICE_RESET_PENDING;
  1952.         /* Send the abort message to the active SCB. */
  1953.         aic_outb(p, HOST_MSG, MSG_OUT);
  1954.         aic_outb(p, lastphase | ATNO, SCSISIGO);
  1955.         return(SCSI_RESET_PENDING);
  1956.       }
  1957.       else
  1958.       {
  1959.         /* We want to send out the message, but it could screw an already */
  1960.         /* in place and being used message.  Instead, we return an error  */
  1961.         /* to try and start the bus reset phase since this command is     */
  1962.         /* probably hung (aborts failed, and now reset is failing).  We   */
  1963.         /* also make sure to set BUS_DEVICE_RESET_PENDING so we won't try */
  1964.         /* any more on this device, but instead will escalate to a bus or */
  1965.         /* host reset (additionally, we won't try to abort any more).     */
  1966.         printk(WARN_LEAD "Device reset, Message buffer "
  1967.                 "in usen", p->host_no, CTL_OF_SCB(scb));
  1968.         scb->flags |= SCB_RESET | SCB_DEVICE_RESET;
  1969.         aic7xxx_error(scb->cmd) = DID_RESET;
  1970.         p->dev_flags[TARGET_INDEX(scb->cmd)] |= 
  1971.                 BUS_DEVICE_RESET_PENDING;
  1972.         return(SCSI_RESET_ERROR);
  1973.       }
  1974.     }
  1975.   } /* if (last_phase != P_BUSFREE).....indicates we are idle and can work */
  1976.   hscb_index = aic7xxx_find_scb(p, scb);
  1977.   if (hscb_index == SCB_LIST_NULL)
  1978.   {
  1979.     disconnected = (aic7xxx_scb_on_qoutfifo(p, scb)) ? FALSE : TRUE;
  1980.   }
  1981.   else
  1982.   {
  1983.     aic_outb(p, hscb_index, SCBPTR);
  1984.     if (aic_inb(p, SCB_CONTROL) & DISCONNECTED)
  1985.     {
  1986.       disconnected = TRUE;
  1987.     }
  1988.   }
  1989.   if (disconnected)
  1990.   {
  1991.         /*
  1992.          * Simply set the MK_MESSAGE flag and the SEQINT handler will do
  1993.          * the rest on a reconnect.
  1994.          */
  1995.     scb->hscb->control |= MK_MESSAGE;
  1996.     scb->flags |= SCB_RESET | SCB_DEVICE_RESET;
  1997.     p->dev_flags[TARGET_INDEX(scb->cmd)] |= 
  1998.         BUS_DEVICE_RESET_PENDING;
  1999.     if (hscb_index != SCB_LIST_NULL)
  2000.     {
  2001.       unsigned char scb_control;
  2002.       aic_outb(p, hscb_index, SCBPTR);
  2003.       scb_control = aic_inb(p, SCB_CONTROL);
  2004.       aic_outb(p, scb_control | MK_MESSAGE, SCB_CONTROL);
  2005.     }
  2006.         /*
  2007.          * Actually requeue this SCB in case we can select the
  2008.          * device before it reconnects.  If the transaction we
  2009.          * want to abort is not tagged, then this will be the only
  2010.          * outstanding command and we can simply shove it on the
  2011.          * qoutfifo and be done.  If it is tagged, then it goes right
  2012.          * in with all the others, no problem :)  We need to add it
  2013.          * to the qinfifo and let the sequencer know it is there.
  2014.          * Now, the only problem left to deal with is, *IF* this
  2015.          * command completes, in spite of the MK_MESSAGE bit in the
  2016.          * control byte, then we need to pick that up in the interrupt
  2017.          * routine and clean things up.  This *shouldn't* ever happen.
  2018.          */
  2019.     if (aic7xxx_verbose & VERBOSE_RESET_PROCESS)
  2020.       printk(INFO_LEAD "Queueing device reset "
  2021.            "command.n", p->host_no, CTL_OF_SCB(scb));
  2022.     p->qinfifo[p->qinfifonext++] = scb->hscb->tag;
  2023.     if (p->features & AHC_QUEUE_REGS)
  2024.       aic_outb(p, p->qinfifonext, HNSCB_QOFF);
  2025.     else
  2026.       aic_outb(p, p->qinfifonext, KERNEL_QINPOS);
  2027.     scb->flags |= SCB_QUEUED_ABORT;
  2028.     result = SCSI_RESET_PENDING;
  2029.   }
  2030.   else if (result == -1)
  2031.   {
  2032.     result = SCSI_RESET_ERROR;
  2033.   }
  2034.   aic_outb(p, saved_scbptr, SCBPTR);
  2035.   return (result);
  2036. }
  2037. /*+F*************************************************************************
  2038.  * Function:
  2039.  *   aic7xxx_panic_abort
  2040.  *
  2041.  * Description:
  2042.  *   Abort the current SCSI command(s).
  2043.  *-F*************************************************************************/
  2044. void
  2045. aic7xxx_panic_abort(struct aic7xxx_host *p, Scsi_Cmnd *cmd)
  2046. {
  2047.   printk("aic7xxx driver version %s/%sn", AIC7XXX_C_VERSION,
  2048.          UTS_RELEASE);
  2049.   printk("Controller type:n    %sn", board_names[p->board_name_index]);
  2050.   printk("p->flags=0x%lx, p->chip=0x%x, p->features=0x%x, "
  2051.          "sequencer %s pausedn",
  2052.      p->flags, p->chip, p->features,
  2053.     (aic_inb(p, HCNTRL) & PAUSE) ? "is" : "isn't" );
  2054.   pause_sequencer(p);
  2055.   disable_irq(p->irq);
  2056.   aic7xxx_print_card(p);
  2057.   aic7xxx_print_scratch_ram(p);
  2058.   spin_unlock_irq(&io_request_lock);
  2059.   for(;;) barrier();
  2060. }
  2061. /*+F*************************************************************************
  2062.  * Function:
  2063.  *   aic7xxx_abort
  2064.  *
  2065.  * Description:
  2066.  *   Abort the current SCSI command(s).
  2067.  *-F*************************************************************************/
  2068. int
  2069. aic7xxx_abort(Scsi_Cmnd *cmd)
  2070. {
  2071.   struct aic7xxx_scb  *scb = NULL;
  2072.   struct aic7xxx_host *p;
  2073.   int    result, found=0;
  2074.   unsigned char tmp_char, saved_hscbptr, next_hscbptr, prev_hscbptr;
  2075. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95)
  2076.   unsigned long cpu_flags = 0;
  2077. #endif
  2078.   p = (struct aic7xxx_host *) cmd->host->hostdata;
  2079.   scb = (p->scb_data->scb_array[aic7xxx_position(cmd)]);
  2080.   /*
  2081.    * I added a new config option to the driver: "panic_on_abort" that will
  2082.    * cause the driver to panic and the machine to stop on the first abort
  2083.    * or reset call into the driver.  At that point, it prints out a lot of
  2084.    * useful information for me which I can then use to try and debug the
  2085.    * problem.  Simply enable the boot time prompt in order to activate this
  2086.    * code.
  2087.    */
  2088.   if (aic7xxx_panic_on_abort)
  2089.     aic7xxx_panic_abort(p, cmd);
  2090.   DRIVER_LOCK
  2091. /*
  2092.  *  Run the isr to grab any command in the QOUTFIFO and any other misc.
  2093.  *  assundry tasks.  This should also set up the bh handler if there is
  2094.  *  anything to be done, but it won't run until we are done here since
  2095.  *  we are following a straight code path without entering the scheduler
  2096.  *  code.
  2097.  */
  2098.   pause_sequencer(p);
  2099.   while ( (aic_inb(p, INTSTAT) & INT_PEND) && !(p->flags & AHC_IN_ISR))
  2100.   {
  2101.     aic7xxx_isr(p->irq, p, (void *)NULL);
  2102.     pause_sequencer(p);
  2103.   }
  2104.   aic7xxx_done_cmds_complete(p);
  2105.   if (scb == NULL)
  2106.   {
  2107.     if (aic7xxx_verbose & VERBOSE_ABORT_MID)
  2108.       printk(INFO_LEAD "Abort called with bogus Scsi_Cmnd "
  2109.         "pointer.n", p->host_no, CTL_OF_CMD(cmd));
  2110.     unpause_sequencer(p, FALSE);
  2111.     DRIVER_UNLOCK
  2112.     return(SCSI_ABORT_NOT_RUNNING);
  2113.   }
  2114.   if (scb->cmd != cmd)  /*  Hmmm...either this SCB is currently free with a */
  2115.   {                     /*  NULL cmd pointer (NULLed out when freed) or it  */
  2116.                         /*  has already been recycled for another command   */
  2117.                         /*  Either way, this SCB has nothing to do with this*/
  2118.                         /*  command and we need to deal with cmd without    */
  2119.                         /*  touching the SCB.                               */
  2120.                         /*  The theory here is to return a value that will  */
  2121.                         /*  make the queued for complete command actually   */
  2122.                         /*  finish successfully, or to indicate that we     */
  2123.                         /*  don't have this cmd any more and the mid level  */
  2124.                         /*  code needs to find it.                          */
  2125.     if (aic7xxx_verbose & VERBOSE_ABORT_MID)
  2126.       printk(INFO_LEAD "Abort called for already completed"
  2127.         " command.n", p->host_no, CTL_OF_CMD(cmd));
  2128.     unpause_sequencer(p, FALSE);
  2129.     DRIVER_UNLOCK
  2130.     return(SCSI_ABORT_NOT_RUNNING);
  2131.   }
  2132.     
  2133. /*   At this point we know the following:
  2134.  *     the SCB pointer is valid
  2135.  *     the command pointer passed in to us and the scb->cmd pointer match
  2136.  *     this then means that the command we need to abort is the same as the
  2137.  *     command held by the scb pointer and is a valid abort request.
  2138.  *   Now, we just have to figure out what to do from here.  Current plan is:
  2139.  *     if we have already been here on this command, escalate to a reset
  2140.  *     if scb is on waiting list or QINFIFO, send it back as aborted, but
  2141.  *       we also need to be aware of the possibility that we could be using
  2142.  *       a faked negotiation command that is holding this command up,  if
  2143.  *       so we need to take care of that command instead, which means we
  2144.  *       would then treat this one like it was sitting around disconnected
  2145.  *       instead.
  2146.  *     if scb is on WAITING_SCB list in sequencer, free scb and send back
  2147.  *     if scb is disconnected and not completed, abort with abort message
  2148.  *     if scb is currently running, then it may be causing the bus to hang
  2149.  *       so we want a return value that indicates a reset would be appropriate
  2150.  *       if the command does not finish shortly
  2151.  *     if scb is already complete but not on completeq, we're screwed because
  2152.  *       this can't happen (except if the command is in the QOUTFIFO, in which
  2153.  *       case we would like it to complete successfully instead of having to
  2154.  *       to be re-done)
  2155.  *   All other scenarios already dealt with by previous code.
  2156.  */
  2157.   if ( scb->flags & (SCB_ABORT | SCB_RESET | SCB_QUEUED_ABORT) )
  2158.   {
  2159.     if (aic7xxx_verbose & VERBOSE_ABORT_PROCESS)
  2160.       printk(INFO_LEAD "SCB aborted once already, "
  2161.         "escalating.n", p->host_no, CTL_OF_SCB(scb));
  2162.     unpause_sequencer(p, FALSE);
  2163.     DRIVER_UNLOCK
  2164.     return(SCSI_ABORT_SNOOZE);
  2165.   }
  2166.   if ( (p->flags & (AHC_RESET_PENDING | AHC_ABORT_PENDING)) || 
  2167.           (p->dev_flags[TARGET_INDEX(scb->cmd)] & 
  2168.            BUS_DEVICE_RESET_PENDING) )
  2169.   {
  2170.     if (aic7xxx_verbose & VERBOSE_ABORT_PROCESS)
  2171.       printk(INFO_LEAD "Reset/Abort pending for this "
  2172.         "device, not wasting our time.n", p->host_no, CTL_OF_SCB(scb));
  2173.     unpause_sequencer(p, FALSE);
  2174.     DRIVER_UNLOCK
  2175.     return(SCSI_ABORT_PENDING);
  2176.   }
  2177.   found = 0;
  2178.   p->flags |= AHC_IN_ABORT;
  2179.   if (aic7xxx_verbose & VERBOSE_ABORT)
  2180.   {
  2181.     printk(INFO_LEAD "Aborting scb %d, flags 0x%x, SEQADDR 0x%x, LASTPHASE "
  2182.            "0x%xn",
  2183.          p->host_no, CTL_OF_SCB(scb), scb->hscb->tag, scb->flags,
  2184.          aic_inb(p, SEQADDR0) | (aic_inb(p, SEQADDR1) << 8),
  2185.          aic_inb(p, LASTPHASE));
  2186.     printk(INFO_LEAD "SG_CACHEPTR 0x%x, SG_COUNT %d, SCSISIGI 0x%xn",
  2187.          p->host_no, CTL_OF_SCB(scb), (p->features & AHC_ULTRA2) ?
  2188.          aic_inb(p, SG_CACHEPTR) : 0, aic_inb(p, SG_COUNT),
  2189.          aic_inb(p, SCSISIGI));
  2190.     printk(INFO_LEAD "SSTAT0 0x%x, SSTAT1 0x%x, SSTAT2 0x%xn",
  2191.          p->host_no, CTL_OF_SCB(scb), aic_inb(p, SSTAT0),
  2192.          aic_inb(p, SSTAT1), aic_inb(p, SSTAT2));
  2193.   }
  2194. /*
  2195.  *   First, let's check to see if the currently running command is our target
  2196.  *    since if it is, the return is fairly easy and quick since we don't want
  2197.  *    to touch the command in case it might complete, but we do want a timeout
  2198.  *    in case it's actually hung, so we really do nothing, but tell the mid
  2199.  *    level code to reset the timeout.
  2200.  */
  2201.   if ( scb->hscb->tag == aic_inb(p, SCB_TAG) )
  2202.   {
  2203.    /*
  2204.     *  Check to see if the sequencer is just sitting on this command, or
  2205.     *   if it's actively being run.
  2206.     */
  2207.     result = aic_inb(p, LASTPHASE);
  2208.     switch (result)
  2209.     {
  2210.       case P_DATAOUT:    /*    For any of these cases, we can assume we are */
  2211.       case P_DATAIN:     /*    an active command and act according.  For    */
  2212.       case P_COMMAND:    /*    anything else we are going to fall on through*/
  2213.       case P_STATUS:     /*    The SCSI_ABORT_SNOOZE will give us two abort */
  2214.       case P_MESGOUT:    /*    chances to finish and then escalate to a     */
  2215.       case P_MESGIN:     /*    reset call                                   */
  2216.         if (aic7xxx_verbose & VERBOSE_ABORT_PROCESS)
  2217.           printk(INFO_LEAD "SCB is currently active.  "
  2218.                 "Waiting on completion.n", p->host_no, CTL_OF_SCB(scb));
  2219.         printk(INFO_LEAD "SCSISIGI 0x%x, SEQADDR 0x%x, SSTAT0 0x%x, SSTAT1 "
  2220.            "0x%xn", p->host_no, CTL_OF_SCB(scb),
  2221.            aic_inb(p, SCSISIGI),
  2222.            aic_inb(p, SEQADDR0) | (aic_inb(p, SEQADDR1) << 8),
  2223.            aic_inb(p, SSTAT0), aic_inb(p, SSTAT1));
  2224.         printk(INFO_LEAD "SG_CACHEPTR 0x%x, SSTAT2 0x%x, STCNT 0x%xn",
  2225.            p->host_no, CTL_OF_SCB(scb),
  2226.            (p->features & AHC_ULTRA2) ? aic_inb(p, SG_CACHEPTR) : 0,
  2227.            aic_inb(p, SSTAT2), aic_inb(p, STCNT + 2) << 16 |
  2228.            aic_inb(p, STCNT + 1) << 8 | aic_inb(p, STCNT));
  2229.         unpause_sequencer(p, FALSE);
  2230.         p->flags &= ~AHC_IN_ABORT;
  2231.         scb->flags |= SCB_RECOVERY_SCB; /*  Note the fact that we've been  */
  2232.         p->flags |= AHC_ABORT_PENDING;  /*  here so we will know not to    */
  2233.         DRIVER_UNLOCK                   /*  muck with other SCBs if this   */
  2234.         return(SCSI_ABORT_PENDING);     /*  one doesn't complete and clear */
  2235.         break;                          /*  out.                           */
  2236.       default:
  2237.         break;
  2238.     }
  2239.   }
  2240.   if ((found == 0) && (scb->flags & SCB_WAITINGQ))
  2241.   {
  2242.     int tindex = TARGET_INDEX(cmd);
  2243.     if (aic7xxx_verbose & VERBOSE_ABORT_PROCESS) 
  2244.       printk(INFO_LEAD "SCB found on waiting list and "
  2245.           "aborted.n", p->host_no, CTL_OF_SCB(scb));
  2246.     scbq_remove(&p->waiting_scbs, scb);
  2247.     scbq_remove(&p->delayed_scbs[tindex], scb);
  2248.     p->dev_active_cmds[tindex]++;
  2249.     p->activescbs++;
  2250.     scb->flags &= ~(SCB_WAITINGQ | SCB_ACTIVE);
  2251.     scb->flags |= SCB_ABORT | SCB_QUEUED_FOR_DONE;
  2252.     found = 1;
  2253.   }
  2254. /*
  2255.  *  We just checked the waiting_q, now for the QINFIFO
  2256.  */
  2257.   if ( found == 0 )
  2258.   {
  2259.     if ( ((found = aic7xxx_search_qinfifo(p, cmd->target, 
  2260.                      cmd->channel,
  2261.                      cmd->lun, scb->hscb->tag, SCB_ABORT | SCB_QUEUED_FOR_DONE,
  2262.                      FALSE, NULL)) != 0) &&
  2263.                     (aic7xxx_verbose & VERBOSE_ABORT_PROCESS))
  2264.       printk(INFO_LEAD "SCB found in QINFIFO and "
  2265.         "aborted.n", p->host_no, CTL_OF_SCB(scb));
  2266.   }
  2267. /*
  2268.  *  QINFIFO, waitingq, completeq done.  Next, check WAITING_SCB list in card
  2269.  */
  2270.   if ( found == 0 )
  2271.   {
  2272.     unsigned char scb_next_ptr;
  2273.     prev_hscbptr = SCB_LIST_NULL;
  2274.     saved_hscbptr = aic_inb(p, SCBPTR);
  2275.     next_hscbptr = aic_inb(p, WAITING_SCBH);
  2276.     while ( next_hscbptr != SCB_LIST_NULL )
  2277.     {
  2278.       aic_outb(p,  next_hscbptr, SCBPTR );
  2279.       if ( scb->hscb->tag == aic_inb(p, SCB_TAG) )
  2280.       {
  2281.         found = 1;
  2282.         if (aic7xxx_verbose & VERBOSE_ABORT_PROCESS)
  2283.           printk(INFO_LEAD "SCB found on hardware waiting"
  2284.             " list and aborted.n", p->host_no, CTL_OF_SCB(scb));
  2285.         if ( prev_hscbptr == SCB_LIST_NULL )
  2286.         {
  2287.             aic_outb(p, aic_inb(p, SCB_NEXT), WAITING_SCBH);
  2288.             /* stop the selection since we just
  2289.              * grabbed the scb out from under the
  2290.              * card
  2291.              */
  2292.             aic_outb(p, aic_inb(p, SCSISEQ) & ~ENSELO, SCSISEQ);
  2293.             aic_outb(p, CLRSELTIMEO, CLRSINT1);
  2294.         }
  2295.         else
  2296.         {
  2297.             scb_next_ptr = aic_inb(p, SCB_NEXT);
  2298.             aic_outb(p, prev_hscbptr, SCBPTR);
  2299.             aic_outb(p, scb_next_ptr, SCB_NEXT);
  2300.             aic_outb(p, next_hscbptr, SCBPTR);
  2301.         }
  2302.         aic_outb(p, SCB_LIST_NULL, SCB_TAG);
  2303.         aic_outb(p, 0, SCB_CONTROL);
  2304.         aic7xxx_add_curscb_to_free_list(p);
  2305.         scb->flags = SCB_ABORT | SCB_QUEUED_FOR_DONE;
  2306.         break;
  2307.       }
  2308.       prev_hscbptr = next_hscbptr;
  2309.       next_hscbptr = aic_inb(p, SCB_NEXT);
  2310.     }
  2311.     aic_outb(p,  saved_hscbptr, SCBPTR );
  2312.   }
  2313.         
  2314. /*
  2315.  *  Hmmm...completeq, QOUTFIFO, QINFIFO, WAITING_SCBH, waitingq all checked.
  2316.  *  OK...the sequencer's paused, interrupts are off, and we haven't found the
  2317.  *  command anyplace where it could be easily aborted.  Time for the hard
  2318.  *  work.  We also know the command is valid.  This essentially means the
  2319.  *  command is disconnected, or connected but not into any phases yet, which
  2320.  *  we know due to the tests we ran earlier on the current active scb phase.
  2321.  *  At this point we can queue the abort tag and go on with life.
  2322.  */
  2323.   if ( found == 0 )
  2324.   {
  2325.     p->flags |= AHC_ABORT_PENDING;
  2326.     scb->flags |= SCB_QUEUED_ABORT | SCB_ABORT | SCB_RECOVERY_SCB;
  2327.     scb->hscb->control |= MK_MESSAGE;
  2328.     result=aic7xxx_find_scb(p, scb);
  2329.     if ( result != SCB_LIST_NULL ) 
  2330.     {
  2331.       saved_hscbptr = aic_inb(p, SCBPTR);
  2332.       aic_outb(p, result, SCBPTR);
  2333.       tmp_char = aic_inb(p, SCB_CONTROL);
  2334.       aic_outb(p,  tmp_char | MK_MESSAGE, SCB_CONTROL);
  2335.       aic_outb(p, saved_hscbptr, SCBPTR);
  2336.     }
  2337.     if (aic7xxx_verbose & VERBOSE_ABORT_PROCESS)
  2338.       printk(INFO_LEAD "SCB disconnected.  Queueing Abort"
  2339.         " SCB.n", p->host_no, CTL_OF_SCB(scb));
  2340.     p->qinfifo[p->qinfifonext++] = scb->hscb->tag;
  2341.     if (p->features & AHC_QUEUE_REGS)
  2342.       aic_outb(p, p->qinfifonext, HNSCB_QOFF);
  2343.     else
  2344.       aic_outb(p, p->qinfifonext, KERNEL_QINPOS);
  2345.   }
  2346.   if (found)
  2347.   {
  2348.     aic7xxx_run_done_queue(p, TRUE);
  2349.     aic7xxx_run_waiting_queues(p);
  2350.   }
  2351.   p->flags &= ~AHC_IN_ABORT;
  2352.   unpause_sequencer(p, FALSE);
  2353.   DRIVER_UNLOCK
  2354. /*
  2355.  *  On the return value.  If we found the command and aborted it, then we know
  2356.  *  it's already sent back and there is no reason for a further timeout, so
  2357.  *  we use SCSI_ABORT_SUCCESS.  On the queued abort side, we aren't so certain
  2358.  *  there hasn't been a bus hang or something that might keep the abort from
  2359.  *  from completing.  Therefore, we use SCSI_ABORT_PENDING.  The first time this
  2360.  *  is passed back, the timeout on the command gets extended, the second time
  2361.  *  we pass this back, the mid level SCSI code calls our reset function, which
  2362.  *  would shake loose a hung bus.
  2363.  */
  2364.   if ( found != 0 )
  2365.     return(SCSI_ABORT_SUCCESS);
  2366.   else
  2367.     return(SCSI_ABORT_PENDING); 
  2368. }
  2369. /*+F*************************************************************************
  2370.  * Function:
  2371.  *   aic7xxx_reset
  2372.  *
  2373.  * Description:
  2374.  *   Resetting the bus always succeeds - is has to, otherwise the
  2375.  *   kernel will panic! Try a surgical technique - sending a BUS
  2376.  *   DEVICE RESET message - on the offending target before pulling
  2377.  *   the SCSI bus reset line.
  2378.  *-F*************************************************************************/
  2379. int
  2380. aic7xxx_reset(Scsi_Cmnd *cmd, unsigned int flags)
  2381. {
  2382.   struct aic7xxx_scb *scb = NULL;
  2383.   struct aic7xxx_host *p;
  2384.   int    tindex;
  2385.   int    result = -1;
  2386. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95)
  2387.   unsigned long cpu_flags = 0;
  2388. #endif
  2389. #define DEVICE_RESET 0x01
  2390. #define BUS_RESET    0x02
  2391. #define HOST_RESET   0x04
  2392. #define RESET_DELAY  0x08
  2393.   int        action;
  2394.   if ( cmd == NULL )
  2395.   {
  2396.     printk(KERN_WARNING "(scsi?:?:?:?) Reset called with NULL Scsi_Cmnd "
  2397.       "pointer, failing.n");
  2398.     return(SCSI_RESET_SNOOZE);
  2399.   }
  2400.   p = (struct aic7xxx_host *) cmd->host->hostdata;
  2401.   scb = (p->scb_data->scb_array[aic7xxx_position(cmd)]);
  2402.   tindex = TARGET_INDEX(cmd);
  2403.   /*
  2404.    * I added a new config option to the driver: "panic_on_abort" that will
  2405.    * cause the driver to panic and the machine to stop on the first abort
  2406.    * or reset call into the driver.  At that point, it prints out a lot of
  2407.    * useful information for me which I can then use to try and debug the
  2408.    * problem.  Simply enable the boot time prompt in order to activate this
  2409.    * code.
  2410.    */
  2411.   if (aic7xxx_panic_on_abort)
  2412.     aic7xxx_panic_abort(p, cmd);
  2413.   DRIVER_LOCK
  2414.   pause_sequencer(p);
  2415.   if(flags & SCSI_RESET_SYNCHRONOUS)
  2416.   {
  2417.     if (aic7xxx_verbose & VERBOSE_RESET_MID)
  2418.       printk(INFO_LEAD "Reset called for a SYNCHRONOUS reset, flags 0x%x, "
  2419.            "cmd->result 0x%x.n", p->host_no, CTL_OF_CMD(cmd), flags,
  2420.            cmd->result);
  2421.     scb = NULL;
  2422.     action = HOST_RESET;
  2423.   }
  2424.   else if ((scb == NULL) || (scb->cmd != cmd))
  2425.   {
  2426.     if (aic7xxx_verbose & VERBOSE_RESET_MID)
  2427.       printk(INFO_LEAD "Reset called with bogus Scsi_Cmnd"
  2428.            "->SCB mapping, failing.n", p->host_no, CTL_OF_CMD(cmd));
  2429.     aic7xxx_done_cmds_complete(p);
  2430.     aic7xxx_run_waiting_queues(p);
  2431.     unpause_sequencer(p, FALSE);
  2432.     DRIVER_UNLOCK
  2433.     return(SCSI_RESET_NOT_RUNNING);
  2434.   }
  2435.   else
  2436.   {
  2437.     if (aic7xxx_verbose & VERBOSE_RESET_MID)
  2438.       printk(INFO_LEAD "Reset called, scb %d, flags "
  2439.         "0x%xn", p->host_no, CTL_OF_SCB(scb), scb->hscb->tag, scb->flags);
  2440.     if ( flags & SCSI_RESET_SUGGEST_HOST_RESET )
  2441.     {
  2442.       action = HOST_RESET;
  2443.     }
  2444.     else if ( flags & SCSI_RESET_SUGGEST_BUS_RESET )
  2445.     {
  2446.       action = BUS_RESET;
  2447.     }
  2448.     else 
  2449.     {
  2450.       action = DEVICE_RESET;
  2451.     }
  2452.   }
  2453.   while((aic_inb(p, INTSTAT) & INT_PEND) && !(p->flags & AHC_IN_ISR))
  2454.   {
  2455.     aic7xxx_isr(p->irq, p, (void *)NULL );
  2456.     pause_sequencer(p);
  2457.   }
  2458.   aic7xxx_done_cmds_complete(p);
  2459.   if(scb && (scb->cmd == NULL))
  2460.   {
  2461.     /*
  2462.      * We just completed the command when we ran the isr stuff, so we no
  2463.      * longer have it.
  2464.      */
  2465.     aic7xxx_run_waiting_queues(p);
  2466.     unpause_sequencer(p, FALSE);
  2467.     DRIVER_UNLOCK
  2468.     return(SCSI_RESET_SUCCESS);
  2469.   }
  2470.     
  2471.   if ( (action & DEVICE_RESET) && 
  2472.         (p->dev_flags[tindex] & BUS_DEVICE_RESET_PENDING) )
  2473.   {
  2474.     if (aic7xxx_verbose & VERBOSE_RESET_PROCESS)
  2475.       printk(INFO_LEAD "Bus device reset already sent to "
  2476.         "device, escalating.n", p->host_no, CTL_OF_CMD(cmd));
  2477.     action = BUS_RESET;
  2478.   }
  2479.   if ( (action & DEVICE_RESET) &&
  2480.        (scb->flags & SCB_QUEUED_ABORT) )
  2481.   {
  2482.     if (aic7xxx_verbose & VERBOSE_RESET_PROCESS)
  2483.     {
  2484.       printk(INFO_LEAD "Have already attempted to reach "
  2485.         "device with queuedn", p->host_no, CTL_OF_CMD(cmd));
  2486.       printk(INFO_LEAD "message, will escalate to bus "
  2487.         "reset.n", p->host_no, CTL_OF_CMD(cmd));
  2488.     }
  2489.     action = BUS_RESET;
  2490.   }
  2491.   if ( (action & DEVICE_RESET) && 
  2492.        (p->flags & (AHC_RESET_PENDING | AHC_ABORT_PENDING)) )
  2493.   {
  2494.     if (aic7xxx_verbose & VERBOSE_RESET_PROCESS)
  2495.      printk(INFO_LEAD "Bus device reset stupid when "
  2496.         "other action has failed.n", p->host_no, CTL_OF_CMD(cmd));
  2497.     action = BUS_RESET;
  2498.   }
  2499.   if ( (action & BUS_RESET) && !(p->features & AHC_TWIN) )
  2500.   {
  2501.     action = HOST_RESET;
  2502.   }
  2503.   if ( (p->dev_flags[tindex] & DEVICE_RESET_DELAY) &&
  2504.        !(action & (HOST_RESET | BUS_RESET)))
  2505.   {
  2506.     if (aic7xxx_verbose & VERBOSE_RESET_PROCESS)
  2507.     {
  2508.       printk(INFO_LEAD "Reset called too soon after last "
  2509.         "reset without requestingn", p->host_no, CTL_OF_CMD(cmd));
  2510.       printk(INFO_LEAD "bus or host reset, escalating.n", p->host_no,
  2511.         CTL_OF_CMD(cmd));
  2512.     }
  2513.     action = BUS_RESET;
  2514.   }
  2515.   if ( (p->flags & AHC_RESET_DELAY) &&
  2516.        (action & (HOST_RESET | BUS_RESET)) )
  2517.   {
  2518.     if (aic7xxx_verbose & VERBOSE_RESET_PROCESS)
  2519.       printk(INFO_LEAD "Reset called too soon after "
  2520.         "last bus reset, delaying.n", p->host_no, CTL_OF_CMD(cmd));
  2521.     action = RESET_DELAY;
  2522.   }
  2523. /*
  2524.  *  By this point, we want to already know what we are going to do and
  2525.  *  only have the following code implement our course of action.
  2526.  */
  2527.   switch (action)
  2528.   {
  2529.     case RESET_DELAY:
  2530.       aic7xxx_run_waiting_queues(p);
  2531.       unpause_sequencer(p, FALSE);
  2532.       DRIVER_UNLOCK
  2533.       if(scb == NULL)
  2534.         return(SCSI_RESET_PUNT);
  2535.       else
  2536.         return(SCSI_RESET_PENDING);
  2537.       break;
  2538.     case DEVICE_RESET:
  2539.       p->flags |= AHC_IN_RESET;
  2540.       result = aic7xxx_bus_device_reset(p, cmd);
  2541.       aic7xxx_run_done_queue(p, TRUE);
  2542.       /*  We can't rely on run_waiting_queues to unpause the sequencer for
  2543.        *  PCI based controllers since we use AAP */
  2544.       aic7xxx_run_waiting_queues(p);
  2545.       unpause_sequencer(p, FALSE);
  2546.       p->flags &= ~AHC_IN_RESET;
  2547.       DRIVER_UNLOCK
  2548.       return(result);
  2549.       break;
  2550.     case BUS_RESET:
  2551.     case HOST_RESET:
  2552.     default:
  2553.       p->flags |= AHC_IN_RESET | AHC_RESET_DELAY;
  2554.       p->dev_expires[p->scsi_id] = jiffies + (1 * HZ);
  2555.       p->dev_timer_active |= (0x01 << p->scsi_id);
  2556.       if ( !(p->dev_timer_active & (0x01 << MAX_TARGETS)) ||
  2557.             time_after_eq(p->dev_timer.expires, p->dev_expires[p->scsi_id]) )
  2558.       {
  2559.         mod_timer(&p->dev_timer, p->dev_expires[p->scsi_id]);
  2560.         p->dev_timer_active |= (0x01 << MAX_TARGETS);
  2561.       }
  2562.       aic7xxx_reset_channel(p, cmd->channel, TRUE);
  2563.       if ( (p->features & AHC_TWIN) && (action & HOST_RESET) )
  2564.       {
  2565.         aic7xxx_reset_channel(p, cmd->channel ^ 0x01, TRUE);
  2566.         restart_sequencer(p);
  2567.       }
  2568.       if (action != HOST_RESET)
  2569.         result = SCSI_RESET_SUCCESS | SCSI_RESET_BUS_RESET;
  2570.       else
  2571.       {
  2572.         result = SCSI_RESET_SUCCESS | SCSI_RESET_HOST_RESET;
  2573.         aic_outb(p,  aic_inb(p, SIMODE1) & ~(ENREQINIT|ENBUSFREE),
  2574.           SIMODE1);
  2575.         aic7xxx_clear_intstat(p);
  2576.         p->flags &= ~AHC_HANDLING_REQINITS;
  2577.         p->msg_type = MSG_TYPE_NONE;
  2578.         p->msg_index = 0;
  2579.         p->msg_len = 0;
  2580.       }
  2581. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95)
  2582.       if(flags & SCSI_RESET_SYNCHRONOUS)
  2583.       {
  2584.         cmd->result = DID_RESET << 16;
  2585.         cmd->done(cmd);
  2586.       }
  2587. #endif
  2588.       aic7xxx_run_done_queue(p, TRUE);
  2589.       p->flags &= ~AHC_IN_RESET;
  2590.       /*
  2591.        * We can't rely on run_waiting_queues to unpause the sequencer for
  2592.        * PCI based controllers since we use AAP.  NOTE: this also sets
  2593.        * the timer for the one command we might have queued in the case
  2594.        * of a synch reset.
  2595.        */
  2596.       aic7xxx_run_waiting_queues(p);
  2597.       unpause_sequencer(p, FALSE);
  2598.       DRIVER_UNLOCK
  2599.       if(scb == NULL)
  2600.         return(SCSI_RESET_SUCCESS|SCSI_RESET_HOST_RESET);
  2601.       else
  2602.         return(result);
  2603.       break;
  2604.   }
  2605. }
  2606. /*+F*************************************************************************
  2607.  * Function:
  2608.  *   aic7xxx_biosparam
  2609.  *
  2610.  * Description:
  2611.  *   Return the disk geometry for the given SCSI device.
  2612.  *-F*************************************************************************/
  2613. int
  2614. aic7xxx_biosparam(Disk *disk, kdev_t dev, int geom[])
  2615. {
  2616.   int heads, sectors, cylinders, ret;
  2617.   struct aic7xxx_host *p;
  2618.   struct buffer_head *bh;
  2619.   p = (struct aic7xxx_host *) disk->device->host->hostdata;
  2620.   bh = bread(MKDEV(MAJOR(dev), MINOR(dev)&~0xf), 0, block_size(dev));
  2621.   if ( bh )
  2622.   {
  2623.     ret = scsi_partsize(bh, disk->capacity, &geom[2], &geom[0], &geom[1]);
  2624.     brelse(bh);
  2625.     if ( ret != -1 )
  2626.       return(ret);
  2627.   }
  2628.   
  2629.   heads = 64;
  2630.   sectors = 32;
  2631.   cylinders = disk->capacity / (heads * sectors);
  2632.   if ((p->flags & AHC_EXTEND_TRANS_A) && (cylinders > 1024))
  2633.   {
  2634.     heads = 255;
  2635.     sectors = 63;
  2636.     cylinders = disk->capacity / (heads * sectors);
  2637.   }
  2638.   geom[0] = heads;
  2639.   geom[1] = sectors;
  2640.   geom[2] = cylinders;
  2641.   return (0);
  2642. }
  2643. /*+F*************************************************************************
  2644.  * Function:
  2645.  *   aic7xxx_release
  2646.  *
  2647.  * Description:
  2648.  *   Free the passed in Scsi_Host memory structures prior to unloading the
  2649.  *   module.
  2650.  *-F*************************************************************************/
  2651. int
  2652. aic7xxx_release(struct Scsi_Host *host)
  2653. {
  2654.   struct aic7xxx_host *p = (struct aic7xxx_host *) host->hostdata;
  2655.   struct aic7xxx_host *next, *prev;
  2656.   if(p->irq)
  2657.     free_irq(p->irq, p);
  2658.   if(p->base)
  2659.     release_region(p->base, MAXREG - MINREG);
  2660. #ifdef MMAPIO
  2661.   if(p->maddr)
  2662.   {
  2663.     iounmap((void *) (((unsigned long) p->maddr) & PAGE_MASK));
  2664.   }
  2665. #endif /* MMAPIO */
  2666.   prev = NULL;
  2667.   next = first_aic7xxx;
  2668.   while(next != NULL)
  2669.   {
  2670.     if(next == p)
  2671.     {
  2672.       if(prev == NULL)
  2673.         first_aic7xxx = next->next;
  2674.       else
  2675.         prev->next = next->next;
  2676.     }
  2677.     else
  2678.     {
  2679.       prev = next;
  2680.     }
  2681.     next = next->next;
  2682.   }
  2683.   aic7xxx_free(p);
  2684.   return(0);
  2685. }
  2686. /*+F*************************************************************************
  2687.  * Function:
  2688.  *   aic7xxx_print_card
  2689.  *
  2690.  * Description:
  2691.  *   Print out all of the control registers on the card
  2692.  *
  2693.  *   NOTE: This function is not yet safe for use on the VLB and EISA
  2694.  *   controllers, so it isn't used on those controllers at all.
  2695.  *-F*************************************************************************/
  2696. static void
  2697. aic7xxx_print_card(struct aic7xxx_host *p)
  2698. {
  2699.   int i, j, k, chip;
  2700.   static struct register_ranges {
  2701.     int num_ranges;
  2702.     int range_val[32];
  2703.   } cards_ds[] = {
  2704.     { 0, {0,} }, /* none */
  2705.     {10, {0x00, 0x05, 0x08, 0x11, 0x18, 0x19, 0x1f, 0x1f, 0x60, 0x60, /*7771*/
  2706.           0x62, 0x66, 0x80, 0x8e, 0x90, 0x95, 0x97, 0x97, 0x9b, 0x9f} },
  2707.     { 9, {0x00, 0x05, 0x08, 0x11, 0x18, 0x1f, 0x60, 0x60, 0x62, 0x66, /*7850*/
  2708.           0x80, 0x8e, 0x90, 0x95, 0x97, 0x97, 0x9a, 0x9f} },
  2709.     { 9, {0x00, 0x05, 0x08, 0x11, 0x18, 0x1f, 0x60, 0x60, 0x62, 0x66, /*7860*/
  2710.           0x80, 0x8e, 0x90, 0x95, 0x97, 0x97, 0x9a, 0x9f} },
  2711.     {10, {0x00, 0x05, 0x08, 0x11, 0x18, 0x19, 0x1c, 0x1f, 0x60, 0x60, /*7870*/
  2712.           0x62, 0x66, 0x80, 0x8e, 0x90, 0x95, 0x97, 0x97, 0x9a, 0x9f} },
  2713.     {10, {0x00, 0x05, 0x08, 0x11, 0x18, 0x1a, 0x1c, 0x1f, 0x60, 0x60, /*7880*/
  2714.           0x62, 0x66, 0x80, 0x8e, 0x90, 0x95, 0x97, 0x97, 0x9a, 0x9f} },
  2715.     {16, {0x00, 0x05, 0x08, 0x11, 0x18, 0x1f, 0x60, 0x60, 0x62, 0x66, /*7890*/
  2716.           0x84, 0x8e, 0x90, 0x95, 0x97, 0x97, 0x9a, 0x9a, 0x9f, 0x9f,
  2717.           0xe0, 0xf1, 0xf4, 0xf4, 0xf6, 0xf6, 0xf8, 0xf8, 0xfa, 0xfc,
  2718.           0xfe, 0xff} },
  2719.     {12, {0x00, 0x05, 0x08, 0x11, 0x18, 0x19, 0x1b, 0x1f, 0x60, 0x60, /*7895*/
  2720.           0x62, 0x66, 0x80, 0x8e, 0x90, 0x95, 0x97, 0x97, 0x9a, 0x9a,
  2721.           0x9f, 0x9f, 0xe0, 0xf1} },
  2722.     {16, {0x00, 0x05, 0x08, 0x11, 0x18, 0x1f, 0x60, 0x60, 0x62, 0x66, /*7896*/
  2723.           0x84, 0x8e, 0x90, 0x95, 0x97, 0x97, 0x9a, 0x9a, 0x9f, 0x9f,
  2724.           0xe0, 0xf1, 0xf4, 0xf4, 0xf6, 0xf6, 0xf8, 0xf8, 0xfa, 0xfc,
  2725.           0xfe, 0xff} },
  2726.     {12, {0x00, 0x05, 0x08, 0x11, 0x18, 0x1f, 0x60, 0x60, 0x62, 0x66, /*7892*/
  2727.           0x84, 0x8e, 0x90, 0x95, 0x97, 0x97, 0x9a, 0x9a, 0x9c, 0x9f,
  2728.           0xe0, 0xf1, 0xf4, 0xfc} },
  2729.     {12, {0x00, 0x05, 0x08, 0x11, 0x18, 0x1f, 0x60, 0x60, 0x62, 0x66, /*7899*/
  2730.           0x84, 0x8e, 0x90, 0x95, 0x97, 0x97, 0x9a, 0x9a, 0x9c, 0x9f,
  2731.           0xe0, 0xf1, 0xf4, 0xfc} },
  2732.   };
  2733.   chip = p->chip & AHC_CHIPID_MASK;
  2734.   printk("%s at ",
  2735.          board_names[p->board_name_index]);
  2736.   switch(p->chip & ~AHC_CHIPID_MASK)
  2737.   {
  2738.     case AHC_VL:
  2739.       printk("VLB Slot %d.n", p->pci_device_fn);
  2740.       break;
  2741.     case AHC_EISA:
  2742.       printk("EISA Slot %d.n", p->pci_device_fn);
  2743.       break;
  2744.     case AHC_PCI:
  2745.     default:
  2746.       printk("PCI %d/%d/%d.n", p->pci_bus, PCI_SLOT(p->pci_device_fn),
  2747.              PCI_FUNC(p->pci_device_fn));
  2748.       break;
  2749.   }
  2750.   /*
  2751.    * the registers on the card....
  2752.    */
  2753.   printk("Card Dump:n");
  2754.   k = 0;
  2755.   for(i=0; i<cards_ds[chip].num_ranges; i++)
  2756.   {
  2757.     for(j  = cards_ds[chip].range_val[ i * 2 ];
  2758.         j <= cards_ds[chip].range_val[ i * 2 + 1 ] ;
  2759.         j++)
  2760.     {
  2761.       printk("%02x:%02x ", j, aic_inb(p, j));
  2762.       if(++k == 13)
  2763.       {
  2764.         printk("n");
  2765.         k=0;
  2766.       }
  2767.     }
  2768.   }
  2769.   if(k != 0)
  2770.     printk("n");
  2771.   /*
  2772.    * If this was an Ultra2 controller, then we just hosed the card in terms
  2773.    * of the QUEUE REGS.  This function is only called at init time or by
  2774.    * the panic_abort function, so it's safe to assume a generic init time
  2775.    * setting here
  2776.    */
  2777.   if(p->features & AHC_QUEUE_REGS)
  2778.   {
  2779.     aic_outb(p, 0, SDSCB_QOFF);
  2780.     aic_outb(p, 0, SNSCB_QOFF);
  2781.     aic_outb(p, 0, HNSCB_QOFF);
  2782.   }
  2783. }
  2784. /*+F*************************************************************************
  2785.  * Function:
  2786.  *   aic7xxx_print_scratch_ram
  2787.  *
  2788.  * Description:
  2789.  *   Print out the scratch RAM values on the card.
  2790.  *-F*************************************************************************/
  2791. static void
  2792. aic7xxx_print_scratch_ram(struct aic7xxx_host *p)
  2793. {
  2794.   int i, k;
  2795.   k = 0;
  2796.   printk("Scratch RAM:n");
  2797.   for(i = SRAM_BASE; i < SEQCTL; i++)
  2798.   {
  2799.     printk("%02x:%02x ", i, aic_inb(p, i));
  2800.     if(++k == 13)
  2801.     {
  2802.       printk("n");
  2803.       k=0;
  2804.     }
  2805.   }
  2806.   if (p->features & AHC_MORE_SRAM)
  2807.   {
  2808.     for(i = TARG_OFFSET; i < 0x80; i++)
  2809.     {
  2810.       printk("%02x:%02x ", i, aic_inb(p, i));
  2811.       if(++k == 13)
  2812.       {
  2813.         printk("n");
  2814.         k=0;
  2815.       }
  2816.     }
  2817.   }
  2818.   printk("n");
  2819. }
  2820. #include "aic7xxx_old/aic7xxx_proc.c"
  2821. MODULE_LICENSE("Dual BSD/GPL");
  2822. /* Eventually this will go into an include file, but this will be later */
  2823. static Scsi_Host_Template driver_template = AIC7XXX;
  2824. #include "scsi_module.c"
  2825. /*
  2826.  * Overrides for Emacs so that we almost follow Linus's tabbing style.
  2827.  * Emacs will notice this stuff at the end of the file and automatically
  2828.  * adjust the settings for this buffer only.  This must remain at the end
  2829.  * of the file.
  2830.  * ---------------------------------------------------------------------------
  2831.  * Local variables:
  2832.  * c-indent-level: 2
  2833.  * c-brace-imaginary-offset: 0
  2834.  * c-brace-offset: -2
  2835.  * c-argdecl-indent: 2
  2836.  * c-label-offset: -2
  2837.  * c-continued-statement-offset: 2
  2838.  * c-continued-brace-offset: 0
  2839.  * indent-tabs-mode: nil
  2840.  * tab-width: 8
  2841.  * End:
  2842.  */