diff options
| author | Kenneth D. Merry <ken@FreeBSD.org> | 1999-05-09 01:27:46 +0000 |
|---|---|---|
| committer | Kenneth D. Merry <ken@FreeBSD.org> | 1999-05-09 01:27:46 +0000 |
| commit | 15041c8744d80eed2a4197273089bb0f2b1bab36 (patch) | |
| tree | 0c199845a1642217b193f8c3059905e1bf648fca | |
| parent | 3f66ff1c48960eccbd24cf617438332536b73545 (diff) | |
Notes
| -rw-r--r-- | sys/cam/cam_periph.c | 20 | ||||
| -rw-r--r-- | sys/cam/scsi/scsi_all.h | 3 | ||||
| -rw-r--r-- | sys/cam/scsi/scsi_cd.c | 38 | ||||
| -rw-r--r-- | sys/cam/scsi/scsi_ch.c | 32 | ||||
| -rw-r--r-- | sys/cam/scsi/scsi_da.c | 11 | ||||
| -rw-r--r-- | sys/cam/scsi/scsi_pass.c | 4 | ||||
| -rw-r--r-- | sys/cam/scsi/scsi_pt.c | 4 | ||||
| -rw-r--r-- | sys/cam/scsi/scsi_sa.c | 6 |
8 files changed, 76 insertions, 42 deletions
diff --git a/sys/cam/cam_periph.c b/sys/cam/cam_periph.c index 4be09107925d..e859f36c1942 100644 --- a/sys/cam/cam_periph.c +++ b/sys/cam/cam_periph.c @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: cam_periph.c,v 1.9 1999/01/14 06:21:54 jdp Exp $ + * $Id: cam_periph.c,v 1.9.2.1 1999/04/19 21:36:28 gibbs Exp $ */ #include <sys/param.h> @@ -1505,7 +1505,23 @@ cam_periph_error(union ccb *ccb, cam_flags camflags, xpt_async(AC_LOST_DEVICE, newpath, NULL); xpt_free_path(newpath); #endif - error = ENXIO; + if ((sense_flags & SF_RETRY_SELTO) != 0) { + retry = ccb->ccb_h.retry_count > 0; + if (retry) { + ccb->ccb_h.retry_count--; + error = ERESTART; + /* + * Wait half a second to give the device + * time to recover before we try again. + */ + relsim_flags = RELSIM_RELEASE_AFTER_TIMEOUT; + timeout = 500; + } else { + error = ENXIO; + } + } else { + error = ENXIO; + } break; } case CAM_REQ_INVALID: diff --git a/sys/cam/scsi/scsi_all.h b/sys/cam/scsi/scsi_all.h index ccbab9d7863c..bedd14440235 100644 --- a/sys/cam/scsi/scsi_all.h +++ b/sys/cam/scsi/scsi_all.h @@ -14,7 +14,7 @@ * * Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992 * - * $Id: scsi_all.h,v 1.5 1998/10/15 19:08:58 ken Exp $ + * $Id: scsi_all.h,v 1.6 1998/12/05 22:10:14 mjacob Exp $ */ /* @@ -712,6 +712,7 @@ int scsi_interpret_sense(struct cam_device *device, #define SF_NO_PRINT 0x02 #define SF_QUIET_IR 0x04 /* Be quiet about Illegal Request reponses */ #define SF_PRINT_ALWAYS 0x08 +#define SF_RETRY_SELTO 0x10 /* Retry selection timeouts */ const char * scsi_op_desc(u_int16_t opcode, diff --git a/sys/cam/scsi/scsi_cd.c b/sys/cam/scsi/scsi_cd.c index 286f3885c29a..47708920eb40 100644 --- a/sys/cam/scsi/scsi_cd.c +++ b/sys/cam/scsi/scsi_cd.c @@ -24,7 +24,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: scsi_cd.c,v 1.14.2.3 1999/04/19 21:36:45 gibbs Exp $ + * $Id: scsi_cd.c,v 1.14.2.4 1999/05/07 00:43:09 ken Exp $ */ /* * Portions of this driver taken from the original FreeBSD cd driver. @@ -271,10 +271,10 @@ static struct extend_array *cdperiphs; static int num_changers; #ifndef CHANGER_MIN_BUSY_SECONDS -#define CHANGER_MIN_BUSY_SECONDS 2 +#define CHANGER_MIN_BUSY_SECONDS 5 #endif #ifndef CHANGER_MAX_BUSY_SECONDS -#define CHANGER_MAX_BUSY_SECONDS 10 +#define CHANGER_MAX_BUSY_SECONDS 15 #endif static int changer_min_busy_seconds = CHANGER_MIN_BUSY_SECONDS; @@ -1590,7 +1590,10 @@ cddone(struct cam_periph *periph, union ccb *done_ccb) sf = SF_RETRY_UA; else sf = 0; - + + /* Retry selection timeouts */ + sf |= SF_RETRY_SELTO; + if ((error = cderror(done_ccb, 0, sf)) == ERESTART) { /* * A retry was scheuled, so @@ -1695,7 +1698,8 @@ cddone(struct cam_periph *periph, union ccb *done_ccb) * Retry any UNIT ATTENTION type errors. They * are expected at boot. */ - error = cderror(done_ccb, 0, SF_RETRY_UA|SF_NO_PRINT); + error = cderror(done_ccb, 0, SF_RETRY_UA | + SF_NO_PRINT | SF_RETRY_SELTO); if (error == ERESTART) { /* * A retry was scheuled, so @@ -2519,7 +2523,7 @@ cdprevent(struct cam_periph *periph, int action) /* timeout */60000); error = cdrunccb(ccb, cderror, /*cam_flags*/0, - /*sense_flags*/SF_RETRY_UA|SF_NO_PRINT); + /*sense_flags*/SF_RETRY_UA|SF_NO_PRINT|SF_RETRY_SELTO); xpt_release_ccb(ccb); @@ -2563,7 +2567,7 @@ cdsize(dev_t dev, u_int32_t *size) /* timeout */20000); error = cdrunccb(ccb, cderror, /*cam_flags*/0, - /*sense_flags*/SF_RETRY_UA|SF_NO_PRINT); + /*sense_flags*/SF_RETRY_UA|SF_NO_PRINT|SF_RETRY_SELTO); xpt_release_ccb(ccb); @@ -2640,7 +2644,7 @@ cdreadtoc(struct cam_periph *periph, u_int32_t mode, u_int32_t start, scsi_cmd->op_code = READ_TOC; error = cdrunccb(ccb, cderror, /*cam_flags*/0, - /*sense_flags*/SF_RETRY_UA); + /*sense_flags*/SF_RETRY_UA|SF_RETRY_SELTO); xpt_release_ccb(ccb); @@ -2687,7 +2691,7 @@ cdreadsubchannel(struct cam_periph *periph, u_int32_t mode, scsi_cmd->control = 0; error = cdrunccb(ccb, cderror, /*cam_flags*/0, - /*sense_flags*/SF_RETRY_UA); + /*sense_flags*/SF_RETRY_UA|SF_RETRY_SELTO); xpt_release_ccb(ccb); @@ -2727,7 +2731,7 @@ cdgetmode(struct cam_periph *periph, struct cd_mode_data *data, u_int32_t page) scsi_cmd->opcode = MODE_SENSE; error = cdrunccb(ccb, cderror, /*cam_flags*/0, - /*sense_flags*/SF_RETRY_UA); + /*sense_flags*/SF_RETRY_UA|SF_RETRY_SELTO); xpt_release_ccb(ccb); @@ -2774,7 +2778,7 @@ cdsetmode(struct cam_periph *periph, struct cd_mode_data *data) data->header.medium_type = 0; error = cdrunccb(ccb, cderror, /*cam_flags*/0, - /*sense_flags*/SF_RETRY_UA); + /*sense_flags*/SF_RETRY_UA | SF_RETRY_SELTO); xpt_release_ccb(ccb); @@ -2830,7 +2834,7 @@ cdplay(struct cam_periph *periph, u_int32_t blk, u_int32_t len) /*timeout*/50 * 1000); error = cdrunccb(ccb, cderror, /*cam_flags*/0, - /*sense_flags*/SF_RETRY_UA); + /*sense_flags*/SF_RETRY_UA | SF_RETRY_SELTO); xpt_release_ccb(ccb); @@ -2875,7 +2879,7 @@ cdplaymsf(struct cam_periph *periph, u_int32_t startm, u_int32_t starts, scsi_cmd->end_f = endf; error = cdrunccb(ccb, cderror, /*cam_flags*/0, - /*sense_flags*/SF_RETRY_UA); + /*sense_flags*/SF_RETRY_UA | SF_RETRY_SELTO); xpt_release_ccb(ccb); @@ -2919,7 +2923,7 @@ cdplaytracks(struct cam_periph *periph, u_int32_t strack, u_int32_t sindex, scsi_cmd->end_index = eindex; error = cdrunccb(ccb, cderror, /*cam_flags*/0, - /*sense_flags*/SF_RETRY_UA); + /*sense_flags*/SF_RETRY_UA | SF_RETRY_SELTO); xpt_release_ccb(ccb); @@ -2958,7 +2962,7 @@ cdpause(struct cam_periph *periph, u_int32_t go) scsi_cmd->resume = go; error = cdrunccb(ccb, cderror, /*cam_flags*/0, - /*sense_flags*/SF_RETRY_UA); + /*sense_flags*/SF_RETRY_UA |SF_RETRY_SELTO); xpt_release_ccb(ccb); @@ -2986,7 +2990,7 @@ cdstartunit(struct cam_periph *periph) /* timeout */ 50000); error = cdrunccb(ccb, cderror, /*cam_flags*/0, - /*sense_flags*/SF_RETRY_UA); + /*sense_flags*/SF_RETRY_UA | SF_RETRY_SELTO); xpt_release_ccb(ccb); @@ -3014,7 +3018,7 @@ cdstopunit(struct cam_periph *periph, u_int32_t eject) /* timeout */ 50000); error = cdrunccb(ccb, cderror, /*cam_flags*/0, - /*sense_flags*/SF_RETRY_UA); + /*sense_flags*/SF_RETRY_UA | SF_RETRY_SELTO); xpt_release_ccb(ccb); diff --git a/sys/cam/scsi/scsi_ch.c b/sys/cam/scsi/scsi_ch.c index 384e9b409d55..4af156b17688 100644 --- a/sys/cam/scsi/scsi_ch.c +++ b/sys/cam/scsi/scsi_ch.c @@ -24,7 +24,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: scsi_ch.c,v 1.9 1998/12/22 20:05:23 eivind Exp $ + * $Id: scsi_ch.c,v 1.9.2.1 1999/02/18 22:05:55 ken Exp $ */ /* * Derived from the NetBSD SCSI changer driver. @@ -634,7 +634,8 @@ chdone(struct cam_periph *periph, union ccb *done_ccb) } else { int error; - error = cherror(done_ccb, 0, SF_RETRY_UA|SF_NO_PRINT); + error = cherror(done_ccb, 0, SF_RETRY_UA | + SF_NO_PRINT | SF_RETRY_SELTO); /* * Retry any UNIT ATTENTION type errors. They * are expected at boot. @@ -874,7 +875,7 @@ chmove(struct cam_periph *periph, struct changer_move *cm) /* timeout */ CH_TIMEOUT_MOVE_MEDIUM); error = cam_periph_runccb(ccb, cherror, /*cam_flags*/0, - /*sense_flags*/ SF_RETRY_UA, + /*sense_flags*/ SF_RETRY_UA | SF_RETRY_SELTO, &softc->device_stats); xpt_release_ccb(ccb); @@ -937,7 +938,7 @@ chexchange(struct cam_periph *periph, struct changer_exchange *ce) /* timeout */ CH_TIMEOUT_EXCHANGE_MEDIUM); error = cam_periph_runccb(ccb, cherror, /*cam_flags*/0, - /*sense_flags*/ SF_RETRY_UA, + /*sense_flags*/ SF_RETRY_UA | SF_RETRY_SELTO, &softc->device_stats); xpt_release_ccb(ccb); @@ -983,7 +984,7 @@ chposition(struct cam_periph *periph, struct changer_position *cp) /* timeout */ CH_TIMEOUT_POSITION_TO_ELEMENT); error = cam_periph_runccb(ccb, cherror, /*cam_flags*/ 0, - /*sense_flags*/ SF_RETRY_UA, + /*sense_flags*/ SF_RETRY_UA | SF_RETRY_SELTO, &softc->device_stats); xpt_release_ccb(ccb); @@ -1139,7 +1140,7 @@ chgetelemstatus(struct cam_periph *periph, /* timeout */ CH_TIMEOUT_READ_ELEMENT_STATUS); error = cam_periph_runccb(ccb, cherror, /*cam_flags*/ 0, - /* sense_flags */ SF_RETRY_UA, + /*sense_flags*/ SF_RETRY_UA | SF_RETRY_SELTO, &softc->device_stats); if (error) @@ -1175,7 +1176,7 @@ chgetelemstatus(struct cam_periph *periph, /* timeout */ CH_TIMEOUT_READ_ELEMENT_STATUS); error = cam_periph_runccb(ccb, cherror, /*cam_flags*/ 0, - /* sense_flags */ SF_RETRY_UA, + /*sense_flags*/ SF_RETRY_UA | SF_RETRY_SELTO, &softc->device_stats); if (error) @@ -1254,7 +1255,7 @@ chielem(struct cam_periph *periph, /* timeout */ timeout); error = cam_periph_runccb(ccb, cherror, /*cam_flags*/ 0, - /* sense_flags */ SF_RETRY_UA, + /*sense_flags*/ SF_RETRY_UA | SF_RETRY_SELTO, &softc->device_stats); xpt_release_ccb(ccb); @@ -1341,7 +1342,7 @@ chsetvoltag(struct cam_periph *periph, /* timeout */ CH_TIMEOUT_SEND_VOLTAG); error = cam_periph_runccb(ccb, cherror, /*cam_flags*/ 0, - /*sense_flags*/ SF_RETRY_UA, + /*sense_flags*/ SF_RETRY_UA | SF_RETRY_SELTO, &softc->device_stats); xpt_release_ccb(ccb); @@ -1405,7 +1406,8 @@ chgetparams(struct cam_periph *periph) /* timeout */ CH_TIMEOUT_MODE_SENSE); error = cam_periph_runccb(ccb, cherror, /*cam_flags*/ 0, - /* sense_flags */ SF_RETRY_UA |SF_NO_PRINT, + /* sense_flags */ SF_RETRY_UA | + SF_NO_PRINT | SF_RETRY_SELTO, &softc->device_stats); if (error) { @@ -1417,7 +1419,8 @@ chgetparams(struct cam_periph *periph) sms->byte2 &= ~SMS_DBD; error = cam_periph_runccb(ccb, cherror, /*cam_flags*/ 0, - /* sense_flags */ SF_RETRY_UA, + /*sense_flags*/ SF_RETRY_UA | + SF_RETRY_SELTO, &softc->device_stats); } else { /* @@ -1467,8 +1470,8 @@ chgetparams(struct cam_periph *periph) /* timeout */ CH_TIMEOUT_MODE_SENSE); error = cam_periph_runccb(ccb, cherror, /*cam_flags*/ 0, - /* sense_flags */ SF_RETRY_UA|SF_NO_PRINT, - &softc->device_stats); + /* sense_flags */ SF_RETRY_UA | SF_NO_PRINT | + SF_RETRY_SELTO, &softc->device_stats); if (error) { if (dbd) { @@ -1479,7 +1482,8 @@ chgetparams(struct cam_periph *periph) sms->byte2 &= ~SMS_DBD; error = cam_periph_runccb(ccb, cherror, /*cam_flags*/ 0, - /* sense_flags */ SF_RETRY_UA, + /*sense_flags*/ SF_RETRY_UA | + SF_RETRY_SELTO, &softc->device_stats); } else { /* diff --git a/sys/cam/scsi/scsi_da.c b/sys/cam/scsi/scsi_da.c index 7c418246548f..2591c2e84b25 100644 --- a/sys/cam/scsi/scsi_da.c +++ b/sys/cam/scsi/scsi_da.c @@ -25,7 +25,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: scsi_da.c,v 1.19.2.2 1999/03/07 00:40:31 gibbs Exp $ + * $Id: scsi_da.c,v 1.19.2.3 1999/05/07 00:43:10 ken Exp $ */ #include "opt_hw_wdog.h" @@ -335,7 +335,8 @@ daopen(dev_t dev, int flags, int fmt, struct proc *p) ccb->ccb_h.ccb_bp = NULL; error = cam_periph_runccb(ccb, daerror, /*cam_flags*/0, - /*sense_flags*/SF_RETRY_UA, + /*sense_flags*/SF_RETRY_UA | + SF_RETRY_SELTO, &softc->device_stats); xpt_release_ccb(ccb); @@ -1231,6 +1232,9 @@ dadone(struct cam_periph *periph, union ccb *done_ccb) else sf = 0; + /* Retry selection timeouts */ + sf |= SF_RETRY_SELTO; + if ((error = daerror(done_ccb, 0, sf)) == ERESTART) { /* * A retry was scheuled, so @@ -1337,7 +1341,8 @@ dadone(struct cam_periph *periph, union ccb *done_ccb) * Retry any UNIT ATTENTION type errors. They * are expected at boot. */ - error = daerror(done_ccb, 0, SF_RETRY_UA|SF_NO_PRINT); + error = daerror(done_ccb, 0, SF_RETRY_UA | + SF_RETRY_SELTO | SF_NO_PRINT); if (error == ERESTART) { /* * A retry was scheuled, so diff --git a/sys/cam/scsi/scsi_pass.c b/sys/cam/scsi/scsi_pass.c index a3a32ce4956c..2d8e93310547 100644 --- a/sys/cam/scsi/scsi_pass.c +++ b/sys/cam/scsi/scsi_pass.c @@ -24,7 +24,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: scsi_pass.c,v 1.5.2.1 1999/02/18 22:05:56 ken Exp $ + * $Id: scsi_pass.c,v 1.5.2.2 1999/05/07 00:43:12 ken Exp $ */ #include <sys/param.h> @@ -833,7 +833,7 @@ passsendccb(struct cam_periph *periph, union ccb *ccb, union ccb *inccb) (ccb->ccb_h.flags & CAM_PASS_ERR_RECOVER) ? passerror : NULL, /* cam_flags */ 0, - /* sense_flags */SF_RETRY_UA, + /* sense_flags */SF_RETRY_UA | SF_RETRY_SELTO, &softc->device_stats); if (need_unmap != 0) diff --git a/sys/cam/scsi/scsi_pt.c b/sys/cam/scsi/scsi_pt.c index 4893284e21fa..119ff62ad94e 100644 --- a/sys/cam/scsi/scsi_pt.c +++ b/sys/cam/scsi/scsi_pt.c @@ -25,7 +25,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: scsi_pt.c,v 1.4 1998/11/22 23:44:47 ken Exp $ + * $Id: scsi_pt.c,v 1.4.2.1 1999/02/18 22:05:56 ken Exp $ */ #include <sys/param.h> @@ -620,6 +620,8 @@ ptdone(struct cam_periph *periph, union ccb *done_ccb) else sf = 0; + sf |= SF_RETRY_SELTO; + if ((error = pterror(done_ccb, 0, sf)) == ERESTART) { /* * A retry was scheuled, so diff --git a/sys/cam/scsi/scsi_sa.c b/sys/cam/scsi/scsi_sa.c index d67404d862de..611cd2cce705 100644 --- a/sys/cam/scsi/scsi_sa.c +++ b/sys/cam/scsi/scsi_sa.c @@ -25,7 +25,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: scsi_sa.c,v 1.16.2.1 1999/02/05 08:40:45 mjacob Exp $ + * $Id: scsi_sa.c,v 1.16.2.2 1999/02/18 22:05:56 ken Exp $ */ #include <sys/param.h> @@ -1596,7 +1596,7 @@ samount(struct cam_periph *periph, int oflags, dev_t dev) rblim, SSD_FULL_SIZE, 5000); error = cam_periph_runccb(ccb, saerror, 0, - SF_RETRY_UA, &softc->device_stats); + SF_RETRY_UA | SF_RETRY_SELTO, &softc->device_stats); xpt_release_ccb(ccb); @@ -2776,6 +2776,8 @@ sareservereleaseunit(struct cam_periph *periph, int reserve) else sflag = SF_RETRY_UA|SF_QUIET_IR; + sflag |= SF_RETRY_SELTO; + ccb = cam_periph_getccb(periph, 1); /* It is safe to retry this operation */ |
