Changeset 3f189c5 in mainline for uspace/drv/uhci-hcd/uhci.c
- Timestamp:
- 2011-02-07T14:06:57Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- fe10e72
- Parents:
- 7e62b62
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/uhci-hcd/uhci.c
r7e62b62 r3f189c5 96 96 fibril_add_ready(instance->debug_checker); 97 97 98 /* Start the hc with large(64 b) packet FSBR */98 /* Start the hc with large(64B) packet FSBR */ 99 99 pio_write_16(&instance->registers->usbcmd, 100 100 UHCI_CMD_RUN_STOP | UHCI_CMD_MAX_PACKET); … … 146 146 instance->transfers[0][USB_TRANSFER_CONTROL] = 147 147 &instance->transfers_control_full; 148 149 return EOK;150 }151 /*----------------------------------------------------------------------------*/152 int uhci_transfer(153 uhci_t *instance,154 device_t *dev,155 usb_target_t target,156 usb_transfer_type_t transfer_type,157 bool toggle,158 usb_packet_id pid,159 bool low_speed,160 void *buffer, size_t size,161 usbhc_iface_transfer_out_callback_t callback_out,162 usbhc_iface_transfer_in_callback_t callback_in,163 void *arg)164 {165 if (!allowed_usb_packet(low_speed, transfer_type, size)) {166 usb_log_warning("Invalid USB packet specified %s SPEED %d %zu.\n",167 low_speed ? "LOW" : "FULL" , transfer_type, size);168 return ENOTSUP;169 }170 171 // TODO: Add support for isochronous transfers172 if (transfer_type == USB_TRANSFER_ISOCHRONOUS) {173 usb_log_warning("ISO transfer not supported.\n");174 return ENOTSUP;175 }176 177 transfer_list_t *list = instance->transfers[low_speed][transfer_type];178 assert(list);179 180 transfer_descriptor_t *td = NULL;181 callback_t *job = NULL;182 int ret = EOK;183 assert(dev);184 185 #define CHECK_RET_TRANS_FREE_JOB_TD(message) \186 if (ret != EOK) { \187 usb_log_error(message); \188 if (job) { \189 callback_dispose(job); \190 } \191 if (td) { free32(td); } \192 return ret; \193 } else (void) 0194 195 job = callback_get(dev, buffer, size, callback_in, callback_out, arg);196 ret = job ? EOK : ENOMEM;197 CHECK_RET_TRANS_FREE_JOB_TD("Failed to allocate callback structure.\n");198 199 td = transfer_descriptor_get(3, size, false, target, pid, job->new_buffer);200 ret = td ? EOK : ENOMEM;201 CHECK_RET_TRANS_FREE_JOB_TD("Failed to setup transfer descriptor.\n");202 203 td->callback = job;204 205 usb_log_debug("Appending a new transfer to queue %s.\n", list->name);206 207 ret = transfer_list_append(list, td);208 CHECK_RET_TRANS_FREE_JOB_TD("Failed to append transfer descriptor.\n");209 148 210 149 return EOK; … … 256 195 current = next; 257 196 } 258 /* iterate all transfer queues */259 transfer_list_t *current_list = &instance->transfers_interrupt;260 while (current_list) {261 /* Remove inactive transfers from the top of the queue262 * TODO: should I reach queue head or is this enough? */263 volatile transfer_descriptor_t * it =264 current_list->first;265 usb_log_debug("Running cleaning fibril on queue: %s (%s).\n",266 current_list->name, it ? "SOMETHING" : "EMPTY");267 268 if (it) {269 usb_log_debug("First in queue: %p (%x) PA:%x.\n",270 it, it->status, addr_to_phys((void*)it) );271 usb_log_debug("First to send: %x\n",272 (current_list->queue_head->element) );273 }274 275 while (current_list->first &&276 !(current_list->first->status & TD_STATUS_ERROR_ACTIVE)) {277 transfer_descriptor_t *transfer = current_list->first;278 usb_log_info("Inactive transfer calling callback with status %x.\n",279 transfer->status);280 current_list->first = transfer->next_va;281 transfer_descriptor_dispose(transfer);282 }283 if (!current_list->first)284 current_list->last = current_list->first;285 286 current_list = current_list->next;287 }288 197 async_usleep(UHCI_CLEANER_TIMEOUT); 289 198 } … … 352 261 return (!low_speed && size < 1024); 353 262 case USB_TRANSFER_INTERRUPT: 354 return size <= (low_speed ? 8 : 64);263 return size <= (low_speed ? 8 : 64); 355 264 case USB_TRANSFER_CONTROL: /* device specifies its own max size */ 356 265 return (size <= (low_speed ? 8 : 64));
Note:
See TracChangeset
for help on using the changeset viewer.