Changeset 1a46610 in mainline for uspace/drv/ohci/hc.c


Ignore:
Timestamp:
2011-04-10T22:44:17Z (13 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
6991188
Parents:
c7bdfa7 (diff), 26d46d2 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

OHCI prototype

Control transfers work, interrupt transfers freeze VirtualBox, bulk were not tested

File:
1 edited

Legend:

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

    rc7bdfa7 r1a46610  
    135135        }
    136136
    137         transfer_list_add_batch(
    138             instance->transfers[batch->transfer_type], batch);
    139 
    140137        switch (batch->transfer_type) {
    141138        case USB_TRANSFER_CONTROL:
    142139                instance->registers->control &= ~C_CLE;
     140                transfer_list_add_batch(
     141                    instance->transfers[batch->transfer_type], batch);
    143142                instance->registers->command_status |= CS_CLF;
    144                 usb_log_debug2("Set control transfer filled: %x.\n",
     143                usb_log_debug2("Set CS control transfer filled: %x.\n",
    145144                        instance->registers->command_status);
     145                instance->registers->control_current = 0;
    146146                instance->registers->control |= C_CLE;
    147147                break;
    148148        case USB_TRANSFER_BULK:
     149                instance->registers->control &= ~C_BLE;
     150                transfer_list_add_batch(
     151                    instance->transfers[batch->transfer_type], batch);
    149152                instance->registers->command_status |= CS_BLF;
    150153                usb_log_debug2("Set bulk transfer filled: %x.\n",
    151154                        instance->registers->command_status);
     155                instance->registers->control |= C_BLE;
     156                break;
     157        case USB_TRANSFER_INTERRUPT:
     158        case USB_TRANSFER_ISOCHRONOUS:
     159                instance->registers->control &= ~C_PLE;
     160                transfer_list_add_batch(
     161                    instance->transfers[batch->transfer_type], batch);
     162                instance->registers->control |= C_PLE;
    152163                break;
    153164        default:
     
    165176                rh_interrupt(&instance->rh);
    166177
    167         usb_log_info("OHCI interrupt: %x.\n", status);
    168 
    169 
    170         LIST_INITIALIZE(done);
    171         transfer_list_remove_finished(&instance->transfers_interrupt, &done);
    172         transfer_list_remove_finished(&instance->transfers_isochronous, &done);
    173         transfer_list_remove_finished(&instance->transfers_control, &done);
    174         transfer_list_remove_finished(&instance->transfers_bulk, &done);
    175 
    176         while (!list_empty(&done)) {
    177                 link_t *item = done.next;
    178                 list_remove(item);
    179                 usb_transfer_batch_t *batch =
    180                     list_get_instance(item, usb_transfer_batch_t, link);
    181                 usb_transfer_batch_finish(batch);
     178        usb_log_debug("OHCI interrupt: %x.\n", status);
     179
     180
     181        if (status & IS_WDH) {
     182                LIST_INITIALIZE(done);
     183                transfer_list_remove_finished(
     184                    &instance->transfers_interrupt, &done);
     185                transfer_list_remove_finished(
     186                    &instance->transfers_isochronous, &done);
     187                transfer_list_remove_finished(
     188                    &instance->transfers_control, &done);
     189                transfer_list_remove_finished(
     190                    &instance->transfers_bulk, &done);
     191
     192                while (!list_empty(&done)) {
     193                        link_t *item = done.next;
     194                        list_remove(item);
     195                        usb_transfer_batch_t *batch =
     196                            list_get_instance(item, usb_transfer_batch_t, link);
     197                        usb_transfer_batch_finish(batch);
     198                }
    182199        }
    183200}
     
    191208                instance->registers->interrupt_status = status;
    192209                hc_interrupt(instance, status);
    193                 async_usleep(1000);
     210                async_usleep(10000);
    194211        }
    195212        return EOK;
     
    267284            instance->registers->control);
    268285
     286        /* Use HCCA */
     287        instance->registers->hcca = addr_to_phys(instance->hcca);
     288
     289        /* Use queues */
     290        instance->registers->bulk_head = instance->transfers_bulk.list_head_pa;
     291        usb_log_debug2("Bulk HEAD set to: %p(%p).\n",
     292            instance->transfers_bulk.list_head,
     293            instance->transfers_bulk.list_head_pa);
     294
     295        instance->registers->control_head =
     296            instance->transfers_control.list_head_pa;
     297        usb_log_debug2("Control HEAD set to: %p(%p).\n",
     298            instance->transfers_control.list_head,
     299            instance->transfers_control.list_head_pa);
     300
    269301        /* Enable queues */
    270302        instance->registers->control |= (C_PLE | C_IE | C_CLE | C_BLE);
     
    342374                return ENOMEM;
    343375        bzero(instance->hcca, sizeof(hcca_t));
    344         instance->registers->hcca = addr_to_phys(instance->hcca);
    345         usb_log_debug2("OHCI HCCA initialized at %p(%p).\n",
    346             instance->hcca, instance->registers->hcca);
    347 
    348         /* Use queues */
    349         instance->registers->bulk_head = instance->transfers_bulk.list_head_pa;
    350         usb_log_debug2("Bulk HEAD set to: %p(%p).\n",
    351             instance->transfers_bulk.list_head,
    352             instance->transfers_bulk.list_head_pa);
    353 
    354         instance->registers->control_head =
    355             instance->transfers_control.list_head_pa;
    356         usb_log_debug2("Control HEAD set to: %p(%p).\n",
    357             instance->transfers_control.list_head,
    358             instance->transfers_control.list_head_pa);
     376        usb_log_debug2("OHCI HCCA initialized at %p.\n", instance->hcca);
    359377
    360378        unsigned i = 0;
Note: See TracChangeset for help on using the changeset viewer.