Changes in / [8a20380:24d5432] in mainline
- Location:
- uspace/drv/uhci-hcd
- Files:
-
- 1 added
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/uhci-hcd/batch.c
r8a20380 r24d5432 54 54 static void batch_call_in_and_dispose(batch_t *instance); 55 55 static void batch_call_out_and_dispose(batch_t *instance); 56 static void batch_dispose(batch_t *instance);57 56 58 57 … … 62 61 char* setup_buffer, size_t setup_size, 63 62 usbhc_iface_transfer_in_callback_t func_in, 64 usbhc_iface_transfer_out_callback_t func_out, void *arg, 65 device_keeper_t *manager 66 ) 63 usbhc_iface_transfer_out_callback_t func_out, void *arg) 67 64 { 68 65 assert(func_in == NULL || func_out == NULL); … … 140 137 instance->arg = arg; 141 138 instance->speed = speed; 142 instance->manager = manager;143 139 144 140 queue_head_element_td(instance->qh, addr_to_phys(instance->tds)); … … 164 160 usb_log_debug("Batch(%p) found error TD(%d):%x.\n", 165 161 instance, i, instance->tds[i].status); 166 167 device_keeper_set_toggle(instance->manager, instance->target,168 td_toggle(&instance->tds[i]));169 162 if (i > 0) 170 163 goto substract_ret; … … 239 232 } 240 233 /*----------------------------------------------------------------------------*/ 241 void batch_data(batch_t *instance, usb_packet_id pid)234 static void batch_data(batch_t *instance, usb_packet_id pid) 242 235 { 243 236 assert(instance); 244 237 const bool low_speed = instance->speed == USB_SPEED_LOW; 245 int toggle = device_keeper_get_toggle(instance->manager, instance->target); 246 assert(toggle == 0 || toggle == 1); 238 int toggle = 1; 247 239 248 240 size_t packet = 0; … … 253 245 - remain_size; 254 246 247 toggle = 1 - toggle; 255 248 256 249 const size_t packet_size = … … 263 256 &instance->tds[packet + 1]); 264 257 265 toggle = 1 - toggle;266 258 ++packet; 267 259 assert(packet <= instance->packets); … … 269 261 remain_size -= packet_size; 270 262 } 271 device_keeper_set_toggle(instance->manager, instance->target, toggle);272 263 273 264 instance->tds[packet - 1].status |= TD_STATUS_COMPLETE_INTERRUPT_FLAG; … … 275 266 } 276 267 /*----------------------------------------------------------------------------*/ 277 void batch_control(batch_t *instance,268 static void batch_control(batch_t *instance, 278 269 usb_packet_id data_stage, usb_packet_id status_stage) 279 270 { … … 356 347 assert(instance); 357 348 batch_call_in(instance); 358 batch_dispose(instance);359 }360 /*----------------------------------------------------------------------------*/361 void batch_call_out_and_dispose(batch_t *instance)362 {363 assert(instance);364 batch_call_out(instance);365 batch_dispose(instance);366 }367 /*----------------------------------------------------------------------------*/368 void batch_dispose(batch_t *instance)369 {370 assert(instance);371 349 usb_log_debug("Batch(%p) disposing.\n", instance); 372 350 free32(instance->tds); … … 377 355 } 378 356 /*----------------------------------------------------------------------------*/ 357 void batch_call_out_and_dispose(batch_t *instance) 358 { 359 assert(instance); 360 batch_call_out(instance); 361 usb_log_debug("Batch(%p) disposing.\n", instance); 362 free32(instance->tds); 363 free32(instance->qh); 364 free32(instance->setup_buffer); 365 free32(instance->transport_buffer); 366 free(instance); 367 } 368 /*----------------------------------------------------------------------------*/ 379 369 int batch_schedule(batch_t *instance) 380 370 { -
uspace/drv/uhci-hcd/batch.h
r8a20380 r24d5432 42 42 #include "uhci_struct/transfer_descriptor.h" 43 43 #include "uhci_struct/queue_head.h" 44 #include "utils/device_keeper.h"45 44 46 45 typedef struct batch … … 68 67 td_t *tds; 69 68 void (*next_step)(struct batch*); 70 device_keeper_t *manager;71 69 } batch_t; 72 70 … … 76 74 char *setup_buffer, size_t setup_size, 77 75 usbhc_iface_transfer_in_callback_t func_in, 78 usbhc_iface_transfer_out_callback_t func_out, void *arg, 79 device_keeper_t *manager 80 ); 76 usbhc_iface_transfer_out_callback_t func_out, void *arg); 81 77 82 78 bool batch_is_complete(batch_t *instance); -
uspace/drv/uhci-hcd/iface.c
r8a20380 r24d5432 114 114 115 115 batch_t *batch = batch_get(fun, target, USB_TRANSFER_INTERRUPT, 116 max_packet_size, speed, data, size, NULL, 0, NULL, callback, arg, 117 &hc->device_manager); 116 max_packet_size, speed, data, size, NULL, 0, NULL, callback, arg); 118 117 if (!batch) 119 118 return ENOMEM; … … 134 133 135 134 batch_t *batch = batch_get(fun, target, USB_TRANSFER_INTERRUPT, 136 max_packet_size, speed, data, size, NULL, 0, callback, NULL, arg, 137 &hc->device_manager); 135 max_packet_size, speed, data, size, NULL, 0, callback, NULL, arg); 138 136 if (!batch) 139 137 return ENOMEM; … … 155 153 156 154 batch_t *batch = batch_get(fun, target, USB_TRANSFER_BULK, 157 max_packet_size, speed, data, size, NULL, 0, NULL, callback, arg, 158 &hc->device_manager); 155 max_packet_size, speed, data, size, NULL, 0, NULL, callback, arg); 159 156 if (!batch) 160 157 return ENOMEM; … … 175 172 176 173 batch_t *batch = batch_get(fun, target, USB_TRANSFER_BULK, 177 max_packet_size, speed, data, size, NULL, 0, callback, NULL, arg, 178 &hc->device_manager); 174 max_packet_size, speed, data, size, NULL, 0, callback, NULL, arg); 179 175 if (!batch) 180 176 return ENOMEM; … … 195 191 target.address, target.endpoint, size, max_packet_size); 196 192 197 if (setup_size != 8)198 return EINVAL;199 200 193 batch_t *batch = batch_get(fun, target, USB_TRANSFER_CONTROL, 201 194 max_packet_size, speed, data, size, setup_data, setup_size, 202 NULL, callback, arg, &hc->device_manager); 203 if (!batch) 204 return ENOMEM; 205 device_keeper_reset_if_need(&hc->device_manager, target, setup_data); 195 NULL, callback, arg); 196 if (!batch) 197 return ENOMEM; 206 198 batch_control_write(batch); 207 199 return EOK; … … 222 214 batch_t *batch = batch_get(fun, target, USB_TRANSFER_CONTROL, 223 215 max_packet_size, speed, data, size, setup_data, setup_size, callback, 224 NULL, arg , &hc->device_manager);216 NULL, arg); 225 217 if (!batch) 226 218 return ENOMEM; -
uspace/drv/uhci-hcd/uhci.c
r8a20380 r24d5432 167 167 /* reset hc, all states and counters */ 168 168 pio_write_16(&instance->registers->usbcmd, UHCI_CMD_HCRESET); 169 do { async_usleep(10); }170 while ((pio_read_16(&instance->registers->usbcmd) & UHCI_CMD_HCRESET) != 0);169 while ((pio_read_16(&instance->registers->usbcmd) & UHCI_CMD_HCRESET) != 0) 170 { async_usleep(10); } 171 171 172 172 /* set framelist pointer */ … … 175 175 176 176 /* enable all interrupts, but resume interrupt */ 177 // pio_write_16(&instance->registers->usbintr, 178 // UHCI_INTR_CRC | UHCI_INTR_COMPLETE | UHCI_INTR_SHORT_PACKET); 179 180 uint16_t status = pio_read_16(&instance->registers->usbcmd); 181 usb_log_warning("Previous command value: %x.\n", status); 177 pio_write_16(&instance->registers->usbintr, 178 UHCI_INTR_CRC | UHCI_INTR_COMPLETE | UHCI_INTR_SHORT_PACKET); 179 182 180 /* Start the hc with large(64B) packet FSBR */ 183 181 pio_write_16(&instance->registers->usbcmd, -
uspace/drv/uhci-hcd/uhci_struct/transfer_descriptor.c
r8a20380 r24d5432 75 75 instance->next, instance->status, instance->device, 76 76 instance->buffer_ptr, buffer); 77 if (pid == USB_PID_SETUP) {78 usb_log_debug("SETUP BUFFER: %s\n",79 usb_debug_str_buffer(buffer, 8, 8));80 }81 77 } 82 78 /*----------------------------------------------------------------------------*/ -
uspace/drv/uhci-hcd/uhci_struct/transfer_descriptor.h
r8a20380 r24d5432 115 115 } 116 116 117 static inline int td_toggle(td_t *instance)118 {119 assert(instance);120 return ((instance->device & TD_DEVICE_DATA_TOGGLE_ONE_FLAG) != 0)121 ? 1 : 0;122 }123 124 117 static inline bool td_is_active(td_t *instance) 125 118 { -
uspace/drv/uhci-hcd/utils/device_keeper.c
r8a20380 r24d5432 49 49 instance->devices[i].occupied = false; 50 50 instance->devices[i].handle = 0; 51 instance->devices[i].toggle_status = 0;52 51 } 53 52 } … … 76 75 } 77 76 /*----------------------------------------------------------------------------*/ 78 void device_keeper_reset_if_need(79 device_keeper_t *instance, usb_target_t target, const unsigned char *data)80 {81 assert(instance);82 fibril_mutex_lock(&instance->guard);83 if (target.endpoint > 15 || target.endpoint < 084 || target.address >= USB_ADDRESS_COUNT || target.address < 085 || !instance->devices[target.address].occupied) {86 goto the_end;87 }88 89 switch (data[1])90 {91 case 0x01: /*clear feature*/92 /* recipient is enpoint, value is zero (ENDPOINT_STALL) */93 if (((data[0] & 0xf) == 1) && ((data[2] | data[3]) == 0)) {94 /* enpoint number is < 16, thus first byte is enough */95 instance->devices[target.address].toggle_status &= ~(1 << data[4]);96 }97 break;98 99 case 0x9: /* set configuration */100 case 0x11: /* set interface */101 instance->devices[target.address].toggle_status = 0;102 break;103 }104 the_end:105 fibril_mutex_unlock(&instance->guard);106 }107 /*----------------------------------------------------------------------------*/108 int device_keeper_get_toggle(device_keeper_t *instance, usb_target_t target)109 {110 assert(instance);111 int ret;112 fibril_mutex_lock(&instance->guard);113 if (target.endpoint > 15 || target.endpoint < 0114 || target.address >= USB_ADDRESS_COUNT || target.address < 0115 || !instance->devices[target.address].occupied) {116 ret = EINVAL;117 } else {118 ret = (instance->devices[target.address].toggle_status >> target.endpoint) & 1;119 }120 fibril_mutex_unlock(&instance->guard);121 return ret;122 }123 /*----------------------------------------------------------------------------*/124 int device_keeper_set_toggle(125 device_keeper_t *instance, usb_target_t target, bool toggle)126 {127 assert(instance);128 int ret;129 fibril_mutex_lock(&instance->guard);130 if (target.endpoint > 15 || target.endpoint < 0131 || target.address >= USB_ADDRESS_COUNT || target.address < 0132 || !instance->devices[target.address].occupied) {133 ret = EINVAL;134 } else {135 if (toggle) {136 instance->devices[target.address].toggle_status |= (1 << target.endpoint);137 } else {138 instance->devices[target.address].toggle_status &= ~(1 << target.endpoint);139 }140 ret = EOK;141 }142 fibril_mutex_unlock(&instance->guard);143 return ret;144 }145 /*----------------------------------------------------------------------------*/146 77 usb_address_t device_keeper_request( 147 78 device_keeper_t *instance, usb_speed_t speed) … … 165 96 instance->devices[new_address].occupied = true; 166 97 instance->devices[new_address].speed = speed; 167 instance->devices[new_address].toggle_status = 0;168 98 instance->last_address = new_address; 169 99 fibril_mutex_unlock(&instance->guard); -
uspace/drv/uhci-hcd/utils/device_keeper.h
r8a20380 r24d5432 44 44 usb_speed_t speed; 45 45 bool occupied; 46 uint16_t toggle_status;47 46 devman_handle_t handle; 48 47 }; … … 56 55 57 56 void device_keeper_init(device_keeper_t *instance); 58 59 57 void device_keeper_reserve_default( 60 58 device_keeper_t *instance, usb_speed_t speed); 61 62 59 void device_keeper_release_default(device_keeper_t *instance); 63 64 void device_keeper_reset_if_need(65 device_keeper_t *instance, usb_target_t target, const unsigned char *setup_data);66 67 int device_keeper_get_toggle(device_keeper_t *instance, usb_target_t target);68 69 int device_keeper_set_toggle(70 device_keeper_t *instance, usb_target_t target, bool toggle);71 60 72 61 usb_address_t device_keeper_request( 73 62 device_keeper_t *instance, usb_speed_t speed); 74 75 63 void device_keeper_bind( 76 64 device_keeper_t *instance, usb_address_t address, devman_handle_t handle); 77 78 65 void device_keeper_release(device_keeper_t *instance, usb_address_t address); 79 80 66 usb_address_t device_keeper_find( 81 67 device_keeper_t *instance, devman_handle_t handle);
Note:
See TracChangeset
for help on using the changeset viewer.