Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 12 Aug 2012 20:45:48 +0000 (UTC)
From:      Matt Jacob <mjacob@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r239218 - head/sys/dev/isp
Message-ID:  <201208122045.q7CKjm17037974@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mjacob
Date: Sun Aug 12 20:45:47 2012
New Revision: 239218
URL: http://svn.freebsd.org/changeset/base/239218

Log:
  Fix an oops where we wiped out DMA maps. Don't allocate extended
  command space for anything less than a 2300.
  
  MFC after:	1 month
  X-MFC:		238869

Modified:
  head/sys/dev/isp/isp_freebsd.c
  head/sys/dev/isp/isp_pci.c

Modified: head/sys/dev/isp/isp_freebsd.c
==============================================================================
--- head/sys/dev/isp/isp_freebsd.c	Sun Aug 12 20:30:15 2012	(r239217)
+++ head/sys/dev/isp/isp_freebsd.c	Sun Aug 12 20:45:47 2012	(r239218)
@@ -779,8 +779,13 @@ static ISP_INLINE void
 isp_free_pcmd(ispsoftc_t *isp, union ccb *ccb)
 {
 	if (ISP_PCMD(ccb)) {
-		memset(ISP_PCMD(ccb), 0, sizeof (struct isp_pcmd));
-		((struct isp_pcmd *)ISP_PCMD(ccb))->next = isp->isp_osinfo.pcmd_free;
+#ifdef	ISP_TARGET_MODE
+		PISP_PCMD(ccb)->datalen = 0;
+		PISP_PCMD(ccb)->totslen = 0;
+		PISP_PCMD(ccb)->cumslen = 0;
+		PISP_PCMD(ccb)->crn = 0;
+#endif
+		PISP_PCMD(ccb)->next = isp->isp_osinfo.pcmd_free;
 		isp->isp_osinfo.pcmd_free = ISP_PCMD(ccb);
 		ISP_PCMD(ccb) = NULL;
 	}
@@ -6326,12 +6331,20 @@ isp_common_dmateardown(ispsoftc_t *isp, 
 int
 isp_fcp_next_crn(ispsoftc_t *isp, uint8_t *crnp, XS_T *cmd)
 {
-	uint32_t chan = XS_CHANNEL(cmd);
-	uint32_t tgt = XS_TGT(cmd);
-	uint32_t lun = XS_LUN(cmd);
-	struct isp_fc *fc = &isp->isp_osinfo.pc.fc[chan];
-	int idx = NEXUS_HASH(tgt, lun);
-	struct isp_nexus *nxp = fc->nexus_hash[idx];
+	uint32_t chan, tgt, lun;
+	struct isp_fc *fc;
+	struct isp_nexus *nxp;
+	int idx;
+
+	if (isp->isp_type < ISP_HA_FC_2300)
+		return (0);
+
+	chan = XS_CHANNEL(cmd);
+	tgt = XS_TGT(cmd);
+	lun = XS_LUN(cmd);
+	fc = &isp->isp_osinfo.pc.fc[chan];
+	idx = NEXUS_HASH(tgt, lun);
+	nxp = fc->nexus_hash[idx];
 
 	while (nxp) {
 		if (nxp->tgt == tgt && nxp->lun == lun)

Modified: head/sys/dev/isp/isp_pci.c
==============================================================================
--- head/sys/dev/isp/isp_pci.c	Sun Aug 12 20:30:15 2012	(r239217)
+++ head/sys/dev/isp/isp_pci.c	Sun Aug 12 20:45:47 2012	(r239218)
@@ -1690,18 +1690,20 @@ isp_pci_mbxdma(ispsoftc_t *isp)
 				bus_dma_tag_destroy(fc->tdmat);
 				goto bad;
 			}
-			for (i = 0; i < INITIAL_NEXUS_COUNT; i++) {
-				struct isp_nexus *n = malloc(sizeof (struct isp_nexus), M_DEVBUF, M_NOWAIT | M_ZERO);
-				if (n == NULL) {
-					while (fc->nexus_free_list) {
-						n = fc->nexus_free_list;
-						fc->nexus_free_list = n->next;
-						free(n, M_DEVBUF);
+			if (isp->isp_type >= ISP_HA_FC_2300) {
+				for (i = 0; i < INITIAL_NEXUS_COUNT; i++) {
+					struct isp_nexus *n = malloc(sizeof (struct isp_nexus), M_DEVBUF, M_NOWAIT | M_ZERO);
+					if (n == NULL) {
+						while (fc->nexus_free_list) {
+							n = fc->nexus_free_list;
+							fc->nexus_free_list = n->next;
+							free(n, M_DEVBUF);
+						}
+						goto bad;
 					}
-					goto bad;
+					n->next = fc->nexus_free_list;
+					fc->nexus_free_list = n;
 				}
-				n->next = fc->nexus_free_list;
-				fc->nexus_free_list = n;
 			}
 		}
 	}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201208122045.q7CKjm17037974>