Changeset 64d138b in mainline for uspace/drv/bus/usb/usbdiag/main.c


Ignore:
Timestamp:
2017-12-15T17:21:49Z (7 years ago)
Author:
Petr Mánek <petr.manek@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
73b0773
Parents:
a8723748
Message:

usbdiag: finalize IPC ops for tmon, simple demo waiting for test

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/bus/usb/usbdiag/main.c

    ra8723748 r64d138b  
    3838#include <usb/dev/driver.h>
    3939#include <usb/diag/diag.h>
     40#include <str_error.h>
    4041
    4142#include "usbdiag.h"
     
    4445#define NAME "usbdiag"
    4546
    46 static void usb_diag_test_impl(ipc_callid_t rid, ipc_call_t *request)
    47 {
    48         int x = IPC_GET_ARG1(*request);
    49         int ret = 4200 + x;
    50         async_answer_0(rid, ret);
    51 }
    52 
    5347static int device_add(usb_device_t *dev)
    5448{
     49        int rc;
    5550        usb_log_info("Adding device '%s'", usb_device_get_name(dev));
    5651
    57         int err;
     52        usb_diag_dev_t *diag_dev;
     53        if ((rc = usb_diag_dev_create(dev, &diag_dev))) {
     54                usb_log_error("Failed create device: %s.\n", str_error(rc));
     55                goto err;
     56        }
    5857
    59         usb_diag_dev_t *diag_dev;
    60         if ((err = usb_diag_dev_create(dev, &diag_dev)))
    61                 return err;
     58        if ((rc = ddf_fun_bind(diag_dev->fun))) {
     59                usb_log_error("Failed to bind DDF function: %s.\n", str_error(rc));
     60                goto err_create;
     61        }
    6262
    63         /* TODO: Register device in some list. */
    64         /* TODO: Register device DDF function. */
     63        if ((rc = ddf_fun_add_to_category(diag_dev->fun, USB_DIAG_CATEGORY))) {
     64                usb_log_error("Failed add DDF to category '"
     65                    USB_DIAG_CATEGORY "': %s.\n", str_error(rc));
     66                goto err_bind;
     67        }
    6568
    6669        return EOK;
     70
     71err_bind:
     72        ddf_fun_unbind(diag_dev->fun);
     73err_create:
     74        usb_diag_dev_destroy(diag_dev);
     75err:
     76        return rc;
    6777}
    6878
    6979static int device_remove(usb_device_t *dev)
    7080{
     81        int rc;
    7182        usb_log_info("Removing device '%s'", usb_device_get_name(dev));
    7283
     
    7485
    7586        /* TODO: Make sure nothing is going on with the device. */
    76         /* TODO: Unregister device DDF function. */
    77         /* TODO: Remove device from list */
     87
     88        if ((rc = ddf_fun_unbind(diag_dev->fun))) {
     89                usb_log_error("Failed to unbind DDF function: %s\n", str_error(rc));
     90                goto err;
     91        }
    7892
    7993        usb_diag_dev_destroy(diag_dev);
    8094
    8195        return EOK;
     96
     97err:
     98        return rc;
    8299}
    83100
     
    107124}
    108125
    109 static void connection(ipc_callid_t iid, ipc_call_t *icall, void *arg)
    110 {
    111         bool cont = true;
    112 
    113         async_answer_0(iid, EOK);
    114 
    115         while (cont) {
    116                 ipc_call_t call;
    117                 ipc_callid_t callid = async_get_call(&call);
    118 
    119                 if (!IPC_GET_IMETHOD(call))
    120                         break;
    121 
    122                 switch (IPC_GET_IMETHOD(call)) {
    123                 case USB_DIAG_IN_TEST:
    124                         usb_diag_test_impl(callid, &call);
    125                         break;
    126                 default:
    127                         async_answer_0(callid, ENOTSUP);
    128                         break;
    129                 }
    130         }
    131 }
    132 
    133 static int server_fibril(void *arg)
    134 {
    135         // async_set_client_data_constructor(NULL);
    136         // async_set_client_data_destructor(NULL);
    137         async_set_fallback_port_handler(connection, NULL);
    138         // async_event_task_subscribe();
    139         // service_register();
    140         async_manager();
    141 
    142         /* Never reached. */
    143         return EOK;
    144 }
    145 
    146126/** USB diagnostic driver ops. */
    147127static const usb_driver_ops_t diag_driver_ops = {
     
    166146        log_init(NAME);
    167147
    168         /* Start usbdiag service. */
    169         fid_t srv = fibril_create(server_fibril, NULL);
    170         if (!srv)
    171                 return ENOMEM;
    172         fibril_add_ready(srv);
    173 
    174148        return usb_driver_main(&diag_driver);
    175149}
Note: See TracChangeset for help on using the changeset viewer.