Ignore:
File:
1 edited

Legend:

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

    rd930980 rdcffe95  
    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
     
    5149
    5250static int ehci_dev_add(ddf_dev_t *device);
    53 
     51/*----------------------------------------------------------------------------*/
    5452static driver_ops_t ehci_driver_ops = {
    5553        .dev_add = ehci_dev_add,
    5654};
    57 
     55/*----------------------------------------------------------------------------*/
    5856static driver_t ehci_driver = {
    5957        .name = NAME,
     
    6462};
    6563
    66 
     64/*----------------------------------------------------------------------------*/
    6765/** Initializes a new ddf driver instance of EHCI hcd.
    6866 *
     
    7270static int ehci_dev_add(ddf_dev_t *device)
    7371{
    74         ddf_fun_t *hc_fun = NULL;
    75         bool fun_bound = false;
    76 
    7772        assert(device);
     73#define CHECK_RET_RETURN(ret, message...) \
     74if (ret != EOK) { \
     75        usb_log_error(message); \
     76        return ret; \
     77}
    7878
    7979        uintptr_t reg_base = 0;
     
    8181        int irq = 0;
    8282
    83         int rc = get_my_registers(device, &reg_base, &reg_size, &irq);
    84         if (rc != EOK) {
    85                 usb_log_error("Failed to get memory addresses for %" PRIun
    86                     ": %s.\n", ddf_dev_get_handle(device), str_error(rc));
    87                 goto error;
    88         }
    89 
     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            device->handle, str_error(ret));
    9087        usb_log_info("Memory mapped regs at 0x%" PRIxn " (size %zu), IRQ %d.\n",
    9188            reg_base, reg_size, irq);
    9289
    93         rc = disable_legacy(device, reg_base, reg_size);
    94         if (rc != EOK) {
    95                 usb_log_error("Failed to disable legacy USB: %s.\n",
    96                     str_error(rc));
    97                 goto error;
    98         }
     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));
    9993
    100         hc_fun = ddf_fun_create(device, fun_exposed, "ehci_hc");
     94        ddf_fun_t *hc_fun = ddf_fun_create(device, fun_exposed, "ehci_hc");
    10195        if (hc_fun == NULL) {
    10296                usb_log_error("Failed to create EHCI function.\n");
    103                 rc = ENOMEM;
    104                 goto error;
     97                return ENOMEM;
    10598        }
    106 
    10799        hcd_t *ehci_hc = ddf_fun_data_alloc(hc_fun, sizeof(hcd_t));
    108100        if (ehci_hc == NULL) {
    109101                usb_log_error("Failed to alloc generic HC driver.\n");
    110                 rc = ENOMEM;
    111                 goto error;
     102                return ENOMEM;
    112103        }
    113 
    114104        /* High Speed, no bandwidth */
    115105        hcd_init(ehci_hc, USB_SPEED_HIGH, 0, NULL);
    116         ddf_fun_set_ops(hc_fun,  &hc_ops);
     106        hc_fun->ops = &hc_ops;
    117107
    118         rc = ddf_fun_bind(hc_fun);
    119         if (rc != EOK) {
    120                 usb_log_error("Failed to bind EHCI function: %s.\n",
    121                     str_error(rc));
    122                 goto error;
    123         }
    124 
    125         fun_bound = true;
    126 
    127         rc = ddf_fun_add_to_category(hc_fun, USB_HC_CATEGORY);
    128         if (rc != EOK) {
    129                 usb_log_error("Failed to add EHCI to HC class: %s.\n",
    130                     str_error(rc));
    131                 goto error;
    132         }
     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));
    133116
    134117        usb_log_info("Controlling new EHCI device `%s' (handle %" PRIun ").\n",
    135             ddf_dev_get_name(device), ddf_dev_get_handle(device));
     118            device->name, device->handle);
    136119
    137120        return EOK;
    138 error:
    139         if (fun_bound)
    140                 ddf_fun_unbind(hc_fun);
    141         if (hc_fun != NULL)
    142                 ddf_fun_destroy(hc_fun);
    143         return rc;
     121#undef CHECK_RET_RETURN
    144122}
    145 
     123/*----------------------------------------------------------------------------*/
    146124/** Initializes global driver structures (NONE).
    147125 *
     
    154132int main(int argc, char *argv[])
    155133{
    156         log_init(NAME);
     134        usb_log_enable(USB_LOG_LEVEL_DEFAULT, NAME);
    157135        return ddf_driver_main(&ehci_driver);
    158136}
Note: See TracChangeset for help on using the changeset viewer.