X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fisdn%2Fhardware%2Feicon%2Fs_bri.c;h=5c87552e8c08dd51caaf5f84a82d3545b0e4e945;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=7b5495f46700bf2b28ec8190155d400cd0ccf2da;hpb=87fc8d1bb10cd459024a742c6a10961fefcef18f;p=linux-2.6.git diff --git a/drivers/isdn/hardware/eicon/s_bri.c b/drivers/isdn/hardware/eicon/s_bri.c index 7b5495f46..5c87552e8 100644 --- a/drivers/isdn/hardware/eicon/s_bri.c +++ b/drivers/isdn/hardware/eicon/s_bri.c @@ -41,11 +41,11 @@ Investigate card state, recovery trace buffer -------------------------------------------------------------------------- */ static void bri_cpu_trapped (PISDN_ADAPTER IoAdapter) { - byte *addrHi, *addrLo, *ioaddr ; + byte __iomem *addrHi, *addrLo, *ioaddr ; word *Xlog ; dword regs[4], i, size ; Xdesc xlogDesc ; - byte *Port; + byte __iomem *Port; /* * first read pointers and trap frame */ @@ -61,15 +61,15 @@ static void bri_cpu_trapped (PISDN_ADAPTER IoAdapter) { /* * check for trapped MIPS 3xxx CPU, dump only exception frame */ - if ( READ_DWORD(&Xlog[0x80 / sizeof(Xlog[0])]) == 0x99999999 ) + if ( GET_DWORD(&Xlog[0x80 / sizeof(Xlog[0])]) == 0x99999999 ) { dump_trap_frame (IoAdapter, &((byte *)Xlog)[0x90]) ; IoAdapter->trapped = 1 ; } - regs[0] = READ_DWORD(&((byte *)Xlog)[0x70]); - regs[1] = READ_DWORD(&((byte *)Xlog)[0x74]); - regs[2] = READ_DWORD(&((byte *)Xlog)[0x78]); - regs[3] = READ_DWORD(&((byte *)Xlog)[0x7c]); + regs[0] = GET_DWORD(&((byte *)Xlog)[0x70]); + regs[1] = GET_DWORD(&((byte *)Xlog)[0x74]); + regs[2] = GET_DWORD(&((byte *)Xlog)[0x78]); + regs[3] = GET_DWORD(&((byte *)Xlog)[0x7c]); outpp (addrHi, (regs[1] >> 16) & 0x7F) ; outppw (addrLo, regs[1] & 0xFFFF) ; xlogDesc.cnt = inppw(ioaddr) ; @@ -102,7 +102,7 @@ static void bri_cpu_trapped (PISDN_ADAPTER IoAdapter) { Reset hardware --------------------------------------------------------------------- */ static void reset_bri_hardware (PISDN_ADAPTER IoAdapter) { - byte *p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter); + byte __iomem *p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter); outpp (p, 0x00) ; DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p); } @@ -110,7 +110,7 @@ static void reset_bri_hardware (PISDN_ADAPTER IoAdapter) { Halt system --------------------------------------------------------------------- */ static void stop_bri_hardware (PISDN_ADAPTER IoAdapter) { - byte *p = DIVA_OS_MEM_ATTACH_RESET(IoAdapter); + byte __iomem *p = DIVA_OS_MEM_ATTACH_RESET(IoAdapter); if (p) { outpp (p, 0x00) ; /* disable interrupts ! */ } @@ -119,359 +119,12 @@ static void stop_bri_hardware (PISDN_ADAPTER IoAdapter) { outpp (p, 0x00) ; /* clear int, halt cpu */ DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p); } -#if !defined(DIVA_USER_MODE_CARD_CONFIG) /* { */ -/* --------------------------------------------------------------------- - Load protocol on the card - --------------------------------------------------------------------- */ -static dword bri_protocol_load (PISDN_ADAPTER IoAdapter) { - dword FileLength ; - word test, *File = NULL ; - byte* addrHi, *addrLo, *ioaddr ; - char *FileName = &IoAdapter->Protocol[0] ; - dword Addr, i ; - byte *Port; - /* ------------------------------------------------------------------- - Try to load protocol code. 'File' points to memory location - that does contain entire protocol code - ------------------------------------------------------------------- */ - if ( !(File = (word *)xdiLoadArchive (IoAdapter, &FileLength, 0)) ) - return (0) ; - /* ------------------------------------------------------------------- - Get protocol features and calculate load addresses - ------------------------------------------------------------------- */ - IoAdapter->features = diva_get_protocol_file_features ((byte*)File, - OFFS_PROTOCOL_ID_STRING, - IoAdapter->ProtocolIdString, - sizeof(IoAdapter->ProtocolIdString)); - IoAdapter->a.protocol_capabilities = IoAdapter->features ; - DBG_LOG(("Loading %s", IoAdapter->ProtocolIdString)) - Addr = ((dword)(((byte *) File)[OFFS_PROTOCOL_END_ADDR])) - | (((dword)(((byte *) File)[OFFS_PROTOCOL_END_ADDR + 1])) << 8) - | (((dword)(((byte *) File)[OFFS_PROTOCOL_END_ADDR + 2])) << 16) - | (((dword)(((byte *) File)[OFFS_PROTOCOL_END_ADDR + 3])) << 24) ; - if ( Addr != 0 ) - { - IoAdapter->DspCodeBaseAddr = (Addr + 3) & (~3) ; - IoAdapter->MaxDspCodeSize = (BRI_UNCACHED_ADDR (IoAdapter->MemoryBase + IoAdapter->MemorySize - - BRI_SHARED_RAM_SIZE) - - IoAdapter->DspCodeBaseAddr) & (IoAdapter->MemorySize - 1) ; - Addr = IoAdapter->DspCodeBaseAddr ; - ((byte *) File)[OFFS_DSP_CODE_BASE_ADDR] = (byte) Addr ; - ((byte *) File)[OFFS_DSP_CODE_BASE_ADDR + 1] = (byte)(Addr >> 8) ; - ((byte *) File)[OFFS_DSP_CODE_BASE_ADDR + 2] = (byte)(Addr >> 16) ; - ((byte *) File)[OFFS_DSP_CODE_BASE_ADDR + 3] = (byte)(Addr >> 24) ; - IoAdapter->InitialDspInfo = 0x80 ; - } - else - { - if ( IoAdapter->features & PROTCAP_V90D ) - IoAdapter->MaxDspCodeSize = BRI_V90D_MAX_DSP_CODE_SIZE ; - else - IoAdapter->MaxDspCodeSize = BRI_ORG_MAX_DSP_CODE_SIZE ; - IoAdapter->DspCodeBaseAddr = BRI_CACHED_ADDR (IoAdapter->MemoryBase + IoAdapter->MemorySize - - BRI_SHARED_RAM_SIZE - IoAdapter->MaxDspCodeSize); - IoAdapter->InitialDspInfo = (IoAdapter->MaxDspCodeSize - BRI_ORG_MAX_DSP_CODE_SIZE) >> 14 ; - } - DBG_LOG(("DSP code base 0x%08lx, max size 0x%08lx (%08lx,%02x)", - IoAdapter->DspCodeBaseAddr, IoAdapter->MaxDspCodeSize, - Addr, IoAdapter->InitialDspInfo)) - if ( FileLength > ((IoAdapter->DspCodeBaseAddr - - BRI_CACHED_ADDR (IoAdapter->MemoryBase)) & (IoAdapter->MemorySize - 1)) ) - { - xdiFreeFile (File); - DBG_FTL(("Protocol code '%s' too big (%ld)", FileName, FileLength)) - return (0) ; - } - Port = DIVA_OS_MEM_ATTACH_PORT(IoAdapter); - addrHi = Port + ((IoAdapter->Properties.Bus == BUS_PCI) ? M_PCI_ADDRH : ADDRH) ; - addrLo = Port + ADDR ; - ioaddr = Port + DATA ; -/* - * set start address for download (use autoincrement mode !) - */ - outpp (addrHi, 0) ; - outppw (addrLo, 0) ; - for ( i = 0 ; i < FileLength ; i += 2 ) - { - if ( (i & 0x0000FFFF) == 0 ) - { - outpp (addrHi, (byte)(i >> 16)) ; - } - outppw (ioaddr, File[i/2]) ; - } -/* - * memory test without second load of file - */ - outpp (addrHi, 0) ; - outppw (addrLo, 0) ; - for ( i = 0 ; i < FileLength ; i += 2 ) - { - if ( (i & 0x0000FFFF) == 0 ) - { - outpp (addrHi, (byte)(i >> 16)) ; - } - test = inppw (ioaddr) ; - if ( test != File[i/2] ) - { - DIVA_OS_MEM_DETACH_PORT(IoAdapter, Port); - DBG_FTL(("%s: Memory test failed! (%d - 0x%04X/0x%04X)", - IoAdapter->Properties.Name, i, test, File[i/2])) - xdiFreeFile (File); - return (0) ; - } - } - DIVA_OS_MEM_DETACH_PORT(IoAdapter, Port); - xdiFreeFile (File); - return (FileLength) ; -} -/******************************************************************************/ -typedef struct -{ - PISDN_ADAPTER IoAdapter ; - byte* AddrLo ; - byte* AddrHi ; - word* Data ; - dword DownloadPos ; -} bri_download_info ; -static long bri_download_buffer (OsFileHandle *fp, long length, void **addr) { - int buffer_size = 2048*sizeof(word); - word *buffer = (word*)diva_os_malloc (0, buffer_size); - bri_download_info *info ; - word test ; - long i, len, page ; - if (!buffer) { - DBG_ERR(("A: out of memory, s_bri at %d", __LINE__)) - return (-1); - } - info = (bri_download_info *)fp->sysLoadDesc ; - *addr = (void *)info->DownloadPos ; - if ( ((dword) length) > info->IoAdapter->DspCodeBaseAddr + - info->IoAdapter->MaxDspCodeSize - info->DownloadPos ) - { - DBG_FTL(("%s: out of card memory during DSP download (0x%X)", - info->IoAdapter->Properties.Name, - info->DownloadPos + length)) - diva_os_free (0, buffer); - return (-1) ; - } - for ( len = 0 ; length > 0 ; length -= len ) - { - len = (length > buffer_size ? buffer_size : length) ; - page = ((long)(info->DownloadPos) + len) & 0xFFFF0000 ; - if ( page != (long)(info->DownloadPos & 0xFFFF0000) ) - { - len = 0x00010000 - (((long)info->DownloadPos) & 0x0000FFFF) ; - } - if ( fp->sysFileRead (fp, &buffer[0], len) != len ) { - diva_os_free (0, buffer); - return (-1) ; - } - outpp (info->AddrHi, (byte)(info->DownloadPos >> 16)) ; - outppw (info->AddrLo, (word)info->DownloadPos) ; - outppw_buffer (info->Data, &buffer[0], (len + 1)) ; -/* - * memory test without second load of file - */ - outpp (info->AddrHi, (byte)(info->DownloadPos >> 16)) ; - outppw (info->AddrLo, (word)info->DownloadPos) ; - for ( i = 0 ; i < len ; i += 2 ) - { - if ( (test = inppw (info->Data)) != buffer[i/2] ) - { - DBG_FTL(("%s: Memory test failed! (0x%lX - 0x%04X/0x%04X)", - info->IoAdapter->Properties.Name, - info->DownloadPos + i, test, buffer[i/2])) - diva_os_free (0, buffer); - return (-2) ; - } - } - info->DownloadPos += len ; - } - info->DownloadPos = (info->DownloadPos + 3) & (~3) ; - diva_os_free (0, buffer); - return (0) ; -} -/******************************************************************************/ -static dword bri_telindus_load (PISDN_ADAPTER IoAdapter, char *DspTelindusFile) -{ - bri_download_info *pinfo =\ - (bri_download_info*)diva_os_malloc(0, sizeof(*pinfo)); - char *error ; - OsFileHandle *fp ; - t_dsp_portable_desc download_table[DSP_MAX_DOWNLOAD_COUNT] ; - word download_count ; - dword FileLength ; - byte *Port; - if (!pinfo) { - DBG_ERR (("A: out of memory s_bri at %d", __LINE__)) - return (0); - } - if (!(fp = OsOpenFile (DspTelindusFile))) { - diva_os_free (0, pinfo); - return (0) ; - } - FileLength = fp->sysFileSize ; - Port = DIVA_OS_MEM_ATTACH_PORT(IoAdapter); - pinfo->IoAdapter = IoAdapter ; - pinfo->AddrLo = Port + ADDR ; - pinfo->AddrHi = Port + (IoAdapter->Properties.Bus == BUS_PCI ? M_PCI_ADDRH : ADDRH); - pinfo->Data = (word*)(Port + DATA) ; - pinfo->DownloadPos = (IoAdapter->DspCodeBaseAddr +\ - sizeof(dword) + sizeof(download_table) + 3) & (~3) ; - fp->sysLoadDesc = (void *)pinfo; - fp->sysCardLoad = bri_download_buffer ; - download_count = DSP_MAX_DOWNLOAD_COUNT ; - memset (&download_table[0], '\0', sizeof(download_table)) ; -/* - * set start address for download (use autoincrement mode !) - */ - error = dsp_read_file (fp, (word)(IoAdapter->cardType), - &download_count, NULL, &download_table[0]) ; - if ( error ) - { - DIVA_OS_MEM_DETACH_PORT(IoAdapter, Port); - DBG_FTL(("download file error: %s", error)) - OsCloseFile (fp) ; - diva_os_free (0, pinfo); - return (0) ; - } - OsCloseFile (fp) ; -/* - * store # of separate download files extracted from archive - */ - pinfo->DownloadPos = IoAdapter->DspCodeBaseAddr ; - outpp (pinfo->AddrHi, (byte)(pinfo->DownloadPos >> 16)) ; - outppw (pinfo->AddrLo, (word)pinfo->DownloadPos) ; - outppw (pinfo->Data, (word)download_count) ; - outppw (pinfo->Data, (word)0) ; -/* - * copy download table to board - */ - outppw_buffer (pinfo->Data, &download_table[0], sizeof(download_table)) ; - DIVA_OS_MEM_DETACH_PORT(IoAdapter, Port); - diva_os_free (0, pinfo); - return (FileLength) ; -} -/******************************************************************************/ -static int load_bri_hardware (PISDN_ADAPTER IoAdapter) { - dword i ; - byte* addrHi, *addrLo, *ioaddr, *p ; - dword test ; - byte *Port; - if ( IoAdapter->Properties.Card != CARD_MAE ) - { - return (FALSE) ; - } - reset_bri_hardware (IoAdapter) ; - Port = DIVA_OS_MEM_ATTACH_PORT(IoAdapter); - addrHi = Port + ((IoAdapter->Properties.Bus==BUS_PCI) ? M_PCI_ADDRH : ADDRH); - addrLo = Port + ADDR ; - ioaddr = Port + DATA ; - diva_os_wait (100); -/* - * recover - */ - outpp (addrHi, (byte) 0) ; - outppw (addrLo, (word) 0) ; - outppw (ioaddr, (word) 0) ; -/* - * clear shared memory - */ - outpp (addrHi, (byte)((BRI_UNCACHED_ADDR (IoAdapter->MemoryBase + \ - IoAdapter->MemorySize - BRI_SHARED_RAM_SIZE)) >> 16)) ; - outppw (addrLo, 0) ; - for ( i = 0 ; i < 0x8000 ; outppw (ioaddr, 0), ++i ) ; - DIVA_OS_MEM_DETACH_PORT(IoAdapter, Port); - diva_os_wait (100) ; -/* - * download protocol and dsp files - */ - switch ( IoAdapter->protocol_id ) { - default: - if ( !xdiSetProtocol (IoAdapter, IoAdapter->ProtocolSuffix) ) - return (FALSE) ; - if ( !bri_protocol_load (IoAdapter) ) - return (FALSE) ; - if ( !bri_telindus_load (IoAdapter, DSP_TELINDUS_FILE) ) - return (FALSE) ; - break ; - case PROTTYPE_QSIG: - case PROTTYPE_CORNETN: - if ( !xdiSetProtocol (IoAdapter, IoAdapter->ProtocolSuffix) ) - return (FALSE) ; - if (IoAdapter->ProtocolSuffix && *IoAdapter->ProtocolSuffix) { - sprintf (&IoAdapter->Protocol[0], - "TE_QSIG.%s", IoAdapter->ProtocolSuffix) ; - } - DBG_TRC(("xdiSetProtocol: %s firmware '%s' archive '%s'", - IoAdapter->Properties.Name, - &IoAdapter->Protocol[0], &IoAdapter->Archive[0])) - if ( !bri_protocol_load (IoAdapter) ) - return (FALSE) ; - if ( !bri_telindus_load (IoAdapter, DSP_QSIG_TELINDUS_FILE) ) - return (FALSE) ; - break ; - } - - Port = DIVA_OS_MEM_ATTACH_PORT(IoAdapter); - addrHi = Port + ((IoAdapter->Properties.Bus==BUS_PCI) ? M_PCI_ADDRH : ADDRH); - addrLo = Port + ADDR ; - ioaddr = Port + DATA ; -/* - * clear signature - */ - outpp (addrHi, (byte)((BRI_UNCACHED_ADDR (IoAdapter->MemoryBase + \ - IoAdapter->MemorySize - BRI_SHARED_RAM_SIZE)) >> 16)) ; - outppw (addrLo, 0x1e) ; - outpp (ioaddr, 0) ; - outpp (ioaddr, 0) ; -/* - * copy parameters - */ - diva_configure_protocol (IoAdapter); - DIVA_OS_MEM_DETACH_PORT(IoAdapter, Port); -/* - * start the protocol code - */ - p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter); - outpp (p, 0x08) ; - DIVA_OS_MEM_DETACH_CTLREG(IoAdapter, p); -/* - * wait for signature (max. 3 seconds) - */ - Port = DIVA_OS_MEM_ATTACH_PORT(IoAdapter); - addrHi = Port + ((IoAdapter->Properties.Bus==BUS_PCI) ? M_PCI_ADDRH : ADDRH); - addrLo = Port + ADDR ; - ioaddr = Port + DATA ; - for ( i = 0 ; i < 300 ; ++i ) - { - diva_os_wait (10) ; - outpp (addrHi, (byte)((BRI_UNCACHED_ADDR (IoAdapter->MemoryBase + \ - IoAdapter->MemorySize - BRI_SHARED_RAM_SIZE)) >> 16)) ; - outppw (addrLo, 0x1e) ; - test = (dword)inppw (ioaddr) ; - if ( test == 0x4447 ) - { - DIVA_OS_MEM_DETACH_PORT(IoAdapter, Port); - DBG_TRC(("Protocol startup time %d.%02d seconds", - (i / 100), (i % 100) )) - return (TRUE) ; - } - } - DIVA_OS_MEM_DETACH_PORT(IoAdapter, Port); - DBG_FTL(("%s: Adapter selftest failed (0x%04X)!", - IoAdapter->Properties.Name, test)) - bri_cpu_trapped (IoAdapter) ; - return (FALSE) ; -} -#else /* } { */ static int load_bri_hardware (PISDN_ADAPTER IoAdapter) { return (0); } -#endif /* } */ /******************************************************************************/ static int bri_ISR (struct _ISDN_ADAPTER* IoAdapter) { - byte *p; + byte __iomem *p; p = DIVA_OS_MEM_ATTACH_CTLREG(IoAdapter); if ( !(inpp (p) & 0x01) ) { @@ -493,7 +146,7 @@ static int bri_ISR (struct _ISDN_ADAPTER* IoAdapter) { Disable IRQ in the card hardware -------------------------------------------------------------------------- */ static void disable_bri_interrupt (PISDN_ADAPTER IoAdapter) { - byte *p; + byte __iomem *p; p = DIVA_OS_MEM_ATTACH_RESET(IoAdapter); if ( p ) {