Ignore:
File:
1 edited

Legend:

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

    r920d0fc r7de1988c  
    3333 * Main routines of EHCI driver.
    3434 */
     35
    3536#include <ddf/driver.h>
    3637#include <ddf/interrupt.h>
    3738#include <device/hw_res.h>
    3839#include <errno.h>
     40#include <stdbool.h>
    3941#include <str_error.h>
    4042
     
    7072static int ehci_dev_add(ddf_dev_t *device)
    7173{
     74        ddf_fun_t *hc_fun = NULL;
     75        bool fun_bound = false;
     76
    7277        assert(device);
    73 #define CHECK_RET_RETURN(ret, message...) \
    74 if (ret != EOK) { \
    75         usb_log_error(message); \
    76         return ret; \
    77 }
    7878
    79         uintptr_t reg_base = 0;
    80         size_t reg_size = 0;
     79        addr_range_t reg_range;
    8180        int irq = 0;
    8281
    83         int ret = get_my_registers(device, &reg_base, &reg_size, &irq);
    84         CHECK_RET_RETURN(ret,
    85             "Failed to get memory addresses for %" PRIun ": %s.\n",
    86             ddf_dev_get_handle(device), str_error(ret));
    87         usb_log_info("Memory mapped regs at 0x%" PRIxn " (size %zu), IRQ %d.\n",
    88             reg_base, reg_size, irq);
     82        int rc = get_my_registers(device, &reg_range, &irq);
     83        if (rc != EOK) {
     84                usb_log_error("Failed to get memory addresses for %" PRIun
     85                    ": %s.\n", ddf_dev_get_handle(device), str_error(rc));
     86                goto error;
     87        }
    8988
    90         ret = disable_legacy(device, reg_base, reg_size);
    91         CHECK_RET_RETURN(ret,
    92             "Failed to disable legacy USB: %s.\n", str_error(ret));
     89        usb_log_info("Memory mapped regs at %p (size %zu), IRQ %d.\n",
     90            RNGABSPTR(reg_range), RNGSZ(reg_range), irq);
    9391
    94         ddf_fun_t *hc_fun = ddf_fun_create(device, fun_exposed, "ehci_hc");
     92        rc = disable_legacy(device, &reg_range);
     93        if (rc != EOK) {
     94                usb_log_error("Failed to disable legacy USB: %s.\n",
     95                    str_error(rc));
     96                goto error;
     97        }
     98
     99        hc_fun = ddf_fun_create(device, fun_exposed, "ehci_hc");
    95100        if (hc_fun == NULL) {
    96101                usb_log_error("Failed to create EHCI function.\n");
    97                 return ENOMEM;
     102                rc = ENOMEM;
     103                goto error;
    98104        }
     105
    99106        hcd_t *ehci_hc = ddf_fun_data_alloc(hc_fun, sizeof(hcd_t));
    100107        if (ehci_hc == NULL) {
    101108                usb_log_error("Failed to alloc generic HC driver.\n");
    102                 return ENOMEM;
     109                rc = ENOMEM;
     110                goto error;
    103111        }
     112
    104113        /* High Speed, no bandwidth */
    105114        hcd_init(ehci_hc, USB_SPEED_HIGH, 0, NULL);
    106115        ddf_fun_set_ops(hc_fun,  &hc_ops);
    107116
    108         ret = ddf_fun_bind(hc_fun);
    109         CHECK_RET_RETURN(ret,
    110             "Failed to bind EHCI function: %s.\n",
    111             str_error(ret));
    112         ret = ddf_fun_add_to_category(hc_fun, USB_HC_CATEGORY);
    113         CHECK_RET_RETURN(ret,
    114             "Failed to add EHCI to HC class: %s.\n",
    115             str_error(ret));
     117        rc = ddf_fun_bind(hc_fun);
     118        if (rc != EOK) {
     119                usb_log_error("Failed to bind EHCI function: %s.\n",
     120                    str_error(rc));
     121                goto error;
     122        }
     123
     124        fun_bound = true;
     125
     126        rc = ddf_fun_add_to_category(hc_fun, USB_HC_CATEGORY);
     127        if (rc != EOK) {
     128                usb_log_error("Failed to add EHCI to HC class: %s.\n",
     129                    str_error(rc));
     130                goto error;
     131        }
    116132
    117133        usb_log_info("Controlling new EHCI device `%s' (handle %" PRIun ").\n",
     
    119135
    120136        return EOK;
    121 #undef CHECK_RET_RETURN
     137error:
     138        if (fun_bound)
     139                ddf_fun_unbind(hc_fun);
     140        if (hc_fun != NULL)
     141                ddf_fun_destroy(hc_fun);
     142        return rc;
    122143}
    123144
Note: See TracChangeset for help on using the changeset viewer.