int flags;
struct mutex lock;
+ struct mutex op_lock;
};
enum power_types {
return;
}
+ mutex_lock(&v_power->op_lock);
mutex_lock(&v_power->lock);
memset(power_data, 0, __MAX_BUF_POWER);
memset(&v_power->msginfo, 0, sizeof(v_power->msginfo));
err = virtqueue_add_outbuf(v_power->vq, v_power->sg_vq, 1, &v_power->msginfo, GFP_ATOMIC);
if (err < 0) {
DLOG(KERN_ERR, "failed to add buffer to virtqueue (err = %d)", err);
+ mutex_unlock(&v_power->op_lock);
return;
}
virtqueue_kick(v_power->vq);
+ mutex_unlock(&v_power->op_lock);
}
static int get_power_data(int type, char* data)
return -1;
}
+ mutex_lock(&v_power->op_lock);
mutex_lock(&v_power->lock);
memset(&v_power->msginfo, 0, sizeof(v_power->msginfo));
err = virtqueue_add_sgs(v_power->vq, sgs, 1, 1, &v_power->msginfo, GFP_ATOMIC);
if (err < 0) {
DLOG(KERN_ERR, "failed to add buffer to virtqueue (err = %d)", err);
+ mutex_unlock(&v_power->op_lock);
return -1;
}
v_power->flags = 0;
memcpy(data, power_data, strlen(power_data));
mutex_unlock(&v_power->lock);
+ mutex_unlock(&v_power->op_lock);
return 0;
}
}
mutex_init(&v_power->lock);
+ mutex_init(&v_power->op_lock);
DLOG(KERN_INFO, "Power probe completes");