Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usbhost/include/usb/host/endpoint.h

    r58563585 r5f0b366  
    3232/** @file
    3333 *
     34 * Endpoint structure is tightly coupled to the bus. The bus controls the
     35 * life-cycle of endpoint. In order to keep endpoints lightweight, operations
     36 * on endpoints are part of the bus structure.
     37 *
    3438 */
    3539#ifndef LIBUSBHOST_HOST_ENDPOINT_H
    3640#define LIBUSBHOST_HOST_ENDPOINT_H
    3741
     42#include <adt/list.h>
     43#include <atomic.h>
     44#include <fibril_synch.h>
    3845#include <stdbool.h>
    39 #include <adt/list.h>
    40 #include <fibril_synch.h>
     46#include <sys/time.h>
    4147#include <usb/usb.h>
    42 #include <atomic.h>
     48#include <usb/host/bus.h>
     49#include <usbhc_iface.h>
    4350
    44 /** Host controller side endpoint structure. */
     51typedef struct bus bus_t;
     52typedef struct device device_t;
     53typedef struct usb_transfer_batch usb_transfer_batch_t;
     54
     55/**
     56 * Host controller side endpoint structure.
     57 *
     58 * This structure, though reference-counted, is very fragile. It is responsible
     59 * for synchronizing transfer batch scheduling and completion.
     60 *
     61 * To avoid situations, in which two locks must be obtained to schedule/finish
     62 * a transfer, the endpoint inherits a lock from the outside. Because the
     63 * concrete instance of mutex can be unknown at the time of initialization,
     64 * the HC shall pass the right lock at the time of onlining the endpoint.
     65 *
     66 * The fields used for scheduling (online, active_batch) are to be used only
     67 * under that guard and by functions designed for this purpose. The driver can
     68 * also completely avoid using this mechanism, in which case it is on its own in
     69 * question of transfer aborting.
     70 *
     71 * Relevant information can be found in the documentation of HelenOS xHCI
     72 * project.
     73 */
    4574typedef struct endpoint {
     75        /** USB device */
     76        device_t *device;
    4677        /** Reference count. */
    47         atomic_t refcnt;       
    48         /** Part of linked list. */
    49         link_t link;
    50         /** USB address. */
    51         usb_address_t address;
    52         /** USB endpoint number. */
     78        atomic_t refcnt;
     79
     80        /** An inherited guard */
     81        fibril_mutex_t *guard;
     82        /** Whether it's allowed to schedule on this endpoint */
     83        bool online;
     84        /** The currently active transfer batch. */
     85        usb_transfer_batch_t *active_batch;
     86        /** Signals change of active status. */
     87        fibril_condvar_t avail;
     88
     89        /** Endpoint number */
    5390        usb_endpoint_t endpoint;
    5491        /** Communication direction. */
     
    5693        /** USB transfer type. */
    5794        usb_transfer_type_t transfer_type;
    58         /** Communication speed. */
    59         usb_speed_t speed;
    60         /** Maximum size of data packets. */
     95        /** Maximum size of one packet */
    6196        size_t max_packet_size;
    62         /** Additional opportunities per uframe */
    63         unsigned packets;
    64         /** Necessary bandwidth. */
    65         size_t bandwidth;
    66         /** Value of the toggle bit. */
    67         unsigned toggle:1;
    68         /** True if there is a batch using this scheduled for this endpoint. */
    69         volatile bool active;
    70         /** Protects resources and active status changes. */
    71         fibril_mutex_t guard;
    72         /** Signals change of active status. */
    73         fibril_condvar_t avail;
    74         /** High speed TT data */
    75         struct {
    76                 usb_address_t address;
    77                 unsigned port;
    78         } tt;
    79         /** Optional device specific data. */
    80         struct {
    81                 /** Device specific data. */
    82                 void *data;
    83                 /** Callback to get the value of toggle bit. */
    84                 int (*toggle_get)(void *);
    85                 /** Callback to set the value of toggle bit. */
    86                 void (*toggle_set)(void *, int);
    87         } hc_data;
     97
     98        /** Maximum size of one transfer */
     99        size_t max_transfer_size;
     100        /**
     101         * Number of packets that can be sent in one service interval
     102         * (not necessarily uframe, despite its name)
     103         */
     104        unsigned packets_per_uframe;
     105
     106        /* This structure is meant to be extended by overriding. */
    88107} endpoint_t;
    89108
    90 extern endpoint_t *endpoint_create(usb_address_t, usb_endpoint_t,
    91     usb_direction_t, usb_transfer_type_t, usb_speed_t, size_t, unsigned int,
    92     size_t, usb_address_t, unsigned int);
    93 extern void endpoint_destroy(endpoint_t *);
     109extern void endpoint_init(endpoint_t *, device_t *, const usb_endpoint_descriptors_t *);
    94110
    95111extern void endpoint_add_ref(endpoint_t *);
    96112extern void endpoint_del_ref(endpoint_t *);
    97113
    98 extern void endpoint_set_hc_data(endpoint_t *, void *, int (*)(void *),
    99     void (*)(void *, int));
    100 extern void endpoint_clear_hc_data(endpoint_t *);
     114extern void endpoint_set_online(endpoint_t *, fibril_mutex_t *);
     115extern void endpoint_set_offline_locked(endpoint_t *);
    101116
    102 extern void endpoint_use(endpoint_t *);
    103 extern void endpoint_release(endpoint_t *);
     117extern void endpoint_wait_timeout_locked(endpoint_t *ep, suseconds_t);
     118extern int endpoint_activate_locked(endpoint_t *, usb_transfer_batch_t *);
     119extern void endpoint_deactivate_locked(endpoint_t *);
    104120
    105 extern int endpoint_toggle_get(endpoint_t *);
    106 extern void endpoint_toggle_set(endpoint_t *, int);
     121int endpoint_send_batch(endpoint_t *, usb_target_t, usb_direction_t,
     122    char *, size_t, uint64_t, usbhc_iface_transfer_callback_t, void *,
     123    const char *);
    107124
    108 /** list_get_instance wrapper.
    109  *
    110  * @param item Pointer to link member.
    111  *
    112  * @return Pointer to endpoint_t structure.
    113  *
    114  */
    115 static inline endpoint_t * endpoint_get_instance(link_t *item)
     125static inline bus_t *endpoint_get_bus(endpoint_t *ep)
    116126{
    117         return item ? list_get_instance(item, endpoint_t, link) : NULL;
     127        device_t * const device = ep->device;
     128        return device ? device->bus : NULL;
    118129}
     130
    119131#endif
    120132
Note: See TracChangeset for help on using the changeset viewer.