diff --git a/sys/cam/scsi/scsi_da.c b/sys/cam/scsi/scsi_da.c --- a/sys/cam/scsi/scsi_da.c +++ b/sys/cam/scsi/scsi_da.c @@ -120,7 +120,8 @@ DA_FLAG_CAN_ATA_SUPCAP = 0x020000, DA_FLAG_CAN_ATA_ZONE = 0x040000, DA_FLAG_TUR_PENDING = 0x080000, - DA_FLAG_UNMAPPEDIO = 0x100000 + DA_FLAG_UNMAPPEDIO = 0x100000, + DA_FLAG_NO_READ_RETRY = 0x200000, } da_flags; #define DA_FLAG_STRING \ "\020" \ @@ -144,7 +145,8 @@ "\022CAN_ATA_SUPACP" \ "\023CAN_ATA_ZONE" \ "\024TUR_PENDING" \ - "\025UNMAPPEDIO" + "\025UNMAPPEDIO" \ + "\026NO_READ_RETRY" \ typedef enum { DA_Q_NONE = 0x00, @@ -191,7 +193,8 @@ DA_CCB_PROBE_ATA_ZONE = 0x11, DA_CCB_PROBE_WP = 0x12, DA_CCB_TYPE_MASK = 0x1F, - DA_CCB_RETRY_UA = 0x20 + DA_CCB_RETRY_UA = 0x20, + DA_CCB_NO_RETRY = 0x40 } da_ccb_state; /* @@ -3511,6 +3514,9 @@ return; } start_ccb->ccb_h.ccb_state = DA_CCB_BUFFER_IO; + if ((softc->flags & DA_FLAG_NO_READ_RETRY) != 0 && + bp->bio_cmd == BIO_READ) + start_ccb->ccb_h.ccb_state |= DA_CCB_NO_RETRY; start_ccb->ccb_h.flags |= CAM_UNLOCKED; start_ccb->ccb_h.softtimeout = sbttotv(da_default_softtimeout); @@ -4595,6 +4601,8 @@ if ((csio->ccb_h.ccb_state & DA_CCB_RETRY_UA) != 0) sf |= SF_RETRY_UA; + if ((csio->ccb_h.ccb_state & DA_CCB_NO_RETRY) != 0) + sf |= SF_NO_RETRY; error = daerror(done_ccb, CAM_RETRY_SELTO, sf); if (error == ERESTART) {