Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/char/ps2mouse/ps2mouse.c

    rd87561c r68c60b0  
    3333 */
    3434
    35 #include <stdbool.h>
     35#include <bool.h>
    3636#include <errno.h>
     37#include <devman.h>
    3738#include <ddf/log.h>
    3839#include <io/keycode.h>
     
    7071#define PS2_BUTTON_MASK(button) (1 << button)
    7172
    72 #define MOUSE_READ_BYTE_TEST(sess, value_) \
     73#define MOUSE_READ_BYTE_TEST(sess, value) \
    7374do { \
    74         uint8_t value = (value_); \
    7575        uint8_t data = 0; \
    7676        const ssize_t size = chardev_read(sess, &data, 1); \
    7777        if (size != 1) { \
    78                 ddf_msg(LVL_ERROR, "Failed reading byte: %zd)", size);\
     78                ddf_msg(LVL_ERROR, "Failed reading byte: %d)", size);\
    7979                return size < 0 ? size : EIO; \
    8080        } \
    81         if (data != value) { \
     81        if (data != (value)) { \
    8282                ddf_msg(LVL_DEBUG, "Failed testing byte: got %hhx vs. %hhx)", \
    83                     data, value); \
     83                    data, (value)); \
    8484                return EIO; \
    8585        } \
    8686} while (0)
    8787
    88 #define MOUSE_WRITE_BYTE(sess, value_) \
     88#define MOUSE_WRITE_BYTE(sess, value) \
    8989do { \
    90         uint8_t value = (value_); \
    9190        uint8_t data = (value); \
    9291        const ssize_t size = chardev_write(sess, &data, 1); \
     
    115114int ps2_mouse_init(ps2_mouse_t *mouse, ddf_dev_t *dev)
    116115{
     116        assert(mouse);
     117        assert(dev);
    117118        mouse->client_sess = NULL;
    118         mouse->parent_sess = ddf_dev_parent_sess_create(dev, EXCHANGE_SERIALIZE);
     119        mouse->parent_sess = devman_parent_device_connect(EXCHANGE_SERIALIZE,
     120            dev->handle, IPC_FLAG_BLOCKING);
    119121        if (!mouse->parent_sess)
    120122                return ENOMEM;
     
    122124        mouse->mouse_fun = ddf_fun_create(dev, fun_exposed, "mouse");
    123125        if (!mouse->mouse_fun) {
     126                async_hangup(mouse->parent_sess);
    124127                return ENOMEM;
    125128        }
    126         ddf_fun_set_ops(mouse->mouse_fun, &mouse_ops);
     129        mouse->mouse_fun->ops = &mouse_ops;
     130        mouse->mouse_fun->driver_data = mouse;
    127131
    128132        int ret = ddf_fun_bind(mouse->mouse_fun);
    129133        if (ret != EOK) {
     134                async_hangup(mouse->parent_sess);
     135                mouse->mouse_fun->driver_data = NULL;
    130136                ddf_fun_destroy(mouse->mouse_fun);
    131137                return ENOMEM;
     
    134140        ret = ddf_fun_add_to_category(mouse->mouse_fun, "mouse");
    135141        if (ret != EOK) {
     142                async_hangup(mouse->parent_sess);
    136143                ddf_fun_unbind(mouse->mouse_fun);
     144                mouse->mouse_fun->driver_data = NULL;
    137145                ddf_fun_destroy(mouse->mouse_fun);
    138146                return ENOMEM;
     
    153161                ddf_msg(LVL_ERROR, "Failed to enable data reporting.");
    154162                async_exchange_end(exch);
     163                async_hangup(mouse->parent_sess);
    155164                ddf_fun_unbind(mouse->mouse_fun);
     165                mouse->mouse_fun->driver_data = NULL;
    156166                ddf_fun_destroy(mouse->mouse_fun);
    157167                return EIO;
     
    163173                ddf_msg(LVL_ERROR, "Failed to confirm data reporting: %hhx.",
    164174                    report);
     175                async_hangup(mouse->parent_sess);
    165176                ddf_fun_unbind(mouse->mouse_fun);
     177                mouse->mouse_fun->driver_data = NULL;
    166178                ddf_fun_destroy(mouse->mouse_fun);
    167179                return EIO;
     
    170182        mouse->polling_fibril = fibril_create(polling_f, mouse);
    171183        if (!mouse->polling_fibril) {
     184                async_hangup(mouse->parent_sess);
    172185                ddf_fun_unbind(mouse->mouse_fun);
     186                mouse->mouse_fun->driver_data = NULL;
    173187                ddf_fun_destroy(mouse->mouse_fun);
    174188                return ENOMEM;
     
    354368    ipc_callid_t icallid, ipc_call_t *icall)
    355369{
     370        if (fun == NULL || fun->driver_data == NULL) {
     371                ddf_msg(LVL_ERROR, "%s: Missing parameter.", __FUNCTION__);
     372                async_answer_0(icallid, EINVAL);
     373                return;
     374        }
     375
    356376        const sysarg_t method = IPC_GET_IMETHOD(*icall);
    357         ps2_mouse_t *mouse = ddf_dev_data_get(ddf_fun_get_dev(fun));
     377        ps2_mouse_t *mouse = fun->driver_data;
    358378
    359379        switch (method) {
Note: See TracChangeset for help on using the changeset viewer.