Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/uhci-hcd/main.c

    re0df6c2 rfb78ae72  
    3434#include <driver.h>
    3535#include <usb_iface.h>
     36#include <device/hw_res.h>
    3637
    3738#include <errno.h>
     
    4647#define NAME "uhci-hcd"
    4748
     49static int uhci_add_device(device_t *device);
     50static int usb_iface_get_hc_handle(device_t *dev, devman_handle_t *handle);
     51/*----------------------------------------------------------------------------*/
    4852static int usb_iface_get_hc_handle(device_t *dev, devman_handle_t *handle)
    4953{
     
    5458        return EOK;
    5559}
    56 
     60/*----------------------------------------------------------------------------*/
    5761static usb_iface_t hc_usb_iface = {
    5862        .get_hc_handle = usb_iface_get_hc_handle
    5963};
    60 
     64/*----------------------------------------------------------------------------*/
    6165static device_ops_t uhci_ops = {
    6266        .interfaces[USB_DEV_IFACE] = &hc_usb_iface,
    6367        .interfaces[USBHC_DEV_IFACE] = &uhci_iface
    6468};
     69/*----------------------------------------------------------------------------*/
     70static driver_ops_t uhci_driver_ops = {
     71        .add_device = uhci_add_device,
     72};
     73/*----------------------------------------------------------------------------*/
     74static driver_t uhci_driver = {
     75        .name = NAME,
     76        .driver_ops = &uhci_driver_ops
     77};
     78/*----------------------------------------------------------------------------*/
     79static void irq_handler(device_t *device, ipc_callid_t iid, ipc_call_t *call)
     80{
     81        assert(device);
     82        uhci_t *hc = dev_to_uhci(device);
     83        uint16_t status = IPC_GET_ARG1(*call);
     84        assert(hc);
     85        uhci_interrupt(hc, status);
     86}
     87/*----------------------------------------------------------------------------*/
     88#define CHECK_RET_RETURN(ret, message...) \
     89if (ret != EOK) { \
     90        usb_log_error(message); \
     91        return ret; \
     92}
    6593
    6694static int uhci_add_device(device_t *device)
     
    75103        int irq;
    76104
    77         int rc = pci_get_my_registers(device,
    78             &io_reg_base, &io_reg_size, &irq);
     105        int ret =
     106            pci_get_my_registers(device, &io_reg_base, &io_reg_size, &irq);
    79107
    80         if (rc != EOK) {
    81                 usb_log_error("Failed(%d) to get I/O registers addresses for device:.\n",
    82                     rc, device->handle);
    83                 return rc;
    84         }
    85 
     108        CHECK_RET_RETURN(ret,
     109            "Failed(%d) to get I/O addresses:.\n", ret, device->handle);
    86110        usb_log_info("I/O regs at 0x%X (size %zu), IRQ %d.\n",
    87111            io_reg_base, io_reg_size, irq);
    88112
     113        ret = pci_enable_interrupts(device);
     114        CHECK_RET_RETURN(ret, "Failed(%d) to get enable interrupts:\n", ret);
     115
    89116        uhci_t *uhci_hc = malloc(sizeof(uhci_t));
    90         if (!uhci_hc) {
    91                 usb_log_error("Failed to allocaete memory for uhci hcd driver.\n");
    92                 return ENOMEM;
     117        ret = (uhci_hc != NULL) ? EOK : ENOMEM;
     118        CHECK_RET_RETURN(ret, "Failed to allocate memory for uhci hcd driver.\n");
     119
     120        ret = uhci_init(uhci_hc, (void*)io_reg_base, io_reg_size);
     121        if (ret != EOK) {
     122                usb_log_error("Failed to init uhci-hcd.\n");
     123                free(uhci_hc);
     124                return ret;
    93125        }
    94126
    95         int ret = uhci_init(uhci_hc, (void*)io_reg_base, io_reg_size);
     127        ret = register_interrupt_handler(device, irq, irq_handler,
     128            &uhci_hc->interrupt_code);
    96129        if (ret != EOK) {
    97                 usb_log_error("Failed to init uhci-hcd.\n");
     130                usb_log_error("Failed to register interrupt handler.\n");
     131                uhci_fini(uhci_hc);
     132                free(uhci_hc);
    98133                return ret;
    99134        }
     135
    100136        device_t *rh;
    101137        ret = setup_root_hub(&rh, device);
    102 
    103138        if (ret != EOK) {
    104139                usb_log_error("Failed to setup uhci root hub.\n");
    105                 /* TODO: destroy uhci here */
     140                uhci_fini(uhci_hc);
     141                free(uhci_hc);
    106142                return ret;
    107143        }
     
    110146        if (ret != EOK) {
    111147                usb_log_error("Failed to register root hub.\n");
    112                 /* TODO: destroy uhci here */
     148                uhci_fini(uhci_hc);
     149                free(uhci_hc);
     150                free(rh);
    113151                return ret;
    114152        }
    115153
    116154        device->driver_data = uhci_hc;
    117 
    118155        return EOK;
    119156}
    120 
    121 static driver_ops_t uhci_driver_ops = {
    122         .add_device = uhci_add_device,
    123 };
    124 
    125 static driver_t uhci_driver = {
    126         .name = NAME,
    127         .driver_ops = &uhci_driver_ops
    128 };
    129 
     157/*----------------------------------------------------------------------------*/
    130158int main(int argc, char *argv[])
    131159{
    132         /*
    133          * Do some global initializations.
    134          */
    135         sleep(5);
    136         usb_log_enable(USB_LOG_LEVEL_INFO, NAME);
     160        sleep(3);
     161        usb_log_enable(USB_LOG_LEVEL_DEBUG, NAME);
    137162
    138163        return driver_main(&uhci_driver);
Note: See TracChangeset for help on using the changeset viewer.