Changeset 4abc304 in mainline for uspace/drv/uhci-hcd/uhci.c


Ignore:
Timestamp:
2011-02-28T11:55:36Z (13 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
dced52a
Parents:
299d53e
Message:

Debug output refactored

File:
1 edited

Legend:

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

    r299d53e r4abc304  
    101101        bool low_speed, usb_transfer_type_t, size_t size);
    102102
    103 #define CHECK_RET_RETURN(ret, message...) \
     103
     104int uhci_init(uhci_t *instance, ddf_dev_t *dev, void *regs, size_t reg_size)
     105{
     106        assert(reg_size >= sizeof(regs_t));
     107        int ret;
     108
     109#define CHECK_RET_DEST_FUN_RETURN(ret, message...) \
    104110        if (ret != EOK) { \
    105111                usb_log_error(message); \
     112                if (instance->ddf_instance) \
     113                        ddf_fun_destroy(instance->ddf_instance); \
    106114                return ret; \
    107115        } else (void) 0
    108 
    109 int uhci_init(uhci_t *instance, ddf_dev_t *dev, void *regs, size_t reg_size)
    110 {
    111         assert(reg_size >= sizeof(regs_t));
    112         int ret;
    113116
    114117        /*
     
    116119         */
    117120        instance->ddf_instance = ddf_fun_create(dev, fun_exposed, "uhci");
    118         if (instance->ddf_instance == NULL) {
    119                 usb_log_error("Failed to create UHCI device function.\n");
    120                 return ENOMEM;
    121         }
     121        ret = (instance->ddf_instance == NULL) ? ENOMEM : EOK;
     122        CHECK_RET_DEST_FUN_RETURN(ret, "Failed to create UHCI device function.\n");
     123
    122124        instance->ddf_instance->ops = &uhci_ops;
    123125        instance->ddf_instance->driver_data = instance;
    124126
    125127        ret = ddf_fun_bind(instance->ddf_instance);
    126         CHECK_RET_RETURN(ret, "Failed to bind UHCI device function: %s.\n",
    127             str_error(ret));
     128        CHECK_RET_DEST_FUN_RETURN(ret, "Failed(%d) to bind UHCI device function: %s.\n",
     129            ret, str_error(ret));
    128130
    129131        /* allow access to hc control registers */
    130132        regs_t *io;
    131133        ret = pio_enable(regs, reg_size, (void**)&io);
    132         CHECK_RET_RETURN(ret, "Failed to gain access to registers at %p.\n", io);
     134        CHECK_RET_DEST_FUN_RETURN(ret, "Failed(%d) to gain access to registers at %p: %s.\n",
     135            ret, str_error(ret), io);
    133136        instance->registers = io;
    134         usb_log_debug("Device registers accessible.\n");
     137        usb_log_debug("Device registers at %p(%u) accessible.\n", io, reg_size);
    135138
    136139        ret = uhci_init_mem_structures(instance);
    137         CHECK_RET_RETURN(ret, "Failed to initialize memory structures.\n");
     140        CHECK_RET_DEST_FUN_RETURN(ret, "Failed to initialize UHCI memory structures.\n");
    138141
    139142        uhci_init_hw(instance);
     
    145148        fibril_add_ready(instance->debug_checker);
    146149
    147         return EOK;
     150        usb_log_info("Started UHCI driver.\n");
     151        return EOK;
     152#undef CHECK_RET_DEST_FUN_RETURN
    148153}
    149154/*----------------------------------------------------------------------------*/
     
    171176        pio_write_16(&instance->registers->usbcmd,
    172177            UHCI_CMD_RUN_STOP | UHCI_CMD_MAX_PACKET | UHCI_CMD_CONFIGURE);
    173         usb_log_debug("Started UHCI HC.\n");
    174178}
    175179/*----------------------------------------------------------------------------*/
     
    177181{
    178182        assert(instance);
     183#define CHECK_RET_DEST_CMDS_RETURN(ret, message...) \
     184        if (ret != EOK) { \
     185                usb_log_error(message); \
     186                if (instance->interrupt_code.cmds != NULL) \
     187                        free(instance->interrupt_code.cmds); \
     188                return ret; \
     189        } else (void) 0
    179190
    180191        /* init interrupt code */
    181         irq_cmd_t *interrupt_commands = malloc(sizeof(uhci_cmds));
    182         if (interrupt_commands == NULL) {
    183                 return ENOMEM;
    184         }
    185         memcpy(interrupt_commands, uhci_cmds, sizeof(uhci_cmds));
    186         interrupt_commands[0].addr = (void*)&instance->registers->usbsts;
    187         interrupt_commands[1].addr = (void*)&instance->registers->usbsts;
    188         instance->interrupt_code.cmds = interrupt_commands;
    189         instance->interrupt_code.cmdcount =
    190             sizeof(uhci_cmds) / sizeof(irq_cmd_t);
     192        instance->interrupt_code.cmds = malloc(sizeof(uhci_cmds));
     193        int ret = (instance->interrupt_code.cmds == NULL) ? ENOMEM : EOK;
     194        CHECK_RET_DEST_CMDS_RETURN(ret, "Failed to allocate interrupt cmds space.\n");
     195
     196        {
     197                irq_cmd_t *interrupt_commands = instance->interrupt_code.cmds;
     198                memcpy(interrupt_commands, uhci_cmds, sizeof(uhci_cmds));
     199                interrupt_commands[0].addr = (void*)&instance->registers->usbsts;
     200                interrupt_commands[1].addr = (void*)&instance->registers->usbsts;
     201                instance->interrupt_code.cmdcount =
     202                                sizeof(uhci_cmds) / sizeof(irq_cmd_t);
     203        }
    191204
    192205        /* init transfer lists */
    193         int ret = uhci_init_transfer_lists(instance);
    194         CHECK_RET_RETURN(ret, "Failed to initialize transfer lists.\n");
     206        ret = uhci_init_transfer_lists(instance);
     207        CHECK_RET_DEST_CMDS_RETURN(ret, "Failed to initialize transfer lists.\n");
    195208        usb_log_debug("Initialized transfer lists.\n");
    196209
     
    198211        instance->frame_list = get_page();
    199212        ret = instance ? EOK : ENOMEM;
    200         CHECK_RET_RETURN(ret, "Failed to get frame list page.\n");
     213        CHECK_RET_DEST_CMDS_RETURN(ret, "Failed to get frame list page.\n");
    201214        usb_log_debug("Initialized frame list.\n");
    202215
     
    205218          instance->transfers_interrupt.queue_head_pa
    206219          | LINK_POINTER_QUEUE_HEAD_FLAG;
     220
    207221        unsigned i = 0;
    208222        for(; i < UHCI_FRAME_LIST_COUNT; ++i) {
     
    215229
    216230        return EOK;
     231#undef CHECK_RET_DEST_CMDS_RETURN
    217232}
    218233/*----------------------------------------------------------------------------*/
     
    220235{
    221236        assert(instance);
     237#define CHECK_RET_CLEAR_RETURN(ret, message...) \
     238        if (ret != EOK) { \
     239                usb_log_error(message); \
     240                transfer_list_fini(&instance->transfers_bulk_full); \
     241                transfer_list_fini(&instance->transfers_control_full); \
     242                transfer_list_fini(&instance->transfers_control_slow); \
     243                transfer_list_fini(&instance->transfers_interrupt); \
     244                return ret; \
     245        } else (void) 0
    222246
    223247        /* initialize TODO: check errors */
    224248        int ret;
    225249        ret = transfer_list_init(&instance->transfers_bulk_full, "BULK_FULL");
    226         assert(ret == EOK);
     250        CHECK_RET_CLEAR_RETURN(ret, "Failed to init BULK list.");
    227251        ret = transfer_list_init(&instance->transfers_control_full, "CONTROL_FULL");
    228         assert(ret == EOK);
     252        CHECK_RET_CLEAR_RETURN(ret, "Failed to init CONTROL FULL list.");
    229253        ret = transfer_list_init(&instance->transfers_control_slow, "CONTROL_SLOW");
    230         assert(ret == EOK);
     254        CHECK_RET_CLEAR_RETURN(ret, "Failed to init CONTROL SLOW list.");
    231255        ret = transfer_list_init(&instance->transfers_interrupt, "INTERRUPT");
    232         assert(ret == EOK);
     256        CHECK_RET_CLEAR_RETURN(ret, "Failed to init INTERRUPT list.");
    233257
    234258        transfer_list_set_next(&instance->transfers_control_full,
     
    257281
    258282        return EOK;
     283#undef CHECK_RET_CLEAR_RETURN
    259284}
    260285/*----------------------------------------------------------------------------*/
Note: See TracChangeset for help on using the changeset viewer.