Merge pull request #679 from tannewt/usb_race3

Check usb_busy up front in usb background function.
This commit is contained in:
Dan Halbert 2018-03-14 13:54:20 -04:00 committed by GitHub
commit 07dd26d722
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 9 additions and 2 deletions

View File

@ -280,7 +280,14 @@ int32_t usb_msc_xfer_done(uint8_t lun) {
// drive into our cache and trigger the USB DMA to output the // drive into our cache and trigger the USB DMA to output the
// sector. Once the sector is transmitted, xfer_done will be called. // sector. Once the sector is transmitted, xfer_done will be called.
void usb_msc_background(void) { void usb_msc_background(void) {
if (active_read && !usb_busy) { // Check USB busy first because we never want to queue another transfer if it is. Checking
// active_read or active_write first leaves the possibility that they are true, an xfer done
// interrupt occurs (setting them false), turning off usb_busy and causing us to queue a
// spurious transfer.
if (usb_busy) {
return;
}
if (active_read) {
fs_user_mount_t * vfs = get_vfs(active_lun); fs_user_mount_t * vfs = get_vfs(active_lun);
disk_read(vfs, sector_buffer, active_addr, 1); disk_read(vfs, sector_buffer, active_addr, 1);
CRITICAL_SECTION_ENTER(); CRITICAL_SECTION_ENTER();
@ -288,7 +295,7 @@ void usb_msc_background(void) {
usb_busy = result == ERR_NONE; usb_busy = result == ERR_NONE;
CRITICAL_SECTION_LEAVE(); CRITICAL_SECTION_LEAVE();
} }
if (active_write && !usb_busy) { if (active_write) {
if (sector_loaded) { if (sector_loaded) {
fs_user_mount_t * vfs = get_vfs(active_lun); fs_user_mount_t * vfs = get_vfs(active_lun);
disk_write(vfs, sector_buffer, active_addr, 1); disk_write(vfs, sector_buffer, active_addr, 1);