提交 36807e67 编写于 作者: A adam radford 提交者: James Bottomley

[SCSI] megaraid_sas: Add support for MegaRAID 9360/9380 12GB/s controllers

Signed-off-by: NAdam Radford <aradford@gmail.com>
Signed-off-by: NJames Bottomley <JBottomley@Parallels.com>
上级 3f0e58bc
...@@ -48,6 +48,7 @@ ...@@ -48,6 +48,7 @@
#define PCI_DEVICE_ID_LSI_SAS0073SKINNY 0x0073 #define PCI_DEVICE_ID_LSI_SAS0073SKINNY 0x0073
#define PCI_DEVICE_ID_LSI_SAS0071SKINNY 0x0071 #define PCI_DEVICE_ID_LSI_SAS0071SKINNY 0x0071
#define PCI_DEVICE_ID_LSI_FUSION 0x005b #define PCI_DEVICE_ID_LSI_FUSION 0x005b
#define PCI_DEVICE_ID_LSI_INVADER 0x005d
/* /*
* ===================================== * =====================================
...@@ -221,6 +222,7 @@ enum MFI_STAT { ...@@ -221,6 +222,7 @@ enum MFI_STAT {
MFI_STAT_RESERVATION_IN_PROGRESS = 0x36, MFI_STAT_RESERVATION_IN_PROGRESS = 0x36,
MFI_STAT_I2C_ERRORS_DETECTED = 0x37, MFI_STAT_I2C_ERRORS_DETECTED = 0x37,
MFI_STAT_PCI_ERRORS_DETECTED = 0x38, MFI_STAT_PCI_ERRORS_DETECTED = 0x38,
MFI_STAT_CONFIG_SEQ_MISMATCH = 0x67,
MFI_STAT_INVALID_STATUS = 0xFF MFI_STAT_INVALID_STATUS = 0xFF
}; };
......
...@@ -114,6 +114,8 @@ static struct pci_device_id megasas_pci_table[] = { ...@@ -114,6 +114,8 @@ static struct pci_device_id megasas_pci_table[] = {
/* xscale IOP */ /* xscale IOP */
{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FUSION)}, {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FUSION)},
/* Fusion */ /* Fusion */
{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_INVADER)},
/* Invader */
{} {}
}; };
...@@ -1583,7 +1585,8 @@ void megaraid_sas_kill_hba(struct megasas_instance *instance) ...@@ -1583,7 +1585,8 @@ void megaraid_sas_kill_hba(struct megasas_instance *instance)
{ {
if ((instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0073SKINNY) || if ((instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
(instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0071SKINNY) || (instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0071SKINNY) ||
(instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION)) { (instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
(instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER)) {
writel(MFI_STOP_ADP, &instance->reg_set->doorbell); writel(MFI_STOP_ADP, &instance->reg_set->doorbell);
} else { } else {
writel(MFI_STOP_ADP, &instance->reg_set->inbound_doorbell); writel(MFI_STOP_ADP, &instance->reg_set->inbound_doorbell);
...@@ -1957,7 +1960,8 @@ static int megasas_reset_bus_host(struct scsi_cmnd *scmd) ...@@ -1957,7 +1960,8 @@ static int megasas_reset_bus_host(struct scsi_cmnd *scmd)
/* /*
* First wait for all commands to complete * First wait for all commands to complete
*/ */
if (instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
(instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER))
ret = megasas_reset_fusion(scmd->device->host); ret = megasas_reset_fusion(scmd->device->host);
else else
ret = megasas_generic_reset(scmd); ret = megasas_generic_reset(scmd);
...@@ -2656,7 +2660,9 @@ megasas_transition_to_ready(struct megasas_instance *instance, int ocr) ...@@ -2656,7 +2660,9 @@ megasas_transition_to_ready(struct megasas_instance *instance, int ocr)
(instance->pdev->device == (instance->pdev->device ==
PCI_DEVICE_ID_LSI_SAS0071SKINNY) || PCI_DEVICE_ID_LSI_SAS0071SKINNY) ||
(instance->pdev->device == (instance->pdev->device ==
PCI_DEVICE_ID_LSI_FUSION)) { PCI_DEVICE_ID_LSI_FUSION) ||
(instance->pdev->device ==
PCI_DEVICE_ID_LSI_INVADER)) {
writel( writel(
MFI_INIT_CLEAR_HANDSHAKE|MFI_INIT_HOTPLUG, MFI_INIT_CLEAR_HANDSHAKE|MFI_INIT_HOTPLUG,
&instance->reg_set->doorbell); &instance->reg_set->doorbell);
...@@ -2676,7 +2682,9 @@ megasas_transition_to_ready(struct megasas_instance *instance, int ocr) ...@@ -2676,7 +2682,9 @@ megasas_transition_to_ready(struct megasas_instance *instance, int ocr)
(instance->pdev->device == (instance->pdev->device ==
PCI_DEVICE_ID_LSI_SAS0071SKINNY) || PCI_DEVICE_ID_LSI_SAS0071SKINNY) ||
(instance->pdev->device == (instance->pdev->device ==
PCI_DEVICE_ID_LSI_FUSION)) { PCI_DEVICE_ID_LSI_FUSION) ||
(instance->pdev->device ==
PCI_DEVICE_ID_LSI_INVADER)) {
writel(MFI_INIT_HOTPLUG, writel(MFI_INIT_HOTPLUG,
&instance->reg_set->doorbell); &instance->reg_set->doorbell);
} else } else
...@@ -2697,11 +2705,15 @@ megasas_transition_to_ready(struct megasas_instance *instance, int ocr) ...@@ -2697,11 +2705,15 @@ megasas_transition_to_ready(struct megasas_instance *instance, int ocr)
(instance->pdev->device == (instance->pdev->device ==
PCI_DEVICE_ID_LSI_SAS0071SKINNY) || PCI_DEVICE_ID_LSI_SAS0071SKINNY) ||
(instance->pdev->device (instance->pdev->device
== PCI_DEVICE_ID_LSI_FUSION)) { == PCI_DEVICE_ID_LSI_FUSION) ||
(instance->pdev->device
== PCI_DEVICE_ID_LSI_INVADER)) {
writel(MFI_RESET_FLAGS, writel(MFI_RESET_FLAGS,
&instance->reg_set->doorbell); &instance->reg_set->doorbell);
if (instance->pdev->device == if ((instance->pdev->device ==
PCI_DEVICE_ID_LSI_FUSION) { PCI_DEVICE_ID_LSI_FUSION) ||
(instance->pdev->device ==
PCI_DEVICE_ID_LSI_INVADER)) {
for (i = 0; i < (10 * 1000); i += 20) { for (i = 0; i < (10 * 1000); i += 20) {
if (readl( if (readl(
&instance-> &instance->
...@@ -3498,6 +3510,7 @@ static int megasas_init_fw(struct megasas_instance *instance) ...@@ -3498,6 +3510,7 @@ static int megasas_init_fw(struct megasas_instance *instance)
switch (instance->pdev->device) { switch (instance->pdev->device) {
case PCI_DEVICE_ID_LSI_FUSION: case PCI_DEVICE_ID_LSI_FUSION:
case PCI_DEVICE_ID_LSI_INVADER:
instance->instancet = &megasas_instance_template_fusion; instance->instancet = &megasas_instance_template_fusion;
break; break;
case PCI_DEVICE_ID_LSI_SAS1078R: case PCI_DEVICE_ID_LSI_SAS1078R:
...@@ -3894,7 +3907,8 @@ static int megasas_io_attach(struct megasas_instance *instance) ...@@ -3894,7 +3907,8 @@ static int megasas_io_attach(struct megasas_instance *instance)
host->max_cmd_len = 16; host->max_cmd_len = 16;
/* Fusion only supports host reset */ /* Fusion only supports host reset */
if (instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) { if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
(instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER)) {
host->hostt->eh_device_reset_handler = NULL; host->hostt->eh_device_reset_handler = NULL;
host->hostt->eh_bus_reset_handler = NULL; host->hostt->eh_bus_reset_handler = NULL;
} }
...@@ -4004,6 +4018,7 @@ megasas_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -4004,6 +4018,7 @@ megasas_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
switch (instance->pdev->device) { switch (instance->pdev->device) {
case PCI_DEVICE_ID_LSI_FUSION: case PCI_DEVICE_ID_LSI_FUSION:
case PCI_DEVICE_ID_LSI_INVADER:
{ {
struct fusion_context *fusion; struct fusion_context *fusion;
...@@ -4096,7 +4111,8 @@ megasas_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -4096,7 +4111,8 @@ megasas_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
instance->last_time = 0; instance->last_time = 0;
instance->disableOnlineCtrlReset = 1; instance->disableOnlineCtrlReset = 1;
if (instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
(instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER))
INIT_WORK(&instance->work_init, megasas_fusion_ocr_wq); INIT_WORK(&instance->work_init, megasas_fusion_ocr_wq);
else else
INIT_WORK(&instance->work_init, process_fw_state_change_wq); INIT_WORK(&instance->work_init, process_fw_state_change_wq);
...@@ -4161,7 +4177,8 @@ megasas_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -4161,7 +4177,8 @@ megasas_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
free_irq(instance->msi_flag ? instance->msixentry.vector : free_irq(instance->msi_flag ? instance->msixentry.vector :
instance->pdev->irq, instance); instance->pdev->irq, instance);
fail_irq: fail_irq:
if (instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
(instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER))
megasas_release_fusion(instance); megasas_release_fusion(instance);
else else
megasas_release_mfi(instance); megasas_release_mfi(instance);
...@@ -4368,6 +4385,7 @@ megasas_resume(struct pci_dev *pdev) ...@@ -4368,6 +4385,7 @@ megasas_resume(struct pci_dev *pdev)
switch (instance->pdev->device) { switch (instance->pdev->device) {
case PCI_DEVICE_ID_LSI_FUSION: case PCI_DEVICE_ID_LSI_FUSION:
case PCI_DEVICE_ID_LSI_INVADER:
{ {
megasas_reset_reply_desc(instance); megasas_reset_reply_desc(instance);
if (megasas_ioc_init_fusion(instance)) { if (megasas_ioc_init_fusion(instance)) {
...@@ -4501,6 +4519,7 @@ static void __devexit megasas_detach_one(struct pci_dev *pdev) ...@@ -4501,6 +4519,7 @@ static void __devexit megasas_detach_one(struct pci_dev *pdev)
switch (instance->pdev->device) { switch (instance->pdev->device) {
case PCI_DEVICE_ID_LSI_FUSION: case PCI_DEVICE_ID_LSI_FUSION:
case PCI_DEVICE_ID_LSI_INVADER:
megasas_release_fusion(instance); megasas_release_fusion(instance);
for (i = 0; i < 2 ; i++) for (i = 0; i < 2 ; i++)
if (fusion->ld_map[i]) if (fusion->ld_map[i])
......
...@@ -52,6 +52,7 @@ ...@@ -52,6 +52,7 @@
#include <scsi/scsi_host.h> #include <scsi/scsi_host.h>
#include "megaraid_sas_fusion.h" #include "megaraid_sas_fusion.h"
#include "megaraid_sas.h"
#include <asm/div64.h> #include <asm/div64.h>
#define ABS_DIFF(a, b) (((a) > (b)) ? ((a) - (b)) : ((b) - (a))) #define ABS_DIFF(a, b) (((a) > (b)) ? ((a) - (b)) : ((b) - (a)))
...@@ -226,8 +227,9 @@ u32 MR_GetSpanBlock(u32 ld, u64 row, u64 *span_blk, ...@@ -226,8 +227,9 @@ u32 MR_GetSpanBlock(u32 ld, u64 row, u64 *span_blk,
* span - Span number * span - Span number
* block - Absolute Block number in the physical disk * block - Absolute Block number in the physical disk
*/ */
u8 MR_GetPhyParams(u32 ld, u64 stripRow, u16 stripRef, u64 *pdBlock, u8 MR_GetPhyParams(struct megasas_instance *instance, u32 ld, u64 stripRow,
u16 *pDevHandle, struct RAID_CONTEXT *pRAID_Context, u16 stripRef, u64 *pdBlock, u16 *pDevHandle,
struct RAID_CONTEXT *pRAID_Context,
struct MR_FW_RAID_MAP_ALL *map) struct MR_FW_RAID_MAP_ALL *map)
{ {
struct MR_LD_RAID *raid = MR_LdRaidGet(ld, map); struct MR_LD_RAID *raid = MR_LdRaidGet(ld, map);
...@@ -279,7 +281,8 @@ u8 MR_GetPhyParams(u32 ld, u64 stripRow, u16 stripRef, u64 *pdBlock, ...@@ -279,7 +281,8 @@ u8 MR_GetPhyParams(u32 ld, u64 stripRow, u16 stripRef, u64 *pdBlock,
*pDevHandle = MR_PdDevHandleGet(pd, map); *pDevHandle = MR_PdDevHandleGet(pd, map);
else { else {
*pDevHandle = MR_PD_INVALID; /* set dev handle as invalid. */ *pDevHandle = MR_PD_INVALID; /* set dev handle as invalid. */
if (raid->level >= 5) if ((raid->level >= 5) &&
(instance->pdev->device != PCI_DEVICE_ID_LSI_INVADER))
pRAID_Context->regLockFlags = REGION_TYPE_EXCLUSIVE; pRAID_Context->regLockFlags = REGION_TYPE_EXCLUSIVE;
else if (raid->level == 1) { else if (raid->level == 1) {
/* Get alternate Pd. */ /* Get alternate Pd. */
...@@ -306,7 +309,8 @@ u8 MR_GetPhyParams(u32 ld, u64 stripRow, u16 stripRef, u64 *pdBlock, ...@@ -306,7 +309,8 @@ u8 MR_GetPhyParams(u32 ld, u64 stripRow, u16 stripRef, u64 *pdBlock,
* This function will return 0 if region lock was acquired OR return num strips * This function will return 0 if region lock was acquired OR return num strips
*/ */
u8 u8
MR_BuildRaidContext(struct IO_REQUEST_INFO *io_info, MR_BuildRaidContext(struct megasas_instance *instance,
struct IO_REQUEST_INFO *io_info,
struct RAID_CONTEXT *pRAID_Context, struct RAID_CONTEXT *pRAID_Context,
struct MR_FW_RAID_MAP_ALL *map) struct MR_FW_RAID_MAP_ALL *map)
{ {
...@@ -394,8 +398,12 @@ MR_BuildRaidContext(struct IO_REQUEST_INFO *io_info, ...@@ -394,8 +398,12 @@ MR_BuildRaidContext(struct IO_REQUEST_INFO *io_info,
} }
pRAID_Context->timeoutValue = map->raidMap.fpPdIoTimeoutSec; pRAID_Context->timeoutValue = map->raidMap.fpPdIoTimeoutSec;
pRAID_Context->regLockFlags = (isRead) ? REGION_TYPE_SHARED_READ : if (instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER)
raid->regTypeReqOnWrite; pRAID_Context->regLockFlags = (isRead) ?
raid->regTypeReqOnRead : raid->regTypeReqOnWrite;
else
pRAID_Context->regLockFlags = (isRead) ?
REGION_TYPE_SHARED_READ : raid->regTypeReqOnWrite;
pRAID_Context->VirtualDiskTgtId = raid->targetId; pRAID_Context->VirtualDiskTgtId = raid->targetId;
pRAID_Context->regLockRowLBA = regStart; pRAID_Context->regLockRowLBA = regStart;
pRAID_Context->regLockLength = regSize; pRAID_Context->regLockLength = regSize;
...@@ -404,7 +412,8 @@ MR_BuildRaidContext(struct IO_REQUEST_INFO *io_info, ...@@ -404,7 +412,8 @@ MR_BuildRaidContext(struct IO_REQUEST_INFO *io_info,
/*Get Phy Params only if FP capable, or else leave it to MR firmware /*Get Phy Params only if FP capable, or else leave it to MR firmware
to do the calculation.*/ to do the calculation.*/
if (io_info->fpOkForIo) { if (io_info->fpOkForIo) {
retval = MR_GetPhyParams(ld, start_strip, ref_in_start_stripe, retval = MR_GetPhyParams(instance, ld, start_strip,
ref_in_start_stripe,
&io_info->pdBlock, &io_info->pdBlock,
&io_info->devHandle, pRAID_Context, &io_info->devHandle, pRAID_Context,
map); map);
...@@ -415,7 +424,8 @@ MR_BuildRaidContext(struct IO_REQUEST_INFO *io_info, ...@@ -415,7 +424,8 @@ MR_BuildRaidContext(struct IO_REQUEST_INFO *io_info,
} else if (isRead) { } else if (isRead) {
uint stripIdx; uint stripIdx;
for (stripIdx = 0; stripIdx < num_strips; stripIdx++) { for (stripIdx = 0; stripIdx < num_strips; stripIdx++) {
if (!MR_GetPhyParams(ld, start_strip + stripIdx, if (!MR_GetPhyParams(instance, ld,
start_strip + stripIdx,
ref_in_start_stripe, ref_in_start_stripe,
&io_info->pdBlock, &io_info->pdBlock,
&io_info->devHandle, &io_info->devHandle,
......
...@@ -74,7 +74,8 @@ megasas_issue_polled(struct megasas_instance *instance, ...@@ -74,7 +74,8 @@ megasas_issue_polled(struct megasas_instance *instance,
struct megasas_cmd *cmd); struct megasas_cmd *cmd);
u8 u8
MR_BuildRaidContext(struct IO_REQUEST_INFO *io_info, MR_BuildRaidContext(struct megasas_instance *instance,
struct IO_REQUEST_INFO *io_info,
struct RAID_CONTEXT *pRAID_Context, struct RAID_CONTEXT *pRAID_Context,
struct MR_FW_RAID_MAP_ALL *map); struct MR_FW_RAID_MAP_ALL *map);
u16 MR_TargetIdToLdGet(u32 ldTgtId, struct MR_FW_RAID_MAP_ALL *map); u16 MR_TargetIdToLdGet(u32 ldTgtId, struct MR_FW_RAID_MAP_ALL *map);
...@@ -1038,7 +1039,9 @@ map_cmd_status(struct megasas_cmd_fusion *cmd, u8 status, u8 ext_status) ...@@ -1038,7 +1039,9 @@ map_cmd_status(struct megasas_cmd_fusion *cmd, u8 status, u8 ext_status)
case MFI_STAT_DEVICE_NOT_FOUND: case MFI_STAT_DEVICE_NOT_FOUND:
cmd->scmd->result = DID_BAD_TARGET << 16; cmd->scmd->result = DID_BAD_TARGET << 16;
break; break;
case MFI_STAT_CONFIG_SEQ_MISMATCH:
cmd->scmd->result = DID_IMM_RETRY << 16;
break;
default: default:
printk(KERN_DEBUG "megasas: FW status %#x\n", status); printk(KERN_DEBUG "megasas: FW status %#x\n", status);
cmd->scmd->result = DID_ERROR << 16; cmd->scmd->result = DID_ERROR << 16;
...@@ -1061,14 +1064,17 @@ megasas_make_sgl_fusion(struct megasas_instance *instance, ...@@ -1061,14 +1064,17 @@ megasas_make_sgl_fusion(struct megasas_instance *instance,
struct MPI25_IEEE_SGE_CHAIN64 *sgl_ptr, struct MPI25_IEEE_SGE_CHAIN64 *sgl_ptr,
struct megasas_cmd_fusion *cmd) struct megasas_cmd_fusion *cmd)
{ {
int i, sg_processed; int i, sg_processed, sge_count;
int sge_count, sge_idx;
struct scatterlist *os_sgl; struct scatterlist *os_sgl;
struct fusion_context *fusion; struct fusion_context *fusion;
fusion = instance->ctrl_context; fusion = instance->ctrl_context;
cmd->io_request->ChainOffset = 0; if (instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) {
struct MPI25_IEEE_SGE_CHAIN64 *sgl_ptr_end = sgl_ptr;
sgl_ptr_end += fusion->max_sge_in_main_msg - 1;
sgl_ptr_end->Flags = 0;
}
sge_count = scsi_dma_map(scp); sge_count = scsi_dma_map(scp);
...@@ -1077,16 +1083,14 @@ megasas_make_sgl_fusion(struct megasas_instance *instance, ...@@ -1077,16 +1083,14 @@ megasas_make_sgl_fusion(struct megasas_instance *instance,
if (sge_count > instance->max_num_sge || !sge_count) if (sge_count > instance->max_num_sge || !sge_count)
return sge_count; return sge_count;
if (sge_count > fusion->max_sge_in_main_msg) {
/* One element to store the chain info */
sge_idx = fusion->max_sge_in_main_msg - 1;
} else
sge_idx = sge_count;
scsi_for_each_sg(scp, os_sgl, sge_count, i) { scsi_for_each_sg(scp, os_sgl, sge_count, i) {
sgl_ptr->Length = sg_dma_len(os_sgl); sgl_ptr->Length = sg_dma_len(os_sgl);
sgl_ptr->Address = sg_dma_address(os_sgl); sgl_ptr->Address = sg_dma_address(os_sgl);
sgl_ptr->Flags = 0; sgl_ptr->Flags = 0;
if (instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) {
if (i == sge_count - 1)
sgl_ptr->Flags = IEEE_SGE_FLAGS_END_OF_LIST;
}
sgl_ptr++; sgl_ptr++;
sg_processed = i + 1; sg_processed = i + 1;
...@@ -1095,13 +1099,30 @@ megasas_make_sgl_fusion(struct megasas_instance *instance, ...@@ -1095,13 +1099,30 @@ megasas_make_sgl_fusion(struct megasas_instance *instance,
(sge_count > fusion->max_sge_in_main_msg)) { (sge_count > fusion->max_sge_in_main_msg)) {
struct MPI25_IEEE_SGE_CHAIN64 *sg_chain; struct MPI25_IEEE_SGE_CHAIN64 *sg_chain;
cmd->io_request->ChainOffset = if (instance->pdev->device ==
fusion->chain_offset_io_request; PCI_DEVICE_ID_LSI_INVADER) {
if ((cmd->io_request->IoFlags &
MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH) !=
MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH)
cmd->io_request->ChainOffset =
fusion->
chain_offset_io_request;
else
cmd->io_request->ChainOffset = 0;
} else
cmd->io_request->ChainOffset =
fusion->chain_offset_io_request;
sg_chain = sgl_ptr; sg_chain = sgl_ptr;
/* Prepare chain element */ /* Prepare chain element */
sg_chain->NextChainOffset = 0; sg_chain->NextChainOffset = 0;
sg_chain->Flags = (IEEE_SGE_FLAGS_CHAIN_ELEMENT | if (instance->pdev->device ==
MPI2_IEEE_SGE_FLAGS_IOCPLBNTA_ADDR); PCI_DEVICE_ID_LSI_INVADER)
sg_chain->Flags = IEEE_SGE_FLAGS_CHAIN_ELEMENT;
else
sg_chain->Flags =
(IEEE_SGE_FLAGS_CHAIN_ELEMENT |
MPI2_IEEE_SGE_FLAGS_IOCPLBNTA_ADDR);
sg_chain->Length = (sizeof(union MPI2_SGE_IO_UNION) sg_chain->Length = (sizeof(union MPI2_SGE_IO_UNION)
*(sge_count - sg_processed)); *(sge_count - sg_processed));
sg_chain->Address = cmd->sg_frame_phys_addr; sg_chain->Address = cmd->sg_frame_phys_addr;
...@@ -1394,7 +1415,8 @@ megasas_build_ldio_fusion(struct megasas_instance *instance, ...@@ -1394,7 +1415,8 @@ megasas_build_ldio_fusion(struct megasas_instance *instance,
io_request->RaidContext.regLockFlags = 0; io_request->RaidContext.regLockFlags = 0;
fp_possible = 0; fp_possible = 0;
} else { } else {
if (MR_BuildRaidContext(&io_info, &io_request->RaidContext, if (MR_BuildRaidContext(instance, &io_info,
&io_request->RaidContext,
local_map_ptr)) local_map_ptr))
fp_possible = io_info.fpOkForIo; fp_possible = io_info.fpOkForIo;
} }
...@@ -1407,6 +1429,20 @@ megasas_build_ldio_fusion(struct megasas_instance *instance, ...@@ -1407,6 +1429,20 @@ megasas_build_ldio_fusion(struct megasas_instance *instance,
cmd->request_desc->SCSIIO.RequestFlags = cmd->request_desc->SCSIIO.RequestFlags =
(MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY (MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY
<< MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT); << MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
if (instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) {
if (io_request->RaidContext.regLockFlags ==
REGION_TYPE_UNUSED)
cmd->request_desc->SCSIIO.RequestFlags =
(MEGASAS_REQ_DESCRIPT_FLAGS_NO_LOCK <<
MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
io_request->RaidContext.Type = MPI2_TYPE_CUDA;
io_request->RaidContext.nseg = 0x1;
io_request->IoFlags |=
MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH;
io_request->RaidContext.regLockFlags |=
(MR_RL_FLAGS_GRANT_DESTINATION_CUDA |
MR_RL_FLAGS_SEQ_NUM_ENABLE);
}
if ((fusion->load_balance_info[device_id].loadBalanceFlag) && if ((fusion->load_balance_info[device_id].loadBalanceFlag) &&
(io_info.isRead)) { (io_info.isRead)) {
io_info.devHandle = io_info.devHandle =
...@@ -1421,11 +1457,23 @@ megasas_build_ldio_fusion(struct megasas_instance *instance, ...@@ -1421,11 +1457,23 @@ megasas_build_ldio_fusion(struct megasas_instance *instance,
} else { } else {
io_request->RaidContext.timeoutValue = io_request->RaidContext.timeoutValue =
local_map_ptr->raidMap.fpPdIoTimeoutSec; local_map_ptr->raidMap.fpPdIoTimeoutSec;
io_request->Function = MEGASAS_MPI2_FUNCTION_LD_IO_REQUEST;
io_request->DevHandle = device_id;
cmd->request_desc->SCSIIO.RequestFlags = cmd->request_desc->SCSIIO.RequestFlags =
(MEGASAS_REQ_DESCRIPT_FLAGS_LD_IO (MEGASAS_REQ_DESCRIPT_FLAGS_LD_IO
<< MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT); << MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
if (instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) {
if (io_request->RaidContext.regLockFlags ==
REGION_TYPE_UNUSED)
cmd->request_desc->SCSIIO.RequestFlags =
(MEGASAS_REQ_DESCRIPT_FLAGS_NO_LOCK <<
MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
io_request->RaidContext.Type = MPI2_TYPE_CUDA;
io_request->RaidContext.regLockFlags |=
(MR_RL_FLAGS_GRANT_DESTINATION_CPU0 |
MR_RL_FLAGS_SEQ_NUM_ENABLE);
io_request->RaidContext.nseg = 0x1;
}
io_request->Function = MEGASAS_MPI2_FUNCTION_LD_IO_REQUEST;
io_request->DevHandle = device_id;
} /* Not FP */ } /* Not FP */
} }
...@@ -1508,8 +1556,10 @@ megasas_build_io_fusion(struct megasas_instance *instance, ...@@ -1508,8 +1556,10 @@ megasas_build_io_fusion(struct megasas_instance *instance,
io_request->EEDPFlags = 0; io_request->EEDPFlags = 0;
io_request->Control = 0; io_request->Control = 0;
io_request->EEDPBlockSize = 0; io_request->EEDPBlockSize = 0;
io_request->IoFlags = 0; io_request->ChainOffset = 0;
io_request->RaidContext.RAIDFlags = 0; io_request->RaidContext.RAIDFlags = 0;
io_request->RaidContext.Type = 0;
io_request->RaidContext.nseg = 0;
memcpy(io_request->CDB.CDB32, scp->cmnd, scp->cmd_len); memcpy(io_request->CDB.CDB32, scp->cmnd, scp->cmd_len);
/* /*
...@@ -1863,6 +1913,14 @@ build_mpt_mfi_pass_thru(struct megasas_instance *instance, ...@@ -1863,6 +1913,14 @@ build_mpt_mfi_pass_thru(struct megasas_instance *instance,
fusion = instance->ctrl_context; fusion = instance->ctrl_context;
io_req = cmd->io_request; io_req = cmd->io_request;
if (instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) {
struct MPI25_IEEE_SGE_CHAIN64 *sgl_ptr_end =
(struct MPI25_IEEE_SGE_CHAIN64 *)&io_req->SGL;
sgl_ptr_end += fusion->max_sge_in_main_msg - 1;
sgl_ptr_end->Flags = 0;
}
mpi25_ieee_chain = mpi25_ieee_chain =
(struct MPI25_IEEE_SGE_CHAIN64 *)&io_req->SGL.IeeeChain; (struct MPI25_IEEE_SGE_CHAIN64 *)&io_req->SGL.IeeeChain;
......
...@@ -44,6 +44,14 @@ ...@@ -44,6 +44,14 @@
#define HOST_DIAG_RESET_ADAPTER 0x4 #define HOST_DIAG_RESET_ADAPTER 0x4
#define MEGASAS_FUSION_MAX_RESET_TRIES 3 #define MEGASAS_FUSION_MAX_RESET_TRIES 3
/* Invader defines */
#define MPI2_TYPE_CUDA 0x2
#define MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH 0x4000
#define MR_RL_FLAGS_GRANT_DESTINATION_CPU0 0x00
#define MR_RL_FLAGS_GRANT_DESTINATION_CPU1 0x10
#define MR_RL_FLAGS_GRANT_DESTINATION_CUDA 0x80
#define MR_RL_FLAGS_SEQ_NUM_ENABLE 0x8
/* T10 PI defines */ /* T10 PI defines */
#define MR_PROT_INFO_TYPE_CONTROLLER 0x8 #define MR_PROT_INFO_TYPE_CONTROLLER 0x8
#define MEGASAS_SCSI_VARIABLE_LENGTH_CMD 0x7f #define MEGASAS_SCSI_VARIABLE_LENGTH_CMD 0x7f
...@@ -70,7 +78,7 @@ enum MR_RAID_FLAGS_IO_SUB_TYPE { ...@@ -70,7 +78,7 @@ enum MR_RAID_FLAGS_IO_SUB_TYPE {
*/ */
#define MEGASAS_REQ_DESCRIPT_FLAGS_LD_IO 0x7 #define MEGASAS_REQ_DESCRIPT_FLAGS_LD_IO 0x7
#define MEGASAS_REQ_DESCRIPT_FLAGS_MFA 0x1 #define MEGASAS_REQ_DESCRIPT_FLAGS_MFA 0x1
#define MEGASAS_REQ_DESCRIPT_FLAGS_NO_LOCK 0x2
#define MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT 1 #define MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT 1
#define MEGASAS_FP_CMD_LEN 16 #define MEGASAS_FP_CMD_LEN 16
...@@ -82,7 +90,9 @@ enum MR_RAID_FLAGS_IO_SUB_TYPE { ...@@ -82,7 +90,9 @@ enum MR_RAID_FLAGS_IO_SUB_TYPE {
*/ */
struct RAID_CONTEXT { struct RAID_CONTEXT {
u16 resvd0; u8 Type:4;
u8 nseg:4;
u8 resvd0;
u16 timeoutValue; u16 timeoutValue;
u8 regLockFlags; u8 regLockFlags;
u8 resvd1; u8 resvd1;
...@@ -527,7 +537,7 @@ struct MR_LD_RAID { ...@@ -527,7 +537,7 @@ struct MR_LD_RAID {
u8 ldState; u8 ldState;
u8 regTypeReqOnWrite; u8 regTypeReqOnWrite;
u8 modFactor; u8 modFactor;
u8 reserved2[1]; u8 regTypeReqOnRead;
u16 seqNum; u16 seqNum;
struct { struct {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册