Changes in / [8d517c3:34e8bab] in mainline
- Location:
- uspace/drv
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/ohci/ohci_regs.h
r8d517c3 r34e8bab 55 55 #define C_HCFS_MASK (0x3) /* Host controller functional state */ 56 56 #define C_HCFS_RESET (0x0) 57 #define C_HCFS_ RESUME(0x1)58 #define C_HCFS_ OPERATIONAL(0x2)57 #define C_HCFS_OPERATIONAL (0x1) 58 #define C_HCFS_RESUME (0x2) 59 59 #define C_HCFS_SUSPEND (0x3) 60 60 #define C_HCFS_SHIFT (6) -
uspace/drv/uhci-hcd/hc.c
r8d517c3 r34e8bab 247 247 { 248 248 assert(instance); 249 #define SETUP_TRANSFER_LIST(type, name) \ 250 do { \ 251 int ret = transfer_list_init(&instance->transfers_##type, name); \ 249 #define CHECK_RET_CLEAR_RETURN(ret, message...) \ 252 250 if (ret != EOK) { \ 253 usb_log_error("Failed(%d) to setup %s transfer list: %s.\n", \ 254 ret, name, str_error(ret)); \ 251 usb_log_error(message); \ 255 252 transfer_list_fini(&instance->transfers_bulk_full); \ 256 253 transfer_list_fini(&instance->transfers_control_full); \ … … 258 255 transfer_list_fini(&instance->transfers_interrupt); \ 259 256 return ret; \ 260 } \ 261 } while (0) 262 263 SETUP_TRANSFER_LIST(bulk_full, "BULK FULL"); 264 SETUP_TRANSFER_LIST(control_full, "CONTROL FULL"); 265 SETUP_TRANSFER_LIST(control_slow, "CONTROL LOW"); 266 SETUP_TRANSFER_LIST(interrupt, "INTERRUPT"); 267 #undef SETUP_TRANSFER_LIST 268 /* Connect lists into one schedule */ 257 } else (void) 0 258 259 /* initialize TODO: check errors */ 260 int ret; 261 ret = transfer_list_init(&instance->transfers_bulk_full, "BULK_FULL"); 262 CHECK_RET_CLEAR_RETURN(ret, "Failed to init BULK list."); 263 264 ret = transfer_list_init( 265 &instance->transfers_control_full, "CONTROL_FULL"); 266 CHECK_RET_CLEAR_RETURN(ret, "Failed to init CONTROL FULL list."); 267 268 ret = transfer_list_init( 269 &instance->transfers_control_slow, "CONTROL_SLOW"); 270 CHECK_RET_CLEAR_RETURN(ret, "Failed to init CONTROL SLOW list."); 271 272 ret = transfer_list_init(&instance->transfers_interrupt, "INTERRUPT"); 273 CHECK_RET_CLEAR_RETURN(ret, "Failed to init INTERRUPT list."); 274 269 275 transfer_list_set_next(&instance->transfers_control_full, 270 276 &instance->transfers_bulk_full); … … 331 337 assert(instance); 332 338 // status |= 1; //Uncomment to work around qemu hang 339 /* TODO: Resume interrupts are not supported */ 333 340 /* Lower 2 bits are transaction error and transaction complete */ 334 if (status & (UHCI_STATUS_INTERRUPT | UHCI_STATUS_ERROR_INTERRUPT)) {341 if (status & 0x3) { 335 342 LIST_INITIALIZE(done); 336 343 transfer_list_remove_finished( … … 351 358 } 352 359 } 353 /* Resume interrupts are not supported */ 354 355 /* Bits 4 and 5 indicate hc error */ 356 if (status & (UHCI_STATUS_PROCESS_ERROR | UHCI_STATUS_SYSTEM_ERROR)) { 360 /* bits 4 and 5 indicate hc error */ 361 if (status & 0x18) { 357 362 usb_log_error("UHCI hardware failure!.\n"); 358 363 ++instance->hw_failures; … … 384 389 385 390 while (1) { 386 /* Readd and clear status register*/391 /* read and ack interrupts */ 387 392 uint16_t status = pio_read_16(&instance->registers->usbsts); 388 pio_write_16(&instance->registers->usbsts, status);393 pio_write_16(&instance->registers->usbsts, 0x1f); 389 394 if (status != 0) 390 395 usb_log_debug2("UHCI status: %x.\n", status); 391 396 hc_interrupt(instance, status); 392 async_usleep(UHCI_ INT_EMULATOR_TIMEOUT);397 async_usleep(UHCI_CLEANER_TIMEOUT); 393 398 } 394 399 return EOK; -
uspace/drv/uhci-hcd/hc.h
r8d517c3 r34e8bab 88 88 89 89 #define UHCI_FRAME_LIST_COUNT 1024 90 #define UHCI_ INT_EMULATOR_TIMEOUT 1000090 #define UHCI_CLEANER_TIMEOUT 10000 91 91 #define UHCI_DEBUGER_TIMEOUT 5000000 92 92 #define UHCI_ALLOWED_HW_FAIL 5 -
uspace/drv/uhci-hcd/main.c
r8d517c3 r34e8bab 78 78 device->driver_data = uhci; 79 79 80 usb_log_info("Controlling new UHCI device '%s'.\n", device->name);80 usb_log_info("Controlling new UHCI device `%s'.\n", device->name); 81 81 82 82 return EOK; -
uspace/drv/uhci-rhd/port.c
r8d517c3 r34e8bab 68 68 * @return Error code. (Always EOK) 69 69 */ 70 static inline void uhci_port_write_status(uhci_port_t *port, port_status_t val) 71 { 72 assert(port); 73 pio_write_16(port->address, val); 70 static inline void uhci_port_write_status( 71 uhci_port_t *port, port_status_t value) 72 { 73 assert(port); 74 pio_write_16(port->address, value); 74 75 } 75 76 /*----------------------------------------------------------------------------*/ … … 100 101 port->rh = rh; 101 102 102 int r et =103 usb_hc_connection_initialize_from_device(&port->hc_connection, rh);104 if (r et!= EOK) {103 int rc = usb_hc_connection_initialize_from_device( 104 &port->hc_connection, rh); 105 if (rc != EOK) { 105 106 usb_log_error("Failed to initialize connection to HC."); 106 return r et;107 return rc; 107 108 } 108 109 … … 237 238 /* Enable the port. */ 238 239 uhci_port_set_enabled(port, true); 240 239 241 return EOK; 240 242 } … … 269 271 usb_log_info("New device at port %u, address %d (handle %llu).\n", 270 272 port->number, dev_addr, port->attached_device); 273 271 274 return EOK; 272 275 } … … 310 313 /* Write new value. */ 311 314 uhci_port_write_status(port, port_status); 312 313 /* Wait for port to become enabled */314 do {315 async_usleep(1000);316 port_status = uhci_port_read_status(port);317 } while ((port_status & STATUS_CONNECTED) &&318 !(port_status & STATUS_ENABLED));319 315 320 316 usb_log_debug("%s: %sabled port.\n", -
uspace/drv/uhci-rhd/port.h
r8d517c3 r34e8bab 54 54 #define STATUS_SUSPEND (1 << 12) 55 55 56 /** UHCI port structure */57 56 typedef struct uhci_port 58 57 { -
uspace/drv/uhci-rhd/root_hub.c
r8d517c3 r34e8bab 33 33 */ 34 34 #include <errno.h> 35 #include <str_error.h>36 35 #include <ddi.h> 37 36 #include <usb/debug.h> … … 44 43 * @param[in] addr Address of I/O registers. 45 44 * @param[in] size Size of available I/O space. 46 * @param[in] rh Pointer to DDFinstance of the root hub driver.45 * @param[in] rh Pointer to ddf instance of the root hub driver. 47 46 * @return Error code. 48 47 */ … … 59 58 if (ret < 0) { 60 59 usb_log_error( 61 "Failed(%d) to gain access to port registers at %p : %s.\n",62 ret, regs , str_error(ret));60 "Failed(%d) to gain access to port registers at %p\n", 61 ret, regs); 63 62 return ret; 64 63 } … … 67 66 unsigned i = 0; 68 67 for (; i < UHCI_ROOT_HUB_PORT_COUNT; ++i) { 68 /* NOTE: mind pointer arithmetics here */ 69 69 ret = uhci_port_init( 70 &instance->ports[i], ®s[i], i, ROOT_HUB_WAIT_USEC, rh);70 &instance->ports[i], regs + i, i, ROOT_HUB_WAIT_USEC, rh); 71 71 if (ret != EOK) { 72 72 unsigned j = 0; -
uspace/drv/uhci-rhd/root_hub.h
r8d517c3 r34e8bab 42 42 #define ROOT_HUB_WAIT_USEC 250000 /* 250 miliseconds */ 43 43 44 /** UHCI root hub drvier structure */45 44 typedef struct root_hub { 46 /** Ports provided by the hub */47 45 uhci_port_t ports[UHCI_ROOT_HUB_PORT_COUNT]; 46 devman_handle_t hc_handle; 48 47 } uhci_root_hub_t; 49 48 50 49 int uhci_root_hub_init( 51 50 uhci_root_hub_t *instance, void *addr, size_t size, ddf_dev_t *rh); 52 51 53 52 void uhci_root_hub_fini(uhci_root_hub_t *instance);
Note:
See TracChangeset
for help on using the changeset viewer.