network: removed hardcoded MAC address for solarflare card
authorRoni Häcki <roni.haecki@inf.ethz.ch>
Wed, 29 Mar 2017 13:36:36 +0000 (15:36 +0200)
committerRoni Häcki <roni.haecki@inf.ethz.ch>
Wed, 29 Mar 2017 13:36:36 +0000 (15:36 +0200)
Signed-off-by: Roni Häcki <roni.haecki@inf.ethz.ch>

if/sfn5122f_devif.if
lib/devif/backends/net/solarflare/devif_backend_solarflare.c
lib/devif/backends/net/solarflare/hw_queue.h
lib/net_interfaces/interface_raw.c
usr/drivers/solarflare/sfn5122f_cdriver.c

index 57c65eb..c9cd23c 100644 (file)
@@ -19,7 +19,8 @@ interface sfn5122f_devif "sfn5122f devif communication interface" {
     // access configuration registers
     rpc create_queue(in cap frame, in bool user, in bool interrupt,
                      in uint8 core, in uint8 vector,
-                     out uint16 qid, out cap regs, out errval err);
+                     out uint64 mac, out uint16 qid, 
+                     out cap regs, out errval err);
     rpc destroy_queue(in uint16 qid, out errval err);
 
     // add a memory region to the buffer table
index 5d52025..01bab30 100644 (file)
@@ -198,9 +198,11 @@ static errval_t sfn5122f_deregister(struct devq* q, regionid_t rid)
 }
 
 
-static errval_t sfn5122f_control(struct devq* q, uint64_t cmd, uint64_t value, uint64_t *result)
+static errval_t sfn5122f_control(struct devq* q, uint64_t cmd, uint64_t value, 
+                                 uint64_t *result)
 {
-    
+    struct sfn5122f_queue* queue = (struct sfn5122f_queue*) q;
+    *result = queue->mac;
     DEBUG_QUEUE("Control cmd=%lu value=%lu \n", cmd, value);
     return SYS_ERR_OK;
 }
@@ -535,7 +537,8 @@ errval_t sfn5122f_queue_create(struct sfn5122f_queue** q, sfn5122f_event_cb_t cb
         printf("Solarflare queue used in polling mode \n");
         err = queue->b->rpc_tx_vtbl.create_queue(queue->b, frame, userlevel,
                                                  interrupts,
-                                                 0, 0, &queue->id, &regs, &err2);
+                                                 0, 0, &queue->mac ,&queue->id, 
+                                                 &regs, &err2);
         if (err_is_fail(err) || err_is_fail(err2)) {
             err = err_is_fail(err) ? err: err2;
             return err;
@@ -549,8 +552,8 @@ errval_t sfn5122f_queue_create(struct sfn5122f_queue** q, sfn5122f_event_cb_t cb
         
         err = queue->b->rpc_tx_vtbl.create_queue(queue->b, frame, userlevel,
                                                  interrupts, queue->core,
-                                                 queue->vector, &queue->id,
-                                                 &regs, &err2);
+                                                 queue->vector, &queue->mac, 
+                                                 &queue->id, &regs, &err2);
         if (err_is_fail(err) || err_is_fail(err2)) {
             err = err_is_fail(err) ? err: err2;
             printf("Registering interrupt failed, continueing in polling mode \n");
index 63418cc..0ef8dc0 100644 (file)
@@ -95,6 +95,7 @@ struct sfn5122f_queue {
 
     // Direct interface fields
     uint16_t id;
+    uint64_t mac;
     struct capref frame;
     sfn5122f_t *device;
     void* device_va;
index 4fd377c..4db1ed2 100644 (file)
@@ -253,11 +253,13 @@ void net_if_init(const char* cardname, uint64_t qid)
     } else if ((strcmp(cardname, "sfn5122f") == 0) && qid != 0) {
         direct = true;
         struct sfn5122f_queue* sfn5122f;
-        err = sfn5122f_queue_create(&sfn5122f, int_handler, false, true);
+        err = sfn5122f_queue_create(&sfn5122f, int_handler, 
+                                    false /*userlevel network feature*/, 
+                                    true /* user interrupts*/);
         assert(err_is_ok(err));
 
         devq_direct = (struct devq*) sfn5122f; 
-        card_mac = 0x000f530748d4; // TODO 
+        //card_mac = 0x000f530748d4; // TODO 
     } else {
         USER_PANIC("Unknown card name \n");
     }
@@ -265,9 +267,13 @@ void net_if_init(const char* cardname, uint64_t qid)
     buffers_init(BUFFER_COUNT);
 
     // Get MAC address
-    if (!direct) {
+    if(!direct) {
         err = devq_control((struct devq *)devq_rx, 0, 0, &card_mac);
         assert(err_is_ok(err));
+    } else {
+        err = devq_control((struct devq *)devq_direct, 0, 0, &card_mac);
+        printf("MAC %16lX \n", card_mac);
+        assert(err_is_ok(err));
     }
 
     initialized = true;
index 8fa0944..5efff9e 100644 (file)
@@ -1418,7 +1418,7 @@ static void cd_create_queue(struct sfn5122f_devif_binding *b, struct capref fram
 
     if (n == -1) {
         err = NIC_ERR_ALLOC_QUEUE;
-        err = b->tx_vtbl.create_queue_response(b, NOP_CONT, 0, NULL_CAP, err);
+        err = b->tx_vtbl.create_queue_response(b, NOP_CONT, 0, 0, NULL_CAP, err);
         //err = b->tx_vtbl.create_queue_response(b, NOP_CONT, 0, err);
         assert(err_is_ok(err));
     }
@@ -1458,7 +1458,7 @@ static void cd_create_queue(struct sfn5122f_devif_binding *b, struct capref fram
        queues[n].rx_buf_tbl == -1){
         err = NIC_ERR_ALLOC_QUEUE;
         //err = b->tx_vtbl.create_queue_response(b, NOP_CONT, 0, err);
-        err = b->tx_vtbl.create_queue_response(b, NOP_CONT, 0, NULL_CAP, err);
+        err = b->tx_vtbl.create_queue_response(b, NOP_CONT, 0, 0, NULL_CAP, err);
         assert(err_is_ok(err));
     }
 
@@ -1472,7 +1472,8 @@ static void cd_create_queue(struct sfn5122f_devif_binding *b, struct capref fram
     err = cap_copy(regs, *regframe);
     assert(err_is_ok(err));
 
-    err = b->tx_vtbl.create_queue_response(b, NOP_CONT, n, regs, SYS_ERR_OK);
+    err = b->tx_vtbl.create_queue_response(b, NOP_CONT, d_mac[pci_function], n, 
+                                           regs, SYS_ERR_OK);
     assert(err_is_ok(err));
     DEBUG("cd_create_queue end\n");
 }