www.pudn.com > BSP_pcPentium.rar > sysNet.c


/* sysNet.c - Intel Architecture BSP network susbsystem support */

/* Copyright 2001 Wind River Systems, Inc. */

/*
modification history
--------------------
01b,23apr02,pai  Made DEC and GEI END driver config names consistent with
                 other END driver config names.
01a,24oct01,pai  written.
*/

/*
DESCRIPTION
This library contains BSP-specific routines for network subsystems,
including network interface card device driver configuration and
support routines.  Generic network interface drivers are not provided
in source code form.  As a result, this module does not #include the
actual device drivers via the C-preprocessor.

Note that the routines implemented in this file will not necessarily
be included in future versions of Wind River Systems' Intel Architecture
BSPs.

SEE ALSO:
.pG "Configuration"
*/


/* includes */

#ifdef  INCLUDE_END
#   include "sysDec21x40End.c"          /* dec21x40End support routines */
#   include "sysEl3c90xEnd.c"           /* el3c90xEnd support routines  */
#   include "sysElt3c509End.c"          /* elt3c509End support routines */
#   include "sysFei82557End.c"          /* fei82557End support routines */
#   include "sysGei82543End.c"          /* gei82543End support routines */
#   include "sysLn97xEnd.c"             /* ln97xEnd support routines    */
#   include "sysNe2000End.c"            /* ne2000End support routines   */
#   include "sysUltraEnd.c"             /* ultraEnd support routines    */
#endif  /* INCLUDE_END */

#ifdef  INCLUDE_BSD
#   include "sysNetif.c"                /* if_eex32 support routines    */
#endif /* INCLUDE_BSD */


#if defined(INCLUDE_PCI)            /* PCI Ethernet Device Support Code */


/* typedefs */

typedef STATUS (* INIT_FUNCPTR) (UINT32, UINT32, UINT32, UINT32, UINT32, UINT8);

typedef struct vendIdDesc               /* VEND_ID_DESC */
    {
    UINT32              vendorId;       /* PCI Vendor ID */
    INIT_FUNCPTR        pPciInitRtn;    /* associated pciInit() routine */

    } VEND_ID_DESC;


/* locals */

/* This table maps END PCI driver initialization routines to
 * the PCI Vendor IDs for supported (tested) device types.
 */

LOCAL VEND_ID_DESC vendorIdEnet [] =
    {
    #if defined(INCLUDE_DEC21X40_END)
    {DEC_PCI_VENDOR_ID,      sysDec21x40PciInit},
    #endif /* INCLUDE_DEC21X40_END */

    #if defined(INCLUDE_LN_97X_END)
    {AMD_PCI_VENDOR_ID,      sysLan97xPciInit},
    #endif /* INCLUDE_LN_97X_END */

    #if defined(INCLUDE_EL_3C90X_END)
    {THREECOM_PCI_VENDOR_ID, sysEl3c90xPciInit},
    #endif /* INCLUDE_EL_3C90X_END */

    #if defined(INCLUDE_GEI8254X_END)
    {INTEL_PCI_VENDOR_ID,    sys543PciInit},
    #endif /* INCLUDE_GEI8254X_END */

    #if defined(INCLUDE_FEI_END)
    {INTEL_PCI_VENDOR_ID,    sys557PciInit},
    #endif /* INCLUDE_FEI_END */

    {0xffffffff, NULL}        /* last entry */
    };



/*******************************************************************************
*
* sysNetPciInit - initialize PCI network devices
*
* This routine invokes the driver or BSP-specific PCI initialization routine
* for a Network Class, Ethernet Subclass, device specified by the ,
* , and  parameters.
*
* The interface is constructed such that this function can be invoked
* via pciConfigForeachFunc().  Internally, this routine tests the 24-bit
* PCI class code value (class/subclass/prog_if) to ensure that the
* specified function is an ethernet controller.
*
* INTERNAL
* This callback will terminate pciConfigForeachFunc() if it returns ERROR.
* So, this routine returns OK always such that a failure to config one
* ethernet device will not prevent attempts to initialize other ethernet
* devices.
*
* RETURNS: OK always.
*
* NOMANUAL
*/
STATUS sysNetPciInit
    (
    UINT32              pciBus,        /* store a PCI bus number */
    UINT32              pciDevice,     /* store a PCI device number */
    UINT32              pciFunc,       /* store a PCI function number */
    void *              pArg           /* reserved argument */
    )
    {
    UINT32              classCodeReg;  /* store a 24-bit PCI class code */


    pciConfigInLong (pciBus, pciDevice, pciFunc, PCI_CFG_REVISION,
                     &classCodeReg);

    if (((classCodeReg >> 8) & 0x00ffffff) == PCI_NET_ETHERNET_CLASS)
        {
        UINT32        vendorId;    /* store a PCI vendor ID */
        UINT32        deviceId;    /* store a PCI device ID */
        UINT8         revisionId;  /* store a PCI revision ID */
        int           i;           /* index Vendor ID --> pciInit() table */


        /* get the PCI Vendor and Device IDs */

        pciConfigInLong (pciBus, pciDevice, pciFunc,
                         PCI_CFG_VENDOR_ID, &vendorId);

        /* get the PCI Revision ID */

        pciConfigInByte (pciBus, pciDevice, pciFunc,
                         PCI_CFG_REVISION, &revisionId);

        /* test for driver support of the specified Ethernet function */

        deviceId = ((vendorId >> 16) & 0x0000ffff);
        vendorId = (vendorId & 0x0000ffff);

        /* find & exec. a PCI initialization routine for the device */

        for (i = 0; (vendorIdEnet[i].pPciInitRtn) != NULL; ++i)
            {
            if ((vendorId == vendorIdEnet[i].vendorId) &&
                (*(vendorIdEnet[i].pPciInitRtn))
                (pciBus, pciDevice, pciFunc,
                 vendorId, deviceId, revisionId) == OK)
                {
                /* initialized the device - move on */

                return OK;
                }
            }
        }

    return (OK);
    }

#endif /* INCLUDE_PCI */


#if (defined(INCLUDE_DEC21X40_END) || defined(INCLUDE_ENE_END))

/*******************************************************************************
*
* sysLanIntEnable - enable 21x4x or Ne2000 ethernet device interrupts
*
* This routine enables DEC 21x4x or Ne2000 interrupts.  This may involve
* operations on interrupt control hardware.
*
* NOTE
* This is a legacy END driver support routine.  Early END driver
* implementations tended to use identical names for external support
* routines defined in the BSP.  As a result, a BSP configuration that
* selects such drivers for a build will fail with multiple definitions
* if the routine is defined separately for each driver.  Such namespace
* collisions will be resolved in future versions of the Wind River END
* drivers.
*
* RETURNS: Ok or ERROR for invalid arguments.
*/
STATUS sysLanIntEnable
    (
    int level        /* interrupt level to enable */
    )
    {
    return (sysIntEnablePIC (level));
    }

/*******************************************************************************
*
* sysLanIntDisable - disable 21x4x or Ne2000 ethernet device interrupts
*
* This routine disables DEC 21x4x or Ne2000 interrupts.  This may involve
* operations on interrupt control hardware.
*
* NOTE
* This is a legacy END driver support routine.  Early END driver
* implementations tended to use identical names for external support
* routines defined in the BSP.  As a result, a BSP configuration that
* selects such drivers for a build will fail with multiple definitions
* if the routine is defined separately for each driver.  Such namespace
* collisions will be resolved in future versions of the Wind River END
* drivers.
*
* RETURNS: OK or ERROR for invalid arguments.
*/
STATUS sysLanIntDisable
    (
    int level        /* interrupt level to disable */
    )
    {
    return (sysIntDisablePIC (level));
    }

#endif /* INCLUDE_DEC21X40_END || INCLUDE_ENE_END */