On Thu, Dec 03, 2020 at 07:06:59AM +0300, Mike Banon wrote:
> 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".

Thanks.  In general it seems fine to me.  I do have a couple of questions.

How long does this add to the total boot time?  Some users are
particularly sensitive to total boot time, and the "MEDIUM NOT
PRESENT" check is specifically there to reduce total boot time.  If we
retry that check it may be a regression for some users.

Does the troublesome device just require 3 retries, or is it time
based (that is, does it just require additional time to detect there
is something present, or is there something special about the third
request)?

-Kevin


> 
> Signed-off-by: Mike Banon <mikeb...@gmail.com>
> 
> diff --git a/src/hw/blockcmd.c b/src/hw/blockcmd.c
> index 1f15081..6b6fea9 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) {
> _______________________________________________
> SeaBIOS mailing list -- seabios@seabios.org
> To unsubscribe send an email to seabios-le...@seabios.org
_______________________________________________
SeaBIOS mailing list -- seabios@seabios.org
To unsubscribe send an email to seabios-le...@seabios.org

Reply via email to