static void __exit c101_cleanup(void) { card_t *card = first_card; while (card) { card_t *ptr = card; card = card->next_card; unregister_hdlc_device(port_to_dev(ptr)); c101_destroy_card(ptr); } }
void cleanup_module(void) { card_t *card=first_card; while (card) { card_t *ptr=card; card=card->next_card; unregister_hdlc_device(&ptr->hdlc); c101_destroy_card(ptr); } }
static int __init c101_run(unsigned long irq, unsigned long winbase) { struct net_device *dev; hdlc_device *hdlc; card_t *card; int result; if (irq<3 || irq>15 || irq == 6) /* FIXME */ { printk(KERN_ERR "c101: invalid IRQ value\n"); return -ENODEV; } if (winbase < 0xC0000 || winbase > 0xDFFFF || (winbase & 0x3FFF) !=0) { printk(KERN_ERR "c101: invalid RAM value\n"); return -ENODEV; } card = kzalloc(sizeof(card_t), GFP_KERNEL); if (card == NULL) { printk(KERN_ERR "c101: unable to allocate memory\n"); return -ENOBUFS; } card->dev = alloc_hdlcdev(card); if (!card->dev) { printk(KERN_ERR "c101: unable to allocate memory\n"); kfree(card); return -ENOBUFS; } if (request_irq(irq, sca_intr, 0, devname, card)) { printk(KERN_ERR "c101: could not allocate IRQ\n"); c101_destroy_card(card); return -EBUSY; } card->irq = irq; if (!request_mem_region(winbase, C101_MAPPED_RAM_SIZE, devname)) { printk(KERN_ERR "c101: could not request RAM window\n"); c101_destroy_card(card); return -EBUSY; } card->phy_winbase = winbase; card->win0base = ioremap(winbase, C101_MAPPED_RAM_SIZE); if (!card->win0base) { printk(KERN_ERR "c101: could not map I/O address\n"); c101_destroy_card(card); return -EFAULT; } card->tx_ring_buffers = TX_RING_BUFFERS; card->rx_ring_buffers = RX_RING_BUFFERS; card->buff_offset = C101_WINDOW_SIZE; /* Bytes 1D00-1FFF reserved */ readb(card->win0base + C101_PAGE); /* Resets SCA? */ udelay(100); writeb(0, card->win0base + C101_PAGE); writeb(0, card->win0base + C101_DTR); /* Power-up for RAM? */ sca_init(card, 0); dev = port_to_dev(card); hdlc = dev_to_hdlc(dev); spin_lock_init(&card->lock); dev->irq = irq; dev->mem_start = winbase; dev->mem_end = winbase + C101_MAPPED_RAM_SIZE - 1; dev->tx_queue_len = 50; dev->do_ioctl = c101_ioctl; dev->open = c101_open; dev->stop = c101_close; hdlc->attach = sca_attach; hdlc->xmit = sca_xmit; card->settings.clock_type = CLOCK_EXT; result = register_hdlc_device(dev); if (result) { printk(KERN_WARNING "c101: unable to register hdlc device\n"); c101_destroy_card(card); return result; } sca_init_sync_port(card); /* Set up C101 memory */ set_carrier(card); printk(KERN_INFO "%s: Moxa C101 on IRQ%u," " using %u TX + %u RX packets rings\n", dev->name, card->irq, card->tx_ring_buffers, card->rx_ring_buffers); *new_card = card; new_card = &card->next_card; return 0; }
static int c101_run(unsigned long irq, unsigned long winbase) { card_t *card; int result; if (irq<3 || irq>15 || irq == 6) /* FIXME */ { printk(KERN_ERR "c101: invalid IRQ value\n"); return -ENODEV; } if (winbase<0xC0000 || winbase>0xDFFFF || (winbase&0x3FFF)!=0) { printk(KERN_ERR "c101: invalid RAM value\n"); return -ENODEV; } card=kmalloc(sizeof(card_t), GFP_KERNEL); if (card==NULL) { printk(KERN_ERR "c101: unable to allocate memory\n"); return -ENOBUFS; } memset(card, 0, sizeof(card_t)); if (request_irq(irq, sca_intr, 0, devname, card)) { printk(KERN_ERR "c101: could not allocate IRQ\n"); c101_destroy_card(card); return(-EBUSY); } card->irq=irq; card->win0base=(u8*)winbase; /* 2 rings required for 1 port */ card->ring_buffers = (RAM_SIZE-C101_WINDOW_SIZE) / (2 * HDLC_MAX_MTU); printk(KERN_DEBUG "c101: using %u packets rings\n",card->ring_buffers); card->buff_offset = C101_WINDOW_SIZE; /* Bytes 1D00-1FFF reserved */ readb(card->win0base+C101_PAGE); /* Resets SCA? */ udelay(100); writeb(0, card->win0base+C101_PAGE); writeb(0, card->win0base+C101_DTR); /* Power-up for RAM? */ sca_init(card, 0); card->hdlc.ioctl=sca_ioctl; card->hdlc.open=sca_open; card->hdlc.close=sca_close; hdlc_to_dev(&card->hdlc)->hard_start_xmit=sca_xmit; hdlc_to_dev(&card->hdlc)->irq=irq; hdlc_to_dev(&card->hdlc)->tx_queue_len=50; result=register_hdlc_device(&card->hdlc); if (result) { printk(KERN_WARNING "c101: unable to register hdlc device\n"); c101_destroy_card(card); return result; } sca_init_sync_port(card); /* Set up C101 memory */ *new_card=card; new_card=&card->next_card; return 0; }