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

📄 os_pri.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
	/*	   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 Adapter, but do not unmap/unregister - adapter**  will be restarted later*/static int diva_pri_stop_adapter(diva_os_xdi_adapter_t * a){	PISDN_ADAPTER IoAdapter = &a->xdi_adapter;	int i = 100;	if (!IoAdapter->ram) {		return (-1);	}	if (!IoAdapter->Initialized) {		DBG_ERR(("A: A(%d) can't stop PRI 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_pri_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_pri_clear_interrupts(a);		a->clear_interrupts_proc = NULL;		DBG_ERR(("A: A(%d) no final interrupt from PRI adapter",			 IoAdapter->ANum))	}	IoAdapter->a.ReadyInt = 0;	/*	   Stop and reset adapter	 */	IoAdapter->stop(IoAdapter);	return (0);}/***  Process commands form configuration/download framework and from**  user mode****  return 0 on success*/static intdiva_pri_cmd_card_proc(struct _diva_os_xdi_adapter *a,		       diva_xdi_um_cfg_cmd_t * cmd, int length){	int ret = -1;	if (cmd->adapter != a->controller) {		DBG_ERR(("A: pri_cmd, invalid controller=%d != %d",			 cmd->adapter, a->controller))		return (-1);	}	switch (cmd->command) {	case DIVA_XDI_UM_CMD_GET_CARD_ORDINAL:		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_RESET_ADAPTER:		ret = diva_pri_reset_adapter(&a->xdi_adapter);		break;	case DIVA_XDI_UM_CMD_WRITE_SDRAM_BLOCK:		ret = diva_pri_write_sdram_block(&a->xdi_adapter,						 cmd->command_data.						 write_sdram.offset,						 (byte *) & cmd[1],						 cmd->command_data.						 write_sdram.length,						 pri_is_rev_2_card(a->								   CardOrdinal)						 ? MP2_MEMORY_SIZE :						 MP_MEMORY_SIZE);		break;	case DIVA_XDI_UM_CMD_STOP_ADAPTER:		ret = diva_pri_stop_adapter(a);		break;	case DIVA_XDI_UM_CMD_START_ADAPTER:		ret = diva_pri_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_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.ram ||				!a->xdi_adapter.reset ||			    !a->xdi_adapter.cfg) {				*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_READ_XLOG_ENTRY:		ret = diva_card_read_xlog(a);		break;	case DIVA_XDI_UM_CMD_READ_SDRAM:		if (a->xdi_adapter.Address) {			if (			    (a->xdi_mbox.data_length =			     cmd->command_data.read_sdram.length)) {				if (				    (a->xdi_mbox.data_length +				     cmd->command_data.read_sdram.offset) <				    a->xdi_adapter.MemorySize) {					a->xdi_mbox.data =					    diva_os_malloc(0,							   a->xdi_mbox.							   data_length);					if (a->xdi_mbox.data) {						byte __iomem *p = DIVA_OS_MEM_ATTACH_ADDRESS(&a->xdi_adapter);						byte __iomem *src = p;						byte *dst = a->xdi_mbox.data;						dword len = a->xdi_mbox.data_length;						src += cmd->command_data.read_sdram.offset;						while (len--) {							*dst++ = READ_BYTE(src++);						}						a->xdi_mbox.status = DIVA_XDI_MBOX_BUSY;						DIVA_OS_MEM_DETACH_ADDRESS(&a->xdi_adapter, p);						ret = 0;					}				}			}		}		break;	default:		DBG_ERR(("A: A(%d) invalid cmd=%d", a->controller,			 cmd->command))	}	return (ret);}/***  Get Serial Number*/static int pri_get_serial_number(diva_os_xdi_adapter_t * a){	byte data[64];	int i;	dword len = sizeof(data);	volatile byte __iomem *config;	volatile byte __iomem *flash;	byte c;/* *  First set some GT6401x config registers before accessing the BOOT-ROM */ 	config = DIVA_OS_MEM_ATTACH_CONFIG(&a->xdi_adapter);	c = READ_BYTE(&config[0xc3c]);	if (!(c & 0x08)) {		WRITE_BYTE(&config[0xc3c], c);	/* Base Address enable register */	}	WRITE_BYTE(&config[LOW_BOOTCS_DREG], 0x00);	WRITE_BYTE(&config[HI_BOOTCS_DREG], 0xFF); 	DIVA_OS_MEM_DETACH_CONFIG(&a->xdi_adapter, config);/* *  Read only the last 64 bytes of manufacturing data */	memset(data, '\0', len); 	flash = DIVA_OS_MEM_ATTACH_PROM(&a->xdi_adapter);	for (i = 0; i < len; i++) {		data[i] = READ_BYTE(&flash[0x8000 - len + i]);	} 	DIVA_OS_MEM_DETACH_PROM(&a->xdi_adapter, flash); 	config = DIVA_OS_MEM_ATTACH_CONFIG(&a->xdi_adapter);	WRITE_BYTE(&config[LOW_BOOTCS_DREG], 0xFC);	/* Disable FLASH EPROM access */	WRITE_BYTE(&config[HI_BOOTCS_DREG], 0xFF); 	DIVA_OS_MEM_DETACH_CONFIG(&a->xdi_adapter, config);	if (memcmp(&data[48], "DIVAserverPR", 12)) {#if !defined(DIVA_PRI_NO_PCI_BIOS_WORKAROUND)	/* { */		word cmd = 0, cmd_org;		void *addr;		dword addr1, addr3, addr4;		byte Bus, Slot;		void *hdev;		addr4 = a->resources.pci.bar[4];		addr3 = a->resources.pci.bar[3];	/* flash  */		addr1 = a->resources.pci.bar[1];	/* unused */		DBG_ERR(("A: apply Compaq BIOS workaround"))		DBG_LOG(("%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",			     data[0], data[1], data[2], data[3],			     data[4], data[5], data[6], data[7]))		Bus = a->resources.pci.bus;		Slot = a->resources.pci.func;		hdev = a->resources.pci.hdev;		PCIread(Bus, Slot, 0x04, &cmd_org, sizeof(cmd_org), hdev);		PCIwrite(Bus, Slot, 0x04, &cmd, sizeof(cmd), hdev);		PCIwrite(Bus, Slot, 0x14, &addr4, sizeof(addr4), hdev);		PCIwrite(Bus, Slot, 0x20, &addr1, sizeof(addr1), hdev);		PCIwrite(Bus, Slot, 0x04, &cmd_org, sizeof(cmd_org), hdev);		addr = a->resources.pci.addr[1];		a->resources.pci.addr[1] = a->resources.pci.addr[4];		a->resources.pci.addr[4] = addr;		addr1 = a->resources.pci.bar[1];		a->resources.pci.bar[1] = a->resources.pci.bar[4];		a->resources.pci.bar[4] = addr1;		/*		   Try to read Flash again		 */		len = sizeof(data); 		config = DIVA_OS_MEM_ATTACH_CONFIG(&a->xdi_adapter);		if (!(config[0xc3c] & 0x08)) {			config[0xc3c] |= 0x08;	/* Base Address enable register */		}		config[LOW_BOOTCS_DREG] = 0x00;		config[HI_BOOTCS_DREG] = 0xFF; 		DIVA_OS_MEM_DETACH_CONFIG(&a->xdi_adapter, config);		memset(data, '\0', len); 		flash = DIVA_OS_MEM_ATTACH_PROM(&a->xdi_adapter);		for (i = 0; i < len; i++) {			data[i] = flash[0x8000 - len + i];		} 		DIVA_OS_MEM_ATTACH_PROM(&a->xdi_adapter, flash); 		config = DIVA_OS_MEM_ATTACH_CONFIG(&a->xdi_adapter);		config[LOW_BOOTCS_DREG] = 0xFC;		config[HI_BOOTCS_DREG] = 0xFF; 		DIVA_OS_MEM_DETACH_CONFIG(&a->xdi_adapter, config);		if (memcmp(&data[48], "DIVAserverPR", 12)) {			DBG_ERR(("A: failed to read serial number"))			DBG_LOG(("%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",				     data[0], data[1], data[2], data[3],				     data[4], data[5], data[6], data[7]))			return (-1);		}#else				/* } { */		DBG_ERR(("A: failed to read DIVA signature word"))		DBG_LOG(("%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",			     data[0], data[1], data[2], data[3],			     data[4], data[5], data[6], data[7]))		DBG_LOG(("%02x:%02x:%02x:%02x", data[47], data[46],			     data[45], data[44]))#endif				/* } */	}	a->xdi_adapter.serialNo =	    (data[47] << 24) | (data[46] << 16) | (data[45] << 8) |	    data[44];	if (!a->xdi_adapter.serialNo	    || (a->xdi_adapter.serialNo == 0xffffffff)) {		a->xdi_adapter.serialNo = 0;		DBG_ERR(("A: failed to read serial number"))		return (-1);	}	DBG_LOG(("Serial No.          : %ld", a->xdi_adapter.serialNo))	DBG_TRC(("Board Revision      : %d.%02d", (int) data[41],		     (int) data[40]))	DBG_TRC(("PLD revision        : %d.%02d", (int) data[33],		     (int) data[32]))	DBG_TRC(("Boot loader version : %d.%02d", (int) data[37],		     (int) data[36]))	DBG_TRC(("Manufacturing Date  : %d/%02d/%02d  (yyyy/mm/dd)",		     (int) ((data[28] > 90) ? 1900 : 2000) +		     (int) data[28], (int) data[29], (int) data[30]))	return (0);}void diva_os_prepare_pri2_functions(PISDN_ADAPTER IoAdapter){}void diva_os_prepare_pri_functions(PISDN_ADAPTER IoAdapter){}/***  Checks presence of DSP on board*/static intdsp_check_presence(volatile byte __iomem * addr, volatile byte __iomem * data, int dsp){	word pattern;	WRITE_WORD(addr, 0x4000);	WRITE_WORD(data, DSP_SIGNATURE_PROBE_WORD);	WRITE_WORD(addr, 0x4000);	pattern = READ_WORD(data);	if (pattern != DSP_SIGNATURE_PROBE_WORD) {		DBG_TRC(("W: DSP[%d] %04x(is) != %04x(should)",			 dsp, pattern, DSP_SIGNATURE_PROBE_WORD))		return (-1);	}	WRITE_WORD(addr, 0x4000);	WRITE_WORD(data, ~DSP_SIGNATURE_PROBE_WORD);	WRITE_WORD(addr, 0x4000);	pattern = READ_WORD(data);	if (pattern != (word) ~ DSP_SIGNATURE_PROBE_WORD) {		DBG_ERR(("A: DSP[%d] %04x(is) != %04x(should)",			 dsp, pattern, (word) ~ DSP_SIGNATURE_PROBE_WORD))		return (-2);	}	DBG_TRC(("DSP[%d] present", dsp))	return (0);}/***  Check if DSP's are present and operating**  Information about detected DSP's is returned as bit mask**  Bit 0  - DSP1**  ...**  ...**  ...**  Bit 29 - DSP30*/static dword diva_pri_detect_dsps(diva_os_xdi_adapter_t * a){	byte __iomem *base;	byte __iomem *p;	dword ret = 0;	dword row_offset[7] = {		0x00000000,		0x00000800,	/* 1 - ROW 1 */		0x00000840,	/* 2 - ROW 2 */		0x00001000,	/* 3 - ROW 3 */		0x00001040,	/* 4 - ROW 4 */		0x00000000	/* 5 - ROW 0 */	};	byte __iomem *dsp_addr_port;	byte __iomem *dsp_data_port;	byte row_state;	int dsp_row = 0, dsp_index, dsp_num;	if (!a->xdi_adapter.Control || !a->xdi_adapter.reset) {		return (0);	}	p = DIVA_OS_MEM_ATTACH_RESET(&a->xdi_adapter);	WRITE_BYTE(p, _MP_RISC_RESET | _MP_DSP_RESET);	DIVA_OS_MEM_DETACH_RESET(&a->xdi_adapter, p);	diva_os_wait(5);	base = DIVA_OS_MEM_ATTACH_CONTROL(&a->xdi_adapter);	for (dsp_num = 0; dsp_num < 30; dsp_num++) {		dsp_row = dsp_num / 7 + 1;		dsp_index = dsp_num % 7;		dsp_data_port = base;		dsp_addr_port = base;		dsp_data_port += row_offset[dsp_row];		dsp_addr_port += row_offset[dsp_row];		dsp_data_port += (dsp_index * 8);		dsp_addr_port += (dsp_index * 8) + 0x80;		if (!dsp_check_presence		    (dsp_addr_port, dsp_data_port, dsp_num + 1)) {			ret |= (1 << dsp_num);		}	}	DIVA_OS_MEM_DETACH_CONTROL(&a->xdi_adapter, base);	p = DIVA_OS_MEM_ATTACH_RESET(&a->xdi_adapter);	WRITE_BYTE(p, _MP_RISC_RESET | _MP_LED1 | _MP_LED2);	DIVA_OS_MEM_DETACH_RESET(&a->xdi_adapter, p);	diva_os_wait(5);	/*	   Verify modules	 */	for (dsp_row = 0; dsp_row < 4; dsp_row++) {		row_state = ((ret >> (dsp_row * 7)) & 0x7F);		if (row_state && (row_state != 0x7F)) {			for (dsp_index = 0; dsp_index < 7; dsp_index++) {				if (!(row_state & (1 << dsp_index))) {					DBG_ERR(("A: MODULE[%d]-DSP[%d] failed",						 dsp_row + 1,						 dsp_index + 1))				}			}		}	}	if (!(ret & 0x10000000)) {		DBG_ERR(("A: ON BOARD-DSP[1] failed"))	}	if (!(ret & 0x20000000)) {		DBG_ERR(("A: ON BOARD-DSP[2] failed"))	}	/*	   Print module population now	 */	DBG_LOG(("+-----------------------+"))	DBG_LOG(("| DSP MODULE POPULATION |"))	DBG_LOG(("+-----------------------+"))	DBG_LOG(("|  1  |  2  |  3  |  4  |"))	DBG_LOG(("+-----------------------+"))	DBG_LOG(("|  %s  |  %s  |  %s  |  %s  |",		 ((ret >> (0 * 7)) & 0x7F) ? "Y" : "N",		 ((ret >> (1 * 7)) & 0x7F) ? "Y" : "N",		 ((ret >> (2 * 7)) & 0x7F) ? "Y" : "N",		 ((ret >> (3 * 7)) & 0x7F) ? "Y" : "N"))	DBG_LOG(("+-----------------------+"))	DBG_LOG(("DSP's(present-absent):%08x-%08x", ret,		 ~ret & 0x3fffffff))	return (ret);}

⌨️ 快捷键说明

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