DeviceQueue: Direct Solarflare queue implementation
[barrelfish] / usr / drivers / solarflare / sfn5122f_devif_direct.c
1 /*
2  * Copyright (c) 2007, 2008, 2009, 2010, 2011, 2012, ETH Zurich.
3  * All rights reserved.
4  *
5  * This file is distributed under the terms in the attached LICENSE file.
6  * If you do not find this file, copies can be found by writing to:
7  * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
8  */
9
10 #include <stdlib.h>
11 #include <stdio.h>
12 #include <time.h>
13 #include <barrelfish/barrelfish.h>
14 #include <barrelfish/waitset.h>
15 #include <barrelfish/deferred.h>
16 #include <devif/queue_interface.h>
17 #include <devif/sfn5122f_devif_direct.h>
18 #include "sfn5122f.h"
19 #include "sfn5122f_queue.h"
20
21 errval_t sfn5122f_create_direct(struct devq* q, uint64_t flags)
22 {
23     struct capref tx_frame, rx_frame, ev_frame;
24     size_t tx_size, rx_size, ev_size;
25     void *tx_virt, *rx_virt, *ev_virt;
26     struct sfn5122f_queue* queue;
27
28     struct sfn5122f_queue_ops ops = {
29         .update_txtail = NULL,
30         .update_rxtail = NULL
31      };
32    
33     /* Allocate memory for descriptor rings  
34        No difference for userspace networking*/
35     tx_size = sfn5122f_q_tx_ker_desc_size * TX_ENTRIES;
36     tx_virt = alloc_map_frame(VREGION_FLAGS_READ_WRITE, tx_size, &tx_frame);
37     if (tx_virt == NULL) {
38         return SFN_ERR_ALLOC_QUEUE;
39     }
40
41     rx_size = sfn5122f_q_rx_user_desc_size * RX_ENTRIES;
42     rx_virt = alloc_map_frame(VREGION_FLAGS_READ_WRITE, rx_size, &rx_frame);
43     if (rx_virt == NULL) {
44         return SFN_ERR_ALLOC_QUEUE;
45     }
46
47     ev_size = sfn5122f_q_event_entry_size * EV_ENTRIES;
48     ev_virt = alloc_map_frame(VREGION_FLAGS_READ_WRITE, ev_size, &ev_frame);
49     if (ev_virt == NULL) {
50         return SFN_ERR_ALLOC_QUEUE;
51     }
52
53     queue = sfn5122f_queue_init(tx_virt, TX_ENTRIES, rx_virt, RX_ENTRIES,
54                                 ev_virt, EV_ENTRIES, &ops,  NULL, true);
55
56  //   q->q = queue;
57     // TODO set queue state
58     return SYS_ERR_OK;
59 }
60
61 errval_t sfn5122f_register_direct(struct devq* q, struct capref cap,
62                                   regionid_t rid) 
63 {
64    return SYS_ERR_OK;
65 }
66
67 errval_t sfn5122f_deregister_direct(struct devq* q, regionid_t rid) 
68 {
69     return SYS_ERR_OK;
70 }
71
72
73 errval_t sfn5122f_control_direct(struct devq* q, uint64_t cmd, uint64_t value)
74 {
75     return SYS_ERR_OK;
76 }
77
78
79 errval_t sfn5122f_notify_direct(struct devq* q, uint8_t num_slots)
80 {
81     return SYS_ERR_OK;
82 }
83
84 errval_t sfn5122f_destroy_direct(struct devq* q)
85 {
86     return SYS_ERR_OK;
87 }
88
89
90 errval_t sfn5122f_enqueue_direct(struct devq* q, regionid_t rid, bufferid_t bid, 
91                                  lpaddr_t base, size_t len, uint64_t flags)
92 {
93     return SYS_ERR_OK;
94 }
95
96 errval_t sfn5122f_dequeue_direct(struct devq* q, regionid_t* rid, bufferid_t* bid, 
97                                  lpaddr_t* base, size_t* len, uint64_t* flags)
98 {
99     return SYS_ERR_OK;
100 }
101