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

📄 s_4bri.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
/* *  Copyright (c) Eicon Networks, 2002. *  This source file is supplied for the use with  Eicon Networks range of DIVA Server Adapters. *  Eicon File Revision :    2.1 *  This program is free software; you can redistribute it and/or modify  it under the terms of the GNU General Public License as published by  the Free Software Foundation; either version 2, or (at your option)  any later version. *  This program is distributed in the hope that it will be useful,  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details. *  You should have received a copy of the GNU General Public License  along with this program; if not, write to the Free Software  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */#include "platform.h"#include "di_defs.h"#include "pc.h"#include "pr_pc.h"#include "di.h"#include "mi_pc.h"#include "pc_maint.h"#include "divasync.h"#include "pc_init.h"#include "io.h"#include "helpers.h"#include "dsrv4bri.h"#include "dsp_defs.h"#include "sdp_hdr.h"/*****************************************************************************/#define	MAX_XLOG_SIZE	(64 * 1024)/* --------------------------------------------------------------------------		Recovery XLOG from QBRI Card	 -------------------------------------------------------------------------- */static void qBri_cpu_trapped (PISDN_ADAPTER IoAdapter) {	byte  __iomem *base ;	word *Xlog ;	dword   regs[4], TrapID, offset, size ;	Xdesc   xlogDesc ;	int factor = (IoAdapter->tasks == 1) ? 1 : 2;/* *	check for trapped MIPS 46xx CPU, dump exception frame */	base = DIVA_OS_MEM_ATTACH_CONTROL(IoAdapter);	offset = IoAdapter->ControllerNumber * (IoAdapter->MemorySize >> factor) ;	TrapID = READ_DWORD(&base[0x80]) ;	if ( (TrapID == 0x99999999) || (TrapID == 0x99999901) )	{		dump_trap_frame (IoAdapter, &base[0x90]) ;		IoAdapter->trapped = 1 ;	}	regs[0] = READ_DWORD((base + offset) + 0x70);	regs[1] = READ_DWORD((base + offset) + 0x74);	regs[2] = READ_DWORD((base + offset) + 0x78);	regs[3] = READ_DWORD((base + offset) + 0x7c);	regs[0] &= IoAdapter->MemorySize - 1 ;	if ( (regs[0] >= offset)	  && (regs[0] < offset + (IoAdapter->MemorySize >> factor) - 1) )	{		if ( !(Xlog = (word *)diva_os_malloc (0, MAX_XLOG_SIZE)) ) {			DIVA_OS_MEM_DETACH_CONTROL(IoAdapter, base);			return ;		}		size = offset + (IoAdapter->MemorySize >> factor) - regs[0] ;		if ( size > MAX_XLOG_SIZE )			size = MAX_XLOG_SIZE ;		memcpy_fromio (Xlog, &base[regs[0]], size) ;		xlogDesc.buf = Xlog ;		xlogDesc.cnt = READ_WORD(&base[regs[1] & (IoAdapter->MemorySize - 1)]) ;		xlogDesc.out = READ_WORD(&base[regs[2] & (IoAdapter->MemorySize - 1)]) ;		dump_xlog_buffer (IoAdapter, &xlogDesc) ;		diva_os_free (0, Xlog) ;		IoAdapter->trapped = 2 ;	}	DIVA_OS_MEM_DETACH_CONTROL(IoAdapter, base);}/* --------------------------------------------------------------------------		Reset QBRI Hardware	 -------------------------------------------------------------------------- */static void reset_qBri_hardware (PISDN_ADAPTER IoAdapter) {	word volatile __iomem *qBriReset ;	byte  volatile __iomem *qBriCntrl ;	byte  volatile __iomem *p ;	qBriReset = (word volatile __iomem *)DIVA_OS_MEM_ATTACH_PROM(IoAdapter);	WRITE_WORD(qBriReset, READ_WORD(qBriReset) | PLX9054_SOFT_RESET) ;	diva_os_wait (1) ;	WRITE_WORD(qBriReset, READ_WORD(qBriReset) & ~PLX9054_SOFT_RESET) ;	diva_os_wait (1);	WRITE_WORD(qBriReset, READ_WORD(qBriReset) | PLX9054_RELOAD_EEPROM) ;	diva_os_wait (1) ;	WRITE_WORD(qBriReset, READ_WORD(qBriReset) & ~PLX9054_RELOAD_EEPROM) ;	diva_os_wait (1);	DIVA_OS_MEM_DETACH_PROM(IoAdapter, qBriReset);	qBriCntrl = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);	p = &qBriCntrl[DIVA_4BRI_REVISION(IoAdapter) ? (MQ2_BREG_RISC) : (MQ_BREG_RISC)];	WRITE_DWORD(p, 0) ;	DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, qBriCntrl);	DBG_TRC(("resetted board @ reset addr 0x%08lx", qBriReset))	DBG_TRC(("resetted board @ cntrl addr 0x%08lx", p))}/* --------------------------------------------------------------------------		Start Card CPU	 -------------------------------------------------------------------------- */void start_qBri_hardware (PISDN_ADAPTER IoAdapter) {	byte volatile __iomem *qBriReset ;	byte volatile __iomem *p ;	p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);	qBriReset = &p[(DIVA_4BRI_REVISION(IoAdapter)) ? (MQ2_BREG_RISC) : (MQ_BREG_RISC)];	WRITE_DWORD(qBriReset, MQ_RISC_COLD_RESET_MASK) ;	diva_os_wait (2) ;	WRITE_DWORD(qBriReset, MQ_RISC_WARM_RESET_MASK | MQ_RISC_COLD_RESET_MASK) ;	diva_os_wait (10) ;	DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);	DBG_TRC(("started processor @ addr 0x%08lx", qBriReset))}/* --------------------------------------------------------------------------		Stop Card CPU	 -------------------------------------------------------------------------- */static void stop_qBri_hardware (PISDN_ADAPTER IoAdapter) {	byte volatile __iomem *p ;	dword volatile __iomem *qBriReset ;	dword volatile __iomem *qBriIrq ;	dword volatile __iomem *qBriIsacDspReset ;	int rev2 = DIVA_4BRI_REVISION(IoAdapter);	int reset_offset = rev2 ? (MQ2_BREG_RISC)      : (MQ_BREG_RISC);	int irq_offset   = rev2 ? (MQ2_BREG_IRQ_TEST)  : (MQ_BREG_IRQ_TEST);	int hw_offset    = rev2 ? (MQ2_ISAC_DSP_RESET) : (MQ_ISAC_DSP_RESET);	if ( IoAdapter->ControllerNumber > 0 )		return ;	p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);	qBriReset = (dword volatile __iomem *)&p[reset_offset];	qBriIsacDspReset = (dword volatile __iomem *)&p[hw_offset];/* *	clear interrupt line (reset Local Interrupt Test Register) */	WRITE_DWORD(qBriReset, 0) ; 	WRITE_DWORD(qBriIsacDspReset, 0) ;	DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);		p = DIVA_OS_MEM_ATTACH_RESET(IoAdapter);	WRITE_BYTE(&p[PLX9054_INTCSR], 0x00);	/* disable PCI interrupts */	DIVA_OS_MEM_DETACH_RESET(IoAdapter, p);		p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);	qBriIrq   = (dword volatile __iomem *)&p[irq_offset];	WRITE_DWORD(qBriIrq, MQ_IRQ_REQ_OFF) ;	DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);	DBG_TRC(("stopped processor @ addr 0x%08lx", qBriReset))}/* --------------------------------------------------------------------------		FPGA download	 -------------------------------------------------------------------------- */#define FPGA_NAME_OFFSET         0x10static byte * qBri_check_FPGAsrc (PISDN_ADAPTER IoAdapter, char *FileName,                                  dword *Length, dword *code) {	byte *File ;	char  *fpgaFile, *fpgaType, *fpgaDate, *fpgaTime ;	dword  fpgaFlen,  fpgaTlen,  fpgaDlen, cnt, year, i ;	if (!(File = (byte *)xdiLoadFile (FileName, Length, 0))) {		return (NULL) ;	}/* *	 scan file until FF and put id string into buffer */	for ( i = 0 ; File[i] != 0xff ; )	{		if ( ++i >= *Length )		{			DBG_FTL(("FPGA download: start of data header not found"))			xdiFreeFile (File) ;			return (NULL) ;		}	}	*code = i++ ;	if ( (File[i] & 0xF0) != 0x20 )	{		DBG_FTL(("FPGA download: data header corrupted"))		xdiFreeFile (File) ;		return (NULL) ;	}	fpgaFlen = (dword)  File[FPGA_NAME_OFFSET - 1] ;	if ( fpgaFlen == 0 )		fpgaFlen = 12 ;	fpgaFile = (char *)&File[FPGA_NAME_OFFSET] ;	fpgaTlen = (dword)  fpgaFile[fpgaFlen + 2] ;	if ( fpgaTlen == 0 )		fpgaTlen = 10 ;	fpgaType = (char *)&fpgaFile[fpgaFlen + 3] ;	fpgaDlen = (dword)  fpgaType[fpgaTlen + 2] ;	if ( fpgaDlen == 0 )		fpgaDlen = 11 ;	fpgaDate = (char *)&fpgaType[fpgaTlen + 3] ;	fpgaTime = (char *)&fpgaDate[fpgaDlen + 3] ;	cnt = (dword)(((File[  i  ] & 0x0F) << 20) + (File[i + 1] << 12)	             + (File[i + 2]         <<  4) + (File[i + 3] >>  4)) ;	if ( (dword)(i + (cnt / 8)) > *Length )	{		DBG_FTL(("FPGA download: '%s' file too small (%ld < %ld)",		         FileName, *Length, code + ((cnt + 7) / 8) ))		xdiFreeFile (File) ;		return (NULL) ;	}	i = 0 ;	do	{		while ( (fpgaDate[i] != '\0')		     && ((fpgaDate[i] < '0') || (fpgaDate[i] > '9')) )		{			i++;		}		year = 0 ;		while ( (fpgaDate[i] >= '0') && (fpgaDate[i] <= '9') )			year = year * 10 + (fpgaDate[i++] - '0') ;	} while ( (year < 2000) && (fpgaDate[i] != '\0') );	switch (IoAdapter->cardType) {		case CARDTYPE_DIVASRV_B_2F_PCI:			break;		default:	    if ( year >= 2001 ) {

⌨️ 快捷键说明

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