Changeset 6832245 in mainline for uspace/lib/usbhost/src/usb2_bus.c


Ignore:
Timestamp:
2017-12-14T23:01:57Z (6 years ago)
Author:
Ondřej Hlavatý <aearsis@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
837d53d
Parents:
bd05140
git-author:
Ondřej Hlavatý <aearsis@…> (2017-12-14 23:01:54)
git-committer:
Ondřej Hlavatý <aearsis@…> (2017-12-14 23:01:57)
Message:

usbhost bus: refactor the bus ops

This way, method names better represent the entity it is working with.
Their semantics was shifted a bit.

Regarding the tree of structures:

bus ← device ← endpoint ← batch

Previously, devices were kept in DDF function nodes, and endpoints had
pointer to the bus and device. Now, devices have pointer to bus,
endpoints don't.

Pointer to hcd_t in bus is WIP, and will be removed.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usbhost/src/usb2_bus.c

    rbd05140 r6832245  
    200200}};
    201201
    202 static int address_device(usb2_bus_t *bus, hcd_t *hcd, device_t *dev)
     202static int address_device(device_t *dev)
    203203{
    204204        int err;
     205
     206        usb2_bus_t *bus = (usb2_bus_t *) dev->bus;
     207        hcd_t *hcd = (hcd_t *) bus->base.hcd;
    205208
    206209        /* The default address is currently reserved for this device */
     
    220223
    221224        endpoint_t *default_ep;
    222         err = bus_add_endpoint(&bus->base, dev, &usb2_default_control_ep, &default_ep);
     225        err = bus_endpoint_add(dev, &usb2_default_control_ep, &default_ep);
    223226        if (err != EOK) {
    224227                usb_log_error("Device(%d): Failed to add default target: %s.",
     
    244247
    245248        /* We need to remove ep before we change the address */
    246         if ((err = bus_remove_endpoint(&bus->base, default_ep))) {
     249        if ((err = bus_endpoint_remove(default_ep))) {
    247250                usb_log_error("Device(%d): Failed to unregister default target: %s", address, str_error(err));
    248251                goto err_address;
     
    262265        /* Register EP on the new address */
    263266        usb_log_debug("Device(%d): Registering control EP.", address);
    264         err = bus_add_endpoint(&bus->base, dev, &control_ep, NULL);
     267        err = bus_endpoint_add(dev, &control_ep, NULL);
    265268        if (err != EOK) {
    266269                usb_log_error("Device(%d): Failed to register EP0: %s",
     
    272275
    273276err_default_control_ep:
    274         bus_remove_endpoint(&bus->base, default_ep);
     277        bus_endpoint_remove(default_ep);
    275278        endpoint_del_ref(default_ep);
    276279err_address:
     
    281284/** Enumerate a new USB device
    282285 */
    283 static int usb2_bus_enumerate_device(bus_t *bus_base, hcd_t *hcd, device_t *dev)
     286static int usb2_bus_device_enumerate(device_t *dev)
    284287{
    285288        int err;
    286         usb2_bus_t *bus = bus_to_usb2_bus(bus_base);
     289        usb2_bus_t *bus = bus_to_usb2_bus(dev->bus);
    287290
    288291        /* The speed of the new device was reported by the hub when reserving
     
    306309
    307310        /* Assign an address to the device */
    308         if ((err = address_device(bus, hcd, dev))) {
     311        if ((err = address_device(dev))) {
    309312                usb_log_error("Failed to setup address of the new device: %s", str_error(err));
    310313                return err;
     
    312315
    313316        /* Read the device descriptor, derive the match ids */
    314         if ((err = hcd_ddf_device_explore(hcd, dev))) {
     317        if ((err = hcd_ddf_device_explore(dev))) {
    315318                usb_log_error("Device(%d): Failed to explore device: %s", dev->address, str_error(err));
    316319                release_address(bus, dev->address);
     
    329332 * @note Assumes that the internal mutex is locked.
    330333 */
    331 static endpoint_t *usb2_bus_find_ep(bus_t *bus_base, device_t *device, usb_target_t target, usb_direction_t direction)
    332 {
    333         usb2_bus_t *bus = bus_to_usb2_bus(bus_base);
     334static endpoint_t *usb2_bus_find_ep(device_t *device, usb_target_t target, usb_direction_t direction)
     335{
     336        usb2_bus_t *bus = bus_to_usb2_bus(device->bus);
    334337
    335338        assert(device->address == target.address);
     
    345348}
    346349
    347 static endpoint_t *usb2_bus_create_ep(bus_t *bus)
     350static endpoint_t *usb2_bus_create_ep(device_t *dev, const usb_endpoint_desc_t *desc)
    348351{
    349352        endpoint_t *ep = malloc(sizeof(endpoint_t));
     
    351354                return NULL;
    352355
    353         endpoint_init(ep, bus);
     356        endpoint_init(ep, dev, desc);
    354357        return ep;
    355358}
     
    370373 * @param endpoint USB endpoint number.
    371374 */
    372 static int usb2_bus_register_ep(bus_t *bus_base, device_t *device, endpoint_t *ep, const usb_endpoint_desc_t *desc)
    373 {
    374         usb2_bus_t *bus = bus_to_usb2_bus(bus_base);
     375static int usb2_bus_register_ep(endpoint_t *ep)
     376{
     377        usb2_bus_t *bus = bus_to_usb2_bus(ep->device->bus);
     378        assert(fibril_mutex_is_locked(&bus->base.guard));
    375379        assert(ep);
    376380
    377         ep->device = device;
    378 
    379         /* Extract USB2-related information from endpoint_desc */
    380         ep->endpoint = desc->endpoint_no;
    381         ep->direction = desc->direction;
    382         ep->transfer_type = desc->transfer_type;
    383         ep->max_packet_size = desc->max_packet_size;
    384         ep->packets = desc->packets;
    385 
    386         ep->bandwidth = bus_base->ops.count_bw(ep, desc->max_packet_size);
    387 
    388381        /* Check for existence */
    389         if (usb2_bus_find_ep(bus_base, ep->device, usb2_ep_to_target(ep), ep->direction))
     382        if (usb2_bus_find_ep(ep->device, usb2_ep_to_target(ep), ep->direction))
    390383                return EEXIST;
    391384
     
    394387                return ENOSPC;
    395388
     389        endpoint_add_ref(ep);
    396390        list_append(&ep->link, get_list(bus, ep->device->address));
    397391        bus->free_bw -= ep->bandwidth;
     
    400394}
    401395
    402 
    403396/** Release bandwidth reserved by the given endpoint.
    404397 */
    405 static int usb2_bus_unregister_ep(bus_t *bus_base, endpoint_t *ep)
    406 {
    407         usb2_bus_t *bus = bus_to_usb2_bus(bus_base);
     398static int usb2_bus_unregister_ep(endpoint_t *ep)
     399{
     400        usb2_bus_t *bus = bus_to_usb2_bus(ep->device->bus);
    408401        assert(ep);
    409402
    410403        list_remove(&ep->link);
    411         ep->device = NULL;
    412404
    413405        bus->free_bw += ep->bandwidth;
     406        endpoint_del_ref(ep);
    414407
    415408        return EOK;
     
    452445}
    453446
    454 static const bus_ops_t usb2_bus_ops = {
     447const bus_ops_t usb2_bus_ops = {
    455448        .reserve_default_address = usb2_bus_register_default_address,
    456449        .release_default_address = usb2_bus_release_default_address,
    457         .enumerate_device = usb2_bus_enumerate_device,
    458         .create_endpoint = usb2_bus_create_ep,
    459         .find_endpoint = usb2_bus_find_ep,
    460         .unregister_endpoint = usb2_bus_unregister_ep,
    461         .register_endpoint = usb2_bus_register_ep,
    462450        .reset_toggle = usb2_bus_reset_toggle,
     451        .device_enumerate = usb2_bus_device_enumerate,
     452        .device_find_endpoint = usb2_bus_find_ep,
     453        .endpoint_create= usb2_bus_create_ep,
     454        .endpoint_register= usb2_bus_register_ep,
     455        .endpoint_unregister= usb2_bus_unregister_ep,
    463456};
    464457
     
    470463 * @return Error code.
    471464 */
    472 int usb2_bus_init(usb2_bus_t *bus, size_t available_bandwidth, count_bw_func_t count_bw)
     465int usb2_bus_init(usb2_bus_t *bus, hcd_t *hcd, size_t available_bandwidth)
    473466{
    474467        assert(bus);
    475468
    476         bus_init(&bus->base, sizeof(device_t));
    477 
    478         bus->base.ops = usb2_bus_ops;
    479         bus->base.ops.count_bw = count_bw;
     469        bus_init(&bus->base, hcd, sizeof(device_t));
     470        bus->base.ops = &usb2_bus_ops;
    480471
    481472        bus->free_bw = available_bandwidth;
Note: See TracChangeset for help on using the changeset viewer.