Changes in / [c7bdfa7:26d46d2] in mainline
- Location:
- uspace/drv
- Files:
-
- 1 deleted
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/ohci/batch.c
rc7bdfa7 r26d46d2 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); 53 54 static void batch_call_in_and_dispose(usb_transfer_batch_t *instance); 54 55 static void batch_call_out_and_dispose(usb_transfer_batch_t *instance); … … 134 135 assert(data); 135 136 size_t tds = data->td_count - 1; 136 usb_log_debug 2("Batch(%p) checking %d td(s) for completion.\n",137 usb_log_debug("Batch(%p) checking %d td(s) for completion.\n", 137 138 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); 138 142 size_t i = 0; 139 143 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); 140 147 if (!td_is_finished(&data->tds[i])) 141 148 return false; … … 177 184 assert(instance->direction == USB_DIRECTION_IN); 178 185 instance->next_step = batch_call_in_and_dispose; 179 /* TODO: implement */186 batch_data(instance); 180 187 usb_log_debug("Batch(%p) INTERRUPT IN initialized.\n", instance); 181 188 } … … 189 196 instance->buffer_size); 190 197 instance->next_step = batch_call_out_and_dispose; 191 /* TODO: implement */198 batch_data(instance); 192 199 usb_log_debug("Batch(%p) INTERRUPT OUT initialized.\n", instance); 193 200 } … … 198 205 instance->direction = USB_DIRECTION_IN; 199 206 instance->next_step = batch_call_in_and_dispose; 200 /* TODO: implement */207 batch_data(instance); 201 208 usb_log_debug("Batch(%p) BULK IN initialized.\n", instance); 202 209 } … … 207 214 instance->direction = USB_DIRECTION_IN; 208 215 instance->next_step = batch_call_in_and_dispose; 209 /* TODO: implement */216 batch_data(instance); 210 217 usb_log_debug("Batch(%p) BULK IN initialized.\n", instance); 211 218 } … … 268 275 } 269 276 /*----------------------------------------------------------------------------*/ 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 /*----------------------------------------------------------------------------*/ 270 310 /** Helper function calls callback and correctly disposes of batch structure. 271 311 * -
uspace/drv/ohci/hc.c
rc7bdfa7 r26d46d2 135 135 } 136 136 137 transfer_list_add_batch(138 instance->transfers[batch->transfer_type], batch);139 140 137 switch (batch->transfer_type) { 141 138 case USB_TRANSFER_CONTROL: 142 139 instance->registers->control &= ~C_CLE; 140 transfer_list_add_batch( 141 instance->transfers[batch->transfer_type], batch); 143 142 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", 145 144 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); 149 152 instance->registers->command_status |= CS_BLF; 150 153 usb_log_debug2("Set bulk transfer filled: %x.\n", 151 154 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; 152 163 break; 153 164 default: … … 165 176 rh_interrupt(&instance->rh); 166 177 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 } 182 199 } 183 200 } … … 191 208 instance->registers->interrupt_status = status; 192 209 hc_interrupt(instance, status); 193 async_usleep(1000 );210 async_usleep(10000); 194 211 } 195 212 return EOK; … … 267 284 instance->registers->control); 268 285 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 269 301 /* Enable queues */ 270 302 instance->registers->control |= (C_PLE | C_IE | C_CLE | C_BLE); … … 342 374 return ENOMEM; 343 375 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); 359 377 360 378 unsigned i = 0; -
uspace/drv/ohci/hw_struct/endpoint_descriptor.c
rc7bdfa7 r26d46d2 53 53 << ED_STATUS_MPS_SHIFT); 54 54 55 55 56 if (ep->speed == USB_SPEED_LOW) 56 57 instance->status |= ED_STATUS_S_FLAG; 57 58 if (ep->transfer_type == USB_TRANSFER_ISOCHRONOUS) 58 59 instance->status |= ED_STATUS_F_FLAG; 60 61 if (ep->toggle) 62 instance->td_head |= ED_TDHEAD_TOGGLE_CARRY; 59 63 } 60 64 /** -
uspace/drv/ohci/hw_struct/endpoint_descriptor.h
rc7bdfa7 r26d46d2 53 53 #define ED_STATUS_D_MASK (0x3) /* direction */ 54 54 #define ED_STATUS_D_SHIFT (11) 55 #define ED_STATUS_D_ IN(0x1)56 #define ED_STATUS_D_ OUT(0x2)55 #define ED_STATUS_D_OUT (0x1) 56 #define ED_STATUS_D_IN (0x2) 57 57 #define ED_STATUS_D_TRANSFER (0x3) 58 58 … … 84 84 { 85 85 assert(instance); 86 instance->td_head = addr_to_phys(head) & ED_TDHEAD_PTR_MASK; 86 instance->td_head = 87 ((addr_to_phys(head) & ED_TDHEAD_PTR_MASK) 88 | (instance->td_head & ~ED_TDHEAD_PTR_MASK)); 87 89 instance->td_tail = addr_to_phys(tail) & ED_TDTAIL_PTR_MASK; 88 90 } … … 96 98 instance->next = pa; 97 99 } 98 99 100 #endif 100 101 /** -
uspace/drv/ohci/hw_struct/transfer_descriptor.h
rc7bdfa7 r26d46d2 50 50 #define TD_STATUS_DP_SHIFT (19) 51 51 #define TD_STATUS_DP_SETUP (0x0) 52 #define TD_STATUS_DP_ IN(0x1)53 #define TD_STATUS_DP_ OUT(0x2)52 #define TD_STATUS_DP_OUT (0x1) 53 #define TD_STATUS_DP_IN (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
rc7bdfa7 r26d46d2 92 92 int main(int argc, char *argv[]) 93 93 { 94 usb_log_enable(USB_LOG_LEVEL_DE FAULT, NAME);94 usb_log_enable(USB_LOG_LEVEL_DEBUG, NAME); 95 95 sleep(5); 96 96 return ddf_driver_main(&ohci_driver); -
uspace/drv/ohci/transfer_list.c
rc7bdfa7 r26d46d2 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)); 145 147 link_t *current = instance->batch_list.next; 146 148 while (current != &instance->batch_list) {
Note:
See TracChangeset
for help on using the changeset viewer.