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; }