Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/bus/usb/ohci/ohci.c

    r8b54fe6 r1dc4a5e  
    4242
    4343#include "ohci.h"
     44#include "iface.h"
    4445#include "pci.h"
    4546#include "hc.h"
     47#include "root_hub.h"
    4648
    4749typedef struct ohci {
     
    5052
    5153        hc_t hc;
     54        rh_t rh;
    5255} ohci_t;
    5356
     
    8689{
    8790        assert(fun);
    88         usb_device_manager_t *manager =
    89             &dev_to_ohci(fun->dev)->hc.generic.dev_manager;
    90 
    91         const usb_address_t addr = usb_device_manager_find(manager, handle);
     91        usb_device_keeper_t *manager = &dev_to_ohci(fun->dev)->hc.manager;
     92
     93        usb_address_t addr = usb_device_keeper_find(manager, handle);
    9294        if (addr < 0) {
    9395                return addr;
     
    127129/** Standard USB HC options (HC interface) */
    128130static ddf_dev_ops_t hc_ops = {
    129         .interfaces[USBHC_DEV_IFACE] = &hcd_iface,
     131        .interfaces[USBHC_DEV_IFACE] = &hc_iface, /* see iface.h/c */
    130132};
    131133/*----------------------------------------------------------------------------*/
     
    148150int device_setup_ohci(ddf_dev_t *device)
    149151{
    150         assert(device);
    151 
    152152        ohci_t *instance = malloc(sizeof(ohci_t));
    153153        if (instance == NULL) {
     
    155155                return ENOMEM;
    156156        }
    157         instance->rh_fun = NULL;
    158         instance->hc_fun = NULL;
    159157
    160158#define CHECK_RET_DEST_FREE_RETURN(ret, message...) \
    161159if (ret != EOK) { \
    162160        if (instance->hc_fun) { \
     161                instance->hc_fun->ops = NULL; \
     162                instance->hc_fun->driver_data = NULL; \
    163163                ddf_fun_destroy(instance->hc_fun); \
    164164        } \
    165165        if (instance->rh_fun) { \
     166                instance->rh_fun->ops = NULL; \
     167                instance->rh_fun->driver_data = NULL; \
    166168                ddf_fun_destroy(instance->rh_fun); \
    167169        } \
    168170        free(instance); \
     171        device->driver_data = NULL; \
    169172        usb_log_error(message); \
    170173        return ret; \
    171174} else (void)0
    172175
     176        instance->rh_fun = NULL;
    173177        instance->hc_fun = ddf_fun_create(device, fun_exposed, "ohci_hc");
    174178        int ret = instance->hc_fun ? EOK : ENOMEM;
     
    190194        ret = pci_get_my_registers(device, &reg_base, &reg_size, &irq);
    191195        CHECK_RET_DEST_FREE_RETURN(ret,
    192             "Failed to get register memory addresses for %" PRIun ": %s.\n",
     196            "Failed to get memory addresses for %" PRIun ": %s.\n",
    193197            device->handle, str_error(ret));
    194198        usb_log_debug("Memory mapped regs at %p (size %zu), IRQ %d.\n",
     
    197201        const size_t cmd_count = hc_irq_cmd_count();
    198202        irq_cmd_t irq_cmds[cmd_count];
    199         irq_code_t irq_code = { .cmdcount = cmd_count, .cmds = irq_cmds };
    200 
    201203        ret =
    202204            hc_get_irq_commands(irq_cmds, sizeof(irq_cmds), reg_base, reg_size);
     
    204206            "Failed to generate IRQ commands: %s.\n", str_error(ret));
    205207
     208        irq_code_t irq_code = { .cmdcount = cmd_count, .cmds = irq_cmds };
    206209
    207210        /* Register handler to avoid interrupt lockup */
     
    231234#define CHECK_RET_FINI_RETURN(ret, message...) \
    232235if (ret != EOK) { \
     236        unregister_interrupt_handler(device, irq); \
    233237        hc_fini(&instance->hc); \
    234         unregister_interrupt_handler(device, irq); \
    235238        CHECK_RET_DEST_FREE_RETURN(ret, message); \
    236239} else (void)0
     
    245248            "Failed to add OHCI to HC class: %s.\n", str_error(ret));
    246249
    247         ret = hc_register_hub(&instance->hc, instance->rh_fun);
    248         CHECK_RET_FINI_RETURN(ret,
    249             "Failed to register OHCI root hub: %s.\n", str_error(ret));
    250         return ret;
    251 
     250        hc_register_hub(&instance->hc, instance->rh_fun);
     251        return EOK;
     252
     253#undef CHECK_RET_DEST_FUN_RETURN
    252254#undef CHECK_RET_FINI_RETURN
    253255}
Note: See TracChangeset for help on using the changeset viewer.