devif: networking backends to destroy called from queue interface
authorRoni Häcki <roni.haecki@inf.ethz.ch>
Mon, 28 Aug 2017 14:05:18 +0000 (16:05 +0200)
committerRoni Häcki <roni.haecki@inf.ethz.ch>
Mon, 28 Aug 2017 14:05:18 +0000 (16:05 +0200)
Signed-off-by: Roni Häcki <roni.haecki@inf.ethz.ch>

include/devif/backends/net/e1000_devif.h
include/devif/backends/net/e10k_devif.h
include/devif/backends/net/sfn5122f_devif.h
lib/devif/backends/net/e1000/e1000.c
lib/devif/backends/net/e10k/devif_backend_e10k.c
lib/devif/backends/net/solarflare/devif_backend_solarflare.c
usr/tests/devif/queue_interface.c

index 099effe..95a2a00 100644 (file)
@@ -16,6 +16,5 @@ struct e1000_queue;
 errval_t e1000_queue_create(struct e1000_queue** q, uint32_t vendor, uint32_t deviceid,
     uint32_t bus, uint32_t device, uint32_t function, unsigned interrupt_mode,
     void (*isr)(void *));
-errval_t e1000_queue_destroy(struct e1000_queue* q);
 
 #endif
index 3119d2f..d27d5a3 100644 (file)
@@ -31,8 +31,6 @@ typedef void (*e10k_event_cb_t)(void* q);
 */
 errval_t e10k_queue_create(struct e10k_queue** q, e10k_event_cb_t cb, 
                            bool use_vf, bool interrupts, bool default_q);
-errval_t e10k_queue_destroy(struct e10k_queue* q);
-
 
 /**
 * @brief get the queue id of this queue handle. The returned id corresponds
index 3eea58f..1f2a5d1 100644 (file)
@@ -14,7 +14,5 @@ typedef void (*sfn5122f_event_cb_t)(void* q);
 
 errval_t sfn5122f_queue_create(struct sfn5122f_queue** q, sfn5122f_event_cb_t cb, 
                                bool userspace, bool interrupts, bool default_q);
-errval_t sfn5122f_queue_destroy(struct sfn5122f_queue* q);
-
 uint64_t sfn5122f_queue_get_id(struct sfn5122f_queue* q);
 #endif
index 8ec2115..3a052eb 100644 (file)
@@ -232,6 +232,14 @@ static errval_t e1000_notify(struct devq* q)
     return SYS_ERR_OK;
 }
 
+static errval_t e1000_destroy(struct devq * queue)
+{
+    e1000_queue_t* q = (e1000_queue_t *) queue;
+    free(q);
+    // TODO rest of the cleanup
+    return SYS_ERR_OK;
+}
+
 /*****************************************************************
  * Reset the device and disable interrupts.
  *
@@ -851,7 +859,6 @@ static void e1000_init(e1000_queue_t *device, unsigned interrupt_mode)
     }
 }
 
-
 errval_t e1000_queue_create(e1000_queue_t ** q, uint32_t vendor, uint32_t deviceid,
     uint32_t bus, uint32_t pci_device, uint32_t function, unsigned interrupt_mode,
     void (*isr)(void *))
@@ -896,18 +903,13 @@ errval_t e1000_queue_create(e1000_queue_t ** q, uint32_t vendor, uint32_t device
     device->q.f.dereg = e1000_deregister;
     device->q.f.ctrl = e1000_control;
     device->q.f.notify = e1000_notify;
+    device->q.f.destroy = e1000_destroy;
     
     *q = device;
 
     return SYS_ERR_OK;
 }
 
-errval_t e1000_queue_destroy(e1000_queue_t * q)
-{
-    return SYS_ERR_OK;
-}
-
-
 e1000_mac_type_t e1000_get_mac_type(uint32_t vendor, uint32_t device_id)
 {
     if (vendor == PCI_VENDOR_INTEL) {
index a7531a1..fb8ee67 100644 (file)
@@ -471,6 +471,14 @@ static errval_t e10k_notify(struct devq* q)
     return SYS_ERR_OK;
 }
 
+static errval_t e10k_destroy(struct devq* queue)
+{
+    struct e10k_queue* q = (struct e10k_queue*) queue;
+    free(q);
+    //TODO: rest of the cleanup
+    return SYS_ERR_OK;
+}
+
 /******************************************************************
  * Management functions
  *
@@ -534,16 +542,9 @@ static void connect_to_mngif(struct e10k_queue* q)
 }
 
 /*********************************************************
- * Queue creation and destruction
+ * Queue creation 
  */
 
-
-errval_t e10k_queue_destroy(struct e10k_queue* queue)
-{
-    //TODO: do the cleanup
-    return SYS_ERR_OK;
-}
-
 static errval_t map_device_memory(struct e10k_queue* q,
                                   struct capref regs)
 {
@@ -732,6 +733,7 @@ errval_t e10k_queue_create(struct e10k_queue** queue, e10k_event_cb_t cb,
     q->q.f.dereg = e10k_deregister;
     q->q.f.ctrl = e10k_control;
     q->q.f.notify = e10k_notify;
+    q->q.f.destroy = e10k_destroy;
 
 
     *queue = q;
index 172d37d..c8304d7 100644 (file)
@@ -475,6 +475,43 @@ static errval_t sfn5122f_dequeue(struct devq* q, regionid_t* rid, genoffset_t* o
     return err;
 }
 
+static errval_t sfn5122f_destroy(struct devq* queue)
+{
+    errval_t err, err2;
+    struct sfn5122f_queue* q;
+
+    q = (struct sfn5122f_queue*) queue;
+
+    err = q->b->rpc_tx_vtbl.destroy_queue(q->b, q->id, &err2);
+    if (err_is_fail(err) || err_is_fail(err2)) {
+        err = err_is_fail(err) ? err: err2;
+        return err;
+    }
+
+    err = vspace_unmap(q->device_va);
+    if (err_is_fail(err)) {
+        return err;
+    }
+
+    free(q->device);
+    free(q->b);
+
+    err = devq_destroy(&(q->q));
+    if (err_is_fail(err)){
+        return err;
+    }
+
+    err = sfn5122f_queue_free(q);
+    if (err_is_fail(err)) {
+        return err;
+    }
+
+    return SYS_ERR_OK;
+}
+
+
+
+
 static void interrupt_handler(void* arg)
 {
     struct sfn5122f_queue* queue = (struct sfn5122f_queue*) arg;
@@ -483,7 +520,6 @@ static void interrupt_handler(void* arg)
 }
 
 
-
 /**
  * Public functions
  *
@@ -618,7 +654,8 @@ errval_t sfn5122f_queue_create(struct sfn5122f_queue** q, sfn5122f_event_cb_t cb
     queue->q.f.dereg = sfn5122f_deregister;
     queue->q.f.ctrl = sfn5122f_control;
     queue->q.f.notify = sfn5122f_notify;
-    
+    queue->q.f.destroy = sfn5122f_destroy; 
+   
     *q = queue;
 
     queues[queue->id] = queue;
@@ -626,37 +663,6 @@ errval_t sfn5122f_queue_create(struct sfn5122f_queue** q, sfn5122f_event_cb_t cb
     return SYS_ERR_OK;
 }
 
-errval_t sfn5122f_queue_destroy(struct sfn5122f_queue* q)
-{
-    errval_t err, err2;
-    err = q->b->rpc_tx_vtbl.destroy_queue(q->b, q->id, &err2);
-    if (err_is_fail(err) || err_is_fail(err2)) {
-        err = err_is_fail(err) ? err: err2;
-        return err;
-    }
-
-    err = vspace_unmap(q->device_va);
-    if (err_is_fail(err)) {
-        return err;
-    }
-
-    free(q->device);
-    free(q->b);
-
-    err = devq_destroy(&(q->q));
-    if (err_is_fail(err)){
-        return err;
-    }
-
-    err = sfn5122f_queue_free(q);
-    if (err_is_fail(err)) {
-        return err;
-    }
-
-    return SYS_ERR_OK;
-}
-
-
 uint64_t sfn5122f_queue_get_id(struct sfn5122f_queue* q)
 {
     return q->id;    
index e675a44..ab68b37 100644 (file)
@@ -184,30 +184,6 @@ static struct devq* create_net_queue(char* card_name)
     return NULL;
 }
 
-static errval_t destroy_net_queue(struct devq* q, char* card_name)
-{
-    errval_t err;
-    if (strcmp(card_name, "sfn5122f") == 0) {
-        err = sfn5122f_queue_destroy((struct sfn5122f_queue*)q);
-        if (err_is_fail(err)){
-            USER_PANIC("Destroying devq failed \n");
-        }
-        return err;
-    }
-
-    if (strcmp(card_name, "e10k") == 0) {
-        err = e10k_queue_destroy((struct e10k_queue*)q);
-        if (err_is_fail(err)){
-            USER_PANIC("Destroying devq failed \n");
-        }
-        return err;
-    }
-
-    USER_PANIC("Unknown card name\n");
-
-    return SYS_ERR_OK;
-}
-
 static void test_net_tx(void)
 {
     num_tx = 0;
@@ -300,7 +276,7 @@ static void test_net_tx(void)
         USER_PANIC("Devq deregister tx failed \n");
     }
     
-    err = destroy_net_queue(q, card);
+    err = devq_destroy(q);
     if (err_is_fail(err)){
         printf("%s \n", err_getstring(err));
         USER_PANIC("Destroying %s queue failed \n", card);
@@ -394,7 +370,7 @@ static void test_net_rx(void)
         USER_PANIC("Devq deregister rx failed \n");
     }
    
-    err = destroy_net_queue(q, card);
+    err = devq_destroy(q);
     if (err_is_fail(err)){
         printf("%s \n", err_getstring(err));
         USER_PANIC("Destroying %s queue failed \n", card);