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

Doug Ambrisko ambrisko at ambrisko.com
Fri Jan 24 19:00:48 UTC 2014


On Fri, Jan 24, 2014 at 10:53:56AM -0800, Doug Ambrisko wrote:
| 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.

I noticed that this patch is partially incomplete since I didn't have
FLAGS_MRSAS added to all of the TBOLT ID's.  I'll fix that in the commit.

| 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