static int __init niccy_pci_probe(struct IsdnCardState *cs, struct pci_dev *pdev) { u32 pci_ioaddr; if (pci_enable_device(pdev)) goto err; cs->subtyp = NICCY_PCI; cs->irq = pdev->irq; cs->irq_flags |= SA_SHIRQ; cs->hw.niccy.cfg_reg = pci_resource_start(pdev, 0); pci_ioaddr = pci_resource_start(pdev, 1); cs->hw.niccy.isac = pci_ioaddr + ISAC_PCI_DATA; cs->hw.niccy.isac_ale = pci_ioaddr + ISAC_PCI_ADDR; cs->hw.niccy.hscx = pci_ioaddr + HSCX_PCI_DATA; cs->hw.niccy.hscx_ale = pci_ioaddr + HSCX_PCI_ADDR; if (!request_io(&cs->rs, cs->hw.niccy.isac, 4, "niccy")) goto err; if (!request_io(&cs->rs, cs->hw.niccy.cfg_reg, 0x40, "niccy pci")) goto err; if (niccy_probe(cs) < 0) goto err; return 0; err: hisax_release_resources(cs); return -EBUSY; }
static int __init teles_request_io(struct IsdnCardState *cs) { if (!request_io(&cs->rs, cs->hw.teles3.isac + 32, 32, "HiSax isac")) return -EBUSY; if (!request_io(&cs->rs, cs->hw.teles3.hscx[0]+32, 32, "HiSax hscx A")) return -EBUSY; if (!request_io(&cs->rs, cs->hw.teles3.hscx[1]+32, 32, "HiSax hscx B")) return -EBUSY; return 0; }
static int __init saphir_probe(struct IsdnCardState *cs, struct IsdnCard *card) { cs->hw.saphir.cfg_reg = card->para[1]; cs->hw.saphir.isac = card->para[1] + ISAC_DATA; cs->hw.saphir.hscx = card->para[1] + HSCX_DATA; cs->hw.saphir.ale = card->para[1] + ADDRESS_REG; cs->irq = card->para[0]; if (!request_io(&cs->rs, cs->hw.saphir.cfg_reg, 6, "saphir")) goto err; printk(KERN_INFO "HiSax: %s config irq:%d io:0x%X\n", CardType[cs->typ], cs->irq, cs->hw.saphir.cfg_reg); if (saphir_reset(cs)) goto err; cs->card_ops = &saphir_ops; if (hscxisac_setup(cs, &isac_ops, &hscx_ops)) goto err; init_timer(&cs->hw.saphir.timer); cs->hw.saphir.timer.function = (void *) SaphirWatchDog; cs->hw.saphir.timer.data = (long) cs; cs->hw.saphir.timer.expires = jiffies + 4*HZ; add_timer(&cs->hw.saphir.timer); return 0; err: hisax_release_resources(cs); return -EBUSY; }
static int __init nj_u_probe(struct IsdnCardState *cs, struct pci_dev *pdev) { if (pci_enable_device(pdev)) goto err; pci_set_master(pdev); cs->irq = pdev->irq; cs->irq_flags |= SA_SHIRQ; cs->hw.njet.pdev = pdev; cs->hw.njet.base = pci_resource_start(pdev, 0); if (!request_io(&cs->rs, cs->hw.njet.base, 0x100, "netspider-u isdn")) goto err; cs->hw.njet.auxa = cs->hw.njet.base + NETJET_AUXDATA; cs->hw.njet.isac = cs->hw.njet.base | NETJET_ISAC_OFF; cs->hw.njet.ctrl_reg = 0xff; /* Reset On */ byteout(cs->hw.njet.base + NETJET_CTRL, cs->hw.njet.ctrl_reg); set_current_state(TASK_UNINTERRUPTIBLE); schedule_timeout((10*HZ)/1000); /* Timeout 10ms */ cs->hw.njet.ctrl_reg = 0x00; /* Reset Off and status read clear */ byteout(cs->hw.njet.base + NETJET_CTRL, cs->hw.njet.ctrl_reg); set_current_state(TASK_UNINTERRUPTIBLE); schedule_timeout((10*HZ)/1000); /* Timeout 10ms */ cs->hw.njet.auxd = 0xC0; cs->hw.njet.dmactrl = 0; byteout(cs->hw.njet.base + NETJET_AUXCTRL, ~NETJET_ISACIRQ); byteout(cs->hw.njet.base + NETJET_IRQMASK1, NETJET_ISACIRQ); byteout(cs->hw.njet.auxa, cs->hw.njet.auxd); switch ((NETjet_ReadIC(cs, ICC_RBCH) >> 5) & 3) { case 3: break; case 0: printk(KERN_WARNING "NETspider-U: NETjet-S PCI card found\n" ); goto err; default: printk(KERN_WARNING "NETspider-U: No PCI card found\n" ); goto err; } printk(KERN_INFO "NETspider-U: PCI card configured at %#lx IRQ %d\n", cs->hw.njet.base, cs->irq); nj_u_reset(cs); cs->card_ops = &nj_u_ops; icc_setup(cs, &netjet_dc_ops); return 0; err: hisax_release_resources(cs); return -EBUSY; }
static int __init niccy_pnp_probe(struct IsdnCardState *cs, struct IsdnCard *card) { cs->subtyp = NICCY_PNP; cs->irq = card->para[0]; cs->hw.niccy.isac = card->para[1] + ISAC_PNP; cs->hw.niccy.hscx = card->para[1] + HSCX_PNP; cs->hw.niccy.isac_ale = card->para[2] + ISAC_PNP; cs->hw.niccy.hscx_ale = card->para[2] + HSCX_PNP; cs->hw.niccy.cfg_reg = 0; if (!request_io(&cs->rs, cs->hw.niccy.isac, 2, "niccy data")) goto err; if (!request_io(&cs->rs, cs->hw.niccy.isac_ale, 2, "niccy addr")) goto err; if (niccy_probe(cs) < 0) goto err; return 0; err: hisax_release_resources(cs); return -EBUSY; }
static int __init teles16_3_probe(struct IsdnCardState *cs, struct IsdnCard *card) { u8 val; cs->hw.teles3.cfg_reg = card->para[1]; switch (cs->hw.teles3.cfg_reg) { case 0x180: case 0x280: case 0x380: cs->hw.teles3.cfg_reg |= 0xc00; break; } cs->hw.teles3.isac = cs->hw.teles3.cfg_reg - 0x420; cs->hw.teles3.hscx[0] = cs->hw.teles3.cfg_reg - 0xc20; cs->hw.teles3.hscx[1] = cs->hw.teles3.cfg_reg - 0x820; teles_setup_io(cs, card); if (!request_io(&cs->rs, cs->hw.teles3.cfg_reg, 8, "teles3 cfg")) goto err; if (teles_request_io(cs) < 0) goto err; if ((val = bytein(cs->hw.teles3.cfg_reg + 0)) != 0x51) { printk(KERN_WARNING "Teles: 16.3 Byte at %x is %x\n", cs->hw.teles3.cfg_reg + 0, val); goto err; } if ((val = bytein(cs->hw.teles3.cfg_reg + 1)) != 0x93) { printk(KERN_WARNING "Teles: 16.3 Byte at %x is %x\n", cs->hw.teles3.cfg_reg + 1, val); goto err; } /* 0x1e without AB, 0x1f with AB, 0x1c 16.3 ???, * 0x39 16.3 1.1, 0x38 16.3 1.3, 0x46 16.3 with AB + Video */ val = bytein(cs->hw.teles3.cfg_reg + 2); if (val != 0x46 && val != 0x39 && val != 0x38 && val != 0x1c && val != 0x1e && val != 0x1f) { printk(KERN_WARNING "Teles: 16.3 Byte at %x is %x\n", cs->hw.teles3.cfg_reg + 2, val); goto err; } if (teles_hw_init(cs) < 0) goto err; return 0; err: hisax_release_resources(cs); return -EBUSY; }
static int __init telespcmcia_probe(struct IsdnCardState *cs, struct IsdnCard *card) { cs->hw.teles3.cfg_reg = 0; cs->hw.teles3.hscx[0] = card->para[1] - 0x20; cs->hw.teles3.hscx[1] = card->para[1]; cs->hw.teles3.isac = card->para[1] + 0x20; teles_setup_io(cs, card); if (!request_io(&cs->rs, cs->hw.teles3.hscx[1], 96, "HiSax Teles PCMCIA")) goto err; if (teles_hw_init(cs) < 0) goto err; return 0; err: hisax_release_resources(cs); return -EBUSY; }
static int __init asuscom_probe(struct IsdnCardState *cs, struct IsdnCard *card) { int rc; u8 val; printk(KERN_INFO "ISDNLink: defined at %#lx IRQ %lu\n", card->para[1], card->para[0]); cs->hw.asus.cfg_reg = card->para[1]; cs->irq = card->para[0]; rc = -EBUSY; if (!request_io(&cs->rs, cs->hw.asus.cfg_reg, 8, "asuscom isdn")) goto err; rc = -ENODEV; cs->hw.asus.adr = cs->hw.asus.cfg_reg + ASUS_IPAC_ALE; val = readreg(cs, cs->hw.asus.cfg_reg + ASUS_IPAC_DATA, IPAC_ID); if ((val == 1) || (val == 2)) { cs->subtyp = ASUS_IPAC; cs->card_ops = &asuscom_ipac_ops; cs->hw.asus.isac = cs->hw.asus.cfg_reg + ASUS_IPAC_DATA; if (ipac_setup(cs, &ipac_dc_ops, &ipac_bc_ops)) goto err; } else { cs->subtyp = ASUS_ISACHSCX; cs->card_ops = &asuscom_ops; cs->hw.asus.adr = cs->hw.asus.cfg_reg + ASUS_ADR; cs->hw.asus.isac = cs->hw.asus.cfg_reg + ASUS_ISAC; cs->hw.asus.hscx = cs->hw.asus.cfg_reg + ASUS_HSCX; cs->hw.asus.u7 = cs->hw.asus.cfg_reg + ASUS_CTRL_U7; cs->hw.asus.pots = cs->hw.asus.cfg_reg + ASUS_CTRL_POTS; if (hscxisac_setup(cs, &isac_ops, &hscx_ops)) goto err; } printk(KERN_INFO "ISDNLink: resetting card\n"); cs->card_ops->reset(cs); return 0; err: hisax_release_resources(cs); return rc; }
static int __init compaq_probe(struct IsdnCardState *cs, struct IsdnCard *card) { cs->hw.teles3.cfg_reg = card->para[3]; cs->hw.teles3.isac = card->para[2] - 32; cs->hw.teles3.hscx[0] = card->para[1] - 32; cs->hw.teles3.hscx[1] = card->para[1]; teles_setup_io(cs, card); if (!request_io(&cs->rs, cs->hw.teles3.cfg_reg, 1, "teles3 cfg")) goto err; if (teles_request_io(cs) < 0) goto err; if (teles_hw_init(cs) < 0) goto err; return 0; err: hisax_release_resources(cs); return -EBUSY; }
static int exec_request(struct knot_requestor *req, struct knot_request *last, struct timeval *timeout) { int ret = KNOT_EOK; /* Do I/O until the processing is satisifed or fails. */ while (req->overlay.state & (KNOT_STATE_PRODUCE|KNOT_STATE_CONSUME)) { ret = request_io(req, last, timeout); if (ret != KNOT_EOK) { knot_overlay_reset(&req->overlay); return ret; } } /* Expect complete request. */ if (req->overlay.state != KNOT_STATE_DONE) { ret = KNOT_LAYER_ERROR; } /* Finish current query processing. */ knot_overlay_reset(&req->overlay); return ret; }
static int check_arcofi(struct IsdnCardState *cs) { int arcofi_present = 0; char tmp[40]; char *t; u8 *p; if (!cs->dc.isac.mon_tx) if (!(cs->dc.isac.mon_tx=kmalloc(MAX_MON_FRAME, GFP_ATOMIC))) { if (cs->debug & L1_DEB_WARN) debugl1(cs, "ISAC MON TX out of buffers!"); return(0); } cs->dc.isac.arcofi_bc = 0; arcofi_fsm(cs, ARCOFI_START, &ARCOFI_VERSION); interruptible_sleep_on(&cs->dc.isac.arcofi_wait); if (!test_and_clear_bit(FLG_ARCOFI_ERROR, &cs->HW_Flags)) { debugl1(cs, "Arcofi response received %d bytes", cs->dc.isac.mon_rxp); p = cs->dc.isac.mon_rx; t = tmp; t += sprintf(tmp, "Arcofi data"); QuickHex(t, p, cs->dc.isac.mon_rxp); debugl1(cs, tmp); if ((cs->dc.isac.mon_rxp == 2) && (cs->dc.isac.mon_rx[0] == 0xa0)) { switch(cs->dc.isac.mon_rx[1]) { case 0x80: debugl1(cs, "Arcofi 2160 detected"); arcofi_present = 1; break; case 0x82: debugl1(cs, "Arcofi 2165 detected"); arcofi_present = 2; break; case 0x84: debugl1(cs, "Arcofi 2163 detected"); arcofi_present = 3; break; default: debugl1(cs, "unknown Arcofi response"); break; } } else debugl1(cs, "undefined Monitor response"); cs->dc.isac.mon_rxp = 0; } else if (cs->dc.isac.mon_tx) { debugl1(cs, "Arcofi not detected"); } if (arcofi_present) { if (cs->subtyp==ELSA_QS1000) { cs->subtyp = ELSA_QS3000; printk(KERN_INFO "Elsa: %s detected modem at 0x%lx\n", Elsa_Types[cs->subtyp], cs->hw.elsa.base+8); request_io(&cs->rs, cs->hw.elsa.base+8, 8, "elsa isdn modem"); } else if (cs->subtyp==ELSA_PCC16) { cs->subtyp = ELSA_PCF; printk(KERN_INFO "Elsa: %s detected modem at 0x%lx\n", Elsa_Types[cs->subtyp], cs->hw.elsa.base+8); request_io(&cs->rs, cs->hw.elsa.base+8, 8, "elsa isdn modem"); } else printk(KERN_INFO "Elsa: %s detected modem at 0x%lx\n", Elsa_Types[cs->subtyp], cs->hw.elsa.base+8); arcofi_fsm(cs, ARCOFI_START, &ARCOFI_XOP_0); interruptible_sleep_on(&cs->dc.isac.arcofi_wait); return(1); } return(0); }