static int e21_close(struct net_device *dev) { short ioaddr = dev->base_addr; if (ei_debug > 1) printk("%s: Shutting down ethercard.\n", dev->name); free_irq(dev->irq, dev); dev->irq = ei_status.saved_irq; /* Shut off the interrupt line and secondary interface. */ inb(ioaddr + E21_IRQ_LOW); outb(0, ioaddr + E21_ASIC); inb(ioaddr + E21_IRQ_HIGH); /* High IRQ bit, and if_port. */ outb(0, ioaddr + E21_ASIC); ei_close(dev); /* Double-check that the memory has been turned off, because really really bad things happen if it isn't. */ mem_off(ioaddr); return 0; }
/* Block input and output are easy on shared memory ethercards. The E21xx makes block_input() especially easy by wrapping the top ring buffer to the bottom automatically. */ static void e21_block_input(struct net_device *dev, int count, struct sk_buff *skb, int ring_offset) { short ioaddr = dev->base_addr; char __iomem *shared_mem = ei_status.mem; mem_on(ioaddr, shared_mem, (ring_offset>>8)); memcpy_fromio(skb->data, ei_status.mem + (ring_offset & 0xff), count); mem_off(ioaddr); }
/* Block input and output are easy on shared memory ethercards. The E21xx makes block_input() especially easy by wrapping the top ring buffer to the bottom automatically. */ static void e21_block_input(struct net_device *dev, int count, struct sk_buff *skb, int ring_offset) { short ioaddr = dev->base_addr; char __iomem *shared_mem = ei_status.mem; mem_on(ioaddr, shared_mem, (ring_offset>>8)); /* Packet is always in one chunk -- we can copy + cksum. */ eth_io_copy_and_sum(skb, ei_status.mem + (ring_offset & 0xff), count, 0); mem_off(ioaddr); }
static void e21_block_output(struct net_device *dev, int count, const unsigned char *buf, int start_page) { short ioaddr = dev->base_addr; volatile char __iomem *shared_mem = ei_status.mem; /* Set the shared memory window start by doing a read, with the low address bits specifying the starting page. */ readb(shared_mem + start_page); mem_on(ioaddr, shared_mem, start_page); memcpy_toio(shared_mem, buf, count); mem_off(ioaddr); }
static void e21_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page) { short ioaddr = dev->base_addr; char __iomem *shared_mem = ei_status.mem; mem_on(ioaddr, shared_mem, ring_page); #ifdef notdef /* Officially this is what we are doing, but the readl() is faster */ memcpy_fromio(hdr, shared_mem, sizeof(struct e8390_pkt_hdr)); #else ((unsigned int*)hdr)[0] = readl(shared_mem); #endif /* Turn off memory access: we would need to reprogram the window anyway. */ mem_off(ioaddr); }