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