Merge pull request #679 from tannewt/usb_race3
Check usb_busy up front in usb background function.
This commit is contained in:
commit
07dd26d722
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue