static void awc_pnp_release(void) {

//	long flags;
    int i=0;
    struct isapnp_logdev *logdev;

    DEBUG(0, "awc_detach \n");

    i=0;
    while ( i < MAX_AWCS) {
        if (!aironet4500_devices[i])
        {
            i++;
            continue;
        }
        if (((struct awc_private *)aironet4500_devices[i]->priv)->card_type != AIRONET4500_PNP)
        {
            i++;
            continue;
        }

        logdev = ((struct isapnp_logdev *) ((struct awc_private *)aironet4500_devices[i]->priv)->bus);

        if (!logdev )
            printk("awc4500 no pnp logdev in pnp_release\n");

        if (awc_proc_unset_fun)
            awc_proc_unset_fun(i);
        if (isapnp_cfg_begin(logdev->PNP_BUS->PNP_BUS_NUMBER, logdev->PNP_DEV_NUMBER)<0)
            printk("isapnp cfg failed at release \n");
        isapnp_deactivate(logdev->PNP_DEV_NUMBER);
        isapnp_cfg_end();

        release_region(aironet4500_devices[i]->base_addr, AIRONET4X00_IO_SIZE);
//		release_region(isa_cisaddr, AIRONET4X00_CIS_SIZE, "aironet4x00 cis");
//		release_region(isa_memaddr, AIRONET4X00_MEM_SIZE, "aironet4x00 mem");

        unregister_netdev(aironet4500_devices[i]);
        free_irq(aironet4500_devices[i]->irq,aironet4500_devices[i]);
        kfree(aironet4500_devices[i]->priv);
        kfree(aironet4500_devices[i]);

        aironet4500_devices[i]=0;


        i++;
    }


}
int awc4500_pnp_hw_reset(struct net_device *dev) {
    struct isapnp_logdev *logdev;

    DEBUG(0, "awc_pnp_reset \n");

    if (!dev->priv ) {
        printk("awc4500 no dev->priv in hw_reset\n");
        return -1;
    };

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

    if (!logdev ) {
        printk("awc4500 no pnp logdev in hw_reset\n");
        return -1;
    };

    if (isapnp_cfg_begin(logdev->PNP_BUS->PNP_BUS_NUMBER, logdev->PNP_DEV_NUMBER)<0)
        printk("isapnp cfg failed at release \n");
    isapnp_deactivate(logdev->PNP_DEV_NUMBER);
    isapnp_cfg_end();

    udelay(100);


    if (isapnp_cfg_begin(logdev->PNP_BUS->PNP_BUS_NUMBER, logdev->PNP_DEV_NUMBER) < 0) {
        printk("%s cfg begin failed in hw_reset for csn %x devnum %x \n",
               dev->name, logdev->PNP_BUS->PNP_BUS_NUMBER, logdev->PNP_DEV_NUMBER);
        return -EAGAIN;
    }

    isapnp_activate(logdev->PNP_DEV_NUMBER);	/* activate device */
    isapnp_cfg_end();

    return 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;
}
Exemple #4
0
int __init
setup_isurf(struct IsdnCard *card)
{
	int ver;
	struct IsdnCardState *cs = card->cs;
	char tmp[64];

	strcpy(tmp, ISurf_revision);
	printk(KERN_INFO "HiSax: ISurf driver Rev. %s\n", HiSax_getrev(tmp));
	
 	if (cs->typ != ISDN_CTYPE_ISURF)
 		return(0);
	if (card->para[1] && card->para[2]) {
		cs->hw.isurf.reset = card->para[1];
		cs->hw.isurf.phymem = card->para[2];
		cs->irq = card->para[0];
	} else {
#ifdef __ISAPNP__
		struct pci_bus *pb;
		struct pci_dev *pd;

		if (isapnp_present()) {
			cs->subtyp = 0;
			if ((pb = isapnp_find_card(
				ISAPNP_VENDOR('S', 'I', 'E'),
				ISAPNP_FUNCTION(0x0010), pnp_surf))) {
				pnp_surf = pb;
				pd = NULL;
				if (!(pd = isapnp_find_dev(pnp_surf,
					ISAPNP_VENDOR('S', 'I', 'E'),
					ISAPNP_FUNCTION(0x0010), pd))) {
					printk(KERN_ERR "ISurfPnP: PnP error card found, no device\n");
					return (0);
				}
				pd->prepare(pd);
				pd->deactivate(pd);
				pd->activate(pd);
				/* The ISA-PnP logic apparently
				 * expects upper limit address to be
				 * set. Since the isa-pnp module
				 * doesn't do this, so we have to make
				 * up for it.
				 */
				isapnp_cfg_begin(pd->bus->number, pd->devfn);
				isapnp_write_word(ISAPNP_CFG_MEM+3, 
					pd->resource[8].end >> 8);
				isapnp_cfg_end();
				cs->hw.isurf.reset = pd->resource[0].start;
				cs->hw.isurf.phymem = pd->resource[8].start;
				cs->irq = pd->irq_resource[0].start;
				if (!cs->irq || !cs->hw.isurf.reset || !cs->hw.isurf.phymem) {
					printk(KERN_ERR "ISurfPnP:some resources are missing %d/%x/%lx\n",
						cs->irq, cs->hw.isurf.reset, cs->hw.isurf.phymem);
					pd->deactivate(pd);
					return(0);
				}
			} else {
				printk(KERN_INFO "ISurfPnP: no ISAPnP card found\n");
				return(0);
			}
		} else {