Pull bugzilla-7200 into release branch
[linux-2.6] / drivers / isdn / sc / shmem.c
1 /* $Id: shmem.c,v 1.2.10.1 2001/09/23 22:24:59 kai 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  */
27 void 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  */
67 void 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
105 #if 0
106 void memset_shmem(int card, void *dest, int c, size_t n)
107 {
108         unsigned long flags;
109         unsigned char ch;
110
111         if(!IS_VALID_CARD(card)) {
112                 pr_debug("Invalid param: %d is not a valid card id\n", card);
113                 return;
114         }
115
116         if(n > SRAM_PAGESIZE) {
117                 return;
118         }
119
120         /*
121          * determine the page to load from the address
122          */
123         ch = (unsigned long) dest / SRAM_PAGESIZE;
124         pr_debug("%s: loaded page %d\n",sc_adapter[card]->devicename,ch);
125
126         /*
127          * Block interrupts and load the page
128          */
129         spin_lock_irqsave(&sc_adapter[card]->lock, flags);
130
131         outb(((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80,
132                 sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport]);
133         memset_io(sc_adapter[card]->rambase +
134                 ((unsigned long) dest % 0x4000), c, n);
135         pr_debug("%s: set page to %#x\n",sc_adapter[card]->devicename,
136                 ((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE)>>14)|0x80);
137         spin_unlock_irqrestore(&sc_adapter[card]->lock, flags);
138 }
139 #endif  /*  0  */