@ -532,43 +532,54 @@ static int zynq_gem_send(struct udevice *dev, void *ptr, int len)
static int zynq_gem_recv ( struct udevice * dev , int flags , uchar * * packetp )
{
int frame_len ;
u32 addr ;
struct zynq_gem_priv * priv = dev_get_priv ( dev ) ;
struct emac_bd * current_bd = & priv - > rx_bd [ priv - > rxbd_current ] ;
struct emac_bd * first_bd ;
if ( ! ( current_bd - > addr & ZYNQ_GEM_RXBUF_NEW_MASK ) )
return 0 ;
return - 1 ;
if ( ! ( current_bd - > status &
( ZYNQ_GEM_RXBUF_SOF_MASK | ZYNQ_GEM_RXBUF_EOF_MASK ) ) ) {
printf ( " GEM: SOF or EOF not set for last buffer received! \n " ) ;
return 0 ;
return - 1 ;
}
frame_len = current_bd - > status & ZYNQ_GEM_RXBUF_LEN_MASK ;
if ( frame_len ) {
u32 addr = current_bd - > addr & ZYNQ_GEM_RXBUF_ADD_MASK ;
addr & = ~ ( ARCH_DMA_MINALIGN - 1 ) ;
if ( ! frame_len ) {
printf ( " %s: Zero size packet? \n " , __func__ ) ;
return - 1 ;
}
net_process_received_packet ( ( u8 * ) ( ulong ) addr , frame_len ) ;
addr = current_bd - > addr & ZYNQ_GEM_RXBUF_ADD_MASK ;
addr & = ~ ( ARCH_DMA_MINALIGN - 1 ) ;
* packetp = ( uchar * ) ( uintptr_t ) addr ;
if ( current_bd - > status & ZYNQ_GEM_RXBUF_SOF_MASK )
priv - > rx_first_buf = priv - > rxbd_current ;
else {
current_bd - > addr & = ~ ZYNQ_GEM_RXBUF_NEW_MASK ;
current_bd - > status = 0xF0000000 ; /* FIXME */
}
return frame_len ;
}
if ( current_bd - > status & ZYNQ_GEM_RXBUF_EOF_MASK ) {
first_bd = & priv - > rx_bd [ priv - > rx_first_buf ] ;
first_bd - > addr & = ~ ZYNQ_GEM_RXBUF_NEW_MASK ;
first_bd - > status = 0xF0000000 ;
}
static int zynq_gem_free_pkt ( struct udevice * dev , uchar * packet , int length )
{
struct zynq_gem_priv * priv = dev_get_priv ( dev ) ;
struct emac_bd * current_bd = & priv - > rx_bd [ priv - > rxbd_current ] ;
struct emac_bd * first_bd ;
if ( current_bd - > status & ZYNQ_GEM_RXBUF_SOF_MASK ) {
priv - > rx_first_buf = priv - > rxbd_current ;
} else {
current_bd - > addr & = ~ ZYNQ_GEM_RXBUF_NEW_MASK ;
current_bd - > status = 0xF0000000 ; /* FIXME */
}
if ( ( + + priv - > rxbd_current ) > = RX_BUF )
priv - > rxbd_current = 0 ;
if ( current_bd - > status & ZYNQ_GEM_RXBUF_EOF_MASK ) {
first_bd = & priv - > rx_bd [ priv - > rx_first_buf ] ;
first_bd - > addr & = ~ ZYNQ_GEM_RXBUF_NEW_MASK ;
first_bd - > status = 0xF0000000 ;
}
if ( ( + + priv - > rxbd_current ) > = RX_BUF )
priv - > rxbd_current = 0 ;
return 0 ;
}
@ -651,6 +662,7 @@ static const struct eth_ops zynq_gem_ops = {
. start = zynq_gem_init ,
. send = zynq_gem_send ,
. recv = zynq_gem_recv ,
. free_pkt = zynq_gem_free_pkt ,
. stop = zynq_gem_halt ,
. write_hwaddr = zynq_gem_setup_mac ,
} ;