diff --git a/sys/bus/cam/cam_xpt.c b/sys/bus/cam/cam_xpt.c
index 26b1717..b3c6072 100644
--- a/sys/bus/cam/cam_xpt.c
+++ b/sys/bus/cam/cam_xpt.c
@@ -5487,9 +5487,34 @@ typedef enum {
 	PROBE_TUR_FOR_NEGOTIATION,
 	PROBE_INQUIRY_BASIC_DV1,
 	PROBE_INQUIRY_BASIC_DV2,
-	PROBE_DV_EXIT
+	PROBE_DV_EXIT,
+	PROBE_INVALID
 } probe_action;
 
+static char *probe_action_text[] = {
+	"PROBE_TUR",
+	"PROBE_INQUIRY",
+	"PROBE_FULL_INQUIRY",
+	"PROBE_MODE_SENSE",
+	"PROBE_SERIAL_NUM_0",
+	"PROBE_SERIAL_NUM_1",
+	"PROBE_TUR_FOR_NEGOTIATION",
+	"PROBE_INQUIRY_BASIC_DV1",
+	"PROBE_INQUIRY_BASIC_DV2",
+	"PROBE_DV_EXIT",
+	"PROBE_INVALID"
+};
+
+#define PROBE_SET_ACTION(softc, newaction)	\
+do {									\
+	char **text;							\
+	text = probe_action_text;					\
+	CAM_DEBUG((softc)->periph->path, CAM_DEBUG_INFO,		\
+	    ("Probe %s to %s\n", text[(softc)->action],			\
+	    text[(newaction)]));					\
+	(softc)->action = (newaction);					\
+} while(0)
+
 typedef enum {
 	PROBE_INQUIRY_CKSUM	= 0x01,
 	PROBE_SERIAL_CKSUM	= 0x02,
@@ -5503,7 +5528,8 @@ typedef struct {
 	probe_flags	flags;
 	MD5_CTX		context;
 	u_int8_t	digest[16];
-}probe_softc; 
+	struct cam_periph *periph;
+} probe_softc; 
 
 static void
 xpt_scan_lun(struct cam_periph *periph, struct cam_path *path,
@@ -5617,6 +5643,8 @@ proberegister(struct cam_periph *periph, void *arg)
 			  periph_links.tqe);
 	softc->flags = 0;
 	periph->softc = softc;
+	softc->periph = periph;
+	softc->action = PROBE_INVALID;
 	status = cam_periph_acquire(periph);
 	if (status != CAM_REQ_CMP) {
 		return (status);
@@ -5668,13 +5696,13 @@ probeschedule(struct cam_periph *periph)
 	 */
 	if (((ccb->ccb_h.path->device->flags & CAM_DEV_UNCONFIGURED) == 0)
 	 && (ccb->ccb_h.target_lun == 0)) {
-		softc->action = PROBE_TUR;
+		PROBE_SET_ACTION(softc, PROBE_TUR);
 	} else if ((cpi.hba_inquiry & (PI_WIDE_32|PI_WIDE_16|PI_SDTR_ABLE)) != 0
 	      && (cpi.hba_misc & PIM_NOBUSRESET) != 0) {
 		proberequestdefaultnegotiation(periph);
-		softc->action = PROBE_INQUIRY;
+		PROBE_SET_ACTION(softc, PROBE_INQUIRY);
 	} else {
-		softc->action = PROBE_INQUIRY;
+		PROBE_SET_ACTION(softc, PROBE_INQUIRY);
 	}
 
 	if (ccb->crcn.flags & CAM_EXPECT_INQ_CHANGE)
@@ -5851,6 +5879,11 @@ probestart(struct cam_periph *periph, union ccb *start_ccb)
 			     /*timeout*/60 * 1000);
 		break;
 	}
+	case PROBE_INVALID:
+		CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_INFO,
+		    ("probestart: invalid action state\n"));
+	default:
+		break;
 	}
 	xpt_action(start_ccb);
 }
@@ -6004,7 +6037,7 @@ probedone(struct cam_periph *periph, union ccb *done_ccb)
 						 /*count*/1,
 						 /*run_queue*/TRUE);
 		}
-		softc->action = PROBE_INQUIRY;
+		PROBE_SET_ACTION(softc, PROBE_INQUIRY);
 		xpt_release_ccb(done_ccb);
 		xpt_schedule(periph, priority);
 		return;
@@ -6041,7 +6074,8 @@ probedone(struct cam_periph *periph, union ccb *done_ccb)
 						additional_length) + 1;
 				if (softc->action == PROBE_INQUIRY
 				    && len > SHORT_INQUIRY_LENGTH) {
-					softc->action = PROBE_FULL_INQUIRY;
+					PROBE_SET_ACTION(softc,
+					    PROBE_FULL_INQUIRY);
 					xpt_release_ccb(done_ccb);
 					xpt_schedule(periph, priority);
 					return;
@@ -6051,9 +6085,9 @@ probedone(struct cam_periph *periph, union ccb *done_ccb)
 
 				xpt_devise_transport(path);
 				if (INQ_DATA_TQ_ENABLED(inq_buf))
-					softc->action = PROBE_MODE_SENSE;
+					PROBE_SET_ACTION(softc, PROBE_MODE_SENSE);
 				else
-					softc->action = PROBE_SERIAL_NUM_0;
+					PROBE_SET_ACTION(softc, PROBE_SERIAL_NUM_0);
 
 				path->device->flags &= ~CAM_DEV_UNCONFIGURED;
 				xpt_reference_device(path->device);
@@ -6120,7 +6154,7 @@ probedone(struct cam_periph *periph, union ccb *done_ccb)
 		}
 		xpt_release_ccb(done_ccb);
 		kfree(mode_hdr, M_CAMXPT);
-		softc->action = PROBE_SERIAL_NUM_0;
+		PROBE_SET_ACTION(softc, PROBE_SERIAL_NUM_0);
 		xpt_schedule(periph, priority);
 		return;
 	}
@@ -6165,14 +6199,13 @@ probedone(struct cam_periph *periph, union ccb *done_ccb)
 
 		if (serialnum_supported) {
 			xpt_release_ccb(done_ccb);
-			softc->action = PROBE_SERIAL_NUM_1;
+			PROBE_SET_ACTION(softc, PROBE_SERIAL_NUM_1);
 			xpt_schedule(periph, priority);
 			return;
 		}
-		xpt_release_ccb(done_ccb);
-		softc->action = PROBE_TUR_FOR_NEGOTIATION;
-		xpt_schedule(periph, done_ccb->ccb_h.pinfo.priority);
-		return;
+
+		csio->data_ptr = NULL;
+		/* FALLTHROUGH */
 	}
 
 	case PROBE_SERIAL_NUM_1:
@@ -6273,7 +6306,7 @@ probedone(struct cam_periph *periph, union ccb *done_ccb)
 			 * Perform a TUR to allow the controller to
 			 * perform any necessary transfer negotiation.
 			 */
-			softc->action = PROBE_TUR_FOR_NEGOTIATION;
+			PROBE_SET_ACTION(softc, PROBE_TUR_FOR_NEGOTIATION);
 			xpt_schedule(periph, priority);
 			return;
 		}
@@ -6301,7 +6334,7 @@ probedone(struct cam_periph *periph, union ccb *done_ccb)
 			    ("Begin Domain Validation\n"));
 			path->device->flags |= CAM_DEV_IN_DV;
 			xpt_release_ccb(done_ccb);
-			softc->action = PROBE_INQUIRY_BASIC_DV1;
+			PROBE_SET_ACTION(softc, PROBE_INQUIRY_BASIC_DV1);
 			xpt_schedule(periph, priority);
 			return;
 		}
@@ -6339,10 +6372,10 @@ probedone(struct cam_periph *periph, union ccb *done_ccb)
 			    softc->action == PROBE_INQUIRY_BASIC_DV1 ? 1 : 2);
 			if (proberequestbackoff(periph, path->device)) {
 				path->device->flags &= ~CAM_DEV_IN_DV;
-				softc->action = PROBE_TUR_FOR_NEGOTIATION;
+				PROBE_SET_ACTION(softc, PROBE_TUR_FOR_NEGOTIATION);
 			} else {
 				/* give up */
-				softc->action = PROBE_DV_EXIT;
+				PROBE_SET_ACTION(softc, PROBE_DV_EXIT);
 			}
 			kfree(nbuf, M_CAMXPT);
 			xpt_release_ccb(done_ccb);
@@ -6351,7 +6384,7 @@ probedone(struct cam_periph *periph, union ccb *done_ccb)
 		}
 		kfree(nbuf, M_CAMXPT);
 		if (softc->action == PROBE_INQUIRY_BASIC_DV1) {
-			softc->action = PROBE_INQUIRY_BASIC_DV2;
+			PROBE_SET_ACTION(softc, PROBE_INQUIRY_BASIC_DV2);
 			xpt_release_ccb(done_ccb);
 			xpt_schedule(periph, priority);
 			return;
@@ -6372,6 +6405,11 @@ probedone(struct cam_periph *periph, union ccb *done_ccb)
 		xpt_release_ccb(done_ccb);
 		break;
 	}
+	case PROBE_INVALID:
+		CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_INFO,
+		    ("probedone: invalid action state\n"));
+	default:
+		break;
 	}
 	done_ccb = (union ccb *)TAILQ_FIRST(&softc->request_ccbs);
 	TAILQ_REMOVE(&softc->request_ccbs, &done_ccb->ccb_h, periph_links.tqe);
@@ -6659,9 +6697,7 @@ xpt_set_transfer_settings(struct ccb_trans_settings *cts, struct cam_ed *device,
 		if (((device->flags & CAM_DEV_INQUIRY_DATA_VALID) != 0
 		  && (inq_data->flags & SID_Sync) == 0
 		  && cts->type == CTS_TYPE_CURRENT_SETTINGS)
-		 || ((cpi.hba_inquiry & PI_SDTR_ABLE) == 0)
-		 || (spi->sync_offset == 0)
-		 || (spi->sync_period == 0)) {
+		 || ((cpi.hba_inquiry & PI_SDTR_ABLE) == 0)) {
 			/* Force async */
 			spi->sync_period = 0;
 			spi->sync_offset = 0;
@@ -6709,7 +6745,8 @@ xpt_set_transfer_settings(struct ccb_trans_settings *cts, struct cam_ed *device,
 		if (spi->bus_width == 0)
 			spi->ppr_options = 0;
 
-		if ((spi->flags & CTS_SPI_FLAGS_DISC_ENB) == 0) {
+		if ((spi->valid & CTS_SPI_VALID_DISC)
+		 && ((spi->flags & CTS_SPI_FLAGS_DISC_ENB) == 0)) {
 			/*
 			 * Can't tag queue without disconnection.
 			 */
