Example #1
0
LOCAL void * cacheLsn2eVirtToPhys
    (
    void * address                      /* Virtual address */
    )
    {
    return ((void *) K0_TO_PHYS(address));
    }
/*
 * bcm6352_init_dev: initialize Ethernet Switch device,
 * allocate Tx/Rx buffer descriptors pool, Tx control block pool.
 */
static int bcm6352_init_dev(bcm6352enet_softc *softc)
{
    unsigned long i, j;
    unsigned char *p = NULL;

    /* make sure emac clock is on */
    INTC->blkEnables |= (ESWITCH_CLK_EN | EPHY_CLK_EN);

    /* setup buffer/pointer relationships here */
    softc->nrRxBds = NR_RX_BDS;
    softc->rxBufLen = ENET_MAX_MTU_SIZE;

    /* init rx/tx dma channels */
    softc->dmaChannels = (DmaChannel *)(DMA_BASE);
    softc->rxDma = &softc->dmaChannels[EMAC_RX_CHAN];
    softc->txDma = &softc->dmaChannels[EMAC_TX_CHAN];

    p = (unsigned char *) (((uint32_t) softc->txBuf + 0x10) & ~0x0f);
    softc->txBufPtr = (unsigned char *)K0_TO_K1((uint32_t) p);

    p = (unsigned char *) (((uint32_t) softc->rxMem + 0x10) & ~0x0f);
    softc->rxBds = (DmaDesc *)K0_TO_K1((uint32_t) p);
    p += softc->nrRxBds * sizeof(DmaDesc);
    softc->rxBuffers = (unsigned char *) K0_TO_PHYS((uint32_t) p);

    /* initialize rx ring pointer variables. */
    softc->rxBdAssignPtr = softc->rxBdReadPtr = softc->rxBds;
    softc->rxFirstBdPtr = softc->rxBds;
    softc->rxLastBdPtr = softc->rxFirstBdPtr + softc->nrRxBds - 1;

    /* init the receive buffer descriptor ring */
    for (i = 0, j = (unsigned long) softc->rxBuffers; i < softc->nrRxBds;
        i++, j += softc->rxBufLen)
    {
        (softc->rxFirstBdPtr + i)->length = softc->rxBufLen;
        (softc->rxFirstBdPtr + i)->address = j;
        (softc->rxFirstBdPtr + i)->status = DMA_OWN;
    }
    softc->rxLastBdPtr->status = DMA_OWN | DMA_WRAP;

    /* init dma registers */
    init_dma(softc);

    /* init switch control registers */
    init_mii(softc);

    softc->rxDma->cfg |= DMA_ENABLE;

    /* if we reach this point, we've init'ed successfully */
    return 0;
}