// 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
}
-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;
}
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, ®s, &err2);
+ 0, 0, &queue->mac ,&queue->id,
+ ®s, &err2);
if (err_is_fail(err) || err_is_fail(err2)) {
err = err_is_fail(err) ? err: err2;
return err;
err = queue->b->rpc_tx_vtbl.create_queue(queue->b, frame, userlevel,
interrupts, queue->core,
- queue->vector, &queue->id,
- ®s, &err2);
+ queue->vector, &queue->mac,
+ &queue->id, ®s, &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");
// Direct interface fields
uint16_t id;
+ uint64_t mac;
struct capref frame;
sfn5122f_t *device;
void* device_va;
} 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");
}
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;
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));
}
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));
}
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");
}