Changeset 5e2b1ae6 in mainline for uspace/lib/usbhost
- Timestamp:
- 2018-01-07T01:54:45Z (8 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 3dc3f99
- Parents:
- 63431db2
- Location:
- uspace/lib/usbhost
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbhost/include/usb/host/bus.h
r63431db2 r5e2b1ae6 100 100 void (*interrupt)(bus_t *, uint32_t); 101 101 int (*status)(bus_t *, uint32_t *); 102 int (*reserve_default_address)(bus_t *, usb_speed_t);103 int (*release_default_address)(bus_t *);104 102 105 103 /* Operations on device */ … … 139 137 const bus_ops_t *ops; 140 138 139 /* Reserving default address - USB_SPEED_MAX when free. */ 140 usb_speed_t default_address_speed; 141 141 142 /* This structure is meant to be extended by overriding. */ 142 143 } bus_t; … … 166 167 167 168 int bus_reserve_default_address(bus_t *, usb_speed_t); 168 intbus_release_default_address(bus_t *);169 void bus_release_default_address(bus_t *); 169 170 170 171 #endif -
uspace/lib/usbhost/include/usb/host/usb2_bus.h
r63431db2 r5e2b1ae6 50 50 bus_t base; /**< Inheritance - keep this first */ 51 51 52 /** The speed which reserved default address. Invalid unless reserved. */53 usb_speed_t default_address_speed;54 55 52 /** Map of occupied addresses */ 56 53 bool address_occupied [USB_ADDRESS_COUNT]; … … 64 61 extern const bus_ops_t usb2_bus_ops; 65 62 66 extern intusb2_bus_init(usb2_bus_t *, size_t);63 extern void usb2_bus_init(usb2_bus_t *, size_t); 67 64 68 65 #endif -
uspace/lib/usbhost/src/bus.c
r63431db2 r5e2b1ae6 54 54 fibril_mutex_initialize(&bus->guard); 55 55 bus->device_size = device_size; 56 bus->default_address_speed = USB_SPEED_MAX; 56 57 } 57 58 … … 239 240 assert(bus); 240 241 241 const bus_ops_t *ops = BUS_OPS_LOOKUP(bus->ops, reserve_default_address);242 if (!ops)243 return ENOTSUP;244 245 242 fibril_mutex_lock(&bus->guard); 246 const int r = ops->reserve_default_address(bus, speed); 247 fibril_mutex_unlock(&bus->guard); 248 return r; 249 } 250 251 int bus_release_default_address(bus_t *bus) 243 if (bus->default_address_speed != USB_SPEED_MAX) { 244 fibril_mutex_unlock(&bus->guard); 245 return EAGAIN; 246 } else { 247 bus->default_address_speed = speed; 248 fibril_mutex_unlock(&bus->guard); 249 return EOK; 250 } 251 } 252 253 void bus_release_default_address(bus_t *bus) 252 254 { 253 255 assert(bus); 254 255 const bus_ops_t *ops = BUS_OPS_LOOKUP(bus->ops, release_default_address); 256 if (!ops) 257 return ENOTSUP; 258 259 fibril_mutex_lock(&bus->guard); 260 const int r = ops->release_default_address(bus); 261 fibril_mutex_unlock(&bus->guard); 262 return r; 256 bus->default_address_speed = USB_SPEED_MAX; 263 257 } 264 258 -
uspace/lib/usbhost/src/ddf_helpers.c
r63431db2 r5e2b1ae6 137 137 138 138 usb_log_debug("Device %d released default address\n", dev->address); 139 return bus_release_default_address(hcd->bus); 139 bus_release_default_address(hcd->bus); 140 141 return EOK; 140 142 } 141 143 -
uspace/lib/usbhost/src/usb2_bus.c
r63431db2 r5e2b1ae6 100 100 * @param bus usb_device_manager 101 101 * @param addr Pointer to requested address value, place to store new address 102 * @parma strict Fail if the requested address is not available.103 102 * @return Error code. 104 103 * @note Default address is only available in strict mode. 105 104 */ 106 static int request_address(usb2_bus_t *bus, usb_address_t *addr , bool strict)105 static int request_address(usb2_bus_t *bus, usb_address_t *addr) 107 106 { 108 107 int err; … … 114 113 return EINVAL; 115 114 116 /* Only grant default address to strict requests */ 117 if ((*addr == USB_ADDRESS_DEFAULT) && !strict) { 118 if ((err = get_free_address(bus, addr))) 119 return err; 120 } 121 else if (bus->address_occupied[*addr]) { 122 if (strict) { 123 return ENOENT; 124 } 125 if ((err = get_free_address(bus, addr))) 126 return err; 127 } 115 if ((err = get_free_address(bus, addr))) 116 return err; 128 117 129 118 assert(usb_address_is_valid(*addr)); 130 119 assert(bus->address_occupied[*addr] == false); 131 assert(*addr != USB_ADDRESS_DEFAULT || strict);120 assert(*addr != USB_ADDRESS_DEFAULT); 132 121 133 122 bus->address_occupied[*addr] = true; … … 152 141 /** Reserve address early, we want pretty log messages */ 153 142 usb_address_t address = USB_ADDRESS_DEFAULT; 154 if ((err = request_address(bus, &address , false))) {143 if ((err = request_address(bus, &address))) { 155 144 usb_log_error("Failed to reserve new address: %s.", 156 145 str_error(err)); … … 231 220 * default address. 232 221 */ 233 dev->speed = bus-> default_address_speed;222 dev->speed = bus->base.default_address_speed; 234 223 usb_log_debug("Found new %s speed USB device.", usb_str_speed(dev->speed)); 235 224 … … 301 290 } 302 291 303 static int usb2_bus_register_default_address(bus_t *bus_base, usb_speed_t speed)304 {305 usb2_bus_t *bus = bus_to_usb2_bus(bus_base);306 usb_address_t addr = USB_ADDRESS_DEFAULT;307 const int err = request_address(bus, &addr, true);308 if (err)309 return err;310 bus->default_address_speed = speed;311 return EOK;312 }313 314 static int usb2_bus_release_default_address(bus_t *bus_base)315 {316 usb2_bus_t *bus = bus_to_usb2_bus(bus_base);317 return release_address(bus, USB_ADDRESS_DEFAULT);318 }319 320 292 const bus_ops_t usb2_bus_ops = { 321 .reserve_default_address = usb2_bus_register_default_address,322 .release_default_address = usb2_bus_release_default_address,323 293 .device_enumerate = usb2_bus_device_enumerate, 324 294 .endpoint_create = usb2_bus_create_ep, … … 334 304 * @return Error code. 335 305 */ 336 intusb2_bus_init(usb2_bus_t *bus, size_t available_bandwidth)306 void usb2_bus_init(usb2_bus_t *bus, size_t available_bandwidth) 337 307 { 338 308 assert(bus); … … 342 312 343 313 bus->free_bw = available_bandwidth; 344 345 return EOK;346 314 } 347 315 /**
Note:
See TracChangeset
for help on using the changeset viewer.