Print this page
5719 Add support for LSI Fury adapters

*** 15,24 **** --- 15,25 ---- * Shakeel Bukhari */ /* * Copyright 2013 Nexenta Systems, Inc. All rights reserved. + * Copyright 2015 Garrett D'Amore <garrett@damore.org> */ #include <sys/types.h> #include <sys/file.h>
*** 1229,1238 **** --- 1230,1240 ---- uint32_t numElements, endElement; Mpi25IeeeSgeChain64_t *ieeeChainElement = NULL; Mpi25IeeeSgeChain64_t *scsi_raid_io_sgl_ieee = NULL; ddi_acc_handle_t acc_handle = instance->mpi2_frame_pool_dma_obj.acc_handle; + uint16_t devid = instance->device_id; con_log(CL_ANN1, (CE_NOTE, "chkpnt: Building Chained SGL :%d", __LINE__)); /* Calulate SGE size in number of Words(32bit) */
*** 1272,1282 **** /* prepare the scatter-gather list for the firmware */ scsi_raid_io_sgl_ieee = (Mpi25IeeeSgeChain64_t *)&scsi_raid_io->SGL.IeeeChain; ! if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) { Mpi25IeeeSgeChain64_t *sgl_ptr_end = scsi_raid_io_sgl_ieee; sgl_ptr_end += instance->max_sge_in_main_msg - 1; ddi_put8(acc_handle, &sgl_ptr_end->Flags, 0); } --- 1274,1285 ---- /* prepare the scatter-gather list for the firmware */ scsi_raid_io_sgl_ieee = (Mpi25IeeeSgeChain64_t *)&scsi_raid_io->SGL.IeeeChain; ! if ((devid == PCI_DEVICE_ID_LSI_INVADER) || ! (devid == PCI_DEVICE_ID_LSI_FURY)) { Mpi25IeeeSgeChain64_t *sgl_ptr_end = scsi_raid_io_sgl_ieee; sgl_ptr_end += instance->max_sge_in_main_msg - 1; ddi_put8(acc_handle, &sgl_ptr_end->Flags, 0); }
*** 1288,1298 **** ddi_put32(acc_handle, &scsi_raid_io_sgl_ieee->Length, acmd->cmd_dmacookies[i].dmac_size); ddi_put8(acc_handle, &scsi_raid_io_sgl_ieee->Flags, 0); ! if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) { if (i == (numElements - 1)) { ddi_put8(acc_handle, &scsi_raid_io_sgl_ieee->Flags, IEEE_SGE_FLAGS_END_OF_LIST); } --- 1291,1302 ---- ddi_put32(acc_handle, &scsi_raid_io_sgl_ieee->Length, acmd->cmd_dmacookies[i].dmac_size); ddi_put8(acc_handle, &scsi_raid_io_sgl_ieee->Flags, 0); ! if ((devid == PCI_DEVICE_ID_LSI_INVADER) || ! (devid == PCI_DEVICE_ID_LSI_FURY)) { if (i == (numElements - 1)) { ddi_put8(acc_handle, &scsi_raid_io_sgl_ieee->Flags, IEEE_SGE_FLAGS_END_OF_LIST); }
*** 1316,1326 **** /* check if chained SGL required */ if (i < numElements) { con_log(CL_ANN1, (CE_NOTE, "[Chain Element index]:%x", i)); ! if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) { uint16_t ioFlags = ddi_get16(acc_handle, &scsi_raid_io->IoFlags); if ((ioFlags & MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH) != --- 1320,1331 ---- /* check if chained SGL required */ if (i < numElements) { con_log(CL_ANN1, (CE_NOTE, "[Chain Element index]:%x", i)); ! if ((devid == PCI_DEVICE_ID_LSI_INVADER) || ! (devid == PCI_DEVICE_ID_LSI_FURY)) { uint16_t ioFlags = ddi_get16(acc_handle, &scsi_raid_io->IoFlags); if ((ioFlags & MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH) !=
*** 1339,1349 **** /* prepare physical chain element */ ieeeChainElement = scsi_raid_io_sgl_ieee; ddi_put8(acc_handle, &ieeeChainElement->NextChainOffset, 0); ! if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) { ddi_put8(acc_handle, &ieeeChainElement->Flags, IEEE_SGE_FLAGS_CHAIN_ELEMENT); } else { ddi_put8(acc_handle, &ieeeChainElement->Flags, (IEEE_SGE_FLAGS_CHAIN_ELEMENT | --- 1344,1355 ---- /* prepare physical chain element */ ieeeChainElement = scsi_raid_io_sgl_ieee; ddi_put8(acc_handle, &ieeeChainElement->NextChainOffset, 0); ! if ((devid == PCI_DEVICE_ID_LSI_INVADER) || ! (devid == PCI_DEVICE_ID_LSI_FURY)) { ddi_put8(acc_handle, &ieeeChainElement->Flags, IEEE_SGE_FLAGS_CHAIN_ELEMENT); } else { ddi_put8(acc_handle, &ieeeChainElement->Flags, (IEEE_SGE_FLAGS_CHAIN_ELEMENT |
*** 1374,1384 **** ddi_put32(acc_handle, &scsi_raid_io_sgl_ieee->Length, acmd->cmd_dmacookies[i].dmac_size); ddi_put8(acc_handle, &scsi_raid_io_sgl_ieee->Flags, 0); ! if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) { if (i == (numElements - 1)) { ddi_put8(acc_handle, &scsi_raid_io_sgl_ieee->Flags, IEEE_SGE_FLAGS_END_OF_LIST); } --- 1380,1391 ---- ddi_put32(acc_handle, &scsi_raid_io_sgl_ieee->Length, acmd->cmd_dmacookies[i].dmac_size); ddi_put8(acc_handle, &scsi_raid_io_sgl_ieee->Flags, 0); ! if ((devid == PCI_DEVICE_ID_LSI_INVADER) || ! (devid == PCI_DEVICE_ID_LSI_FURY)) { if (i == (numElements - 1)) { ddi_put8(acc_handle, &scsi_raid_io_sgl_ieee->Flags, IEEE_SGE_FLAGS_END_OF_LIST); }
*** 1414,1423 **** --- 1421,1431 ---- uint8_t fp_possible = 0; uint32_t index; uint32_t lba_count = 0; uint32_t start_lba_hi = 0; uint32_t start_lba_lo = 0; + uint16_t devid = instance->device_id; ddi_acc_handle_t acc_handle = instance->mpi2_frame_pool_dma_obj.acc_handle; struct mrsas_cmd *cmd = NULL; struct scsa_cmd *acmd = PKT2CMD(pkt); MRSAS_REQUEST_DESCRIPTOR_UNION *ReqDescUnion;
*** 1639,1649 **** ReqDescUnion->SCSIIO.RequestFlags = (MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY << MPI2_REQ_DESCRIPT_FLAGS_TYPE_SHIFT); ! if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) { uint8_t regLockFlags = ddi_get8(acc_handle, &scsi_raid_io->RaidContext.regLockFlags); uint16_t IoFlags = ddi_get16(acc_handle, &scsi_raid_io->IoFlags); --- 1647,1658 ---- ReqDescUnion->SCSIIO.RequestFlags = (MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY << MPI2_REQ_DESCRIPT_FLAGS_TYPE_SHIFT); ! if ((devid == PCI_DEVICE_ID_LSI_INVADER) || ! (devid == PCI_DEVICE_ID_LSI_FURY)) { uint8_t regLockFlags = ddi_get8(acc_handle, &scsi_raid_io->RaidContext.regLockFlags); uint16_t IoFlags = ddi_get16(acc_handle, &scsi_raid_io->IoFlags);
*** 1702,1712 **** ddi_put16(acc_handle, &scsi_raid_io->RaidContext.timeoutValue, local_map_ptr->raidMap.fpPdIoTimeoutSec); ! if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) { uint8_t regLockFlags = ddi_get8(acc_handle, &scsi_raid_io->RaidContext.regLockFlags); if (regLockFlags == REGION_TYPE_UNUSED) { ReqDescUnion->SCSIIO.RequestFlags = --- 1711,1722 ---- ddi_put16(acc_handle, &scsi_raid_io->RaidContext.timeoutValue, local_map_ptr->raidMap.fpPdIoTimeoutSec); ! if ((devid == PCI_DEVICE_ID_LSI_INVADER) || ! (devid == PCI_DEVICE_ID_LSI_FURY)) { uint8_t regLockFlags = ddi_get8(acc_handle, &scsi_raid_io->RaidContext.regLockFlags); if (regLockFlags == REGION_TYPE_UNUSED) { ReqDescUnion->SCSIIO.RequestFlags =
*** 2253,2263 **** cmd->request_desc = ReqDescUnion; /* get raid message frame pointer */ scsi_raid_io = (Mpi2RaidSCSIIORequest_t *)cmd->scsi_io_request; ! if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) { Mpi25IeeeSgeChain64_t *sgl_ptr_end = (Mpi25IeeeSgeChain64_t *) &scsi_raid_io->SGL.IeeeChain; sgl_ptr_end += instance->max_sge_in_main_msg - 1; ddi_put8(acc_handle, &sgl_ptr_end->Flags, 0); } --- 2263,2274 ---- cmd->request_desc = ReqDescUnion; /* get raid message frame pointer */ scsi_raid_io = (Mpi2RaidSCSIIORequest_t *)cmd->scsi_io_request; ! if ((instance->device_id == PCI_DEVICE_ID_LSI_INVADER) || ! (instance->device_id == PCI_DEVICE_ID_LSI_FURY)) { Mpi25IeeeSgeChain64_t *sgl_ptr_end = (Mpi25IeeeSgeChain64_t *) &scsi_raid_io->SGL.IeeeChain; sgl_ptr_end += instance->max_sge_in_main_msg - 1; ddi_put8(acc_handle, &sgl_ptr_end->Flags, 0); }