|
|
1.1 root 1: /*
2: * pcmcia card services glue code
3: *
4: * Copyright (C) 2006 Free Software Foundation, Inc.
5: * Written by Stefan Siegl <[email protected]>.
6: *
7: * This file is part of GNU Mach.
8: *
9: * This program is free software; you can redistribute it and/or modify
10: * it under the terms of the GNU General Public License as published by
11: * the Free Software Foundation; either version 2, or (at your option)
12: * any later version.
13: *
14: * This program is distributed in the hope that it will be useful,
15: * but WITHOUT ANY WARRANTY; without even the implied warranty of
16: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17: * GNU General Public License for more details.
18: *
19: * You should have received a copy of the GNU General Public License
20: * along with this program; if not, write to the Free Software
21: * Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
22: */
23:
24: #ifndef _PCMCIA_GLUE_H
25: #define _PCMCIA_GLUE_H
26:
27: /*
28: * pcmcia glue configuration
29: */
30: #define PCMCIA_DEBUG 4
31: /* Maximum number of sockets supported by the glue code. */
32: #define MAX_SOCKS 8
33:
34:
35: /*
36: * Linux kernel version handling.
37: */
38: #include <linux/version.h>
39: #define UTS_VERSION "" /* Hm. */
40: #define KERNEL_VERSION(v,p,s) (((v)<<16)+(p<<8)+s)
41:
42:
43: /*
44: * Some cardbus drivers want `CARDBUS' to be defined.
45: */
46: #ifdef CONFIG_CARDBUS
47: #define CARDBUS 1
48: #endif
49:
50:
51: /*
52: * Some includes.
53: */
54: #include <linux/malloc.h>
55: #include <pcmcia/driver_ops.h>
56:
57:
58: /*
59: * ioremap and iounmap
60: */
61: #include <linux/pci.h>
62: #include <linux/compatmac.h>
63: #define iounmap(x) (((long)x<0x100000)?0:vfree ((void*)x))
64:
65:
66: /*
67: * These are implemented in rsrc_mgr.c.
68: */
69: extern int check_mem_region(u_long base, u_long num);
70: extern void request_mem_region(u_long base, u_long num, char *name);
71: extern void release_mem_region(u_long base, u_long num);
72:
73:
74: /*
75: * Timer and delaying functions.
76: */
77: #include <linux/delay.h>
78: #define mod_timer(a, b) \
79: do { del_timer(a); (a)->expires = (b); add_timer(a); } while (0)
80: #define mdelay(x) \
81: do { int i; for (i=0;i<x;i++) __udelay(1000); } while (0)
82:
83:
84: /*
85: * GNU Mach's Linux glue code doesn't have
86: * `interruptible_sleep_on_timeout'. For the moment let's use the
87: * non-timeout variant. :-/
88: */
89: #define interruptible_sleep_on_timeout(w,t) \
90: interruptible_sleep_on(w)
91:
92: /*
93: * The macro implementation relies on current_set symbol, which doesn't
94: * appear to be available on GNU Mach. TODO: How to fix this properly?
95: */
96: #undef signal_pending
97: #define signal_pending(c) \
98: 0
99:
100:
101: /*
102: * Byte order stuff. TODO: This does not work on big endian systems,
103: * does it? Move to asm-i386?
104: */
105: #include <asm/byteorder.h>
106: #ifndef le16_to_cpu
107: #define le16_to_cpu(x) (x)
108: #define le32_to_cpu(x) (x)
109: #endif
110: #ifndef cpu_to_le16
111: #define cpu_to_le16(val) (val)
112: #define cpu_to_le32(val) (val)
113: #endif
114:
115:
116: /*
117: * There is no `wake_up_interruptible' on GNU Mach. Use plain `wake_up'
118: * for the moment. TODO.
119: */
120: #define wake_up_interruptible wake_up
121:
122:
123: /* Eliminate the 4-arg versions from <linux/compatmac.h>. */
124: #undef pci_read_config_word
125: #undef pci_read_config_dword
126:
127: #define bus_number(pci_dev) ((pci_dev)->bus->number)
128: #define devfn_number(pci_dev) ((pci_dev)->devfn)
129:
130: #define pci_read_config_byte(pdev, where, valp) \
131: pcibios_read_config_byte(bus_number(pdev), devfn_number(pdev), where, valp)
132: #define pci_read_config_word(pdev, where, valp) \
133: pcibios_read_config_word(bus_number(pdev), devfn_number(pdev), where, valp)
134: #define pci_read_config_dword(pdev, where, valp) \
135: pcibios_read_config_dword(bus_number(pdev), devfn_number(pdev), where, valp)
136: #define pci_write_config_byte(pdev, where, val) \
137: pcibios_write_config_byte(bus_number(pdev), devfn_number(pdev), where, val)
138: #define pci_write_config_word(pdev, where, val) \
139: pcibios_write_config_word(bus_number(pdev), devfn_number(pdev), where, val)
140: #define pci_write_config_dword(pdev, where, val) \
141: pcibios_write_config_dword(bus_number(pdev), devfn_number(pdev), where, val)
142:
143:
144: /*
145: * From pcmcia-cs/include/linux/pci.h.
146: */
147: #define pci_for_each_dev(p) for (p = pci_devices; p; p = p->next)
148:
149:
150:
151: /*
152: * These are defined in pci_fixup.c.
153: */
154: extern struct pci_dev *pci_find_slot(u_int bus, u_int devfn);
155: extern struct pci_dev *pci_find_class(u_int class, struct pci_dev *from);
156: extern int pci_set_power_state(struct pci_dev *dev, int state);
157: extern int pci_enable_device(struct pci_dev *dev);
158:
159: extern u32 pci_irq_mask;
160:
161:
162: #ifdef PCMCIA_CLIENT
163: /*
164: * Worse enough, we need to have `mach_device' as well (at least in ds.c)
165: * and this one is typedef'd to `device', therefore we cannot just
166: * include `netdevice.h' when we're compiling the core.
167: *
168: * For compilation of the clients `PCMCIA_CLIENT' is defined through the
169: * Makefile.
170: */
171: #include <linux/netdevice.h>
172: #include <linux/kcomp.h>
173:
174:
175: /*
176: * init_dev_name and copy_dev_name glue (for `PCMCIA_CLIENT's only).
177: */
178: static inline void
179: init_dev_name(struct net_device *dev, dev_node_t node)
180: {
181: /* just allocate some space for the device name,
182: * register_netdev will happily provide one to us
183: */
184: dev->name = kmalloc(8, GFP_KERNEL);
185: dev->name[0] = 0;
186:
187: /*
188: * dev->init needs to be initialized in order for register_netdev to work
189: */
190: int stub(struct device *dev)
191: {
192: (void) dev;
193: return 0;
194: }
195: dev->init = stub;
196: }
197:
198: #define copy_dev_name(node, dev) do { } while (0)
199: #endif /* PCMCIA_CLIENT */
200:
201:
202: /*
203: * Some network interface glue, additional to the one from
204: * <linux/kcomp.h>.
205: */
206: #define netif_mark_up(dev) do { (dev)->start = 1; } while (0)
207: #define netif_mark_down(dev) do { (dev)->start = 0; } while (0)
208: #define netif_carrier_on(dev) do { dev->flags |= IFF_RUNNING; } while (0)
209: #define netif_carrier_off(dev) do { dev->flags &= ~IFF_RUNNING; } while (0)
210: #define tx_timeout_check(dev, tx_timeout) \
211: do { if (test_and_set_bit(0, (void *)&(dev)->tbusy) != 0) { \
212: if (jiffies - (dev)->trans_start < TX_TIMEOUT) return 1; \
213: tx_timeout(dev); \
214: } } while (0)
215:
216:
217: /*
218: * Some `struct netdevice' interface glue (from the pcmcia-cs package).
219: */
220: #define skb_tx_check(dev, skb) \
221: do { if (skb == NULL) { dev_tint(dev); return 0; } \
222: if (skb->len <= 0) return 0; } while (0)
223: #define tx_timeout_check(dev, tx_timeout) \
224: do { if (test_and_set_bit(0, (void *)&(dev)->tbusy) != 0) { \
225: if (jiffies - (dev)->trans_start < TX_TIMEOUT) return 1; \
226: tx_timeout(dev); \
227: } } while (0)
228: #define DEV_KFREE_SKB(skb) dev_kfree_skb(skb, FREE_WRITE)
229: #define net_device_stats enet_statistics
230: #define add_rx_bytes(stats, n) do { int x; x = (n); } while (0)
231: #define add_tx_bytes(stats, n) do { int x; x = (n); } while (0)
232:
233:
234:
235: /*
236: * TODO: This is i386 dependent.
237: */
238: #define readw_ns(p) readw(p)
239: #define writew_ns(v,p) writew(v,p)
240:
241:
242:
243:
244: /*
245: * We compile everything directly into the GNU Mach kernel, there are no
246: * modules.
247: */
248: #define MODULE_PARM(a,b)
249: #define MODULE_AUTHOR(a)
250: #define MODULE_DESCRIPTION(a)
251: #define MODULE_LICENSE(a)
252:
253: #define module_init(a) \
254: void pcmcia_mod ## a (void) { a(); return; }
255: #define module_exit(a)
256:
257: /*
258: * TODO: We don't have `disable_irq_nosync', do we need it? This is used
259: * by the axnet_cs client driver only.
260: */
261: #define disable_irq_nosync(irq) disable_irq(irq)
262:
263:
264: #endif /* _PCMCIA_GLUE_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.