SenseDataParameter.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. /* Copyright (C) 2012-2016 Tal Aloni <tal.aloni.il@gmail.com>. All rights reserved.
  2. *
  3. * You can redistribute this program and/or modify it under the terms of
  4. * the GNU Lesser Public License as published by the Free Software Foundation,
  5. * either version 3 of the License, or (at your option) any later version.
  6. */
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Text;
  10. using Utilities;
  11. namespace SCSI
  12. {
  13. /// <summary>
  14. /// Fixed format sense data
  15. /// </summary>
  16. public class SenseDataParameter
  17. {
  18. public bool Valid;
  19. public byte ResponseCode;
  20. public bool FileMark;
  21. public bool EOM; // End-of-Medium
  22. public bool ILI; // Incorrect length indicator
  23. public byte SenseKey; // 4 bits
  24. public byte[] Information = new byte[4];
  25. public byte AdditionalSenseLength;
  26. public byte AdditionalSenseCode;
  27. public byte AdditionalSenseCodeQualifier;
  28. public SenseDataParameter()
  29. {
  30. }
  31. public byte[] GetBytes()
  32. {
  33. byte[] buffer = new byte[18];
  34. AdditionalSenseLength = 10;
  35. if (Valid)
  36. {
  37. buffer[0] |= 0x80;
  38. }
  39. buffer[0] |= (byte)(ResponseCode & 0x7F);
  40. if (FileMark)
  41. {
  42. buffer[2] |= 0x80;
  43. }
  44. if (EOM)
  45. {
  46. buffer[2] |= 0x40;
  47. }
  48. if (ILI)
  49. {
  50. buffer[2] |= 0x20;
  51. }
  52. buffer[2] |= (byte)(SenseKey & 0xF);
  53. Array.Copy(Information, 0, buffer, 3, 4);
  54. buffer[7] = AdditionalSenseLength;
  55. buffer[12] = AdditionalSenseCode;
  56. buffer[13] = AdditionalSenseCodeQualifier;
  57. return buffer;
  58. }
  59. public static SenseDataParameter GetDataProtectSenseData()
  60. {
  61. SenseDataParameter senseData = new SenseDataParameter();
  62. senseData.Valid = true;
  63. senseData.ResponseCode = 0x70; // current errors
  64. senseData.SenseKey = 0x07; // DATA PROTECT
  65. senseData.AdditionalSenseCode = 0x27; // Command not allowed
  66. senseData.AdditionalSenseCodeQualifier = 0x00;
  67. return senseData;
  68. }
  69. public static SenseDataParameter GetIllegalRequestSenseData(byte additionalSenseCode, byte additionalSenseCodeQualifier)
  70. {
  71. SenseDataParameter senseData = new SenseDataParameter();
  72. senseData.Valid = true;
  73. senseData.ResponseCode = 0x70; // current errors
  74. senseData.SenseKey = 0x05; // ILLEGAL REQUEST
  75. senseData.AdditionalSenseCode = additionalSenseCode;
  76. senseData.AdditionalSenseCodeQualifier = additionalSenseCodeQualifier;
  77. return senseData;
  78. }
  79. public static SenseDataParameter GetIllegalRequestInvalidFieldInCDBSenseData()
  80. {
  81. return GetIllegalRequestSenseData(0x24, 0x00); // Invalid field in CDB
  82. }
  83. public static SenseDataParameter GetIllegalRequestInvalidLUNSenseData()
  84. {
  85. return GetIllegalRequestSenseData(0x25, 0x00); // Invalid LUN
  86. }
  87. public static SenseDataParameter GetIllegalRequestLBAOutOfRangeSenseData()
  88. {
  89. return GetIllegalRequestSenseData(0x21, 0x00); // LBA out of range
  90. }
  91. public static SenseDataParameter GetIllegalRequestUnsupportedCommandCodeSenseData()
  92. {
  93. return GetIllegalRequestSenseData(0x20, 0x00); // Invalid / unsupported command code
  94. }
  95. public static SenseDataParameter GetMediumErrorUnrecoverableReadErrorSenseData()
  96. {
  97. SenseDataParameter senseData = new SenseDataParameter();
  98. senseData.Valid = true;
  99. senseData.ResponseCode = 0x70; // current errors
  100. senseData.SenseKey = 0x03; // MEDIUM ERROR
  101. senseData.AdditionalSenseCode = 0x11; // Peripheral Device Write Fault
  102. senseData.AdditionalSenseCodeQualifier = 0x00;
  103. return senseData;
  104. }
  105. public static SenseDataParameter GetMediumErrorWriteFaultSenseData()
  106. {
  107. SenseDataParameter senseData = new SenseDataParameter();
  108. senseData.Valid = true;
  109. senseData.ResponseCode = 0x70; // current errors
  110. senseData.SenseKey = 0x03; // MEDIUM ERROR
  111. senseData.AdditionalSenseCode = 0x03; // Peripheral Device Write Fault
  112. senseData.AdditionalSenseCodeQualifier = 0x00;
  113. return senseData;
  114. }
  115. public static SenseDataParameter GetNoSenseSenseData()
  116. {
  117. SenseDataParameter senseData = new SenseDataParameter();
  118. senseData.Valid = true;
  119. senseData.ResponseCode = 0x70; // current errors
  120. senseData.SenseKey = 0x00; // NO SENSE
  121. senseData.AdditionalSenseCode = 0x00; // No Additional Sense Information
  122. return senseData;
  123. }
  124. /// <summary>
  125. /// Reported when CRC error is encountered
  126. /// </summary>
  127. public static SenseDataParameter GetWriteFaultSenseData()
  128. {
  129. SenseDataParameter senseData = new SenseDataParameter();
  130. senseData.Valid = true;
  131. senseData.ResponseCode = 0x70; // current errors
  132. senseData.SenseKey = 0x03; // MEDIUM ERROR
  133. senseData.AdditionalSenseCode = 0x03; // Peripheral Device Write Fault
  134. senseData.AdditionalSenseCodeQualifier = 0x00;
  135. return senseData;
  136. }
  137. }
  138. }