Author: scottl
Date: Mon Feb 16 14:38:52 2009
New Revision: 188670
URL: http://svn.freebsd.org/changeset/base/188670

Log:
  Instrument the probe state machine so that things like DV can be tracked.

Modified:
  head/sys/cam/cam_xpt.c

Modified: head/sys/cam/cam_xpt.c
==============================================================================
--- head/sys/cam/cam_xpt.c      Mon Feb 16 12:09:52 2009        (r188669)
+++ head/sys/cam/cam_xpt.c      Mon Feb 16 14:38:52 2009        (r188670)
@@ -5419,9 +5419,33 @@ 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 = 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,
@@ -5435,6 +5459,7 @@ typedef struct {
        probe_flags     flags;
        MD5_CTX         context;
        u_int8_t        digest[16];
+       struct cam_periph *periph;
 } probe_softc;
 
 static void
@@ -5566,6 +5591,8 @@ proberegister(struct cam_periph *periph,
                          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);
@@ -5617,13 +5644,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)
@@ -5712,7 +5739,7 @@ probestart(struct cam_periph *periph, un
                if (inq_buf == NULL) {
                        xpt_print(periph->path, "malloc failure- skipping Basic"
                            "Domain Validation\n");
-                       softc->action = PROBE_DV_EXIT;
+                       PROBE_SET_ACTION(softc, PROBE_DV_EXIT);
                        scsi_test_unit_ready(csio,
                                             /*retries*/4,
                                             probedone,
@@ -5758,7 +5785,7 @@ probestart(struct cam_periph *periph, un
                }
                xpt_print(periph->path, "Unable to mode sense control page - "
                    "malloc failure\n");
-               softc->action = PROBE_SERIAL_NUM_0;
+               PROBE_SET_ACTION(softc, PROBE_SERIAL_NUM_0);
        }
        /* FALLTHROUGH */
        case PROBE_SERIAL_NUM_0:
@@ -5827,6 +5854,11 @@ probestart(struct cam_periph *periph, un
                probedone(periph, start_ccb);
                return;
        }
+       case PROBE_INVALID:
+               CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_INFO,
+                   ("probestart: invalid action state\n"));
+       default:
+               break;
        }
        xpt_action(start_ccb);
 }
@@ -5980,7 +6012,7 @@ probedone(struct cam_periph *periph, uni
                                                 /*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;
@@ -6017,7 +6049,7 @@ probedone(struct cam_periph *periph, uni
                                                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;
@@ -6027,9 +6059,9 @@ probedone(struct cam_periph *periph, uni
 
                                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;
 
@@ -6094,7 +6126,7 @@ probedone(struct cam_periph *periph, uni
                }
                xpt_release_ccb(done_ccb);
                free(mode_hdr, M_CAMXPT);
-               softc->action = PROBE_SERIAL_NUM_0;
+               PROBE_SET_ACTION(softc, PROBE_SERIAL_NUM_0);
                xpt_schedule(periph, priority);
                return;
        }
@@ -6139,7 +6171,7 @@ probedone(struct cam_periph *periph, uni
 
                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;
                }
@@ -6250,7 +6282,7 @@ probedone(struct cam_periph *periph, uni
                         * 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;
                }
@@ -6283,7 +6315,7 @@ probedone(struct cam_periph *periph, uni
                            ("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;
                }
@@ -6321,10 +6353,10 @@ probedone(struct cam_periph *periph, uni
                            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);
                        }
                        free(nbuf, M_CAMXPT);
                        xpt_release_ccb(done_ccb);
@@ -6333,12 +6365,12 @@ probedone(struct cam_periph *periph, uni
                }
                free(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;
                }
-               if (softc->action == PROBE_DV_EXIT) {
+               if (softc->action == PROBE_INQUIRY_BASIC_DV2) {
                        CAM_DEBUG(periph->path, CAM_DEBUG_INFO,
                            ("Leave Domain Validation Successfully\n"));
                }
@@ -6354,6 +6386,11 @@ probedone(struct cam_periph *periph, uni
                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);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to