@ -54,6 +54,7 @@ struct macb_dma_desc {
# define DMA_DESC_BYTES(n) (n * sizeof(struct macb_dma_desc))
# define MACB_TX_DMA_DESC_SIZE (DMA_DESC_BYTES(MACB_TX_RING_SIZE))
# define MACB_RX_DMA_DESC_SIZE (DMA_DESC_BYTES(MACB_RX_RING_SIZE))
# define MACB_TX_DUMMY_DMA_DESC_SIZE (DMA_DESC_BYTES(1))
# define RXADDR_USED 0x00000001
# define RXADDR_WRAP 0x00000002
@ -93,6 +94,9 @@ struct macb_device {
unsigned long rx_ring_dma ;
unsigned long tx_ring_dma ;
struct macb_dma_desc * dummy_desc ;
unsigned long dummy_desc_dma ;
const struct device * dev ;
struct eth_device netdev ;
unsigned short phy_addr ;
@ -525,6 +529,30 @@ static int macb_phy_init(struct macb_device *macb)
return 1 ;
}
static int gmac_init_multi_queues ( struct macb_device * macb )
{
int i , num_queues = 1 ;
u32 queue_mask ;
/* bit 0 is never set but queue 0 always exists */
queue_mask = gem_readl ( macb , DCFG6 ) & 0xff ;
queue_mask | = 0x1 ;
for ( i = 1 ; i < MACB_MAX_QUEUES ; i + + )
if ( queue_mask & ( 1 < < i ) )
num_queues + + ;
macb - > dummy_desc - > ctrl = TXBUF_USED ;
macb - > dummy_desc - > addr = 0 ;
flush_dcache_range ( macb - > dummy_desc_dma , macb - > dummy_desc_dma +
MACB_TX_DUMMY_DMA_DESC_SIZE ) ;
for ( i = 1 ; i < num_queues ; i + + )
gem_writel_queue_TBQP ( macb , macb - > dummy_desc_dma , i - 1 ) ;
return 0 ;
}
static int macb_init ( struct eth_device * netdev , bd_t * bd )
{
struct macb_device * macb = to_macb ( netdev ) ;
@ -565,6 +593,9 @@ static int macb_init(struct eth_device *netdev, bd_t *bd)
macb_writel ( macb , TBQP , macb - > tx_ring_dma ) ;
if ( macb_is_gem ( macb ) ) {
/* Check the multi queue and initialize the queue for tx */
gmac_init_multi_queues ( macb ) ;
/*
* When the GMAC IP with GE feature , this bit is used to
* select interface between RGMII and GMII .
@ -712,6 +743,8 @@ int macb_eth_initialize(int id, void *regs, unsigned int phy_addr)
& macb - > rx_ring_dma ) ;
macb - > tx_ring = dma_alloc_coherent ( MACB_TX_DMA_DESC_SIZE ,
& macb - > tx_ring_dma ) ;
macb - > dummy_desc = dma_alloc_coherent ( MACB_TX_DUMMY_DMA_DESC_SIZE ,
& macb - > dummy_desc_dma ) ;
/* TODO: we need check the rx/tx_ring_dma is dcache line aligned */