1 /*
2 * Copyright 2008, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7 #include "bus.h"
8
9 #include <KernelExport.h>
10 #include <PCI.h>
11
12
13 void
bus_trigger_device_removed(device_node * node)14 bus_trigger_device_removed(device_node* node)
15 {
16 // the network device
17 device_attr attrs[] = {
18 {B_DEVICE_VENDOR_ID, B_UINT16_TYPE, {ui16: 0x1001}},
19 {B_DEVICE_ID, B_UINT16_TYPE, {ui16: 0x0001}},
20 {NULL}
21 };
22
23 device_node* child = NULL;
24 while (gDeviceManager->get_next_child_node(node, attrs, &child) == B_OK) {
25 gDeviceManager->unregister_node(child);
26 }
27 }
28
29
30 void
bus_trigger_device_added(device_node * node)31 bus_trigger_device_added(device_node* node)
32 {
33 }
34
35
36 // #pragma mark - bus
37
38
39 static float
supports_device(device_node * parent)40 supports_device(device_node* parent)
41 {
42 const char* bus;
43 if (gDeviceManager->get_attr_string(parent, B_DEVICE_BUS, &bus, false)
44 != B_OK)
45 return -1;
46
47 if (bus != NULL && !strcmp(bus, "root"))
48 return 1.0;
49
50 return -1;
51 }
52
53
54 static status_t
register_device(device_node * parent)55 register_device(device_node* parent)
56 {
57 device_attr attrs[] = {
58 {B_DEVICE_PRETTY_NAME, B_STRING_TYPE, {string: "My Bus"}},
59 {B_DEVICE_BUS, B_STRING_TYPE, {string: BUS_NAME}},
60 {NULL}
61 };
62
63 return gDeviceManager->register_node(parent, BUS_MODULE_NAME, attrs, NULL,
64 NULL);
65 }
66
67
68 static status_t
init_driver(device_node * node,void ** _cookie)69 init_driver(device_node* node, void** _cookie)
70 {
71 *_cookie = node;
72 return B_OK;
73 }
74
75
76 static void
uninit_driver(void * cookie)77 uninit_driver(void* cookie)
78 {
79 }
80
81
82 static status_t
register_child_devices(void * cookie)83 register_child_devices(void* cookie)
84 {
85 device_node* node = (device_node*)cookie;
86
87 const struct device_info {
88 uint16 vendor;
89 uint16 device;
90 uint16 type;
91 uint16 sub_type;
92 uint16 interface;
93 } kDevices[] = {
94 {0x1000, 0x0001, PCI_mass_storage, PCI_sata, PCI_sata_ahci},
95 {0x1001, 0x0001, PCI_network, PCI_ethernet, 0},
96 {0x1001, 0x0002, PCI_display, 0, 0},
97 {0x1002, 0x0001, PCI_multimedia, PCI_audio, 0},
98 {0x1002, 0x0002, PCI_serial_bus, PCI_usb, PCI_usb_ehci},
99 };
100 const size_t kNumDevices = sizeof(kDevices) / sizeof(kDevices[0]);
101
102 for (uint32 i = 0; i < kNumDevices; i++) {
103 device_attr attrs[] = {
104 // info about the device
105 {B_DEVICE_VENDOR_ID, B_UINT16_TYPE, {ui16: kDevices[i].vendor}},
106 {B_DEVICE_ID, B_UINT16_TYPE, {ui16: kDevices[i].device}},
107
108 {B_DEVICE_BUS, B_STRING_TYPE, {string: BUS_NAME}},
109 {B_DEVICE_TYPE, B_UINT16_TYPE, {ui16: kDevices[i].type}},
110 {B_DEVICE_SUB_TYPE, B_UINT16_TYPE,
111 {ui16: kDevices[i].sub_type}},
112 {B_DEVICE_INTERFACE, B_UINT16_TYPE,
113 {ui16: kDevices[i].interface}},
114
115 {B_DEVICE_FLAGS, B_UINT32_TYPE, {ui32: B_FIND_CHILD_ON_DEMAND}},
116 {NULL}
117 };
118
119 gDeviceManager->register_node(node, BUS_FOR_DRIVER_NAME, attrs, NULL,
120 NULL);
121 }
122
123 device_attr attrs[] = {
124 {B_DEVICE_FIXED_CHILD, B_STRING_TYPE,
125 {string: "non_existing/driver_v1"}},
126 {NULL}
127 };
128
129 #if 1
130 // this is supposed to fail
131 dprintf("non-existing child: %ld\n", gDeviceManager->register_node(node,
132 BUS_FOR_DRIVER_NAME, attrs, NULL, NULL));
133 #endif
134 return B_OK;
135 }
136
137
138 static status_t
rescan_child_devices(void * cookie)139 rescan_child_devices(void* cookie)
140 {
141 return B_ERROR;
142 }
143
144
145 static void
device_removed(void * cookie)146 device_removed(void* cookie)
147 {
148 }
149
150
151 // #pragma mark - for driver
152
153
154 static status_t
get_bus_info(void * cookie,bus_info * info)155 get_bus_info(void* cookie, bus_info* info)
156 {
157 gDeviceManager->get_attr_uint16((device_node*)cookie, B_DEVICE_VENDOR_ID,
158 &info->vendor_id, false);
159 gDeviceManager->get_attr_uint16((device_node*)cookie, B_DEVICE_ID,
160 &info->device_id, false);
161 return B_OK;
162 }
163
164
165 // #pragma mark -
166
167
168 struct driver_module_info gBusModuleInfo = {
169 {
170 BUS_MODULE_NAME,
171 0,
172 NULL,
173 },
174
175 supports_device,
176 register_device,
177
178 init_driver,
179 uninit_driver,
180 register_child_devices,
181 rescan_child_devices,
182 device_removed,
183 };
184
185 struct bus_for_driver_module_info gBusDriverModuleInfo = {
186 {
187 {
188 BUS_FOR_DRIVER_NAME,
189 0,
190 NULL,
191 },
192
193 NULL,
194 NULL,
195
196 init_driver,
197 },
198 get_bus_info
199 };
200
201