1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
|
/*======================================================================
The contents of this file are subject to the Mozilla Public
License Version 1.1 (the "License"); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at http://www.mozilla.org/MPL/
Software distributed under the License is distributed on an "AS
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
implied. See the License for the specific language governing
rights and limitations under the License.
The initial developer of the original code is David A. Hinds
<dahinds@users.sourceforge.net>. Portions created by David A. Hinds
are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
Contributor: Apple Computer, Inc. Portions (C) 2000 Apple Computer,
Inc. All rights reserved.
Alternatively, the contents of this file may be used under the
terms of the GNU Public License version 2 (the "GPL"), in which
case the provisions of the GPL are applicable instead of the
above. If you wish to allow the use of your version of this file
only under the terms of the GPL and not to allow others to use
your version of this file under the MPL, indicate your decision
by deleting the provisions above and replace them with the notice
and other provisions required by the GPL. If you do not delete
the provisions above, a recipient may use your version of this
file under either the MPL or the GPL.
======================================================================*/
#ifndef _LINUX_K_COMPAT_H
#define _LINUX_K_COMPAT_H
#include <IOKit/assert.h>
#include <IOKit/IOLib.h>
#include <libkern/OSByteOrder.h>
#include <sys/errno.h>
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
#define printk IOLog
#define KERN_INFO "IOPCCard info: "
#define KERN_NOTICE "IOPCCard notice: "
#define KERN_DEBUG "IOPCCard debug: "
#define MODULE_PARM(a,b)
#define MODULE_AUTHOR(a)
#define MODULE_DESCRIPTION(a)
#define MOD_DEC_USE_COUNT
#define MOD_INC_USE_COUNT
#define __init
#define __exit
// we don't need these if we are always inside the workloop
#define ACQUIRE_RESOURCE_LOCK
#define RELEASE_RESOURCE_LOCK
#define NR_IRQS 256
#define PCI_INTERRUPT_LINE 0x3c
#define PCI_CACHE_LINE_SIZE 0xc
#define PCI_LATENCY_TIMER 0xd
#define PCI_BASE_ADDRESS_0 0x10
#define PCI_COMMAND 0x4
#define PCI_COMMAND_IO 0x1
#define PCI_COMMAND_MEMORY 0x2
#define PCI_COMMAND_MASTER 0x4
#define PCI_COMMAND_WAIT 0x80
#define PCI_HEADER_TYPE 0xe
#define PCI_CLASS_REVISION 0x8
#define PCI_VENDOR_ID 0x0
#define PCI_DEVICE_ID 0x2
#define PCI_STATUS 0x6
#define PCI_CLASS_BRIDGE_CARDBUS 0x0607
#define PCI_CLASS_BRIDGE_PCMCIA 0x0605
#define PCI_BASE_ADDRESS_SPACE_IO 0x1
#define PCI_BASE_ADDRESS_SPACE_MEMORY 0x0
#define PCI_BASE_ADDRESS_MEM_PREFETCH 0x8
#define PCI_BASE_ADDRESS_MEM_MASK (~0x0fUL)
#define PCI_BASE_ADDRESS_SPACE 0x1
#define PCI_BASE_ADDRESS_IO_MASK (~0x03UL)
#define PCI_INTERRUPT_PIN 0x3d
struct pt_regs {};
#define HZ 100
extern void delay_for_interval(natural_t interval, natural_t scale_factor);
#define mdelay(i) delay_for_interval((i), kMillisecondScale)
#define udelay(i) delay_for_interval((i), kMicrosecondScale)
struct timer_list {
unsigned long expires;
void (*function)(unsigned long);
unsigned long data;
};
extern void IOPCCardAddTimer(struct timer_list * timer);
extern int IOPCCardDeleteTimer(struct timer_list * timer);
#define jiffies (0) // just cheat on the whole jiffies thing :-)
#define add_timer(t) IOPCCardAddTimer(t)
#define del_timer(t) IOPCCardDeleteTimer(t)
#define mod_timer(a, b) do { del_timer(a); (a)->expires = (b); add_timer(a); } while (0)
extern void *kern_os_malloc(size_t size);
extern void *kern_os_realloc(void * addr, size_t size);
extern void kern_os_free(void * addr);
#define kmalloc(s, x) kern_os_malloc(s)
#define krealloc(a, s, x) kern_os_realloc(a, s)
#define kfree(a) kern_os_free(a)
#define le16_to_cpu(x) OSSwapLittleToHostInt16(x)
#define le32_to_cpu(x) OSSwapLittleToHostInt32(x)
//MACOSXXX - all this needs to be cleaned up
typedef struct wait_queue *wait_queue_head_t;
#define init_waitqueue_head(p) DEBUG(0, "init_waitqueue_head stubbed out!\n");
#define wacquire(w) do { } while (0)
#define wrelease(w) do { } while (0)
#define wsleep(w) DEBUG(0, "wsleep stubbed out!\n");
#define wsleeptimeout(w,t) DEBUG(0, "wsleeptimeout stubbed out!\n");
#define wakeup(w) DEBUG(0, "wakeup stubbed out!\n");
extern u_char IOPCCardReadByte(void *virt);
extern u_long IOPCCardReadLong(void *virt);
extern void IOPCCardWriteByte(void *virt, u_char value);
extern void IOPCCardWriteLong(void *virt, u_int value);
#define readb(a) IOPCCardReadByte(a)
#define readl(a) IOPCCardReadLong(a)
#define writeb(v, a) IOPCCardWriteByte(a, v)
#define writel(v, a) IOPCCardWriteLong(a, v)
extern void *IOPCCardIORemap(u_long paddr, u_long size);
extern void IOPCCardIOUnmap(void *vaddr);
#define ioremap(p, s) IOPCCardIORemap(p, s)
#define iounmap(v) IOPCCardIOUnmap(v)
#ifdef IOPCCARD_IN_IOKIT_CODE
class IOPCIDevice;
class IOPCCardBridge;
class IOCardBusDevice;
class IOPCCard16Device;
extern int init_i82365(IOPCCardBridge *bus, IOPCIDevice *bridge, IOVirtualAddress device_regs);
extern int init_pcmcia_cs(void);
#else /* !IOPCCARD_IN_IOKIT_CODE */
typedef struct IOPCIDevice IOPCIDevice;
typedef struct IOPCCardBridge IOPCCardBridge;
#define IOCardBusDevice IOPCIDevice // subclassing C style
typedef struct IOPCCard16Device IOPCCard16Device;
extern IOCardBusDevice *IOPCCardCreateCardBusNub(IOPCCardBridge *bus, unsigned int socket, unsigned int function);
extern void IOPCCardRetainNub(void *nub);
extern void IOPCCardReleaseNub(void *nub);
extern int IOPCCardAddCSCInterruptHandlers(IOPCCardBridge *bus, unsigned int socket, unsigned int irq,
u_int (*top_handler)(u_int), u_int (*bottom_handler)(u_int),
u_int (*enable_functional)(u_int), u_int (*disable_functional)(u_int),
const char* name);
extern int IOPCCardRemoveCSCInterruptHandlers(IOPCCardBridge *bus, unsigned int socket);
// MACOSXXX - i82365.c and cardbus.c currently use these differently :-)
// the #defines are in those files for now
extern int IOPCCardReadConfigByte(IOPCIDevice *bus, int r, u_char *v);
extern int IOPCCardWriteConfigByte(IOPCIDevice *bus, int r, u_char v);
extern int IOPCCardReadConfigWord(IOPCIDevice *bus, int r, u_short *v);
extern int IOPCCardWriteConfigWord(IOPCIDevice *bus, int r, u_short v);
extern int IOPCCardReadConfigLong(IOPCIDevice *bus, int r, u_int *v);
extern int IOPCCardWriteConfigLong(IOPCIDevice *bus, int r, u_int v);
// MACOSXXX these need to use IOPCCardBridge *bus, if we have multiple controllers
// on different pci bridges, the current code breaks down, this is currently
// not really an issue on laptops :-)
extern int check_mem_region(u_long base, u_long num);
extern void request_mem_region(u_long base, u_long num, char *name);
extern void release_mem_region(u_long base, u_long num);
extern int check_io_region(u_long base, u_long num);
extern void request_io_region(u_long base, u_long num, char *name);
extern void release_io_region(u_long base, u_long num);
#define check_region(a, l) check_io_region(a, l)
#define request_region(a, l, n) request_io_region(a, l, n)
#define release_region(a, l) release_io_region(a, l)
extern int configure_i82365(IOPCCardBridge *pccard_nub, IOPCIDevice *bridge_nub, void * device_regs);
#endif /* IOPCCARD_IN_IOKIT_CODE */
/* Flags for device state, from ds.h */
#define DEV_PRESENT 0x01
#define DEV_CONFIG 0x02
#define DEV_STALE_CONFIG 0x04 /* release on close */
#define DEV_STALE_LINK 0x08 /* detach on release */
#define DEV_CONFIG_PENDING 0x10
#define DEV_RELEASE_PENDING 0x20
#define DEV_SUSPEND 0x40
#define DEV_BUSY 0x80
#define DEV_OK(state) (((state) & ~DEV_BUSY) == (DEV_CONFIG|DEV_PRESENT))
#endif /* _LINUX_K_COMPAT_H */
|