xref: /haiku/src/tests/system/kernel/device_manager/playground/bus.cpp (revision 9f925127dbb0459be00626ba0559a1f25441fac0)
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