static void locomx_rx(struct z8530_channel *c, struct sk_buff *skb) { struct net_device *dev = c->netdevice; struct comx_channel *ch = netdev_priv(dev); if (ch->debug_flags & DEBUG_HW_RX) { comx_debug_skb(dev, skb, "locomx_rx receiving"); } ch->LINE_rx(dev,skb); }
int comx_rx(struct net_device *dev, struct sk_buff *skb) { struct comx_channel *ch = dev->priv; if (ch->debug_flags & DEBUG_COMX_RX) { comx_debug_skb(dev, skb, "comx_rx skb"); } if (skb) { netif_rx(skb); dev->last_rx = jiffies; } return 0; }
static inline void mixcom_receive_frame(struct net_device *dev) { struct comx_channel *ch=dev->priv; struct mixcom_privdata *hw=ch->HW_privdata; register byte rsta; register word length; rsta = rd_hscx(dev, HSCX_RSTA) & (HSCX_VFR | HSCX_RDO | HSCX_CRC | HSCX_RAB); length = ((rd_hscx(dev, HSCX_RBCH) & 0x0f) << 8) | rd_hscx(dev, HSCX_RBCL); if ( length > hw->rx_ptr ) { hscx_empty_fifo(dev, length - hw->rx_ptr); } if (!(rsta & HSCX_VFR)) { ch->stats.rx_length_errors++; } if (rsta & HSCX_RDO) { ch->stats.rx_over_errors++; } if (!(rsta & HSCX_CRC)) { ch->stats.rx_crc_errors++; } if (rsta & HSCX_RAB) { ch->stats.rx_frame_errors++; } ch->stats.rx_packets++; ch->stats.rx_bytes += length; if (rsta == (HSCX_VFR | HSCX_CRC) && hw->recving) { skb_trim(hw->recving, hw->rx_ptr - 1); if (ch->debug_flags & DEBUG_HW_RX) { comx_debug_skb(dev, hw->recving, "MIXCOM_interrupt receiving"); } hw->recving->dev = dev; if (ch->LINE_rx) { ch->LINE_rx(dev, hw->recving); } } else if(hw->recving) { kfree_skb(hw->recving); } hw->recving = NULL; hw->rx_ptr = 0; }
static int comx_xmit(struct sk_buff *skb, struct net_device *dev) { struct comx_channel *ch = dev->priv; int rc; if (skb->len > dev->mtu + dev->hard_header_len) { printk(KERN_ERR "comx_xmit: %s: skb->len %d > dev->mtu %d\n", dev->name, (int)skb->len, dev->mtu); } if (ch->debug_flags & DEBUG_COMX_TX) { comx_debug_skb(dev, skb, "comx_xmit skb"); } rc=ch->LINE_xmit(skb, dev); // if (!rc) dev_kfree_skb(skb); return rc; }