Changeset 5c1a65e in mainline
- Timestamp:
- 2011-05-28T20:16:03Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 6ab7f3e9
- Parents:
- 4166fb1
- Location:
- uspace/drv/usbhub
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/usbhub/ports.c
r4166fb1 r5c1a65e 47 47 #include "port_status.h" 48 48 49 50 49 /** Information for fibril for device discovery. */ 51 50 struct add_device_phase1 { … … 65 64 * any function here and must be cleared by hand 66 65 */ 67 static const int non_handled_changes[] = 66 static const int non_handled_changes[] = { 68 67 USB_HUB_FEATURE_C_PORT_ENABLE, 69 68 USB_HUB_FEATURE_C_PORT_SUSPEND … … 71 70 72 71 static void usb_hub_removed_device( 73 usb_hub_info_t *hub, uint16_t port);74 75 static void usb_hub_port_reset_completed(usb_hub_info_t * 76 77 78 static void usb_hub_port_over_current(usb_hub_info_t * 79 72 usb_hub_info_t *hub, uint16_t port); 73 74 static void usb_hub_port_reset_completed(usb_hub_info_t *hub, 75 uint16_t port, uint32_t status); 76 77 static void usb_hub_port_over_current(usb_hub_info_t *hub, 78 uint16_t port, uint32_t status); 80 79 81 80 static int get_port_status(usb_pipe_t *ctrl_pipe, size_t port, … … 96 95 * @param port port number, starting from 1 97 96 */ 98 void usb_hub_process_interrupt(usb_hub_info_t * 99 100 usb_log_debug(" interrupt at port %zu\n", (size_t) port);97 void usb_hub_process_interrupt(usb_hub_info_t *hub, 98 uint16_t port) { 99 usb_log_debug("Interrupt at port %zu\n", (size_t) port); 101 100 //determine type of change 102 101 //usb_pipe_t *pipe = hub->control_pipe; … … 134 133 if (usb_port_is_status(status, USB_HUB_FEATURE_C_PORT_OVER_CURRENT)) { 135 134 //check if it was not auto-resolved 136 usb_log_debug(" overcurrent change on port\n");135 usb_log_debug("Overcurrent change on port\n"); 137 136 usb_hub_port_over_current(hub, port, status); 138 137 } … … 141 140 usb_hub_port_reset_completed(hub, port, status); 142 141 } 143 usb_log_debug(" status x%x : %d\n ", status, status);142 usb_log_debug("Status x%x : %d\n ", status, status); 144 143 145 144 usb_port_status_set_bit( 146 &status, USB_HUB_FEATURE_C_PORT_CONNECTION, false);145 &status, USB_HUB_FEATURE_C_PORT_CONNECTION, false); 147 146 usb_port_status_set_bit( 148 &status, USB_HUB_FEATURE_C_PORT_RESET, false);147 &status, USB_HUB_FEATURE_C_PORT_RESET, false); 149 148 usb_port_status_set_bit( 150 &status, USB_HUB_FEATURE_C_PORT_OVER_CURRENT, false);151 149 &status, USB_HUB_FEATURE_C_PORT_OVER_CURRENT, false); 150 152 151 //clearing not yet handled changes 153 152 unsigned int feature_idx; 154 for(feature_idx = 0;feature_idx<non_handled_changes_count; 155 ++feature_idx){ 153 for (feature_idx = 0; 154 feature_idx < non_handled_changes_count; 155 ++feature_idx) { 156 156 unsigned int bit_idx = non_handled_changes[feature_idx]; 157 if (status & (1<<bit_idx)){157 if (status & (1 << bit_idx)) { 158 158 usb_log_info( 159 " there was not yet handled change on port %d: %d"159 "There was not yet handled change on port %d: %d" 160 160 ";clearing it\n", 161 port, bit_idx);161 port, bit_idx); 162 162 int opResult = usb_hub_clear_port_feature( 163 163 hub->control_pipe, … … 165 165 if (opResult != EOK) { 166 166 usb_log_warning( 167 " could not clear port flag %d: %d\n",168 bit_idx, opResult167 "Could not clear port flag %d: %s\n", 168 bit_idx, str_error(opResult) 169 169 ); 170 170 } 171 171 usb_port_status_set_bit( 172 &status, bit_idx, false);172 &status, bit_idx, false); 173 173 } 174 174 } 175 if (status>>16){176 usb_log_info(" there is still some unhandled change %X\n",175 if (status >> 16) { 176 usb_log_info("There is still some unhandled change %X\n", 177 177 status); 178 178 } 179 179 } 180 181 180 182 181 /** … … 190 189 */ 191 190 static void usb_hub_removed_device( 192 usb_hub_info_t *hub, uint16_t port) {191 usb_hub_info_t *hub, uint16_t port) { 193 192 194 193 int opResult = usb_hub_clear_port_feature(hub->control_pipe, 195 194 port, USB_HUB_FEATURE_C_PORT_CONNECTION); 196 195 if (opResult != EOK) { 197 usb_log_warning(" could not clear port-change-connection flag\n");196 usb_log_warning("Could not clear port-change-connection flag\n"); 198 197 } 199 198 /** \TODO remove device from device manager - not yet implemented in … … 231 230 } 232 231 233 234 232 /** 235 233 * Process port reset change … … 241 239 * @param status 242 240 */ 243 static void usb_hub_port_reset_completed(usb_hub_info_t * 244 uint16_t port, uint32_t status){241 static void usb_hub_port_reset_completed(usb_hub_info_t *hub, 242 uint16_t port, uint32_t status) { 245 243 usb_log_debug("Port %zu reset complete.\n", (size_t) port); 246 244 if (usb_port_is_status(status, USB_HUB_FEATURE_PORT_ENABLE)) { … … 274 272 * @param port port number, starting from 1 275 273 */ 276 static void usb_hub_port_over_current(usb_hub_info_t * 277 274 static void usb_hub_port_over_current(usb_hub_info_t *hub, 275 uint16_t port, uint32_t status) { 278 276 int opResult; 279 if (usb_port_is_status(status, USB_HUB_FEATURE_PORT_OVER_CURRENT)){277 if (usb_port_is_status(status, USB_HUB_FEATURE_PORT_OVER_CURRENT)) { 280 278 opResult = usb_hub_clear_port_feature(hub->control_pipe, 281 279 port, USB_HUB_FEATURE_PORT_POWER); 282 280 if (opResult != EOK) { 283 usb_log_error(" cannot power off port %d; %d\n",284 port, opResult);281 usb_log_error("Cannot power off port %d; %s\n", 282 port, str_error(opResult)); 285 283 } 286 } else{284 } else { 287 285 opResult = usb_hub_set_port_feature(hub->control_pipe, 288 286 port, USB_HUB_FEATURE_PORT_POWER); 289 287 if (opResult != EOK) { 290 usb_log_error(" cannot power on port %d; %d\n",291 port, opResult);288 usb_log_error("Cannot power on port %d; %s\n", 289 port, str_error(opResult)); 292 290 } 293 291 } … … 302 300 */ 303 301 static int get_port_status(usb_pipe_t *ctrl_pipe, size_t port, 304 usb_port_status_t *status) 305 { 302 usb_port_status_t *status) { 306 303 size_t recv_size; 307 304 usb_device_request_setup_packet_t request; … … 310 307 usb_hub_set_port_status_request(&request, port); 311 308 int rc = usb_pipe_control_read(ctrl_pipe, 312 &request, sizeof (usb_device_request_setup_packet_t),313 &status_tmp, sizeof (status_tmp), &recv_size);309 &request, sizeof (usb_device_request_setup_packet_t), 310 &status_tmp, sizeof (status_tmp), &recv_size); 314 311 if (rc != EOK) { 315 312 return rc; … … 336 333 * @return Error code. 337 334 */ 338 static int enable_port_callback(int port_no, void *arg) 339 { 335 static int enable_port_callback(int port_no, void *arg) { 340 336 usb_hub_info_t *hub = arg; 341 337 int rc; … … 345 341 usb_hub_set_reset_port_request(&request, port_no); 346 342 rc = usb_pipe_control_write(hub->control_pipe, 347 &request, sizeof (request), NULL, 0);343 &request, sizeof (request), NULL, 0); 348 344 if (rc != EOK) { 349 345 usb_log_warning("Port reset failed: %s.\n", str_error(rc)); … … 375 371 * @return 0 Always. 376 372 */ 377 static int add_device_phase1_worker_fibril(void *arg) 378 { 373 static int add_device_phase1_worker_fibril(void *arg) { 379 374 struct add_device_phase1 *data 380 375 = (struct add_device_phase1 *) arg; … … 418 413 } 419 414 420 421 415 /** Start device adding when connection change is detected. 422 416 * … … 429 423 */ 430 424 static int create_add_device_fibril(usb_hub_info_t *hub, size_t port, 431 usb_speed_t speed) 432 { 425 usb_speed_t speed) { 433 426 struct add_device_phase1 *data 434 = malloc(sizeof (struct add_device_phase1));427 = malloc(sizeof (struct add_device_phase1)); 435 428 if (data == NULL) { 436 429 return ENOMEM; -
uspace/drv/usbhub/usbhub.c
r4166fb1 r5c1a65e 56 56 57 57 58 static usb_hub_info_t * usb_hub_info_create(usb_device_t * 59 60 static int usb_hub_process_hub_specific_info(usb_hub_info_t * 61 62 static int usb_hub_set_configuration(usb_hub_info_t * 63 64 static int usb_hub_start_hub_fibril(usb_hub_info_t * 65 66 static int usb_process_hub_over_current(usb_hub_info_t * 58 static usb_hub_info_t * usb_hub_info_create(usb_device_t *usb_dev); 59 60 static int usb_hub_process_hub_specific_info(usb_hub_info_t *hub_info); 61 62 static int usb_hub_set_configuration(usb_hub_info_t *hub_info); 63 64 static int usb_hub_start_hub_fibril(usb_hub_info_t *hub_info); 65 66 static int usb_process_hub_over_current(usb_hub_info_t *hub_info, 67 67 usb_hub_status_t status); 68 68 69 static int usb_process_hub_local_power_change(usb_hub_info_t * 69 static int usb_process_hub_local_power_change(usb_hub_info_t *hub_info, 70 70 usb_hub_status_t status); 71 71 72 static void usb_hub_process_global_interrupt(usb_hub_info_t * 73 74 static void usb_hub_polling_terminated_callback(usb_device_t * 72 static void usb_hub_process_global_interrupt(usb_hub_info_t *hub_info); 73 74 static void usb_hub_polling_terminated_callback(usb_device_t *device, 75 75 bool was_error, void * data); 76 76 … … 90 90 * @return error code 91 91 */ 92 int usb_hub_add_device(usb_device_t * 92 int usb_hub_add_device(usb_device_t *usb_dev) { 93 93 if (!usb_dev) return EINVAL; 94 usb_hub_info_t * 94 usb_hub_info_t *hub_info = usb_hub_info_create(usb_dev); 95 95 //create hc connection 96 96 usb_log_debug("Initializing USB wire abstraction.\n"); … … 99 99 hub_info->usb_device->ddf_dev); 100 100 if (opResult != EOK) { 101 usb_log_error(" could not initialize connection to device, "102 " errno %d\n",103 opResult);101 usb_log_error("Could not initialize connection to device, " 102 " %s\n", 103 str_error(opResult)); 104 104 free(hub_info); 105 105 return opResult; … … 109 109 opResult = usb_hub_set_configuration(hub_info); 110 110 if (opResult != EOK) { 111 usb_log_error(" could not set hub configuration, errno %d\n",112 opResult);111 usb_log_error("Could not set hub configuration, %s\n", 112 str_error(opResult)); 113 113 free(hub_info); 114 114 return opResult; … … 117 117 opResult = usb_hub_process_hub_specific_info(hub_info); 118 118 if (opResult != EOK) { 119 usb_log_error(" could process hub specific info, errno %d\n",120 opResult);119 usb_log_error("Could process hub specific info, %s\n", 120 str_error(opResult)); 121 121 free(hub_info); 122 122 return opResult; … … 135 135 136 136 opResult = usb_hub_start_hub_fibril(hub_info); 137 if (opResult!=EOK)137 if (opResult != EOK) 138 138 free(hub_info); 139 139 return opResult; 140 140 } 141 142 141 143 142 /** Callback for polling hub for changes. … … 193 192 * @return basic usb_hub_info_t structure 194 193 */ 195 static usb_hub_info_t * usb_hub_info_create(usb_device_t * 196 usb_hub_info_t * result = malloc(sizeof (usb_hub_info_t));194 static usb_hub_info_t * usb_hub_info_create(usb_device_t *usb_dev) { 195 usb_hub_info_t * result = malloc(sizeof (usb_hub_info_t)); 197 196 if (!result) return NULL; 198 197 result->usb_device = usb_dev; … … 202 201 203 202 result->ports = NULL; 204 result->port_count = (size_t) - 1;203 result->port_count = (size_t) - 1; 205 204 fibril_mutex_initialize(&result->port_mutex); 206 205 … … 221 220 * @return error code 222 221 */ 223 static int usb_hub_process_hub_specific_info(usb_hub_info_t * 222 static int usb_hub_process_hub_specific_info(usb_hub_info_t *hub_info) { 224 223 // get hub descriptor 225 usb_log_debug(" creating serialized descriptor\n");224 usb_log_debug("Creating serialized descriptor\n"); 226 225 uint8_t serialized_descriptor[USB_HUB_MAX_DESCRIPTOR_SIZE]; 227 226 usb_hub_descriptor_t * descriptor; … … 235 234 236 235 if (opResult != EOK) { 237 usb_log_error(" failed when receiving hub descriptor, "238 " badcode = %d\n",239 opResult);236 usb_log_error("Failed when receiving hub descriptor, " 237 "%s\n", 238 str_error(opResult)); 240 239 free(serialized_descriptor); 241 240 return opResult; 242 241 } 243 usb_log_debug2(" deserializing descriptor\n");242 usb_log_debug2("Deserializing descriptor\n"); 244 243 descriptor = usb_create_deserialized_hub_desriptor( 245 244 serialized_descriptor); … … 252 251 /// \TODO this is not semantically correct 253 252 bool is_power_switched = 254 ((descriptor->hub_characteristics & 1) == 0);253 ((descriptor->hub_characteristics & 1) == 0); 255 254 bool has_individual_port_powering = 256 ((descriptor->hub_characteristics & 1) != 0);255 ((descriptor->hub_characteristics & 1) != 0); 257 256 hub_info->ports = malloc( 258 257 sizeof (usb_hub_port_t) * (hub_info->port_count + 1)); 259 if (!hub_info->ports){258 if (!hub_info->ports) { 260 259 return ENOMEM; 261 260 } … … 264 263 usb_hub_port_init(&hub_info->ports[port]); 265 264 } 266 if (is_power_switched){267 usb_log_debug(" is_power_switched\n");268 269 if (!has_individual_port_powering){270 usb_log_debug(" !has_individual_port_powering\n");265 if (is_power_switched) { 266 usb_log_debug("Hub power switched\n"); 267 268 if (!has_individual_port_powering) { 269 usb_log_debug("Has_global powering\n"); 271 270 opResult = usb_hub_set_feature(hub_info->control_pipe, 272 271 USB_HUB_FEATURE_C_HUB_LOCAL_POWER); 273 272 if (opResult != EOK) { 274 usb_log_error(" cannot power hub: %s\n",273 usb_log_error("Cannot power hub: %s\n", 275 274 str_error(opResult)); 276 275 } … … 278 277 279 278 for (port = 1; port <= hub_info->port_count; ++port) { 280 usb_log_debug("Powering port %zu.\n", port);279 usb_log_debug("Powering port %zu.\n", port); 281 280 opResult = usb_hub_set_port_feature(hub_info->control_pipe, 282 281 port, USB_HUB_FEATURE_PORT_POWER); … … 286 285 } 287 286 } 288 289 } else{290 usb_log_debug(" !is_power_switched, not going to be powered\n");291 } 292 usb_log_debug2(" freeing data\n");287 288 } else { 289 usb_log_debug("Power not switched, not going to be powered\n"); 290 } 291 usb_log_debug2("Freeing data\n"); 293 292 free(descriptor); 294 293 return EOK; … … 303 302 * @return error code 304 303 */ 305 static int usb_hub_set_configuration(usb_hub_info_t * 304 static int usb_hub_set_configuration(usb_hub_info_t *hub_info) { 306 305 //device descriptor 307 306 usb_standard_device_descriptor_t *std_descriptor 308 307 = &hub_info->usb_device->descriptors.device; 309 usb_log_debug(" hub has %d configurations\n",308 usb_log_debug("Hub has %d configurations\n", 310 309 std_descriptor->configuration_count); 311 310 if (std_descriptor->configuration_count < 1) { 312 usb_log_error(" there are no configurations available\n");311 usb_log_error("There are no configurations available\n"); 313 312 return EINVAL; 314 313 } … … 328 327 return opResult; 329 328 } 330 usb_log_debug("\t used configuration %d\n",329 usb_log_debug("\tUsed configuration %d\n", 331 330 config_descriptor->configuration_number); 332 331 … … 343 342 * @return error code 344 343 */ 345 static int usb_hub_start_hub_fibril(usb_hub_info_t * hub_info){344 static int usb_hub_start_hub_fibril(usb_hub_info_t *hub_info) { 346 345 int rc; 347 346 … … 367 366 //********************************************* 368 367 369 370 368 /** 371 369 * process hub over current change … … 376 374 * @return error code 377 375 */ 378 static int usb_process_hub_over_current(usb_hub_info_t * 376 static int usb_process_hub_over_current(usb_hub_info_t *hub_info, 379 377 usb_hub_status_t status) { 380 378 int opResult; 381 if (usb_hub_is_status(status, USB_HUB_FEATURE_HUB_OVER_CURRENT)){379 if (usb_hub_is_status(status, USB_HUB_FEATURE_HUB_OVER_CURRENT)) { 382 380 //poweroff all ports 383 381 unsigned int port; 384 for (port = 1;port <= hub_info->port_count;++port){382 for (port = 1; port <= hub_info->port_count; ++port) { 385 383 opResult = usb_hub_clear_port_feature( 386 hub_info->control_pipe, port,384 hub_info->control_pipe, port, 387 385 USB_HUB_FEATURE_PORT_POWER); 388 386 if (opResult != EOK) { 389 387 usb_log_warning( 390 " cannot power off port %d; %d\n",391 port, opResult);388 "Cannot power off port %d; %s\n", 389 port, str_error(opResult)); 392 390 } 393 391 } … … 395 393 //power all ports 396 394 unsigned int port; 397 for (port = 1;port <= hub_info->port_count;++port){395 for (port = 1; port <= hub_info->port_count; ++port) { 398 396 opResult = usb_hub_set_port_feature( 399 hub_info->control_pipe, port,397 hub_info->control_pipe, port, 400 398 USB_HUB_FEATURE_PORT_POWER); 401 399 if (opResult != EOK) { 402 400 usb_log_warning( 403 " cannot power off port %d; %d\n",404 port, opResult);401 "Cannot power off port %d; %s\n", 402 port, str_error(opResult)); 405 403 } 406 404 } … … 417 415 * @return error code 418 416 */ 419 static int usb_process_hub_local_power_change(usb_hub_info_t * 417 static int usb_process_hub_local_power_change(usb_hub_info_t *hub_info, 420 418 usb_hub_status_t status) { 421 419 int opResult = EOK; 422 420 opResult = usb_hub_clear_feature(hub_info->control_pipe, 423 421 USB_HUB_FEATURE_C_HUB_LOCAL_POWER); 424 425 usb_log_error(" cannnot clear hub power change flag: "426 "% d\n",427 opResult);422 if (opResult != EOK) { 423 usb_log_error("Cannnot clear hub power change flag: " 424 "%s\n", 425 str_error(opResult)); 428 426 } 429 427 return opResult; … … 437 435 * @param hub_info hub instance 438 436 */ 439 static void usb_hub_process_global_interrupt(usb_hub_info_t * 440 usb_log_debug(" global interrupt on a hub\n");437 static void usb_hub_process_global_interrupt(usb_hub_info_t *hub_info) { 438 usb_log_debug("Global interrupt on a hub\n"); 441 439 usb_pipe_t *pipe = hub_info->control_pipe; 442 440 int opResult; … … 455 453 ); 456 454 if (opResult != EOK) { 457 usb_log_error("could not get hub status\n"); 455 usb_log_error("Could not get hub status: %s\n", 456 str_error(opResult)); 458 457 return; 459 458 } 460 459 if (rcvd_size != sizeof (usb_port_status_t)) { 461 usb_log_error(" received status has incorrect size\n");460 usb_log_error("Received status has incorrect size\n"); 462 461 return; 463 462 } 464 463 //port reset 465 464 if ( 466 usb_hub_is_status(status, 16+USB_HUB_FEATURE_C_HUB_OVER_CURRENT)) {465 usb_hub_is_status(status, 16 + USB_HUB_FEATURE_C_HUB_OVER_CURRENT)) { 467 466 usb_process_hub_over_current(hub_info, status); 468 467 } 469 468 if ( 470 usb_hub_is_status(status, 16+USB_HUB_FEATURE_C_HUB_LOCAL_POWER)) {469 usb_hub_is_status(status, 16 + USB_HUB_FEATURE_C_HUB_LOCAL_POWER)) { 471 470 usb_process_hub_local_power_change(hub_info, status); 472 471 } … … 481 480 * @param data pointer to usb_hub_info_t structure 482 481 */ 483 static void usb_hub_polling_terminated_callback(usb_device_t * 484 bool was_error, void * data){482 static void usb_hub_polling_terminated_callback(usb_device_t *device, 483 bool was_error, void *data) { 485 484 usb_hub_info_t * hub = data; 486 485 assert(hub);
Note:
See TracChangeset
for help on using the changeset viewer.