<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:Consolas;
panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#0563C1;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:#954F72;
text-decoration:underline;}
span.EmailStyle17
{mso-style-type:personal-compose;
font-family:"Calibri","sans-serif";
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;
font-family:"Calibri","sans-serif";}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link="#0563C1" vlink="#954F72"><div class=WordSection1><p class=MsoNormal>In reviewing the PT_IOCTL specification, there are three buffer lengths in the NVME_PASS_THROUGH_IOCTL structure:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><table class=MsoTableGrid border=1 cellspacing=0 cellpadding=0 style='border-collapse:collapse;border:none'><tr><td width=179 valign=top style='width:134.6pt;border:solid windowtext 1.0pt;background:#F2F2F2;padding:0in 5.4pt 0in 5.4pt'><p class=MsoNormal><b>Field<o:p></o:p></b></p></td><td width=444 valign=top style='width:332.9pt;border:solid windowtext 1.0pt;border-left:none;background:#F2F2F2;padding:0in 5.4pt 0in 5.4pt'><p class=MsoNormal><b>Description<o:p></o:p></b></p></td></tr><tr><td width=179 valign=top style='width:134.6pt;border:solid windowtext 1.0pt;border-top:none;padding:0in 5.4pt 0in 5.4pt'><p class=MsoNormal>DWORD DataBufferLen;<o:p></o:p></p></td><td width=444 valign=top style='width:332.9pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt'><p class=MsoNormal>Transfer byte length, including Metadata, starting at DataBuffer<o:p></o:p></p></td></tr><tr><td width=179 valign=top style='width:134.6pt;border:solid windowtext 1.0pt;border-top:none;padding:0in 5.4pt 0in 5.4pt'><p class=MsoNormal>DWORD MetaDataLen;<o:p></o:p></p></td><td width=444 valign=top style='width:332.9pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt'><p class=MsoNormal>Set to 0 if not supported or interleaved with data<o:p></o:p></p></td></tr><tr><td width=179 valign=top style='width:134.6pt;border:solid windowtext 1.0pt;border-top:none;padding:0in 5.4pt 0in 5.4pt'><p class=MsoNormal>DWORD ReturnBufferLen;<o:p></o:p></p></td><td width=444 valign=top style='width:332.9pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt'><p class=MsoNormal>Returned byte length from device to host, including at least the length of this structure, and data if any.<o:p></o:p></p></td></tr></table><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Which of these fields are applicable for inbound, outbound, or bidirectional transfers? Which fields are updated, if any, upon command completion? The MetaDataLen is not used anywhere in the source code.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The other issue I’m finding is in reporting the actual amount of data transferred. For example, Intel provided sample source code to query the IDENTIFY page. In that code, it leaves DataBufferLen and MetaDataLen empty, and sets the return buffer length as:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:9.5pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>pMyIoctl->Direction = </span><span style='font-size:9.5pt;font-family:Consolas;color:#6F008A;background:white;mso-highlight:white'>NVME_FROM_DEV_TO_HOST</span><span style='font-size:9.5pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:9.5pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>pMyIoctl->ReturnBufferLen = </span><span style='font-size:9.5pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>sizeof</span><span style='font-size:9.5pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>(</span><span style='font-size:9.5pt;font-family:Consolas;color:#2B91AF;background:white;mso-highlight:white'>ADMIN_IDENTIFY_CONTROLLER</span><span style='font-size:9.5pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>) +<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:9.5pt;font-family:Consolas;color:black;background:white;mso-highlight:white'> </span><span style='font-size:9.5pt;font-family:Consolas;color:blue;background:white;mso-highlight:white'>sizeof</span><span style='font-size:9.5pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>(</span><span style='font-size:9.5pt;font-family:Consolas;color:#2B91AF;background:white;mso-highlight:white'>NVME_PASS_THROUGH_IOCTL</span><span style='font-size:9.5pt;font-family:Consolas;color:black;background:white;mso-highlight:white'>);</span><o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The ReturnBufferLen would be more technically accurate if one byte was subtracted since UCHAR DataBuffer[1] is at the end of the NVME_PASS_THROUGH_IOCTL structure. Nevertheless, this is a good example as the ReturnBufferLen is one byte larger than what will actually be transmitted by the device/miniport. Sizeof(NVME_PASS_THROUGH_IOCTL) is 99h so adding the size of the IDENTIFY page (1000h) gets you 1099h which is what is submitted in ReturnBufferLen. I expected the ReturnBufferLen to be set to 1098h by the miniport driver because of the one byte padding issue noted above. This would more accurately notify the submitter of how many bytes were actually transferred. Would this be considered a minor miniport bug or does the specification not allow for underrun reporting?<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Perhaps clarifying the usage of these three buffer lengths on input, and output, for the various data direction types, would help clear up my confusion. Thank you in advance.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Mike Berhan<o:p></o:p></p><p class=MsoNormal>busTRACE Technologies<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>