Changeset 45c01a1 in mainline for uspace/drv/uhci-hcd/uhci.c
- Timestamp:
- 2011-02-12T22:20:22Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 54d9058, bfe0eb5, d15809b4
- Parents:
- 8f5b6561 (diff), 600733e (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. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/uhci-hcd/uhci.c
r8f5b6561 r45c01a1 89 89 pio_write_32(&instance->registers->flbaseadd, (uint32_t)pa); 90 90 91 list_initialize(&instance-> tracker_list);92 fibril_mutex_initialize(&instance-> tracker_list_mutex);91 list_initialize(&instance->batch_list); 92 fibril_mutex_initialize(&instance->batch_list_mutex); 93 93 94 94 instance->cleaner = fibril_create(uhci_clean_finished, instance); … … 152 152 } 153 153 /*----------------------------------------------------------------------------*/ 154 int uhci_schedule(uhci_t *instance, tracker_t *tracker)155 { 156 assert(instance); 157 assert( tracker);158 const int low_speed = ( tracker->speed == LOW_SPEED);154 int uhci_schedule(uhci_t *instance, batch_t *batch) 155 { 156 assert(instance); 157 assert(batch); 158 const int low_speed = (batch->speed == LOW_SPEED); 159 159 if (!allowed_usb_packet( 160 low_speed, tracker->transfer_type, tracker->packet_size)) {160 low_speed, batch->transfer_type, batch->max_packet_size)) { 161 161 usb_log_warning("Invalid USB packet specified %s SPEED %d %zu.\n", 162 low_speed ? "LOW" : "FULL" , tracker->transfer_type,163 tracker->packet_size);162 low_speed ? "LOW" : "FULL" , batch->transfer_type, 163 batch->max_packet_size); 164 164 return ENOTSUP; 165 165 } 166 166 /* TODO: check available bandwith here */ 167 167 168 usb_log_debug2("Scheduler(%d) acquiring tracker list mutex.\n",169 fibril_get_id());170 fibril_mutex_lock(&instance->tracker_list_mutex);171 usb_log_debug2("Scheduler(%d) acquired tracker list mutex.\n",172 fibril_get_id());173 174 168 transfer_list_t *list = 175 instance->transfers[low_speed][ tracker->transfer_type];169 instance->transfers[low_speed][batch->transfer_type]; 176 170 assert(list); 177 transfer_list_add_tracker(list, tracker); 178 list_append(&tracker->link, &instance->tracker_list); 179 180 tracker->scheduled_list = list; 181 182 usb_log_debug2("Scheduler(%d) releasing tracker list mutex.\n", 183 fibril_get_id()); 184 fibril_mutex_unlock(&instance->tracker_list_mutex); 185 usb_log_debug2("Scheduler(%d) released tracker list mutex.\n", 186 fibril_get_id()); 171 transfer_list_add_batch(list, batch); 187 172 188 173 return EOK; … … 196 181 197 182 while(1) { 198 LIST_INITIALIZE(done_trackers); 199 /* tracker iteration */ 200 201 usb_log_debug2("Cleaner(%d) acquiring tracker list mutex.\n", 202 fibril_get_id()); 203 fibril_mutex_lock(&instance->tracker_list_mutex); 204 usb_log_debug2("Cleaner(%d) acquired tracker list mutex.\n", 205 fibril_get_id()); 206 207 link_t *current = instance->tracker_list.next; 208 while (current != &instance->tracker_list) 209 { 210 211 link_t *next = current->next; 212 tracker_t *tracker = list_get_instance(current, tracker_t, link); 213 214 assert(current == &tracker->link); 215 assert(tracker); 216 assert(tracker->next_step); 217 assert(tracker->td); 218 219 if (!transfer_descriptor_is_active(tracker->td)) { 220 usb_log_info("Found inactive tracker with status: %x:%x.\n", 221 tracker->td->status, tracker->td->device); 222 list_remove(current); 223 list_append(current, &done_trackers); 224 } 225 current = next; 226 } 227 228 usb_log_debug2("Cleaner(%d) releasing tracker list mutex.\n", 229 fibril_get_id()); 230 fibril_mutex_unlock(&instance->tracker_list_mutex); 231 usb_log_debug2("Cleaner(%d) released tracker list mutex.\n", 232 fibril_get_id()); 233 234 while (!list_empty(&done_trackers)) { 235 tracker_t *tracker = list_get_instance( 236 done_trackers.next, tracker_t, link); 237 list_remove(&tracker->link); 238 tracker->next_step(tracker); 239 } 183 transfer_list_check(&instance->transfers_interrupt); 184 transfer_list_check(&instance->transfers_control_slow); 185 transfer_list_check(&instance->transfers_control_full); 186 transfer_list_check(&instance->transfers_bulk_full); 240 187 async_usleep(UHCI_CLEANER_TIMEOUT); 241 188 }
Note:
See TracChangeset
for help on using the changeset viewer.