Ignore:
File:
1 edited

Legend:

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

    r93f8da1 r1e64b250  
    3333 */
    3434
    35 #include <ipc/ipc.h>
    3635#include <async.h>
    3736#include <errno.h>
     
    4342
    4443static void remote_usbhc_get_address(device_t *, void *, ipc_callid_t, ipc_call_t *);
    45 static void remote_usbhc_get_buffer(device_t *, void *, ipc_callid_t, ipc_call_t *);
    4644static void remote_usbhc_interrupt_out(device_t *, void *, ipc_callid_t, ipc_call_t *);
    4745static void remote_usbhc_interrupt_in(device_t *, void *, ipc_callid_t, ipc_call_t *);
     
    6563        remote_usbhc_get_address,
    6664
    67         remote_usbhc_get_buffer,
    68 
    6965        remote_usbhc_reserve_default_address,
    7066        remote_usbhc_release_default_address,
     
    9995typedef struct {
    10096        ipc_callid_t caller;
     97        ipc_callid_t data_caller;
    10198        void *buffer;
    10299        void *setup_packet;
     
    128125
    129126        trans->caller = caller;
     127        trans->data_caller = 0;
    130128        trans->buffer = NULL;
    131129        trans->setup_packet = NULL;
     
    141139
    142140        if (!usb_iface->tell_address) {
    143                 ipc_answer_0(callid, ENOTSUP);
     141                async_answer_0(callid, ENOTSUP);
    144142                return;
    145143        }
     
    150148        int rc = usb_iface->tell_address(device, handle, &address);
    151149        if (rc != EOK) {
    152                 ipc_answer_0(callid, rc);
     150                async_answer_0(callid, rc);
    153151        } else {
    154                 ipc_answer_1(callid, EOK, address);
    155         }
    156 }
    157 
    158 void 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);
     152                async_answer_1(callid, EOK, address);
     153        }
    189154}
    190155
     
    195160
    196161        if (!usb_iface->reserve_default_address) {
    197                 ipc_answer_0(callid, ENOTSUP);
     162                async_answer_0(callid, ENOTSUP);
    198163                return;
    199164        }
     
    201166        int rc = usb_iface->reserve_default_address(device);
    202167
    203         ipc_answer_0(callid, rc);
     168        async_answer_0(callid, rc);
    204169}
    205170
     
    210175
    211176        if (!usb_iface->release_default_address) {
    212                 ipc_answer_0(callid, ENOTSUP);
     177                async_answer_0(callid, ENOTSUP);
    213178                return;
    214179        }
     
    216181        int rc = usb_iface->release_default_address(device);
    217182
    218         ipc_answer_0(callid, rc);
     183        async_answer_0(callid, rc);
    219184}
    220185
     
    225190
    226191        if (!usb_iface->request_address) {
    227                 ipc_answer_0(callid, ENOTSUP);
     192                async_answer_0(callid, ENOTSUP);
    228193                return;
    229194        }
     
    232197        int rc = usb_iface->request_address(device, &address);
    233198        if (rc != EOK) {
    234                 ipc_answer_0(callid, rc);
     199                async_answer_0(callid, rc);
    235200        } else {
    236                 ipc_answer_1(callid, EOK, (sysarg_t) address);
     201                async_answer_1(callid, EOK, (sysarg_t) address);
    237202        }
    238203}
     
    244209
    245210        if (!usb_iface->bind_address) {
    246                 ipc_answer_0(callid, ENOTSUP);
     211                async_answer_0(callid, ENOTSUP);
    247212                return;
    248213        }
     
    253218        int rc = usb_iface->bind_address(device, address, handle);
    254219
    255         ipc_answer_0(callid, rc);
     220        async_answer_0(callid, rc);
    256221}
    257222
     
    262227
    263228        if (!usb_iface->release_address) {
    264                 ipc_answer_0(callid, ENOTSUP);
     229                async_answer_0(callid, ENOTSUP);
    265230                return;
    266231        }
     
    270235        int rc = usb_iface->release_address(device, address);
    271236
    272         ipc_answer_0(callid, rc);
     237        async_answer_0(callid, rc);
    273238}
    274239
     
    279244        async_transaction_t *trans = (async_transaction_t *)arg;
    280245
    281         ipc_answer_0(trans->caller, outcome);
     246        async_answer_0(trans->caller, outcome);
    282247
    283248        async_transaction_destroy(trans);
     
    290255
    291256        if (outcome != USB_OUTCOME_OK) {
    292                 ipc_answer_0(trans->caller, outcome);
     257                async_answer_0(trans->caller, outcome);
    293258                async_transaction_destroy(trans);
    294259                return;
     
    296261
    297262        trans->size = actual_size;
    298         ipc_answer_1(trans->caller, USB_OUTCOME_OK, (sysarg_t)trans);
     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);
    299272}
    300273
     
    311284{
    312285        if (!transfer_func) {
    313                 ipc_answer_0(callid, ENOTSUP);
     286                async_answer_0(callid, ENOTSUP);
    314287                return;
    315288        }
     
    329302
    330303                if (rc != EOK) {
    331                         ipc_answer_0(callid, rc);
     304                        async_answer_0(callid, rc);
    332305                        return;
    333306                }
     
    339312                        free(buffer);
    340313                }
    341                 ipc_answer_0(callid, ENOMEM);
     314                async_answer_0(callid, ENOMEM);
    342315                return;
    343316        }
     
    350323
    351324        if (rc != EOK) {
    352                 ipc_answer_0(callid, rc);
     325                async_answer_0(callid, rc);
    353326                async_transaction_destroy(trans);
    354327        }
     
    367340{
    368341        if (!transfer_func) {
    369                 ipc_answer_0(callid, ENOTSUP);
     342                async_answer_0(callid, ENOTSUP);
    370343                return;
    371344        }
     
    377350        };
    378351
     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
    379358        async_transaction_t *trans = async_transaction_create(callid);
    380359        if (trans == NULL) {
    381                 ipc_answer_0(callid, ENOMEM);
    382                 return;
    383         }
     360                async_answer_0(callid, ENOMEM);
     361                return;
     362        }
     363        trans->data_caller = data_callid;
    384364        trans->buffer = malloc(len);
    385365        trans->size = len;
     
    389369
    390370        if (rc != EOK) {
    391                 ipc_answer_0(callid, rc);
     371                async_answer_0(callid, rc);
    392372                async_transaction_destroy(trans);
    393373        }
     
    414394                case USB_DIRECTION_IN:
    415395                        if (!transfer_in_func) {
    416                                 ipc_answer_0(callid, ENOTSUP);
     396                                async_answer_0(callid, ENOTSUP);
    417397                                return;
    418398                        }
     
    420400                case USB_DIRECTION_OUT:
    421401                        if (!transfer_out_func) {
    422                                 ipc_answer_0(callid, ENOTSUP);
     402                                async_answer_0(callid, ENOTSUP);
    423403                                return;
    424404                        }
     
    436416        async_transaction_t *trans = async_transaction_create(callid);
    437417        if (trans == NULL) {
    438                 ipc_answer_0(callid, ENOMEM);
     418                async_answer_0(callid, ENOMEM);
    439419                return;
    440420        }
     
    456436
    457437        if (rc != EOK) {
    458                 ipc_answer_0(callid, rc);
     438                async_answer_0(callid, rc);
    459439                async_transaction_destroy(trans);
    460440        }
     
    549529
    550530        if (!usb_iface->control_write) {
    551                 ipc_answer_0(callid, ENOTSUP);
     531                async_answer_0(callid, ENOTSUP);
    552532                return;
    553533        }
     
    568548            1, USB_MAX_PAYLOAD_SIZE, 0, &setup_packet_len);
    569549        if (rc != EOK) {
    570                 ipc_answer_0(callid, rc);
     550                async_answer_0(callid, rc);
    571551                return;
    572552        }
     
    574554            1, USB_MAX_PAYLOAD_SIZE, 0, &data_buffer_len);
    575555        if (rc != EOK) {
    576                 ipc_answer_0(callid, rc);
     556                async_answer_0(callid, rc);
    577557                free(setup_packet);
    578558                return;
     
    581561        async_transaction_t *trans = async_transaction_create(callid);
    582562        if (trans == NULL) {
    583                 ipc_answer_0(callid, ENOMEM);
     563                async_answer_0(callid, ENOMEM);
    584564                free(setup_packet);
    585565                free(data_buffer);
     
    596576
    597577        if (rc != EOK) {
    598                 ipc_answer_0(callid, rc);
     578                async_answer_0(callid, rc);
    599579                async_transaction_destroy(trans);
    600580        }
     
    609589
    610590        if (!usb_iface->control_read) {
    611                 ipc_answer_0(callid, ENOTSUP);
     591                async_answer_0(callid, ENOTSUP);
    612592                return;
    613593        }
     
    627607            1, USB_MAX_PAYLOAD_SIZE, 0, &setup_packet_len);
    628608        if (rc != EOK) {
    629                 ipc_answer_0(callid, rc);
     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);
     616                free(setup_packet);
    630617                return;
    631618        }
     
    633620        async_transaction_t *trans = async_transaction_create(callid);
    634621        if (trans == NULL) {
    635                 ipc_answer_0(callid, ENOMEM);
     622                async_answer_0(callid, ENOMEM);
    636623                free(setup_packet);
    637624                return;
    638625        }
     626        trans->data_caller = data_callid;
    639627        trans->setup_packet = setup_packet;
    640628        trans->size = data_len;
    641629        trans->buffer = malloc(data_len);
    642630        if (trans->buffer == NULL) {
    643                 ipc_answer_0(callid, ENOMEM);
     631                async_answer_0(callid, ENOMEM);
    644632                async_transaction_destroy(trans);
    645633                return;
     
    652640
    653641        if (rc != EOK) {
    654                 ipc_answer_0(callid, rc);
     642                async_answer_0(callid, rc);
    655643                async_transaction_destroy(trans);
    656644        }
Note: See TracChangeset for help on using the changeset viewer.