Changeset ffcc5776 in mainline for uspace/drv/bus/usb/ohci/root_hub.c
- Timestamp:
- 2012-02-23T06:00:07Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- bfc5c9dd
- Parents:
- 70922c2
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/ohci/root_hub.c
r70922c2 rffcc5776 33 33 */ 34 34 #include <assert.h> 35 #include <byteorder.h> 35 36 #include <errno.h> 36 37 #include <str_error.h> 37 38 #include <fibril_synch.h> 38 39 40 #include <usb/usb.h> 39 41 #include <usb/debug.h> 40 42 #include <usb/dev/request.h> 41 43 #include <usb/classes/hub.h> 42 44 43 #include "root_hub.h"44 45 #include <usb/classes/classes.h> 45 46 #include <usb/classes/hub.h> 46 47 #include <usb/dev/driver.h> 47 48 #include "ohci_regs.h" 49 #include "root_hub.h" 48 50 49 51 /** … … 122 124 { 123 125 assert(request); 126 usb_log_debug("Sending interrupt vector(%zu) %hhx:%hhx.\n", 127 size, ((uint8_t*)&mask)[0], ((uint8_t*)&mask)[1]); 124 128 usb_transfer_batch_finish_error(request, &mask, size, EOK); 125 129 usb_transfer_batch_destroy(request); … … 150 154 151 155 instance->registers = regs; 152 instance->port_count = 153 (instance->registers->rh_desc_a >> RHDA_NDS_SHIFT) & RHDA_NDS_MASK;156 instance->port_count = RHDA_NDS(instance->registers->rh_desc_a); 157 usb_log_debug("rh_desc_a: %x.\n", instance->registers->rh_desc_a); 154 158 if (instance->port_count > 15) { 155 159 usb_log_warning("OHCI specification does not allow more than 15" … … 184 188 185 189 /* Control all ports by global switch and turn them off */ 186 instance->registers->rh_desc_b &= (RHDB_PCC_MASK << RHDB_PCC_SHIFT);190 instance->registers->rh_desc_b &= ~RHDB_PCC_WRITE(~0); 187 191 instance->registers->rh_status = RHS_CLEAR_GLOBAL_POWER; 188 192 189 193 /* Return control to per port state */ 190 instance->registers->rh_desc_b |= 191 ((1 << (instance->port_count + 1)) - 1) << RHDB_PCC_SHIFT; 194 instance->registers->rh_desc_b |= RHDB_PCC_WRITE(~0); 192 195 193 196 /* Set per port over-current */ … … 226 229 fibril_mutex_lock(&instance->guard); 227 230 assert(instance->unfinished_interrupt_transfer == NULL); 228 uint16_t mask = create_interrupt_mask(instance);231 const uint16_t mask = create_interrupt_mask(instance); 229 232 if (mask == 0) { 230 usb_log_debug("No changes ...\n");233 usb_log_debug("No changes(%hx)...\n", mask); 231 234 instance->unfinished_interrupt_transfer = request; 232 235 } else { … … 257 260 if (instance->unfinished_interrupt_transfer) { 258 261 usb_log_debug("Finalizing interrupt transfer\n"); 259 uint16_t mask = create_interrupt_mask(instance);262 const uint16_t mask = create_interrupt_mask(instance); 260 263 interrupt_request(instance->unfinished_interrupt_transfer, 261 264 mask, instance->interrupt_mask_size); … … 282 285 instance->hub_descriptor_size = size; 283 286 284 uint32_t hub_desc = instance->registers->rh_desc_a;285 uint32_t port_desc = instance->registers->rh_desc_b;287 const uint32_t hub_desc = instance->registers->rh_desc_a; 288 const uint32_t port_desc = instance->registers->rh_desc_b; 286 289 287 290 /* bDescLength */ … … 305 308 instance->descriptors.hub[4] = 0; 306 309 /* bPwrOn2PwrGood */ 307 instance->descriptors.hub[5] = 308 (hub_desc >> RHDA_POTPGT_SHIFT) & RHDA_POTPGT_MASK; 310 instance->descriptors.hub[5] = RHDA_POTPGT(hub_desc); 309 311 /* bHubContrCurrent, root hubs don't need no power. */ 310 312 instance->descriptors.hub[6] = 0; 311 313 312 314 /* Device Removable and some legacy 1.0 stuff*/ 313 instance->descriptors.hub[7] = 314 (port_desc >> RHDB_DR_SHIFT) & RHDB_DR_MASK & 0xff; 315 instance->descriptors.hub[7] = RHDB_DR_READ(port_desc) & 0xff; 315 316 instance->descriptors.hub[8] = 0xff; 316 317 if (instance->interrupt_mask_size == 2) { 317 instance->descriptors.hub[8] = 318 (port_desc >> RHDB_DR_SHIFT) & RHDB_DR_MASK >> 8; 318 instance->descriptors.hub[8] = RHDB_DR_READ(port_desc) >> 8; 319 319 instance->descriptors.hub[9] = 0xff; 320 320 instance->descriptors.hub[10] = 0xff; … … 375 375 } 376 376 } 377 /* USB is little endian */378 return host2uint32_t_le(mask);377 usb_log_debug2("OHCI root hub interrupt mask: %hx.\n", mask); 378 return uint16_host2usb(mask); 379 379 } 380 380 /*----------------------------------------------------------------------------*/ … … 434 434 TRANSFER_END(request, EOVERFLOW); 435 435 } else { 436 uint16_t data =436 const uint16_t data = 437 437 uint16_host2usb(USB_DEVICE_STATUS_SELF_POWERED); 438 438 TRANSFER_END_DATA(request, &data, sizeof(data)); … … 482 482 usb_device_request_setup_packet_t *setup_request = 483 483 (usb_device_request_setup_packet_t *) request->setup_buffer; 484 uint16_t setup_request_value = setup_request->value_high;484 const int setup_request_value = uint16_usb2host(setup_request->value); 485 485 switch (setup_request_value) 486 486 { … … 568 568 case USB_HUB_FEATURE_PORT_SUSPEND: //2 569 569 case USB_HUB_FEATURE_PORT_RESET: //4 570 /* Nice thing is that these shifts correspond to the position 571 * of control bits in register */ 572 instance->registers->rh_port_status[port - 1] = (1 << feature); 570 usb_log_debug2( 571 "Setting port ENABLE, SUSPEND or RESET on port %zu.\n", 572 port); 573 instance->registers->rh_port_status[port - 1] = 574 RHPS_FEATURE_BIT(feature); 573 575 return EOK; 574 576 default: … … 624 626 case USB_HUB_FEATURE_C_PORT_OVER_CURRENT: //19 625 627 case USB_HUB_FEATURE_C_PORT_RESET: //20 626 /* Nice thing is that these shifts correspond to the position 627 * of control bits in register */ 628 instance->registers->rh_port_status[port - 1] = (1 << feature); 628 usb_log_debug2("Clearing port C_CONNECTION, C_ENABLE, " 629 "C_SUSPEND or C_RESET on port %zu.\n", 630 port); 631 instance->registers->rh_port_status[port - 1] = 632 RHPS_FEATURE_BIT(feature); 629 633 return EOK; 630 634 … … 795 799 case USB_DEVREQ_SET_CONFIGURATION: 796 800 usb_log_debug("USB_DEVREQ_SET_CONFIGURATION: %u\n", 797 setup_request->value);801 uint16_usb2host(setup_request->value)); 798 802 /* We have only one configuration, it's number is 1 */ 799 803 if (uint16_usb2host(setup_request->value) != 1)
Note:
See TracChangeset
for help on using the changeset viewer.