linux/drivers/isdn/hardware/eicon/s_bri.c
<<
>>
Prefs
   1
   2/*
   3 *
   4 Copyright (c) Eicon Networks, 2002.
   5 *
   6 This source file is supplied for the use with
   7 Eicon Networks range of DIVA Server Adapters.
   8 *
   9 Eicon File Revision :    2.1
  10 *
  11 This program is free software; you can redistribute it and/or modify
  12 it under the terms of the GNU General Public License as published by
  13 the Free Software Foundation; either version 2, or (at your option)
  14 any later version.
  15 *
  16 This program is distributed in the hope that it will be useful,
  17 but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
  18 implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  19 See the GNU General Public License for more details.
  20 *
  21 You should have received a copy of the GNU General Public License
  22 along with this program; if not, write to the Free Software
  23 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  24 *
  25 */
  26#include "platform.h"
  27#include "di_defs.h"
  28#include "pc.h"
  29#include "pr_pc.h"
  30#include "di.h"
  31#include "mi_pc.h"
  32#include "pc_maint.h"
  33#include "divasync.h"
  34#include "io.h"
  35#include "helpers.h"
  36#include "dsrv_bri.h"
  37#include "dsp_defs.h"
  38/*****************************************************************************/
  39#define MAX_XLOG_SIZE (64 * 1024)
  40/* --------------------------------------------------------------------------
  41   Investigate card state, recovery trace buffer
  42   -------------------------------------------------------------------------- */
  43static void bri_cpu_trapped(PISDN_ADAPTER IoAdapter) {
  44        byte  __iomem *addrHi, *addrLo, *ioaddr;
  45        word *Xlog;
  46        dword   regs[4], i, size;
  47        Xdesc   xlogDesc;
  48        byte __iomem *Port;
  49/*
  50 * first read pointers and trap frame
  51 */
  52        if (!(Xlog = (word *)diva_os_malloc(0, MAX_XLOG_SIZE)))
  53                return;
  54        Port = DIVA_OS_MEM_ATTACH_PORT(IoAdapter);
  55        addrHi = Port + ((IoAdapter->Properties.Bus == BUS_PCI) ? M_PCI_ADDRH : ADDRH);
  56        addrLo = Port + ADDR;
  57        ioaddr = Port + DATA;
  58        outpp(addrHi,  0);
  59        outppw(addrLo, 0);
  60        for (i = 0; i < 0x100; Xlog[i++] = inppw(ioaddr));
  61/*
  62 * check for trapped MIPS 3xxx CPU, dump only exception frame
  63 */
  64        if (GET_DWORD(&Xlog[0x80 / sizeof(Xlog[0])]) == 0x99999999)
  65        {
  66                dump_trap_frame(IoAdapter, &((byte *)Xlog)[0x90]);
  67                IoAdapter->trapped = 1;
  68        }
  69        regs[0] = GET_DWORD(&((byte *)Xlog)[0x70]);
  70        regs[1] = GET_DWORD(&((byte *)Xlog)[0x74]);
  71        regs[2] = GET_DWORD(&((byte *)Xlog)[0x78]);
  72        regs[3] = GET_DWORD(&((byte *)Xlog)[0x7c]);
  73        outpp(addrHi, (regs[1] >> 16) & 0x7F);
  74        outppw(addrLo, regs[1] & 0xFFFF);
  75        xlogDesc.cnt = inppw(ioaddr);
  76        outpp(addrHi, (regs[2] >> 16) & 0x7F);
  77        outppw(addrLo, regs[2] & 0xFFFF);
  78        xlogDesc.out = inppw(ioaddr);
  79        xlogDesc.buf = Xlog;
  80        regs[0] &= IoAdapter->MemorySize - 1;
  81        if ((regs[0] < IoAdapter->MemorySize - 1))
  82        {
  83                size = IoAdapter->MemorySize - regs[0];
  84                if (size > MAX_XLOG_SIZE)
  85                        size = MAX_XLOG_SIZE;
  86                for (i = 0; i < (size / sizeof(*Xlog)); regs[0] += 2)
  87                {
  88                        outpp(addrHi, (regs[0] >> 16) & 0x7F);
  89                        outppw(addrLo, regs[0] & 0xFFFF);
  90                        Xlog[i++] = inppw(ioaddr);
  91                }
  92                dump_xlog_buffer(IoAdapter, &xlogDesc);
  93                diva_os_free(0, Xlog);
  94                IoAdapter->trapped = 2;
  95        }
  96        outpp(addrHi, (byte)((BRI_UNCACHED_ADDR(IoAdapter->MemoryBase + IoAdapter->MemorySize -
  97                                                BRI_SHARED_RAM_SIZE)) >> 16));
  98        outppw(addrLo, 0x00);
  99        DIVA_OS_MEM_DETACH_PORT(IoAdapter, Port);
 100}
 101/* ---------------------------------------------------------------------
 102   Reset hardware
 103   --------------------------------------------------------------------- */
 104static void reset_bri_hardware(PISDN_ADAPTER IoAdapter) {
 105        byte __iomem *p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);
 106        outpp(p, 0x00);
 107        DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);
 108}
 109/* ---------------------------------------------------------------------
 110   Halt system
 111   --------------------------------------------------------------------- */
 112static void stop_bri_hardware(PISDN_ADAPTER IoAdapter) {
 113        byte __iomem *p = DIVA_OS_MEM_ATTACH_RESET(IoAdapter);
 114        if (p) {
 115                outpp(p, 0x00); /* disable interrupts ! */
 116        }
 117        DIVA_OS_MEM_DETACH_RESET(IoAdapter, p);
 118        p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);
 119        outpp(p, 0x00);    /* clear int, halt cpu */
 120        DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);
 121}
 122static int load_bri_hardware(PISDN_ADAPTER IoAdapter) {
 123        return (0);
 124}
 125/******************************************************************************/
 126static int bri_ISR(struct _ISDN_ADAPTER *IoAdapter) {
 127        byte __iomem *p;
 128
 129        p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);
 130        if (!(inpp(p) & 0x01)) {
 131                DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);
 132                return (0);
 133        }
 134        /*
 135          clear interrupt line
 136        */
 137        outpp(p, 0x08);
 138        DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);
 139        IoAdapter->IrqCount++;
 140        if (IoAdapter->Initialized) {
 141                diva_os_schedule_soft_isr(&IoAdapter->isr_soft_isr);
 142        }
 143        return (1);
 144}
 145/* --------------------------------------------------------------------------
 146   Disable IRQ in the card hardware
 147   -------------------------------------------------------------------------- */
 148static void disable_bri_interrupt(PISDN_ADAPTER IoAdapter) {
 149        byte __iomem *p;
 150        p = DIVA_OS_MEM_ATTACH_RESET(IoAdapter);
 151        if (p)
 152        {
 153                outpp(p, 0x00); /* disable interrupts ! */
 154        }
 155        DIVA_OS_MEM_DETACH_RESET(IoAdapter, p);
 156        p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter);
 157        outpp(p, 0x00); /* clear int, halt cpu */
 158        DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p);
 159}
 160/* -------------------------------------------------------------------------
 161   Fill card entry points
 162   ------------------------------------------------------------------------- */
 163void prepare_maestra_functions(PISDN_ADAPTER IoAdapter) {
 164        ADAPTER *a = &IoAdapter->a;
 165        a->ram_in             = io_in;
 166        a->ram_inw            = io_inw;
 167        a->ram_in_buffer      = io_in_buffer;
 168        a->ram_look_ahead     = io_look_ahead;
 169        a->ram_out            = io_out;
 170        a->ram_outw           = io_outw;
 171        a->ram_out_buffer     = io_out_buffer;
 172        a->ram_inc            = io_inc;
 173        IoAdapter->MemoryBase = BRI_MEMORY_BASE;
 174        IoAdapter->MemorySize = BRI_MEMORY_SIZE;
 175        IoAdapter->out        = pr_out;
 176        IoAdapter->dpc        = pr_dpc;
 177        IoAdapter->tst_irq    = scom_test_int;
 178        IoAdapter->clr_irq    = scom_clear_int;
 179        IoAdapter->pcm        = (struct pc_maint *)MIPS_MAINT_OFFS;
 180        IoAdapter->load       = load_bri_hardware;
 181        IoAdapter->disIrq     = disable_bri_interrupt;
 182        IoAdapter->rstFnc     = reset_bri_hardware;
 183        IoAdapter->stop       = stop_bri_hardware;
 184        IoAdapter->trapFnc    = bri_cpu_trapped;
 185        IoAdapter->diva_isr_handler = bri_ISR;
 186        /*
 187          Prepare OS dependent functions
 188        */
 189        diva_os_prepare_maestra_functions(IoAdapter);
 190}
 191/* -------------------------------------------------------------------------- */
 192