- skb_put(skb, framesize);
- skb_copy_to_linear_data(skb, rxbuf, framesize);
- skb->protocol = eth_type_trans(skb, netdev);
- netif_rx(skb);
-
- netdev->last_rx = jiffies;
- netdev->stats.rx_bytes += framesize;
- ++(netdev->stats.rx_packets);
+ /*
+ * Pass received packet to kernel
+ */
+ skb = rxbi->skb;
+ buf_dma = rxbi->mapping;
+ pci_dma_sync_single_for_cpu(jme->pdev,
+ buf_dma,
+ RX_BUF_SIZE,
+ PCI_DMA_FROMDEVICE);
+
+ if(unlikely(jme_make_new_rx_buf(jme, i))) {
+ pci_dma_sync_single_for_device(jme->pdev,
+ buf_dma,
+ RX_BUF_SIZE,
+ PCI_DMA_FROMDEVICE);
+ ++(NET_STAT.rx_dropped);
+ }
+ else {
+ framesize = le16_to_cpu(rxdesc->descwb.framesize);
+
+ skb_put(skb, framesize);
+ skb->protocol = eth_type_trans(skb, netdev);
+
+ netif_rx(skb);
+
+ if(le16_to_cpu(rxdesc->descwb.flags) & RXWBFLAG_DEST_MUL)
+ ++(NET_STAT.multicast);
+
+ netdev->last_rx = jiffies;
+ NET_STAT.rx_bytes += framesize;
+ ++(NET_STAT.rx_packets);
+ }
+
+ jme_set_clean_rxdesc(jme, i);
+
+#ifdef RX_PKT_DEBUG
+ dprintk(netdev->name, "DESCCNT: %u, FSIZE: %u, ADDRH: %08x, "
+ "ADDRL: %08x, FLAGS: %04x, STAT: %02x, "
+ "DST:%02x:%02x:%02x:%02x:%02x:%02x\n",
+ desccnt,
+ framesize,
+ le32_to_cpu(rxdesc->dw[2]),
+ le32_to_cpu(rxdesc->dw[3]),
+ le16_to_cpu(rxdesc->descwb.flags),
+ rxdesc->descwb.errstat,
+ rxbuf[0], rxbuf[1], rxbuf[2],
+ rxbuf[3], rxbuf[4], rxbuf[5]);
+#endif
+
+