diff --git a/esphome/components/usb_host/usb_host_client.cpp b/esphome/components/usb_host/usb_host_client.cpp index a5dd1457ba..d18b90b790 100644 --- a/esphome/components/usb_host/usb_host_client.cpp +++ b/esphome/components/usb_host/usb_host_client.cpp @@ -382,9 +382,10 @@ TransferRequest *USBClient::get_trq_() { trq->transfer->device_handle = this->device_handle_; return trq; } - // Another thread claimed this slot, retry with updated mask - // Don't increment i - retry the same slot with the updated mask - mask = expected; + // CAS failed - another thread modified the bitmask + // Restart search from the beginning with the updated mask + mask = this->trq_in_use_.load(std::memory_order_relaxed); + i = 0; } ESP_LOGE(TAG, "All %d transfer slots in use", MAX_REQUESTS); @@ -542,7 +543,7 @@ void USBClient::release_trq(TransferRequest *trq) { // Atomically clear bit i to mark slot as available // fetch_and with inverted bitmask clears the bit atomically uint16_t bit = 1U << index; - this->trq_in_use_.fetch_and(~bit, std::memory_order_release); + this->trq_in_use_.fetch_and(static_cast(~bit), std::memory_order_release); } } // namespace usb_host