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

📄 os_bri.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
		a->xdi_mbox.data_length = sizeof(dword);		a->xdi_mbox.data =		    diva_os_malloc(0, a->xdi_mbox.data_length);		if (a->xdi_mbox.data) {			*(dword *) a->xdi_mbox.data =			    (dword) a->CardOrdinal;			a->xdi_mbox.status = DIVA_XDI_MBOX_BUSY;			ret = 0;		}		break;	case DIVA_XDI_UM_CMD_GET_SERIAL_NR:		a->xdi_mbox.data_length = sizeof(dword);		a->xdi_mbox.data =		    diva_os_malloc(0, a->xdi_mbox.data_length);		if (a->xdi_mbox.data) {			*(dword *) a->xdi_mbox.data =			    (dword) a->xdi_adapter.serialNo;			a->xdi_mbox.status = DIVA_XDI_MBOX_BUSY;			ret = 0;		}		break;	case DIVA_XDI_UM_CMD_GET_PCI_HW_CONFIG:		a->xdi_mbox.data_length = sizeof(dword) * 9;		a->xdi_mbox.data =		    diva_os_malloc(0, a->xdi_mbox.data_length);		if (a->xdi_mbox.data) {			int i;			dword *data = (dword *) a->xdi_mbox.data;			for (i = 0; i < 8; i++) {				*data++ = a->resources.pci.bar[i];			}			*data++ = (dword) a->resources.pci.irq;			a->xdi_mbox.status = DIVA_XDI_MBOX_BUSY;			ret = 0;		}		break;	case DIVA_XDI_UM_CMD_GET_CARD_STATE:		a->xdi_mbox.data_length = sizeof(dword);		a->xdi_mbox.data =		    diva_os_malloc(0, a->xdi_mbox.data_length);		if (a->xdi_mbox.data) {			dword *data = (dword *) a->xdi_mbox.data;			if (!a->xdi_adapter.port) {				*data = 3;			} else if (a->xdi_adapter.trapped) {				*data = 2;			} else if (a->xdi_adapter.Initialized) {				*data = 1;			} else {				*data = 0;			}			a->xdi_mbox.status = DIVA_XDI_MBOX_BUSY;			ret = 0;		}		break;	case DIVA_XDI_UM_CMD_RESET_ADAPTER:		ret = diva_bri_reset_adapter(&a->xdi_adapter);		break;	case DIVA_XDI_UM_CMD_WRITE_SDRAM_BLOCK:		ret = diva_bri_write_sdram_block(&a->xdi_adapter,						 cmd->command_data.						 write_sdram.offset,						 (byte *) & cmd[1],						 cmd->command_data.						 write_sdram.length);		break;	case DIVA_XDI_UM_CMD_START_ADAPTER:		ret = diva_bri_start_adapter(&a->xdi_adapter,					     cmd->command_data.start.					     offset,					     cmd->command_data.start.					     features);		break;	case DIVA_XDI_UM_CMD_SET_PROTOCOL_FEATURES:		a->xdi_adapter.features =		    cmd->command_data.features.features;		a->xdi_adapter.a.protocol_capabilities =		    a->xdi_adapter.features;		DBG_TRC(			("Set raw protocol features (%08x)",			 a->xdi_adapter.features)) ret = 0;		break;	case DIVA_XDI_UM_CMD_STOP_ADAPTER:		ret = diva_bri_stop_adapter(a);		break;	case DIVA_XDI_UM_CMD_READ_XLOG_ENTRY:		ret = diva_card_read_xlog(a);		break;	default:		DBG_ERR(			("A: A(%d) invalid cmd=%d", a->controller,			 cmd->command))}	return (ret);}static int diva_bri_reset_adapter(PISDN_ADAPTER IoAdapter){	byte __iomem *addrHi, *addrLo, *ioaddr;	dword i;	byte __iomem *Port;	if (!IoAdapter->port) {		return (-1);	}	if (IoAdapter->Initialized) {		DBG_ERR(("A: A(%d) can't reset BRI adapter - please stop first",			 IoAdapter->ANum)) return (-1);	}	(*(IoAdapter->rstFnc)) (IoAdapter);	diva_os_wait(100);	Port = DIVA_OS_MEM_ATTACH_PORT(IoAdapter);	addrHi = Port +	    ((IoAdapter->Properties.Bus == BUS_PCI) ? M_PCI_ADDRH : ADDRH);	addrLo = Port + ADDR;	ioaddr = Port + DATA;	/*	   recover	 */	outpp(addrHi, (byte) 0);	outppw(addrLo, (word) 0);	outppw(ioaddr, (word) 0);	/*	   clear shared memory	 */	outpp(addrHi,	      (byte) (		      (IoAdapter->MemoryBase + IoAdapter->MemorySize -		       BRI_SHARED_RAM_SIZE) >> 16));	outppw(addrLo, 0);	for (i = 0; i < 0x8000; outppw(ioaddr, 0), ++i);	diva_os_wait(100);	/*	   clear signature	 */	outpp(addrHi,	      (byte) (		      (IoAdapter->MemoryBase + IoAdapter->MemorySize -		       BRI_SHARED_RAM_SIZE) >> 16));	outppw(addrLo, 0x1e);	outpp(ioaddr, 0);	outpp(ioaddr, 0);	outpp(addrHi, (byte) 0);	outppw(addrLo, (word) 0);	outppw(ioaddr, (word) 0);	DIVA_OS_MEM_DETACH_PORT(IoAdapter, Port);	/*	   Forget all outstanding entities	 */	IoAdapter->e_count = 0;	if (IoAdapter->e_tbl) {		memset(IoAdapter->e_tbl, 0x00,		       IoAdapter->e_max * sizeof(E_INFO));	}	IoAdapter->head = 0;	IoAdapter->tail = 0;	IoAdapter->assign = 0;	IoAdapter->trapped = 0;	memset(&IoAdapter->a.IdTable[0], 0x00,	       sizeof(IoAdapter->a.IdTable));	memset(&IoAdapter->a.IdTypeTable[0], 0x00,	       sizeof(IoAdapter->a.IdTypeTable));	memset(&IoAdapter->a.FlowControlIdTable[0], 0x00,	       sizeof(IoAdapter->a.FlowControlIdTable));	memset(&IoAdapter->a.FlowControlSkipTable[0], 0x00,	       sizeof(IoAdapter->a.FlowControlSkipTable));	memset(&IoAdapter->a.misc_flags_table[0], 0x00,	       sizeof(IoAdapter->a.misc_flags_table));	memset(&IoAdapter->a.rx_stream[0], 0x00,	       sizeof(IoAdapter->a.rx_stream));	memset(&IoAdapter->a.tx_stream[0], 0x00,	       sizeof(IoAdapter->a.tx_stream));	memset(&IoAdapter->a.tx_pos[0], 0x00, sizeof(IoAdapter->a.tx_pos));	memset(&IoAdapter->a.rx_pos[0], 0x00, sizeof(IoAdapter->a.rx_pos));	return (0);}static intdiva_bri_write_sdram_block(PISDN_ADAPTER IoAdapter,			   dword address, const byte * data, dword length){	byte __iomem *addrHi, *addrLo, *ioaddr;	byte __iomem *Port;	if (!IoAdapter->port) {		return (-1);	}	Port = DIVA_OS_MEM_ATTACH_PORT(IoAdapter);	addrHi = Port +	    ((IoAdapter->Properties.Bus == BUS_PCI) ? M_PCI_ADDRH : ADDRH);	addrLo = Port + ADDR;	ioaddr = Port + DATA;	while (length--) {		outpp(addrHi, (word) (address >> 16));		outppw(addrLo, (word) (address & 0x0000ffff));		outpp(ioaddr, *data++);		address++;	}	DIVA_OS_MEM_DETACH_PORT(IoAdapter, Port);	return (0);}static intdiva_bri_start_adapter(PISDN_ADAPTER IoAdapter,		       dword start_address, dword features){	byte __iomem *Port;	dword i, test;	byte __iomem *addrHi, *addrLo, *ioaddr;	int started = 0;	ADAPTER *a = &IoAdapter->a;	if (IoAdapter->Initialized) {		DBG_ERR(			("A: A(%d) bri_start_adapter, adapter already running",			 IoAdapter->ANum)) return (-1);	}	if (!IoAdapter->port) {		DBG_ERR(("A: A(%d) bri_start_adapter, adapter not mapped",			 IoAdapter->ANum)) return (-1);	}	sprintf(IoAdapter->Name, "A(%d)", (int) IoAdapter->ANum);	DBG_LOG(("A(%d) start BRI", IoAdapter->ANum))	Port = DIVA_OS_MEM_ATTACH_PORT(IoAdapter);	addrHi = Port +	    ((IoAdapter->Properties.Bus == BUS_PCI) ? M_PCI_ADDRH : ADDRH);	addrLo = Port + ADDR;	ioaddr = Port + DATA;	outpp(addrHi,	      (byte) (		      (IoAdapter->MemoryBase + IoAdapter->MemorySize -		       BRI_SHARED_RAM_SIZE) >> 16));	outppw(addrLo, 0x1e);	outppw(ioaddr, 0x00);	DIVA_OS_MEM_DETACH_PORT(IoAdapter, Port);	/*	   start the protocol code	 */	Port = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);	outpp(Port, 0x08);	DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, Port);	Port = DIVA_OS_MEM_ATTACH_PORT(IoAdapter);	addrHi = Port +	    ((IoAdapter->Properties.Bus == BUS_PCI) ? M_PCI_ADDRH : ADDRH);	addrLo = Port + ADDR;	ioaddr = Port + DATA;	/*	   wait for signature (max. 3 seconds)	 */	for (i = 0; i < 300; ++i) {		diva_os_wait(10);		outpp(addrHi,		      (byte) (			      (IoAdapter->MemoryBase +			       IoAdapter->MemorySize -			       BRI_SHARED_RAM_SIZE) >> 16));		outppw(addrLo, 0x1e);		test = (dword) inppw(ioaddr);		if (test == 0x4447) {			DBG_LOG(				("Protocol startup time %d.%02d seconds",				 (i / 100), (i % 100)))			started = 1;			break;		}	}	DIVA_OS_MEM_DETACH_PORT(IoAdapter, Port);	if (!started) {		DBG_FTL(("A: A(%d) %s: Adapter selftest failed 0x%04X",			 IoAdapter->ANum, IoAdapter->Properties.Name,			 test))		(*(IoAdapter->trapFnc)) (IoAdapter);		return (-1);	}	IoAdapter->Initialized = 1;	/*	   Check Interrupt	 */	IoAdapter->IrqCount = 0;	a->ReadyInt = 1;	if (IoAdapter->reset) {		Port = DIVA_OS_MEM_ATTACH_RESET(IoAdapter);		outpp(Port, 0x41);		DIVA_OS_MEM_DETACH_RESET(IoAdapter, Port);	}	a->ram_out(a, &PR_RAM->ReadyInt, 1);	for (i = 0; ((!IoAdapter->IrqCount) && (i < 100)); i++) {		diva_os_wait(10);	}	if (!IoAdapter->IrqCount) {		DBG_ERR(			("A: A(%d) interrupt test failed",			 IoAdapter->ANum))		IoAdapter->Initialized = 0;		IoAdapter->stop(IoAdapter);		return (-1);	}	IoAdapter->Properties.Features = (word) features;	diva_xdi_display_adapter_features(IoAdapter->ANum);	DBG_LOG(("A(%d) BRI adapter successfull started", IoAdapter->ANum))	    /*	       Register with DIDD	     */	diva_xdi_didd_register_adapter(IoAdapter->ANum);	return (0);}static void diva_bri_clear_interrupts(diva_os_xdi_adapter_t * a){	PISDN_ADAPTER IoAdapter = &a->xdi_adapter;	/*	   clear any pending interrupt	 */	IoAdapter->disIrq(IoAdapter);	IoAdapter->tst_irq(&IoAdapter->a);	IoAdapter->clr_irq(&IoAdapter->a);	IoAdapter->tst_irq(&IoAdapter->a);	/*	   kill pending dpcs	 */	diva_os_cancel_soft_isr(&IoAdapter->req_soft_isr);	diva_os_cancel_soft_isr(&IoAdapter->isr_soft_isr);}/***  Stop card*/static int diva_bri_stop_adapter(diva_os_xdi_adapter_t * a){	PISDN_ADAPTER IoAdapter = &a->xdi_adapter;	int i = 100;	if (!IoAdapter->port) {		return (-1);	}	if (!IoAdapter->Initialized) {		DBG_ERR(("A: A(%d) can't stop BRI adapter - not running",			 IoAdapter->ANum))		return (-1);	/* nothing to stop */	}	IoAdapter->Initialized = 0;	/*	   Disconnect Adapter from DIDD	 */	diva_xdi_didd_remove_adapter(IoAdapter->ANum);	/*	   Stop interrupts	 */	a->clear_interrupts_proc = diva_bri_clear_interrupts;	IoAdapter->a.ReadyInt = 1;	IoAdapter->a.ram_inc(&IoAdapter->a, &PR_RAM->ReadyInt);	do {		diva_os_sleep(10);	} while (i-- && a->clear_interrupts_proc);	if (a->clear_interrupts_proc) {		diva_bri_clear_interrupts(a);		a->clear_interrupts_proc = NULL;		DBG_ERR(("A: A(%d) no final interrupt from BRI adapter",			 IoAdapter->ANum))	}	IoAdapter->a.ReadyInt = 0;	/*	   Stop and reset adapter	 */	IoAdapter->stop(IoAdapter);	return (0);}

⌨️ 快捷键说明

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