Ignore:
File:
1 edited

Legend:

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

    r7de1988c r920d0fc  
    3333 * Main routines of EHCI driver.
    3434 */
    35 
    3635#include <ddf/driver.h>
    3736#include <ddf/interrupt.h>
    3837#include <device/hw_res.h>
    3938#include <errno.h>
    40 #include <stdbool.h>
    4139#include <str_error.h>
    4240
     
    7270static int ehci_dev_add(ddf_dev_t *device)
    7371{
    74         ddf_fun_t *hc_fun = NULL;
    75         bool fun_bound = false;
     72        assert(device);
     73#define CHECK_RET_RETURN(ret, message...) \
     74if (ret != EOK) { \
     75        usb_log_error(message); \
     76        return ret; \
     77}
    7678
    77         assert(device);
    78 
    79         addr_range_t reg_range;
     79        uintptr_t reg_base = 0;
     80        size_t reg_size = 0;
    8081        int irq = 0;
    8182
    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         }
     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);
    8889
    89         usb_log_info("Memory mapped regs at %p (size %zu), IRQ %d.\n",
    90             RNGABSPTR(reg_range), RNGSZ(reg_range), irq);
     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));
    9193
    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");
     94        ddf_fun_t *hc_fun = ddf_fun_create(device, fun_exposed, "ehci_hc");
    10095        if (hc_fun == NULL) {
    10196                usb_log_error("Failed to create EHCI function.\n");
    102                 rc = ENOMEM;
    103                 goto error;
     97                return ENOMEM;
    10498        }
    105 
    10699        hcd_t *ehci_hc = ddf_fun_data_alloc(hc_fun, sizeof(hcd_t));
    107100        if (ehci_hc == NULL) {
    108101                usb_log_error("Failed to alloc generic HC driver.\n");
    109                 rc = ENOMEM;
    110                 goto error;
     102                return ENOMEM;
    111103        }
    112 
    113104        /* High Speed, no bandwidth */
    114105        hcd_init(ehci_hc, USB_SPEED_HIGH, 0, NULL);
    115106        ddf_fun_set_ops(hc_fun,  &hc_ops);
    116107
    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         }
     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));
    132116
    133117        usb_log_info("Controlling new EHCI device `%s' (handle %" PRIun ").\n",
     
    135119
    136120        return EOK;
    137 error:
    138         if (fun_bound)
    139                 ddf_fun_unbind(hc_fun);
    140         if (hc_fun != NULL)
    141                 ddf_fun_destroy(hc_fun);
    142         return rc;
     121#undef CHECK_RET_RETURN
    143122}
    144123
Note: See TracChangeset for help on using the changeset viewer.