/* * We have a good packet, get it out of the adapter. */ static void de600_rx_intr(struct net_device *dev) { struct sk_buff *skb; int i; int read_from; int size; unsigned char *buffer; /* Get size of received packet */ size = de600_read_byte(RX_LEN, dev); /* low byte */ size += (de600_read_byte(RX_LEN, dev) << 8); /* high byte */ size -= 4; /* Ignore trailing 4 CRC-bytes */ /* Tell adapter where to store next incoming packet, enable receiver */ read_from = rx_page_adr(); next_rx_page(); de600_put_command(RX_ENABLE); if ((size < 32) || (size > 1535)) { printk(KERN_WARNING "%s: Bogus packet size %d.\n", dev->name, size); if (size > 10000) adapter_init(dev); return; } skb = dev_alloc_skb(size+2); if (skb == NULL) { printk("%s: Couldn't allocate a sk_buff of size %d.\n", dev->name, size); return; } /* else */ skb->dev = dev; skb_reserve(skb,2); /* Align */ /* 'skb->data' points to the start of sk_buff data area. */ buffer = skb_put(skb,size); /* copy the packet into the buffer */ de600_setup_address(read_from, RW_ADDR); for (i = size; i > 0; --i, ++buffer) *buffer = de600_read_byte(READ_DATA, dev); skb->protocol=eth_type_trans(skb,dev); netif_rx(skb); /* update stats */ dev->last_rx = jiffies; ((struct net_device_stats *)(dev->priv))->rx_packets++; /* count all receives */ ((struct net_device_stats *)(dev->priv))->rx_bytes += size; /* count all received bytes */ /* * If any worth-while packets have been received, netif_rx() * will work on them when we get to the tasklets. */ }
/* * We have a good packet, get it out of the adapter. */ static void de600_rx_intr(struct device *dev) { struct sk_buff *skb; int i; int read_from; int size; register unsigned char *buffer; cli(); /* Get size of received packet */ size = de600_read_byte(RX_LEN, dev); /* low byte */ size += (de600_read_byte(RX_LEN, dev) << 8); /* high byte */ size -= 4; /* Ignore trailing 4 CRC-bytes */ /* Tell adapter where to store next incoming packet, enable receiver */ read_from = rx_page_adr(); next_rx_page(); de600_put_command(RX_ENABLE); sti(); if ((size < 32) || (size > 1535)) { printk("%s: Bogus packet size %d.\n", dev->name, size); if (size > 10000) adapter_init(dev); return; } skb = alloc_skb(size, GFP_ATOMIC); sti(); if (skb == NULL) { printk("%s: Couldn't allocate a sk_buff of size %d.\n", dev->name, size); return; } /* else */ skb->lock = 0; /* 'skb->data' points to the start of sk_buff data area. */ buffer = skb->data; /* copy the packet into the buffer */ de600_setup_address(read_from, RW_ADDR); for (i = size; i > 0; --i, ++buffer) *buffer = de600_read_byte(READ_DATA, dev); ((struct netstats *)(dev->priv))->rx_packets++; /* count all receives */ if (dev_rint((unsigned char *)skb, size, IN_SKBUFF, dev)) printk("%s: receive buffers full.\n", dev->name); /* * If any worth-while packets have been received, dev_rint() * has done a mark_bh(INET_BH) for us and will work on them * when we get to the bottom-half routine. */ }
static void de600_rx_intr(struct net_device *dev) { struct sk_buff *skb; int i; int read_from; int size; unsigned char *buffer; /* */ size = de600_read_byte(RX_LEN, dev); /* */ size += (de600_read_byte(RX_LEN, dev) << 8); /* */ size -= 4; /* */ /* */ read_from = rx_page_adr(); next_rx_page(); de600_put_command(RX_ENABLE); if ((size < 32) || (size > 1535)) { printk(KERN_WARNING "%s: Bogus packet size %d.\n", dev->name, size); if (size > 10000) adapter_init(dev); return; } skb = netdev_alloc_skb(dev, size + 2); if (skb == NULL) { printk("%s: Couldn't allocate a sk_buff of size %d.\n", dev->name, size); return; } /* */ skb_reserve(skb,2); /* */ /* */ buffer = skb_put(skb,size); /* */ de600_setup_address(read_from, RW_ADDR); for (i = size; i > 0; --i, ++buffer) *buffer = de600_read_byte(READ_DATA, dev); skb->protocol=eth_type_trans(skb,dev); netif_rx(skb); /* */ dev->stats.rx_packets++; /* */ dev->stats.rx_bytes += size; /* */ /* */ }