2023-06-26 11:44:57 -07:00
|
|
|
// SPDX-License-Identifier: BSD-2-Clause-Views
|
2022-05-04 09:03:37 -07:00
|
|
|
/*
|
2023-06-26 11:44:57 -07:00
|
|
|
* Copyright (c) 2019-2023 The Regents of the University of California
|
|
|
|
*/
|
2022-05-04 09:03:37 -07:00
|
|
|
|
|
|
|
#include "mqnic.h"
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
struct mqnic_port *mqnic_port_open(struct mqnic_if *interface, int index, struct mqnic_reg_block *port_rb)
|
|
|
|
{
|
|
|
|
struct mqnic_port *port = calloc(1, sizeof(struct mqnic_port));
|
|
|
|
|
|
|
|
if (!port)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
int offset = mqnic_reg_read32(port_rb->regs, MQNIC_RB_PORT_REG_OFFSET);
|
|
|
|
|
|
|
|
port->mqnic = interface->mqnic;
|
|
|
|
port->interface = interface;
|
|
|
|
|
|
|
|
port->index = index;
|
|
|
|
|
|
|
|
port->rb_list = mqnic_enumerate_reg_block_list(interface->regs, offset, interface->regs_size);
|
|
|
|
|
|
|
|
if (!port->rb_list)
|
|
|
|
{
|
|
|
|
fprintf(stderr, "Error: filed to enumerate blocks\n");
|
|
|
|
goto fail;
|
|
|
|
}
|
|
|
|
|
|
|
|
port->port_ctrl_rb = mqnic_find_reg_block(port->rb_list, MQNIC_RB_PORT_CTRL_TYPE, MQNIC_RB_PORT_CTRL_VER, 0);
|
|
|
|
|
|
|
|
if (!port->port_ctrl_rb) {
|
|
|
|
fprintf(stderr, "Error: port control register block not found\n");
|
|
|
|
goto fail;
|
|
|
|
}
|
|
|
|
|
|
|
|
port->port_features = mqnic_reg_read32(port->port_ctrl_rb->regs, MQNIC_RB_PORT_CTRL_REG_FEATURES);
|
|
|
|
|
|
|
|
return port;
|
|
|
|
|
|
|
|
fail:
|
|
|
|
mqnic_port_close(port);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
void mqnic_port_close(struct mqnic_port *port)
|
|
|
|
{
|
|
|
|
if (!port)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (port->rb_list)
|
|
|
|
mqnic_free_reg_block_list(port->rb_list);
|
|
|
|
|
|
|
|
free(port);
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t mqnic_port_get_tx_status(struct mqnic_port *port)
|
|
|
|
{
|
|
|
|
return mqnic_reg_read32(port->port_ctrl_rb->regs, MQNIC_RB_PORT_CTRL_REG_TX_STATUS);
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t mqnic_port_get_rx_status(struct mqnic_port *port)
|
|
|
|
{
|
|
|
|
return mqnic_reg_read32(port->port_ctrl_rb->regs, MQNIC_RB_PORT_CTRL_REG_RX_STATUS);
|
|
|
|
}
|