⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sedlbauer.c

📁 arm平台上的uclinux系统全部源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		if (ista & 0x01)			val |= 0x01;		if (ista & 0x04)			val |= 0x02;		if (ista & 0x08)			val |= 0x04;		if (val)			hscx_int_main(cs, val);	}	if (ista & 0x20) {		val = 0xfe & readreg(cs->hw.sedl.adr, cs->hw.sedl.isac, ISAC_ISTA | 0x80);		if (val) {			isac_interrupt(cs, val);		}	}	if (ista & 0x10) {		val = 0x01;		isac_interrupt(cs, val);	}	ista  = readreg(cs->hw.sedl.adr, cs->hw.sedl.isac, IPAC_ISTA);	if ((ista & 0x3f) && icnt) {		icnt--;		goto Start_IPAC;	}	if (!icnt)		printk(KERN_WARNING "Sedlbauer IRQ LOOP\n");	writereg(cs->hw.sedl.adr, cs->hw.sedl.isac, IPAC_MASK, 0xFF);	writereg(cs->hw.sedl.adr, cs->hw.sedl.isac, IPAC_MASK, 0xC0);}static voidsedlbauer_interrupt_isar(int intno, void *dev_id, struct pt_regs *regs){	struct IsdnCardState *cs = dev_id;	u_char val;	int cnt = 20;	if (!cs) {		printk(KERN_WARNING "Sedlbauer: Spurious interrupt!\n");		return;	}	val = readreg(cs->hw.sedl.adr, cs->hw.sedl.hscx, ISAR_IRQBIT);      Start_ISAR:	if (val & ISAR_IRQSTA)		isar_int_main(cs);	val = readreg(cs->hw.sedl.adr, cs->hw.sedl.isac, ISAC_ISTA);      Start_ISAC:	if (val)		isac_interrupt(cs, val);	val = readreg(cs->hw.sedl.adr, cs->hw.sedl.hscx, ISAR_IRQBIT);	if ((val & ISAR_IRQSTA) && --cnt) {		if (cs->debug & L1_DEB_HSCX)			debugl1(cs, "ISAR IntStat after IntRoutine");		goto Start_ISAR;	}	val = readreg(cs->hw.sedl.adr, cs->hw.sedl.isac, ISAC_ISTA);	if (val && --cnt) {		if (cs->debug & L1_DEB_ISAC)			debugl1(cs, "ISAC IntStat after IntRoutine");		goto Start_ISAC;	}	if (!cnt)		printk(KERN_WARNING "Sedlbauer IRQ LOOP\n");	writereg(cs->hw.sedl.adr, cs->hw.sedl.hscx, ISAR_IRQBIT, 0);	writereg(cs->hw.sedl.adr, cs->hw.sedl.isac, ISAC_MASK, 0xFF);	writereg(cs->hw.sedl.adr, cs->hw.sedl.isac, ISAC_MASK, 0x0);	writereg(cs->hw.sedl.adr, cs->hw.sedl.hscx, ISAR_IRQBIT, ISAR_IRQMSK);}voidrelease_io_sedlbauer(struct IsdnCardState *cs){	int bytecnt = (cs->subtyp == SEDL_SPEED_FAX) ? 16 : 8;	if (cs->hw.sedl.bus == SEDL_BUS_PCI) {		bytecnt = 256;	}	if (cs->hw.sedl.cfg_reg)		release_region(cs->hw.sedl.cfg_reg, bytecnt);}static voidreset_sedlbauer(struct IsdnCardState *cs){	long flags;	printk(KERN_INFO "Sedlbauer: resetting card\n");	if (!((cs->hw.sedl.bus == SEDL_BUS_PCMCIA) &&	   (cs->hw.sedl.chip == SEDL_CHIP_ISAC_HSCX))) {		if (cs->hw.sedl.chip == SEDL_CHIP_IPAC) {			writereg(cs->hw.sedl.adr, cs->hw.sedl.isac, IPAC_POTA2, 0x20);			save_flags(flags);			sti();			current->state = TASK_INTERRUPTIBLE;			current->timeout = jiffies + 1;			schedule();			writereg(cs->hw.sedl.adr, cs->hw.sedl.isac, IPAC_POTA2, 0x0);			current->state = TASK_INTERRUPTIBLE;			current->timeout = jiffies + 1;			schedule();			writereg(cs->hw.sedl.adr, cs->hw.sedl.isac, IPAC_CONF, 0x0);			writereg(cs->hw.sedl.adr, cs->hw.sedl.isac, IPAC_ACFG, 0xff);			writereg(cs->hw.sedl.adr, cs->hw.sedl.isac, IPAC_AOE, 0x0);			writereg(cs->hw.sedl.adr, cs->hw.sedl.isac, IPAC_MASK, 0xc0);			writereg(cs->hw.sedl.adr, cs->hw.sedl.isac, IPAC_PCFG, 0x12);			restore_flags(flags);		} else {					byteout(cs->hw.sedl.reset_on, SEDL_RESET);	/* Reset On */			save_flags(flags);			sti();			current->state = TASK_INTERRUPTIBLE;			current->timeout = jiffies + 1;			schedule();			byteout(cs->hw.sedl.reset_off, 0);	/* Reset Off */			current->state = TASK_INTERRUPTIBLE;			current->timeout = jiffies + 1;			schedule();			restore_flags(flags);		}	}}static intSedl_card_msg(struct IsdnCardState *cs, int mt, void *arg){	switch (mt) {		case CARD_RESET:			reset_sedlbauer(cs);			return(0);		case CARD_RELEASE:			release_io_sedlbauer(cs);			return(0);		case CARD_SETIRQ:			if (cs->hw.sedl.chip == SEDL_CHIP_ISAC_ISAR) {				return(request_irq(cs->irq, &sedlbauer_interrupt_isar,					I4L_IRQ_FLAG, "HiSax", cs));			} else if (cs->hw.sedl.chip == SEDL_CHIP_IPAC) {				return(request_irq(cs->irq, &sedlbauer_interrupt_ipac,					I4L_IRQ_FLAG, "HiSax", cs));			} else {				return(request_irq(cs->irq, &sedlbauer_interrupt,					I4L_IRQ_FLAG, "HiSax", cs));			}		case CARD_INIT:			if (cs->hw.sedl.chip == SEDL_CHIP_ISAC_ISAR) {				clear_pending_isac_ints(cs);				writereg(cs->hw.sedl.adr, cs->hw.sedl.hscx,					ISAR_IRQBIT, 0);				initisac(cs);				initisar(cs);				/* Reenable all IRQ */				cs->writeisac(cs, ISAC_MASK, 0);				/* RESET Receiver and Transmitter */				cs->writeisac(cs, ISAC_CMDR, 0x41);			} else {				inithscxisac(cs, 3);			}			return(0);		case CARD_TEST:			return(0);		case CARD_LOAD_FIRM:			if (cs->hw.sedl.chip == SEDL_CHIP_ISAC_ISAR) {				if (isar_load_firmware(cs, arg))					return(1);				else 					ll_run(cs);			}			return(0);	}	return(0);}#ifdef SEDLBAUER_PCIstatic  int pci_index __initdata = 0;#endif__initfunc(intsetup_sedlbauer(struct IsdnCard *card)){	int bytecnt, ver, val;	struct IsdnCardState *cs = card->cs;	char tmp[64];	strcpy(tmp, Sedlbauer_revision);	printk(KERN_INFO "HiSax: Sedlbauer driver Rev. %s\n", HiSax_getrev(tmp));	 	if (cs->typ == ISDN_CTYPE_SEDLBAUER) { 		cs->subtyp = SEDL_SPEED_CARD_WIN;		cs->hw.sedl.bus = SEDL_BUS_ISA;		cs->hw.sedl.chip = SEDL_CHIP_TEST; 	} else if (cs->typ == ISDN_CTYPE_SEDLBAUER_PCMCIA) {	 		cs->subtyp = SEDL_SPEED_STAR;		cs->hw.sedl.bus = SEDL_BUS_PCMCIA;		cs->hw.sedl.chip = SEDL_CHIP_TEST; 	} else if (cs->typ == ISDN_CTYPE_SEDLBAUER_FAX) {	 		cs->subtyp = SEDL_SPEED_FAX;		cs->hw.sedl.bus = SEDL_BUS_ISA;		cs->hw.sedl.chip = SEDL_CHIP_ISAC_ISAR; 	} else		return (0);	bytecnt = 8;	if (card->para[1]) {		cs->hw.sedl.cfg_reg = card->para[1];		cs->irq = card->para[0];		if (cs->hw.sedl.chip == SEDL_CHIP_ISAC_ISAR) {			bytecnt = 16;		}	} else {/* Probe for Sedlbauer speed pci */#if SEDLBAUER_PCI#if CONFIG_PCI		for (; pci_index < 255; pci_index++) {			unsigned char pci_bus, pci_device_fn;			unsigned int ioaddr;			unsigned char irq;			if (pcibios_find_device (PCI_VENDOR_SEDLBAUER,						PCI_SPEEDPCI_ID, pci_index,						&pci_bus, &pci_device_fn) != 0) {				continue;			}			pcibios_read_config_byte(pci_bus, pci_device_fn,					PCI_INTERRUPT_LINE, &irq);			pcibios_read_config_dword(pci_bus, pci_device_fn,					PCI_BASE_ADDRESS_0, &ioaddr);			cs->irq = irq;			cs->hw.sedl.cfg_reg = ioaddr & PCI_BASE_ADDRESS_IO_MASK; 			if (!cs->hw.sedl.cfg_reg) {				printk(KERN_WARNING "Sedlbauer: No IO-Adr for PCI card found\n");				return(0);			}			cs->hw.sedl.bus = SEDL_BUS_PCI;			cs->hw.sedl.chip = SEDL_CHIP_IPAC;			cs->subtyp = SEDL_SPEED_PCI;			bytecnt = 256;			byteout(cs->hw.sedl.cfg_reg, 0xff);			byteout(cs->hw.sedl.cfg_reg, 0x00);			byteout(cs->hw.sedl.cfg_reg+ 2, 0xdd);			byteout(cs->hw.sedl.cfg_reg+ 5, 0x02);			break;		}			if (pci_index == 255) {			printk(KERN_WARNING "Sedlbauer: No PCI card found\n");			return(0);		}		pci_index++;#else		printk(KERN_WARNING "Sedlbauer: NO_PCI_BIOS\n");		return (0);#endif /* CONFIG_PCI */#endif /* SEDLBAUER_PCI */	}		       	/* In case of the sedlbauer pcmcia card, this region is in use,           reserved for us by the card manager. So we do not check it           here, it would fail. */	if (cs->hw.sedl.bus != SEDL_BUS_PCMCIA &&		check_region((cs->hw.sedl.cfg_reg), bytecnt)) {		printk(KERN_WARNING			"HiSax: %s config port %x-%x already in use\n",			CardType[card->typ],			cs->hw.sedl.cfg_reg,			cs->hw.sedl.cfg_reg + bytecnt);			return (0);	} else {		request_region(cs->hw.sedl.cfg_reg, bytecnt, "sedlbauer isdn");	}	printk(KERN_INFO	       "Sedlbauer: defined at 0x%x-0x%x IRQ %d\n",	       cs->hw.sedl.cfg_reg,	       cs->hw.sedl.cfg_reg + bytecnt,	       cs->irq);	cs->BC_Read_Reg = &ReadHSCX;	cs->BC_Write_Reg = &WriteHSCX;	cs->BC_Send_Data = &hscx_fill_fifo;	cs->cardmsg = &Sedl_card_msg;/* * testing ISA and PCMCIA Cards for IPAC, default is ISAC  * do not test for PCI card, because ports are different * and PCI card uses only IPAC (for the moment) */		if (cs->hw.sedl.bus != SEDL_BUS_PCI) {		val = readreg(cs->hw.sedl.cfg_reg + SEDL_IPAC_ANY_ADR,        	        cs->hw.sedl.cfg_reg + SEDL_IPAC_ANY_IPAC, IPAC_ID);	        if (val == 1) {		/* IPAC */                	cs->subtyp = SEDL_SPEED_WIN2_PC104;			if (cs->hw.sedl.bus == SEDL_BUS_PCMCIA) {				cs->subtyp = SEDL_SPEED_STAR2;			}			cs->hw.sedl.chip = SEDL_CHIP_IPAC;		} else {		/* ISAC_HSCX oder ISAC_ISAR */			if (cs->hw.sedl.chip == SEDL_CHIP_TEST) {				cs->hw.sedl.chip = SEDL_CHIP_ISAC_HSCX;			}		}	}/* * hw.sedl.chip is now properly set */	printk(KERN_INFO "Sedlbauer: %s detected\n",		Sedlbauer_Types[cs->subtyp]);	if (cs->hw.sedl.chip == SEDL_CHIP_IPAC) {	/* IPAC */		if (cs->hw.sedl.bus == SEDL_BUS_PCI) {	                cs->hw.sedl.adr  = cs->hw.sedl.cfg_reg + SEDL_IPAC_PCI_ADR;        	        cs->hw.sedl.isac = cs->hw.sedl.cfg_reg + SEDL_IPAC_PCI_IPAC;                	cs->hw.sedl.hscx = cs->hw.sedl.cfg_reg + SEDL_IPAC_PCI_IPAC;		} else {	                cs->hw.sedl.adr  = cs->hw.sedl.cfg_reg + SEDL_IPAC_ANY_ADR;        	        cs->hw.sedl.isac = cs->hw.sedl.cfg_reg + SEDL_IPAC_ANY_IPAC;                	cs->hw.sedl.hscx = cs->hw.sedl.cfg_reg + SEDL_IPAC_ANY_IPAC;		}                test_and_set_bit(HW_IPAC, &cs->HW_Flags);                cs->readisac = &ReadISAC_IPAC;                cs->writeisac = &WriteISAC_IPAC;                cs->readisacfifo = &ReadISACfifo_IPAC;                cs->writeisacfifo = &WriteISACfifo_IPAC;		val = readreg(cs->hw.sedl.adr,cs->hw.sedl.isac, IPAC_ID);                printk(KERN_INFO "Sedlbauer: IPAC version %x\n", val);		reset_sedlbauer(cs);	} else {	/* ISAC_HSCX oder ISAC_ISAR */		cs->readisac = &ReadISAC;		cs->writeisac = &WriteISAC;		cs->readisacfifo = &ReadISACfifo;		cs->writeisacfifo = &WriteISACfifo;		if (cs->hw.sedl.chip == SEDL_CHIP_ISAC_ISAR) {			cs->hw.sedl.adr = cs->hw.sedl.cfg_reg + SEDL_ISAR_ISA_ADR;			cs->hw.sedl.isac = cs->hw.sedl.cfg_reg + SEDL_ISAR_ISA_ISAC;			cs->hw.sedl.hscx = cs->hw.sedl.cfg_reg + SEDL_ISAR_ISA_ISAR;			cs->hw.sedl.reset_on = cs->hw.sedl.cfg_reg + SEDL_ISAR_ISA_ISAR_RESET_ON;			cs->hw.sedl.reset_off = cs->hw.sedl.cfg_reg + SEDL_ISAR_ISA_ISAR_RESET_OFF;			cs->bcs[0].hw.isar.reg = &cs->hw.sedl.isar;			cs->bcs[1].hw.isar.reg = &cs->hw.sedl.isar;			test_and_set_bit(HW_ISAR, &cs->HW_Flags);				ISACVersion(cs, "Sedlbauer:");					cs->BC_Read_Reg = &ReadISAR;			cs->BC_Write_Reg = &WriteISAR;			cs->BC_Send_Data = &isar_fill_fifo;			ver = ISARVersion(cs, "Sedlbauer:");			if (ver < 0) {				printk(KERN_WARNING					"Sedlbauer: wrong ISAR version (ret = %d)\n", ver);				release_io_sedlbauer(cs);				return (0);			}		} else {			if (cs->hw.sedl.bus == SEDL_BUS_PCMCIA) {				cs->hw.sedl.adr = cs->hw.sedl.cfg_reg + SEDL_HSCX_PCMCIA_ADR;				cs->hw.sedl.isac = cs->hw.sedl.cfg_reg + SEDL_HSCX_PCMCIA_ISAC;				cs->hw.sedl.hscx = cs->hw.sedl.cfg_reg + SEDL_HSCX_PCMCIA_HSCX;				cs->hw.sedl.reset_on = cs->hw.sedl.cfg_reg + SEDL_HSCX_PCMCIA_RESET;				cs->hw.sedl.reset_off = cs->hw.sedl.cfg_reg + SEDL_HSCX_PCMCIA_RESET;			} else {				cs->hw.sedl.adr = cs->hw.sedl.cfg_reg + SEDL_HSCX_ISA_ADR;				cs->hw.sedl.isac = cs->hw.sedl.cfg_reg + SEDL_HSCX_ISA_ISAC;				cs->hw.sedl.hscx = cs->hw.sedl.cfg_reg + SEDL_HSCX_ISA_HSCX;				cs->hw.sedl.reset_on = cs->hw.sedl.cfg_reg + SEDL_HSCX_ISA_RESET_ON;				cs->hw.sedl.reset_off = cs->hw.sedl.cfg_reg + SEDL_HSCX_ISA_RESET_OFF;			}			ISACVersion(cs, "Sedlbauer:");					if (HscxVersion(cs, "Sedlbauer:")) {				printk(KERN_WARNING					"Sedlbauer: wrong HSCX versions check IO address\n");				release_io_sedlbauer(cs);				return (0);			}			reset_sedlbauer(cs);		}	}	return (1);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -