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 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 31 bus_trigger_device_added(device_node* node) 32 { 33 } 34 35 36 // #pragma mark - bus 37 38 39 static float 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 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 69 init_driver(device_node* node, void** _cookie) 70 { 71 *_cookie = node; 72 return B_OK; 73 } 74 75 76 static void 77 uninit_driver(void* cookie) 78 { 79 } 80 81 82 static status_t 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 139 rescan_child_devices(void* cookie) 140 { 141 return B_ERROR; 142 } 143 144 145 static void 146 device_removed(void* cookie) 147 { 148 } 149 150 151 // #pragma mark - for driver 152 153 154 static status_t 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