Ignore:
File:
1 edited

Legend:

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

    r7de1988c re991937  
    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
    4341#include <usb_iface.h>
    44 #include <usb/ddfiface.h>
    4542#include <usb/debug.h>
    46 #include <usb/host/hcd.h>
     43#include <usb/host/ddf_helpers.h>
    4744
    4845#include "res.h"
     
    6057        .driver_ops = &ehci_driver_ops
    6158};
    62 static ddf_dev_ops_t hc_ops = {
    63         .interfaces[USBHC_DEV_IFACE] = &hcd_iface,
    64 };
    6559
    6660
     
    7266static int ehci_dev_add(ddf_dev_t *device)
    7367{
    74         ddf_fun_t *hc_fun = NULL;
    75         bool fun_bound = false;
     68        assert(device);
     69#define CHECK_RET_RETURN(ret, message...) \
     70if (ret != EOK) { \
     71        usb_log_error(message); \
     72        return ret; \
     73}
    7674
    77         assert(device);
    78 
    79         addr_range_t reg_range;
     75        uintptr_t reg_base = 0;
     76        size_t reg_size = 0;
    8077        int irq = 0;
    8178
    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         }
     79        int ret = get_my_registers(device, &reg_base, &reg_size, &irq);
     80        CHECK_RET_RETURN(ret,
     81            "Failed to get memory addresses for %" PRIun ": %s.\n",
     82            ddf_dev_get_handle(device), str_error(ret));
     83        usb_log_info("Memory mapped regs at 0x%" PRIxn " (size %zu), IRQ %d.\n",
     84            reg_base, reg_size, irq);
    8885
    89         usb_log_info("Memory mapped regs at %p (size %zu), IRQ %d.\n",
    90             RNGABSPTR(reg_range), RNGSZ(reg_range), irq);
    91 
    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");
    100         if (hc_fun == NULL) {
    101                 usb_log_error("Failed to create EHCI function.\n");
    102                 rc = ENOMEM;
    103                 goto error;
    104         }
    105 
    106         hcd_t *ehci_hc = ddf_fun_data_alloc(hc_fun, sizeof(hcd_t));
    107         if (ehci_hc == NULL) {
    108                 usb_log_error("Failed to alloc generic HC driver.\n");
    109                 rc = ENOMEM;
    110                 goto error;
    111         }
     86        ret = disable_legacy(device, reg_base, reg_size);
     87        CHECK_RET_RETURN(ret,
     88            "Failed to disable legacy USB: %s.\n", str_error(ret));
    11289
    11390        /* High Speed, no bandwidth */
    114         hcd_init(ehci_hc, USB_SPEED_HIGH, 0, NULL);
    115         ddf_fun_set_ops(hc_fun,  &hc_ops);
    116 
    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         }
     91        ret = hcd_ddf_setup_hc(device, USB_SPEED_HIGH, 0, NULL);       
     92        CHECK_RET_RETURN(ret,
     93            "Failed to init generci hcd driver: %s\n", str_error(ret));
    13294
    13395        usb_log_info("Controlling new EHCI device `%s' (handle %" PRIun ").\n",
     
    13597
    13698        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;
     99#undef CHECK_RET_RETURN
    143100}
    144101
Note: See TracChangeset for help on using the changeset viewer.