xref: /freebsd/sys/dev/xen/blkfront/block.h (revision 89e0f4d24c4a430a0893930e4400ff6a63e63864)
189e0f4d2SKip Macy /*
289e0f4d2SKip Macy  *
389e0f4d2SKip Macy  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
489e0f4d2SKip Macy  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
589e0f4d2SKip Macy  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
689e0f4d2SKip Macy  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
789e0f4d2SKip Macy  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
889e0f4d2SKip Macy  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
989e0f4d2SKip Macy  * IN THE SOFTWARE.
1089e0f4d2SKip Macy  *
1189e0f4d2SKip Macy  * $FreeBSD$
1289e0f4d2SKip Macy  */
1389e0f4d2SKip Macy 
1489e0f4d2SKip Macy 
1589e0f4d2SKip Macy #ifndef __XEN_DRIVERS_BLOCK_H__
1689e0f4d2SKip Macy #define __XEN_DRIVERS_BLOCK_H__
1789e0f4d2SKip Macy #include <xen/interface/io/blkif.h>
1889e0f4d2SKip Macy 
1989e0f4d2SKip Macy struct xlbd_type_info
2089e0f4d2SKip Macy {
2189e0f4d2SKip Macy 	int partn_shift;
2289e0f4d2SKip Macy 	int disks_per_major;
2389e0f4d2SKip Macy 	char *devname;
2489e0f4d2SKip Macy 	char *diskname;
2589e0f4d2SKip Macy };
2689e0f4d2SKip Macy 
2789e0f4d2SKip Macy struct xlbd_major_info
2889e0f4d2SKip Macy {
2989e0f4d2SKip Macy 	int major;
3089e0f4d2SKip Macy 	int index;
3189e0f4d2SKip Macy 	int usage;
3289e0f4d2SKip Macy 	struct xlbd_type_info *type;
3389e0f4d2SKip Macy };
3489e0f4d2SKip Macy 
3589e0f4d2SKip Macy struct blk_shadow {
3689e0f4d2SKip Macy 	blkif_request_t req;
3789e0f4d2SKip Macy 	unsigned long request;
3889e0f4d2SKip Macy 	unsigned long frame[BLKIF_MAX_SEGMENTS_PER_REQUEST];
3989e0f4d2SKip Macy };
4089e0f4d2SKip Macy 
4189e0f4d2SKip Macy #define BLK_RING_SIZE __RING_SIZE((blkif_sring_t *)0, PAGE_SIZE)
4289e0f4d2SKip Macy 
4389e0f4d2SKip Macy 
4489e0f4d2SKip Macy struct xb_softc {
4589e0f4d2SKip Macy 	device_t		  xb_dev;
4689e0f4d2SKip Macy 	struct disk		  *xb_disk;		/* disk params */
4789e0f4d2SKip Macy 	struct bio_queue_head     xb_bioq;		/* sort queue */
4889e0f4d2SKip Macy 	int			  xb_unit;
4989e0f4d2SKip Macy 	int			  xb_flags;
5089e0f4d2SKip Macy 	struct blkfront_info      *xb_info;
5189e0f4d2SKip Macy 	LIST_ENTRY(xb_softc)      entry;
5289e0f4d2SKip Macy #define XB_OPEN	(1<<0)		/* drive is open (can't shut down) */
5389e0f4d2SKip Macy };
5489e0f4d2SKip Macy 
5589e0f4d2SKip Macy 
5689e0f4d2SKip Macy /*
5789e0f4d2SKip Macy  * We have one of these per vbd, whether ide, scsi or 'other'.  They
5889e0f4d2SKip Macy  * hang in private_data off the gendisk structure. We may end up
5989e0f4d2SKip Macy  * putting all kinds of interesting stuff here :-)
6089e0f4d2SKip Macy  */
6189e0f4d2SKip Macy struct blkfront_info
6289e0f4d2SKip Macy {
6389e0f4d2SKip Macy 	struct xenbus_device *xbdev;
6489e0f4d2SKip Macy 	dev_t dev;
6589e0f4d2SKip Macy  	struct gendisk *gd;
6689e0f4d2SKip Macy 	int vdevice;
6789e0f4d2SKip Macy 	blkif_vdev_t handle;
6889e0f4d2SKip Macy 	int connected;
6989e0f4d2SKip Macy 	int ring_ref;
7089e0f4d2SKip Macy 	blkif_front_ring_t ring;
7189e0f4d2SKip Macy 	unsigned int irq;
7289e0f4d2SKip Macy 	struct xlbd_major_info *mi;
7389e0f4d2SKip Macy #if 0
7489e0f4d2SKip Macy 	request_queue_t *rq;
7589e0f4d2SKip Macy 	struct work_struct work;
7689e0f4d2SKip Macy #endif
7789e0f4d2SKip Macy 	struct gnttab_free_callback callback;
7889e0f4d2SKip Macy 	struct blk_shadow shadow[BLK_RING_SIZE];
7989e0f4d2SKip Macy 	unsigned long shadow_free;
8089e0f4d2SKip Macy 	struct xb_softc *sc;
8189e0f4d2SKip Macy 	int feature_barrier;
8289e0f4d2SKip Macy 	int is_ready;
8389e0f4d2SKip Macy 	/**
8489e0f4d2SKip Macy 	 * The number of people holding this device open.  We won't allow a
8589e0f4d2SKip Macy 	 * hot-unplug unless this is 0.
8689e0f4d2SKip Macy 	 */
8789e0f4d2SKip Macy 	int users;
8889e0f4d2SKip Macy };
8989e0f4d2SKip Macy /* Note that xlvbd_add doesn't call add_disk for you: you're expected
9089e0f4d2SKip Macy    to call add_disk on info->gd once the disk is properly connected
9189e0f4d2SKip Macy    up. */
9289e0f4d2SKip Macy int xlvbd_add(blkif_sector_t capacity, int device,
9389e0f4d2SKip Macy 	      uint16_t vdisk_info, uint16_t sector_size, struct blkfront_info *info);
9489e0f4d2SKip Macy void xlvbd_del(struct blkfront_info *info);
9589e0f4d2SKip Macy 
9689e0f4d2SKip Macy #endif /* __XEN_DRIVERS_BLOCK_H__ */
9789e0f4d2SKip Macy 
98