1/* $Id: shmem.c,v 1.1.1.1 2007/08/03 18:52:36 Exp $ 2 * 3 * Copyright (C) 1996 SpellCaster Telecommunications Inc. 4 * 5 * Card functions implementing ISDN4Linux functionality 6 * 7 * This software may be used and distributed according to the terms 8 * of the GNU General Public License, incorporated herein by reference. 9 * 10 * For more information, please contact gpl-info@spellcast.com or write: 11 * 12 * SpellCaster Telecommunications Inc. 13 * 5621 Finch Avenue East, Unit #3 14 * Scarborough, Ontario Canada 15 * M1B 2T9 16 * +1 (416) 297-8565 17 * +1 (416) 297-6433 Facsimile 18 */ 19 20#include "includes.h" /* This must be first */ 21#include "hardware.h" 22#include "card.h" 23 24/* 25 * 26 */ 27void memcpy_toshmem(int card, void *dest, const void *src, size_t n) 28{ 29 unsigned long flags; 30 unsigned char ch; 31 32 if(!IS_VALID_CARD(card)) { 33 pr_debug("Invalid param: %d is not a valid card id\n", card); 34 return; 35 } 36 37 if(n > SRAM_PAGESIZE) { 38 return; 39 } 40 41 /* 42 * determine the page to load from the address 43 */ 44 ch = (unsigned long) dest / SRAM_PAGESIZE; 45 pr_debug("%s: loaded page %d\n", sc_adapter[card]->devicename,ch); 46 /* 47 * Block interrupts and load the page 48 */ 49 spin_lock_irqsave(&sc_adapter[card]->lock, flags); 50 51 outb(((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80, 52 sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport]); 53 memcpy_toio(sc_adapter[card]->rambase + 54 ((unsigned long) dest % 0x4000), src, n); 55 spin_unlock_irqrestore(&sc_adapter[card]->lock, flags); 56 pr_debug("%s: set page to %#x\n",sc_adapter[card]->devicename, 57 ((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE)>>14)|0x80); 58 pr_debug("%s: copying %d bytes from %#lx to %#lx\n", 59 sc_adapter[card]->devicename, n, 60 (unsigned long) src, 61 sc_adapter[card]->rambase + ((unsigned long) dest %0x4000)); 62} 63 64/* 65 * Reverse of above 66 */ 67void memcpy_fromshmem(int card, void *dest, const void *src, size_t n) 68{ 69 unsigned long flags; 70 unsigned char ch; 71 72 if(!IS_VALID_CARD(card)) { 73 pr_debug("Invalid param: %d is not a valid card id\n", card); 74 return; 75 } 76 77 if(n > SRAM_PAGESIZE) { 78 return; 79 } 80 81 /* 82 * determine the page to load from the address 83 */ 84 ch = (unsigned long) src / SRAM_PAGESIZE; 85 pr_debug("%s: loaded page %d\n", sc_adapter[card]->devicename,ch); 86 87 88 /* 89 * Block interrupts and load the page 90 */ 91 spin_lock_irqsave(&sc_adapter[card]->lock, flags); 92 93 outb(((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80, 94 sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport]); 95 memcpy_fromio(dest,(void *)(sc_adapter[card]->rambase + 96 ((unsigned long) src % 0x4000)), n); 97 spin_unlock_irqrestore(&sc_adapter[card]->lock, flags); 98 pr_debug("%s: set page to %#x\n",sc_adapter[card]->devicename, 99 ((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE)>>14)|0x80); 100/* pr_debug("%s: copying %d bytes from %#x to %#x\n", 101 sc_adapter[card]->devicename, n, 102 sc_adapter[card]->rambase + ((unsigned long) src %0x4000), (unsigned long) dest); */ 103} 104