pr_debug("(file=%s, line=%d) " _f, \
__FILE__ , __LINE__ , ## _a )
+struct backend_info;
+
typedef struct tpmif_st {
struct list_head tpmif_list;
/* Unique identifier for this interface. */
struct list_head list; /* scheduling list */
atomic_t refcnt;
- long int tpm_instance;
+ struct backend_info *bi;
unsigned long mmap_vstart;
grant_handle_t shmem_handle;
} tpmif_t;
void tpmif_disconnect_complete(tpmif_t * tpmif);
-tpmif_t *tpmif_find(domid_t domid, long int instance);
+tpmif_t *tpmif_find(domid_t domid, struct backend_info *bi);
void tpmif_interface_init(void);
void tpmif_interface_exit(void);
void tpmif_schedule_work(tpmif_t * tpmif);
int tpmif_map(tpmif_t *tpmif, unsigned long shared_page, unsigned int evtchn);
irqreturn_t tpmif_be_int(int irq, void *dev_id, struct pt_regs *regs);
+long int tpmback_get_instance(struct backend_info *bi);
+
int vtpm_release_packets(tpmif_t * tpmif, int send_msgs);
+
#define tpmif_get(_b) (atomic_inc(&(_b)->refcnt))
#define tpmif_put(_b) \
do { \
LIST_HEAD(tpmif_list);
-static tpmif_t *alloc_tpmif(domid_t domid, long int instance)
+static tpmif_t *alloc_tpmif(domid_t domid, struct backend_info *bi)
{
tpmif_t *tpmif;
memset(tpmif, 0, sizeof (*tpmif));
tpmif->domid = domid;
tpmif->status = DISCONNECTED;
- tpmif->tpm_instance = instance;
+ tpmif->bi = bi;
snprintf(tpmif->devname, sizeof(tpmif->devname), "tpmif%d", domid);
atomic_set(&tpmif->refcnt, 1);
kmem_cache_free(tpmif_cachep, tpmif);
}
-tpmif_t *tpmif_find(domid_t domid, long int instance)
+tpmif_t *tpmif_find(domid_t domid, struct backend_info *bi)
{
tpmif_t *tpmif;
list_for_each_entry(tpmif, &tpmif_list, tpmif_list) {
- if (tpmif->tpm_instance == instance) {
+ if (tpmif->bi == bi) {
if (tpmif->domid == domid) {
tpmif_get(tpmif);
return tpmif;
}
}
- return alloc_tpmif(domid, instance);
+ return alloc_tpmif(domid, bi);
}
static int map_frontend_page(tpmif_t *tpmif, unsigned long shared_page)
if (NULL != pak) {
if (tpmif) {
pak->tpmif = tpmif;
- pak->tpm_instance = tpmif->tpm_instance;
+ pak->tpm_instance = tpmback_get_instance(tpmif->bi);
tpmif_get(tpmif);
}
pak->data_len = size;
static void frontend_changed(struct xenbus_device *dev,
enum xenbus_state frontend_state);
+long int tpmback_get_instance(struct backend_info *bi)
+{
+ long int res = -1;
+ if (bi && bi->is_instance_set)
+ res = bi->instance;
+ return res;
+}
+
static int tpmback_remove(struct xenbus_device *dev)
{
struct backend_info *be = dev->dev.driver_data;
be->backend_watch.node = NULL;
}
if (be->tpmif) {
+ be->tpmif->bi = NULL;
vtpm_release_packets(be->tpmif, 0);
tpmif_put(be->tpmif);
be->tpmif = NULL;
break;
case XenbusStateClosing:
- be->tpmif->tpm_instance = -1;
+ be->instance = -1;
break;
case XenbusStateClosed:
}
if (!be->tpmif) {
- be->tpmif = tpmif_find(dev->otherend_id,
- be->instance);
+ be->tpmif = tpmif_find(dev->otherend_id, be);
if (IS_ERR(be->tpmif)) {
err = PTR_ERR(be->tpmif);
be->tpmif = NULL;