From owner-svn-src-head@FreeBSD.ORG Mon Feb 16 14:38:52 2009 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A97E3106566B; Mon, 16 Feb 2009 14:38:52 +0000 (UTC) (envelope-from scottl@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 8E0788FC1E; Mon, 16 Feb 2009 14:38:52 +0000 (UTC) (envelope-from scottl@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1GEcqPg058800; Mon, 16 Feb 2009 14:38:52 GMT (envelope-from scottl@svn.freebsd.org) Received: (from scottl@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1GEcqtZ058799; Mon, 16 Feb 2009 14:38:52 GMT (envelope-from scottl@svn.freebsd.org) Message-Id: <200902161438.n1GEcqtZ058799@svn.freebsd.org> From: Scott Long Date: Mon, 16 Feb 2009 14:38:52 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r188670 - head/sys/cam X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 16 Feb 2009 14:38:53 -0000 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);