aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenneth D. Merry <ken@FreeBSD.org>1999-05-09 01:27:46 +0000
committerKenneth D. Merry <ken@FreeBSD.org>1999-05-09 01:27:46 +0000
commit15041c8744d80eed2a4197273089bb0f2b1bab36 (patch)
tree0c199845a1642217b193f8c3059905e1bf648fca
parent3f66ff1c48960eccbd24cf617438332536b73545 (diff)
Notes
-rw-r--r--sys/cam/cam_periph.c20
-rw-r--r--sys/cam/scsi/scsi_all.h3
-rw-r--r--sys/cam/scsi/scsi_cd.c38
-rw-r--r--sys/cam/scsi/scsi_ch.c32
-rw-r--r--sys/cam/scsi/scsi_da.c11
-rw-r--r--sys/cam/scsi/scsi_pass.c4
-rw-r--r--sys/cam/scsi/scsi_pt.c4
-rw-r--r--sys/cam/scsi/scsi_sa.c6
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 */