Changeset 20eaa82 in mainline for uspace/lib/usbhost/src/bus.c


Ignore:
Timestamp:
2017-10-15T13:44:39Z (7 years ago)
Author:
Ondřej Hlavatý <aearsis@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
2770b66
Parents:
867b375
Message:

usbhost refactoring: introduced bus→enumerate_device

File:
1 edited

Legend:

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

    r867b375 r20eaa82  
    3636#include <usb/host/bus.h>
    3737#include <usb/host/endpoint.h>
     38#include <ddf/driver.h>
    3839
    3940#include <mem.h>
    4041#include <errno.h>
     42#include <stdio.h>
    4143
    4244/**
    4345 * Initializes the bus structure.
    4446 */
    45 void bus_init(bus_t *bus)
    46 {
     47void bus_init(bus_t *bus, size_t device_size)
     48{
     49        assert(bus);
     50        assert(device_size >= sizeof(device_t));
    4751        memset(bus, 0, sizeof(bus_t));
    4852
    4953        fibril_mutex_initialize(&bus->guard);
     54        bus->device_size = device_size;
     55}
     56
     57int device_init(device_t *dev)
     58{
     59        memset(dev, 0, sizeof(*dev));
     60
     61        link_initialize(&dev->link);
     62        list_initialize(&dev->devices);
     63        fibril_mutex_initialize(&dev->guard);
     64
     65        return EOK;
     66}
     67
     68int bus_add_ep(bus_t *bus, device_t *device, usb_endpoint_t endpoint,
     69    usb_direction_t dir, usb_transfer_type_t type, size_t max_packet_size,
     70    unsigned packets, size_t size)
     71{
     72        assert(bus);
     73        assert(device);
     74
     75        /* Temporary reference */
     76        endpoint_t *ep = bus_create_endpoint(bus);
     77        if (!ep)
     78                return ENOMEM;
     79
     80        ep->target = (usb_target_t) {
     81                .address = device->address,
     82                .endpoint = endpoint,
     83        };
     84
     85        ep->device = device;
     86        ep->direction = dir;
     87        ep->transfer_type = type;
     88        ep->max_packet_size = max_packet_size;
     89        ep->packets = packets;
     90
     91        ep->bandwidth = bus_count_bw(ep, size);
     92
     93        const int err = bus_register_endpoint(bus, ep);
     94
     95        /* drop Temporary reference */
     96        endpoint_del_ref(ep);
     97
     98        return err;
     99}
     100
     101int bus_remove_ep(bus_t *bus, usb_target_t target, usb_direction_t dir)
     102{
     103        assert(bus);
     104        endpoint_t *ep = bus_find_endpoint(bus, target, dir);
     105        if (!ep)
     106                return ENOENT;
     107
     108        return bus_release_endpoint(bus, ep);
     109}
     110
     111int device_set_default_name(device_t *dev)
     112{
     113        assert(dev);
     114        assert(dev->fun);
     115
     116        char buf[10] = { 0 }; /* usbxyz-ss */
     117        snprintf(buf, sizeof(buf) - 1, "usb%u-%cs",
     118            dev->address, usb_str_speed(dev->speed)[0]);
     119
     120        return ddf_fun_set_name(dev->fun, buf);
     121}
     122
     123int bus_enumerate_device(bus_t *bus, hcd_t *hcd, device_t *dev)
     124{
     125        assert(bus);
     126        assert(hcd);
     127        assert(dev);
     128
     129        if (!bus->ops.enumerate_device)
     130                return ENOTSUP;
     131
     132        fibril_mutex_lock(&bus->guard);
     133        const int r = bus->ops.enumerate_device(bus, hcd, dev);
     134        fibril_mutex_unlock(&bus->guard);
     135        return r;
     136}
     137
     138int bus_remove_device(bus_t *bus, hcd_t *hcd, device_t *dev)
     139{
     140        assert(bus);
     141        assert(dev);
     142
     143        if (!bus->ops.remove_device)
     144                return ENOTSUP;
     145
     146        fibril_mutex_lock(&bus->guard);
     147        const int r = bus->ops.remove_device(bus, hcd, dev);
     148        fibril_mutex_unlock(&bus->guard);
     149        return r;
    50150}
    51151
     
    141241}
    142242
    143 int bus_get_speed(bus_t *bus, usb_address_t address, usb_speed_t *speed)
    144 {
    145         assert(bus);
    146         assert(speed);
    147 
    148         if (!bus->ops.get_speed)
    149                 return ENOTSUP;
    150 
    151         fibril_mutex_lock(&bus->guard);
    152         const int r = bus->ops.get_speed(bus, address, speed);
    153         fibril_mutex_unlock(&bus->guard);
    154         return r;
    155 }
    156 
    157243int bus_reset_toggle(bus_t *bus, usb_target_t target, bool all)
    158244{
Note: See TracChangeset for help on using the changeset viewer.