void LBAOutOfRangeBare_r12::RunCoreTest() { /** \verbatim * Assumptions: * 1) Test CreateResources_r10b has run prior. * \endverbatim */ uint64_t nsze; char work[256]; ConstSharedIdentifyPtr namSpcPtr; // Lookup objs which were created in a prior test within group SharedIOSQPtr iosq = CAST_TO_IOSQ(gRsrcMngr->GetObj(IOSQ_GROUP_ID)); SharedIOCQPtr iocq = CAST_TO_IOCQ(gRsrcMngr->GetObj(IOCQ_GROUP_ID)); vector<uint32_t> bare = gInformative->GetBareNamespaces(); for (size_t i = 0; i < bare.size(); i++) { namSpcPtr = gInformative->GetIdentifyCmdNamspc(bare[i]); if (namSpcPtr->isZeroFilled()) { LOG_NRM("Namespace %lu is inactive", i); } else { nsze = namSpcPtr->GetValue(IDNAMESPC_NSZE); LOG_NRM("Create memory to contain write payload"); SharedMemBufferPtr writeMem = SharedMemBufferPtr(new MemBuffer()); uint64_t lbaDataSize = namSpcPtr->GetLBADataSize(); writeMem->Init(WR_NUM_BLKS * lbaDataSize); LOG_NRM("Create a write cmd to write data to namspc %d", bare[i]); SharedWritePtr writeCmd = SharedWritePtr(new Write()); send_64b_bitmask prpBitmask = (send_64b_bitmask)(MASK_PRP1_PAGE | MASK_PRP2_PAGE | MASK_PRP2_LIST); writeCmd->SetPrpBuffer(prpBitmask, writeMem); writeCmd->SetNSID(bare[i]); writeCmd->SetNLB(WR_NUM_BLKS - 1); // convert to 0-based value LOG_NRM( "Issue cmd where 1st block starts at LBA (Identify.NSZE-2)"); snprintf(work, sizeof(work), "nsze-2.%01d", (uint32_t)i); writeCmd->SetSLBA(nsze - 2); IO::SendAndReapCmd(mGrpName, mTestName, CALC_TIMEOUT_ms(1), iosq, iocq, writeCmd, work, true); LOG_NRM( "Issue cmd where 1st block starts at LBA (Identify.NSZE-1)"); snprintf(work, sizeof(work), "nsze-1.%d01d", (uint32_t)i); writeCmd->SetSLBA(nsze - 1); SendCmdToHdw(iosq, iocq, writeCmd, work); LOG_NRM("Issue cmd where 1st block starts at LBA (Identify.NSZE)"); snprintf(work, sizeof(work), "nsze.%01d", (uint32_t)i); writeCmd->SetSLBA(nsze); SendCmdToHdw(iosq, iocq, writeCmd, work); } } }
void WriteDataPat_r10b::WriteDataPattern() { uint64_t regVal; LOG_NRM("Calc buffer size to write %d logical blks to media", WRITE_DATA_PAT_NUM_BLKS); ConstSharedIdentifyPtr namSpcPtr = gInformative->GetIdentifyCmdNamspc(1); if (namSpcPtr == Identify::NullIdentifyPtr) { LOG_ERR("Namespace #1 must exist"); throw exception(); } uint64_t lbaDataSize = namSpcPtr->GetLBADataSize(); LOG_NRM("Create data pattern to write to media"); SharedMemBufferPtr dataPat = SharedMemBufferPtr(new MemBuffer()); dataPat->Init(WRITE_DATA_PAT_NUM_BLKS * lbaDataSize); dataPat->SetDataPattern(MemBuffer::DATAPAT_INC_16BIT); dataPat->Dump(FileSystem::PrepLogFile(mGrpName, mTestName, "DataPat"), "Write buffer's data pattern"); LOG_NRM("Create a generic write cmd to send data pattern to namspc 1"); SharedWritePtr writeCmd = SharedWritePtr(new Write(mFd)); send_64b_bitmask prpBitmask = (send_64b_bitmask) (MASK_PRP1_PAGE | MASK_PRP2_PAGE | MASK_PRP2_LIST); writeCmd->SetPrpBuffer(prpBitmask, dataPat); writeCmd->SetNSID(1); writeCmd->SetNLB(WRITE_DATA_PAT_NUM_BLKS-1); // convert to 0-based value // Lookup objs which were created in a prior test within group SharedIOSQPtr iosqContig = CAST_TO_IOSQ( gRsrcMngr->GetObj(IOSQ_CONTIG_GROUP_ID)) SharedIOCQPtr iocqContig = CAST_TO_IOCQ( gRsrcMngr->GetObj(IOCQ_CONTIG_GROUP_ID)) SharedIOSQPtr iosqDiscontig = CAST_TO_IOSQ( gRsrcMngr->GetObj(IOSQ_DISCONTIG_GROUP_ID)) SharedIOCQPtr iocqDiscontig = CAST_TO_IOCQ( gRsrcMngr->GetObj(IOCQ_DISCONTIG_GROUP_ID)) LOG_NRM("Send the cmd to hdw via the contiguous IOQ's"); SendToIOSQ(iosqContig, iocqContig, writeCmd, "contig"); // To run the discontig part of this test, the hdw must support that feature if (gRegisters->Read(CTLSPC_CAP, regVal) == false) { LOG_ERR("Unable to determine Q memory requirements"); throw exception(); } else if (regVal & CAP_CQR) { LOG_NRM("Unable to utilize discontig Q's, DUT requires contig"); return; } LOG_NRM("Send the cmd to hdw via the discontiguous IOQ's"); SendToIOSQ(iosqDiscontig, iocqDiscontig, writeCmd, "discontig"); }
bool LBAOutOfRangeBare_r10b::RunCoreTest() { /** \verbatim * Assumptions: * 1) Test CreateResources_r10b has run prior. * \endverbatim */ uint64_t nsze; ConstSharedIdentifyPtr namSpcPtr; // Lookup objs which were created in a prior test within group SharedIOSQPtr iosqContig = CAST_TO_IOSQ( gRsrcMngr->GetObj(IOSQ_CONTIG_GROUP_ID)) SharedIOCQPtr iocqContig = CAST_TO_IOCQ( gRsrcMngr->GetObj(IOCQ_CONTIG_GROUP_ID)) vector<uint32_t> bare = gInformative->GetBareNamespaces(); for (size_t i = 1; i < bare.size(); i++) { namSpcPtr = gInformative->GetIdentifyCmdNamspc(i); if (namSpcPtr == Identify::NullIdentifyPtr) { LOG_ERR("Identify namspc struct #%d doesn't exist", bare[i]); throw exception(); } nsze = namSpcPtr->GetValue(IDNAMESPC_NSZE); LOG_NRM("Create memory to contain read payload"); SharedMemBufferPtr readMem = SharedMemBufferPtr(new MemBuffer()); uint64_t lbaDataSize = namSpcPtr->GetLBADataSize(); readMem->Init(RD_NUM_BLKS * lbaDataSize); LOG_NRM("Create a read cmd to read data from namspc %d", bare[i]); SharedReadPtr readCmd = SharedReadPtr(new Read(mFd)); send_64b_bitmask prpBitmask = (send_64b_bitmask) (MASK_PRP1_PAGE | MASK_PRP2_PAGE | MASK_PRP2_LIST); readCmd->SetPrpBuffer(prpBitmask, readMem); readCmd->SetNSID(bare[i]); readCmd->SetNLB(RD_NUM_BLKS - 1); // convert to 0-based value LOG_NRM("Issue cmd where 1st block starts at LBA (Identify.NSZE-2)"); readCmd->SetSLBA(nsze - 2); IO::SendCmdToHdw(mGrpName, mTestName, DEFAULT_CMD_WAIT_ms, iosqContig, iocqContig, readCmd, "nsze-2", true); LOG_NRM("Issue cmd where 1st block starts at LBA (Identify.NSZE-1)"); readCmd->SetSLBA(nsze - 1); SendCmdToHdw(iosqContig, iocqContig, readCmd, "nsze-1"); LOG_NRM("Issue cmd where 1st block starts at LBA (Identify.NSZE)"); readCmd->SetSLBA(nsze); SendCmdToHdw(iosqContig, iocqContig, readCmd, "nsze"); } return true; }
void ProtInfoIgnoreBare_r10b::RunCoreTest() { /** \verbatim * Assumptions: * None. * \endverbatim */ char context[256]; ConstSharedIdentifyPtr namSpcPtr; // Lookup objs which were created in a prior test within group SharedIOSQPtr iosq = CAST_TO_IOSQ(gRsrcMngr->GetObj(IOSQ_GROUP_ID)); SharedIOCQPtr iocq = CAST_TO_IOCQ(gRsrcMngr->GetObj(IOCQ_GROUP_ID)); vector<uint32_t> bare = gInformative->GetBareNamespaces(); for (size_t i = 0; i < bare.size(); i++) { namSpcPtr = gInformative->GetIdentifyCmdNamspc(bare[i]); if (namSpcPtr == Identify::NullIdentifyPtr) { throw FrmwkEx(HERE, "Identify namspc struct #%d doesn't exist", bare[i]); } LOG_NRM("Create memory to contain write payload"); SharedMemBufferPtr writeMem = SharedMemBufferPtr(new MemBuffer()); uint64_t lbaDataSize = namSpcPtr->GetLBADataSize(); writeMem->Init(lbaDataSize); LOG_NRM("Create a write cmd to read data from namspc %d", bare[i]); SharedWritePtr writeCmd = SharedWritePtr(new Write()); send_64b_bitmask prpBitmask = (send_64b_bitmask) (MASK_PRP1_PAGE | MASK_PRP2_PAGE | MASK_PRP2_LIST); writeCmd->SetPrpBuffer(prpBitmask, writeMem); writeCmd->SetNSID(bare[i]); writeCmd->SetNLB(0); // convert to 0-based value for (uint16_t protInfo = 0; protInfo <= 0x0f; protInfo++) { uint8_t work = writeCmd->GetByte(12, 3); work &= ~0x3c; // PRINFO specific bits work |= (protInfo << 2); writeCmd->SetByte(work, 12, 3); snprintf(context, sizeof(context), "ns%d.protInfo0x%02X", (uint32_t)i, protInfo); IO::SendAndReapCmd(mGrpName, mTestName, DEFAULT_CMD_WAIT_ms, iosq, iocq, writeCmd, context, true); } } }
void ProtInfoIgnoreBare_r12::RunCoreTest() { /** \verbatim * Assumptions: * 1) Test CreateResources_r10b has run prior. * \endverbatim */ char context[256]; ConstSharedIdentifyPtr namSpcPtr; // Lookup objs which were created in a prior test within group SharedIOSQPtr iosq = CAST_TO_IOSQ(gRsrcMngr->GetObj(IOSQ_GROUP_ID)); SharedIOCQPtr iocq = CAST_TO_IOCQ(gRsrcMngr->GetObj(IOCQ_GROUP_ID)); vector<uint32_t> bare = gInformative->GetBareNamespaces(); for (size_t i = 0; i < bare.size(); i++) { namSpcPtr = gInformative->GetIdentifyCmdNamspc(bare[i]); if (namSpcPtr->isZeroFilled()) { LOG_NRM("Namespace %lu is inactive", i); } else { LOG_NRM("Create memory to contain read payload"); SharedMemBufferPtr readMem = SharedMemBufferPtr(new MemBuffer()); uint64_t lbaDataSize = namSpcPtr->GetLBADataSize(); readMem->Init(lbaDataSize); LOG_NRM("Create a read cmd to read data from namspc %d", bare[i]); SharedReadPtr readCmd = SharedReadPtr(new Read()); send_64b_bitmask prpBitmask = (send_64b_bitmask) (MASK_PRP1_PAGE | MASK_PRP2_PAGE | MASK_PRP2_LIST); readCmd->SetPrpBuffer(prpBitmask, readMem); readCmd->SetNSID(bare[i]); readCmd->SetNLB(0); // convert to 0-based value for (uint16_t protInfo = 0; protInfo <= 0x0f; protInfo++) { uint8_t work = readCmd->GetByte(12, 3); work &= ~0x3c; // PRINFO specific bits work |= (protInfo << 2); readCmd->SetByte(work, 12, 3); snprintf(context, sizeof(context), "ns%d.protInfo0x%02X", (uint32_t)i, protInfo); IO::SendAndReapCmd(mGrpName, mTestName, CALC_TIMEOUT_ms(1), iosq, iocq, readCmd, context, true); } } } }
void IgnoreMetaPtrBare_r10b::RunCoreTest() { /** \verbatim * Assumptions: * 1) Test CreateResources_r10b has run prior. * \endverbatim */ string work; ConstSharedIdentifyPtr namSpcPtr; LOG_NRM("Lookup objs which were created in a prior test within group"); SharedIOSQPtr iosq = CAST_TO_IOSQ(gRsrcMngr->GetObj(IOSQ_GROUP_ID)); SharedIOCQPtr iocq = CAST_TO_IOCQ(gRsrcMngr->GetObj(IOCQ_GROUP_ID)); LOG_NRM("For all bare namspc's issue cmd with non-zero meta ptr"); vector<uint32_t> bare = gInformative->GetBareNamespaces(); for (size_t i = 0; i < bare.size(); i++) { namSpcPtr = gInformative->GetIdentifyCmdNamspc(bare[i]); if (namSpcPtr == Identify::NullIdentifyPtr) { throw FrmwkEx(HERE, "Identify namspc struct #%d doesn't exist", bare[i]); } LOG_NRM("Setup write cmd's values that won't change per namspc"); SharedMemBufferPtr writeMem = SharedMemBufferPtr(new MemBuffer()); uint64_t lbaDataSize = namSpcPtr->GetLBADataSize(); writeMem->Init(lbaDataSize); SharedWritePtr writeCmd = SharedWritePtr(new Write()); send_64b_bitmask prpBitmask = (send_64b_bitmask) (MASK_PRP1_PAGE | MASK_PRP2_PAGE | MASK_PRP2_LIST); writeCmd->SetPrpBuffer(prpBitmask, writeMem); writeCmd->SetNLB(0); // convert to 0-based value writeCmd->SetSLBA(0); LOG_NRM("Set MPTR in cmd to max value"); writeCmd->SetDword(0xffffffff, 4); writeCmd->SetDword(0xffffffff, 5); writeCmd->SetNSID(bare[i]); work = str(boost::format("namspc%d") % bare[i]); IO::SendAndReapCmd(mGrpName, mTestName, DEFAULT_CMD_WAIT_ms, iosq, iocq, writeCmd, work, true); } }
void IgnoreMetaPtrBare_r12::RunCoreTest() { /** \verbatim * Assumptions: * 1) Test CreateResources_r10b has run prior. * \endverbatim */ string work; ConstSharedIdentifyPtr namSpcPtr; // Lookup objs which were created in a prior test within group SharedIOSQPtr iosq = CAST_TO_IOSQ(gRsrcMngr->GetObj(IOSQ_GROUP_ID)); SharedIOCQPtr iocq = CAST_TO_IOCQ(gRsrcMngr->GetObj(IOCQ_GROUP_ID)); LOG_NRM("For all bare namspc's issue cmd with non-zero meta ptr"); vector<uint32_t> bare = gInformative->GetBareNamespaces(); for (size_t i = 0; i < bare.size(); i++) { namSpcPtr = gInformative->GetIdentifyCmdNamspc(bare[i]); if (namSpcPtr->isZeroFilled()) { LOG_NRM("Namespace %lu is inactive", i); } else { LOG_NRM("Setup read cmd's values that won't change per namspc"); SharedMemBufferPtr readMem = SharedMemBufferPtr(new MemBuffer()); uint64_t lbaDataSize = namSpcPtr->GetLBADataSize(); readMem->Init(lbaDataSize); SharedReadPtr readCmd = SharedReadPtr(new Read()); send_64b_bitmask prpBitmask = (send_64b_bitmask) (MASK_PRP1_PAGE | MASK_PRP2_PAGE | MASK_PRP2_LIST); readCmd->SetPrpBuffer(prpBitmask, readMem); readCmd->SetNLB(0); // convert to 0-based value readCmd->SetSLBA(0); LOG_NRM("Set MPTR in cmd to max value"); readCmd->SetDword(0xffffffff, 4); readCmd->SetDword(0xffffffff, 5); readCmd->SetNSID(bare[i]); work = str(boost::format("namspc%d") % bare[i]); IO::SendAndReapCmd(mGrpName, mTestName, CALC_TIMEOUT_ms(1), iosq, iocq, readCmd, work, true); } } }
void IgnoreMetaPtrMeta_r10b::RunCoreTest() { /** \verbatim * Assumptions: * 1) Test CreateResources_r10b has run prior. * \endverbatim */ string work; ConstSharedIdentifyPtr namSpcPtr; LOG_NRM("Lookup objs which were created in a prior test within group"); SharedIOSQPtr iosq = CAST_TO_IOSQ(gRsrcMngr->GetObj(IOSQ_GROUP_ID)); SharedIOCQPtr iocq = CAST_TO_IOCQ(gRsrcMngr->GetObj(IOCQ_GROUP_ID)); LOG_NRM("For all imeta namspc's issue read cmd with non-zero meta ptr"); vector<uint32_t> imeta = gInformative->GetMetaINamespaces(); for (size_t i = 0; i < imeta.size(); i++) { namSpcPtr = gInformative->GetIdentifyCmdNamspc(imeta[i]); LOG_NRM("Setup read cmd's values that won't change per namspc"); SharedMemBufferPtr readMem = SharedMemBufferPtr(new MemBuffer()); uint64_t lbaDataSize = namSpcPtr->GetLBADataSize(); LBAFormat lbaFormat = namSpcPtr->GetLBAFormat(); readMem->Init(lbaDataSize + lbaFormat.MS); SharedReadPtr readCmd = SharedReadPtr(new Read()); send_64b_bitmask prpBitmask = (send_64b_bitmask) (MASK_PRP1_PAGE | MASK_PRP2_PAGE | MASK_PRP2_LIST); readCmd->SetPrpBuffer(prpBitmask, readMem); readCmd->SetNLB(0); // convert to 0-based value LOG_NRM("Set MPTR in cmd to max value"); readCmd->SetDword(0xffffffff, 4); readCmd->SetDword(0xffffffff, 5); readCmd->SetNSID(imeta[i]); work = str(boost::format("namspc%d") % imeta[i]); IO::SendAndReapCmd(mGrpName, mTestName, DEFAULT_CMD_WAIT_ms, iosq, iocq, readCmd, work, true); } }
SharedReadPtr FUA_r10b::CreateCmd() { Informative::Namspc namspcData = gInformative->Get1stBareMetaE2E(); LBAFormat lbaFormat = namspcData.idCmdNamspc->GetLBAFormat(); LOG_NRM("Processing read cmd using namspc id %d", namspcData.id); ConstSharedIdentifyPtr namSpcPtr = namspcData.idCmdNamspc; uint64_t lbaDataSize = namSpcPtr->GetLBADataSize();; SharedMemBufferPtr dataPat = SharedMemBufferPtr(new MemBuffer()); SharedReadPtr readCmd = SharedReadPtr(new Read()); send_64b_bitmask prpBitmask = (send_64b_bitmask)(MASK_PRP1_PAGE | MASK_PRP2_PAGE | MASK_PRP2_LIST); switch (namspcData.type) { case Informative::NS_BARE: dataPat->Init(lbaDataSize); break; case Informative::NS_METAS: dataPat->Init(lbaDataSize); if (gRsrcMngr->SetMetaAllocSize(lbaFormat.MS) == false) throw FrmwkEx(HERE); readCmd->AllocMetaBuffer(); break; case Informative::NS_METAI: dataPat->Init(lbaDataSize + lbaFormat.MS); break; case Informative::NS_E2ES: case Informative::NS_E2EI: throw FrmwkEx(HERE, "Deferring work to handle this case in future"); break; } readCmd->SetPrpBuffer(prpBitmask, dataPat); readCmd->SetNSID(namspcData.id); readCmd->SetNLB(0); return readCmd; }
void StartingLBABare_r10b::RunCoreTest() { /** \verbatim * Assumptions: * 1) Test CreateResources_r10b has run prior. * \endverbatim */ string work; bool enableLog; ConstSharedIdentifyPtr namSpcPtr; // Lookup objs which were created in a prior test within group SharedIOSQPtr iosq = CAST_TO_IOSQ(gRsrcMngr->GetObj(IOSQ_GROUP_ID)); SharedIOCQPtr iocq = CAST_TO_IOCQ(gRsrcMngr->GetObj(IOCQ_GROUP_ID)); ConstSharedIdentifyPtr idCmdCtrlr = gInformative->GetIdentifyCmdCtrlr(); uint32_t maxDtXferSz = idCmdCtrlr->GetMaxDataXferSize(); if (maxDtXferSz == 0) maxDtXferSz = MAX_DATA_TX_SIZE; LOG_NRM("Prepare cmds to be send through Q's."); SharedWritePtr writeCmd = SharedWritePtr(new Write()); SharedMemBufferPtr writeMem = SharedMemBufferPtr(new MemBuffer()); send_64b_bitmask prpBitmask = (send_64b_bitmask) (MASK_PRP1_PAGE | MASK_PRP2_PAGE | MASK_PRP2_LIST); SharedReadPtr readCmd = SharedReadPtr(new Read()); SharedMemBufferPtr readMem = SharedMemBufferPtr(new MemBuffer()); DataPattern dataPat[] = { DATAPAT_INC_8BIT, DATAPAT_CONST_8BIT, DATAPAT_INC_16BIT, DATAPAT_CONST_16BIT, DATAPAT_INC_32BIT, DATAPAT_CONST_32BIT }; uint64_t dpArrSize = sizeof(dataPat) / sizeof(dataPat[0]); LOG_NRM("Seeking all bare namspc's."); vector<uint32_t> bare = gInformative->GetBareNamespaces(); for (size_t i = 0; i < bare.size(); i++) { LOG_NRM("Processing for BARE name space id #%d", bare[i]); namSpcPtr = gInformative->GetIdentifyCmdNamspc(bare[i]); uint64_t ncap = namSpcPtr->GetValue(IDNAMESPC_NCAP); uint64_t lbaDataSize = namSpcPtr->GetLBADataSize(); uint64_t maxWrBlks = maxDtXferSz / lbaDataSize; writeMem->Init(maxWrBlks * lbaDataSize); writeCmd->SetPrpBuffer(prpBitmask, writeMem); writeCmd->SetNSID(bare[i]); writeCmd->SetNLB(maxWrBlks - 1); // 0 based value. readMem->Init(maxWrBlks * lbaDataSize); readCmd->SetPrpBuffer(prpBitmask, readMem); readCmd->SetNSID(bare[i]); readCmd->SetNLB(maxWrBlks - 1); // 0 based value. for (uint64_t nWrBlks = 0; nWrBlks < (ncap - 1); nWrBlks += maxWrBlks) { LOG_NRM("Sending #%ld blks of #%ld", nWrBlks, (ncap -1)); for (uint64_t nLBA = 0; nLBA < maxWrBlks; nLBA++) { writeMem->SetDataPattern(dataPat[nLBA % dpArrSize], (nWrBlks + nLBA + 1), (nLBA * lbaDataSize), lbaDataSize); } writeCmd->SetSLBA(nWrBlks); readCmd->SetSLBA(nWrBlks); enableLog = false; if ((nWrBlks <= maxWrBlks) || (nWrBlks >= (ncap - 2 * maxWrBlks))) enableLog = true; work = str(boost::format("NSID.%d.SLBA.%ld") % bare[i] % nWrBlks); IO::SendAndReapCmd(mGrpName, mTestName, CALC_TIMEOUT_ms(1), iosq, iocq, writeCmd, work, enableLog); IO::SendAndReapCmd(mGrpName, mTestName, CALC_TIMEOUT_ms(1), iosq, iocq, readCmd, work, enableLog); VerifyDataPat(readCmd, writeMem); } } }
void WriteDataPat_r10b::WriteDataPattern() { uint64_t regVal; LOG_NRM("Calc buffer size to write %d logical blks to media", WRITE_DATA_PAT_NUM_BLKS); Informative::Namspc namspcData = gInformative->Get1stBareMetaE2E(); ConstSharedIdentifyPtr namSpcPtr = namspcData.idCmdNamspc; if (namSpcPtr == Identify::NullIdentifyPtr) throw FrmwkEx(HERE, "Namespace #%d must exist", namspcData.id); LBAFormat lbaFormat = namspcData.idCmdNamspc->GetLBAFormat(); if (namspcData.type == Informative::NS_METAS) { if (gRsrcMngr->SetMetaAllocSize(lbaFormat.MS * WRITE_DATA_PAT_NUM_BLKS) == false) { throw FrmwkEx(HERE); } } uint64_t lbaDataSize = namSpcPtr->GetLBADataSize(); LOG_NRM("Create a generic write cmd to send data pattern to namspc #%d", namspcData.id); SharedWritePtr writeCmd = SharedWritePtr(new Write()); send_64b_bitmask prpBitmask = (send_64b_bitmask) (MASK_PRP1_PAGE | MASK_PRP2_PAGE | MASK_PRP2_LIST); LOG_NRM("Create data pattern to write to media"); SharedMemBufferPtr dataPat = SharedMemBufferPtr(new MemBuffer()); switch (namspcData.type) { case Informative::NS_BARE: dataPat->Init(WRITE_DATA_PAT_NUM_BLKS * lbaDataSize); break; case Informative::NS_METAS: dataPat->Init(WRITE_DATA_PAT_NUM_BLKS * lbaDataSize); writeCmd->AllocMetaBuffer(); writeCmd->SetMetaDataPattern(DATAPAT_INC_16BIT); break; case Informative::NS_METAI: dataPat->Init(WRITE_DATA_PAT_NUM_BLKS * (lbaDataSize + lbaFormat.MS)); break; case Informative::NS_E2ES: case Informative::NS_E2EI: throw FrmwkEx(HERE, "Deferring work to handle this case in future"); break; } dataPat->SetDataPattern(DATAPAT_INC_16BIT); dataPat->Dump(FileSystem::PrepDumpFile(mGrpName, mTestName, "DataPat"), "Write buffer's data pattern"); writeCmd->SetPrpBuffer(prpBitmask, dataPat); writeCmd->SetNSID(namspcData.id); writeCmd->SetNLB(WRITE_DATA_PAT_NUM_BLKS - 1); // convert to 0-based value // Lookup objs which were created in a prior test within group SharedIOSQPtr iosqContig = CAST_TO_IOSQ( gRsrcMngr->GetObj(IOSQ_CONTIG_GROUP_ID)) SharedIOCQPtr iocqContig = CAST_TO_IOCQ( gRsrcMngr->GetObj(IOCQ_CONTIG_GROUP_ID)) SharedIOSQPtr iosqDiscontig = CAST_TO_IOSQ( gRsrcMngr->GetObj(IOSQ_DISCONTIG_GROUP_ID)) SharedIOCQPtr iocqDiscontig = CAST_TO_IOCQ( gRsrcMngr->GetObj(IOCQ_DISCONTIG_GROUP_ID)) LOG_NRM("Send the cmd to hdw via the contiguous IOQ's"); SendToIOSQ(iosqContig, iocqContig, writeCmd, "contig"); // To run the discontig part of this test, the hdw must support that feature if (gRegisters->Read(CTLSPC_CAP, regVal) == false) { throw FrmwkEx(HERE, "Unable to determine Q memory requirements"); } else if (regVal & CAP_CQR) { LOG_NRM("Unable to utilize discontig Q's, DUT requires contig"); return; } LOG_NRM("Send the cmd to hdw via the discontiguous IOQ's"); SendToIOSQ(iosqDiscontig, iocqDiscontig, writeCmd, "discontig"); }