61#define ARM_CQ_UAR_CQ_CI_MASK 0xffffff
62#define ARM_CQ_UAR_CMDSN_MASK 3
63#define ARM_CQ_UAR_CMDSN_OFFSET 28
64#define ARM_CQ_UAR_CQ_CI_OFFSET 0x20
65 if (
port->port_priv.device->device_cap.support_bar_cq_ctrl ) {
71 port->port_priv.arm_cq_doorbell_record->dword[0] = cq_uar.
dword[1];
72 port->port_priv.arm_cq_doorbell_record->dword[1] = cq_uar.
dword[0];
74 val32 = (
port->eth_cq->next_idx & 0xffffff );
82 nodnic_port_data_flow_gw *ptr =
port->port_priv.data_flow_gw;
86 if (
port->port_priv.device->device_cap.crspace_doorbells == 0 ) {
87 val = (
port->eth_cq->next_idx & 0xffff );
97 data = ( ( (
port->eth_cq->next_idx & 0xffff ) << 16 ) | 0x0080 );
122 zalloc(
sizeof(*flexboot_nodnic_cq));
123 if ( flexboot_nodnic_cq ==
NULL ) {
134 "nodnic_port_create_cq failed");
143 "failed to query cqn");
151 free(flexboot_nodnic_cq);
171 free(flexboot_nodnic_cq);
194 if ( out_qpn ==
qpn )
218 unsigned long wqe_idx;
219 unsigned long wqe_idx_mask;
238 "flexboot_nodnic %p CQN %#lx unknown %s QPN %#lx\n",
247 wqe_idx_mask = ( wq->
num_wqes - 1 );
249 "NODNIC %p CQN %#lx QPN %#lx %s WQE %#lx completed:\n",
255 iobuf = wq->
iobufs[wqe_idx & wqe_idx_mask];
256 if ( iobuf ==
NULL ) {
258 "NODNIC %p CQN %#lx QPN %#lx empty %s WQE %#lx\n",
268 }
else if (
rc != 0 ) {
276 memset ( &recv_dest, 0,
sizeof ( recv_dest ) );
278 memset ( &recv_source, 0,
sizeof ( recv_source ) );
279 switch (
qp->type ) {
293 &recv_source, iobuf,
rc );
311 unsigned int cqe_idx_mask;
317 cqe_idx_mask = ( cq->
num_cqes - 1 );
319 cqe_size * (cq->
next_idx & cqe_idx_mask);
334 cqe,
sizeof ( *cqe ) );
364 if ( flexboot_nodnic_qp ==
NULL ) {
377 "nodnic_port_create_qp failed");
381 free(flexboot_nodnic_qp);
415 free(flexboot_nodnic_qp);
447 unsigned int wqe_idx_mask;
448 unsigned long wqe_idx;
450 if ( (
port->port_priv.dma_state ==
FALSE ) ||
459 wqe_idx_mask = ( wq->
num_wqes - 1 );
460 if ( wq->
iobufs[wqe_idx & wqe_idx_mask] ) {
466 wqbb = &send_ring->
wqe_virt[wqe_idx & wqe_idx_mask];
467 wq->
iobufs[wqe_idx & wqe_idx_mask] = iobuf;
470 fill_send_wqe[
qp->type] !=
NULL );
472 fill_send_wqe[
qp->type] ( ibdev,
qp, av, iobuf,
513 unsigned int wqe_idx_mask;
517 wqe_idx_mask = ( wq->
num_wqes - 1 );
520 "flexboot_nodnic %p QPN %#lx receive queue full\n",
561 DBG (
"%s: ibdev = NULL!!!\n", __FUNCTION__ );
570 DBG2(
"%s: port %d is closed\n", __FUNCTION__,
port->ibdev->port );
580 DBG(
"%s: port %d physical link is up\n", __FUNCTION__,
608 "nodnic_port_add_mac_filter failed");
629 "nodnic_port_remove_mac_filter failed");
704#define FLEX_NODNIC_TX_POLL_TOUT 500000
705#define FLEX_NODNIC_TX_POLL_USLEEP 10
711 int keep_polling = 0;
720 keep_polling += ( wq->
fill > 0 );
723 }
while ( keep_polling && (
timeout-- > 0 ) );
751#define FLEXBOOT_NODNIC_ETH_NUM_SEND_WQES 64
754#define FLEXBOOT_NODNIC_ETH_NUM_RECV_WQES 64
820 DBG (
"Received packet with error\n" );
825 if ( source ==
NULL ) {
826 DBG (
"Received packet without address vector\n" );
872 __FUNCTION__,
port->ibdev->port );
879 if ( dummy_cq ==
NULL ) {
882 goto err_create_dummy_cq;
890 &
port->eth_qp ) ) != 0 ) {
901 "nodnic_port_get_cq_size failed");
904 &
port->eth_cq ) ) != 0 ) {
906 "flexboot_nodnic %p port %d could not create completion queue\n",
911 port->eth_qp->send.cq =
port->eth_cq;
914 port->eth_qp->recv.cq =
port->eth_cq;
922 "nodnic_port_allocate_eq failed");
926 "nodnic_port_init failed");
934 "nodnic_port_get_qpn failed");
942 "nodnic_port_enable_dma failed");
947 "nodnic_port_set_promisc failed");
952 "nodnic_port_get_state failed");
954 port->type->state_change (
958 __FUNCTION__,
port->ibdev->port,
994 __FUNCTION__,
port->ibdev->port );
1001 "nodnic_port_set_promisc failed (status = %d)\n",
status );
1082 "failed to query mac high");
1087 "failed to query mac low");
1096 "flexboot_nodnic %p port %d could not register network device: %s\n",
1158 if ( ! ( flexboot_nodnic_priv->
port_mask & ( i + 1 ) ) )
1161 if (ibdev ==
NULL) {
1163 goto err_alloc_ibdev;
1165 flexboot_nodnic_priv->
port[i].
ibdev = ibdev;
1174 for ( i-- ; (
signed int ) i >= 0 ; i-- )
1188 if ( ! ( flexboot_nodnic_priv->
port_mask & ( i + 1 ) ) )
1193 "flexboot_nodnic_thin_init_ports failed");
1210 if ( ! ( flexboot_nodnic_priv->
port_mask & ( i + 1 ) ) )
1215 "nodnic_port_get_type failed");
1218 DBGC ( flexboot_nodnic_priv,
"Port %d type is Ethernet\n", i );
1222 DBGC ( flexboot_nodnic_priv,
"Port %d type is Infiniband\n", i );
1226 DBGC ( flexboot_nodnic_priv,
"Port %d type is unknown\n", i );
1244 if ( ! ( flexboot_nodnic_priv->
port_mask & ( i + 1 ) ) )
1246 port = &flexboot_nodnic_priv->
port[i];
1247 status =
port->type->register_dev ( flexboot_nodnic_priv,
port );
1249 "port register_dev failed");
1262 for (; i >= 0; i--) {
1263 if ( ! ( flexboot_nodnic_priv->
port_mask & ( i + 1 ) ) )
1265 port = &flexboot_nodnic_priv->
port[i];
1266 port->type->unregister_dev(flexboot_nodnic_priv,
port);
1284 if ( ! ( nodnic->
port_mask & ( i + 1 ) ) )
1300 if ( ! ( nodnic->
port_mask & ( i + 1 ) ) )
1310 int is_supported = 0;
1312 DBG (
"%s: start\n", __FUNCTION__ );
1314 memset ( &utils, 0,
sizeof ( utils ) );
1327 is_supported = (
buffer & 0x1 );
1335 DBG (
"%s: NODNIC is %s supported (status = %d)\n",
1336 __FUNCTION__, ( is_supported ?
"":
"not" ),
status );
1337 return is_supported;
1351 mac_addr_aux.high_byte = high_byte;
1352 mac_addr_aux.low_byte = low_byte;
1354 mac_addr[0] = mac_addr_aux.mac_addr[5];
1355 mac_addr[1] = mac_addr_aux.mac_addr[4];
1356 mac_addr[2] = mac_addr_aux.mac_addr[3];
1357 mac_addr[3] = mac_addr_aux.mac_addr[2];
1358 mac_addr[4] = mac_addr_aux.mac_addr[1];
1359 mac_addr[5] = mac_addr_aux.mac_addr[0];
1367 memset ( & virt_mac, 0,
sizeof ( virt_mac ) );
1371 DBGC ( flexboot_nodnic_priv,
"NODNIC %p Failed to set the virtual MAC\n"
1372 ,flexboot_nodnic_priv );
1408 if ( *utils ==
NULL ) {
1409 DBGC ( utils,
"%s: Failed to allocate utils\n", __FUNCTION__ );
1411 goto err_utils_alloc;
1414 DBGC ( utils,
"%s: mlx_utils_init failed\n", __FUNCTION__ );
1416 goto err_utils_init;
1419 DBGC ( utils,
"%s: mlx_pci_gw_init failed\n", __FUNCTION__ );
1462 "status = %d\n", __FUNCTION__,
status );
1492 DBGC ( flexboot_nodnic_priv,
"%s: Bad Parameter\n", __FUNCTION__ );
1496 flexboot_nodnic_priv =
zalloc(
sizeof ( *flexboot_nodnic_priv ) );
1497 if ( flexboot_nodnic_priv ==
NULL ) {
1498 DBGC ( flexboot_nodnic_priv,
"%s: Failed to allocate priv data\n", __FUNCTION__ );
1500 goto device_err_alloc;
1505 flexboot_nodnic_priv->
pci =
pci;
1513 "init_mlx_utils failed");
1518 "nodnic_device_init failed");
1522 "nodnic_device_get_cap failed");
1530 "flexboot_nodnic_set_port_masking failed");
1534 "flexboot_nodnic_allocate_infiniband_devices failed");
1539 "flexboot_nodnic_thin_init_ports failed");
1542 DBGC(flexboot_nodnic_priv,
"%s: flexboot_nodnic_alloc_uar failed"
1543 " ( status = %d )\n",__FUNCTION__,
status );
1549 "flexboot_nodnic_set_ports_type failed");
1553 "flexboot_nodnic_ports_register_dev failed");
1556 if ( ! ( flexboot_nodnic_priv->
port_mask & ( i + 1 ) ) )
1562 DBGC ( flexboot_nodnic_priv,
"%s: %s IRQ function\n",
1579 free ( flexboot_nodnic_priv );
1593 free( flexboot_nodnic_priv );
#define NULL
NULL pointer (VOID *)
struct arbelprm_rc_send_wqe rc
struct arbelprm_qp_db_record qp
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" retur dest)
#define assert(condition)
Assert a condition at run-time.
uint32_t type
Operating system type.
uint8_t data[48]
Additional event data.
uint8_t mac[ETH_ALEN]
MAC address.
struct net_device * alloc_etherdev(size_t priv_size)
Allocate Ethernet device.
static int flexboot_nodnic_mcast_attach(struct ib_device *ibdev, struct ib_queue_pair *qp, union ib_gid *gid)
#define ARM_CQ_UAR_CQ_CI_MASK
static void flexboot_nodnic_eth_poll(struct net_device *netdev)
Poll flexboot_nodnic Ethernet device.
static struct flexboot_nodnic_port_type flexboot_nodnic_port_type_eth
flexboot_nodnic Ethernet port type
static void flexboot_nodnic_mcast_detach(struct ib_device *ibdev, struct ib_queue_pair *qp, union ib_gid *gid)
static int flexboot_nodnic_modify_qp(struct ib_device *ibdev, struct ib_queue_pair *qp)
Modify queue pair.
static mlx_status flexboot_nodnic_allocate_infiniband_devices(struct flexboot_nodnic *flexboot_nodnic_priv)
static void flexboot_nodnic_eth_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)
Handle flexboot_nodnic Ethernet device receive completion.
static int flexboot_nodnic_set_port_masking(struct flexboot_nodnic *flexboot_nodnic)
Set port masking.
static int flexboot_nodnic_alloc_uar(struct flexboot_nodnic *flexboot_nodnic)
Initialise Nodnic PCI parameters.
static int flexboot_nodnic_complete(struct ib_device *ibdev, struct ib_completion_queue *cq, struct cqe_data *cqe_data)
Handle completion.
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.
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_ib_open(struct ib_device *ibdev)
Initialise Infiniband link.
static void flexboot_nodnic_eth_close(struct net_device *netdev)
Close flexboot_nodnic Ethernet device.
static mlx_status flexboot_nodnic_get_factory_mac(struct flexboot_nodnic *flexboot_nodnic_priv, uint8_t port)
void flexboot_nodnic_eth_irq(struct net_device *netdev, int enable)
#define ARM_CQ_UAR_CQ_CI_OFFSET
static void flexboot_nodnic_disable_dma(struct flexboot_nodnic *nodnic)
static mlx_status flexboot_nodnic_ports_unregister_dev(struct flexboot_nodnic *flexboot_nodnic_priv)
static void flexboot_nodnic_poll_eq(struct ib_device *ibdev)
#define FLEXBOOT_NODNIC_ETH_NUM_RECV_WQES
Number of flexboot_nodnic Ethernet receive work queue entries.
int init_mlx_utils(mlx_utils **utils, struct pci_device *pci)
int flexboot_nodnic_is_supported(struct pci_device *pci)
int flexboot_nodnic_probe(struct pci_device *pci, struct flexboot_nodnic_callbacks *callbacks, void *drv_priv)
static struct ib_work_queue * flexboot_nodnic_find_wq(struct ib_device *ibdev, struct ib_completion_queue *cq, unsigned long qpn, int is_send)
static void flexboot_nodnic_destroy_cq(struct ib_device *ibdev, struct ib_completion_queue *cq)
Destroy completion queue.
static int flexboot_nodnic_register_netdev(struct flexboot_nodnic *flexboot_nodnic, struct flexboot_nodnic_port *port)
Register flexboot_nodnic Ethernet device.
static int flexboot_nodnic_arm_cq(struct flexboot_nodnic_port *port)
static void flexboot_nodnic_complete_all_tx(struct flexboot_nodnic_port *port)
static mlx_status flexboot_nodnic_thin_init_ports(struct flexboot_nodnic *flexboot_nodnic_priv)
static mlx_status flexboot_nodnic_set_ports_type(struct flexboot_nodnic *flexboot_nodnic_priv)
#define ARM_CQ_UAR_CMDSN_OFFSET
#define ARM_CQ_UAR_CMDSN_MASK
static int flexboot_nodnic_eth_transmit(struct net_device *netdev, struct io_buffer *iobuf)
Transmit packet via flexboot_nodnic Ethernet device.
void flexboot_nodnic_remove(struct pci_device *pci)
static void flexboot_nodnic_ib_close(struct ib_device *ibdev)
Close Infiniband link.
static void flexboot_nodnic_port_disable_dma(struct flexboot_nodnic_port *port)
static void flexboot_nodnic_destroy_qp(struct ib_device *ibdev, struct ib_queue_pair *qp)
Destroy queue pair.
static struct net_device_operations flexboot_nodnic_eth_operations
flexboot_nodnic Ethernet network device operations
static struct ib_completion_queue_operations flexboot_nodnic_eth_cq_op
flexboot_nodnic Ethernet device completion operations
static int flexboot_nodnic_inform_sma(struct ib_device *ibdev, union ib_mad *mad)
Inform embedded subnet management agent of a received MAD.
static void flexboot_nodnic_eth_complete_send(struct ib_device *ibdev, struct ib_queue_pair *qp, struct io_buffer *iobuf, int rc)
Handle flexboot_nodnic Ethernet device send completion.
static int flexboot_nodnic_create_qp(struct ib_device *ibdev, struct ib_queue_pair *qp)
Create queue pair.
static struct ib_device_operations flexboot_nodnic_ib_operations
flexboot_nodnic Infiniband operations
static void flexboot_nodnic_poll_cq(struct ib_device *ibdev, struct ib_completion_queue *cq)
Poll completion queue.
static struct ib_queue_pair_operations flexboot_nodnic_eth_qp_op
flexboot nodnic Ethernet queue pair operations
static void flexboot_nodnic_enable_dma(struct flexboot_nodnic *nodnic)
void flexboot_nodnic_copy_mac(uint8_t mac_addr[], uint32_t low_byte, uint16_t high_byte)
static void flexboot_nodnic_state_change_netdev(struct flexboot_nodnic *flexboot_nodnic, struct flexboot_nodnic_port *port, int link_up)
Handle flexboot_nodnic Ethernet device port state change.
static void flexboot_nodnic_unregister_netdev(struct flexboot_nodnic *flexboot_nodnic, struct flexboot_nodnic_port *port)
Unregister flexboot_nodnic Ethernet device.
#define FLEXBOOT_NODNIC_ETH_NUM_SEND_WQES
Number of flexboot_nodnic Ethernet send work queue entries.
#define FLEX_NODNIC_TX_POLL_TOUT
#define FLEX_NODNIC_TX_POLL_USLEEP
static int flexboot_nodnic_dealloc_uar(struct flexboot_nodnic *flexboot_nodnic)
void free_mlx_utils(mlx_utils **utils)
static int flexboot_nodnic_eth_open(struct net_device *netdev)
Open flexboot_nodnic Ethernet device.
static int flexboot_nodnic_create_cq(struct ib_device *ibdev, struct ib_completion_queue *cq)
Create completion queue.
static mlx_status flexboot_nodnic_ports_register_dev(struct flexboot_nodnic *flexboot_nodnic_priv)
#define FLEXBOOT_NODNIC_HCA_BAR
#define EN_DEFAULT_ADMIN_MTU
#define FLEXBOOT_NODNIC_PAGE_SIZE
#define FLEXBOOT_NODNIC_PORT_BASE
static struct net_device * netdev
#define __unused
Declare a variable or data structure as unused.
#define DBG(...)
Print a debugging message.
uint32_t buffer
Buffer index (or NETVSC_RNDIS_NO_BUFFER)
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
#define EINVAL
Invalid argument.
#define ENETUNREACH
Network unreachable.
#define EIO
Input/output error.
#define ENOTSUP
Operation not supported.
#define ENOBUFS
No buffer space available.
#define ENETDOWN
Network is down.
#define ENOTTY
Inappropriate I/O control operation.
Network interface management.
#define cpu_to_be32(value)
static __always_inline unsigned long virt_to_bus(volatile const void *addr)
Convert virtual address to a bus address.
#define writeq(data, io_addr)
void iounmap(volatile const void *io_addr)
Unmap I/O address.
void * pci_ioremap(struct pci_device *pci, unsigned long bus_addr, size_t len)
Map PCI bus address as an I/O address.
void * memcpy(void *dest, const void *src, size_t len) __nonnull
void * memset(void *dest, int character, size_t len) __nonnull
void ib_refill_recv(struct ib_device *ibdev, struct ib_queue_pair *qp)
Refill receive work queue.
void ib_destroy_cq(struct ib_device *ibdev, struct ib_completion_queue *cq)
Destroy completion queue.
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.
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.
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.
void ib_poll_eq(struct ib_device *ibdev)
Poll event queue.
void ib_poll_cq(struct ib_device *ibdev, struct ib_completion_queue *cq)
Poll completion queue.
void ib_destroy_qp(struct ib_device *ibdev, struct ib_queue_pair *qp)
Destroy queue pair.
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.
void ib_complete_send(struct ib_device *ibdev, struct ib_queue_pair *qp, struct io_buffer *iobuf, int rc)
Complete send work queue entry.
struct ib_device * alloc_ibdev(size_t priv_size)
Allocate Infiniband device.
static __always_inline void * ib_get_drvdata(struct ib_device *ibdev)
Get Infiniband device driver-private data.
static __always_inline void * ib_cq_get_drvdata(struct ib_completion_queue *cq)
Get Infiniband completion queue driver-private data.
static __always_inline void * ib_qp_get_ownerdata(struct ib_queue_pair *qp)
Get Infiniband queue pair owner-private data.
static __always_inline void ib_qp_set_ownerdata(struct ib_queue_pair *qp, void *priv)
Set Infiniband queue pair owner-private data.
static __always_inline void * ib_qp_get_drvdata(struct ib_queue_pair *qp)
Get Infiniband queue pair driver-private data.
static __always_inline void ib_cq_set_drvdata(struct ib_completion_queue *cq, void *priv)
Set Infiniband completion queue driver-private data.
static __always_inline void ib_qp_set_drvdata(struct ib_queue_pair *qp, void *priv)
Set Infiniband queue pair driver-private data.
static __always_inline void ib_set_drvdata(struct ib_device *ibdev, void *priv)
Set Infiniband device driver-private data.
static __always_inline void ibdev_put(struct ib_device *ibdev)
Drop reference to Infiniband device.
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
#define iob_put(iobuf, len)
static size_t iob_tailroom(struct io_buffer *iobuf)
Calculate available space at end of an I/O buffer.
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
#define list_del(list)
Delete an entry from a list.
#define INIT_LIST_HEAD(list)
Initialise a list head.
#define list_add(new, head)
Add a new entry to the head of a list.
void * zalloc(size_t size)
Allocate cleared memory.
Dynamic memory allocation.
#define MLX_CHECK_STATUS(id, status, label, message)
#define MLX_FATAL_CHECK_STATUS(status, label, message)
#define MLX_FILL_H(_structure_st, _index, _field, _address)
#define MLX_FILL_1(_ptr, _index,...)
mlx_status nodnic_device_init(IN nodnic_device_priv *device_priv)
#define NODNIC_NIC_INTERFACE_SUPPORTED_BIT
mlx_status nodnic_device_clear_int(IN nodnic_device_priv *device_priv)
mlx_status nodnic_device_teardown(IN nodnic_device_priv *device_priv)
#define NODNIC_NIC_INTERFACE_SUPPORTED_OFFSET
mlx_status nodnic_device_get_cap(IN nodnic_device_priv *device_priv)
#define MLX_DEBUG_ERROR(...)
#define MLX_DEBUG_WARN(...)
mlx_status mlx_set_admin_mtu(IN mlx_utils *utils, IN mlx_uint8 port_num, IN mlx_uint32 admin_mtu)
struct _nodnic_device_priv nodnic_device_priv
struct _nodnic_port_priv nodnic_port_priv
struct _nodnic_qp nodnic_qp
struct _nodnic_uar_priv nodnic_uar
@ NODNIC_PORT_TYPE_UNKNOWN
#define NODNIC_PORT_OPENED
#define NODNIC_PORT_DISABLING_DMA
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)
mlx_status mlx_pci_gw_teardown(IN mlx_utils *utils)
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_gw_init(IN mlx_utils *utils)
mlx_uint32 mlx_pci_gw_buffer
#define PCI_GW_SPACE_NODNIC
mlx_status nodnic_port_init(IN nodnic_port_priv *port_priv)
mlx_status nodnic_port_get_cq_size(IN nodnic_port_priv *port_priv, OUT mlx_uint64 *cq_size)
mlx_status nodnic_port_set_send_uar_offset(IN nodnic_port_priv *port_priv)
mlx_status nodnic_port_get_state(IN nodnic_port_priv *port_priv, OUT nodnic_port_state *state)
mlx_status nodnic_port_enable_dma(IN nodnic_port_priv *port_priv)
mlx_status nodnic_port_get_type(IN nodnic_port_priv *port_priv, OUT nodnic_port_type *type)
mlx_status nodnic_port_remove_mac_filter(IN nodnic_port_priv *port_priv, IN mlx_mac_address mac)
mlx_status nodnic_port_thin_init(IN nodnic_device_priv *device_priv, IN nodnic_port_priv *port_priv, IN mlx_uint8 port_index)
mlx_status nodnic_port_close(IN nodnic_port_priv *port_priv)
mlx_status nodnic_port_disable_dma(IN nodnic_port_priv *port_priv)
mlx_status nodnic_port_query(IN nodnic_port_priv *port_priv, IN nodnic_port_option option, OUT mlx_uint32 *out)
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_allocate_eq(IN nodnic_port_priv *port_priv, IN mlx_uint8 log_eq_size)
mlx_status nodnic_port_add_mac_filter(IN nodnic_port_priv *port_priv, IN mlx_mac_address mac)
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)
mlx_status nodnic_port_free_eq(IN nodnic_port_priv *port_priv)
mlx_status nodnic_port_set(IN nodnic_port_priv *port_priv, IN nodnic_port_option option, IN mlx_uint32 in)
@ nodnic_port_state_active
mlx_status nodnic_port_destroy_qp(IN nodnic_port_priv *port_priv, IN nodnic_queue_pair_type type, IN nodnic_qp *qp)
@ nodnic_port_option_mac_high
@ nodnic_port_option_cq_n_index
@ nodnic_port_option_mac_low
@ nodnic_port_option_arm_cq
mlx_status nodnic_port_set_promisc(IN nodnic_port_priv *port_priv, IN mlx_boolean value)
mlx_status nodnic_port_destroy_cq(IN nodnic_port_priv *port_priv, IN nodnic_cq *cq)
mlx_status nodnic_port_create_cq(IN nodnic_port_priv *port_priv, IN mlx_size cq_size, OUT nodnic_cq **cq)
#define MLX_OUT_OF_RESOURCES
mlx_status mlx_utils_init(IN mlx_utils *utils, IN mlx_pci *pci)
mlx_status mlx_utils_teardown(IN mlx_utils *utils)
mlx_status mlx_vmac_query_virt_mac(IN mlx_utils *utils, OUT struct mlx_vmac_query_virt_mac *virt_mac)
void netdev_link_down(struct net_device *netdev)
Mark network device as having link down.
void netdev_rx(struct net_device *netdev, struct io_buffer *iobuf)
Add packet to receive queue.
void unregister_netdev(struct net_device *netdev)
Unregister network device.
void netdev_tx_complete_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Complete network transmission.
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
int register_netdev(struct net_device *netdev)
Register network device.
static int netdev_is_open(struct net_device *netdev)
Check whether or not network device is open.
static int netdev_link_ok(struct net_device *netdev)
Check link state of network device.
static void netdev_link_up(struct net_device *netdev)
Mark network device as having link up.
static void netdev_init(struct net_device *netdev, struct net_device_operations *op)
Initialise a network device.
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
unsigned long pci_bar_start(struct pci_device *pci, unsigned int reg)
Find the start of a PCI BAR.
static void pci_set_drvdata(struct pci_device *pci, void *priv)
Set PCI driver-private data.
static void * pci_get_drvdata(struct pci_device *pci)
Get PCI driver-private data.
static void(* free)(struct refcnt *refcnt))
char * strerror(int errno)
Retrieve string representation of error number.
mlx_void * cq_virt
cq entries
mlx_boolean support_promisc_filter
mlx_uint8 support_bar_cq_ctrl
mlx_uint8 support_uar_tx_db
mlx_uint8 log_working_buffer_size
nodnic_device_capabilites device_cap
nodnic_device_priv * device
struct nodnic_send_ring send
struct nodnic_recv_ring receive
mlx_uint32 vendor_err_syndrome
mlx_status(* tx_uar_send_doorbell_fn)(struct ib_device *ibdev, struct nodnic_send_wqbb *wqbb)
mlx_size(* get_cqe_size)()
mlx_status(* fill_completion)(void *cqe, struct cqe_data *cqe_data)
void(* irq)(struct net_device *netdev, int enable)
mlx_status(* cqe_set_owner)(void *cq, unsigned int num_cqes)
nodnic_cq * nodnic_completion_queue
A flexboot_nodnic port type.
nodnic_port_priv port_priv
nodic port
struct flexboot_nodnic_port_type * type
Port type.
struct ib_device * ibdev
Infiniband device.
A flexboot nodnic queue pair.
nodnic_qp * nodnic_queue_pair
A flexboot_nodnic device.
nodnic_device_priv device_priv
nodnic device
struct pci_device * pci
PCI device.
struct flexboot_nodnic_callbacks * callbacks
nic specific data
struct flexboot_nodnic_port port[FLEXBOOT_NODNIC_MAX_PORTS]
flexboot_nodnic ports
u16 port_mask
Port masking.
An Infiniband Address Vector.
unsigned long qpn
Queue Pair Number.
Infiniband completion queue operations.
An Infiniband Completion Queue.
unsigned long cqn
Completion queue number.
unsigned long next_idx
Next completion queue entry index.
struct list_head work_queues
List of work queues completing to this queue.
unsigned int num_cqes
Number of completion queue entries.
Infiniband device operations.
unsigned int ports
Total ports on device.
struct ib_device_operations * op
Infiniband operations.
struct device * dev
Underlying device.
struct list_head cqs
List of completion queues.
unsigned int port
Port number.
Infiniband queue pair operations.
An Infiniband Queue Pair.
An Infiniband Work Queue.
unsigned int fill
Number of occupied work queue entries.
struct io_buffer ** iobufs
I/O buffers assigned to work queue.
struct ib_completion_queue * cq
Associated completion queue.
struct list_head list
List of work queues on this completion queue.
struct ib_queue_pair * qp
Containing queue pair.
int is_send
"Is a send queue" flag
unsigned long next_idx
Next work queue entry index.
unsigned int num_wqes
Number of work queue entries.
void * data
Start of data.
Network device operations.
struct nodnic_ring nodnic_ring
struct nodnic_wqe_segment_data_ptr data[NODNIC_MAX_SCATTER]
struct nodnic_ring nodnic_ring
struct nodnic_send_wqbb * wqe_virt
struct device dev
Generic device.
void udelay(unsigned long usecs)
Delay for a fixed number of microseconds.
An Infiniband Global Identifier.