Changeset 344925c in mainline for uspace/drv/ohci/hc.c


Ignore:
Timestamp:
2011-04-08T20:29:38Z (13 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
06c552c
Parents:
6b6e3ed3
Message:

Initialize OHCI hc memory structures

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/ohci/hc.c

    r6b6e3ed3 r344925c  
    4848static void hc_init_hw(hc_t *instance);
    4949static int hc_init_transfer_lists(hc_t *instance);
     50static int hc_init_memory(hc_t *instance);
    5051/*----------------------------------------------------------------------------*/
    5152int hc_register_hub(hc_t *instance, ddf_fun_t *hub_fun)
     
    117118        rh_init(&instance->rh, dev, instance->registers);
    118119
     120        hc_init_memory(instance);
    119121        hc_init_hw(instance);
    120122
     
    207209        assert(instance);
    208210        const uint32_t fm_interval = instance->registers->fm_interval;
     211
     212        /* reset hc */
    209213        instance->registers->command_status = CS_HCR;
    210214        async_usleep(10);
     215
     216        /* restore fm_interval */
    211217        instance->registers->fm_interval = fm_interval;
    212218        assert((instance->registers->command_status & CS_HCR) == 0);
     219
    213220        /* hc is now in suspend state */
    214         /* init queues */
    215         hc_init_transfer_lists(instance);
    216         /* TODO: init HCCA block */
    217         /* TODO: enable queues */
     221
     222        /* enable queues */
     223        instance->registers->control |= (C_PLE | C_IE | C_CLE | C_BLE);
    218224        /* TODO: enable interrupts */
    219         /* TODO: set periodic start to 90% */
     225        /* set periodic start to 90% */
     226        instance->registers->periodic_start = (fm_interval / 10) * 9;
    220227
    221228        instance->registers->control &= (C_HCFS_OPERATIONAL << C_HCFS_SHIFT);
     
    226233{
    227234        assert(instance);
    228 #define CHECK_RET_CLEAR_RETURN(ret, message...) \
     235
     236#define SETUP_TRANSFER_LIST(type, name) \
     237do { \
     238        int ret = transfer_list_init(&instance->type, name); \
    229239        if (ret != EOK) { \
    230                 usb_log_error(message); \
     240                usb_log_error("Failed(%d) to setup %s transfer list.\n", \
     241                    ret, name); \
    231242                transfer_list_fini(&instance->transfers_isochronous); \
    232243                transfer_list_fini(&instance->transfers_interrupt); \
    233244                transfer_list_fini(&instance->transfers_control); \
    234245                transfer_list_fini(&instance->transfers_bulk); \
    235                 return ret; \
    236         } else (void) 0
    237 
    238         int ret;
    239         ret = transfer_list_init(&instance->transfers_bulk, "BULK");
    240         CHECK_RET_CLEAR_RETURN(ret, "Failed to init BULK list.");
    241 
    242         ret = transfer_list_init(&instance->transfers_control, "CONTROL");
    243         CHECK_RET_CLEAR_RETURN(ret, "Failed to init CONTROL list.");
    244 
    245         ret = transfer_list_init(&instance->transfers_interrupt, "INTERRUPT");
    246         CHECK_RET_CLEAR_RETURN(ret, "Failed to init INTERRUPT list.");
     246        } \
     247} while (0)
     248
     249        SETUP_TRANSFER_LIST(transfers_isochronous, "ISOCHRONOUS");
     250        SETUP_TRANSFER_LIST(transfers_interrupt, "INTERRUPT");
     251        SETUP_TRANSFER_LIST(transfers_control, "CONTROL");
     252        SETUP_TRANSFER_LIST(transfers_bulk, "BULK");
    247253
    248254        transfer_list_set_next(&instance->transfers_interrupt,
    249                 &instance->transfers_isochronous);
     255            &instance->transfers_isochronous);
    250256
    251257        /* Assign pointers to be used during scheduling */
     
    262268#undef CHECK_RET_CLEAR_RETURN
    263269}
     270/*----------------------------------------------------------------------------*/
     271int hc_init_memory(hc_t *instance)
     272{
     273        assert(instance);
     274        /* init queues */
     275        hc_init_transfer_lists(instance);
     276
     277        /* init HCCA */
     278        instance->hcca = malloc32(sizeof(hcca_t));
     279        if (instance->hcca == NULL)
     280                return ENOMEM;
     281        bzero(instance->hcca, sizeof(hcca_t));
     282        instance->registers->hcca = addr_to_phys(instance->hcca);
     283
     284        /* use queues */
     285        instance->registers->bulk_head = instance->transfers_bulk.list_head_pa;
     286        instance->registers->control_head =
     287            instance->transfers_control.list_head_pa;
     288
     289        unsigned i = 0;
     290        for (; i < 32; ++i) {
     291                instance->hcca->int_ep[i] =
     292                    instance->transfers_interrupt.list_head_pa;
     293        }
     294
     295        return EOK;
     296}
    264297/**
    265298 * @}
Note: See TracChangeset for help on using the changeset viewer.