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; }
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 {