Changes in uspace/drv/usbhub/ports.c [5c1a65e:192ba25] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/usbhub/ports.c
r5c1a65e r192ba25 47 47 #include "port_status.h" 48 48 49 49 50 /** Information for fibril for device discovery. */ 50 51 struct add_device_phase1 { … … 64 65 * any function here and must be cleared by hand 65 66 */ 66 static const int non_handled_changes[] = {67 static const int non_handled_changes[] = { 67 68 USB_HUB_FEATURE_C_PORT_ENABLE, 68 69 USB_HUB_FEATURE_C_PORT_SUSPEND … … 70 71 71 72 static void usb_hub_removed_device( 72 usb_hub_info_t *hub, uint16_t port);73 74 static void usb_hub_port_reset_completed(usb_hub_info_t * hub,75 76 77 static void usb_hub_port_over_current(usb_hub_info_t * hub,78 73 usb_hub_info_t * hub, uint16_t port); 74 75 static void usb_hub_port_reset_completed(usb_hub_info_t * hub, 76 uint16_t port, uint32_t status); 77 78 static void usb_hub_port_over_current(usb_hub_info_t * hub, 79 uint16_t port, uint32_t status); 79 80 80 81 static int get_port_status(usb_pipe_t *ctrl_pipe, size_t port, … … 95 96 * @param port port number, starting from 1 96 97 */ 97 void usb_hub_process_interrupt(usb_hub_info_t * hub,98 99 usb_log_debug(" Interrupt at port %zu\n", (size_t) port);98 void usb_hub_process_interrupt(usb_hub_info_t * hub, 99 uint16_t port) { 100 usb_log_debug("interrupt at port %zu\n", (size_t) port); 100 101 //determine type of change 101 102 //usb_pipe_t *pipe = hub->control_pipe; … … 133 134 if (usb_port_is_status(status, USB_HUB_FEATURE_C_PORT_OVER_CURRENT)) { 134 135 //check if it was not auto-resolved 135 usb_log_debug(" Overcurrent change on port\n");136 usb_log_debug("overcurrent change on port\n"); 136 137 usb_hub_port_over_current(hub, port, status); 137 138 } … … 140 141 usb_hub_port_reset_completed(hub, port, status); 141 142 } 142 usb_log_debug(" Status x%x : %d\n ", status, status);143 usb_log_debug("status x%x : %d\n ", status, status); 143 144 144 145 usb_port_status_set_bit( 145 &status, USB_HUB_FEATURE_C_PORT_CONNECTION, 146 &status, USB_HUB_FEATURE_C_PORT_CONNECTION,false); 146 147 usb_port_status_set_bit( 147 &status, USB_HUB_FEATURE_C_PORT_RESET, 148 &status, USB_HUB_FEATURE_C_PORT_RESET,false); 148 149 usb_port_status_set_bit( 149 &status, USB_HUB_FEATURE_C_PORT_OVER_CURRENT, 150 150 &status, USB_HUB_FEATURE_C_PORT_OVER_CURRENT,false); 151 151 152 //clearing not yet handled changes 152 153 unsigned int feature_idx; 153 for (feature_idx = 0; 154 feature_idx < non_handled_changes_count; 155 ++feature_idx) { 154 for(feature_idx = 0;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 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: %s\n",168 bit_idx, str_error(opResult)167 "could not clear port flag %d: %d\n", 168 bit_idx, opResult 169 169 ); 170 170 } 171 171 usb_port_status_set_bit( 172 &status, bit_idx, 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 180 181 181 182 /** … … 189 190 */ 190 191 static void usb_hub_removed_device( 191 usb_hub_info_t *hub, uint16_t port) {192 usb_hub_info_t * hub, uint16_t port) { 192 193 193 194 int opResult = usb_hub_clear_port_feature(hub->control_pipe, 194 195 port, USB_HUB_FEATURE_C_PORT_CONNECTION); 195 196 if (opResult != EOK) { 196 usb_log_warning(" Could not clear port-change-connection flag\n");197 usb_log_warning("could not clear port-change-connection flag\n"); 197 198 } 198 199 /** \TODO remove device from device manager - not yet implemented in … … 201 202 202 203 //close address 203 204 usb_hub_port_t *the_port = hub->ports + port; 205 206 fibril_mutex_lock(&hub->port_mutex); 207 208 if (the_port->attached_device.address >= 0) { 209 usb_log_warning("Device unplug on `%s' (port %zu): " \ 210 "not implemented.\n", hub->usb_device->ddf_dev->name, 211 (size_t) port); 212 the_port->attached_device.address = -1; 213 the_port->attached_device.handle = 0; 204 if(hub->ports[port].attached_device.address >= 0){ 205 /*uncomment this code to use it when DDF allows device removal 206 opResult = usb_hc_unregister_device( 207 &hub->connection, 208 hub->attached_devs[port].address); 209 if(opResult != EOK) { 210 dprintf(USB_LOG_LEVEL_WARNING, "could not release " 211 "address of " 212 "removed device: %d", opResult); 213 } 214 hub->attached_devs[port].address = 0; 215 hub->attached_devs[port].handle = 0; 216 */ 214 217 } else { 215 218 usb_log_warning("Device removed before being registered.\n"); … … 220 223 * port reset callback from new device wrapper. 221 224 */ 225 usb_hub_port_t *the_port = hub->ports + port; 222 226 fibril_mutex_lock(&the_port->reset_mutex); 223 227 the_port->reset_completed = true; … … 226 230 fibril_mutex_unlock(&the_port->reset_mutex); 227 231 } 228 229 fibril_mutex_unlock(&hub->port_mutex); 230 } 232 } 233 231 234 232 235 /** … … 239 242 * @param status 240 243 */ 241 static void usb_hub_port_reset_completed(usb_hub_info_t * hub,242 uint16_t port, uint32_t status){244 static void usb_hub_port_reset_completed(usb_hub_info_t * hub, 245 uint16_t port, uint32_t status){ 243 246 usb_log_debug("Port %zu reset complete.\n", (size_t) port); 244 247 if (usb_port_is_status(status, USB_HUB_FEATURE_PORT_ENABLE)) { … … 272 275 * @param port port number, starting from 1 273 276 */ 274 static void usb_hub_port_over_current(usb_hub_info_t * hub,275 277 static void usb_hub_port_over_current(usb_hub_info_t * hub, 278 uint16_t port, uint32_t status) { 276 279 int opResult; 277 if (usb_port_is_status(status, USB_HUB_FEATURE_PORT_OVER_CURRENT)){280 if(usb_port_is_status(status, USB_HUB_FEATURE_PORT_OVER_CURRENT)){ 278 281 opResult = usb_hub_clear_port_feature(hub->control_pipe, 279 282 port, USB_HUB_FEATURE_PORT_POWER); 280 283 if (opResult != EOK) { 281 usb_log_error(" Cannot power off port %d; %s\n",282 port, str_error(opResult));284 usb_log_error("cannot power off port %d; %d\n", 285 port, opResult); 283 286 } 284 } else{287 }else{ 285 288 opResult = usb_hub_set_port_feature(hub->control_pipe, 286 289 port, USB_HUB_FEATURE_PORT_POWER); 287 290 if (opResult != EOK) { 288 usb_log_error(" Cannot power on port %d; %s\n",289 port, str_error(opResult));291 usb_log_error("cannot power on port %d; %d\n", 292 port, opResult); 290 293 } 291 294 } … … 300 303 */ 301 304 static int get_port_status(usb_pipe_t *ctrl_pipe, size_t port, 302 usb_port_status_t *status) { 305 usb_port_status_t *status) 306 { 303 307 size_t recv_size; 304 308 usb_device_request_setup_packet_t request; … … 307 311 usb_hub_set_port_status_request(&request, port); 308 312 int rc = usb_pipe_control_read(ctrl_pipe, 309 &request, sizeof 310 &status_tmp, sizeof 313 &request, sizeof(usb_device_request_setup_packet_t), 314 &status_tmp, sizeof(status_tmp), &recv_size); 311 315 if (rc != EOK) { 312 316 return rc; … … 333 337 * @return Error code. 334 338 */ 335 static int enable_port_callback(int port_no, void *arg) { 339 static int enable_port_callback(int port_no, void *arg) 340 { 336 341 usb_hub_info_t *hub = arg; 337 342 int rc; … … 341 346 usb_hub_set_reset_port_request(&request, port_no); 342 347 rc = usb_pipe_control_write(hub->control_pipe, 343 &request, sizeof 348 &request, sizeof(request), NULL, 0); 344 349 if (rc != EOK) { 345 350 usb_log_warning("Port reset failed: %s.\n", str_error(rc)); … … 371 376 * @return 0 Always. 372 377 */ 373 static int add_device_phase1_worker_fibril(void *arg) { 378 static int add_device_phase1_worker_fibril(void *arg) 379 { 374 380 struct add_device_phase1 *data 375 381 = (struct add_device_phase1 *) arg; … … 390 396 } 391 397 392 fibril_mutex_lock(&data->hub->port_mutex);393 398 data->hub->ports[data->port].attached_device.handle = child_handle; 394 399 data->hub->ports[data->port].attached_device.address = new_address; 395 fibril_mutex_unlock(&data->hub->port_mutex);396 400 397 401 usb_log_info("Detected new device on `%s' (port %zu), " … … 403 407 free(arg); 404 408 405 fibril_mutex_lock(&data->hub->pending_ops_mutex);406 assert(data->hub->pending_ops_count > 0);407 data->hub->pending_ops_count--;408 fibril_condvar_signal(&data->hub->pending_ops_cv);409 fibril_mutex_unlock(&data->hub->pending_ops_mutex);410 411 412 409 return EOK; 413 410 } 411 414 412 415 413 /** Start device adding when connection change is detected. … … 423 421 */ 424 422 static int create_add_device_fibril(usb_hub_info_t *hub, size_t port, 425 usb_speed_t speed) { 423 usb_speed_t speed) 424 { 426 425 struct add_device_phase1 *data 427 = malloc(sizeof 426 = malloc(sizeof(struct add_device_phase1)); 428 427 if (data == NULL) { 429 428 return ENOMEM; … … 453 452 return ENOMEM; 454 453 } 455 fibril_mutex_lock(&hub->pending_ops_mutex);456 hub->pending_ops_count++;457 fibril_mutex_unlock(&hub->pending_ops_mutex);458 454 fibril_add_ready(fibril); 459 455
Note:
See TracChangeset
for help on using the changeset viewer.