Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/bus/usb/usbhid/multimedia/multimedia.c

    r56fd7cf r9d58539  
    5454#define NAME  "multimedia-keys"
    5555
    56 
     56/*----------------------------------------------------------------------------*/
    5757/**
    5858 * Logitech UltraX device type.
     
    7070
    7171
    72 
     72/*----------------------------------------------------------------------------*/
    7373/**
    7474 * Default handler for IPC methods not handled by DDF.
     
    8686{
    8787        usb_log_debug(NAME " default_connection_handler()\n");
    88 
    89         usb_multimedia_t *multim_dev = ddf_fun_data_get(fun);
     88        if (fun == NULL || fun->driver_data == NULL) {
     89                async_answer_0(icallid, EINVAL);
     90                return;
     91        }
     92
     93        usb_multimedia_t *multim_dev = fun->driver_data;
    9094
    9195        async_sess_t *sess =
     
    102106                async_answer_0(icallid, EINVAL);
    103107}
    104 
     108/*----------------------------------------------------------------------------*/
    105109static ddf_dev_ops_t multimedia_ops = {
    106110        .default_handler = default_connection_handler
    107111};
    108 
     112/*----------------------------------------------------------------------------*/
    109113/**
    110114 * Processes key events.
     
    151155        }
    152156}
    153 
     157/*----------------------------------------------------------------------------*/
    154158int usb_multimedia_init(struct usb_hid_dev *hid_dev, void **data)
    155159{
     
    168172        }
    169173
    170         ddf_fun_set_ops(fun, &multimedia_ops);
     174        fun->ops = &multimedia_ops;
    171175
    172176        usb_multimedia_t *multim_dev =
     
    190194
    191195        usb_log_debug(NAME " function created (handle: %" PRIun ").\n",
    192             ddf_fun_get_handle(fun));
     196            fun->handle);
    193197
    194198        rc = ddf_fun_add_to_category(fun, "keyboard");
     
    199203                if (ddf_fun_unbind(fun) != EOK) {
    200204                        usb_log_error("Failed to unbind %s, won't destroy.\n",
    201                             ddf_fun_get_name(fun));
     205                            fun->name);
    202206                } else {
    203207                        ddf_fun_destroy(fun);
     
    212216        return EOK;
    213217}
    214 
     218/*----------------------------------------------------------------------------*/
    215219void usb_multimedia_deinit(struct usb_hid_dev *hid_dev, void *data)
    216220{
    217221        ddf_fun_t *fun = data;
    218 
    219         usb_multimedia_t *multim_dev = ddf_fun_data_get(fun);
    220 
    221         /* Hangup session to the console */
    222         if (multim_dev->console_sess)
    223                 async_hangup(multim_dev->console_sess);
    224         if (ddf_fun_unbind(fun) != EOK) {
    225                 usb_log_error("Failed to unbind %s, won't destroy.\n",
    226                     ddf_fun_get_name(fun));
     222        if (fun != NULL && fun->driver_data != NULL) {
     223                usb_multimedia_t *multim_dev = fun->driver_data;
     224                /* Hangup session to the console */
     225                if (multim_dev->console_sess)
     226                        async_hangup(multim_dev->console_sess);
     227                if (ddf_fun_unbind(fun) != EOK) {
     228                        usb_log_error("Failed to unbind %s, won't destroy.\n",
     229                            fun->name);
     230                } else {
     231                        usb_log_debug2("%s unbound.\n", fun->name);
     232                        /* This frees multim_dev too as it was stored in
     233                         * fun->data */
     234                        ddf_fun_destroy(fun);
     235                }
    227236        } else {
    228                 usb_log_debug2("%s unbound.\n", ddf_fun_get_name(fun));
    229                 /* This frees multim_dev too as it was stored in
    230                  * fun->data */
    231                 ddf_fun_destroy(fun);
    232         }
    233 }
    234 
     237                usb_log_error(
     238                    "Failed to deinit multimedia subdriver, data missing.\n");
     239        }
     240}
     241/*----------------------------------------------------------------------------*/
    235242bool usb_multimedia_polling_callback(struct usb_hid_dev *hid_dev, void *data)
    236243{
    237244        // TODO: checks
    238245        ddf_fun_t *fun = data;
    239         if (hid_dev == NULL) {
     246        if (hid_dev == NULL || fun == NULL || fun->driver_data == NULL) {
    240247                return false;
    241248        }
    242249
    243         usb_multimedia_t *multim_dev = ddf_fun_data_get(fun);
     250        usb_multimedia_t *multim_dev = fun->driver_data;
    244251
    245252        usb_hid_report_path_t *path = usb_hid_report_path();
Note: See TracChangeset for help on using the changeset viewer.