/* virtpci.h
 *
 * Copyright (C) 2010 - 2013 UNISYS CORPORATION
 * All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or (at
 * your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
 * NON INFRINGEMENT.  See the GNU General Public License for more
 * details.
 */

/*
 * Unisys Virtual PCI driver header
 */

#ifndef __VIRTPCI_H__
#define __VIRTPCI_H__

#include "uisqueue.h"
#include <linux/version.h>
#include <linux/uuid.h>

#define PCI_DEVICE_ID_VIRTHBA 0xAA00
#define PCI_DEVICE_ID_VIRTNIC 0xAB00

struct scsi_adap_info {
	void *scsihost;		/* scsi host if this device is a scsi hba */
	struct vhba_wwnn wwnn;	/* the world wide node name of vhba */
	struct vhba_config_max max;	/* various max specifications used
					 * to config vhba */
};

struct net_adap_info {
	struct net_device *netdev;	/* network device if this
					 * device is a NIC */
	u8 mac_addr[MAX_MACADDR_LEN];
	int num_rcv_bufs;
	unsigned mtu;
	uuid_le zoneGuid;
};

typedef enum {
	VIRTHBA_TYPE = 0,
	VIRTNIC_TYPE = 1,
	VIRTBUS_TYPE = 6,
} VIRTPCI_DEV_TYPE;

struct virtpci_dev {
	VIRTPCI_DEV_TYPE devtype;	/* indicates type of the
					 * virtual pci device */
	struct virtpci_driver *mydriver;	/* which driver has allocated
						 * this device */
	unsigned short vendor;	/* vendor id for device */
	unsigned short device;	/* device id for device */
	U32 busNo;		/* number of bus on which device exists */
	U32 deviceNo;		/* device's number on the bus */
	struct InterruptInfo intr;	/* interrupt info */
	struct device generic_dev;	/* generic device */
	union {
		struct scsi_adap_info scsi;
		struct net_adap_info net;
	};

	struct uisqueue_info queueinfo;	/* holds ptr to channel where cmds &
					 * rsps are queued & retrieved */
	struct virtpci_dev *next;	/* points to next virtpci device */
};

struct virtpci_driver {
	struct list_head node;
	const char *name;	/* the name of the driver in sysfs */
	const char *version;
	const char *vertag;
	const char *build_date;
	const char *build_time;
	const struct pci_device_id *id_table;	/* must be non-NULL for probe
						 * to be called */
	int (*probe)(struct virtpci_dev *dev,
		      const struct pci_device_id *id); /* device inserted */
	void (*remove)(struct virtpci_dev *dev); /* Device removed (NULL if
						    * not a hot-plug capable
						    * driver) */
	int (*suspend)(struct virtpci_dev *dev,
			u32 state);		   /* Device suspended */
	int (*resume)(struct virtpci_dev *dev);	/* Device woken up */
	int (*enable_wake)(struct virtpci_dev *dev,
			    u32 state, int enable);	/* Enable wake event */
	struct device_driver core_driver;	/* VIRTPCI core fills this in */
};

#define	driver_to_virtpci_driver(in_drv) \
	container_of(in_drv, struct virtpci_driver, core_driver)
#define device_to_virtpci_dev(in_dev) \
	container_of(in_dev, struct virtpci_dev, generic_dev)

int virtpci_register_driver(struct virtpci_driver *);
void virtpci_unregister_driver(struct virtpci_driver *);

#endif /* __VIRTPCI_H__ */
