From f50253eaa38ae33bf4dbda5050a22f48660a58f8 Mon Sep 17 00:00:00 2001 From: Ben Gamari Date: Sun, 7 Jul 2013 21:54:25 -0400 Subject: [PATCH] usb_queue: Use ldrex/strex to avoid disabling interrupts --- firmware/hackrf_usb/usb_queue.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/firmware/hackrf_usb/usb_queue.c b/firmware/hackrf_usb/usb_queue.c index ea6c2980..683b3b96 100644 --- a/firmware/hackrf_usb/usb_queue.c +++ b/firmware/hackrf_usb/usb_queue.c @@ -26,6 +26,7 @@ #include #include +#include #include "usb.h" #include "usb_queue.h" @@ -61,19 +62,25 @@ void usb_queue_init() { /* Allocate a transfer */ static usb_transfer_t* allocate_transfer() { + bool aborted; + usb_transfer_t* transfer; while (free_transfers == NULL); - cm_disable_interrupts(); - usb_transfer_t* const transfer = free_transfers; - free_transfers = transfer->next; - cm_enable_interrupts(); + do { + transfer = (void *) __ldrex((uint32_t *) &free_transfers); + aborted = __strex((uint32_t) transfer->next, (uint32_t *) &free_transfers); + } while (aborted); + transfer->next = NULL; return transfer; } /* Place a transfer in the free list */ static void free_transfer(usb_transfer_t* const transfer) { - transfer->next = free_transfers; - free_transfers = transfer; + bool aborted; + do { + transfer->next = (void *) __ldrex((uint32_t *) &free_transfers); + aborted = __strex((uint32_t) transfer, (uint32_t *) &free_transfers); + } while (aborted); } /* Add a transfer to the end of an endpoint's queue */