<HTML><HEAD><TITLE>Samsung Enterprise Portal mySingle</TITLE>
<META content=IE=5 http-equiv=X-UA-Compatible>
<META content="text/html; charset=windows-1252" http-equiv=Content-Type>
<STYLE id=mysingle_style type=text/css>P {
        MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt; FONT-FAMILY: Arial, arial; MARGIN-TOP: 5px
}
TD {
        MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt; FONT-FAMILY: Arial, arial; MARGIN-TOP: 5px
}
LI {
        MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt; FONT-FAMILY: Arial, arial; MARGIN-TOP: 5px
}
BODY {
        FONT-SIZE: 9pt; FONT-FAMILY: Arial, arial; MARGIN: 10px; LINE-HEIGHT: 1.4
}
</STYLE>

<META name=GENERATOR content=ActiveSquare></HEAD>
<BODY>
<P><SPAN style="FONT-FAMILY: Calibri"></SPAN><SPAN style="FONT-SIZE: 11pt"></SPAN><SPAN style="FONT-FAMILY: Calibri"></SPAN><SPAN style="FONT-FAMILY: Calibri"></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri">Hi Everyone,</SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri"></SPAN> </P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri">We have a patch for the following random bug fixes -</SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri">a. Invalid return value for NVMeAdapterControl.<BR>b. Handling StartIo deadlock when MultipleCoresToSingleQueueFlag is set.<BR>c. Support for STORAGE_REQUEST_BLOCK in DriverEntry.<BR>d. Handling return value for NVMeCompleteCmd.<BR>e. Handling return value for NVMeWaitForCtrlRDY.<BR>f. Fixing the NVMeResetAdapter issues to check if CC.EN is set to 1 before setting to 0.<BR>g. Memory corruption constructing inquiry response data in SntiTranslateStandardInquiryPage.<BR>h. Eliminate NVMeWaitOnReady and use only NVMeWaitForCtrlRDY.<BR>i. Fix the RecoveryDpcRoutine to avoid redundant setting of CC.EN bit to 0.<BR>j. Write Buffer implementation correction.<BR>k. Enabling Eject option in the taskbar.</SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri"></SPAN> </P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri">Please send feedback by August 21st.  The password is </SPAN><STRONG><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri; COLOR: #0000ff">samsung123</SPAN></STRONG></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri"></SPAN> </P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri"><BR><STRONG><U>Change details -</U></STRONG></SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri">1) Invalid return value for NVMeAdapterControl<BR>NVMeAdapterControl miniport routine -  sometimes returns illegal value. WDK specifies that the driver must always return ScsiAdapterControlSuccess. However, depending on execution, the driver may currently return ScsiAdapterControlUnsuccessful for ScsiStopAdapter and ScsiRestartAdapter control types. <BR>As per msdn – </SPAN><A href="http://msdn.microsoft.com/en-us/library/windows/hardware/ff557365(v=vs.85).aspx"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri">http://msdn.microsoft.com/en-us/library/windows/hardware/ff557365(v=vs.85).aspx</SPAN></A><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri"><BR></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri">Affected Files/Functions:<BR>        nvmeStd.c / NVMeAdapterControl()</SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri"> </SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri">2) Handling StartIo deadlock when MultipleCoresToSingleQueueFlag is set<BR>Affected Files/Functions:<BR>        Set the AcquireLock parameter to FALSE in the processio () in the below functions.<BR>        nvmeSnti.c / SntiTranslateTemperatureResponse ()<BR>        nvmeSnti.c / SntiTranslateStartStopUnitResponse ()<BR>        nvmeStd.c / NVMeHandleSmartThresholds ()</SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri"> </SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri">3) Support for STORAGE_REQUEST_BLOCK in DriverEntry<BR>Set the SrbTypeFlags in DriverEntry() function to support STORAGE_REQUEST_BLOCK.</SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri">Affected Files/Functions:<BR>        nvmeStd.c / DriverEntry (): </SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri"> </SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri">4) Handlings return value for NVMeCompleteCmd.<BR>NVMeCompleteCmd should have a return value that can be checked to see if it was successful or not. Right now, wherever it’s called from the code forges ahead regardless of whether it succeeded or failed:  <BR>VOID NVMeCompleteCmd{<BR>. . .<BR>if ((pCmdEntry->Pending == FALSE) || (pCmdEntry->Context == NULL)) {<BR>/* Something bad happened so reset the adapter and hope for the best */<BR>                  NVMeResetController(pAE, NULL);<BR>                                    return;<BR>}<BR>As shown above, one of the routines which NVMeCompleteCmd calls is NVMeResetController. Since NVMeCompleteCmd has no return value, this fatal error return is never detected in any of the places that the function is called from (quite a few) - the logic just proceeds on as if everything is fine. In some cases NVMeCompleteCmd can be called over and over (if it is called from DetectPendingCmds or IoCompletionDpcRoutine for example) which may in turn cause repeated calls to NVMeResetController. <BR>Affected Files/Functions:<BR>        nvmeIo.c / ProcessIo ()<BR>        nvmeIo.c / NVMeCompleteCmd ()<BR>        nvmeIo.h / NVMeCompleteCmd ()<BR>        nvmeStd.c / IoCompletionDpcRoutine ()</SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri"> </SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri">5) Handling return value for NVMeWaitForCtrlRDY<BR>NVMeWaitForCtrlRDY should have a return value of type BOOLEAN that can be checked to see if it was successful or not.</SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri">Affected Files/Functions:<BR>        nvmeStd.c / NVMeInitialize ()</SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri"> </SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri">6) Fixing the NVMeResetAdapter issues to check if CC.EN is set to 1 before setting to 0.<BR>The routine NVMeResetAdapter() sets CC.EN to 0 without ever checking to make sure that CSTS.RDY is set to ‘1’ first. This check has to be included in this routine. Since it is not, there are many paths in the driver where there is no prior check for this condition:<BR>a) NVMeInitAdminQueues -> NVMeEnableAdapter -> NVMeResetAdapter<BR>b) NVMeNormalShutdown -> NVMeResetAdapter<BR>c) NVMeAdapterControlPowerDown -> NVMeResetAdapter<BR>d) NVMeSynchronizeReset -> NVMeResetAdapter</SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri">Affected Files/Functions:<BR>        nvmeInit.c / NVMeResetAdapter ()</SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri"> </SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri">7) Memory corruption constructing inquiry response data in SntiTranslateStandardInquiryPage<BR>Memory corruption constructing inquiry response data -  In SntiTranslateStandardInquiryPage(), the following line of code is touching a field way past the end of STANDARD_INQUIRY_LENGTH (36 bytes):<BR>pStdInquiry->Reserved3[0]        = RESERVED_FIELD;</SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri">Affected Files/Functions:<BR>        nvmeSnti.c / SntiTranslateStandardInquiryPage ()</SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri"> </SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri">8) Eliminate NVMeWaitOnReady and use only NVMeWaitForCtrlRDY.<BR>There is redundancy in the new routine NVMeWaitForCtrlRDY() and the old routine NVMeWaitOnReady(). We don’t need both – we can get rid of the old routine.</SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri">Affected Files/Functions:<BR>        nvmeInit.c / NVMeResetAdapter ()</SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri"> </SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri">9) Fix the RecoveryDpcRoutine to avoid redundant setting of CC.EN bit to 0.<BR>The code does not need to set CC.EN to ‘0’ and then wait for CSTS.RDY to become 0 because right after it does so, it calls NVMeResetAdapter which does the exact same thing.</SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri">Affected Files/Functions:<BR>        nvmeStd.c / RecoveryDpcRoutine ()</SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri"> </SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri">10) Write Buffer implementation correction.<BR>a. Calculation of dword10 for DOWNLOAD_SAVE_ACTIVATE and DOWNLOAD_SAVE_DEFER_ACTIVATE is modified. <BR>b. Set the SRB Status value for NVMe command failure condition in SntiCompletionCallbackRoutine.<BR>c. Prepare the Firmware Activate Command and issue the command in case of DOWNLOAD_SAVE_ACTIVATE mode in SntiTranslateWriteBufferResponse.<BR>d. Handled the scenario of SNTI_SEQUENCE_IN_PROGRESS for Write Data Buffer command.</SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri">Affected Files/Functions:<BR>        nvmeSnti.c / SntiCompletionCallbackRoutine<BR>        nvmeSnti.c / SntiTranslateWriteBufferResponse</SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri"> </SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri">11) Enabling Eject option in the taskbar:<BR>Affected Files/Functions:<BR>        nvmeStd.c / DriverEntry (): Set the FeatureSupport flag to STOR_FEATURE_FULL_PNP_DEVICE_CAPABILITIES.</SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri">        nvmeStd.c / NVMeBuildIo (): Use the PSTOR_DEVICE_CAPABILITIES_EX structure for PNPAction StorQueryCapabilities. Set the Removable flag to TRUE.</SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri"></SPAN> </P>
<P><STRONG><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri">Unit tests:</SPAN></STRONG><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri"><BR>Win7/8/8.1, Server 2008R2/2012/2012R2</SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri"></SPAN> </P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri">Thanks,</SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri">Suman</SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri"></SPAN> </P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri"><!--SP:suman.p--><!--suman.p:EP--></SPAN>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri"></SPAN> </P>
<TABLE id=confidentialsignimg>
<TBODY>
<TR>
<TD NAMO_LOCK>
<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Calibri"><IMG border=0 src="cid:4CBBEM6S04A2@namo.co.kr"></SPAN></P></TD></TR></TBODY></TABLE></BODY></HTML><img src='http://ext.samsung.net/mailcheck/SeenTimeChecker?do=9a41cee2c6816bab8448db453aca984ece8eea4993ac5e067d9badbdf7e30042d1afaaba7860cdcd9564217c646641ad61e16949eaa607501b20909a04efd4d2748cfe1d4e847419cf878f9a26ce15a0' border=0 width=0 height=0 style='display:none'>