Changeset ddab093 in mainline


Ignore:
Timestamp:
2012-12-16T19:00:03Z (11 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
5994cc3
Parents:
4bfe063
Message:

ohci: Initialization rework.

Move generic hcd initialization to separate function.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/bus/usb/ohci/ohci.c

    r4bfe063 rddab093  
    159159 *  - registers interrupt handler
    160160 */
    161 int device_setup_ohci(ddf_dev_t *device)
     161static int device_setup_hcd(ddf_dev_t *device)
    162162{
    163163        if (device == NULL)
     
    174174        if (instance->hc_fun) { \
    175175                ddf_fun_destroy(instance->hc_fun); \
    176         } \
    177         if (instance->rh_fun) { \
    178                 ddf_fun_destroy(instance->rh_fun); \
    179176        } \
    180177        usb_log_error(message); \
     
    199196            "Failed to bind OHCI device function: %s.\n", str_error(ret));
    200197
     198#define CHECK_RET_UNBIND_FREE_RETURN(ret, message...) \
     199if (ret != EOK) { \
     200        ddf_fun_unbind(instance->hc_fun); \
     201        CHECK_RET_DEST_FREE_RETURN(ret, \
     202            "Failed to add OHCI to HC class: %s.\n", str_error(ret)); \
     203} else (void)0
    201204        ret = ddf_fun_add_to_category(instance->hc_fun, USB_HC_CATEGORY);
    202         CHECK_RET_DEST_FREE_RETURN(ret,
    203             "Failed to add OHCI to HC class: %s.\n", str_error(ret));
     205        CHECK_RET_UNBIND_FREE_RETURN(ret,
     206            "Failed to add hc to category: %s\n", str_error(ret));
    204207
    205208        /* HC should be ok at this point (except it can't do anything) */
    206209
    207         instance->rh_fun = ddf_fun_create(device, fun_inner, "ohci_rh");
    208         ret = instance->rh_fun ? EOK : ENOMEM;
    209         CHECK_RET_DEST_FREE_RETURN(ret,
    210             "Failed to create OHCI RH function: %s.\n", str_error(ret));
    211         ddf_fun_set_ops(instance->rh_fun, &rh_ops);
     210        return EOK;
     211}
     212
     213int device_setup_ohci(ddf_dev_t *device)
     214{
     215#define CHECK_RET_RETURN(ret, message...) \
     216if (ret != EOK) { \
     217        usb_log_error(message); \
     218        return ret; \
     219}
    212220
    213221        uintptr_t reg_base = 0;
     
    215223        int irq = 0;
    216224
    217         ret = get_my_registers(device, &reg_base, &reg_size, &irq);
    218         CHECK_RET_DEST_FREE_RETURN(ret,
    219             "Failed to get register memory addresses for %" PRIun ": %s.\n",
    220             ddf_dev_get_handle(device), str_error(ret));
     225        int ret = get_my_registers(device, &reg_base, &reg_size, &irq);
     226        CHECK_RET_RETURN(ret, "Failed to get register memory addresses for %"
     227            PRIun ": %s.\n", ddf_dev_get_handle(device), str_error(ret));
     228
    221229        usb_log_debug("Memory mapped regs at %p (size %zu), IRQ %d.\n",
    222230            (void *) reg_base, reg_size, irq);
     
    235243        ret = hc_get_irq_code(irq_ranges, sizeof(irq_ranges), irq_cmds,
    236244            sizeof(irq_cmds), reg_base, reg_size);
    237         CHECK_RET_DEST_FREE_RETURN(ret,
    238             "Failed to generate IRQ code: %s.\n", str_error(ret));
     245        CHECK_RET_RETURN(ret, "Failed to gen IRQ code: %s.\n", str_error(ret));
    239246
    240247        /* Register handler to avoid interrupt lockup */
    241248        ret = register_interrupt_handler(device, irq, irq_handler, &irq_code);
    242         CHECK_RET_DEST_FREE_RETURN(ret,
    243             "Failed to register interrupt handler: %s.\n", str_error(ret));
     249        CHECK_RET_RETURN(ret,
     250            "Failed to register irq handler: %s.\n", str_error(ret));
     251
    244252
    245253        /* Try to enable interrupts */
     
    256264        }
    257265
     266        ret = device_setup_hcd(device);
     267        if (ret != EOK) {
     268                unregister_interrupt_handler(device, irq);
     269                return ret;
     270        }
     271
     272
     273// TODO: Undo device_setup_hcd
     274#define CHECK_RET_CLEAN_RETURN(ret, message...) \
     275if (ret != EOK) { \
     276        unregister_interrupt_handler(device, irq); \
     277        CHECK_RET_RETURN(ret, message); \
     278} else (void)0
     279
    258280        hc_t *hc_impl = malloc(sizeof(hc_t));
    259         assert(hc_impl);
     281        ret = hc_impl ? EOK : ENOMEM;
     282        CHECK_RET_CLEAN_RETURN(ret, "Failed to aloocate driver structure.\n");
    260283
    261284        ret = hc_init(hc_impl, reg_base, reg_size, interrupts);
    262         CHECK_RET_DEST_FREE_RETURN(ret,
    263             "Failed to init ohci_hcd: %s.\n", str_error(ret));
    264 
    265         hcd_set_implementation(hcd, hc_impl, hc_schedule,
    266             ohci_endpoint_init, ohci_endpoint_fini);
     285        CHECK_RET_CLEAN_RETURN(ret, "Failed to init hc: %s.\n", str_error(ret));
     286
     287        ohci_t *ohci = dev_to_ohci(device);
     288
     289        hcd_set_implementation(dev_to_hcd(device), hc_impl,
     290            hc_schedule, ohci_endpoint_init, ohci_endpoint_fini);
    267291
    268292#define CHECK_RET_FINI_RETURN(ret, message...) \
    269293if (ret != EOK) { \
    270294        hc_fini(hc_impl); \
    271         unregister_interrupt_handler(device, irq); \
    272         CHECK_RET_DEST_FREE_RETURN(ret, message); \
     295        CHECK_RET_CLEAN_RETURN(ret, message); \
    273296} else (void)0
    274 
    275         ret = hcd_register_hub(hcd, &hc_impl->rh.address, instance->rh_fun);
     297        ohci->rh_fun = ddf_fun_create(device, fun_inner, "ohci_rh");
     298        ret = ohci->rh_fun ? EOK : ENOMEM;
     299        CHECK_RET_FINI_RETURN(ret,
     300            "Failed to create OHCI RH function: %s.\n", str_error(ret));
     301        ddf_fun_set_ops(ohci->rh_fun, &rh_ops);
     302
     303        ret = hcd_register_hub(dev_to_hcd(device), &hc_impl->rh.address, ohci->rh_fun);
    276304        CHECK_RET_FINI_RETURN(ret,
    277305            "Failed to register OHCI root hub: %s.\n", str_error(ret));
    278306        return ret;
    279 
    280 #undef CHECK_RET_FINI_RETURN
    281307}
    282308/**
Note: See TracChangeset for help on using the changeset viewer.