コード例 #1
0
int awc4500_isa_probe(struct net_device *dev)
{
//	int cards_found = 0;
//	static int isa_index;	/* Static, for multiple probe calls. */
    int isa_irq_line = 0;
    int isa_ioaddr = 0;
//	int p;
    int card = 0;
    int i=0;

    if (! io[0] || ! irq[0]) {

//		printk("       Both irq and io params must be supplied  for ISA mode !!!\n");
        return -ENODEV;
    }

    printk(KERN_WARNING "     Aironet ISA Card in non-PNP(ISA) mode sometimes feels bad on interrupt \n");
    printk(KERN_WARNING "     Use aironet4500_pnp if any problems(i.e. card malfunctioning). \n");
    printk(KERN_WARNING "     Note that this isa probe is not friendly... must give exact parameters \n");

    while (irq[card] != 0) {

        isa_ioaddr = io[card];
        isa_irq_line = irq[card];

        request_region(isa_ioaddr, AIRONET4X00_IO_SIZE, "aironet4x00 ioaddr");

        if (!dev) {
            dev = init_etherdev(NULL, 0);
            if (!dev) {
                release_region(isa_ioaddr, AIRONET4X00_IO_SIZE);
                return (card == 0) ? -ENOMEM : 0;
            }
        }
        dev->priv = kmalloc(sizeof(struct awc_private),GFP_KERNEL );
        memset(dev->priv,0,sizeof(struct awc_private));
        if (!dev->priv) {
            printk(KERN_CRIT "aironet4x00: could not allocate device private, some unstability may follow\n");
            return -1;
        };

        //	ether_setup(dev);

        //	dev->tx_queue_len = tx_queue_len;

        dev->hard_start_xmit = 		&awc_start_xmit;
        //	dev->set_config = 		&awc_config_misiganes,aga mitte awc_config;
        dev->get_stats = 		&awc_get_stats;
        //	dev->set_multicast_list = 	&awc_set_multicast_list;
        dev->change_mtu		=	awc_change_mtu;
        dev->init = &awc_init;
        dev->open = &awc_open;
        dev->stop = &awc_close;
        dev->base_addr = isa_ioaddr;
        dev->irq = isa_irq_line;
        dev->tx_timeout = &awc_tx_timeout;
        dev->watchdog_timeo = AWC_TX_TIMEOUT;

        request_irq(dev->irq,awc_interrupt ,SA_INTERRUPT ,"Aironet 4X00",dev);

        awc_private_init( dev);
        if ( awc_init(dev) ) {
            printk("card not found at irq %x mem %x\n",irq[card],io[card]);
            if (card==0)
                return -1;
            break;
        }

        i=0;
        while (aironet4500_devices[i] && i < MAX_AWCS-1) i++;
        if (!aironet4500_devices[i]) {
            aironet4500_devices[i]=dev;
            ((struct awc_private *)
             aironet4500_devices[i]->priv)->card_type = AIRONET4500_ISA;

            if (awc_proc_set_fun)
                awc_proc_set_fun(i);
        }

        card++;
    }
    if (card == 0 ) {
        return -ENODEV;
    };
    return 0;
}
コード例 #2
0
static int awc_pci_init(struct net_device * dev, struct pci_dev *pdev,
                        int ioaddr, int cis_addr, int mem_addr, u8 pci_irq_line) {

    int i, allocd_dev = 0;

    if (!dev) {
        dev = init_etherdev(NULL, 0);
        if (!dev)
            return -ENOMEM;
        allocd_dev = 1;
    }
    dev->priv = kmalloc(sizeof(struct awc_private),GFP_KERNEL );
    if (!dev->priv) {
        if (allocd_dev) {
            unregister_netdev(dev);
            kfree(dev);
        }
        return -ENOMEM;
    }
    memset(dev->priv,0,sizeof(struct awc_private));
    if (!dev->priv) {
        printk(KERN_CRIT "aironet4x00: could not allocate device private, some unstability may follow\n");
        if (allocd_dev) {
            unregister_netdev(dev);
            kfree(dev);
        }
        return -ENOMEM;
    };

//	ether_setup(dev);

//	dev->tx_queue_len = tx_queue_len;

    dev->hard_start_xmit = 		&awc_start_xmit;
//	dev->set_config = 		&awc_config_misiganes,aga mitte awc_config;
    dev->get_stats = 		&awc_get_stats;
//	dev->set_multicast_list = 	&awc_set_multicast_list;
    dev->change_mtu		=	awc_change_mtu;
    dev->init = &awc_init;
    dev->open = &awc_open;
    dev->stop = &awc_close;
    dev->base_addr = ioaddr;
    dev->irq = pci_irq_line;
    dev->tx_timeout = &awc_tx_timeout;
    dev->watchdog_timeo = AWC_TX_TIMEOUT;


    i = request_irq(dev->irq,awc_interrupt, SA_SHIRQ | SA_INTERRUPT, dev->name, dev);
    if (i) {
        kfree(dev->priv);
        dev->priv = NULL;
        if (allocd_dev) {
            unregister_netdev(dev);
            kfree(dev);
        }
        return i;
    }

    awc_private_init( dev);
    awc_init(dev);

    i=0;
    while (aironet4500_devices[i] && i < MAX_AWCS-1) i++;
    if (!aironet4500_devices[i]) {
        aironet4500_devices[i]=dev;
        ((struct awc_private *)
         aironet4500_devices[i]->priv)->card_type = AIRONET4500_PCI;

        if (awc_proc_set_fun)
            awc_proc_set_fun(i);
    }

//	if (register_netdev(dev) != 0) {
//		printk(KERN_NOTICE "awc_cs: register_netdev() failed\n");
//		goto failed;
//	}

    return 0;
//  failed:
//  	return -1;

}
コード例 #3
0
int awc4500_pnp_probe(struct net_device *dev)
{
    int isa_index = 0;
    int isa_irq_line = 0;
    int isa_ioaddr = 0;
    int card = 0;
    int i=0;
    struct isapnp_dev * pnp_dev ;
    struct isapnp_logdev *logdev;

    while (1) {

        pnp_dev = isapnp_find_device(
                      ISAPNP_VENDOR('A','W','L'),
                      ISAPNP_DEVICE(1),
                      0);

        if (!pnp_dev) break;

        isa_index++;

        logdev = isapnp_find_logdev(pnp_dev, ISAPNP_VENDOR('A','W','L'),
                                    ISAPNP_FUNCTION(1),
                                    0);
        if (!logdev) {
            printk("No logical device found on Aironet board \n");
            return -ENODEV;
        }
        if (isapnp_cfg_begin(logdev->PNP_BUS->PNP_BUS_NUMBER, logdev->PNP_DEV_NUMBER) < 0) {
            printk("cfg begin failed for csn %x devnum %x \n",
                   logdev->PNP_BUS->PNP_BUS_NUMBER, logdev->PNP_DEV_NUMBER);
            return -EAGAIN;
        }
        isapnp_activate(logdev->PNP_DEV_NUMBER);	/* activate device */
        isapnp_cfg_end();

        isa_irq_line = logdev->irq;
        isa_ioaddr = logdev->resource[0].start;
        request_region(isa_ioaddr, AIRONET4X00_IO_SIZE, "aironet4x00 ioaddr");

        if (!dev) {
            dev = init_etherdev(NULL, 0);
            if (!dev) {
                release_region(isa_ioaddr, AIRONET4X00_IO_SIZE);
                isapnp_cfg_begin(logdev->PNP_BUS->PNP_BUS_NUMBER,
                                 logdev->PNP_DEV_NUMBER);
                isapnp_deactivate(logdev->PNP_DEV_NUMBER);
                isapnp_cfg_end();
                return -ENOMEM;
            }
        }
        dev->priv = kmalloc(sizeof(struct awc_private),GFP_KERNEL );
        memset(dev->priv,0,sizeof(struct awc_private));
        if (!dev->priv) {
            printk(KERN_CRIT "aironet4x00: could not allocate device private, some unstability may follow\n");
            return -1;
        };
        ((struct awc_private *)dev->priv)->bus =  logdev;

        //	ether_setup(dev);

        //	dev->tx_queue_len = tx_queue_len;

        dev->hard_start_xmit = 		&awc_start_xmit;
        //	dev->set_config = 		&awc_config_misiganes,aga mitte awc_config;
        dev->get_stats = 		&awc_get_stats;
        //	dev->set_multicast_list = 	&awc_set_multicast_list;
        dev->change_mtu		=	awc_change_mtu;
        dev->init = &awc_init;
        dev->open = &awc_open;
        dev->stop = &awc_close;
        dev->base_addr = isa_ioaddr;
        dev->irq = isa_irq_line;
        dev->tx_timeout = &awc_tx_timeout;
        dev->watchdog_timeo = AWC_TX_TIMEOUT;

        netif_start_queue (dev);

        request_irq(dev->irq,awc_interrupt , SA_SHIRQ | SA_INTERRUPT ,"Aironet 4X00",dev);

        awc_private_init( dev);

        ((struct awc_private *)dev->priv)->bus =  logdev;

        cli();
        if ( awc_init(dev) ) {
            printk("card not found at irq %x io %lx\n",dev->irq, dev->base_addr);
            if (card==0) {
                sti();
                return -1;
            }
            sti();
            break;
        }
        udelay(10);
        sti();
        i=0;
        while (aironet4500_devices[i] && i < MAX_AWCS-1) i++;
        if (!aironet4500_devices[i] && i < MAX_AWCS-1 ) {
            aironet4500_devices[i]=dev;

            ((struct awc_private *)
             aironet4500_devices[i]->priv)->card_type = AIRONET4500_PNP;

            if (awc_proc_set_fun)
                awc_proc_set_fun(i);
        } else {
            printk(KERN_CRIT "Out of resources (MAX_AWCS) \n");
            return -1;
        }

        card++;
    }

    if (card == 0) return -ENODEV;
    return 0;
}
コード例 #4
0
static int awc_pcmcia_init(struct net_device *dev)
{
	return awc_init(dev);

}