diff options
author | Mike Banon <mikebdp2@gmail.com> | 2020-12-03 07:06:59 +0300 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2020-12-21 10:59:39 -0500 |
commit | ef88eeaf052c8a7d28c5f85e790c5e45bcffa45e (patch) | |
tree | d8e8ac1964d6272c3bed4a07b9be904323bf7634 | |
parent | 748d619be3282fba35f99446098ac2d0579f6063 (diff) | |
download | seabios-ef88eeaf052c8a7d28c5f85e790c5e45bcffa45e.tar.gz |
Support booting USB drives with a write protect switch enabled
At least some USB drives with a write protect switch (e.g. Netac U335)
could report "MEDIUM NOT PRESENT" for a while if a write protection is
enabled. Instead of stopping the initialization attempts immediately,
stop only after getting this report for 3 times, to ensure the
successful initialization of such a "broken hardware".
Signed-off-by: Mike Banon <mikebdp2@gmail.com>
-rw-r--r-- | src/hw/blockcmd.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/src/hw/blockcmd.c b/src/hw/blockcmd.c index 1f15081b..6b6fea97 100644 --- a/src/hw/blockcmd.c +++ b/src/hw/blockcmd.c @@ -144,8 +144,9 @@ scsi_is_ready(struct disk_op_s *op) dprintf(6, "scsi_is_ready (drive=%p)\n", op->drive_fl); /* Retry TEST UNIT READY for 5 seconds unless MEDIUM NOT PRESENT is - * reported by the device. If the device reports "IN PROGRESS", + * reported by the device 3 times. If the device reports "IN PROGRESS", * 30 seconds is added. */ + int tries = 3; int in_progress = 0; u32 end = timer_calc(5000); for (;;) { @@ -167,8 +168,11 @@ scsi_is_ready(struct disk_op_s *op) // Sense succeeded. if (sense.asc == 0x3a) { /* MEDIUM NOT PRESENT */ - dprintf(1, "Device reports MEDIUM NOT PRESENT\n"); - return -1; + tries--; + dprintf(1, "Device reports MEDIUM NOT PRESENT - %d tries left\n", + tries); + if (!tries) + return -1; } if (sense.asc == 0x04 && sense.ascq == 0x01 && !in_progress) { |