Changeset 79ae36dd in mainline for uspace/drv/vhc/transfer.c


Ignore:
Timestamp:
2011-06-08T19:01:55Z (13 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
0eff68e
Parents:
764d71e
Message:

new async framework with integrated exchange tracking

  • strict isolation between low-level IPC and high-level async framework with integrated exchange tracking
    • each IPC connection is represented by an async_sess_t structure
    • each IPC exchange is represented by an async_exch_t structure
    • exchange management is either based on atomic messages (EXCHANGE_ATOMIC), locking (EXCHANGE_SERIALIZE) or connection cloning (EXCHANGE_CLONE)
  • async_obsolete: temporary compatibility layer to keep old async clients working (several pieces of code are currently broken, but only non-essential functionality)
  • IPC_M_PHONE_HANGUP is now method no. 0 (for elegant boolean evaluation)
  • IPC_M_DEBUG_ALL has been renamed to IPC_M_DEBUG
  • IPC_M_PING has been removed (VFS protocol now has VFS_IN_PING)
  • console routines in libc have been rewritten for better abstraction
  • additional use for libc-private header files (FILE structure opaque to the client)
  • various cstyle changes (typos, indentation, missing externs in header files, improved comments, etc.)
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/vhc/transfer.c

    r764d71e r79ae36dd  
     1/*
     2 * Copyright (c) 2011 Vojtech Horky
     3 * All rights reserved.
     4 *
     5 * Redistribution and use in source and binary forms, with or without
     6 * modification, are permitted provided that the following conditions
     7 * are met:
     8 *
     9 * - Redistributions of source code must retain the above copyright
     10 *   notice, this list of conditions and the following disclaimer.
     11 * - Redistributions in binary form must reproduce the above copyright
     12 *   notice, this list of conditions and the following disclaimer in the
     13 *   documentation and/or other materials provided with the distribution.
     14 * - The name of the author may not be used to endorse or promote products
     15 *   derived from this software without specific prior written permission.
     16 *
     17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27 */
     28
    129#include <errno.h>
    230#include <str_error.h>
     
    123151
    124152static int process_transfer_remote(vhc_transfer_t *transfer,
    125     int phone, size_t *actual_data_size)
     153    async_sess_t *sess, size_t *actual_data_size)
    126154{
    127155        int rc;
     
    129157        if (transfer->transfer_type == USB_TRANSFER_CONTROL) {
    130158                if (transfer->direction == USB_DIRECTION_IN) {
    131                         rc = usbvirt_ipc_send_control_read(phone,
    132                             transfer->setup_buffer, transfer->setup_buffer_size,
    133                             transfer->data_buffer, transfer->data_buffer_size,
    134                             actual_data_size);
    135                 } else {
    136                         assert(transfer->direction == USB_DIRECTION_OUT);
    137                         rc = usbvirt_ipc_send_control_write(phone,
    138                             transfer->setup_buffer, transfer->setup_buffer_size,
    139                             transfer->data_buffer, transfer->data_buffer_size);
    140                 }
    141         } else {
    142                 if (transfer->direction == USB_DIRECTION_IN) {
    143                         rc = usbvirt_ipc_send_data_in(phone, transfer->endpoint,
     159                        rc = usbvirt_ipc_send_control_read(sess,
     160                            transfer->setup_buffer, transfer->setup_buffer_size,
     161                            transfer->data_buffer, transfer->data_buffer_size,
     162                            actual_data_size);
     163                } else {
     164                        assert(transfer->direction == USB_DIRECTION_OUT);
     165                        rc = usbvirt_ipc_send_control_write(sess,
     166                            transfer->setup_buffer, transfer->setup_buffer_size,
     167                            transfer->data_buffer, transfer->data_buffer_size);
     168                }
     169        } else {
     170                if (transfer->direction == USB_DIRECTION_IN) {
     171                        rc = usbvirt_ipc_send_data_in(sess, transfer->endpoint,
    144172                            transfer->transfer_type,
    145173                            transfer->data_buffer, transfer->data_buffer_size,
     
    147175                } else {
    148176                        assert(transfer->direction == USB_DIRECTION_OUT);
    149                         rc = usbvirt_ipc_send_data_out(phone, transfer->endpoint,
     177                        rc = usbvirt_ipc_send_data_out(sess, transfer->endpoint,
    150178                            transfer->transfer_type,
    151179                            transfer->data_buffer, transfer->data_buffer_size);
     
    206234                int rc = EOK;
    207235                size_t data_transfer_size = 0;
    208                 if (dev->dev_phone > 0) {
    209                         rc = process_transfer_remote(transfer, dev->dev_phone,
     236                if (dev->dev_sess) {
     237                        rc = process_transfer_remote(transfer, dev->dev_sess,
    210238                            &data_transfer_size);
    211239                } else if (dev->dev_local != NULL) {
Note: See TracChangeset for help on using the changeset viewer.