Ignore:
File:
1 edited

Legend:

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

    r357a302 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 
    57 static int usb_iface_get_address(device_t *dev, devman_handle_t handle,
    58     usb_address_t *address)
    59 {
    60         assert(dev);
    61         uhci_t *hc = dev_to_uhci(dev);
    62         assert(hc);
    63 
    64         usb_address_t addr = usb_address_keeping_find(&hc->address_manager,
    65             handle);
    66         if (addr < 0) {
    67                 return addr;
    68         }
    69 
    70         if (address != NULL) {
    71                 *address = addr;
    72         }
    73 
    74         return EOK;
    75 }
    76 
     60/*----------------------------------------------------------------------------*/
    7761static usb_iface_t hc_usb_iface = {
    78         .get_hc_handle = usb_iface_get_hc_handle,
    79         .get_address = usb_iface_get_address
     62        .get_hc_handle = usb_iface_get_hc_handle
    8063};
    81 
     64/*----------------------------------------------------------------------------*/
    8265static device_ops_t uhci_ops = {
    8366        .interfaces[USB_DEV_IFACE] = &hc_usb_iface,
    8467        .interfaces[USBHC_DEV_IFACE] = &uhci_iface
    8568};
     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}
    8693
    8794static int uhci_add_device(device_t *device)
     
    96103        int irq;
    97104
    98         int rc = pci_get_my_registers(device,
    99             &io_reg_base, &io_reg_size, &irq);
     105        int ret =
     106            pci_get_my_registers(device, &io_reg_base, &io_reg_size, &irq);
    100107
    101         if (rc != EOK) {
    102                 usb_log_error("Failed(%d) to get I/O registers addresses for device:.\n",
    103                     rc, device->handle);
    104                 return rc;
    105         }
    106 
     108        CHECK_RET_RETURN(ret,
     109            "Failed(%d) to get I/O addresses:.\n", ret, device->handle);
    107110        usb_log_info("I/O regs at 0x%X (size %zu), IRQ %d.\n",
    108111            io_reg_base, io_reg_size, irq);
    109112
     113        ret = pci_enable_interrupts(device);
     114        CHECK_RET_RETURN(ret, "Failed(%d) to get enable interrupts:\n", ret);
     115
    110116        uhci_t *uhci_hc = malloc(sizeof(uhci_t));
    111         if (!uhci_hc) {
    112                 usb_log_error("Failed to allocaete memory for uhci hcd driver.\n");
    113                 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;
    114125        }
    115126
    116         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);
    117129        if (ret != EOK) {
    118                 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);
    119133                return ret;
    120134        }
     135
    121136        device_t *rh;
    122137        ret = setup_root_hub(&rh, device);
    123 
    124138        if (ret != EOK) {
    125139                usb_log_error("Failed to setup uhci root hub.\n");
    126                 /* TODO: destroy uhci here */
     140                uhci_fini(uhci_hc);
     141                free(uhci_hc);
    127142                return ret;
    128143        }
     
    131146        if (ret != EOK) {
    132147                usb_log_error("Failed to register root hub.\n");
    133                 /* TODO: destroy uhci here */
     148                uhci_fini(uhci_hc);
     149                free(uhci_hc);
     150                free(rh);
    134151                return ret;
    135152        }
    136153
    137154        device->driver_data = uhci_hc;
    138 
    139155        return EOK;
    140156}
    141 
    142 static driver_ops_t uhci_driver_ops = {
    143         .add_device = uhci_add_device,
    144 };
    145 
    146 static driver_t uhci_driver = {
    147         .name = NAME,
    148         .driver_ops = &uhci_driver_ops
    149 };
    150 
     157/*----------------------------------------------------------------------------*/
    151158int main(int argc, char *argv[])
    152159{
    153         /*
    154          * Do some global initializations.
    155          */
    156         sleep(5);
    157         usb_log_enable(USB_LOG_LEVEL_INFO, NAME);
     160        sleep(3);
     161        usb_log_enable(USB_LOG_LEVEL_DEBUG, NAME);
    158162
    159163        return driver_main(&uhci_driver);
Note: See TracChangeset for help on using the changeset viewer.