aic79xx.h:
authorPeter Avalos <pavalos@dragonflybsd.org>
Wed, 4 Jul 2007 22:56:30 +0000 (22:56 +0000)
committerPeter Avalos <pavalos@dragonflybsd.org>
Wed, 4 Jul 2007 22:56:30 +0000 (22:56 +0000)
Add a 7901A specific feature definition.

aic79xx_pci.c:
Split out the general aic790X setup into it's own
setup handler that works on single and dual controllers.
Adjust all other PCI setup handlers to initialize the
chips basic features and type before calling the generic
handler.

Turn off a few Rev B workarounds that are not required
on the 7901B.

Obtained-from: FreeBSD

sys/dev/disk/aic7xxx/aic79xx.h
sys/dev/disk/aic7xxx/aic79xx_pci.c

index b36f2e8..e814ac8 100644 (file)
  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGES.
  *
- * $Id: //depot/aic7xxx/aic7xxx/aic79xx.h#92 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.h#93 $
  *
- * $FreeBSD: src/sys/dev/aic7xxx/aic79xx.h,v 1.3.2.6 2003/06/10 03:26:07 gibbs Exp $
- * $DragonFly: src/sys/dev/disk/aic7xxx/aic79xx.h,v 1.2 2003/06/17 04:28:21 dillon Exp $
+ * $FreeBSD: src/sys/dev/aic7xxx/aic79xx.h,v 1.14 2003/06/28 04:39:49 gibbs Exp $
+ * $DragonFly: src/sys/dev/disk/aic7xxx/aic79xx.h,v 1.3 2007/07/04 22:56:30 pavalos Exp $
  */
 
 #ifndef _AIC79XX_H_
@@ -232,6 +232,7 @@ typedef enum {
        AHD_NEW_DFCNTRL_OPTS    = 0x10000,/* SCSIENWRDIS bit */
        AHD_REMOVABLE           = 0x00000,/* Hot-Swap supported - None so far*/
        AHD_AIC7901_FE          = AHD_FENONE,
+       AHD_AIC7901A_FE         = AHD_FENONE,
        AHD_AIC7902_FE          = AHD_MULTI_FUNC
 } ahd_feature;
 
index 4ebb8a5..2bee063 100644 (file)
  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGES.
  *
- * $Id: //depot/aic7xxx/aic7xxx/aic79xx_pci.c#75 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx_pci.c#76 $
  *
- * $FreeBSD: src/sys/dev/aic7xxx/aic79xx_pci.c,v 1.3.2.5 2003/06/10 03:26:07 gibbs Exp $
- * $DragonFly: src/sys/dev/disk/aic7xxx/aic79xx_pci.c,v 1.6 2007/01/27 15:03:25 swildner Exp $
+ * $FreeBSD: src/sys/dev/aic7xxx/aic79xx_pci.c,v 1.14 2003/06/28 04:39:49 gibbs Exp $
+ * $DragonFly: src/sys/dev/disk/aic7xxx/aic79xx_pci.c,v 1.7 2007/07/04 22:56:30 pavalos Exp $
  */
 
 #ifdef __linux__
@@ -118,6 +118,7 @@ ahd_compose_id(u_int device, u_int vendor, u_int subdevice, u_int subvendor)
 static ahd_device_setup_t ahd_aic7901_setup;
 static ahd_device_setup_t ahd_aic7901A_setup;
 static ahd_device_setup_t ahd_aic7902_setup;
+static ahd_device_setup_t ahd_aic790X_setup;
 
 struct ahd_pci_identity ahd_pci_ident_table [] =
 {
@@ -912,29 +913,31 @@ ahd_pci_split_intr(struct ahd_softc *ahd, u_int intstat)
 static int
 ahd_aic7901_setup(struct ahd_softc *ahd)
 {
-       int error;
 
-       error = ahd_aic7902_setup(ahd);
-       if (error != 0)
-               return (error);
        ahd->chip = AHD_AIC7901;
-       return (0);
+       ahd->features = AHD_AIC7901_FE;
+       return (ahd_aic790X_setup(ahd));
 }
 
 static int
 ahd_aic7901A_setup(struct ahd_softc *ahd)
 {
-       int error;
 
-       error = ahd_aic7902_setup(ahd);
-       if (error != 0)
-               return (error);
        ahd->chip = AHD_AIC7901A;
-       return (0);
+       ahd->features = AHD_AIC7901A_FE;
+       return (ahd_aic790X_setup(ahd));
 }
 
 static int
 ahd_aic7902_setup(struct ahd_softc *ahd)
+{
+       ahd->chip = AHD_AIC7902;
+       ahd->features = AHD_AIC7902_FE;
+       return (ahd_aic790X_setup(ahd));
+}
+
+static int
+ahd_aic790X_setup(struct ahd_softc *ahd)
 {
        ahd_dev_softc_t pci;
        u_int rev;
@@ -948,8 +951,6 @@ ahd_aic7902_setup(struct ahd_softc *ahd)
                return (ENXIO);
        }
        ahd->channel = ahd_get_pci_function(pci) + 'A';
-       ahd->chip = AHD_AIC7902;
-       ahd->features = AHD_AIC7902_FE;
        if (rev < ID_AIC7902_PCI_REV_B0) {
                /*
                 * Enable A series workarounds.
@@ -978,8 +979,13 @@ ahd_aic7902_setup(struct ahd_softc *ahd)
 
                ahd->features |= AHD_RTI|AHD_NEW_IOCELL_OPTS
                              |  AHD_NEW_DFCNTRL_OPTS;
-               ahd->bugs |= AHD_LQOOVERRUN_BUG|AHD_ABORT_LQI_BUG
-                         |  AHD_INTCOLLISION_BUG|AHD_EARLY_REQ_BUG;
+               ahd->bugs |= AHD_LQOOVERRUN_BUG|AHD_EARLY_REQ_BUG;
+
+               /*
+                * Some issues have been resolved in the 7901B.
+                */
+               if ((ahd->features & AHD_MULTI_FUNC) != 0)
+                       ahd->bugs |= AHD_INTCOLLISION_BUG|AHD_ABORT_LQI_BUG;
 
                /*
                 * IO Cell paramter setup.