60 #define ARM_CQ_UAR_CQ_CI_MASK 0xffffff 61 #define ARM_CQ_UAR_CMDSN_MASK 3 62 #define ARM_CQ_UAR_CMDSN_OFFSET 28 63 #define ARM_CQ_UAR_CQ_CI_OFFSET 0x20 64 if (
port->port_priv.device->device_cap.support_bar_cq_ctrl ) {
70 port->port_priv.arm_cq_doorbell_record->dword[0] = cq_uar.
dword[1];
71 port->port_priv.arm_cq_doorbell_record->dword[1] = cq_uar.
dword[0];
73 val32 = (
port->eth_cq->next_idx & 0xffffff );
81 nodnic_port_data_flow_gw *ptr =
port->port_priv.data_flow_gw;
85 if (
port->port_priv.device->device_cap.crspace_doorbells == 0 ) {
86 val = (
port->eth_cq->next_idx & 0xffff );
96 data = ( ( (
port->eth_cq->next_idx & 0xffff ) << 16 ) | 0x0080 );
121 zalloc(
sizeof(*flexboot_nodnic_cq));
122 if ( flexboot_nodnic_cq ==
NULL ) {
133 "nodnic_port_create_cq failed");
142 "failed to query cqn");
150 free(flexboot_nodnic_cq);
170 free(flexboot_nodnic_cq);
193 if ( out_qpn ==
qpn )
217 unsigned long wqe_idx;
218 unsigned long wqe_idx_mask;
237 "flexboot_nodnic %p CQN %#lx unknown %s QPN %#lx\n",
246 wqe_idx_mask = ( wq->
num_wqes - 1 );
248 "NODNIC %p CQN %#lx QPN %#lx %s WQE %#lx completed:\n",
254 iobuf = wq->
iobufs[wqe_idx & wqe_idx_mask];
255 if ( iobuf ==
NULL ) {
257 "NODNIC %p CQN %#lx QPN %#lx empty %s WQE %#lx\n",
267 }
else if (
rc != 0 ) {
275 memset ( &recv_dest, 0,
sizeof ( recv_dest ) );
277 memset ( &recv_source, 0,
sizeof ( recv_source ) );
278 switch (
qp->type ) {
292 &recv_source, iobuf,
rc );
310 unsigned int cqe_idx_mask;
316 cqe_idx_mask = ( cq->
num_cqes - 1 );
318 cqe_size * (cq->
next_idx & cqe_idx_mask);
333 cqe,
sizeof ( *cqe ) );
363 if ( flexboot_nodnic_qp ==
NULL ) {
376 "nodnic_port_create_qp failed");
380 free(flexboot_nodnic_qp);
414 free(flexboot_nodnic_qp);
446 unsigned int wqe_idx_mask;
447 unsigned long wqe_idx;
449 if ( (
port->port_priv.dma_state ==
FALSE ) ||
458 wqe_idx_mask = ( wq->
num_wqes - 1 );
459 if ( wq->
iobufs[wqe_idx & wqe_idx_mask] ) {
465 wqbb = &send_ring->
wqe_virt[wqe_idx & wqe_idx_mask];
466 wq->
iobufs[wqe_idx & wqe_idx_mask] = iobuf;
469 fill_send_wqe[
qp->type] !=
NULL );
471 fill_send_wqe[
qp->type] ( ibdev,
qp, av, iobuf,
512 unsigned int wqe_idx_mask;
516 wqe_idx_mask = ( wq->
num_wqes - 1 );
519 "flexboot_nodnic %p QPN %#lx receive queue full\n",
560 DBG (
"%s: ibdev = NULL!!!\n", __FUNCTION__ );
569 DBG2(
"%s: port %d is closed\n", __FUNCTION__,
port->ibdev->port );
579 DBG(
"%s: port %d physical link is up\n", __FUNCTION__,
607 "nodnic_port_add_mac_filter failed");
628 "nodnic_port_remove_mac_filter failed");
703 #define FLEX_NODNIC_TX_POLL_TOUT 500000 704 #define FLEX_NODNIC_TX_POLL_USLEEP 10 710 int keep_polling = 0;
719 keep_polling += ( wq->
fill > 0 );
722 }
while ( keep_polling && (
timeout-- > 0 ) );
750 #define FLEXBOOT_NODNIC_ETH_NUM_SEND_WQES 64 753 #define FLEXBOOT_NODNIC_ETH_NUM_RECV_WQES 64 819 DBG (
"Received packet with error\n" );
824 if ( source ==
NULL ) {
825 DBG (
"Received packet without address vector\n" );
871 __FUNCTION__,
port->ibdev->port );
878 if ( dummy_cq ==
NULL ) {
881 goto err_create_dummy_cq;
889 &
port->eth_qp ) ) != 0 ) {
900 "nodnic_port_get_cq_size failed");
903 &
port->eth_cq ) ) != 0 ) {
905 "flexboot_nodnic %p port %d could not create completion queue\n",
910 port->eth_qp->send.cq =
port->eth_cq;
913 port->eth_qp->recv.cq =
port->eth_cq;
921 "nodnic_port_allocate_eq failed");
925 "nodnic_port_init failed");
933 "nodnic_port_get_qpn failed");
941 "nodnic_port_enable_dma failed");
946 "nodnic_port_set_promisc failed");
951 "nodnic_port_get_state failed");
953 port->type->state_change (
957 __FUNCTION__,
port->ibdev->port,
993 __FUNCTION__,
port->ibdev->port );
1000 "nodnic_port_set_promisc failed (status = %d)\n",
status );
1081 "failed to query mac high");
1086 "failed to query mac low");
1095 "flexboot_nodnic %p port %d could not register network device: %s\n",
1157 if ( ! ( flexboot_nodnic_priv->
port_mask & ( i + 1 ) ) )
1160 if (ibdev ==
NULL) {
1162 goto err_alloc_ibdev;
1164 flexboot_nodnic_priv->
port[i].
ibdev = ibdev;
1173 for ( i-- ; (
signed int ) i >= 0 ; i-- )
1187 if ( ! ( flexboot_nodnic_priv->
port_mask & ( i + 1 ) ) )
1192 "flexboot_nodnic_thin_init_ports failed");
1209 if ( ! ( flexboot_nodnic_priv->
port_mask & ( i + 1 ) ) )
1214 "nodnic_port_get_type failed");
1217 DBGC ( flexboot_nodnic_priv,
"Port %d type is Ethernet\n", i );
1221 DBGC ( flexboot_nodnic_priv,
"Port %d type is Infiniband\n", i );
1225 DBGC ( flexboot_nodnic_priv,
"Port %d type is unknown\n", i );
1243 if ( ! ( flexboot_nodnic_priv->
port_mask & ( i + 1 ) ) )
1245 port = &flexboot_nodnic_priv->
port[i];
1246 status =
port->type->register_dev ( flexboot_nodnic_priv,
port );
1248 "port register_dev failed");
1261 for (; i >= 0; i--) {
1262 if ( ! ( flexboot_nodnic_priv->
port_mask & ( i + 1 ) ) )
1264 port = &flexboot_nodnic_priv->
port[i];
1265 port->type->unregister_dev(flexboot_nodnic_priv,
port);
1283 if ( ! ( nodnic->
port_mask & ( i + 1 ) ) )
1299 if ( ! ( nodnic->
port_mask & ( i + 1 ) ) )
1309 int is_supported = 0;
1311 DBG (
"%s: start\n", __FUNCTION__ );
1313 memset ( &utils, 0,
sizeof ( utils ) );
1326 is_supported = (
buffer & 0x1 );
1334 DBG (
"%s: NODNIC is %s supported (status = %d)\n",
1335 __FUNCTION__, ( is_supported ?
"":
"not" ),
status );
1336 return is_supported;
1350 mac_addr_aux.high_byte = high_byte;
1351 mac_addr_aux.low_byte = low_byte;
1353 mac_addr[0] = mac_addr_aux.mac_addr[5];
1354 mac_addr[1] = mac_addr_aux.mac_addr[4];
1355 mac_addr[2] = mac_addr_aux.mac_addr[3];
1356 mac_addr[3] = mac_addr_aux.mac_addr[2];
1357 mac_addr[4] = mac_addr_aux.mac_addr[1];
1358 mac_addr[5] = mac_addr_aux.mac_addr[0];
1366 memset ( & virt_mac, 0,
sizeof ( virt_mac ) );
1370 DBGC ( flexboot_nodnic_priv,
"NODNIC %p Failed to set the virtual MAC\n" 1371 ,flexboot_nodnic_priv );
1407 if ( *utils ==
NULL ) {
1408 DBGC ( utils,
"%s: Failed to allocate utils\n", __FUNCTION__ );
1410 goto err_utils_alloc;
1413 DBGC ( utils,
"%s: mlx_utils_init failed\n", __FUNCTION__ );
1415 goto err_utils_init;
1418 DBGC ( utils,
"%s: mlx_pci_gw_init failed\n", __FUNCTION__ );
1461 "status = %d\n", __FUNCTION__,
status );
1491 DBGC ( flexboot_nodnic_priv,
"%s: Bad Parameter\n", __FUNCTION__ );
1495 flexboot_nodnic_priv =
zalloc(
sizeof ( *flexboot_nodnic_priv ) );
1496 if ( flexboot_nodnic_priv ==
NULL ) {
1497 DBGC ( flexboot_nodnic_priv,
"%s: Failed to allocate priv data\n", __FUNCTION__ );
1499 goto device_err_alloc;
1504 flexboot_nodnic_priv->
pci =
pci;
1512 "init_mlx_utils failed");
1517 "nodnic_device_init failed");
1521 "nodnic_device_get_cap failed");
1529 "flexboot_nodnic_set_port_masking failed");
1533 "flexboot_nodnic_allocate_infiniband_devices failed");
1538 "flexboot_nodnic_thin_init_ports failed");
1541 DBGC(flexboot_nodnic_priv,
"%s: flexboot_nodnic_alloc_uar failed" 1542 " ( status = %d )\n",__FUNCTION__,
status );
1548 "flexboot_nodnic_set_ports_type failed");
1552 "flexboot_nodnic_ports_register_dev failed");
1555 if ( ! ( flexboot_nodnic_priv->
port_mask & ( i + 1 ) ) )
1561 DBGC ( flexboot_nodnic_priv,
"%s: %s IRQ function\n",
1568 err_set_ports_types:
1570 err_thin_init_ports:
1578 free ( flexboot_nodnic_priv );
1592 free( flexboot_nodnic_priv );
struct nodnic_ring nodnic_ring
#define EINVAL
Invalid argument.
static __always_inline void ib_set_drvdata(struct ib_device *ibdev, void *priv)
Set Infiniband device driver-private data.
mlx_status mlx_vmac_query_virt_mac(IN mlx_utils *utils, OUT struct mlx_vmac_query_virt_mac *virt_mac)
mlx_status nodnic_device_get_cap(IN nodnic_device_priv *device_priv)
static void flexboot_nodnic_ib_close(struct ib_device *ibdev __attribute__((unused)))
Close Infiniband link.
void ib_poll_eq(struct ib_device *ibdev)
Poll event queue.
mlx_status nodnic_port_allocate_eq(IN nodnic_port_priv *port_priv, IN mlx_uint8 log_eq_size)
struct arbelprm_rc_send_wqe rc
mlx_status nodnic_port_get_state(IN nodnic_port_priv *port_priv, OUT nodnic_port_state *state)
static mlx_status flexboot_nodnic_thin_init_ports(struct flexboot_nodnic *flexboot_nodnic_priv)
nodnic_cq * nodnic_completion_queue
#define iob_put(iobuf, len)
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
struct nodnic_send_ring send
mlx_size(* get_cqe_size)()
#define NODNIC_PORT_DISABLING_DMA
#define NODNIC_NIC_INTERFACE_SUPPORTED_BIT
Infiniband device operations.
mlx_status nodnic_port_close(IN nodnic_port_priv *port_priv)
void flexboot_nodnic_copy_mac(uint8_t mac_addr[], uint32_t low_byte, uint16_t high_byte)
int flexboot_nodnic_is_supported(struct pci_device *pci)
struct ib_device * ibdev
Infiniband device.
int(* open)(struct net_device *netdev)
Open network device.
#define list_add(new, head)
Add a new entry to the head of a list.
mlx_status nodnic_device_init(IN nodnic_device_priv *device_priv)
mlx_status mlx_pci_gw_read(IN mlx_utils *utils, IN mlx_pci_gw_space space, IN mlx_uint32 address, OUT mlx_pci_gw_buffer *buffer)
mlx_status mlx_pci_mem_write(IN mlx_utils *utils, IN mlx_pci_width width, IN mlx_uint8 bar_index, IN mlx_uint64 offset, IN mlx_uintn count, IN mlx_void *buffer)
static mlx_status flexboot_nodnic_set_ports_type(struct flexboot_nodnic *flexboot_nodnic_priv)
static int flexboot_nodnic_set_port_masking(struct flexboot_nodnic *flexboot_nodnic)
Set port masking.
mlx_status nodnic_port_create_qp(IN nodnic_port_priv *port_priv, IN nodnic_queue_pair_type type, IN mlx_size send_wq_size, IN mlx_uint32 send_wqe_num, IN mlx_size receive_wq_size, IN mlx_uint32 recv_wqe_num, OUT nodnic_qp **qp)
#define FLEXBOOT_NODNIC_HCA_BAR
static int flexboot_nodnic_post_recv(struct ib_device *ibdev, struct ib_queue_pair *qp, struct io_buffer *iobuf)
Post receive work queue entry.
static int flexboot_nodnic_modify_qp(struct ib_device *ibdev __attribute__((unused)), struct ib_queue_pair *qp __attribute__((unused)))
Modify queue pair.
uint32_t type
Operating system type.
nodnic_device_priv device_priv
nodnic device
int ib_create_cq(struct ib_device *ibdev, unsigned int num_cqes, struct ib_completion_queue_operations *op, struct ib_completion_queue **new_cq)
Create completion queue.
#define NODNIC_NIC_INTERFACE_SUPPORTED_OFFSET
void ib_refill_recv(struct ib_device *ibdev, struct ib_queue_pair *qp)
Refill receive work queue.
struct io_buffer *(* alloc_iob)(size_t len)
Allocate receive I/O buffer.
static void flexboot_nodnic_unregister_netdev(struct flexboot_nodnic *flexboot_nodnic __attribute__((unused)), struct flexboot_nodnic_port *port)
Unregister flexboot_nodnic Ethernet device.
static int flexboot_nodnic_dealloc_uar(struct flexboot_nodnic *flexboot_nodnic)
struct device * dev
Underlying device.
nodnic_device_priv * device
static int flexboot_nodnic_alloc_uar(struct flexboot_nodnic *flexboot_nodnic)
Initialise Nodnic PCI parameters.
static __always_inline void * ib_qp_get_drvdata(struct ib_queue_pair *qp)
Get Infiniband queue pair driver-private data.
static struct net_device_operations flexboot_nodnic_eth_operations
flexboot_nodnic Ethernet network device operations
mlx_status nodnic_device_clear_int(IN nodnic_device_priv *device_priv)
struct pci_device * pci
PCI device.
static struct ib_queue_pair_operations flexboot_nodnic_eth_qp_op
flexboot nodnic Ethernet queue pair operations
int init_mlx_utils(mlx_utils **utils, struct pci_device *pci)
void netdev_link_down(struct net_device *netdev)
Mark network device as having link down.
#define FLEX_NODNIC_TX_POLL_USLEEP
uint32_t buffer
Buffer index (or NETVSC_RNDIS_NO_BUFFER)
uint8_t mac[ETH_ALEN]
MAC address.
u16 port_mask
Port masking.
mlx_status mlx_pci_gw_init(IN mlx_utils *utils)
mlx_void * cq_virt
cq entries
mlx_status nodnic_port_free_eq(IN nodnic_port_priv *port_priv)
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
An Infiniband Global Identifier.
static __always_inline unsigned long virt_to_phys(volatile const void *addr)
Convert virtual address to a physical address.
struct nodnic_send_wqbb * wqe_virt
#define ARM_CQ_UAR_CMDSN_MASK
struct device dev
Generic device.
#define MLX_DEBUG_WARN(...)
#define ENOTSUP
Operation not supported.
void ib_destroy_cq(struct ib_device *ibdev, struct ib_completion_queue *cq)
Destroy completion queue.
static int flexboot_nodnic_create_cq(struct ib_device *ibdev, struct ib_completion_queue *cq)
Create completion queue.
mlx_status(* cqe_set_owner)(void *cq, unsigned int num_cqes)
Dynamic memory allocation.
mlx_status nodnic_port_add_mac_filter(IN nodnic_port_priv *port_priv, IN mlx_mac_address mac)
static struct ib_work_queue * flexboot_nodnic_find_wq(struct ib_device *ibdev, struct ib_completion_queue *cq, unsigned long qpn, int is_send)
struct ib_completion_queue * cq
Associated completion queue.
static void netdev_init(struct net_device *netdev, struct net_device_operations *op)
Initialise a network device.
#define list_del(list)
Delete an entry from a list.
void(* irq)(struct net_device *netdev, int enable)
Enable or disable interrupts.
#define ARM_CQ_UAR_CQ_CI_OFFSET
static void pci_set_drvdata(struct pci_device *pci, void *priv)
Set PCI driver-private data.
Infiniband completion queue operations.
mlx_status nodnic_device_teardown(IN nodnic_device_priv *device_priv)
void * memcpy(void *dest, const void *src, size_t len) __nonnull
Infiniband queue pair operations.
static __always_inline void * ib_get_drvdata(struct ib_device *ibdev)
Get Infiniband device driver-private data.
static int netdev_is_open(struct net_device *netdev)
Check whether or not network device is open.
static __always_inline unsigned long virt_to_bus(volatile const void *addr)
Convert virtual address to a bus address.
mlx_status nodnic_port_enable_dma(IN nodnic_port_priv *port_priv)
static void flexboot_nodnic_poll_cq(struct ib_device *ibdev, struct ib_completion_queue *cq)
Poll completion queue.
#define FLEX_NODNIC_TX_POLL_TOUT
mlx_status nodnic_port_disable_dma(IN nodnic_port_priv *port_priv)
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define FLEXBOOT_NODNIC_ETH_NUM_RECV_WQES
Number of flexboot_nodnic Ethernet receive work queue entries.
static mlx_status flexboot_nodnic_ports_unregister_dev(struct flexboot_nodnic *flexboot_nodnic_priv)
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
struct ib_device_operations * op
Infiniband operations.
void flexboot_nodnic_eth_irq(struct net_device *netdev, int enable)
static void flexboot_nodnic_destroy_cq(struct ib_device *ibdev, struct ib_completion_queue *cq)
Destroy completion queue.
#define FLEXBOOT_NODNIC_ETH_NUM_SEND_WQES
Number of flexboot_nodnic Ethernet send work queue entries.
An Infiniband Work Queue.
struct nodnic_wqe_segment_data_ptr data[NODNIC_MAX_SCATTER]
void * priv
Driver private data.
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
mlx_status nodnic_port_create_cq(IN nodnic_port_priv *port_priv, IN mlx_size cq_size, OUT nodnic_cq **cq)
static mlx_status flexboot_nodnic_ports_register_dev(struct flexboot_nodnic *flexboot_nodnic_priv)
#define __unused
Declare a variable or data structure as unused.
static int flexboot_nodnic_inform_sma(struct ib_device *ibdev __attribute__((unused)), union ib_mad *mad __attribute__((unused)))
Inform embedded subnet management agent of a received MAD.
static void netdev_link_up(struct net_device *netdev)
Mark network device as having link up.
void ib_complete_send(struct ib_device *ibdev, struct ib_queue_pair *qp, struct io_buffer *iobuf, int rc)
Complete send work queue entry.
void udelay(unsigned long usecs)
Delay for a fixed number of microseconds.
static int netdev_link_ok(struct net_device *netdev)
Check link state of network device.
nodnic_device_capabilites device_cap
mlx_status nodnic_port_init(IN nodnic_port_priv *port_priv)
static struct net_device * netdev
mlx_status(* tx_uar_send_doorbell_fn)(struct ib_device *ibdev, struct nodnic_send_wqbb *wqbb)
unsigned long pci_bar_start(struct pci_device *pci, unsigned int reg)
Find the start of a PCI BAR.
mlx_status nodnic_port_get_type(IN nodnic_port_priv *port_priv, OUT nodnic_port_type *type)
mlx_status nodnic_port_thin_init(IN nodnic_device_priv *device_priv, IN nodnic_port_priv *port_priv, IN mlx_uint8 port_index)
static int flexboot_nodnic_eth_open(struct net_device *netdev)
Open flexboot_nodnic Ethernet device.
void unregister_netdev(struct net_device *netdev)
Unregister network device.
mlx_status(* fill_completion)(void *cqe, struct cqe_data *cqe_data)
unsigned int num_wqes
Number of work queue entries.
struct list_head work_queues
List of work queues completing to this queue.
A flexboot_nodnic device.
unsigned int port
Port number.
static __always_inline void ibdev_put(struct ib_device *ibdev)
Drop reference to Infiniband device.
static __always_inline void ib_cq_set_drvdata(struct ib_completion_queue *cq, void *priv)
Set Infiniband completion queue driver-private data.
char * strerror(int errno)
Retrieve string representation of error number.
static void(* free)(struct refcnt *refcnt))
static void flexboot_nodnic_mcast_detach(struct ib_device *ibdev, struct ib_queue_pair *qp, union ib_gid *gid)
mlx_status(* register_dev)(struct flexboot_nodnic *flexboot_nodnic, struct flexboot_nodnic_port *port)
Register port.
static __always_inline void * ib_qp_get_ownerdata(struct ib_queue_pair *qp)
Get Infiniband queue pair owner-private data.
void * zalloc(size_t size)
Allocate cleared memory.
mlx_uint8 support_bar_cq_ctrl
struct nodnic_recv_ring receive
mlx_status nodnic_port_destroy_cq(IN nodnic_port_priv *port_priv, IN nodnic_cq *cq)
mlx_status mlx_utils_init(IN mlx_utils *utils, IN mlx_pci *pci)
mlx_status nodnic_port_query(IN nodnic_port_priv *port_priv, IN nodnic_port_option option, OUT mlx_uint32 *out)
static void flexboot_nodnic_eth_complete_recv(struct ib_device *ibdev __attribute__((unused)), struct ib_queue_pair *qp, struct ib_address_vector *dest __attribute__((unused)), struct ib_address_vector *source, struct io_buffer *iobuf, int rc)
Handle flexboot_nodnic Ethernet device receive completion.
int register_netdev(struct net_device *netdev)
Register network device.
#define ARM_CQ_UAR_CQ_CI_MASK
struct ib_device * alloc_ibdev(size_t priv_size)
Allocate Infiniband device.
mlx_status nodnic_port_get_cq_size(IN nodnic_port_priv *port_priv, OUT mlx_uint64 *cq_size)
static void flexboot_nodnic_poll_eq(struct ib_device *ibdev)
#define FLEXBOOT_NODNIC_PORT_BASE
#define MLX_FATAL_CHECK_STATUS(status, label, message)
static size_t iob_tailroom(struct io_buffer *iobuf)
Calculate available space at end of an I/O buffer.
static void flexboot_nodnic_destroy_qp(struct ib_device *ibdev, struct ib_queue_pair *qp)
Destroy queue pair.
static void flexboot_nodnic_eth_close(struct net_device *netdev)
Close flexboot_nodnic Ethernet device.
unsigned int fill
Number of occupied work queue entries.
An Infiniband Completion Queue.
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
static int flexboot_nodnic_post_send(struct ib_device *ibdev, struct ib_queue_pair *qp, struct ib_address_vector *av, struct io_buffer *iobuf)
Post send work queue entry.
#define MLX_FILL_1(_ptr, _index,...)
#define MLX_FILL_H(_structure_st, _index, _field, _address)
static int flexboot_nodnic_ib_open(struct ib_device *ibdev __attribute__((unused)))
Initialise Infiniband link.
void ib_destroy_qp(struct ib_device *ibdev, struct ib_queue_pair *qp)
Destroy queue pair.
#define EN_DEFAULT_ADMIN_MTU
mlx_uint32 vendor_err_syndrome
static mlx_status flexboot_nodnic_get_factory_mac(struct flexboot_nodnic *flexboot_nodnic_priv, uint8_t port __attribute__((unused)))
#define NODNIC_PORT_OPENED
mlx_status nodnic_port_set(IN nodnic_port_priv *port_priv, IN nodnic_port_option option, IN mlx_uint32 in)
unsigned long qpn
Queue Pair Number.
A flexboot_nodnic port type.
void flexboot_nodnic_remove(struct pci_device *pci)
struct ib_queue_pair * qp
Containing queue pair.
static int flexboot_nodnic_eth_transmit(struct net_device *netdev, struct io_buffer *iobuf)
Transmit packet via flexboot_nodnic Ethernet device.
unsigned int ports
Total ports on device.
mlx_status mlx_utils_teardown(IN mlx_utils *utils)
static struct ib_completion_queue_operations flexboot_nodnic_eth_cq_op
flexboot_nodnic Ethernet device completion operations
unsigned long next_idx
Next work queue entry index.
#define ENETDOWN
Network is down.
mlx_status mlx_set_admin_mtu(IN mlx_utils *utils, IN mlx_uint8 port_num, IN mlx_uint32 admin_mtu)
unsigned long next_idx
Next completion queue entry index.
Network device operations.
void netdev_rx(struct net_device *netdev, struct io_buffer *iobuf)
Add packet to receive queue.
struct device * dev
Underlying hardware device.
struct list_head list
List of work queues on this completion queue.
An Infiniband Queue Pair.
struct list_head cqs
List of completion queues.
mlx_uint8 support_uar_tx_db
static int flexboot_nodnic_complete(struct ib_device *ibdev, struct ib_completion_queue *cq, struct cqe_data *cqe_data)
Handle completion.
nodnic_port_priv port_priv
nodic port
static void * pci_get_drvdata(struct pci_device *pci)
Get PCI driver-private data.
mlx_status nodnic_port_destroy_qp(IN nodnic_port_priv *port_priv, IN nodnic_queue_pair_type type, IN nodnic_qp *qp)
struct arbelprm_qp_db_record qp
int ib_post_send(struct ib_device *ibdev, struct ib_queue_pair *qp, struct ib_address_vector *dest, struct io_buffer *iobuf)
Post send work queue entry.
#define cpu_to_be32(value)
#define INIT_LIST_HEAD(list)
Initialise a list head.
static mlx_status flexboot_nodnic_allocate_infiniband_devices(struct flexboot_nodnic *flexboot_nodnic_priv)
#define MLX_OUT_OF_RESOURCES
static struct flexboot_nodnic_port_type flexboot_nodnic_port_type_eth
flexboot_nodnic Ethernet port type
void netdev_tx_complete_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Complete network transmission.
static int flexboot_nodnic_create_qp(struct ib_device *ibdev, struct ib_queue_pair *qp)
Create queue pair.
char name[NETDEV_NAME_LEN]
Name of this network device.
static void flexboot_nodnic_eth_complete_send(struct ib_device *ibdev __attribute__((unused)), struct ib_queue_pair *qp, struct io_buffer *iobuf, int rc)
Handle flexboot_nodnic Ethernet device send completion.
#define ENOBUFS
No buffer space available.
struct flexboot_nodnic_port port[FLEXBOOT_NODNIC_MAX_PORTS]
flexboot_nodnic ports
#define ENOTTY
Inappropriate I/O control operation.
int ib_create_qp(struct ib_device *ibdev, enum ib_queue_pair_type type, unsigned int num_send_wqes, struct ib_completion_queue *send_cq, unsigned int num_recv_wqes, struct ib_completion_queue *recv_cq, struct ib_queue_pair_operations *op, const char *name, struct ib_queue_pair **new_qp)
Create queue pair.
static void flexboot_nodnic_eth_poll(struct net_device *netdev)
Poll flexboot_nodnic Ethernet device.
mlx_boolean support_promisc_filter
void * data
Start of data.
static int flexboot_nodnic_arm_cq(struct flexboot_nodnic_port *port)
#define EIO
Input/output error.
#define MLX_DEBUG_ERROR(...)
void ib_poll_cq(struct ib_device *ibdev, struct ib_completion_queue *cq)
Poll completion queue.
#define FLEXBOOT_NODNIC_PAGE_SIZE
struct net_device * alloc_etherdev(size_t priv_size)
Allocate Ethernet device.
void(* complete_send)(struct ib_device *ibdev, struct ib_queue_pair *qp, struct io_buffer *iobuf, int rc)
Complete Send WQE.
unsigned long cqn
Completion queue number.
if(len >=6 *4) __asm__ __volatile__("movsl" if(len >=5 *4) __asm__ __volatile__("movsl" if(len >=4 *4) __asm__ __volatile__("movsl" if(len >=3 *4) __asm__ __volatile__("movsl" if(len >=2 *4) __asm__ __volatile__("movsl" if(len >=1 *4) __asm__ __volatile__("movsl" if((len % 4) >=2) __asm__ __volatile__("movsw" if((len % 2) >=1) __asm__ __volatile__("movsb" return dest
void iounmap(volatile const void *io_addr)
Unmap I/O address.
uint8_t data[48]
Additional event data.
unsigned int num_cqes
Number of completion queue entries.
void ib_complete_recv(struct ib_device *ibdev, struct ib_queue_pair *qp, struct ib_address_vector *dest, struct ib_address_vector *source, struct io_buffer *iobuf, int rc)
Complete receive work queue entry.
void free_mlx_utils(mlx_utils **utils)
An Infiniband Address Vector.
mlx_status nodnic_port_set_send_uar_offset(IN nodnic_port_priv *port_priv)
Network interface management.
int flexboot_nodnic_probe(struct pci_device *pci, struct flexboot_nodnic_callbacks *callbacks, void *drv_priv __attribute__((unused)))
mlx_status nodnic_port_get_qpn(IN nodnic_port_priv *port_priv, IN struct nodnic_ring *ring, OUT mlx_uint32 *qpn)
mlx_status nodnic_port_set_promisc(IN nodnic_port_priv *port_priv, IN mlx_boolean value)
struct flexboot_nodnic_callbacks * callbacks
nic specific data
static void flexboot_nodnic_port_disable_dma(struct flexboot_nodnic_port *port)
static int flexboot_nodnic_register_netdev(struct flexboot_nodnic *flexboot_nodnic, struct flexboot_nodnic_port *port)
Register flexboot_nodnic Ethernet device.
mlx_status mlx_pci_gw_teardown(IN mlx_utils *utils)
#define DBG(...)
Print a debugging message.
static int flexboot_nodnic_mcast_attach(struct ib_device *ibdev, struct ib_queue_pair *qp, union ib_gid *gid)
nodnic_qp * nodnic_queue_pair
static struct ib_device_operations flexboot_nodnic_ib_operations
flexboot_nodnic Infiniband operations
void * pci_ioremap(struct pci_device *pci, unsigned long bus_addr, size_t len)
Map PCI bus address as an I/O address.
#define MLX_CHECK_STATUS(id, status, label, message)
int is_send
"Is a send queue" flag
#define ENETUNREACH
Network unreachable.
struct flexboot_nodnic_port_type * type
Port type.
static __always_inline void * ib_cq_get_drvdata(struct ib_completion_queue *cq)
Get Infiniband completion queue driver-private data.
FILE_LICENCE(GPL2_OR_LATER)
uint8_t hw_addr[MAX_HW_ADDR_LEN]
Hardware address.
#define NULL
NULL pointer (VOID *)
static __always_inline void ib_qp_set_ownerdata(struct ib_queue_pair *qp, void *priv)
Set Infiniband queue pair owner-private data.
void(* irq)(struct net_device *netdev, int enable)
void writeq(uint64_t data, volatile uint64_t *io_addr)
Write 64-bit qword to memory-mapped device.
#define ARM_CQ_UAR_CMDSN_OFFSET
static __always_inline void ib_qp_set_drvdata(struct ib_queue_pair *qp, void *priv)
Set Infiniband queue pair driver-private data.
int(* create_cq)(struct ib_device *ibdev, struct ib_completion_queue *cq)
Create completion queue.
static void flexboot_nodnic_state_change_netdev(struct flexboot_nodnic *flexboot_nodnic __attribute__((unused)), struct flexboot_nodnic_port *port, int link_up)
Handle flexboot_nodnic Ethernet device port state change.
mlx_uint8 log_working_buffer_size
mlx_uint32 mlx_pci_gw_buffer
mlx_status nodnic_port_remove_mac_filter(IN nodnic_port_priv *port_priv, IN mlx_mac_address mac)
static void flexboot_nodnic_complete_all_tx(struct flexboot_nodnic_port *port)
void * memset(void *dest, int character, size_t len) __nonnull
A flexboot nodnic queue pair.
#define PCI_GW_SPACE_NODNIC
struct nodnic_ring nodnic_ring
struct io_buffer ** iobufs
I/O buffers assigned to work queue.