Changeset 230ef1c in mainline
- Timestamp:
- 2018-01-13T01:34:06Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 837581fd
- Parents:
- 94e9c29
- git-author:
- Ondřej Hlavatý <aearsis@…> (2018-01-13 01:20:57)
- git-committer:
- Ondřej Hlavatý <aearsis@…> (2018-01-13 01:34:06)
- Location:
- uspace/drv/bus/usb/xhci
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/xhci/rh.c
r94e9c29 r230ef1c 98 98 } 99 99 100 typedef struct rh_event { 101 uint8_t port_id; 102 uint32_t events; 103 unsigned readers_to_go; 104 } rh_event_t; 105 100 106 static int rh_event_wait_timeout(xhci_rh_t *rh, uint8_t port_id, uint32_t mask, suseconds_t timeout) 101 107 { … … 109 115 if (r != EOK) 110 116 break; 111 } while (rh->event.port_id != port_id || (rh->event.events & mask) != mask); 117 118 assert(rh->event); 119 if (--rh->event->readers_to_go == 0) 120 fibril_condvar_broadcast(&rh->event_handled); 121 } while (rh->event->port_id != port_id || (rh->event->events & mask) != mask); 112 122 113 123 if (r == EOK) 114 rh->event .events &= ~mask;124 rh->event->events &= ~mask; 115 125 116 126 --rh->event_readers_waiting; 117 if (--rh->event_readers_to_go == 0)118 fibril_condvar_broadcast(&rh->event_handled);119 127 120 128 return r; 121 129 } 122 130 123 static void rh_event_run_handlers(xhci_rh_t *rh )131 static void rh_event_run_handlers(xhci_rh_t *rh, uint8_t port_id, uint32_t *events) 124 132 { 125 133 assert(fibril_mutex_is_locked(&rh->event_guard)); 126 assert(rh->event_readers_to_go == 0); 127 128 rh->event_readers_to_go = rh->event_readers_waiting; 134 135 /* There can be different event running already */ 136 while (rh->event) 137 fibril_condvar_wait(&rh->event_handled, &rh->event_guard); 138 139 rh_event_t event = { 140 .port_id = port_id, 141 .events = *events, 142 .readers_to_go = rh->event_readers_waiting, 143 }; 144 145 rh->event = &event; 129 146 fibril_condvar_broadcast(&rh->event_ready); 130 while ( rh->event_readers_to_go)147 while (event.readers_to_go) 131 148 fibril_condvar_wait(&rh->event_handled, &rh->event_guard); 149 *events = event.events; 150 rh->event = NULL; 132 151 } 133 152 … … 194 213 const int r = rh_event_wait_timeout(rh, port_id, XHCI_REG_MASK(XHCI_PORT_PRC), 0); 195 214 fibril_mutex_unlock(&rh->event_guard); 196 197 215 return r; 198 216 } … … 324 342 } 325 343 326 if (events != 0) { 327 rh->event.port_id = port_id; 328 rh->event.events = events; 329 rh_event_run_handlers(rh); 330 } 331 332 if (rh->event.events != 0) 333 usb_log_debug("RH port %u change not handled: 0x%x", port_id, rh->event.events); 344 if (events != 0) 345 rh_event_run_handlers(rh, port_id, &events); 346 347 if (events != 0) 348 usb_log_debug("RH port %u change not handled: 0x%x", port_id, events); 334 349 335 350 /* Make sure that PSCEG is 0 before exiting the loop. */ -
uspace/drv/bus/usb/xhci/rh.h
r94e9c29 r230ef1c 58 58 typedef struct hcd_roothub hcd_roothub_t; 59 59 typedef struct xhci_bus xhci_bus_t; 60 typedef struct rh_event rh_event_t; 60 61 61 62 /* XHCI root hub instance */ … … 79 80 fibril_mutex_t event_guard; 80 81 fibril_condvar_t event_ready, event_handled; 81 unsigned event_readers_waiting, event_readers_to_go; 82 struct { 83 uint8_t port_id; 84 uint32_t events; 85 } event; 82 unsigned event_readers_waiting; 83 rh_event_t *event; 86 84 } xhci_rh_t; 87 85
Note:
See TracChangeset
for help on using the changeset viewer.