<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Sending IDENTIFY DEVICE COMMAND - ATA PASS THROUGH on raid - SSD in Archive</title>
    <link>https://community.solidigm.com/t5/archive/sending-identify-device-command-ata-pass-through-on-raid-ssd/m-p/18449#M11152</link>
    <description>&lt;P&gt;Hi All, (Kindly guide me if I am at wrong place)&lt;/P&gt;&lt;P&gt;My aim is to detect Solid State Drives in systems with raid configuration. Using smartmontools' following command I observe bit 434 (217) shows value 1 for SSD: smartctl -i -r ataioctl,2 /dev/csmi0,0&lt;/P&gt;&lt;P&gt;Attempting to read the same 512 bytes of data I have attempted to send IDENTIFY DEVICE commands in following 2 ways: &lt;/P&gt;&lt;P&gt;Method 1 has info-&amp;gt;IoctlHeader.ReturnCode = 3 which means CSMI_SAS_STATUS_INVALID_PARAMETER.(CSMI buffer provided is too small)&lt;/P&gt;&lt;P&gt;Method 2 fails with DeviceIoControl() set GetLastError() as 87 (ERROR_INVALID_PARAMETER), Can you help me in understanding what could be wrong and am I on the right track? &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;BYTE    portNumber = 0;&lt;/P&gt;&lt;P&gt;_stprintf_s(DeviceName, (sizeof(char)*128),_T("&lt;A&gt;\\\\.\\Scsi%u&lt;/A&gt;:"),portNumber);    &lt;/P&gt;&lt;P&gt;handle = CreateFile(DeviceName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,  NULL,&lt;/P&gt;&lt;P&gt;                        OPEN_EXISTING, NULL, NULL);&lt;/P&gt;&lt;P&gt;if (handle == INVALID_HANDLE_VALUE)&lt;/P&gt;&lt;P&gt;{ &lt;/P&gt;&lt;P&gt;     printf("Unable to open handle to device , Error %u\n", GetLastError());  &lt;/P&gt;&lt;P&gt;     return;&lt;/P&gt;&lt;P&gt;}    &lt;/P&gt;&lt;P&gt; CSMI_SAS_STP_PASSTHRU_BUFFER* info = (CSMI_SAS_STP_PASSTHRU_BUFFER *) &lt;/P&gt;&lt;P&gt;calloc(1, sizeof(CSMI_SAS_STP_PASSTHRU_BUFFER));&lt;/P&gt;&lt;P&gt;info-&amp;gt;IoctlHeader.HeaderLength = sizeof(IOCTL_HEADER);&lt;/P&gt;&lt;P&gt;info-&amp;gt;IoctlHeader.Timeout = CSMI_SAS_TIMEOUT;&lt;/P&gt;&lt;P&gt;info-&amp;gt;IoctlHeader.ControlCode = CC_CSMI_SAS_STP_PASSTHRU;&lt;/P&gt;&lt;P&gt;info-&amp;gt;IoctlHeader.Length = sizeof(CSMI_SAS_STP_PASSTHRU_BUFFER) -    sizeof(IOCTL_HEADER);&lt;/P&gt;&lt;P&gt;info-&amp;gt;IoctlHeader.ReturnCode = 0;&lt;/P&gt;&lt;P&gt;memcpy(&amp;amp;info-&amp;gt;IoctlHeader.Signature, CSMI_SAS_SIGNATURE, sizeof(CSMI_SAS_SIGNATURE));&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;bSuccess = DeviceIoControl(handle, IOCTL_SCSI_MINIPORT, info, &lt;/P&gt;&lt;P&gt;                              sizeof(CSMI_SAS_STP_PASSTHRU_BUFFER), &lt;/P&gt;&lt;P&gt;                                info, sizeof(CSMI_SAS_STP_PASSTHRU_BUFFER),&lt;/P&gt;&lt;P&gt;                                &amp;amp;bytesReturned, NULL);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;////////////////////////////////////////////////////////&lt;/P&gt;&lt;P&gt;METHOD 2&lt;/P&gt;&lt;P&gt;/////////////////////////////////////////////////////////&lt;/P&gt;&lt;P&gt;  handle = CreateFile(L"&lt;A&gt;\\\\.\\PhysicalDrive0&lt;/A&gt;", GENERIC_READ | GENERIC_WRITE,  FILE_SHARE_READ | FILE_SHARE_WRITE,&lt;/P&gt;&lt;P&gt;  NULL,&lt;/P&gt;&lt;P&gt;  OPEN_EXISTING,&lt;/P&gt;&lt;P&gt;  NULL,&lt;/P&gt;&lt;P&gt;  NULL);&lt;/P&gt;&lt;P&gt;  if (handle == INVALID_HANDLE_VALUE)&lt;/P&gt;&lt;P&gt;  { &lt;/P&gt;&lt;P&gt;  printf("Unable to open handle to device , Error %u\n", GetLastError());&lt;/P&gt;&lt;P&gt;  return 1;&lt;/P&gt;&lt;P&gt;  }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;  //Allocate memory for ATA_PASS_THROUGH_EX and clear the contents &lt;/P&gt;&lt;P&gt;  pATAData = (PATA_PASS_THROUGH_EX) VirtualAlloc(NULL, dataSize, MEM_COMMIT, PAGE_READWRITE); &lt;/P&gt;&lt;P&gt;  ZeroMemory(pATAData,dataSize); &lt;/P&gt;&lt;P&gt;  //Fill in the IDENTIFY DEVICE query data &lt;/P&gt;&lt;P&gt;  pATAData-&amp;gt;Length = sizeof(ATA_PASS_THROUGH_EX); &lt;/P&gt;&lt;P&gt;  pATAData-&amp;gt;DataBufferOffset = sizeof(ATA_PASS_THROUGH_EX); &lt;/P&gt;&lt;P&gt;  pATAData-&amp;gt;DataTransferLength = 512; &lt;/P&gt;&lt;P&gt;  pATAData-&amp;gt;AtaFlags = ATA_FLAGS_DATA_IN; &lt;/P&gt;&lt;P&gt;  pATAData-&amp;gt;TimeOutValue = 10; //Seconds&lt;/P&gt;&lt;P&gt;  pATAData-&amp;gt;CurrentTaskFile[6] = 0xEC; /* send the command*/ &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;  status = DeviceIoControl( handle, &lt;/P&gt;&lt;P&gt;IOCTL_ATA_PASS_THROUGH, &lt;/P&gt;&lt;P&gt;  pATAData, &lt;/P&gt;&lt;P&gt;  dataSize, /* input buffer and size */ &lt;/P&gt;&lt;P&gt;  pATAData, &lt;/P&gt;&lt;P&gt;  dataSize, /* output buffer and size */ &lt;/P&gt;&lt;P&gt;  &amp;amp;bytescopied, /* bytes copied to output buffer*/ &lt;/P&gt;&lt;P&gt;  NULL ); /* no overlapping */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thank you,&lt;/P&gt;&lt;P&gt;Pradeep&lt;/P&gt;</description>
    <pubDate>Sat, 16 Jun 2012 05:06:49 GMT</pubDate>
    <dc:creator>idata</dc:creator>
    <dc:date>2012-06-16T05:06:49Z</dc:date>
    <item>
      <title>Sending IDENTIFY DEVICE COMMAND - ATA PASS THROUGH on raid - SSD</title>
      <link>https://community.solidigm.com/t5/archive/sending-identify-device-command-ata-pass-through-on-raid-ssd/m-p/18449#M11152</link>
      <description>&lt;P&gt;Hi All, (Kindly guide me if I am at wrong place)&lt;/P&gt;&lt;P&gt;My aim is to detect Solid State Drives in systems with raid configuration. Using smartmontools' following command I observe bit 434 (217) shows value 1 for SSD: smartctl -i -r ataioctl,2 /dev/csmi0,0&lt;/P&gt;&lt;P&gt;Attempting to read the same 512 bytes of data I have attempted to send IDENTIFY DEVICE commands in following 2 ways: &lt;/P&gt;&lt;P&gt;Method 1 has info-&amp;gt;IoctlHeader.ReturnCode = 3 which means CSMI_SAS_STATUS_INVALID_PARAMETER.(CSMI buffer provided is too small)&lt;/P&gt;&lt;P&gt;Method 2 fails with DeviceIoControl() set GetLastError() as 87 (ERROR_INVALID_PARAMETER), Can you help me in understanding what could be wrong and am I on the right track? &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;BYTE    portNumber = 0;&lt;/P&gt;&lt;P&gt;_stprintf_s(DeviceName, (sizeof(char)*128),_T("&lt;A&gt;\\\\.\\Scsi%u&lt;/A&gt;:"),portNumber);    &lt;/P&gt;&lt;P&gt;handle = CreateFile(DeviceName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,  NULL,&lt;/P&gt;&lt;P&gt;                        OPEN_EXISTING, NULL, NULL);&lt;/P&gt;&lt;P&gt;if (handle == INVALID_HANDLE_VALUE)&lt;/P&gt;&lt;P&gt;{ &lt;/P&gt;&lt;P&gt;     printf("Unable to open handle to device , Error %u\n", GetLastError());  &lt;/P&gt;&lt;P&gt;     return;&lt;/P&gt;&lt;P&gt;}    &lt;/P&gt;&lt;P&gt; CSMI_SAS_STP_PASSTHRU_BUFFER* info = (CSMI_SAS_STP_PASSTHRU_BUFFER *) &lt;/P&gt;&lt;P&gt;calloc(1, sizeof(CSMI_SAS_STP_PASSTHRU_BUFFER));&lt;/P&gt;&lt;P&gt;info-&amp;gt;IoctlHeader.HeaderLength = sizeof(IOCTL_HEADER);&lt;/P&gt;&lt;P&gt;info-&amp;gt;IoctlHeader.Timeout = CSMI_SAS_TIMEOUT;&lt;/P&gt;&lt;P&gt;info-&amp;gt;IoctlHeader.ControlCode = CC_CSMI_SAS_STP_PASSTHRU;&lt;/P&gt;&lt;P&gt;info-&amp;gt;IoctlHeader.Length = sizeof(CSMI_SAS_STP_PASSTHRU_BUFFER) -    sizeof(IOCTL_HEADER);&lt;/P&gt;&lt;P&gt;info-&amp;gt;IoctlHeader.ReturnCode = 0;&lt;/P&gt;&lt;P&gt;memcpy(&amp;amp;info-&amp;gt;IoctlHeader.Signature, CSMI_SAS_SIGNATURE, sizeof(CSMI_SAS_SIGNATURE));&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;bSuccess = DeviceIoControl(handle, IOCTL_SCSI_MINIPORT, info, &lt;/P&gt;&lt;P&gt;                              sizeof(CSMI_SAS_STP_PASSTHRU_BUFFER), &lt;/P&gt;&lt;P&gt;                                info, sizeof(CSMI_SAS_STP_PASSTHRU_BUFFER),&lt;/P&gt;&lt;P&gt;                                &amp;amp;bytesReturned, NULL);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;////////////////////////////////////////////////////////&lt;/P&gt;&lt;P&gt;METHOD 2&lt;/P&gt;&lt;P&gt;/////////////////////////////////////////////////////////&lt;/P&gt;&lt;P&gt;  handle = CreateFile(L"&lt;A&gt;\\\\.\\PhysicalDrive0&lt;/A&gt;", GENERIC_READ | GENERIC_WRITE,  FILE_SHARE_READ | FILE_SHARE_WRITE,&lt;/P&gt;&lt;P&gt;  NULL,&lt;/P&gt;&lt;P&gt;  OPEN_EXISTING,&lt;/P&gt;&lt;P&gt;  NULL,&lt;/P&gt;&lt;P&gt;  NULL);&lt;/P&gt;&lt;P&gt;  if (handle == INVALID_HANDLE_VALUE)&lt;/P&gt;&lt;P&gt;  { &lt;/P&gt;&lt;P&gt;  printf("Unable to open handle to device , Error %u\n", GetLastError());&lt;/P&gt;&lt;P&gt;  return 1;&lt;/P&gt;&lt;P&gt;  }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;  //Allocate memory for ATA_PASS_THROUGH_EX and clear the contents &lt;/P&gt;&lt;P&gt;  pATAData = (PATA_PASS_THROUGH_EX) VirtualAlloc(NULL, dataSize, MEM_COMMIT, PAGE_READWRITE); &lt;/P&gt;&lt;P&gt;  ZeroMemory(pATAData,dataSize); &lt;/P&gt;&lt;P&gt;  //Fill in the IDENTIFY DEVICE query data &lt;/P&gt;&lt;P&gt;  pATAData-&amp;gt;Length = sizeof(ATA_PASS_THROUGH_EX); &lt;/P&gt;&lt;P&gt;  pATAData-&amp;gt;DataBufferOffset = sizeof(ATA_PASS_THROUGH_EX); &lt;/P&gt;&lt;P&gt;  pATAData-&amp;gt;DataTransferLength = 512; &lt;/P&gt;&lt;P&gt;  pATAData-&amp;gt;AtaFlags = ATA_FLAGS_DATA_IN; &lt;/P&gt;&lt;P&gt;  pATAData-&amp;gt;TimeOutValue = 10; //Seconds&lt;/P&gt;&lt;P&gt;  pATAData-&amp;gt;CurrentTaskFile[6] = 0xEC; /* send the command*/ &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;  status = DeviceIoControl( handle, &lt;/P&gt;&lt;P&gt;IOCTL_ATA_PASS_THROUGH, &lt;/P&gt;&lt;P&gt;  pATAData, &lt;/P&gt;&lt;P&gt;  dataSize, /* input buffer and size */ &lt;/P&gt;&lt;P&gt;  pATAData, &lt;/P&gt;&lt;P&gt;  dataSize, /* output buffer and size */ &lt;/P&gt;&lt;P&gt;  &amp;amp;bytescopied, /* bytes copied to output buffer*/ &lt;/P&gt;&lt;P&gt;  NULL ); /* no overlapping */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thank you,&lt;/P&gt;&lt;P&gt;Pradeep&lt;/P&gt;</description>
      <pubDate>Sat, 16 Jun 2012 05:06:49 GMT</pubDate>
      <guid>https://community.solidigm.com/t5/archive/sending-identify-device-command-ata-pass-through-on-raid-ssd/m-p/18449#M11152</guid>
      <dc:creator>idata</dc:creator>
      <dc:date>2012-06-16T05:06:49Z</dc:date>
    </item>
  </channel>
</rss>

