xref: /freebsd/sys/dev/xen/blkfront/block.h (revision 9162f64b58d01ec01481d60b6cdc06ffd8e8c7fc)
1 /*
2  *
3  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
4  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
5  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
6  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
7  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
8  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
9  * IN THE SOFTWARE.
10  *
11  * $FreeBSD$
12  */
13 
14 
15 #ifndef __XEN_DRIVERS_BLOCK_H__
16 #define __XEN_DRIVERS_BLOCK_H__
17 #include <xen/interface/io/blkif.h>
18 
19 struct xlbd_type_info
20 {
21 	int partn_shift;
22 	int disks_per_major;
23 	char *devname;
24 	char *diskname;
25 };
26 
27 struct xlbd_major_info
28 {
29 	int major;
30 	int index;
31 	int usage;
32 	struct xlbd_type_info *type;
33 };
34 
35 struct blk_shadow {
36 	blkif_request_t req;
37 	unsigned long request;
38 	unsigned long frame[BLKIF_MAX_SEGMENTS_PER_REQUEST];
39 };
40 
41 #define BLK_RING_SIZE __RING_SIZE((blkif_sring_t *)0, PAGE_SIZE)
42 
43 
44 struct xb_softc {
45 	device_t		  xb_dev;
46 	struct disk		  *xb_disk;		/* disk params */
47 	struct bio_queue_head     xb_bioq;		/* sort queue */
48 	int			  xb_unit;
49 	int			  xb_flags;
50 	struct blkfront_info      *xb_info;
51 	LIST_ENTRY(xb_softc)      entry;
52 #define XB_OPEN	(1<<0)		/* drive is open (can't shut down) */
53 };
54 
55 
56 /*
57  * We have one of these per vbd, whether ide, scsi or 'other'.  They
58  * hang in private_data off the gendisk structure. We may end up
59  * putting all kinds of interesting stuff here :-)
60  */
61 struct blkfront_info
62 {
63 	device_t xbdev;
64 	dev_t dev;
65  	struct gendisk *gd;
66 	int vdevice;
67 	blkif_vdev_t handle;
68 	int connected;
69 	int ring_ref;
70 	blkif_front_ring_t ring;
71 	unsigned int irq;
72 	struct xlbd_major_info *mi;
73 #if 0
74 	request_queue_t *rq;
75 	struct work_struct work;
76 #endif
77 	struct gnttab_free_callback callback;
78 	struct blk_shadow shadow[BLK_RING_SIZE];
79 	unsigned long shadow_free;
80 	struct xb_softc *sc;
81 	int feature_barrier;
82 	int is_ready;
83 	/**
84 	 * The number of people holding this device open.  We won't allow a
85 	 * hot-unplug unless this is 0.
86 	 */
87 	int users;
88 };
89 /* Note that xlvbd_add doesn't call add_disk for you: you're expected
90    to call add_disk on info->gd once the disk is properly connected
91    up. */
92 int xlvbd_add(device_t, blkif_sector_t capacity, int device,
93 	      uint16_t vdisk_info, uint16_t sector_size, struct blkfront_info *info);
94 void xlvbd_del(struct blkfront_info *info);
95 
96 #endif /* __XEN_DRIVERS_BLOCK_H__ */
97 
98