Changes in / [26d46d2:c7bdfa7] in mainline
- Location:
- uspace/drv
- Files:
-
- 1 added
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/ohci/batch.c
r26d46d2 rc7bdfa7 51 51 static void batch_control(usb_transfer_batch_t *instance, 52 52 usb_direction_t data_dir, usb_direction_t status_dir); 53 static void batch_data(usb_transfer_batch_t *instance);54 53 static void batch_call_in_and_dispose(usb_transfer_batch_t *instance); 55 54 static void batch_call_out_and_dispose(usb_transfer_batch_t *instance); … … 135 134 assert(data); 136 135 size_t tds = data->td_count - 1; 137 usb_log_debug ("Batch(%p) checking %d td(s) for completion.\n",136 usb_log_debug2("Batch(%p) checking %d td(s) for completion.\n", 138 137 instance, tds); 139 usb_log_debug("ED: %x:%x:%x:%x.\n",140 data->ed->status, data->ed->td_head, data->ed->td_tail,141 data->ed->next);142 138 size_t i = 0; 143 139 for (; i < tds; ++i) { 144 usb_log_debug("TD %d: %x:%x:%x:%x.\n", i,145 data->tds[i].status, data->tds[i].cbp, data->tds[i].next,146 data->tds[i].be);147 140 if (!td_is_finished(&data->tds[i])) 148 141 return false; … … 184 177 assert(instance->direction == USB_DIRECTION_IN); 185 178 instance->next_step = batch_call_in_and_dispose; 186 batch_data(instance);179 /* TODO: implement */ 187 180 usb_log_debug("Batch(%p) INTERRUPT IN initialized.\n", instance); 188 181 } … … 196 189 instance->buffer_size); 197 190 instance->next_step = batch_call_out_and_dispose; 198 batch_data(instance);191 /* TODO: implement */ 199 192 usb_log_debug("Batch(%p) INTERRUPT OUT initialized.\n", instance); 200 193 } … … 205 198 instance->direction = USB_DIRECTION_IN; 206 199 instance->next_step = batch_call_in_and_dispose; 207 batch_data(instance);200 /* TODO: implement */ 208 201 usb_log_debug("Batch(%p) BULK IN initialized.\n", instance); 209 202 } … … 214 207 instance->direction = USB_DIRECTION_IN; 215 208 instance->next_step = batch_call_in_and_dispose; 216 batch_data(instance);209 /* TODO: implement */ 217 210 usb_log_debug("Batch(%p) BULK IN initialized.\n", instance); 218 211 } … … 275 268 } 276 269 /*----------------------------------------------------------------------------*/ 277 void batch_data(usb_transfer_batch_t *instance)278 {279 assert(instance);280 ohci_batch_t *data = instance->private_data;281 assert(data);282 ed_init(data->ed, instance->ep);283 ed_add_tds(data->ed, &data->tds[0], &data->tds[data->td_count - 1]);284 usb_log_debug("Created ED(%p): %x:%x:%x:%x.\n", data->ed,285 data->ed->status, data->ed->td_tail, data->ed->td_head,286 data->ed->next);287 288 /* data stage */289 size_t td_current = 1;290 size_t remain_size = instance->buffer_size;291 char *transfer_buffer = instance->transport_buffer;292 while (remain_size > 0) {293 size_t transfer_size = remain_size > OHCI_TD_MAX_TRANSFER ?294 OHCI_TD_MAX_TRANSFER : remain_size;295 296 td_init(&data->tds[td_current], instance->ep->direction,297 transfer_buffer, transfer_size, -1);298 td_set_next(&data->tds[td_current], &data->tds[td_current + 1]);299 usb_log_debug("Created DATA TD: %x:%x:%x:%x.\n",300 data->tds[td_current].status, data->tds[td_current].cbp,301 data->tds[td_current].next, data->tds[td_current].be);302 303 transfer_buffer += transfer_size;304 remain_size -= transfer_size;305 assert(td_current < data->td_count);306 ++td_current;307 }308 }309 /*----------------------------------------------------------------------------*/310 270 /** Helper function calls callback and correctly disposes of batch structure. 311 271 * -
uspace/drv/ohci/hc.c
r26d46d2 rc7bdfa7 135 135 } 136 136 137 transfer_list_add_batch( 138 instance->transfers[batch->transfer_type], batch); 139 137 140 switch (batch->transfer_type) { 138 141 case USB_TRANSFER_CONTROL: 139 142 instance->registers->control &= ~C_CLE; 140 transfer_list_add_batch(141 instance->transfers[batch->transfer_type], batch);142 143 instance->registers->command_status |= CS_CLF; 143 usb_log_debug2("Set CScontrol transfer filled: %x.\n",144 usb_log_debug2("Set control transfer filled: %x.\n", 144 145 instance->registers->command_status); 145 instance->registers->control_current = 0;146 146 instance->registers->control |= C_CLE; 147 147 break; 148 148 case USB_TRANSFER_BULK: 149 instance->registers->control &= ~C_BLE;150 transfer_list_add_batch(151 instance->transfers[batch->transfer_type], batch);152 149 instance->registers->command_status |= CS_BLF; 153 150 usb_log_debug2("Set bulk transfer filled: %x.\n", 154 151 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;163 152 break; 164 153 default: … … 176 165 rh_interrupt(&instance->rh); 177 166 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 } 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); 199 182 } 200 183 } … … 208 191 instance->registers->interrupt_status = status; 209 192 hc_interrupt(instance, status); 210 async_usleep(1000 0);193 async_usleep(1000); 211 194 } 212 195 return EOK; … … 284 267 instance->registers->control); 285 268 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 301 269 /* Enable queues */ 302 270 instance->registers->control |= (C_PLE | C_IE | C_CLE | C_BLE); … … 374 342 return ENOMEM; 375 343 bzero(instance->hcca, sizeof(hcca_t)); 376 usb_log_debug2("OHCI HCCA initialized at %p.\n", instance->hcca); 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); 377 359 378 360 unsigned i = 0; -
uspace/drv/ohci/hw_struct/endpoint_descriptor.c
r26d46d2 rc7bdfa7 53 53 << ED_STATUS_MPS_SHIFT); 54 54 55 56 55 if (ep->speed == USB_SPEED_LOW) 57 56 instance->status |= ED_STATUS_S_FLAG; 58 57 if (ep->transfer_type == USB_TRANSFER_ISOCHRONOUS) 59 58 instance->status |= ED_STATUS_F_FLAG; 60 61 if (ep->toggle)62 instance->td_head |= ED_TDHEAD_TOGGLE_CARRY;63 59 } 64 60 /** -
uspace/drv/ohci/hw_struct/endpoint_descriptor.h
r26d46d2 rc7bdfa7 53 53 #define ED_STATUS_D_MASK (0x3) /* direction */ 54 54 #define ED_STATUS_D_SHIFT (11) 55 #define ED_STATUS_D_ OUT(0x1)56 #define ED_STATUS_D_ IN(0x2)55 #define ED_STATUS_D_IN (0x1) 56 #define ED_STATUS_D_OUT (0x2) 57 57 #define ED_STATUS_D_TRANSFER (0x3) 58 58 … … 84 84 { 85 85 assert(instance); 86 instance->td_head = 87 ((addr_to_phys(head) & ED_TDHEAD_PTR_MASK) 88 | (instance->td_head & ~ED_TDHEAD_PTR_MASK)); 86 instance->td_head = addr_to_phys(head) & ED_TDHEAD_PTR_MASK; 89 87 instance->td_tail = addr_to_phys(tail) & ED_TDTAIL_PTR_MASK; 90 88 } … … 98 96 instance->next = pa; 99 97 } 98 100 99 #endif 101 100 /** -
uspace/drv/ohci/hw_struct/transfer_descriptor.h
r26d46d2 rc7bdfa7 50 50 #define TD_STATUS_DP_SHIFT (19) 51 51 #define TD_STATUS_DP_SETUP (0x0) 52 #define TD_STATUS_DP_ OUT(0x1)53 #define TD_STATUS_DP_ IN(0x2)52 #define TD_STATUS_DP_IN (0x1) 53 #define TD_STATUS_DP_OUT (0x2) 54 54 #define TD_STATUS_DI_MASK (0x7) /* delay interrupt, wait DI frames before int */ 55 55 #define TD_STATUS_DI_SHIFT (21) -
uspace/drv/ohci/main.c
r26d46d2 rc7bdfa7 92 92 int main(int argc, char *argv[]) 93 93 { 94 usb_log_enable(USB_LOG_LEVEL_DE BUG, NAME);94 usb_log_enable(USB_LOG_LEVEL_DEFAULT, NAME); 95 95 sleep(5); 96 96 return ddf_driver_main(&ohci_driver); -
uspace/drv/ohci/transfer_list.c
r26d46d2 rc7bdfa7 143 143 144 144 fibril_mutex_lock(&instance->guard); 145 usb_log_debug2("Checking list %s for completed batches(%d).\n",146 instance->name, list_count(&instance->batch_list));147 145 link_t *current = instance->batch_list.next; 148 146 while (current != &instance->batch_list) {
Note:
See TracChangeset
for help on using the changeset viewer.