LSI - MR-Fusion controller driver <mrsas> patch and man page

Doug Ambrisko ambrisko at ambrisko.com
Fri Jan 24 18:55:05 UTC 2014


On Tue, Jan 07, 2014 at 10:11:39AM -0800, Doug Ambrisko wrote:
	[snip]
| Yes, we can probably make the minimal change to mfi to allow mrsas to
| optionally take over.  That can probably be done the quickest.

Here is the patch I propose to mfi(4) to allow mrsas(4) to optionally take
newer cards.

Index: mfi_pci.c
===================================================================
--- mfi_pci.c	(revision 260231)
+++ mfi_pci.c	(working copy)
@@ -112,6 +112,11 @@
 SYSCTL_INT(_hw_mfi, OID_AUTO, msi, CTLFLAG_RDTUN, &mfi_msi, 0,
     "Enable use of MSI interrupts");
 
+static int	mfi_mrsas_enable = 0;
+TUNABLE_INT("hw.mfi.mrsas_enable", &mfi_msi);
+SYSCTL_INT(_hw_mfi, OID_AUTO, mrsas_enable, CTLFLAG_RDTUN, &mfi_mrsas_enable,
+     0, "Allow mrasas to take newer cards");
+
 struct mfi_ident {
 	uint16_t	vendor;
 	uint16_t	device;
@@ -127,11 +132,11 @@
 	{0x1000, 0x005b, 0x1028, 0x1f34, MFI_FLAGS_SKINNY| MFI_FLAGS_TBOLT, "Dell PERC H710P Mini (monolithics)"},
 	{0x1000, 0x005b, 0x1028, 0x1f35, MFI_FLAGS_SKINNY| MFI_FLAGS_TBOLT, "Dell PERC H710 Adapter"},
 	{0x1000, 0x005b, 0x1028, 0x1f37, MFI_FLAGS_SKINNY| MFI_FLAGS_TBOLT, "Dell PERC H710 Mini (blades)"},
-	{0x1000, 0x005b, 0x1028, 0x1f38, MFI_FLAGS_SKINNY| MFI_FLAGS_TBOLT, "Dell PERC H710 Mini (monolithics)"},
-	{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, 0x005b, 0x1028, 0x1f38, MFI_FLAGS_SKINNY| MFI_FLAGS_TBOLT| MFI_FLAGS_MRSAS, "Dell PERC H710 Mini (monolithics)"},
+	{0x1000, 0x005b, 0x8086, 0x9265, MFI_FLAGS_SKINNY| MFI_FLAGS_TBOLT| MFI_FLAGS_MRSAS, "Intel (R) RAID Controller RS25DB080"},
+	{0x1000, 0x005b, 0x8086, 0x9285, MFI_FLAGS_SKINNY| MFI_FLAGS_TBOLT| MFI_FLAGS_MRSAS, "Intel (R) RAID Controller RS25NB008"},
+	{0x1000, 0x005b, 0xffff, 0xffff, MFI_FLAGS_SKINNY| MFI_FLAGS_TBOLT| MFI_FLAGS_MRSAS, "ThunderBolt"},
+	{0x1000, 0x005d, 0xffff, 0xffff, MFI_FLAGS_SKINNY| MFI_FLAGS_TBOLT| MFI_FLAGS_MRSAS, "Invader"},
 	{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"},
@@ -178,7 +183,13 @@
 
 	if ((id = mfi_find_ident(dev)) != NULL) {
 		device_set_desc(dev, id->desc);
-		return (BUS_PROBE_DEFAULT);
+
+		/* give priority to mrsas if tunable set */
+		TUNABLE_INT_FETCH("hw.mfi.mrsas_enable", &mfi_mrsas_enable);
+		if ((id->flags & MFI_FLAGS_MRSAS) && mfi_mrsas_enable)
+			return (BUS_PROBE_LOW_PRIORITY);
+		else
+			return (BUS_PROBE_DEFAULT);
 	}
 	return (ENXIO);
 }
Index: mfivar.h
===================================================================
--- mfivar.h	(revision 260231)
+++ mfivar.h	(working copy)
@@ -199,6 +199,7 @@
 #define MFI_FLAGS_GEN2		(1<<6)
 #define MFI_FLAGS_SKINNY	(1<<7)
 #define MFI_FLAGS_TBOLT		(1<<8)
+#define MFI_FLAGS_MRSAS		(1<<9)
 	// Start: LSIP200113393
 	bus_dma_tag_t			verbuf_h_dmat;
 	bus_dmamap_t			verbuf_h_dmamap;

This creates a hw.mfi.mrsas_enable tunable to control it.  The
method via hints wasn't the best since for one the unit index was
being abused a non-unit specfic option.  It was also a little strange
to have mrsas hint be in mfi(4).

Then we need a minor change to mrsas.c


--- ../mrsas.orig/mrsas.c	2014-01-03 11:30:28.000000000 -0800
+++ ./mrsas.c	2014-01-24 10:43:20.000000000 -0800
@@ -328,25 +328,11 @@ static struct mrsas_ident * mrsas_find_i
 static int mrsas_probe(device_t dev)
 {
     struct mrsas_ident *id;
-	unsigned int force = 0, ivar;
 
     if ((id = mrsas_find_ident(dev)) != NULL) {
-		if (id->device == 0x005b || id->device == 0x005d) {
-            resource_int_value("mrsas", 0, "fusion_force", &ivar);
-
-			if (ivar == 0 || ivar == 1)
-		            force = ivar;  
-
-            device_set_desc(dev, id->desc);
-            if (force)
-            	return (BUS_PROBE_DEFAULT);
-                //return (BUS_PROBE_SPECIFIC);  //give priority to MFI driver
-            else 
-                return (BUS_PROBE_LOW_PRIORITY);
-        }
-        else 
-            device_set_desc(dev, id->desc);
-            return (BUS_PROBE_DEFAULT);
+	device_set_desc(dev, id->desc);
+	/* between BUS_PROBE_DEFAULT and BUS_PROBE_LOW_PRIORITY */
+	return (-30);
     }
     return (ENXIO);
 
So that its probe part way between mfi(4) results and then it doesn't have
to change.

If no one has concerns then I'll check in the mfi(4) change.

Thanks,

Doug A.


More information about the freebsd-scsi mailing list