Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 10 Mar 2014 02:31:50 +0000 (UTC)
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r262967 - stable/10/sys/dev/mfi
Message-ID:  <201403100231.s2A2VodI088975@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: markj
Date: Mon Mar 10 02:31:50 2014
New Revision: 262967
URL: http://svnweb.freebsd.org/changeset/base/262967

Log:
  MFC r261535:
  Add support for MegaRAID Fury cards. The main change needed to boot from a
  9341-4i controller was to ensure that scatter/gather lists are ended with
  an end-of-list marker. Both the mrsas and Linux megaraid_sas drivers use
  this marker with Invader cards as well, so we do the same thing, though
  it is apparently not strictly necessary.
  
  PR:		187312

Modified:
  stable/10/sys/dev/mfi/mfi_pci.c
  stable/10/sys/dev/mfi/mfi_tbolt.c
  stable/10/sys/dev/mfi/mfivar.h
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/mfi/mfi_pci.c
==============================================================================
--- stable/10/sys/dev/mfi/mfi_pci.c	Mon Mar 10 01:34:38 2014	(r262966)
+++ stable/10/sys/dev/mfi/mfi_pci.c	Mon Mar 10 02:31:50 2014	(r262967)
@@ -131,7 +131,8 @@ struct mfi_ident {
 	{0x1000, 0x005b, 0x8086, 0x9265, MFI_FLAGS_SKINNY| MFI_FLAGS_TBOLT, "Intel (R) RAID Controller RS25DB080"},
 	{0x1000, 0x005b, 0x8086, 0x9285, MFI_FLAGS_SKINNY| MFI_FLAGS_TBOLT, "Intel (R) RAID Controller RS25NB008"},
 	{0x1000, 0x005b, 0xffff, 0xffff, MFI_FLAGS_SKINNY| MFI_FLAGS_TBOLT, "ThunderBolt"},
-	{0x1000, 0x005d, 0xffff, 0xffff, MFI_FLAGS_SKINNY| MFI_FLAGS_TBOLT, "Invader"},
+	{0x1000, 0x005d, 0xffff, 0xffff, MFI_FLAGS_SKINNY| MFI_FLAGS_TBOLT| MFI_FLAGS_INVADER, "Invader"},
+	{0x1000, 0x005f, 0xffff, 0xffff, MFI_FLAGS_SKINNY| MFI_FLAGS_TBOLT| MFI_FLAGS_FURY, "Fury"},
 	{0x1000, 0x0060, 0x1028, 0xffff, MFI_FLAGS_1078,  "Dell PERC 6"},
 	{0x1000, 0x0060, 0xffff, 0xffff, MFI_FLAGS_1078,  "LSI MegaSAS 1078"},
 	{0x1000, 0x0071, 0xffff, 0xffff, MFI_FLAGS_SKINNY, "Drake Skinny"},

Modified: stable/10/sys/dev/mfi/mfi_tbolt.c
==============================================================================
--- stable/10/sys/dev/mfi/mfi_tbolt.c	Mon Mar 10 01:34:38 2014	(r262966)
+++ stable/10/sys/dev/mfi/mfi_tbolt.c	Mon Mar 10 02:31:50 2014	(r262967)
@@ -850,7 +850,8 @@ mfi_tbolt_build_ldio(struct mfi_softc *s
 	io_request = cmd->io_request;
 	io_request->RaidContext.TargetID = device_id;
 	io_request->RaidContext.Status = 0;
-	io_request->RaidContext.exStatus =0;
+	io_request->RaidContext.exStatus = 0;
+	io_request->RaidContext.regLockFlags = 0;
 
 	start_lba_lo = mfi_cmd->cm_frame->io.lba_lo;
 	start_lba_hi = mfi_cmd->cm_frame->io.lba_hi;
@@ -945,6 +946,7 @@ mfi_tbolt_make_sgl(struct mfi_softc *sc,
 	uint8_t i, sg_processed, sg_to_process;
 	uint8_t sge_count, sge_idx;
 	union mfi_sgl *os_sgl;
+	pMpi25IeeeSgeChain64_t sgl_end;
 
 	/*
 	 * Return 0 if there is no data transfer
@@ -968,6 +970,11 @@ mfi_tbolt_make_sgl(struct mfi_softc *sc,
 	else
 		sge_idx = sge_count;
 
+	if (sc->mfi_flags & (MFI_FLAGS_INVADER | MFI_FLAGS_FURY)) {
+		sgl_end = sgl_ptr + (sc->max_SGEs_in_main_message - 1);
+		sgl_end->Flags = 0;
+	}
+
 	for (i = 0; i < sge_idx; i++) {
 		/*
 		 * For 32bit BSD we are getting 32 bit SGL's from OS
@@ -981,7 +988,11 @@ mfi_tbolt_make_sgl(struct mfi_softc *sc,
 			sgl_ptr->Length = os_sgl->sg32[i].len;
 			sgl_ptr->Address = os_sgl->sg32[i].addr;
 		}
-		sgl_ptr->Flags = 0;
+		if (i == sge_count - 1 &&
+		    (sc->mfi_flags & (MFI_FLAGS_INVADER | MFI_FLAGS_FURY)))
+			sgl_ptr->Flags = MPI25_IEEE_SGE_FLAGS_END_OF_LIST;
+		else
+			sgl_ptr->Flags = 0;
 		sgl_ptr++;
 		cmd->io_request->ChainOffset = 0;
 	}
@@ -996,8 +1007,11 @@ mfi_tbolt_make_sgl(struct mfi_softc *sc,
 		sg_chain = sgl_ptr;
 		/* Prepare chain element */
 		sg_chain->NextChainOffset = 0;
-		sg_chain->Flags = (MPI2_IEEE_SGE_FLAGS_CHAIN_ELEMENT |
-		    MPI2_IEEE_SGE_FLAGS_IOCPLBNTA_ADDR);
+		if (sc->mfi_flags & (MFI_FLAGS_INVADER | MFI_FLAGS_FURY))
+			sg_chain->Flags = MPI2_IEEE_SGE_FLAGS_CHAIN_ELEMENT;
+		else
+			sg_chain->Flags = MPI2_IEEE_SGE_FLAGS_CHAIN_ELEMENT |
+			    MPI2_IEEE_SGE_FLAGS_IOCPLBNTA_ADDR;
 		sg_chain->Length =  (sizeof(MPI2_SGE_IO_UNION) *
 		    (sge_count - sg_processed));
 		sg_chain->Address = cmd->sg_frame_phys_addr;
@@ -1010,7 +1024,13 @@ mfi_tbolt_make_sgl(struct mfi_softc *sc,
 				sgl_ptr->Length = os_sgl->sg32[i].len;
 				sgl_ptr->Address = os_sgl->sg32[i].addr;
 			}
-			sgl_ptr->Flags = 0;
+			if (i == sge_count - 1 &&
+			    (sc->mfi_flags &
+			    (MFI_FLAGS_INVADER | MFI_FLAGS_FURY)))
+				sgl_ptr->Flags =
+				    MPI25_IEEE_SGE_FLAGS_END_OF_LIST;
+			else
+				sgl_ptr->Flags = 0;
 			sgl_ptr++;
 		}
 	}

Modified: stable/10/sys/dev/mfi/mfivar.h
==============================================================================
--- stable/10/sys/dev/mfi/mfivar.h	Mon Mar 10 01:34:38 2014	(r262966)
+++ stable/10/sys/dev/mfi/mfivar.h	Mon Mar 10 02:31:50 2014	(r262967)
@@ -199,6 +199,8 @@ struct mfi_softc {
 #define MFI_FLAGS_GEN2		(1<<6)
 #define MFI_FLAGS_SKINNY	(1<<7)
 #define MFI_FLAGS_TBOLT		(1<<8)
+#define MFI_FLAGS_INVADER	(1<<10)
+#define MFI_FLAGS_FURY		(1<<11)
 	// Start: LSIP200113393
 	bus_dma_tag_t			verbuf_h_dmat;
 	bus_dmamap_t			verbuf_h_dmamap;



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