diff options
-rw-r--r-- | drivers/scsi/megaraid/megaraid_sas_base.c | 24 | ||||
-rw-r--r-- | drivers/scsi/megaraid/megaraid_sas_fp.c | 14 | ||||
-rw-r--r-- | drivers/scsi/megaraid/megaraid_sas_fusion.c | 7 | ||||
-rw-r--r-- | drivers/scsi/megaraid/megaraid_sas_fusion.h | 9 |
4 files changed, 24 insertions, 30 deletions
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c index ff283d23788a..401ed67cf4c1 100644 --- a/drivers/scsi/megaraid/megaraid_sas_base.c +++ b/drivers/scsi/megaraid/megaraid_sas_base.c | |||
@@ -3547,7 +3547,6 @@ static int megasas_create_frame_pool(struct megasas_instance *instance) | |||
3547 | int i; | 3547 | int i; |
3548 | u32 max_cmd; | 3548 | u32 max_cmd; |
3549 | u32 sge_sz; | 3549 | u32 sge_sz; |
3550 | u32 sgl_sz; | ||
3551 | u32 total_sz; | 3550 | u32 total_sz; |
3552 | u32 frame_count; | 3551 | u32 frame_count; |
3553 | struct megasas_cmd *cmd; | 3552 | struct megasas_cmd *cmd; |
@@ -3566,24 +3565,23 @@ static int megasas_create_frame_pool(struct megasas_instance *instance) | |||
3566 | } | 3565 | } |
3567 | 3566 | ||
3568 | /* | 3567 | /* |
3569 | * Calculated the number of 64byte frames required for SGL | 3568 | * For MFI controllers. |
3570 | */ | 3569 | * max_num_sge = 60 |
3571 | sgl_sz = sge_sz * instance->max_num_sge; | 3570 | * max_sge_sz = 16 byte (sizeof megasas_sge_skinny) |
3572 | frame_count = (sgl_sz + MEGAMFI_FRAME_SIZE - 1) / MEGAMFI_FRAME_SIZE; | 3571 | * Total 960 byte (15 MFI frame of 64 byte) |
3573 | frame_count = 15; | 3572 | * |
3574 | 3573 | * Fusion adapter require only 3 extra frame. | |
3575 | /* | 3574 | * max_num_sge = 16 (defined as MAX_IOCTL_SGE) |
3576 | * We need one extra frame for the MFI command | 3575 | * max_sge_sz = 12 byte (sizeof megasas_sge64) |
3576 | * Total 192 byte (3 MFI frame of 64 byte) | ||
3577 | */ | 3577 | */ |
3578 | frame_count++; | 3578 | frame_count = instance->ctrl_context ? (3 + 1) : (15 + 1); |
3579 | |||
3580 | total_sz = MEGAMFI_FRAME_SIZE * frame_count; | 3579 | total_sz = MEGAMFI_FRAME_SIZE * frame_count; |
3581 | /* | 3580 | /* |
3582 | * Use DMA pool facility provided by PCI layer | 3581 | * Use DMA pool facility provided by PCI layer |
3583 | */ | 3582 | */ |
3584 | instance->frame_dma_pool = pci_pool_create("megasas frame pool", | 3583 | instance->frame_dma_pool = pci_pool_create("megasas frame pool", |
3585 | instance->pdev, total_sz, 64, | 3584 | instance->pdev, total_sz, 256, 0); |
3586 | 0); | ||
3587 | 3585 | ||
3588 | if (!instance->frame_dma_pool) { | 3586 | if (!instance->frame_dma_pool) { |
3589 | printk(KERN_DEBUG "megasas: failed to setup frame pool\n"); | 3587 | printk(KERN_DEBUG "megasas: failed to setup frame pool\n"); |
diff --git a/drivers/scsi/megaraid/megaraid_sas_fp.c b/drivers/scsi/megaraid/megaraid_sas_fp.c index 460c6a3d4ade..7cae1c25c9a9 100644 --- a/drivers/scsi/megaraid/megaraid_sas_fp.c +++ b/drivers/scsi/megaraid/megaraid_sas_fp.c | |||
@@ -172,6 +172,7 @@ void MR_PopulateDrvRaidMap(struct megasas_instance *instance) | |||
172 | struct MR_FW_RAID_MAP_ALL *fw_map_old = NULL; | 172 | struct MR_FW_RAID_MAP_ALL *fw_map_old = NULL; |
173 | struct MR_FW_RAID_MAP *pFwRaidMap = NULL; | 173 | struct MR_FW_RAID_MAP *pFwRaidMap = NULL; |
174 | int i; | 174 | int i; |
175 | u16 ld_count; | ||
175 | 176 | ||
176 | 177 | ||
177 | struct MR_DRV_RAID_MAP_ALL *drv_map = | 178 | struct MR_DRV_RAID_MAP_ALL *drv_map = |
@@ -191,9 +192,10 @@ void MR_PopulateDrvRaidMap(struct megasas_instance *instance) | |||
191 | fw_map_old = (struct MR_FW_RAID_MAP_ALL *) | 192 | fw_map_old = (struct MR_FW_RAID_MAP_ALL *) |
192 | fusion->ld_map[(instance->map_id & 1)]; | 193 | fusion->ld_map[(instance->map_id & 1)]; |
193 | pFwRaidMap = &fw_map_old->raidMap; | 194 | pFwRaidMap = &fw_map_old->raidMap; |
195 | ld_count = (u16)le32_to_cpu(pFwRaidMap->ldCount); | ||
194 | 196 | ||
195 | #if VD_EXT_DEBUG | 197 | #if VD_EXT_DEBUG |
196 | for (i = 0; i < le16_to_cpu(pFwRaidMap->ldCount); i++) { | 198 | for (i = 0; i < ld_count; i++) { |
197 | dev_dbg(&instance->pdev->dev, "(%d) :Index 0x%x " | 199 | dev_dbg(&instance->pdev->dev, "(%d) :Index 0x%x " |
198 | "Target Id 0x%x Seq Num 0x%x Size 0/%llx\n", | 200 | "Target Id 0x%x Seq Num 0x%x Size 0/%llx\n", |
199 | instance->unique_id, i, | 201 | instance->unique_id, i, |
@@ -205,12 +207,12 @@ void MR_PopulateDrvRaidMap(struct megasas_instance *instance) | |||
205 | 207 | ||
206 | memset(drv_map, 0, fusion->drv_map_sz); | 208 | memset(drv_map, 0, fusion->drv_map_sz); |
207 | pDrvRaidMap->totalSize = pFwRaidMap->totalSize; | 209 | pDrvRaidMap->totalSize = pFwRaidMap->totalSize; |
208 | pDrvRaidMap->ldCount = (__le16)pFwRaidMap->ldCount; | 210 | pDrvRaidMap->ldCount = (__le16)cpu_to_le16(ld_count); |
209 | pDrvRaidMap->fpPdIoTimeoutSec = pFwRaidMap->fpPdIoTimeoutSec; | 211 | pDrvRaidMap->fpPdIoTimeoutSec = pFwRaidMap->fpPdIoTimeoutSec; |
210 | for (i = 0; i < MAX_RAIDMAP_LOGICAL_DRIVES + MAX_RAIDMAP_VIEWS; i++) | 212 | for (i = 0; i < MAX_RAIDMAP_LOGICAL_DRIVES + MAX_RAIDMAP_VIEWS; i++) |
211 | pDrvRaidMap->ldTgtIdToLd[i] = | 213 | pDrvRaidMap->ldTgtIdToLd[i] = |
212 | (u8)pFwRaidMap->ldTgtIdToLd[i]; | 214 | (u8)pFwRaidMap->ldTgtIdToLd[i]; |
213 | for (i = 0; i < le16_to_cpu(pDrvRaidMap->ldCount); i++) { | 215 | for (i = 0; i < ld_count; i++) { |
214 | pDrvRaidMap->ldSpanMap[i] = pFwRaidMap->ldSpanMap[i]; | 216 | pDrvRaidMap->ldSpanMap[i] = pFwRaidMap->ldSpanMap[i]; |
215 | #if VD_EXT_DEBUG | 217 | #if VD_EXT_DEBUG |
216 | dev_dbg(&instance->pdev->dev, | 218 | dev_dbg(&instance->pdev->dev, |
@@ -252,7 +254,7 @@ u8 MR_ValidateMapInfo(struct megasas_instance *instance) | |||
252 | struct LD_LOAD_BALANCE_INFO *lbInfo; | 254 | struct LD_LOAD_BALANCE_INFO *lbInfo; |
253 | PLD_SPAN_INFO ldSpanInfo; | 255 | PLD_SPAN_INFO ldSpanInfo; |
254 | struct MR_LD_RAID *raid; | 256 | struct MR_LD_RAID *raid; |
255 | int ldCount, num_lds; | 257 | u16 ldCount, num_lds; |
256 | u16 ld; | 258 | u16 ld; |
257 | u32 expected_size; | 259 | u32 expected_size; |
258 | 260 | ||
@@ -356,7 +358,7 @@ static int getSpanInfo(struct MR_DRV_RAID_MAP_ALL *map, | |||
356 | 358 | ||
357 | for (ldCount = 0; ldCount < MAX_LOGICAL_DRIVES_EXT; ldCount++) { | 359 | for (ldCount = 0; ldCount < MAX_LOGICAL_DRIVES_EXT; ldCount++) { |
358 | ld = MR_TargetIdToLdGet(ldCount, map); | 360 | ld = MR_TargetIdToLdGet(ldCount, map); |
359 | if (ld >= MAX_LOGICAL_DRIVES_EXT) | 361 | if (ld >= (MAX_LOGICAL_DRIVES_EXT - 1)) |
360 | continue; | 362 | continue; |
361 | raid = MR_LdRaidGet(ld, map); | 363 | raid = MR_LdRaidGet(ld, map); |
362 | dev_dbg(&instance->pdev->dev, "LD %x: span_depth=%x\n", | 364 | dev_dbg(&instance->pdev->dev, "LD %x: span_depth=%x\n", |
@@ -1157,7 +1159,7 @@ void mr_update_span_set(struct MR_DRV_RAID_MAP_ALL *map, | |||
1157 | 1159 | ||
1158 | for (ldCount = 0; ldCount < MAX_LOGICAL_DRIVES_EXT; ldCount++) { | 1160 | for (ldCount = 0; ldCount < MAX_LOGICAL_DRIVES_EXT; ldCount++) { |
1159 | ld = MR_TargetIdToLdGet(ldCount, map); | 1161 | ld = MR_TargetIdToLdGet(ldCount, map); |
1160 | if (ld >= MAX_LOGICAL_DRIVES_EXT) | 1162 | if (ld >= (MAX_LOGICAL_DRIVES_EXT - 1)) |
1161 | continue; | 1163 | continue; |
1162 | raid = MR_LdRaidGet(ld, map); | 1164 | raid = MR_LdRaidGet(ld, map); |
1163 | for (element = 0; element < MAX_QUAD_DEPTH; element++) { | 1165 | for (element = 0; element < MAX_QUAD_DEPTH; element++) { |
diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c b/drivers/scsi/megaraid/megaraid_sas_fusion.c index 71557f64bb5e..b5362c196000 100644 --- a/drivers/scsi/megaraid/megaraid_sas_fusion.c +++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c | |||
@@ -698,12 +698,11 @@ megasas_ioc_init_fusion(struct megasas_instance *instance) | |||
698 | cpu_to_le32(lower_32_bits(ioc_init_handle)); | 698 | cpu_to_le32(lower_32_bits(ioc_init_handle)); |
699 | init_frame->data_xfer_len = cpu_to_le32(sizeof(struct MPI2_IOC_INIT_REQUEST)); | 699 | init_frame->data_xfer_len = cpu_to_le32(sizeof(struct MPI2_IOC_INIT_REQUEST)); |
700 | 700 | ||
701 | req_desc.Words = 0; | 701 | req_desc.u.low = cpu_to_le32(lower_32_bits(cmd->frame_phys_addr)); |
702 | req_desc.u.high = cpu_to_le32(upper_32_bits(cmd->frame_phys_addr)); | ||
702 | req_desc.MFAIo.RequestFlags = | 703 | req_desc.MFAIo.RequestFlags = |
703 | (MEGASAS_REQ_DESCRIPT_FLAGS_MFA << | 704 | (MEGASAS_REQ_DESCRIPT_FLAGS_MFA << |
704 | MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT); | 705 | MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT); |
705 | cpu_to_le32s((u32 *)&req_desc.MFAIo); | ||
706 | req_desc.Words |= cpu_to_le64(cmd->frame_phys_addr); | ||
707 | 706 | ||
708 | /* | 707 | /* |
709 | * disable the intr before firing the init frame | 708 | * disable the intr before firing the init frame |
diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.h b/drivers/scsi/megaraid/megaraid_sas_fusion.h index 5ab7daee11be..56e6db2d5874 100644 --- a/drivers/scsi/megaraid/megaraid_sas_fusion.h +++ b/drivers/scsi/megaraid/megaraid_sas_fusion.h | |||
@@ -306,14 +306,9 @@ struct MPI2_RAID_SCSI_IO_REQUEST { | |||
306 | * MPT RAID MFA IO Descriptor. | 306 | * MPT RAID MFA IO Descriptor. |
307 | */ | 307 | */ |
308 | struct MEGASAS_RAID_MFA_IO_REQUEST_DESCRIPTOR { | 308 | struct MEGASAS_RAID_MFA_IO_REQUEST_DESCRIPTOR { |
309 | #if defined(__BIG_ENDIAN_BITFIELD) | ||
310 | u32 MessageAddress1:24; /* bits 31:8*/ | ||
311 | u32 RequestFlags:8; | ||
312 | #else | ||
313 | u32 RequestFlags:8; | 309 | u32 RequestFlags:8; |
314 | u32 MessageAddress1:24; /* bits 31:8*/ | 310 | u32 MessageAddress1:24; |
315 | #endif | 311 | u32 MessageAddress2; |
316 | u32 MessageAddress2; /* bits 61:32 */ | ||
317 | }; | 312 | }; |
318 | 313 | ||
319 | /* Default Request Descriptor */ | 314 | /* Default Request Descriptor */ |