aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/virtio
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2008-02-04 23:49:57 -0500
committerRusty Russell <rusty@rustcorp.com.au>2008-02-04 07:49:58 -0500
commit18445c4d501b9ab4336f66ef46b092661ddaf336 (patch)
tree9d23185f207d912942890cf047d1d3200806b401 /drivers/virtio
parenta586d4f6016f7139d8c26df0e6927131168d3b5b (diff)
virtio: explicit enable_cb/disable_cb rather than callback return.
It seems that virtio_net wants to disable callbacks (interrupts) before calling netif_rx_schedule(), so we can't use the return value to do so. Rename "restart" to "cb_enable" and introduce "cb_disable" hook: callback now returns void, rather than a boolean. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Diffstat (limited to 'drivers/virtio')
-rw-r--r--drivers/virtio/virtio_ring.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
index 1dc04b6684e6..342bb0363fbe 100644
--- a/drivers/virtio/virtio_ring.c
+++ b/drivers/virtio/virtio_ring.c
@@ -220,7 +220,17 @@ static void *vring_get_buf(struct virtqueue *_vq, unsigned int *len)
220 return ret; 220 return ret;
221} 221}
222 222
223static bool vring_restart(struct virtqueue *_vq) 223static void vring_disable_cb(struct virtqueue *_vq)
224{
225 struct vring_virtqueue *vq = to_vvq(_vq);
226
227 START_USE(vq);
228 BUG_ON(vq->vring.avail->flags & VRING_AVAIL_F_NO_INTERRUPT);
229 vq->vring.avail->flags |= VRING_AVAIL_F_NO_INTERRUPT;
230 END_USE(vq);
231}
232
233static bool vring_enable_cb(struct virtqueue *_vq)
224{ 234{
225 struct vring_virtqueue *vq = to_vvq(_vq); 235 struct vring_virtqueue *vq = to_vvq(_vq);
226 236
@@ -254,8 +264,8 @@ irqreturn_t vring_interrupt(int irq, void *_vq)
254 return IRQ_HANDLED; 264 return IRQ_HANDLED;
255 265
256 pr_debug("virtqueue callback for %p (%p)\n", vq, vq->vq.callback); 266 pr_debug("virtqueue callback for %p (%p)\n", vq, vq->vq.callback);
257 if (vq->vq.callback && !vq->vq.callback(&vq->vq)) 267 if (vq->vq.callback)
258 vq->vring.avail->flags |= VRING_AVAIL_F_NO_INTERRUPT; 268 vq->vq.callback(&vq->vq);
259 269
260 return IRQ_HANDLED; 270 return IRQ_HANDLED;
261} 271}
@@ -264,7 +274,8 @@ static struct virtqueue_ops vring_vq_ops = {
264 .add_buf = vring_add_buf, 274 .add_buf = vring_add_buf,
265 .get_buf = vring_get_buf, 275 .get_buf = vring_get_buf,
266 .kick = vring_kick, 276 .kick = vring_kick,
267 .restart = vring_restart, 277 .disable_cb = vring_disable_cb,
278 .enable_cb = vring_enable_cb,
268 .shutdown = vring_shutdown, 279 .shutdown = vring_shutdown,
269}; 280};
270 281
@@ -272,7 +283,7 @@ struct virtqueue *vring_new_virtqueue(unsigned int num,
272 struct virtio_device *vdev, 283 struct virtio_device *vdev,
273 void *pages, 284 void *pages,
274 void (*notify)(struct virtqueue *), 285 void (*notify)(struct virtqueue *),
275 bool (*callback)(struct virtqueue *)) 286 void (*callback)(struct virtqueue *))
276{ 287{
277 struct vring_virtqueue *vq; 288 struct vring_virtqueue *vq;
278 unsigned int i; 289 unsigned int i;