#define PCI_VENDOR_ID_VMWARE (0x15ad)\r
#define PCI_DEVICE_ID_VMWARE_PVSCSI (0x07c0)\r
\r
+//\r
+// CDB (Command Descriptor Block) with size above this constant\r
+// should be considered out-of-band\r
+//\r
+#define PVSCSI_CDB_MAX_SIZE (16)\r
+\r
+typedef enum {\r
+ PvScsiRegOffsetCommand = 0x0,\r
+ PvScsiRegOffsetCommandData = 0x4,\r
+ PvScsiRegOffsetCommandStatus = 0x8,\r
+ PvScsiRegOffsetLastSts0 = 0x100,\r
+ PvScsiRegOffsetLastSts1 = 0x104,\r
+ PvScsiRegOffsetLastSts2 = 0x108,\r
+ PvScsiRegOffsetLastSts3 = 0x10c,\r
+ PvScsiRegOffsetIntrStatus = 0x100c,\r
+ PvScsiRegOffsetIntrMask = 0x2010,\r
+ PvScsiRegOffsetKickNonRwIo = 0x3014,\r
+ PvScsiRegOffsetDebug = 0x3018,\r
+ PvScsiRegOffsetKickRwIo = 0x4018,\r
+} PVSCSI_BAR0_OFFSETS;\r
+\r
+//\r
+// Define Interrupt-Status register flags\r
+//\r
+#define PVSCSI_INTR_CMPL_0 BIT0\r
+#define PVSCSI_INTR_CMPL_1 BIT1\r
+#define PVSCSI_INTR_CMPL_MASK (PVSCSI_INTR_CMPL_0 | PVSCSI_INTR_CMPL_1)\r
+\r
+typedef enum {\r
+ PvScsiCmdFirst = 0,\r
+ PvScsiCmdAdapterReset = 1,\r
+ PvScsiCmdIssueScsi = 2,\r
+ PvScsiCmdSetupRings = 3,\r
+ PvScsiCmdResetBus = 4,\r
+ PvScsiCmdResetDevice = 5,\r
+ PvScsiCmdAbortCmd = 6,\r
+ PvScsiCmdConfig = 7,\r
+ PvScsiCmdSetupMsgRing = 8,\r
+ PvScsiCmdDeviceUnplug = 9,\r
+ PvScsiCmdLast = 10\r
+} PVSCSI_COMMANDS;\r
+\r
+#define PVSCSI_SETUP_RINGS_MAX_NUM_PAGES (32)\r
+\r
+#pragma pack (1)\r
+typedef struct {\r
+ UINT32 ReqRingNumPages;\r
+ UINT32 CmpRingNumPages;\r
+ UINT64 RingsStatePPN;\r
+ UINT64 ReqRingPPNs[PVSCSI_SETUP_RINGS_MAX_NUM_PAGES];\r
+ UINT64 CmpRingPPNs[PVSCSI_SETUP_RINGS_MAX_NUM_PAGES];\r
+} PVSCSI_CMD_DESC_SETUP_RINGS;\r
+#pragma pack ()\r
+\r
+#define PVSCSI_MAX_CMD_DATA_WORDS \\r
+ (sizeof (PVSCSI_CMD_DESC_SETUP_RINGS) / sizeof (UINT32))\r
+\r
+#pragma pack (1)\r
+typedef struct {\r
+ UINT32 ReqProdIdx;\r
+ UINT32 ReqConsIdx;\r
+ UINT32 ReqNumEntriesLog2;\r
+\r
+ UINT32 CmpProdIdx;\r
+ UINT32 CmpConsIdx;\r
+ UINT32 CmpNumEntriesLog2;\r
+\r
+ UINT8 Pad[104];\r
+\r
+ UINT32 MsgProdIdx;\r
+ UINT32 MsgConsIdx;\r
+ UINT32 MsgNumEntriesLog2;\r
+} PVSCSI_RINGS_STATE;\r
+#pragma pack ()\r
+\r
+//\r
+// Define PVSCSI request descriptor tags\r
+//\r
+#define PVSCSI_SIMPLE_QUEUE_TAG (0x20)\r
+\r
+//\r
+// Define PVSCSI request descriptor flags\r
+//\r
+#define PVSCSI_FLAG_CMD_WITH_SG_LIST BIT0\r
+#define PVSCSI_FLAG_CMD_OUT_OF_BAND_CDB BIT1\r
+#define PVSCSI_FLAG_CMD_DIR_NONE BIT2\r
+#define PVSCSI_FLAG_CMD_DIR_TOHOST BIT3\r
+#define PVSCSI_FLAG_CMD_DIR_TODEVICE BIT4\r
+\r
+#pragma pack (1)\r
+typedef struct {\r
+ UINT64 Context;\r
+ UINT64 DataAddr;\r
+ UINT64 DataLen;\r
+ UINT64 SenseAddr;\r
+ UINT32 SenseLen;\r
+ UINT32 Flags;\r
+ UINT8 Cdb[16];\r
+ UINT8 CdbLen;\r
+ UINT8 Lun[8];\r
+ UINT8 Tag;\r
+ UINT8 Bus;\r
+ UINT8 Target;\r
+ UINT8 VcpuHint;\r
+ UINT8 Unused[59];\r
+} PVSCSI_RING_REQ_DESC;\r
+#pragma pack ()\r
+\r
+//\r
+// Host adapter status/error codes\r
+//\r
+typedef enum {\r
+ PvScsiBtStatSuccess = 0x00, // CCB complete normally with no errors\r
+ PvScsiBtStatLinkedCommandCompleted = 0x0a,\r
+ PvScsiBtStatLinkedCommandCompletedWithFlag = 0x0b,\r
+ PvScsiBtStatDataUnderrun = 0x0c,\r
+ PvScsiBtStatSelTimeout = 0x11, // SCSI selection timeout\r
+ PvScsiBtStatDatarun = 0x12, // Data overrun/underrun\r
+ PvScsiBtStatBusFree = 0x13, // Unexpected bus free\r
+ PvScsiBtStatInvPhase = 0x14, //\r
+ // Invalid bus phase or sequence requested\r
+ // by target\r
+ //\r
+ PvScsiBtStatLunMismatch = 0x17, //\r
+ // Linked CCB has different LUN from first\r
+ // CCB\r
+ //\r
+ PvScsiBtStatSensFailed = 0x1b, // Auto request sense failed\r
+ PvScsiBtStatTagReject = 0x1c, //\r
+ // SCSI II tagged queueing message rejected\r
+ // by target\r
+ //\r
+ PvScsiBtStatBadMsg = 0x1d, //\r
+ // Unsupported message received by the host\r
+ // adapter\r
+ //\r
+ PvScsiBtStatHaHardware = 0x20, // Host adapter hardware failed\r
+ PvScsiBtStatNoResponse = 0x21, //\r
+ // Target did not respond to SCSI ATN sent\r
+ // a SCSI RST\r
+ //\r
+ PvScsiBtStatSentRst = 0x22, // Host adapter asserted a SCSI RST\r
+ PvScsiBtStatRecvRst = 0x23, // Other SCSI devices asserted a SCSI RST\r
+ PvScsiBtStatDisconnect = 0x24, //\r
+ // Target device reconnected improperly\r
+ // (w/o tag)\r
+ //\r
+ PvScsiBtStatBusReset = 0x25, // Host adapter issued BUS device reset\r
+ PvScsiBtStatAbortQueue = 0x26, // Abort queue generated\r
+ PvScsiBtStatHaSoftware = 0x27, // Host adapter software error\r
+ PvScsiBtStatHaTimeout = 0x30, // Host adapter hardware timeout error\r
+ PvScsiBtStatScsiParity = 0x34, // SCSI parity error detected\r
+} PVSCSI_HOST_BUS_ADAPTER_STATUS;\r
+\r
+#pragma pack (1)\r
+typedef struct {\r
+ UINT64 Context;\r
+ UINT64 DataLen;\r
+ UINT32 SenseLen;\r
+ UINT16 HostStatus;\r
+ UINT16 ScsiStatus;\r
+ UINT32 Pad[2];\r
+} PVSCSI_RING_CMP_DESC;\r
+#pragma pack ()\r
+\r
#endif // __PVSCSI_H_\r