diff options
-rw-r--r-- | firmware/target/arm/as3525/usb-drv-as3525v2.c | 33 |
1 files changed, 15 insertions, 18 deletions
diff --git a/firmware/target/arm/as3525/usb-drv-as3525v2.c b/firmware/target/arm/as3525/usb-drv-as3525v2.c index c0542d5c45..a96d0d1596 100644 --- a/firmware/target/arm/as3525/usb-drv-as3525v2.c +++ b/firmware/target/arm/as3525/usb-drv-as3525v2.c | |||
@@ -116,13 +116,12 @@ static void reset_endpoints(void) | |||
116 | for (unsigned i = 0; i < num_eps(dir == DIR_OUT); i++) | 116 | for (unsigned i = 0; i < num_eps(dir == DIR_OUT); i++) |
117 | { | 117 | { |
118 | int ep = ((dir == DIR_IN) ? in_ep_list : out_ep_list)[i]; | 118 | int ep = ((dir == DIR_IN) ? in_ep_list : out_ep_list)[i]; |
119 | endpoints[ep][out] = (struct usb_endpoint) { | 119 | struct usb_endpoint *endpoint = &endpoints[ep][out]; |
120 | .active = false, | 120 | endpoint->active = false; |
121 | .busy = false, | 121 | endpoint->busy = false; |
122 | .status = -1, | 122 | endpoint->status = -1; |
123 | .done = false, | 123 | endpoint->done = false; |
124 | }; | 124 | semaphore_release(&endpoint->complete); |
125 | semaphore_release(&endpoints[ep][out].complete); | ||
126 | 125 | ||
127 | if (i != 0) | 126 | if (i != 0) |
128 | DEPCTL(ep, out) = DEPCTL_setd0pid; | 127 | DEPCTL(ep, out) = DEPCTL_setd0pid; |
@@ -149,12 +148,11 @@ static void cancel_all_transfers(bool cancel_ep0) | |||
149 | for (unsigned i = !!cancel_ep0; i < num_eps(dir == DIR_OUT); i++) | 148 | for (unsigned i = !!cancel_ep0; i < num_eps(dir == DIR_OUT); i++) |
150 | { | 149 | { |
151 | int ep = ((dir == DIR_IN) ? in_ep_list : out_ep_list)[i]; | 150 | int ep = ((dir == DIR_IN) ? in_ep_list : out_ep_list)[i]; |
152 | endpoints[ep][dir == DIR_OUT] = (struct usb_endpoint) { | 151 | struct usb_endpoint *endpoint = &endpoints[ep][dir == DIR_OUT]; |
153 | .status = -1, | 152 | endpoint->status = -1; |
154 | .busy = false, | 153 | endpoint->busy = false; |
155 | .done = false, | 154 | endpoint->done = false; |
156 | }; | 155 | semaphore_release(&endpoint->complete); |
157 | semaphore_release(&endpoints[ep][dir == DIR_OUT].complete); | ||
158 | DEPCTL(ep, dir) = (DEPCTL(ep, dir) & ~DEPCTL_usbactep); | 156 | DEPCTL(ep, dir) = (DEPCTL(ep, dir) & ~DEPCTL_usbactep); |
159 | } | 157 | } |
160 | 158 | ||
@@ -429,11 +427,10 @@ static void usb_drv_transfer(int ep, void *ptr, int len, bool out) | |||
429 | /* disable interrupts to avoid any race */ | 427 | /* disable interrupts to avoid any race */ |
430 | int oldlevel = disable_irq_save(); | 428 | int oldlevel = disable_irq_save(); |
431 | 429 | ||
432 | endpoints[ep][out ? DIR_OUT : DIR_IN] = (struct usb_endpoint) { | 430 | struct usb_endpoint *endpoint = &endpoints[ep][out ? DIR_OUT : DIR_IN]; |
433 | .busy = true, | 431 | endpoint->busy = true; |
434 | .len = len, | 432 | endpoint->len = len; |
435 | .status = -1, | 433 | endpoint->status = -1; |
436 | }; | ||
437 | 434 | ||
438 | if (out) | 435 | if (out) |
439 | DEPCTL(ep, out) &= ~DEPCTL_naksts; | 436 | DEPCTL(ep, out) &= ~DEPCTL_naksts; |