static int netx_eth_hard_start_xmit(struct sk_buff *skb, struct net_device *ndev) { struct netx_eth_priv *priv = netdev_priv(ndev); unsigned char *buf = skb->data; unsigned int len = skb->len; spin_lock_irq(&priv->lock); memcpy_toio(priv->sram_base + 1560, (void *)buf, len); if (len < 60) { memset_io(priv->sram_base + 1560 + len, 0, 60 - len); len = 60; } pfifo_push(REQ_FIFO_PORT_LO(priv->id), FIFO_PTR_SEGMENT(priv->id) | FIFO_PTR_FRAMENO(1) | FIFO_PTR_FRAMELEN(len)); ndev->stats.tx_packets++; ndev->stats.tx_bytes += skb->len; netif_stop_queue(ndev); spin_unlock_irq(&priv->lock); dev_kfree_skb(skb); return NETDEV_TX_OK; }
static int netx_eth_send (struct eth_device *edev, void *packet, int length) { struct netx_eth_priv *priv = (struct netx_eth_priv *)edev->priv; int xcno = priv->xcno; unsigned int val; int timeout = 500; unsigned char *dst = (unsigned char *)(SRAM_BASE(xcno) + 1560); memcpy(dst, (void *)packet, length); if( length < 60 ) { memset(dst + length, 0, 60 - length); length = 60; } PFIFO_REG(PFIFO_BASE(REQ_FIFO_PORT_LO(xcno))) = FIFO_PTR_SEGMENT(xcno) | FIFO_PTR_FRAMENO(1) | FIFO_PTR_FRAMELEN(length); while (!PFIFO_REG( PFIFO_FILL_LEVEL(CON_FIFO_PORT_LO(xcno))) && timeout) { timeout--; udelay(100); } #if 0 if (!timeout) { loadxc(0); loadxc(1); eth_init(gd->bd); return -1; } #endif val = PFIFO_REG( PFIFO_BASE(CON_FIFO_PORT_LO(xcno)) ); if((val & FIFO_PTR_ERROR_MASK) & 0x8) printf("error sending frame: %d\n",val); return 0; }