|  | #ifndef _LINUX_VIRTIO_BLK_H | 
|  | #define _LINUX_VIRTIO_BLK_H | 
|  | #include <linux/virtio_config.h> | 
|  |  | 
|  | /* The ID for virtio_block */ | 
|  | #define VIRTIO_ID_BLOCK	2 | 
|  |  | 
|  | /* Feature bits */ | 
|  | #define VIRTIO_BLK_F_BARRIER	0	/* Does host support barriers? */ | 
|  | #define VIRTIO_BLK_F_SIZE_MAX	1	/* Indicates maximum segment size */ | 
|  | #define VIRTIO_BLK_F_SEG_MAX	2	/* Indicates maximum # of segments */ | 
|  | #define VIRTIO_BLK_F_GEOMETRY	4	/* Legacy geometry available  */ | 
|  |  | 
|  | struct virtio_blk_config | 
|  | { | 
|  | /* The capacity (in 512-byte sectors). */ | 
|  | __le64 capacity; | 
|  | /* The maximum segment size (if VIRTIO_BLK_F_SIZE_MAX) */ | 
|  | __le32 size_max; | 
|  | /* The maximum number of segments (if VIRTIO_BLK_F_SEG_MAX) */ | 
|  | __le32 seg_max; | 
|  | /* geometry the device (if VIRTIO_BLK_F_GEOMETRY) */ | 
|  | struct virtio_blk_geometry { | 
|  | __le16 cylinders; | 
|  | __u8 heads; | 
|  | __u8 sectors; | 
|  | } geometry; | 
|  | } __attribute__((packed)); | 
|  |  | 
|  | /* These two define direction. */ | 
|  | #define VIRTIO_BLK_T_IN		0 | 
|  | #define VIRTIO_BLK_T_OUT	1 | 
|  |  | 
|  | /* This bit says it's a scsi command, not an actual read or write. */ | 
|  | #define VIRTIO_BLK_T_SCSI_CMD	2 | 
|  |  | 
|  | /* Barrier before this op. */ | 
|  | #define VIRTIO_BLK_T_BARRIER	0x80000000 | 
|  |  | 
|  | /* This is the first element of the read scatter-gather list. */ | 
|  | struct virtio_blk_outhdr | 
|  | { | 
|  | /* VIRTIO_BLK_T* */ | 
|  | __u32 type; | 
|  | /* io priority. */ | 
|  | __u32 ioprio; | 
|  | /* Sector (ie. 512 byte offset) */ | 
|  | __u64 sector; | 
|  | }; | 
|  |  | 
|  | /* And this is the final byte of the write scatter-gather list. */ | 
|  | #define VIRTIO_BLK_S_OK		0 | 
|  | #define VIRTIO_BLK_S_IOERR	1 | 
|  | #define VIRTIO_BLK_S_UNSUPP	2 | 
|  | #endif /* _LINUX_VIRTIO_BLK_H */ |