svn commit: r262968 - stable/9/sys/dev/mfi
Mark Johnston
markj at FreeBSD.org
Mon Mar 10 02:38:42 UTC 2014
Author: markj
Date: Mon Mar 10 02:38:41 2014
New Revision: 262968
URL: http://svnweb.freebsd.org/changeset/base/262968
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.
Modified:
stable/9/sys/dev/mfi/mfi_pci.c
stable/9/sys/dev/mfi/mfi_tbolt.c
stable/9/sys/dev/mfi/mfivar.h
Directory Properties:
stable/9/sys/ (props changed)
stable/9/sys/dev/ (props changed)
Modified: stable/9/sys/dev/mfi/mfi_pci.c
==============================================================================
--- stable/9/sys/dev/mfi/mfi_pci.c Mon Mar 10 02:31:50 2014 (r262967)
+++ stable/9/sys/dev/mfi/mfi_pci.c Mon Mar 10 02:38:41 2014 (r262968)
@@ -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/9/sys/dev/mfi/mfi_tbolt.c
==============================================================================
--- stable/9/sys/dev/mfi/mfi_tbolt.c Mon Mar 10 02:31:50 2014 (r262967)
+++ stable/9/sys/dev/mfi/mfi_tbolt.c Mon Mar 10 02:38:41 2014 (r262968)
@@ -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/9/sys/dev/mfi/mfivar.h
==============================================================================
--- stable/9/sys/dev/mfi/mfivar.h Mon Mar 10 02:31:50 2014 (r262967)
+++ stable/9/sys/dev/mfi/mfivar.h Mon Mar 10 02:38:41 2014 (r262968)
@@ -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;
More information about the svn-src-stable-9
mailing list