Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/drv/generic/remote_usbhc.c

    r1e64b250 r93f8da1  
    3333 */
    3434
     35#include <ipc/ipc.h>
    3536#include <async.h>
    3637#include <errno.h>
     
    4243
    4344static void remote_usbhc_get_address(device_t *, void *, ipc_callid_t, ipc_call_t *);
     45static void remote_usbhc_get_buffer(device_t *, void *, ipc_callid_t, ipc_call_t *);
    4446static void remote_usbhc_interrupt_out(device_t *, void *, ipc_callid_t, ipc_call_t *);
    4547static void remote_usbhc_interrupt_in(device_t *, void *, ipc_callid_t, ipc_call_t *);
     
    6365        remote_usbhc_get_address,
    6466
     67        remote_usbhc_get_buffer,
     68
    6569        remote_usbhc_reserve_default_address,
    6670        remote_usbhc_release_default_address,
     
    9599typedef struct {
    96100        ipc_callid_t caller;
    97         ipc_callid_t data_caller;
    98101        void *buffer;
    99102        void *setup_packet;
     
    125128
    126129        trans->caller = caller;
    127         trans->data_caller = 0;
    128130        trans->buffer = NULL;
    129131        trans->setup_packet = NULL;
     
    139141
    140142        if (!usb_iface->tell_address) {
    141                 async_answer_0(callid, ENOTSUP);
     143                ipc_answer_0(callid, ENOTSUP);
    142144                return;
    143145        }
     
    148150        int rc = usb_iface->tell_address(device, handle, &address);
    149151        if (rc != EOK) {
    150                 async_answer_0(callid, rc);
     152                ipc_answer_0(callid, rc);
    151153        } else {
    152                 async_answer_1(callid, EOK, address);
    153         }
     154                ipc_answer_1(callid, EOK, address);
     155        }
     156}
     157
     158void remote_usbhc_get_buffer(device_t *device, void *iface,
     159    ipc_callid_t callid, ipc_call_t *call)
     160{
     161        sysarg_t buffer_hash = DEV_IPC_GET_ARG1(*call);
     162        async_transaction_t * trans = (async_transaction_t *)buffer_hash;
     163        if (trans == NULL) {
     164                ipc_answer_0(callid, ENOENT);
     165                return;
     166        }
     167        if (trans->buffer == NULL) {
     168                ipc_answer_0(callid, EINVAL);
     169                async_transaction_destroy(trans);
     170                return;
     171        }
     172
     173        ipc_callid_t cid;
     174        size_t accepted_size;
     175        if (!async_data_read_receive(&cid, &accepted_size)) {
     176                ipc_answer_0(callid, EINVAL);
     177                async_transaction_destroy(trans);
     178                return;
     179        }
     180
     181        if (accepted_size > trans->size) {
     182                accepted_size = trans->size;
     183        }
     184        async_data_read_finalize(cid, trans->buffer, accepted_size);
     185
     186        ipc_answer_1(callid, EOK, accepted_size);
     187
     188        async_transaction_destroy(trans);
    154189}
    155190
     
    160195
    161196        if (!usb_iface->reserve_default_address) {
    162                 async_answer_0(callid, ENOTSUP);
     197                ipc_answer_0(callid, ENOTSUP);
    163198                return;
    164199        }
     
    166201        int rc = usb_iface->reserve_default_address(device);
    167202
    168         async_answer_0(callid, rc);
     203        ipc_answer_0(callid, rc);
    169204}
    170205
     
    175210
    176211        if (!usb_iface->release_default_address) {
    177                 async_answer_0(callid, ENOTSUP);
     212                ipc_answer_0(callid, ENOTSUP);
    178213                return;
    179214        }
     
    181216        int rc = usb_iface->release_default_address(device);
    182217
    183         async_answer_0(callid, rc);
     218        ipc_answer_0(callid, rc);
    184219}
    185220
     
    190225
    191226        if (!usb_iface->request_address) {
    192                 async_answer_0(callid, ENOTSUP);
     227                ipc_answer_0(callid, ENOTSUP);
    193228                return;
    194229        }
     
    197232        int rc = usb_iface->request_address(device, &address);
    198233        if (rc != EOK) {
    199                 async_answer_0(callid, rc);
     234                ipc_answer_0(callid, rc);
    200235        } else {
    201                 async_answer_1(callid, EOK, (sysarg_t) address);
     236                ipc_answer_1(callid, EOK, (sysarg_t) address);
    202237        }
    203238}
     
    209244
    210245        if (!usb_iface->bind_address) {
    211                 async_answer_0(callid, ENOTSUP);
     246                ipc_answer_0(callid, ENOTSUP);
    212247                return;
    213248        }
     
    218253        int rc = usb_iface->bind_address(device, address, handle);
    219254
    220         async_answer_0(callid, rc);
     255        ipc_answer_0(callid, rc);
    221256}
    222257
     
    227262
    228263        if (!usb_iface->release_address) {
    229                 async_answer_0(callid, ENOTSUP);
     264                ipc_answer_0(callid, ENOTSUP);
    230265                return;
    231266        }
     
    235270        int rc = usb_iface->release_address(device, address);
    236271
    237         async_answer_0(callid, rc);
     272        ipc_answer_0(callid, rc);
    238273}
    239274
     
    244279        async_transaction_t *trans = (async_transaction_t *)arg;
    245280
    246         async_answer_0(trans->caller, outcome);
     281        ipc_answer_0(trans->caller, outcome);
    247282
    248283        async_transaction_destroy(trans);
     
    255290
    256291        if (outcome != USB_OUTCOME_OK) {
    257                 async_answer_0(trans->caller, outcome);
     292                ipc_answer_0(trans->caller, outcome);
    258293                async_transaction_destroy(trans);
    259294                return;
     
    261296
    262297        trans->size = actual_size;
    263 
    264         if (trans->data_caller) {
    265                 async_data_read_finalize(trans->data_caller,
    266                     trans->buffer, actual_size);
    267         }
    268 
    269         async_answer_0(trans->caller, USB_OUTCOME_OK);
    270 
    271         async_transaction_destroy(trans);
     298        ipc_answer_1(trans->caller, USB_OUTCOME_OK, (sysarg_t)trans);
    272299}
    273300
     
    284311{
    285312        if (!transfer_func) {
    286                 async_answer_0(callid, ENOTSUP);
     313                ipc_answer_0(callid, ENOTSUP);
    287314                return;
    288315        }
     
    302329
    303330                if (rc != EOK) {
    304                         async_answer_0(callid, rc);
     331                        ipc_answer_0(callid, rc);
    305332                        return;
    306333                }
     
    312339                        free(buffer);
    313340                }
    314                 async_answer_0(callid, ENOMEM);
     341                ipc_answer_0(callid, ENOMEM);
    315342                return;
    316343        }
     
    323350
    324351        if (rc != EOK) {
    325                 async_answer_0(callid, rc);
     352                ipc_answer_0(callid, rc);
    326353                async_transaction_destroy(trans);
    327354        }
     
    340367{
    341368        if (!transfer_func) {
    342                 async_answer_0(callid, ENOTSUP);
     369                ipc_answer_0(callid, ENOTSUP);
    343370                return;
    344371        }
     
    350377        };
    351378
    352         ipc_callid_t data_callid;
    353         if (!async_data_read_receive(&data_callid, &len)) {
    354                 async_answer_0(callid, EPARTY);
    355                 return;
    356         }
    357 
    358379        async_transaction_t *trans = async_transaction_create(callid);
    359380        if (trans == NULL) {
    360                 async_answer_0(callid, ENOMEM);
    361                 return;
    362         }
    363         trans->data_caller = data_callid;
     381                ipc_answer_0(callid, ENOMEM);
     382                return;
     383        }
    364384        trans->buffer = malloc(len);
    365385        trans->size = len;
     
    369389
    370390        if (rc != EOK) {
    371                 async_answer_0(callid, rc);
     391                ipc_answer_0(callid, rc);
    372392                async_transaction_destroy(trans);
    373393        }
     
    394414                case USB_DIRECTION_IN:
    395415                        if (!transfer_in_func) {
    396                                 async_answer_0(callid, ENOTSUP);
     416                                ipc_answer_0(callid, ENOTSUP);
    397417                                return;
    398418                        }
     
    400420                case USB_DIRECTION_OUT:
    401421                        if (!transfer_out_func) {
    402                                 async_answer_0(callid, ENOTSUP);
     422                                ipc_answer_0(callid, ENOTSUP);
    403423                                return;
    404424                        }
     
    416436        async_transaction_t *trans = async_transaction_create(callid);
    417437        if (trans == NULL) {
    418                 async_answer_0(callid, ENOMEM);
     438                ipc_answer_0(callid, ENOMEM);
    419439                return;
    420440        }
     
    436456
    437457        if (rc != EOK) {
    438                 async_answer_0(callid, rc);
     458                ipc_answer_0(callid, rc);
    439459                async_transaction_destroy(trans);
    440460        }
     
    529549
    530550        if (!usb_iface->control_write) {
    531                 async_answer_0(callid, ENOTSUP);
     551                ipc_answer_0(callid, ENOTSUP);
    532552                return;
    533553        }
     
    548568            1, USB_MAX_PAYLOAD_SIZE, 0, &setup_packet_len);
    549569        if (rc != EOK) {
    550                 async_answer_0(callid, rc);
     570                ipc_answer_0(callid, rc);
    551571                return;
    552572        }
     
    554574            1, USB_MAX_PAYLOAD_SIZE, 0, &data_buffer_len);
    555575        if (rc != EOK) {
    556                 async_answer_0(callid, rc);
     576                ipc_answer_0(callid, rc);
    557577                free(setup_packet);
    558578                return;
     
    561581        async_transaction_t *trans = async_transaction_create(callid);
    562582        if (trans == NULL) {
    563                 async_answer_0(callid, ENOMEM);
     583                ipc_answer_0(callid, ENOMEM);
    564584                free(setup_packet);
    565585                free(data_buffer);
     
    576596
    577597        if (rc != EOK) {
    578                 async_answer_0(callid, rc);
     598                ipc_answer_0(callid, rc);
    579599                async_transaction_destroy(trans);
    580600        }
     
    589609
    590610        if (!usb_iface->control_read) {
    591                 async_answer_0(callid, ENOTSUP);
     611                ipc_answer_0(callid, ENOTSUP);
    592612                return;
    593613        }
     
    607627            1, USB_MAX_PAYLOAD_SIZE, 0, &setup_packet_len);
    608628        if (rc != EOK) {
    609                 async_answer_0(callid, rc);
    610                 return;
    611         }
    612 
    613         ipc_callid_t data_callid;
    614         if (!async_data_read_receive(&data_callid, &data_len)) {
    615                 async_answer_0(callid, EPARTY);
     629                ipc_answer_0(callid, rc);
     630                return;
     631        }
     632
     633        async_transaction_t *trans = async_transaction_create(callid);
     634        if (trans == NULL) {
     635                ipc_answer_0(callid, ENOMEM);
    616636                free(setup_packet);
    617637                return;
    618638        }
    619 
    620         async_transaction_t *trans = async_transaction_create(callid);
    621         if (trans == NULL) {
    622                 async_answer_0(callid, ENOMEM);
    623                 free(setup_packet);
    624                 return;
    625         }
    626         trans->data_caller = data_callid;
    627639        trans->setup_packet = setup_packet;
    628640        trans->size = data_len;
    629641        trans->buffer = malloc(data_len);
    630642        if (trans->buffer == NULL) {
    631                 async_answer_0(callid, ENOMEM);
     643                ipc_answer_0(callid, ENOMEM);
    632644                async_transaction_destroy(trans);
    633645                return;
     
    640652
    641653        if (rc != EOK) {
    642                 async_answer_0(callid, rc);
     654                ipc_answer_0(callid, rc);
    643655                async_transaction_destroy(trans);
    644656        }
Note: See TracChangeset for help on using the changeset viewer.