11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
4475be4d85a274d0961593db41cf85689db1d583cJoe Perches Copyright (c) Eicon Networks, 2002.
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
6475be4d85a274d0961593db41cf85689db1d583cJoe Perches This source file is supplied for the use with
7475be4d85a274d0961593db41cf85689db1d583cJoe Perches Eicon Networks range of DIVA Server Adapters.
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
9475be4d85a274d0961593db41cf85689db1d583cJoe Perches Eicon File Revision :    2.1
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
11475be4d85a274d0961593db41cf85689db1d583cJoe Perches This program is free software; you can redistribute it and/or modify
12475be4d85a274d0961593db41cf85689db1d583cJoe Perches it under the terms of the GNU General Public License as published by
13475be4d85a274d0961593db41cf85689db1d583cJoe Perches the Free Software Foundation; either version 2, or (at your option)
14475be4d85a274d0961593db41cf85689db1d583cJoe Perches any later version.
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
16475be4d85a274d0961593db41cf85689db1d583cJoe Perches This program is distributed in the hope that it will be useful,
17475be4d85a274d0961593db41cf85689db1d583cJoe Perches but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
18475be4d85a274d0961593db41cf85689db1d583cJoe Perches implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
19475be4d85a274d0961593db41cf85689db1d583cJoe Perches See the GNU General Public License for more details.
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
21475be4d85a274d0961593db41cf85689db1d583cJoe Perches You should have received a copy of the GNU General Public License
22475be4d85a274d0961593db41cf85689db1d583cJoe Perches along with this program; if not, write to the Free Software
23475be4d85a274d0961593db41cf85689db1d583cJoe Perches Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "platform.h"
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "di_defs.h"
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "pc.h"
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "pr_pc.h"
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "di.h"
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "mi_pc.h"
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "pc_maint.h"
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "divasync.h"
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "pc_init.h"
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "io.h"
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "helpers.h"
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "dsrv4bri.h"
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "dsp_defs.h"
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "sdp_hdr.h"
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*****************************************************************************/
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	MAX_XLOG_SIZE	(64 * 1024)
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* --------------------------------------------------------------------------
45475be4d85a274d0961593db41cf85689db1d583cJoe Perches   Recovery XLOG from QBRI Card
46475be4d85a274d0961593db41cf85689db1d583cJoe Perches   -------------------------------------------------------------------------- */
47475be4d85a274d0961593db41cf85689db1d583cJoe Perchesstatic void qBri_cpu_trapped(PISDN_ADAPTER IoAdapter) {
48475be4d85a274d0961593db41cf85689db1d583cJoe Perches	byte  __iomem *base;
49475be4d85a274d0961593db41cf85689db1d583cJoe Perches	word *Xlog;
50475be4d85a274d0961593db41cf85689db1d583cJoe Perches	dword   regs[4], TrapID, offset, size;
51475be4d85a274d0961593db41cf85689db1d583cJoe Perches	Xdesc   xlogDesc;
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int factor = (IoAdapter->tasks == 1) ? 1 : 2;
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	check for trapped MIPS 46xx CPU, dump exception frame
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	base = DIVA_OS_MEM_ATTACH_CONTROL(IoAdapter);
59475be4d85a274d0961593db41cf85689db1d583cJoe Perches	offset = IoAdapter->ControllerNumber * (IoAdapter->MemorySize >> factor);
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
61475be4d85a274d0961593db41cf85689db1d583cJoe Perches	TrapID = READ_DWORD(&base[0x80]);
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
63475be4d85a274d0961593db41cf85689db1d583cJoe Perches	if ((TrapID == 0x99999999) || (TrapID == 0x99999901))
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
65475be4d85a274d0961593db41cf85689db1d583cJoe Perches		dump_trap_frame(IoAdapter, &base[0x90]);
66475be4d85a274d0961593db41cf85689db1d583cJoe Perches		IoAdapter->trapped = 1;
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	regs[0] = READ_DWORD((base + offset) + 0x70);
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	regs[1] = READ_DWORD((base + offset) + 0x74);
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	regs[2] = READ_DWORD((base + offset) + 0x78);
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	regs[3] = READ_DWORD((base + offset) + 0x7c);
73475be4d85a274d0961593db41cf85689db1d583cJoe Perches	regs[0] &= IoAdapter->MemorySize - 1;
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
75475be4d85a274d0961593db41cf85689db1d583cJoe Perches	if ((regs[0] >= offset)
76475be4d85a274d0961593db41cf85689db1d583cJoe Perches	    && (regs[0] < offset + (IoAdapter->MemorySize >> factor) - 1))
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
78475be4d85a274d0961593db41cf85689db1d583cJoe Perches		if (!(Xlog = (word *)diva_os_malloc(0, MAX_XLOG_SIZE))) {
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			DIVA_OS_MEM_DETACH_CONTROL(IoAdapter, base);
80475be4d85a274d0961593db41cf85689db1d583cJoe Perches			return;
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
83475be4d85a274d0961593db41cf85689db1d583cJoe Perches		size = offset + (IoAdapter->MemorySize >> factor) - regs[0];
84475be4d85a274d0961593db41cf85689db1d583cJoe Perches		if (size > MAX_XLOG_SIZE)
85475be4d85a274d0961593db41cf85689db1d583cJoe Perches			size = MAX_XLOG_SIZE;
86475be4d85a274d0961593db41cf85689db1d583cJoe Perches		memcpy_fromio(Xlog, &base[regs[0]], size);
87475be4d85a274d0961593db41cf85689db1d583cJoe Perches		xlogDesc.buf = Xlog;
88475be4d85a274d0961593db41cf85689db1d583cJoe Perches		xlogDesc.cnt = READ_WORD(&base[regs[1] & (IoAdapter->MemorySize - 1)]);
89475be4d85a274d0961593db41cf85689db1d583cJoe Perches		xlogDesc.out = READ_WORD(&base[regs[2] & (IoAdapter->MemorySize - 1)]);
90475be4d85a274d0961593db41cf85689db1d583cJoe Perches		dump_xlog_buffer(IoAdapter, &xlogDesc);
91475be4d85a274d0961593db41cf85689db1d583cJoe Perches		diva_os_free(0, Xlog);
92475be4d85a274d0961593db41cf85689db1d583cJoe Perches		IoAdapter->trapped = 2;
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DIVA_OS_MEM_DETACH_CONTROL(IoAdapter, base);
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* --------------------------------------------------------------------------
98475be4d85a274d0961593db41cf85689db1d583cJoe Perches   Reset QBRI Hardware
99475be4d85a274d0961593db41cf85689db1d583cJoe Perches   -------------------------------------------------------------------------- */
100475be4d85a274d0961593db41cf85689db1d583cJoe Perchesstatic void reset_qBri_hardware(PISDN_ADAPTER IoAdapter) {
101475be4d85a274d0961593db41cf85689db1d583cJoe Perches	word volatile __iomem *qBriReset;
102475be4d85a274d0961593db41cf85689db1d583cJoe Perches	byte  volatile __iomem *qBriCntrl;
103475be4d85a274d0961593db41cf85689db1d583cJoe Perches	byte  volatile __iomem *p;
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	qBriReset = (word volatile __iomem *)DIVA_OS_MEM_ATTACH_PROM(IoAdapter);
106475be4d85a274d0961593db41cf85689db1d583cJoe Perches	WRITE_WORD(qBriReset, READ_WORD(qBriReset) | PLX9054_SOFT_RESET);
107475be4d85a274d0961593db41cf85689db1d583cJoe Perches	diva_os_wait(1);
108475be4d85a274d0961593db41cf85689db1d583cJoe Perches	WRITE_WORD(qBriReset, READ_WORD(qBriReset) & ~PLX9054_SOFT_RESET);
109475be4d85a274d0961593db41cf85689db1d583cJoe Perches	diva_os_wait(1);
110475be4d85a274d0961593db41cf85689db1d583cJoe Perches	WRITE_WORD(qBriReset, READ_WORD(qBriReset) | PLX9054_RELOAD_EEPROM);
111475be4d85a274d0961593db41cf85689db1d583cJoe Perches	diva_os_wait(1);
112475be4d85a274d0961593db41cf85689db1d583cJoe Perches	WRITE_WORD(qBriReset, READ_WORD(qBriReset) & ~PLX9054_RELOAD_EEPROM);
113475be4d85a274d0961593db41cf85689db1d583cJoe Perches	diva_os_wait(1);
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DIVA_OS_MEM_DETACH_PROM(IoAdapter, qBriReset);
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	qBriCntrl = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	p = &qBriCntrl[DIVA_4BRI_REVISION(IoAdapter) ? (MQ2_BREG_RISC) : (MQ_BREG_RISC)];
118475be4d85a274d0961593db41cf85689db1d583cJoe Perches	WRITE_DWORD(p, 0);
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, qBriCntrl);
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DBG_TRC(("resetted board @ reset addr 0x%08lx", qBriReset))
122475be4d85a274d0961593db41cf85689db1d583cJoe Perches		DBG_TRC(("resetted board @ cntrl addr 0x%08lx", p))
123475be4d85a274d0961593db41cf85689db1d583cJoe Perches		}
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* --------------------------------------------------------------------------
126475be4d85a274d0961593db41cf85689db1d583cJoe Perches   Start Card CPU
127475be4d85a274d0961593db41cf85689db1d583cJoe Perches   -------------------------------------------------------------------------- */
128475be4d85a274d0961593db41cf85689db1d583cJoe Perchesvoid start_qBri_hardware(PISDN_ADAPTER IoAdapter) {
129475be4d85a274d0961593db41cf85689db1d583cJoe Perches	byte volatile __iomem *qBriReset;
130475be4d85a274d0961593db41cf85689db1d583cJoe Perches	byte volatile __iomem *p;
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	qBriReset = &p[(DIVA_4BRI_REVISION(IoAdapter)) ? (MQ2_BREG_RISC) : (MQ_BREG_RISC)];
134475be4d85a274d0961593db41cf85689db1d583cJoe Perches	WRITE_DWORD(qBriReset, MQ_RISC_COLD_RESET_MASK);
135475be4d85a274d0961593db41cf85689db1d583cJoe Perches	diva_os_wait(2);
136475be4d85a274d0961593db41cf85689db1d583cJoe Perches	WRITE_DWORD(qBriReset, MQ_RISC_WARM_RESET_MASK | MQ_RISC_COLD_RESET_MASK);
137475be4d85a274d0961593db41cf85689db1d583cJoe Perches	diva_os_wait(10);
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DBG_TRC(("started processor @ addr 0x%08lx", qBriReset))
141475be4d85a274d0961593db41cf85689db1d583cJoe Perches		}
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* --------------------------------------------------------------------------
144475be4d85a274d0961593db41cf85689db1d583cJoe Perches   Stop Card CPU
145475be4d85a274d0961593db41cf85689db1d583cJoe Perches   -------------------------------------------------------------------------- */
146475be4d85a274d0961593db41cf85689db1d583cJoe Perchesstatic void stop_qBri_hardware(PISDN_ADAPTER IoAdapter) {
147475be4d85a274d0961593db41cf85689db1d583cJoe Perches	byte volatile __iomem *p;
148475be4d85a274d0961593db41cf85689db1d583cJoe Perches	dword volatile __iomem *qBriReset;
149475be4d85a274d0961593db41cf85689db1d583cJoe Perches	dword volatile __iomem *qBriIrq;
150475be4d85a274d0961593db41cf85689db1d583cJoe Perches	dword volatile __iomem *qBriIsacDspReset;
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int rev2 = DIVA_4BRI_REVISION(IoAdapter);
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int reset_offset = rev2 ? (MQ2_BREG_RISC)      : (MQ_BREG_RISC);
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int irq_offset   = rev2 ? (MQ2_BREG_IRQ_TEST)  : (MQ_BREG_IRQ_TEST);
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int hw_offset    = rev2 ? (MQ2_ISAC_DSP_RESET) : (MQ_ISAC_DSP_RESET);
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
156475be4d85a274d0961593db41cf85689db1d583cJoe Perches	if (IoAdapter->ControllerNumber > 0)
157475be4d85a274d0961593db41cf85689db1d583cJoe Perches		return;
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	qBriReset = (dword volatile __iomem *)&p[reset_offset];
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	qBriIsacDspReset = (dword volatile __iomem *)&p[hw_offset];
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	clear interrupt line (reset Local Interrupt Test Register)
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
164475be4d85a274d0961593db41cf85689db1d583cJoe Perches	WRITE_DWORD(qBriReset, 0);
165475be4d85a274d0961593db41cf85689db1d583cJoe Perches	WRITE_DWORD(qBriIsacDspReset, 0);
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);
167475be4d85a274d0961593db41cf85689db1d583cJoe Perches
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	p = DIVA_OS_MEM_ATTACH_RESET(IoAdapter);
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	WRITE_BYTE(&p[PLX9054_INTCSR], 0x00);	/* disable PCI interrupts */
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DIVA_OS_MEM_DETACH_RESET(IoAdapter, p);
171475be4d85a274d0961593db41cf85689db1d583cJoe Perches
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	qBriIrq   = (dword volatile __iomem *)&p[irq_offset];
174475be4d85a274d0961593db41cf85689db1d583cJoe Perches	WRITE_DWORD(qBriIrq, MQ_IRQ_REQ_OFF);
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DBG_TRC(("stopped processor @ addr 0x%08lx", qBriReset))
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
179475be4d85a274d0961593db41cf85689db1d583cJoe Perches		}
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* --------------------------------------------------------------------------
182475be4d85a274d0961593db41cf85689db1d583cJoe Perches   FPGA download
183475be4d85a274d0961593db41cf85689db1d583cJoe Perches   -------------------------------------------------------------------------- */
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FPGA_NAME_OFFSET         0x10
1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
186475be4d85a274d0961593db41cf85689db1d583cJoe Perchesstatic byte *qBri_check_FPGAsrc(PISDN_ADAPTER IoAdapter, char *FileName,
187475be4d85a274d0961593db41cf85689db1d583cJoe Perches				dword *Length, dword *code) {
188475be4d85a274d0961593db41cf85689db1d583cJoe Perches	byte *File;
189475be4d85a274d0961593db41cf85689db1d583cJoe Perches	char *fpgaFile, *fpgaType, *fpgaDate, *fpgaTime;
190475be4d85a274d0961593db41cf85689db1d583cJoe Perches	dword fpgaFlen, fpgaTlen, fpgaDlen, cnt, year, i;
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
192475be4d85a274d0961593db41cf85689db1d583cJoe Perches	if (!(File = (byte *)xdiLoadFile(FileName, Length, 0))) {
193475be4d85a274d0961593db41cf85689db1d583cJoe Perches		return (NULL);
1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	 scan file until FF and put id string into buffer
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
198475be4d85a274d0961593db41cf85689db1d583cJoe Perches	for (i = 0; File[i] != 0xff;)
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
200475be4d85a274d0961593db41cf85689db1d583cJoe Perches		if (++i >= *Length)
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			DBG_FTL(("FPGA download: start of data header not found"))
203475be4d85a274d0961593db41cf85689db1d583cJoe Perches				xdiFreeFile(File);
204475be4d85a274d0961593db41cf85689db1d583cJoe Perches			return (NULL);
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
207475be4d85a274d0961593db41cf85689db1d583cJoe Perches	*code = i++;
2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
209475be4d85a274d0961593db41cf85689db1d583cJoe Perches	if ((File[i] & 0xF0) != 0x20)
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		DBG_FTL(("FPGA download: data header corrupted"))
212475be4d85a274d0961593db41cf85689db1d583cJoe Perches			xdiFreeFile(File);
213475be4d85a274d0961593db41cf85689db1d583cJoe Perches		return (NULL);
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
215475be4d85a274d0961593db41cf85689db1d583cJoe Perches	fpgaFlen = (dword)File[FPGA_NAME_OFFSET - 1];
216475be4d85a274d0961593db41cf85689db1d583cJoe Perches	if (fpgaFlen == 0)
217475be4d85a274d0961593db41cf85689db1d583cJoe Perches		fpgaFlen = 12;
218475be4d85a274d0961593db41cf85689db1d583cJoe Perches	fpgaFile = (char *)&File[FPGA_NAME_OFFSET];
219475be4d85a274d0961593db41cf85689db1d583cJoe Perches	fpgaTlen = (dword)fpgaFile[fpgaFlen + 2];
220475be4d85a274d0961593db41cf85689db1d583cJoe Perches	if (fpgaTlen == 0)
221475be4d85a274d0961593db41cf85689db1d583cJoe Perches		fpgaTlen = 10;
222475be4d85a274d0961593db41cf85689db1d583cJoe Perches	fpgaType = (char *)&fpgaFile[fpgaFlen + 3];
223475be4d85a274d0961593db41cf85689db1d583cJoe Perches	fpgaDlen = (dword)  fpgaType[fpgaTlen + 2];
224475be4d85a274d0961593db41cf85689db1d583cJoe Perches	if (fpgaDlen == 0)
225475be4d85a274d0961593db41cf85689db1d583cJoe Perches		fpgaDlen = 11;
226475be4d85a274d0961593db41cf85689db1d583cJoe Perches	fpgaDate = (char *)&fpgaType[fpgaTlen + 3];
227475be4d85a274d0961593db41cf85689db1d583cJoe Perches	fpgaTime = (char *)&fpgaDate[fpgaDlen + 3];
228475be4d85a274d0961593db41cf85689db1d583cJoe Perches	cnt = (dword)(((File[i] & 0x0F) << 20) + (File[i + 1] << 12)
229475be4d85a274d0961593db41cf85689db1d583cJoe Perches		      + (File[i + 2] << 4) + (File[i + 3] >> 4));
230475be4d85a274d0961593db41cf85689db1d583cJoe Perches
231475be4d85a274d0961593db41cf85689db1d583cJoe Perches	if ((dword)(i + (cnt / 8)) > *Length)
2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		DBG_FTL(("FPGA download: '%s' file too small (%ld < %ld)",
234475be4d85a274d0961593db41cf85689db1d583cJoe Perches			 FileName, *Length, code + ((cnt + 7) / 8)))
235475be4d85a274d0961593db41cf85689db1d583cJoe Perches			xdiFreeFile(File);
236475be4d85a274d0961593db41cf85689db1d583cJoe Perches		return (NULL);
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
238475be4d85a274d0961593db41cf85689db1d583cJoe Perches	i = 0;
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	do
2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
241475be4d85a274d0961593db41cf85689db1d583cJoe Perches		while ((fpgaDate[i] != '\0')
242475be4d85a274d0961593db41cf85689db1d583cJoe Perches		       && ((fpgaDate[i] < '0') || (fpgaDate[i] > '9')))
2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{
2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			i++;
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
246475be4d85a274d0961593db41cf85689db1d583cJoe Perches		year = 0;
247475be4d85a274d0961593db41cf85689db1d583cJoe Perches		while ((fpgaDate[i] >= '0') && (fpgaDate[i] <= '9'))
248475be4d85a274d0961593db41cf85689db1d583cJoe Perches			year = year * 10 + (fpgaDate[i++] - '0');
249475be4d85a274d0961593db41cf85689db1d583cJoe Perches	} while ((year < 2000) && (fpgaDate[i] != '\0'));
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (IoAdapter->cardType) {
252475be4d85a274d0961593db41cf85689db1d583cJoe Perches	case CARDTYPE_DIVASRV_B_2F_PCI:
253475be4d85a274d0961593db41cf85689db1d583cJoe Perches		break;
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
255475be4d85a274d0961593db41cf85689db1d583cJoe Perches	default:
256475be4d85a274d0961593db41cf85689db1d583cJoe Perches		if (year >= 2001) {
257475be4d85a274d0961593db41cf85689db1d583cJoe Perches			IoAdapter->fpga_features |= PCINIT_FPGA_PLX_ACCESS_SUPPORTED;
258475be4d85a274d0961593db41cf85689db1d583cJoe Perches		}
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DBG_LOG(("FPGA[%s] file %s (%s %s) len %d",
262475be4d85a274d0961593db41cf85689db1d583cJoe Perches		 fpgaType, fpgaFile, fpgaDate, fpgaTime, cnt))
263475be4d85a274d0961593db41cf85689db1d583cJoe Perches		return (File);
2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************/
2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FPGA_PROG   0x0001		/* PROG enable low */
2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FPGA_BUSY   0x0002		/* BUSY high, DONE low */
2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	FPGA_CS     0x000C		/* Enable I/O pins */
2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FPGA_CCLK   0x0100
2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FPGA_DOUT   0x0400
2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FPGA_DIN    FPGA_DOUT   /* bidirectional I/O */
2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
275475be4d85a274d0961593db41cf85689db1d583cJoe Perchesint qBri_FPGA_download(PISDN_ADAPTER IoAdapter) {
276475be4d85a274d0961593db41cf85689db1d583cJoe Perches	int            bit;
277475be4d85a274d0961593db41cf85689db1d583cJoe Perches	byte           *File;
278475be4d85a274d0961593db41cf85689db1d583cJoe Perches	dword          code, FileLength;
2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	word volatile __iomem *addr = (word volatile __iomem *)DIVA_OS_MEM_ATTACH_PROM(IoAdapter);
280475be4d85a274d0961593db41cf85689db1d583cJoe Perches	word           val, baseval = FPGA_CS | FPGA_PROG;
2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (DIVA_4BRI_REVISION(IoAdapter))
2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
286475be4d85a274d0961593db41cf85689db1d583cJoe Perches		char *name;
2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (IoAdapter->cardType) {
289475be4d85a274d0961593db41cf85689db1d583cJoe Perches		case CARDTYPE_DIVASRV_B_2F_PCI:
290475be4d85a274d0961593db41cf85689db1d583cJoe Perches			name = "dsbri2f.bit";
291475be4d85a274d0961593db41cf85689db1d583cJoe Perches			break;
2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
293475be4d85a274d0961593db41cf85689db1d583cJoe Perches		case CARDTYPE_DIVASRV_B_2M_V2_PCI:
294475be4d85a274d0961593db41cf85689db1d583cJoe Perches		case CARDTYPE_DIVASRV_VOICE_B_2M_V2_PCI:
295475be4d85a274d0961593db41cf85689db1d583cJoe Perches			name = "dsbri2m.bit";
296475be4d85a274d0961593db41cf85689db1d583cJoe Perches			break;
2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
298475be4d85a274d0961593db41cf85689db1d583cJoe Perches		default:
299475be4d85a274d0961593db41cf85689db1d583cJoe Perches			name = "ds4bri2.bit";
3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
302475be4d85a274d0961593db41cf85689db1d583cJoe Perches		File = qBri_check_FPGAsrc(IoAdapter, name,
303475be4d85a274d0961593db41cf85689db1d583cJoe Perches					  &FileLength, &code);
3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	else
3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
307475be4d85a274d0961593db41cf85689db1d583cJoe Perches		File = qBri_check_FPGAsrc(IoAdapter, "ds4bri.bit",
308475be4d85a274d0961593db41cf85689db1d583cJoe Perches					  &FileLength, &code);
3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
310475be4d85a274d0961593db41cf85689db1d583cJoe Perches	if (!File) {
3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		DIVA_OS_MEM_DETACH_PROM(IoAdapter, addr);
312475be4d85a274d0961593db41cf85689db1d583cJoe Perches		return (0);
3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	prepare download, pulse PROGRAM pin down.
3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
317475be4d85a274d0961593db41cf85689db1d583cJoe Perches	WRITE_WORD(addr, baseval & ~FPGA_PROG); /* PROGRAM low pulse */
318475be4d85a274d0961593db41cf85689db1d583cJoe Perches	WRITE_WORD(addr, baseval);              /* release */
319475be4d85a274d0961593db41cf85689db1d583cJoe Perches	diva_os_wait(50);  /* wait until FPGA finished internal memory clear */
3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	check done pin, must be low
3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
323475be4d85a274d0961593db41cf85689db1d583cJoe Perches	if (READ_WORD(addr) & FPGA_BUSY)
3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		DBG_FTL(("FPGA download: acknowledge for FPGA memory clear missing"))
326475be4d85a274d0961593db41cf85689db1d583cJoe Perches			xdiFreeFile(File);
3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		DIVA_OS_MEM_DETACH_PROM(IoAdapter, addr);
328475be4d85a274d0961593db41cf85689db1d583cJoe Perches		return (0);
3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	put data onto the FPGA
3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
333475be4d85a274d0961593db41cf85689db1d583cJoe Perches	while (code < FileLength)
3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
335475be4d85a274d0961593db41cf85689db1d583cJoe Perches		val = ((word)File[code++]) << 3;
3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
337475be4d85a274d0961593db41cf85689db1d583cJoe Perches		for (bit = 8; bit-- > 0; val <<= 1) /* put byte onto FPGA */
3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{
339475be4d85a274d0961593db41cf85689db1d583cJoe Perches			baseval &= ~FPGA_DOUT;             /* clr  data bit */
340475be4d85a274d0961593db41cf85689db1d583cJoe Perches			baseval |= (val & FPGA_DOUT);      /* copy data bit */
341475be4d85a274d0961593db41cf85689db1d583cJoe Perches			WRITE_WORD(addr, baseval);
342475be4d85a274d0961593db41cf85689db1d583cJoe Perches			WRITE_WORD(addr, baseval | FPGA_CCLK);     /* set CCLK hi */
343475be4d85a274d0961593db41cf85689db1d583cJoe Perches			WRITE_WORD(addr, baseval | FPGA_CCLK);     /* set CCLK hi */
344475be4d85a274d0961593db41cf85689db1d583cJoe Perches			WRITE_WORD(addr, baseval);                 /* set CCLK lo */
3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
347475be4d85a274d0961593db41cf85689db1d583cJoe Perches	xdiFreeFile(File);
348475be4d85a274d0961593db41cf85689db1d583cJoe Perches	diva_os_wait(100);
349475be4d85a274d0961593db41cf85689db1d583cJoe Perches	val = READ_WORD(addr);
3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DIVA_OS_MEM_DETACH_PROM(IoAdapter, addr);
3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
353475be4d85a274d0961593db41cf85689db1d583cJoe Perches	if (!(val & FPGA_BUSY))
3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		DBG_FTL(("FPGA download: chip remains in busy state (0x%04x)", val))
356475be4d85a274d0961593db41cf85689db1d583cJoe Perches			return (0);
3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
359475be4d85a274d0961593db41cf85689db1d583cJoe Perches	return (1);
3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
362475be4d85a274d0961593db41cf85689db1d583cJoe Perchesstatic int load_qBri_hardware(PISDN_ADAPTER IoAdapter) {
3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return (0);
3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* --------------------------------------------------------------------------
367475be4d85a274d0961593db41cf85689db1d583cJoe Perches   Card ISR
368475be4d85a274d0961593db41cf85689db1d583cJoe Perches   -------------------------------------------------------------------------- */
369475be4d85a274d0961593db41cf85689db1d583cJoe Perchesstatic int qBri_ISR(struct _ISDN_ADAPTER *IoAdapter) {
370475be4d85a274d0961593db41cf85689db1d583cJoe Perches	dword volatile     __iomem *qBriIrq;
3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
372475be4d85a274d0961593db41cf85689db1d583cJoe Perches	PADAPTER_LIST_ENTRY QuadroList = IoAdapter->QuadroList;
3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
374475be4d85a274d0961593db41cf85689db1d583cJoe Perches	word			i;
375475be4d85a274d0961593db41cf85689db1d583cJoe Perches	int			serviced = 0;
3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	byte __iomem *p;
3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	p = DIVA_OS_MEM_ATTACH_RESET(IoAdapter);
3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
380475be4d85a274d0961593db41cf85689db1d583cJoe Perches	if (!(READ_BYTE(&p[PLX9054_INTCSR]) & 0x80)) {
3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		DIVA_OS_MEM_DETACH_RESET(IoAdapter, p);
382475be4d85a274d0961593db41cf85689db1d583cJoe Perches		return (0);
3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DIVA_OS_MEM_DETACH_RESET(IoAdapter, p);
3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	clear interrupt line (reset Local Interrupt Test Register)
3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);
3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	qBriIrq = (dword volatile __iomem *)(&p[DIVA_4BRI_REVISION(IoAdapter) ? (MQ2_BREG_IRQ_TEST)  : (MQ_BREG_IRQ_TEST)]);
391475be4d85a274d0961593db41cf85689db1d583cJoe Perches	WRITE_DWORD(qBriIrq, MQ_IRQ_REQ_OFF);
3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);
3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
394475be4d85a274d0961593db41cf85689db1d583cJoe Perches	for (i = 0; i < IoAdapter->tasks; ++i)
3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
396475be4d85a274d0961593db41cf85689db1d583cJoe Perches		IoAdapter = QuadroList->QuadroAdapter[i];
3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
398475be4d85a274d0961593db41cf85689db1d583cJoe Perches		if (IoAdapter && IoAdapter->Initialized
399475be4d85a274d0961593db41cf85689db1d583cJoe Perches		    && IoAdapter->tst_irq(&IoAdapter->a))
4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{
401475be4d85a274d0961593db41cf85689db1d583cJoe Perches			IoAdapter->IrqCount++;
402475be4d85a274d0961593db41cf85689db1d583cJoe Perches			serviced = 1;
403475be4d85a274d0961593db41cf85689db1d583cJoe Perches			diva_os_schedule_soft_isr(&IoAdapter->isr_soft_isr);
4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
407475be4d85a274d0961593db41cf85689db1d583cJoe Perches	return (serviced);
4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* --------------------------------------------------------------------------
411475be4d85a274d0961593db41cf85689db1d583cJoe Perches   Does disable the interrupt on the card
412475be4d85a274d0961593db41cf85689db1d583cJoe Perches   -------------------------------------------------------------------------- */
413475be4d85a274d0961593db41cf85689db1d583cJoe Perchesstatic void disable_qBri_interrupt(PISDN_ADAPTER IoAdapter) {
414475be4d85a274d0961593db41cf85689db1d583cJoe Perches	dword volatile __iomem *qBriIrq;
4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	byte __iomem *p;
4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
417475be4d85a274d0961593db41cf85689db1d583cJoe Perches	if (IoAdapter->ControllerNumber > 0)
418475be4d85a274d0961593db41cf85689db1d583cJoe Perches		return;
4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	clear interrupt line (reset Local Interrupt Test Register)
4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	p = DIVA_OS_MEM_ATTACH_RESET(IoAdapter);
4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	WRITE_BYTE(&p[PLX9054_INTCSR], 0x00);	/* disable PCI interrupts */
4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DIVA_OS_MEM_DETACH_RESET(IoAdapter, p);
4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);
4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	qBriIrq = (dword volatile __iomem *)(&p[DIVA_4BRI_REVISION(IoAdapter) ? (MQ2_BREG_IRQ_TEST)  : (MQ_BREG_IRQ_TEST)]);
428475be4d85a274d0961593db41cf85689db1d583cJoe Perches	WRITE_DWORD(qBriIrq, MQ_IRQ_REQ_OFF);
4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);
4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* --------------------------------------------------------------------------
433475be4d85a274d0961593db41cf85689db1d583cJoe Perches   Install Adapter Entry Points
434475be4d85a274d0961593db41cf85689db1d583cJoe Perches   -------------------------------------------------------------------------- */
435475be4d85a274d0961593db41cf85689db1d583cJoe Perchesstatic void set_common_qBri_functions(PISDN_ADAPTER IoAdapter) {
4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ADAPTER *a;
4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
438475be4d85a274d0961593db41cf85689db1d583cJoe Perches	a = &IoAdapter->a;
4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
440475be4d85a274d0961593db41cf85689db1d583cJoe Perches	a->ram_in           = mem_in;
441475be4d85a274d0961593db41cf85689db1d583cJoe Perches	a->ram_inw          = mem_inw;
442475be4d85a274d0961593db41cf85689db1d583cJoe Perches	a->ram_in_buffer    = mem_in_buffer;
443475be4d85a274d0961593db41cf85689db1d583cJoe Perches	a->ram_look_ahead   = mem_look_ahead;
444475be4d85a274d0961593db41cf85689db1d583cJoe Perches	a->ram_out          = mem_out;
445475be4d85a274d0961593db41cf85689db1d583cJoe Perches	a->ram_outw         = mem_outw;
446475be4d85a274d0961593db41cf85689db1d583cJoe Perches	a->ram_out_buffer   = mem_out_buffer;
447475be4d85a274d0961593db41cf85689db1d583cJoe Perches	a->ram_inc          = mem_inc;
4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
449475be4d85a274d0961593db41cf85689db1d583cJoe Perches	IoAdapter->out = pr_out;
450475be4d85a274d0961593db41cf85689db1d583cJoe Perches	IoAdapter->dpc = pr_dpc;
451475be4d85a274d0961593db41cf85689db1d583cJoe Perches	IoAdapter->tst_irq = scom_test_int;
452475be4d85a274d0961593db41cf85689db1d583cJoe Perches	IoAdapter->clr_irq  = scom_clear_int;
453475be4d85a274d0961593db41cf85689db1d583cJoe Perches	IoAdapter->pcm  = (struct pc_maint *)MIPS_MAINT_OFFS;
4541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
455475be4d85a274d0961593db41cf85689db1d583cJoe Perches	IoAdapter->load = load_qBri_hardware;
4561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
457475be4d85a274d0961593db41cf85689db1d583cJoe Perches	IoAdapter->disIrq = disable_qBri_interrupt;
458475be4d85a274d0961593db41cf85689db1d583cJoe Perches	IoAdapter->rstFnc = reset_qBri_hardware;
459475be4d85a274d0961593db41cf85689db1d583cJoe Perches	IoAdapter->stop = stop_qBri_hardware;
460475be4d85a274d0961593db41cf85689db1d583cJoe Perches	IoAdapter->trapFnc = qBri_cpu_trapped;
4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IoAdapter->diva_isr_handler = qBri_ISR;
4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
464475be4d85a274d0961593db41cf85689db1d583cJoe Perches	IoAdapter->a.io = (void *)IoAdapter;
4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
467475be4d85a274d0961593db41cf85689db1d583cJoe Perchesstatic void set_qBri_functions(PISDN_ADAPTER IoAdapter) {
4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!IoAdapter->tasks) {
4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		IoAdapter->tasks = MQ_INSTANCE_COUNT;
4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
471475be4d85a274d0961593db41cf85689db1d583cJoe Perches	IoAdapter->MemorySize = MQ_MEMORY_SIZE;
472475be4d85a274d0961593db41cf85689db1d583cJoe Perches	set_common_qBri_functions(IoAdapter);
473475be4d85a274d0961593db41cf85689db1d583cJoe Perches	diva_os_set_qBri_functions(IoAdapter);
4741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
476475be4d85a274d0961593db41cf85689db1d583cJoe Perchesstatic void set_qBri2_functions(PISDN_ADAPTER IoAdapter) {
4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!IoAdapter->tasks) {
4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		IoAdapter->tasks = MQ_INSTANCE_COUNT;
4791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
4801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IoAdapter->MemorySize = (IoAdapter->tasks == 1) ? BRI2_MEMORY_SIZE : MQ2_MEMORY_SIZE;
481475be4d85a274d0961593db41cf85689db1d583cJoe Perches	set_common_qBri_functions(IoAdapter);
482475be4d85a274d0961593db41cf85689db1d583cJoe Perches	diva_os_set_qBri2_functions(IoAdapter);
4831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************/
4861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
487475be4d85a274d0961593db41cf85689db1d583cJoe Perchesvoid prepare_qBri_functions(PISDN_ADAPTER IoAdapter) {
4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
489475be4d85a274d0961593db41cf85689db1d583cJoe Perches	set_qBri_functions(IoAdapter->QuadroList->QuadroAdapter[0]);
490475be4d85a274d0961593db41cf85689db1d583cJoe Perches	set_qBri_functions(IoAdapter->QuadroList->QuadroAdapter[1]);
491475be4d85a274d0961593db41cf85689db1d583cJoe Perches	set_qBri_functions(IoAdapter->QuadroList->QuadroAdapter[2]);
492475be4d85a274d0961593db41cf85689db1d583cJoe Perches	set_qBri_functions(IoAdapter->QuadroList->QuadroAdapter[3]);
4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
496475be4d85a274d0961593db41cf85689db1d583cJoe Perchesvoid prepare_qBri2_functions(PISDN_ADAPTER IoAdapter) {
4971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!IoAdapter->tasks) {
4981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		IoAdapter->tasks = MQ_INSTANCE_COUNT;
4991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
5001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
501475be4d85a274d0961593db41cf85689db1d583cJoe Perches	set_qBri2_functions(IoAdapter->QuadroList->QuadroAdapter[0]);
5021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (IoAdapter->tasks > 1) {
503475be4d85a274d0961593db41cf85689db1d583cJoe Perches		set_qBri2_functions(IoAdapter->QuadroList->QuadroAdapter[1]);
504475be4d85a274d0961593db41cf85689db1d583cJoe Perches		set_qBri2_functions(IoAdapter->QuadroList->QuadroAdapter[2]);
505475be4d85a274d0961593db41cf85689db1d583cJoe Perches		set_qBri2_functions(IoAdapter->QuadroList->QuadroAdapter[3]);
5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* -------------------------------------------------------------------------- */
511