Ignore:
Timestamp:
2011-12-23T18:13:33Z (12 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
3819ce5, b39eb79, f0b74b2
Parents:
2f0dd2a (diff), 153cc76a (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

USB branch changes.

+ USB device drivers use single async session to host controller, this session (represented by usb_hc_connection_t) is used for both HC requests and to back usb device connection.
+ Pipe locking was removed. Reference counting was moved to usb_hc_connection_t. Every read/write operation uses separate parallel exchange thus any contention is resolved on hc side.

  • async_sess_t setup using EXCHANGE_PARALLEL uses one extra phone (session phone, each exch creates its own), thus the number of phones used by usb dvice driver might increase. Possible solutions are: make read/write calls atomic (all other calls are atomic) and use EXCHANGE_ATOMIC, any other solution provided by changes to async_sess_t.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usbdev/include/usb/dev/pipes.h

    r2f0dd2a r7e1b130  
    2626 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    2727 */
    28 
    2928/** @addtogroup libusbdev
    3029 * @{
     
    3736
    3837#include <sys/types.h>
    39 #include <usb/usb.h>
    40 #include <usb/hc.h>
    41 #include <usb/descriptor.h>
    4238#include <ipc/devman.h>
    4339#include <ddf/driver.h>
    4440#include <fibril_synch.h>
    45 #include <async.h>
     41#include <usb/usb.h>
     42#include <usb/descriptor.h>
     43#include <usb/dev/usb_device_connection.h>
    4644
    47 /** Abstraction of a physical connection to the device.
    48  * This type is an abstraction of the USB wire that connects the host and
    49  * the function (device).
     45#define CTRL_PIPE_MIN_PACKET_SIZE 8
     46/** Abstraction of a logical connection to USB device endpoint.
     47 * It encapsulates endpoint attributes (transfer type etc.).
     48 * This endpoint must be bound with existing usb_device_connection_t
     49 * (i.e. the wire to send data over).
    5050 */
    5151typedef struct {
    52         /** Handle of the host controller device is connected to. */
    53         devman_handle_t hc_handle;
    54         /** Address of the device. */
    55         usb_address_t address;
    56 } usb_device_connection_t;
    57 
    58 /** Abstraction of a logical connection to USB device endpoint.
    59  * It encapsulates endpoint attributes (transfer type etc.) as well
    60  * as information about currently running sessions.
    61  * This endpoint must be bound with existing usb_device_connection_t
    62  * (i.e. the wire to send data over).
    63  *
    64  * Locking order: if you want to lock both mutexes
    65  * (@c guard and @c hc_sess_mutex), lock @c guard first.
    66  * It is not necessary to lock @c guard if you want to lock @c hc_sess_mutex
    67  * only.
    68  */
    69 typedef struct {
    70         /** Guard of the whole pipe. */
    71         fibril_mutex_t guard;
    72 
    7352        /** The connection used for sending the data. */
    7453        usb_device_connection_t *wire;
     
    8665        size_t max_packet_size;
    8766
    88         /** Session to the host controller.
    89          * NULL when no session is active.
    90          * It is an error to access this member without @c hc_sess_mutex
    91          * being locked.
    92          * If call over the phone is to be made, it must be preceeded by
    93          * call to pipe_add_ref() [internal libusb function].
    94          */
    95         async_sess_t *hc_sess;
    96 
    97         /** Guard for serialization of requests over the session. */
    98         fibril_mutex_t hc_sess_mutex;
    99 
    100         /** Number of active transfers over the pipe. */
    101         int refcount;
    102         /** Number of failed attempts to open the HC phone.
    103          * When user requests usb_pipe_start_long_transfer() and the operation
    104          * fails, there is no way to report this to the user.
    105          * That the soft reference counter is increased to record the attempt.
    106          * When the user then request e.g. usb_pipe_read(), it will try to
    107          * add reference as well.
    108          * If that fails, it is reported to the user. If it is okay, the
    109          * real reference counter is incremented.
    110          * The problem might arise when ending the long transfer (since
    111          * the number of references would be only 1, but logically it shall be
    112          * two).
    113          * Decrementing the soft counter first shall solve this.
    114          */
    115         int refcount_soft;
    116 
    11767        /** Whether to automatically reset halt on the endpoint.
    11868         * Valid only for control endpoint zero.
     
    12070        bool auto_reset_halt;
    12171} usb_pipe_t;
    122 
    12372
    12473/** Description of endpoint characteristics. */
     
    156105} usb_endpoint_mapping_t;
    157106
    158 int usb_device_connection_initialize_on_default_address(
    159     usb_device_connection_t *, usb_hc_connection_t *);
    160 int usb_device_connection_initialize_from_device(usb_device_connection_t *,
    161     const ddf_dev_t *);
    162 int usb_device_connection_initialize(usb_device_connection_t *,
    163     devman_handle_t, usb_address_t);
    164 
    165 int usb_device_get_assigned_interface(const ddf_dev_t *);
    166 
    167107int usb_pipe_initialize(usb_pipe_t *, usb_device_connection_t *,
    168108    usb_endpoint_t, usb_transfer_type_t, size_t, usb_direction_t);
    169109int usb_pipe_initialize_default_control(usb_pipe_t *,
    170110    usb_device_connection_t *);
     111
    171112int usb_pipe_probe_default_control(usb_pipe_t *);
    172113int usb_pipe_initialize_from_configuration(usb_endpoint_mapping_t *,
    173114    size_t, const uint8_t *, size_t, usb_device_connection_t *);
    174 int usb_pipe_register(usb_pipe_t *, unsigned int, usb_hc_connection_t *);
    175 int usb_pipe_unregister(usb_pipe_t *, usb_hc_connection_t *);
    176115
    177 void usb_pipe_start_long_transfer(usb_pipe_t *);
    178 void usb_pipe_end_long_transfer(usb_pipe_t *);
     116int usb_pipe_register(usb_pipe_t *, unsigned);
     117int usb_pipe_unregister(usb_pipe_t *);
     118
     119int usb_pipe_start_long_transfer(usb_pipe_t *);
     120int usb_pipe_end_long_transfer(usb_pipe_t *);
    179121
    180122int usb_pipe_read(usb_pipe_t *, void *, size_t, size_t *);
Note: See TracChangeset for help on using the changeset viewer.