@ -48,6 +48,27 @@
unsigned int emac_dbg = 0 ;
# define debug_emac(fmt,args...) if (emac_dbg) printf(fmt,##args)
# ifdef EMAC_HW_RAM_ADDR
static inline unsigned long BD_TO_HW ( unsigned long x )
{
if ( x = = 0 )
return 0 ;
return x - EMAC_WRAPPER_RAM_ADDR + EMAC_HW_RAM_ADDR ;
}
static inline unsigned long HW_TO_BD ( unsigned long x )
{
if ( x = = 0 )
return 0 ;
return x - EMAC_HW_RAM_ADDR + EMAC_WRAPPER_RAM_ADDR ;
}
# else
# define BD_TO_HW(x) (x)
# define HW_TO_BD(x) (x)
# endif
# ifdef DAVINCI_EMAC_GIG_ENABLE
# define emac_gigabit_enable(phy_addr) davinci_eth_gigabit_enable(phy_addr)
# else
@ -448,7 +469,7 @@ static int davinci_eth_open(struct eth_device *dev, bd_t *bis)
/* Create RX queue and set receive process in place */
emac_rx_active_head = emac_rx_desc ;
for ( cnt = 0 ; cnt < EMAC_MAX_RX_BUFFERS ; cnt + + ) {
rx_desc - > next = ( u_int32_t ) ( rx_desc + 1 ) ;
rx_desc - > next = BD_TO_HW ( ( u_int32_t ) ( rx_desc + 1 ) ) ;
rx_desc - > buffer = & emac_rx_buffers [ cnt * ( EMAC_MAX_ETHERNET_PKT_SIZE + EMAC_PKT_ALIGN ) ] ;
rx_desc - > buff_off_len = EMAC_MAX_ETHERNET_PKT_SIZE ;
rx_desc - > pkt_flag_len = EMAC_CPPI_OWNERSHIP_BIT ;
@ -501,7 +522,7 @@ static int davinci_eth_open(struct eth_device *dev, bd_t *bis)
emac_gigabit_enable ( active_phy_addr [ index ] ) ;
/* Start receive process */
writel ( ( u_int32_t ) emac_rx_desc , & adap_emac - > RX0HDP ) ;
writel ( BD_TO_HW ( ( u_int32_t ) emac_rx_desc ) , & adap_emac - > RX0HDP ) ;
debug_emac ( " - emac_open \n " ) ;
@ -619,7 +640,7 @@ static int davinci_eth_send_packet (struct eth_device *dev,
EMAC_CPPI_OWNERSHIP_BIT |
EMAC_CPPI_EOP_BIT ) ;
/* Send the packet */
writel ( ( unsigned long ) emac_tx_desc , & adap_emac - > TX0HDP ) ;
writel ( BD_TO_HW ( ( unsigned long ) emac_tx_desc ) , & adap_emac - > TX0HDP ) ;
/* Wait for packet to complete or link down */
while ( 1 ) {
@ -663,14 +684,14 @@ static int davinci_eth_rcv_packet (struct eth_device *dev)
}
/* Ack received packet descriptor */
writel ( ( unsigned long ) rx_curr_desc , & adap_emac - > RX0CP ) ;
writel ( BD_TO_HW ( ( u long) rx_curr_desc ) , & adap_emac - > RX0CP ) ;
curr_desc = rx_curr_desc ;
emac_rx_active_head =
( volatile emac_desc * ) rx_curr_desc - > next ;
( volatile emac_desc * ) ( HW_TO_BD ( rx_curr_desc - > next ) ) ;
if ( status & EMAC_CPPI_EOQ_BIT ) {
if ( emac_rx_active_head ) {
writel ( ( unsigned long ) emac_rx_active_head ,
writel ( BD_TO_HW ( ( u long) emac_rx_active_head ) ,
& adap_emac - > RX0HDP ) ;
} else {
emac_rx_queue_active = 0 ;
@ -688,7 +709,7 @@ static int davinci_eth_rcv_packet (struct eth_device *dev)
emac_rx_active_head = curr_desc ;
emac_rx_active_tail = curr_desc ;
if ( emac_rx_queue_active ! = 0 ) {
writel ( ( unsigned long ) emac_rx_active_head ,
writel ( BD_TO_HW ( ( u long) emac_rx_active_head ) ,
& adap_emac - > RX0HDP ) ;
printf ( " INFO: emac_rcv_pkt: active queue head = 0, HDP fired \n " ) ;
emac_rx_queue_active = 1 ;
@ -696,10 +717,10 @@ static int davinci_eth_rcv_packet (struct eth_device *dev)
} else {
tail_desc = emac_rx_active_tail ;
emac_rx_active_tail = curr_desc ;
tail_desc - > next = ( unsigned int ) curr_desc ;
tail_desc - > next = BD_TO_HW ( ( ulong ) curr_desc ) ;
status = tail_desc - > pkt_flag_len ;
if ( status & EMAC_CPPI_EOQ_BIT ) {
writel ( ( unsigned long ) curr_desc ,
writel ( BD_TO_HW ( ( u long) curr_desc ) ,
& adap_emac - > RX0HDP ) ;
status & = ~ EMAC_CPPI_EOQ_BIT ;
tail_desc - > pkt_flag_len = status ;