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
|
/*
* Mach Operating System
* Copyright (c) 1991,1990,1989 Carnegie Mellon University
* All Rights Reserved.
*
* Permission to use, copy, modify and distribute this software and its
* documentation is hereby granted, provided that both the copyright
* notice and this permission notice appear in all copies of the
* software, derivative works or modified versions, and any portions
* thereof, and that both notices appear in supporting documentation.
*
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
* CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
* ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
*
* Carnegie Mellon requests users of this software to return to
*
* Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
* School of Computer Science
* Carnegie Mellon University
* Pittsburgh PA 15213-3890
*
* any improvements or extensions that they make and grant Carnegie Mellon
* the rights to redistribute these changes.
*/
/*
* Author: David B. Golub, Carnegie Mellon University
* Date: 3/89
*/
#ifndef _DEVICE_DEV_HDR_H_
#define _DEVICE_DEV_HDR_H_
#include <mach/port.h>
#include <kern/lock.h>
#include <kern/queue.h>
#include <device/conf.h>
#ifdef i386
#include <i386at/dev_hdr.h>
#else
#define mach_device device
#define mach_device_t device_t
#define MACH_DEVICE_NULL DEVICE_NULL
#define mach_device_reference device_reference
#define mach_device_deallocate device_deallocate
#define mach_convert_device_to_port convert_device_to_port
#endif
/*
* Generic device header. May be allocated with the device,
* or built when the device is opened.
*/
struct mach_device {
decl_simple_lock_data(,ref_lock)/* lock for reference count */
int ref_count; /* reference count */
decl_simple_lock_data(, lock) /* lock for rest of state */
short state; /* state: */
#define DEV_STATE_INIT 0 /* not open */
#define DEV_STATE_OPENING 1 /* being opened */
#define DEV_STATE_OPEN 2 /* open */
#define DEV_STATE_CLOSING 3 /* being closed */
short flag; /* random flags: */
#define D_EXCL_OPEN 0x0001 /* open only once */
short open_count; /* number of times open */
short io_in_progress; /* number of IOs in progress */
boolean_t io_wait; /* someone waiting for IO to finish */
struct ipc_port *port; /* open port */
queue_chain_t number_chain; /* chain for lookup by number */
int dev_number; /* device number */
int bsize; /* replacement for DEV_BSIZE */
struct dev_ops *dev_ops; /* and operations vector */
#ifdef i386
struct device dev; /* the real device structure */
#endif
};
typedef struct mach_device *mach_device_t;
#define MACH_DEVICE_NULL ((mach_device_t)0)
/*
* To find and remove device entries
*/
mach_device_t device_lookup(); /* by name */
void mach_device_reference();
void mach_device_deallocate();
/*
* To find and remove port-to-device mappings
*/
device_t dev_port_lookup();
void dev_port_enter();
void dev_port_remove();
/*
* To call a routine on each device
*/
boolean_t dev_map();
/*
* To lock and unlock state and open-count
*/
#define device_lock(device) simple_lock(&(device)->lock)
#define device_unlock(device) simple_unlock(&(device)->lock)
#endif /* _DEVICE_DEV_HDR_H_ */
|