Changes in uspace/drv/usbhub/ports.c [192ba25:5c1a65e] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/usbhub/ports.c
r192ba25 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 … … 202 201 203 202 //close address 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 */ 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; 217 214 } else { 218 215 usb_log_warning("Device removed before being registered.\n"); … … 223 220 * port reset callback from new device wrapper. 224 221 */ 225 usb_hub_port_t *the_port = hub->ports + port;226 222 fibril_mutex_lock(&the_port->reset_mutex); 227 223 the_port->reset_completed = true; … … 230 226 fibril_mutex_unlock(&the_port->reset_mutex); 231 227 } 232 } 233 228 229 fibril_mutex_unlock(&hub->port_mutex); 230 } 234 231 235 232 /** … … 242 239 * @param status 243 240 */ 244 static void usb_hub_port_reset_completed(usb_hub_info_t * 245 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) { 246 243 usb_log_debug("Port %zu reset complete.\n", (size_t) port); 247 244 if (usb_port_is_status(status, USB_HUB_FEATURE_PORT_ENABLE)) { … … 275 272 * @param port port number, starting from 1 276 273 */ 277 static void usb_hub_port_over_current(usb_hub_info_t * 278 274 static void usb_hub_port_over_current(usb_hub_info_t *hub, 275 uint16_t port, uint32_t status) { 279 276 int opResult; 280 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)) { 281 278 opResult = usb_hub_clear_port_feature(hub->control_pipe, 282 279 port, USB_HUB_FEATURE_PORT_POWER); 283 280 if (opResult != EOK) { 284 usb_log_error(" cannot power off port %d; %d\n",285 port, opResult);281 usb_log_error("Cannot power off port %d; %s\n", 282 port, str_error(opResult)); 286 283 } 287 } else{284 } else { 288 285 opResult = usb_hub_set_port_feature(hub->control_pipe, 289 286 port, USB_HUB_FEATURE_PORT_POWER); 290 287 if (opResult != EOK) { 291 usb_log_error(" cannot power on port %d; %d\n",292 port, opResult);288 usb_log_error("Cannot power on port %d; %s\n", 289 port, str_error(opResult)); 293 290 } 294 291 } … … 303 300 */ 304 301 static int get_port_status(usb_pipe_t *ctrl_pipe, size_t port, 305 usb_port_status_t *status) 306 { 302 usb_port_status_t *status) { 307 303 size_t recv_size; 308 304 usb_device_request_setup_packet_t request; … … 311 307 usb_hub_set_port_status_request(&request, port); 312 308 int rc = usb_pipe_control_read(ctrl_pipe, 313 &request, sizeof (usb_device_request_setup_packet_t),314 &status_tmp, sizeof (status_tmp), &recv_size);309 &request, sizeof (usb_device_request_setup_packet_t), 310 &status_tmp, sizeof (status_tmp), &recv_size); 315 311 if (rc != EOK) { 316 312 return rc; … … 337 333 * @return Error code. 338 334 */ 339 static int enable_port_callback(int port_no, void *arg) 340 { 335 static int enable_port_callback(int port_no, void *arg) { 341 336 usb_hub_info_t *hub = arg; 342 337 int rc; … … 346 341 usb_hub_set_reset_port_request(&request, port_no); 347 342 rc = usb_pipe_control_write(hub->control_pipe, 348 &request, sizeof (request), NULL, 0);343 &request, sizeof (request), NULL, 0); 349 344 if (rc != EOK) { 350 345 usb_log_warning("Port reset failed: %s.\n", str_error(rc)); … … 376 371 * @return 0 Always. 377 372 */ 378 static int add_device_phase1_worker_fibril(void *arg) 379 { 373 static int add_device_phase1_worker_fibril(void *arg) { 380 374 struct add_device_phase1 *data 381 375 = (struct add_device_phase1 *) arg; … … 396 390 } 397 391 392 fibril_mutex_lock(&data->hub->port_mutex); 398 393 data->hub->ports[data->port].attached_device.handle = child_handle; 399 394 data->hub->ports[data->port].attached_device.address = new_address; 395 fibril_mutex_unlock(&data->hub->port_mutex); 400 396 401 397 usb_log_info("Detected new device on `%s' (port %zu), " … … 407 403 free(arg); 408 404 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 409 412 return EOK; 410 413 } 411 412 414 413 415 /** Start device adding when connection change is detected. … … 421 423 */ 422 424 static int create_add_device_fibril(usb_hub_info_t *hub, size_t port, 423 usb_speed_t speed) 424 { 425 usb_speed_t speed) { 425 426 struct add_device_phase1 *data 426 = malloc(sizeof (struct add_device_phase1));427 = malloc(sizeof (struct add_device_phase1)); 427 428 if (data == NULL) { 428 429 return ENOMEM; … … 452 453 return ENOMEM; 453 454 } 455 fibril_mutex_lock(&hub->pending_ops_mutex); 456 hub->pending_ops_count++; 457 fibril_mutex_unlock(&hub->pending_ops_mutex); 454 458 fibril_add_ready(fibril); 455 459
Note:
See TracChangeset
for help on using the changeset viewer.