iPXE
mlx_port.h File Reference

Go to the source code of this file.

Data Structures

struct  nodnic_port_data_entry
struct  nodnic_qp_data_entry

Macros

#define NODNIC_PORT_MAC_FILTERS_OFFSET   0x10

Enumerations

enum  nodnic_port_option {
  nodnic_port_option_link_type = 0 , nodnic_port_option_mac_low , nodnic_port_option_mac_high , nodnic_port_option_log_cq_size ,
  nodnic_port_option_reset_needed , nodnic_port_option_mac_filters_en , nodnic_port_option_port_state , nodnic_port_option_network_en ,
  nodnic_port_option_dma_en , nodnic_port_option_eq_addr_low , nodnic_port_option_eq_addr_high , nodnic_port_option_cq_addr_low ,
  nodnic_port_option_cq_addr_high , nodnic_port_option_port_management_change_event , nodnic_port_option_port_promisc_en , nodnic_port_option_arm_cq ,
  nodnic_port_option_port_promisc_multicast_en , nodnic_port_option_send_ring0_uar_index , nodnic_port_option_send_ring1_uar_index , nodnic_port_option_cq_n_index
}
enum  nodnic_port_state { nodnic_port_state_down = 0 , nodnic_port_state_initialize , nodnic_port_state_armed , nodnic_port_state_active }

Functions

 FILE_LICENCE (GPL2_OR_LATER)
mlx_status nodnic_port_get_state (IN nodnic_port_priv *port_priv, OUT nodnic_port_state *state)
mlx_status nodnic_port_get_type (IN nodnic_port_priv *port_priv, OUT nodnic_port_type *type)
mlx_status nodnic_port_query (IN nodnic_port_priv *port_priv, IN nodnic_port_option option, OUT mlx_uint32 *out)
mlx_status nodnic_port_set (IN nodnic_port_priv *port_priv, IN nodnic_port_option option, IN mlx_uint32 in)
mlx_status nodnic_port_create_cq (IN nodnic_port_priv *port_priv, IN mlx_size cq_size, OUT nodnic_cq **cq)
mlx_status nodnic_port_destroy_cq (IN nodnic_port_priv *port_priv, IN nodnic_cq *cq)
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_destroy_qp (IN nodnic_port_priv *port_priv, IN nodnic_queue_pair_type type, IN nodnic_qp *qp)
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_update_ring_doorbell (IN nodnic_port_priv *port_priv, IN struct nodnic_ring *ring, IN mlx_uint16 index)
mlx_status nodnic_port_get_cq_size (IN nodnic_port_priv *port_priv, OUT mlx_uint64 *cq_size)
mlx_status nodnic_port_allocate_eq (IN nodnic_port_priv *port_priv, IN mlx_uint8 log_eq_size)
mlx_status nodnic_port_free_eq (IN nodnic_port_priv *port_priv)
mlx_status nodnic_port_add_mac_filter (IN nodnic_port_priv *port_priv, IN mlx_mac_address mac)
mlx_status nodnic_port_remove_mac_filter (IN nodnic_port_priv *port_priv, IN mlx_mac_address mac)
mlx_status nodnic_port_add_mgid_filter (IN nodnic_port_priv *port_priv, IN mlx_mac_address mac)
mlx_status nodnic_port_remove_mgid_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_set_promisc (IN nodnic_port_priv *port_priv, IN mlx_boolean value)
mlx_status nodnic_port_set_promisc_multicast (IN nodnic_port_priv *port_priv, IN mlx_boolean value)
mlx_status nodnic_port_init (IN nodnic_port_priv *port_priv)
mlx_status nodnic_port_close (IN nodnic_port_priv *port_priv)
mlx_status nodnic_port_enable_dma (IN nodnic_port_priv *port_priv)
mlx_status nodnic_port_disable_dma (IN nodnic_port_priv *port_priv)
mlx_status nodnic_port_read_reset_needed (IN nodnic_port_priv *port_priv, OUT mlx_boolean *reset_needed)
mlx_status nodnic_port_read_port_management_change_event (IN nodnic_port_priv *port_priv, OUT mlx_boolean *change_event)
mlx_status nodnic_port_set_send_uar_offset (IN nodnic_port_priv *port_priv)
mlx_status nodnic_port_update_tx_db_func (IN nodnic_device_priv *device_priv, IN nodnic_port_priv *port_priv)

Macro Definition Documentation

◆ NODNIC_PORT_MAC_FILTERS_OFFSET

#define NODNIC_PORT_MAC_FILTERS_OFFSET   0x10

Definition at line 27 of file mlx_port.h.

Referenced by nodnic_port_add_mac_filter().

Enumeration Type Documentation

◆ nodnic_port_option

Enumerator
nodnic_port_option_link_type 
nodnic_port_option_mac_low 
nodnic_port_option_mac_high 
nodnic_port_option_log_cq_size 
nodnic_port_option_reset_needed 
nodnic_port_option_mac_filters_en 
nodnic_port_option_port_state 
nodnic_port_option_network_en 
nodnic_port_option_dma_en 
nodnic_port_option_eq_addr_low 
nodnic_port_option_eq_addr_high 
nodnic_port_option_cq_addr_low 
nodnic_port_option_cq_addr_high 
nodnic_port_option_port_management_change_event 
nodnic_port_option_port_promisc_en 
nodnic_port_option_arm_cq 
nodnic_port_option_port_promisc_multicast_en 
nodnic_port_option_send_ring0_uar_index 
nodnic_port_option_send_ring1_uar_index 
nodnic_port_option_cq_n_index 

Definition at line 29 of file mlx_port.h.

29 {
47#ifdef DEVICE_CX3
48 nodnic_port_option_crspace_en,
49#endif
nodnic_port_option
Definition mlx_port.h:29
@ nodnic_port_option_cq_addr_high
Definition mlx_port.h:42
@ nodnic_port_option_port_promisc_en
Definition mlx_port.h:44
@ nodnic_port_option_mac_filters_en
Definition mlx_port.h:35
@ nodnic_port_option_eq_addr_low
Definition mlx_port.h:39
@ nodnic_port_option_send_ring1_uar_index
Definition mlx_port.h:51
@ nodnic_port_option_cq_addr_low
Definition mlx_port.h:41
@ nodnic_port_option_eq_addr_high
Definition mlx_port.h:40
@ nodnic_port_option_port_management_change_event
Definition mlx_port.h:43
@ nodnic_port_option_mac_high
Definition mlx_port.h:32
@ nodnic_port_option_port_state
Definition mlx_port.h:36
@ nodnic_port_option_link_type
Definition mlx_port.h:30
@ nodnic_port_option_reset_needed
Definition mlx_port.h:34
@ nodnic_port_option_send_ring0_uar_index
Definition mlx_port.h:50
@ nodnic_port_option_port_promisc_multicast_en
Definition mlx_port.h:46
@ nodnic_port_option_log_cq_size
Definition mlx_port.h:33
@ nodnic_port_option_network_en
Definition mlx_port.h:37
@ nodnic_port_option_dma_en
Definition mlx_port.h:38
@ nodnic_port_option_cq_n_index
Definition mlx_port.h:52
@ nodnic_port_option_mac_low
Definition mlx_port.h:31
@ nodnic_port_option_arm_cq
Definition mlx_port.h:45

◆ nodnic_port_state

Enumerator
nodnic_port_state_down 
nodnic_port_state_initialize 
nodnic_port_state_armed 
nodnic_port_state_active 

Definition at line 69 of file mlx_port.h.

69 {
nodnic_port_state
Definition mlx_port.h:69
@ nodnic_port_state_armed
Definition mlx_port.h:72
@ nodnic_port_state_active
Definition mlx_port.h:73
@ nodnic_port_state_down
Definition mlx_port.h:70
@ nodnic_port_state_initialize
Definition mlx_port.h:71

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER )

◆ nodnic_port_get_state()

mlx_status nodnic_port_get_state ( IN nodnic_port_priv * port_priv,
OUT nodnic_port_state * state )

Definition at line 88 of file mlx_port.c.

92{
94 mlx_uint32 out = 0;
95
96 status = nodnic_port_query(port_priv,
98 MLX_CHECK_STATUS(port_priv->device, status, query_err,
99 "nodnic_port_query failed");
101query_err:
102 return status;
103}
__be32 out[4]
Definition CIB_PRM.h:8
uint8_t status
Status.
Definition ena.h:5
uint8_t state
State.
Definition eth_slow.h:36
#define MLX_CHECK_STATUS(id, status, label, message)
Definition mlx_bail.h:37
mlx_status nodnic_port_query(IN nodnic_port_priv *port_priv, IN nodnic_port_option option, OUT mlx_uint32 *out)
Definition mlx_port.c:126
uint32_t mlx_uint32
#define MLX_SUCCESS
int mlx_status

References IN, MLX_CHECK_STATUS, MLX_SUCCESS, nodnic_port_option_port_state, nodnic_port_query(), OUT, out, state, and status.

Referenced by flexboot_nodnic_eth_open(), and flexboot_nodnic_poll_eq().

◆ nodnic_port_get_type()

mlx_status nodnic_port_get_type ( IN nodnic_port_priv * port_priv,
OUT nodnic_port_type * type )

Definition at line 105 of file mlx_port.c.

109{
111 mlx_uint32 out = 0;
112
113 if ( port_priv->port_type == NODNIC_PORT_TYPE_UNKNOWN){
114 status = nodnic_port_query(port_priv,
117 "nodnic_port_query failed");
118 port_priv->port_type = (nodnic_port_type)out;
119 }
120 *type = port_priv->port_type;
121query_err:
122 return status;
123}
uint32_t type
Operating system type.
Definition ena.h:1
#define MLX_FATAL_CHECK_STATUS(status, label, message)
Definition mlx_bail.h:29
@ NODNIC_PORT_TYPE_UNKNOWN

References IN, MLX_FATAL_CHECK_STATUS, MLX_SUCCESS, nodnic_port_option_link_type, nodnic_port_query(), NODNIC_PORT_TYPE_UNKNOWN, OUT, out, status, and type.

Referenced by flexboot_nodnic_set_ports_type().

◆ nodnic_port_query()

mlx_status nodnic_port_query ( IN nodnic_port_priv * port_priv,
IN nodnic_port_option option,
OUT mlx_uint32 * out )

Definition at line 126 of file mlx_port.c.

131{
133 nodnic_device_priv *device_priv = NULL;
134 struct nodnic_port_data_entry *data_entry;
135 mlx_uint32 buffer = 0;
136 if( port_priv == NULL || out == NULL){
138 goto invalid_parm;
139 }
140 device_priv = port_priv->device;
141
142 data_entry = &nodnic_port_data_table[option];
143
144 status = nodnic_cmd_read(device_priv,
145 port_priv->port_offset + data_entry->offset , &buffer);
146 MLX_CHECK_STATUS(device_priv, status, read_err,
147 "nodnic_cmd_read failed");
148 *out = (buffer >> data_entry->align) & data_entry->mask;
149read_err:
150invalid_parm:
151 return status;
152}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
uint32_t buffer
Buffer index (or NETVSC_RNDIS_NO_BUFFER)
Definition netvsc.h:5
mlx_status nodnic_cmd_read(IN nodnic_device_priv *device_priv, IN mlx_uint32 address, OUT mlx_pci_gw_buffer *buffer)
Definition mlx_cmd.c:29
struct _nodnic_device_priv nodnic_device_priv
struct nodnic_port_data_entry nodnic_port_data_table[]
Definition mlx_port.c:42
#define MLX_INVALID_PARAMETER
Definition mlx_port.h:55
mlx_uint8 align
Definition mlx_port.h:58
mlx_uint32 mask
Definition mlx_port.h:59
mlx_uint32 offset
Definition mlx_port.h:57
A long option, as used for getopt_long()
Definition getopt.h:25

References nodnic_port_data_entry::align, buffer, IN, nodnic_port_data_entry::mask, MLX_CHECK_STATUS, MLX_INVALID_PARAMETER, MLX_SUCCESS, nodnic_cmd_read(), nodnic_port_data_table, NULL, nodnic_port_data_entry::offset, OUT, out, and status.

Referenced by flexboot_nodnic_create_cq(), flexboot_nodnic_register_netdev(), nodnic_port_add_mac_filter(), nodnic_port_get_cq_size(), nodnic_port_get_state(), nodnic_port_get_type(), nodnic_port_read_port_management_change_event(), nodnic_port_read_reset_needed(), nodnic_port_remove_mac_filter(), and nodnic_port_set_send_uar_offset().

◆ nodnic_port_set()

mlx_status nodnic_port_set ( IN nodnic_port_priv * port_priv,
IN nodnic_port_option option,
IN mlx_uint32 in )

Definition at line 155 of file mlx_port.c.

160{
162 nodnic_device_priv *device_priv = NULL;
163 struct nodnic_port_data_entry *data_entry;
164 mlx_uint32 buffer = 0;
165
166 if( port_priv == NULL ){
167 MLX_DEBUG_FATAL_ERROR("port_priv is NULL\n");
169 goto invalid_parm;
170 }
171 device_priv = port_priv->device;
172 data_entry = &nodnic_port_data_table[option];
173
174 if( in > data_entry->mask ){
175 MLX_DEBUG_FATAL_ERROR("in > data_entry->mask (%d > %d)\n",
176 in, data_entry->mask);
178 goto invalid_parm;
179 }
180 status = nodnic_cmd_read(device_priv,
181 port_priv->port_offset + data_entry->offset, &buffer);
183 "nodnic_cmd_read failed");
184 buffer = buffer & ~(data_entry->mask << data_entry->align);
185 buffer = buffer | (in << data_entry->align);
186 status = nodnic_cmd_write(device_priv,
187 port_priv->port_offset + data_entry->offset, buffer);
189 "nodnic_cmd_write failed");
190write_err:
191read_err:
192invalid_parm:
193 return status;
194}
__be32 in[4]
Definition CIB_PRM.h:7
mlx_status nodnic_cmd_write(IN nodnic_device_priv *device_priv, IN mlx_uint32 address, IN mlx_pci_gw_buffer buffer)
Definition mlx_cmd.c:54
#define MLX_DEBUG_FATAL_ERROR(...)
Definition mlx_logging.h:28

References nodnic_port_data_entry::align, buffer, IN, in, nodnic_port_data_entry::mask, MLX_DEBUG_FATAL_ERROR, MLX_FATAL_CHECK_STATUS, MLX_INVALID_PARAMETER, MLX_SUCCESS, nodnic_cmd_read(), nodnic_cmd_write(), nodnic_port_data_table, NULL, nodnic_port_data_entry::offset, and status.

Referenced by flexboot_nodnic_arm_cq(), nodnic_port_add_mac_filter(), nodnic_port_allocate_eq(), nodnic_port_create_cq(), nodnic_port_remove_mac_filter(), nodnic_port_set_dma(), nodnic_port_set_network(), nodnic_port_set_promisc(), nodnic_port_set_promisc_multicast(), and nodnic_port_thin_init().

◆ nodnic_port_create_cq()

mlx_status nodnic_port_create_cq ( IN nodnic_port_priv * port_priv,
IN mlx_size cq_size,
OUT nodnic_cq ** cq )

Definition at line 360 of file mlx_port.c.

365{
367 nodnic_device_priv *device_priv = NULL;
369 if( port_priv == NULL || cq == NULL){
371 goto invalid_parm;
372 }
373
374 device_priv = port_priv->device;
375
376 status = mlx_memory_zalloc(device_priv->utils,
377 sizeof(nodnic_cq),(mlx_void **)cq);
379 "cq priv allocation error");
380
381 (*cq)->cq_size = cq_size;
382 status = mlx_memory_alloc_dma(device_priv->utils,
383 (*cq)->cq_size, NODNIC_MEMORY_ALIGN,
384 &(*cq)->cq_virt);
385 MLX_FATAL_CHECK_STATUS(status, dma_alloc_err,
386 "cq allocation error");
387
388 status = mlx_memory_map_dma(device_priv->utils,
389 (*cq)->cq_virt,
390 (*cq)->cq_size,
391 &(*cq)->cq_physical,
392 &(*cq)->map);
393 MLX_FATAL_CHECK_STATUS(status, cq_map_err,
394 "cq map error");
395
396 status = nodnic_port_cq_dbr_dma_init(port_priv,cq);
397
398 /* update cq address */
399#define NODIC_CQ_ADDR_HIGH 0x68
400#define NODIC_CQ_ADDR_LOW 0x6c
401 address = (mlx_uint64)(*cq)->cq_physical;
403 (mlx_uint32)(address) >> 12);
404 MLX_FATAL_CHECK_STATUS(status, dma_set_addr_low_err,
405 "cq set addr low error");
406 address = address >> 32;
409 MLX_FATAL_CHECK_STATUS(status, dma_set_addr_high_err,
410 "cq set addr high error");
411 return status;
412dma_set_addr_high_err:
413dma_set_addr_low_err:
414 mlx_memory_ummap_dma(device_priv->utils, (*cq)->map);
415cq_map_err:
416 mlx_memory_free_dma(device_priv->utils, (*cq)->cq_size,
417 (void **)&((*cq)->cq_virt));
418dma_alloc_err:
419 mlx_memory_free(device_priv->utils, (void **)cq);
420alloc_err:
421invalid_parm:
422 return status;
423}
uint64_t address
Base address.
Definition ena.h:13
mlx_status mlx_memory_zalloc(IN mlx_utils *utils, IN mlx_size size, OUT mlx_void **ptr)
Definition mlx_memory.c:45
mlx_status mlx_memory_alloc_dma(IN mlx_utils *utils, IN mlx_size size, IN mlx_size align, OUT mlx_void **ptr)
Definition mlx_memory.c:79
mlx_status mlx_memory_ummap_dma(IN mlx_utils *utils, IN mlx_void *Mapping)
Definition mlx_memory.c:135
mlx_status mlx_memory_map_dma(IN mlx_utils *utils, IN mlx_void *Addr, IN mlx_size NumberOfBytes, OUT mlx_physical_address *PhysAddr, OUT mlx_void **Mapping)
Definition mlx_memory.c:116
mlx_status mlx_memory_free_dma(IN mlx_utils *utils, IN mlx_size size, IN mlx_void **ptr)
Definition mlx_memory.c:98
mlx_status mlx_memory_free(IN mlx_utils *utils, IN mlx_void **ptr)
Definition mlx_memory.c:63
#define NODNIC_MEMORY_ALIGN
struct _nodnic_cq nodnic_cq
static mlx_status nodnic_port_cq_dbr_dma_init(IN nodnic_port_priv *port_priv, OUT nodnic_cq **cq)
Definition mlx_port.c:321
mlx_status nodnic_port_set(IN nodnic_port_priv *port_priv, IN nodnic_port_option option, IN mlx_uint32 in)
Definition mlx_port.c:155
uint64_t mlx_uint64
void mlx_void

References address, IN, MLX_FATAL_CHECK_STATUS, MLX_INVALID_PARAMETER, mlx_memory_alloc_dma(), mlx_memory_free(), mlx_memory_free_dma(), mlx_memory_map_dma(), mlx_memory_ummap_dma(), mlx_memory_zalloc(), MLX_SUCCESS, NODNIC_MEMORY_ALIGN, nodnic_port_cq_dbr_dma_init(), nodnic_port_option_cq_addr_high, nodnic_port_option_cq_addr_low, nodnic_port_set(), NULL, OUT, status, and _nodnic_device_priv::utils.

Referenced by flexboot_nodnic_create_cq().

◆ nodnic_port_destroy_cq()

mlx_status nodnic_port_destroy_cq ( IN nodnic_port_priv * port_priv,
IN nodnic_cq * cq )

Definition at line 426 of file mlx_port.c.

430{
432 nodnic_device_priv *device_priv = NULL;
433
434 if( port_priv == NULL || cq == NULL){
436 goto invalid_parm;
437 }
438 device_priv = port_priv->device;
439
440 if ( device_priv->device_cap.support_bar_cq_ctrl ){
441 status = mlx_memory_ummap_dma(device_priv->utils,
442 cq->arm_cq_doorbell.map);
443 if( status != MLX_SUCCESS){
444 MLX_DEBUG_ERROR(device_priv, "mlx_memory_ummap_dma failed (Status = %d)\n", status);
445 }
446
447 status = mlx_memory_free_dma(device_priv->utils,
448 sizeof(nodnic_arm_cq_db),
449 (void **)&(port_priv->arm_cq_doorbell_record));
450 if( status != MLX_SUCCESS){
451 MLX_DEBUG_ERROR(device_priv, "mlx_memory_free_dma failed (Status = %d)\n", status);
452 }
453 }
454
455 mlx_memory_ummap_dma(device_priv->utils, cq->map);
456
457 mlx_memory_free_dma(device_priv->utils, cq->cq_size,
458 (void **)&(cq->cq_virt));
459
460 mlx_memory_free(device_priv->utils, (void **)&cq);
461invalid_parm:
462 return status;
463}
#define MLX_DEBUG_ERROR(...)
Definition mlx_logging.h:29
struct _nodnic_arm_cq_db nodnic_arm_cq_db
nodnic_device_capabilites device_cap

References _nodnic_device_priv::device_cap, IN, MLX_DEBUG_ERROR, MLX_INVALID_PARAMETER, mlx_memory_free(), mlx_memory_free_dma(), mlx_memory_ummap_dma(), MLX_SUCCESS, NULL, status, _nodnic_device_capabilites::support_bar_cq_ctrl, and _nodnic_device_priv::utils.

Referenced by flexboot_nodnic_destroy_cq().

◆ nodnic_port_create_qp()

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 )

Definition at line 585 of file mlx_port.c.

594{
596 nodnic_device_priv *device_priv = NULL;
597 mlx_uint32 max_ring_size = 0;
599 mlx_uint32 log_size = 0;
600 if( port_priv == NULL || qp == NULL){
602 goto invalid_parm;
603 }
604
605 device_priv = port_priv->device;
606 max_ring_size = (1 << device_priv->device_cap.log_max_ring_size);
607 if( send_wq_size > max_ring_size ||
608 receive_wq_size > max_ring_size ){
610 goto invalid_parm;
611 }
612
613 status = mlx_memory_zalloc(device_priv->utils,
614 sizeof(nodnic_qp),(mlx_void **)qp);
616 "qp allocation error");
617
618 if( nodnic_qp_data_teable[type].send_offset == 0 ||
619 nodnic_qp_data_teable[type].recv_offset == 0){
621 goto invalid_type;
622 }
623
624 (*qp)->send.nodnic_ring.offset = port_priv->port_offset +
625 nodnic_qp_data_teable[type].send_offset;
626 (*qp)->receive.nodnic_ring.offset = port_priv->port_offset +
627 nodnic_qp_data_teable[type].recv_offset;
628
629 status = mlx_memory_alloc_dma(device_priv->utils,
630 send_wq_size, NODNIC_MEMORY_ALIGN,
631 (void*)&(*qp)->send.wqe_virt);
632 MLX_FATAL_CHECK_STATUS(status, send_alloc_err,
633 "send wq allocation error");
634
635 status = mlx_memory_alloc_dma(device_priv->utils,
636 receive_wq_size, NODNIC_MEMORY_ALIGN,
637 &(*qp)->receive.wqe_virt);
638 MLX_FATAL_CHECK_STATUS(status, receive_alloc_err,
639 "receive wq allocation error");
640
641 status = mlx_memory_map_dma(device_priv->utils,
642 (*qp)->send.wqe_virt,
643 send_wq_size,
644 &(*qp)->send.nodnic_ring.wqe_physical,
645 &(*qp)->send.nodnic_ring.map);
646 MLX_FATAL_CHECK_STATUS(status, send_map_err,
647 "send wq map error");
648
649 status = mlx_memory_map_dma(device_priv->utils,
650 (*qp)->receive.wqe_virt,
651 receive_wq_size,
652 &(*qp)->receive.nodnic_ring.wqe_physical,
653 &(*qp)->receive.nodnic_ring.map);
654 MLX_FATAL_CHECK_STATUS(status, receive_map_err,
655 "receive wq map error");
656
658 MLX_FATAL_CHECK_STATUS(status, rx_pi_dma_alloc_err,
659 "receive db dma error");
660
662
663
664 (*qp)->send.nodnic_ring.wq_size = send_wq_size;
665 (*qp)->send.nodnic_ring.num_wqes = send_wqe_num;
666 (*qp)->receive.nodnic_ring.wq_size = receive_wq_size;
667 (*qp)->receive.nodnic_ring.num_wqes = recv_wqe_num;
668
669 /* Set Ownership bit in Send/receive queue (0 - recv ; 1 - send) */
670 mlx_memory_set(device_priv->utils, (*qp)->send.wqe_virt, 0xff, send_wq_size );
671 mlx_memory_set(device_priv->utils, (*qp)->receive.wqe_virt, 0, recv_wqe_num );
672
673 /* update send ring */
674#define NODIC_RING_QP_ADDR_HIGH 0x0
675#define NODIC_RING_QP_ADDR_LOW 0x4
676 address = (mlx_uint64)(*qp)->send.nodnic_ring.wqe_physical;
677 status = nodnic_cmd_write(device_priv, (*qp)->send.nodnic_ring.offset +
679 (mlx_uint32)(address >> 32));
680 MLX_FATAL_CHECK_STATUS(status, write_send_addr_err,
681 "send address write error 1");
682 mlx_utils_ilog2((*qp)->send.nodnic_ring.wq_size, &log_size);
683 address = address | log_size;
684 status = nodnic_cmd_write(device_priv, (*qp)->send.nodnic_ring.offset +
687 MLX_FATAL_CHECK_STATUS(status, write_send_addr_err,
688 "send address write error 2");
689 /* update receive ring */
690 address = (mlx_uint64)(*qp)->receive.nodnic_ring.wqe_physical;
691 status = nodnic_cmd_write(device_priv, (*qp)->receive.nodnic_ring.offset +
693 (mlx_uint32)(address >> 32));
694 MLX_FATAL_CHECK_STATUS(status, write_recv_addr_err,
695 "receive address write error 1");
696 mlx_utils_ilog2((*qp)->receive.nodnic_ring.wq_size, &log_size);
697 address = address | log_size;
698 status = nodnic_cmd_write(device_priv, (*qp)->receive.nodnic_ring.offset +
701 MLX_FATAL_CHECK_STATUS(status, write_recv_addr_err,
702 "receive address write error 2");
703
704 return status;
705write_recv_addr_err:
706write_send_addr_err:
707 mlx_memory_ummap_dma(device_priv->utils, (*qp)->receive.nodnic_ring.map);
708rx_pi_dma_alloc_err:
709receive_map_err:
710 mlx_memory_ummap_dma(device_priv->utils, (*qp)->send.nodnic_ring.map);
711send_map_err:
712 mlx_memory_free_dma(device_priv->utils, receive_wq_size,
713 &((*qp)->receive.wqe_virt));
714receive_alloc_err:
715 mlx_memory_free_dma(device_priv->utils, send_wq_size,
716 (void **)&((*qp)->send.wqe_virt));
717send_alloc_err:
718invalid_type:
719 mlx_memory_free(device_priv->utils, (void **)qp);
720alloc_err:
721invalid_parm:
722 return status;
723}
struct arbelprm_qp_db_record qp
Definition arbel.h:2
mlx_status mlx_memory_set(IN mlx_utils *utils, IN mlx_void *block, IN mlx_int32 value, IN mlx_size size)
Definition mlx_memory.c:171
struct _nodnic_qp nodnic_qp
#define NODIC_RING_QP_ADDR_HIGH
static mlx_status nodnic_port_rx_pi_dma_alloc(IN nodnic_port_priv *port_priv, OUT nodnic_qp **qp)
Definition mlx_port.c:498
#define NODIC_RING_QP_ADDR_LOW
struct nodnic_qp_data_entry nodnic_qp_data_teable[MAX_QP_DATA_ENTRIES]
Definition mlx_port.c:73
static mlx_status nodnic_port_tx_dbr_dma_init(IN nodnic_port_priv *port_priv, OUT nodnic_qp **qp)
Definition mlx_port.c:550
mlx_status mlx_utils_ilog2(IN mlx_uint32 i, OUT mlx_uint32 *log)
Definition mlx_utils.c:73

References address, _nodnic_device_priv::device_cap, IN, _nodnic_device_capabilites::log_max_ring_size, MLX_FATAL_CHECK_STATUS, MLX_INVALID_PARAMETER, mlx_memory_alloc_dma(), mlx_memory_free(), mlx_memory_free_dma(), mlx_memory_map_dma(), mlx_memory_set(), mlx_memory_ummap_dma(), mlx_memory_zalloc(), MLX_SUCCESS, mlx_utils_ilog2(), NODIC_RING_QP_ADDR_HIGH, NODIC_RING_QP_ADDR_LOW, nodnic_cmd_write(), NODNIC_MEMORY_ALIGN, nodnic_port_rx_pi_dma_alloc(), nodnic_port_tx_dbr_dma_init(), nodnic_qp_data_teable, NULL, OUT, qp, status, type, and _nodnic_device_priv::utils.

Referenced by flexboot_nodnic_create_qp().

◆ nodnic_port_destroy_qp()

mlx_status nodnic_port_destroy_qp ( IN nodnic_port_priv * port_priv,
IN nodnic_queue_pair_type type,
IN nodnic_qp * qp )

Definition at line 726 of file mlx_port.c.

731{
733 nodnic_device_priv *device_priv = port_priv->device;
734
735 status = mlx_memory_ummap_dma(device_priv->utils,
736 qp->receive.nodnic_ring.map);
737 if( status != MLX_SUCCESS){
738 MLX_DEBUG_ERROR(device_priv, "mlx_memory_ummap_dma failed (Status = %d)\n", status);
739 }
740
741 status = mlx_memory_ummap_dma(device_priv->utils, qp->send.nodnic_ring.map);
742 if( status != MLX_SUCCESS){
743 MLX_DEBUG_ERROR(device_priv, "mlx_memory_ummap_dma failed (Status = %d)\n", status);
744 }
745
746 if ( device_priv->device_cap.support_rx_pi_dma ){
747 status = mlx_memory_ummap_dma(device_priv->utils,
748 qp->receive.nodnic_ring.recv_doorbell.map);
749 if( status != MLX_SUCCESS){
750 MLX_DEBUG_ERROR(device_priv, "mlx_memory_ummap_dma failed (Status = %d)\n", status);
751 }
752
753 status = mlx_memory_free_dma(device_priv->utils,
754 sizeof(nodnic_qp_db),
755 (void **)&(qp->receive.nodnic_ring.recv_doorbell.qp_doorbell_record));
756 if( status != MLX_SUCCESS){
757 MLX_DEBUG_ERROR(device_priv, "mlx_memory_free_dma failed (Status = %d)\n", status);
758 }
759 }
760
761 if ( device_priv->device_cap.support_uar_tx_db || ! device_priv->uar.offset){
762 status = mlx_memory_ummap_dma(device_priv->utils,
763 qp->send.nodnic_ring.send_doorbell.map);
764 if( status != MLX_SUCCESS){
765 MLX_DEBUG_ERROR(device_priv, "mlx_memory_ummap_dma failed (Status = %d)\n", status);
766 }
767
768 status = mlx_memory_free_dma(device_priv->utils,
769 sizeof(nodnic_qp_db),
770 (void **)&(qp->send.nodnic_ring.send_doorbell.qp_doorbell_record));
771 if( status != MLX_SUCCESS){
772 MLX_DEBUG_ERROR(device_priv, "mlx_memory_free_dma failed (Status = %d)\n", status);
773 }
774 }
775
776 status = mlx_memory_free_dma(device_priv->utils,
777 qp->receive.nodnic_ring.wq_size,
778 (void **)&(qp->receive.wqe_virt));
779 if( status != MLX_SUCCESS){
780 MLX_DEBUG_ERROR(device_priv, "mlx_memory_free_dma failed (Status = %d)\n", status);
781 }
782 status = mlx_memory_free_dma(device_priv->utils,
783 qp->send.nodnic_ring.wq_size,
784 (void **)&(qp->send.wqe_virt));
785 if( status != MLX_SUCCESS){
786 MLX_DEBUG_ERROR(device_priv, "mlx_memory_free_dma failed (Status = %d)\n", status);
787 }
788 status = mlx_memory_free(device_priv->utils, (void **)&qp);
789 if( status != MLX_SUCCESS){
790 MLX_DEBUG_ERROR(device_priv, "mlx_memory_free failed (Status = %d)\n", status);
791 }
792 return status;
793}
struct _nodnic_qp_db nodnic_qp_db

References _nodnic_device_priv::device_cap, IN, MLX_DEBUG_ERROR, mlx_memory_free(), mlx_memory_free_dma(), mlx_memory_ummap_dma(), MLX_SUCCESS, _nodnic_uar_priv::offset, qp, status, _nodnic_device_capabilites::support_rx_pi_dma, _nodnic_device_capabilites::support_uar_tx_db, type, _nodnic_device_priv::uar, unused, and _nodnic_device_priv::utils.

Referenced by flexboot_nodnic_destroy_qp().

◆ nodnic_port_get_qpn()

mlx_status nodnic_port_get_qpn ( IN nodnic_port_priv * port_priv,
IN struct nodnic_ring * ring,
OUT mlx_uint32 * qpn )

Definition at line 796 of file mlx_port.c.

801{
803 mlx_uint32 buffer = 0;
804 if( ring == NULL || qpn == NULL){
806 goto bad_param;
807 }
808 if( ring->qpn != 0 ){
809 *qpn = ring->qpn;
810 goto success;
811 }
812#define NODNIC_RING_QPN_OFFSET 0xc
813#define NODNIC_RING_QPN_MASK 0xFFFFFF
814 status = nodnic_cmd_read(port_priv->device,
815 ring->offset + NODNIC_RING_QPN_OFFSET,
816 &buffer);
818 "nodnic_cmd_read failed");
819 ring->qpn = buffer & NODNIC_RING_QPN_MASK;
820 *qpn = ring->qpn;
821read_err:
822success:
823bad_param:
824 return status;
825}
__be32 qpn
Definition CIB_PRM.h:1
#define NODNIC_RING_QPN_MASK
#define NODNIC_RING_QPN_OFFSET

References buffer, IN, MLX_FATAL_CHECK_STATUS, MLX_INVALID_PARAMETER, MLX_SUCCESS, nodnic_cmd_read(), NODNIC_RING_QPN_MASK, NODNIC_RING_QPN_OFFSET, NULL, OUT, qpn, and status.

Referenced by flexboot_nodnic_eth_open(), flexboot_nodnic_find_wq(), and shomron_fill_eth_send_wqe().

◆ nodnic_port_update_ring_doorbell()

mlx_status nodnic_port_update_ring_doorbell ( IN nodnic_port_priv * port_priv,
IN struct nodnic_ring * ring,
IN mlx_uint16 index )

Definition at line 874 of file mlx_port.c.

879{
881 mlx_uint32 buffer = 0;
882 if( ring == NULL ){
884 goto bad_param;
885 }
886#define NODNIC_RING_RING_OFFSET 0x8
887 buffer = (mlx_uint32)((index & 0xFFFF)<< 8);
888 status = nodnic_cmd_write(port_priv->device,
889 ring->offset + NODNIC_RING_RING_OFFSET,
890 buffer);
891 MLX_CHECK_STATUS(port_priv->device, status, write_err,
892 "nodnic_cmd_write failed");
893write_err:
894bad_param:
895 return status;
896}
long index
Definition bigint.h:65
#define NODNIC_RING_RING_OFFSET

References buffer, IN, index, MLX_CHECK_STATUS, MLX_INVALID_PARAMETER, MLX_SUCCESS, nodnic_cmd_write(), NODNIC_RING_RING_OFFSET, NULL, and status.

Referenced by nodnic_port_thin_init().

◆ nodnic_port_get_cq_size()

mlx_status nodnic_port_get_cq_size ( IN nodnic_port_priv * port_priv,
OUT mlx_uint64 * cq_size )

Definition at line 899 of file mlx_port.c.

903{
905 mlx_uint32 out = 0;
908 "nodnic_port_query failed");
909 *cq_size = 1 << out;
910query_err:
911 return status;
912}

References IN, MLX_FATAL_CHECK_STATUS, MLX_SUCCESS, nodnic_port_option_log_cq_size, nodnic_port_query(), OUT, out, and status.

Referenced by flexboot_nodnic_eth_open().

◆ nodnic_port_allocate_eq()

mlx_status nodnic_port_allocate_eq ( IN nodnic_port_priv * port_priv,
IN mlx_uint8 log_eq_size )

Definition at line 915 of file mlx_port.c.

919{
921 nodnic_device_priv *device_priv = NULL;
923
924 if( port_priv == NULL ){
926 goto bad_param;
927 }
928
929 device_priv = port_priv->device;
930 port_priv->eq.eq_size = ( ( 1 << log_eq_size ) * 1024 ); /* Size is in KB */
931 status = mlx_memory_alloc_dma(device_priv->utils,
932 port_priv->eq.eq_size,
934 &port_priv->eq.eq_virt);
936 "eq allocation error");
937
938 status = mlx_memory_map_dma(device_priv->utils,
939 port_priv->eq.eq_virt,
940 port_priv->eq.eq_size,
941 &port_priv->eq.eq_physical,
942 &port_priv->eq.map);
944 "eq map error");
945
946 address = port_priv->eq.eq_physical;
950 "failed to set eq addr low");
951 address = (address >> 32);
955 "failed to set eq addr high");
956 return status;
957set_err:
958 mlx_memory_ummap_dma(device_priv->utils, port_priv->eq.map);
959map_err:
960 mlx_memory_free_dma(device_priv->utils,
961 port_priv->eq.eq_size,
962 (void **)&(port_priv->eq.eq_virt));
963alloc_err:
964bad_param:
965 return status;
966}

References address, IN, MLX_FATAL_CHECK_STATUS, MLX_INVALID_PARAMETER, mlx_memory_alloc_dma(), mlx_memory_free_dma(), mlx_memory_map_dma(), mlx_memory_ummap_dma(), MLX_SUCCESS, NODNIC_MEMORY_ALIGN, nodnic_port_option_eq_addr_high, nodnic_port_option_eq_addr_low, nodnic_port_set(), NULL, status, and _nodnic_device_priv::utils.

Referenced by flexboot_nodnic_eth_open().

◆ nodnic_port_free_eq()

mlx_status nodnic_port_free_eq ( IN nodnic_port_priv * port_priv)

Definition at line 968 of file mlx_port.c.

971{
973 nodnic_device_priv *device_priv = NULL;
974
975 if( port_priv == NULL ){
977 goto bad_param;
978 }
979
980 device_priv = port_priv->device;
981 mlx_memory_ummap_dma(device_priv->utils, port_priv->eq.map);
982
983 mlx_memory_free_dma(device_priv->utils,
984 port_priv->eq.eq_size,
985 (void **)&(port_priv->eq.eq_virt));
986
987bad_param:
988 return status;
989}

References IN, MLX_INVALID_PARAMETER, mlx_memory_free_dma(), mlx_memory_ummap_dma(), MLX_SUCCESS, NULL, status, and _nodnic_device_priv::utils.

Referenced by flexboot_nodnic_eth_close(), and flexboot_nodnic_eth_open().

◆ nodnic_port_add_mac_filter()

mlx_status nodnic_port_add_mac_filter ( IN nodnic_port_priv * port_priv,
IN mlx_mac_address mac )

Definition at line 992 of file mlx_port.c.

996{
999 mlx_uint8 index = 0;
1000 mlx_uint32 out = 0;
1001 mlx_uint32 mac_filters_en = 0;
1002 mlx_uint32 address = 0;
1003 mlx_mac_address zero_mac;
1004 mlx_utils *utils = NULL;
1005
1006 if( port_priv == NULL){
1008 goto bad_param;
1009 }
1010
1011 device = port_priv->device;
1012 utils = device->utils;
1013
1014 mlx_memory_set(utils, &zero_mac, 0, sizeof(zero_mac));
1015 /* check if mac already exists */
1016 for( ; index < NODNIC_MAX_MAC_FILTERS ; index ++) {
1017 mlx_memory_cmp(utils, &port_priv->mac_filters[index], &mac,
1018 sizeof(mac), &out);
1019 if ( out == 0 ){
1021 goto already_exists;
1022 }
1023 }
1024
1025 /* serch for available mac filter slot */
1026 for (index = 0 ; index < NODNIC_MAX_MAC_FILTERS ; index ++) {
1027 mlx_memory_cmp(utils, &port_priv->mac_filters[index], &zero_mac,
1028 sizeof(zero_mac), &out);
1029 if ( out == 0 ){
1030 break;
1031 }
1032 }
1033 if ( index >= NODNIC_MAX_MAC_FILTERS ){
1035 goto mac_list_full;
1036 }
1037
1039 &mac_filters_en);
1040 MLX_CHECK_STATUS(device, status , query_err,
1041 "nodnic_port_query failed");
1042 if(mac_filters_en & (1 << index)){
1044 goto mac_list_full;
1045 }
1046 port_priv->mac_filters[index] = mac;
1047
1048 // set mac filter
1049 address = port_priv->port_offset + NODNIC_PORT_MAC_FILTERS_OFFSET +
1050 (0x8 * index);
1051
1053 MLX_CHECK_STATUS(device, status, write_err, "set mac high failed");
1054 status = nodnic_cmd_write(device, address + 0x4, mac.low );
1055 MLX_CHECK_STATUS(device, status, write_err, "set mac low failed");
1056
1057 // enable mac filter
1058 mac_filters_en = mac_filters_en | (1 << index);
1060 mac_filters_en);
1061 MLX_CHECK_STATUS(device, status , set_err,
1062 "nodnic_port_set failed");
1063set_err:
1064write_err:
1065query_err:
1066mac_list_full:
1067already_exists:
1068bad_param:
1069 return status;
1070}
uint8_t mac[ETH_ALEN]
MAC address.
Definition ena.h:13
mlx_status mlx_memory_cmp(IN mlx_utils *utils, IN mlx_void *first_block, IN mlx_void *second_block, IN mlx_size size, OUT mlx_uint32 *out)
Definition mlx_memory.c:151
#define NODNIC_MAX_MAC_FILTERS
#define NODNIC_PORT_MAC_FILTERS_OFFSET
Definition mlx_port.h:27
#define MLX_FAILED
uint8_t mlx_uint8
A hardware device.
Definition device.h:77

References address, IN, index, mac, MLX_CHECK_STATUS, MLX_FAILED, MLX_INVALID_PARAMETER, mlx_memory_cmp(), mlx_memory_set(), MLX_SUCCESS, nodnic_cmd_write(), NODNIC_MAX_MAC_FILTERS, NODNIC_PORT_MAC_FILTERS_OFFSET, nodnic_port_option_mac_filters_en, nodnic_port_query(), nodnic_port_set(), NULL, out, and status.

Referenced by flexboot_nodnic_mcast_attach().

◆ nodnic_port_remove_mac_filter()

mlx_status nodnic_port_remove_mac_filter ( IN nodnic_port_priv * port_priv,
IN mlx_mac_address mac )

Definition at line 1073 of file mlx_port.c.

1077{
1080 mlx_uint8 index = 0;
1081 mlx_uint32 out = 0;
1082 mlx_uint32 mac_filters_en = 0;
1083 mlx_mac_address zero_mac;
1084 mlx_utils *utils = NULL;
1085
1086 if( port_priv == NULL){
1088 goto bad_param;
1089 }
1090
1091 device = port_priv->device;
1092 utils = device->utils;
1093
1094 mlx_memory_set(utils, &zero_mac, 0, sizeof(zero_mac));
1095 /* serch for mac filter */
1096 for( ; index < NODNIC_MAX_MAC_FILTERS ; index ++) {
1097 mlx_memory_cmp(utils, &port_priv->mac_filters[index], &mac,
1098 sizeof(mac), &out);
1099 if ( out == 0 ){
1100 break;
1101 }
1102 }
1103 if ( index == NODNIC_MAX_MAC_FILTERS ){
1105 goto mac_not_found;
1106 }
1107
1109 &mac_filters_en);
1110 MLX_CHECK_STATUS(device, status , query_err,
1111 "nodnic_port_query failed");
1112 if((mac_filters_en & (1 << index)) == 0){
1114 goto mac_not_en;
1115 }
1116 port_priv->mac_filters[index] = zero_mac;
1117
1118 // disable mac filter
1119 mac_filters_en = mac_filters_en & ~(1 << index);
1121 mac_filters_en);
1122 MLX_CHECK_STATUS(device, status , set_err,
1123 "nodnic_port_set failed");
1124set_err:
1125query_err:
1126mac_not_en:
1127mac_not_found:
1128bad_param:
1129 return status;
1130}

References IN, index, mac, MLX_CHECK_STATUS, MLX_FAILED, MLX_INVALID_PARAMETER, mlx_memory_cmp(), mlx_memory_set(), MLX_SUCCESS, NODNIC_MAX_MAC_FILTERS, nodnic_port_option_mac_filters_en, nodnic_port_query(), nodnic_port_set(), NULL, out, and status.

Referenced by flexboot_nodnic_mcast_detach().

◆ nodnic_port_add_mgid_filter()

mlx_status nodnic_port_add_mgid_filter ( IN nodnic_port_priv * port_priv,
IN mlx_mac_address mac )

References IN, and mac.

◆ nodnic_port_remove_mgid_filter()

mlx_status nodnic_port_remove_mgid_filter ( IN nodnic_port_priv * port_priv,
IN mlx_mac_address mac )

References IN, mac, OUT, and value.

◆ nodnic_port_thin_init()

mlx_status nodnic_port_thin_init ( IN nodnic_device_priv * device_priv,
IN nodnic_port_priv * port_priv,
IN mlx_uint8 port_index )

Definition at line 1315 of file mlx_port.c.

1320{
1322 mlx_boolean reset_needed = 0;
1323#ifdef DEVICE_CX3
1325#endif
1326
1327 if( device_priv == NULL || port_priv == NULL || port_index > 1){
1329 goto invalid_parm;
1330 }
1331
1332 port_priv->device = device_priv;
1333
1334 port_priv->port_offset = device_priv->device_offset +
1335 nodnic_port_offset_table[port_index];
1336
1337 port_priv->port_num = port_index + 1;
1338
1339 port_priv->send_doorbell = nodnic_port_update_ring_doorbell;
1340 port_priv->recv_doorbell = nodnic_port_update_ring_doorbell;
1341 port_priv->set_dma = nodnic_port_set_dma;
1342#ifdef DEVICE_CX3
1343 if (device_priv->device_cap.crspace_doorbells) {
1344 status = nodnic_cmd_read(device_priv, (port_priv->port_offset + 0x100),
1345 &offset);
1346 if (status != MLX_SUCCESS) {
1347 return status;
1348 } else {
1349 port_priv->data_flow_gw = (nodnic_port_data_flow_gw *)
1350 (device_priv->utils->config + offset);
1351 }
1352 if ( nodnic_port_set ( port_priv, nodnic_port_option_crspace_en, 1 ) ) {
1353 return MLX_FAILED;
1354 }
1355 port_priv->send_doorbell = nodnic_port_send_db_connectx3;
1356 port_priv->recv_doorbell = nodnic_port_recv_db_connectx3;
1357 port_priv->set_dma = nodnic_port_set_dma_connectx3;
1358 }
1359#endif
1360 if ( device_priv->device_cap.support_rx_pi_dma ) {
1361 port_priv->recv_doorbell = nodnic_port_recv_db_dma;
1362 }
1363
1364 /* clear reset_needed */
1365 nodnic_port_read_reset_needed(port_priv, &reset_needed);
1366
1367 port_priv->port_type = NODNIC_PORT_TYPE_UNKNOWN;
1368invalid_parm:
1369 return status;
1370}
uint16_t offset
Offset to command line.
Definition bzimage.h:3
static mlx_status nodnic_port_set_dma(IN nodnic_port_priv *port_priv, IN mlx_boolean value)
Definition mlx_port.c:1170
int nodnic_port_offset_table[MAX_NODNIC_PORTS]
Definition mlx_port.c:82
static mlx_status nodnic_port_recv_db_dma(IN nodnic_port_priv *port_priv, IN struct nodnic_ring *ring, IN mlx_uint16 index)
Definition mlx_port.c:860
mlx_status nodnic_port_read_reset_needed(IN nodnic_port_priv *port_priv, OUT mlx_boolean *reset_needed)
Definition mlx_port.c:221
mlx_status nodnic_port_update_ring_doorbell(IN nodnic_port_priv *port_priv, IN struct nodnic_ring *ring, IN mlx_uint16 index)
Definition mlx_port.c:874
mlx_status nodnic_port_set(IN nodnic_port_priv *port_priv, IN nodnic_port_option option, IN mlx_uint32 in)
Definition mlx_port.c:155
uint8_t mlx_boolean

References IN, MLX_FAILED, MLX_INVALID_PARAMETER, MLX_SUCCESS, nodnic_cmd_read(), nodnic_port_offset_table, nodnic_port_read_reset_needed(), nodnic_port_recv_db_dma(), nodnic_port_set(), nodnic_port_set_dma(), NODNIC_PORT_TYPE_UNKNOWN, nodnic_port_update_ring_doorbell(), NULL, offset, and status.

Referenced by flexboot_nodnic_thin_init_ports().

◆ nodnic_port_set_promisc()

mlx_status nodnic_port_set_promisc ( IN nodnic_port_priv * port_priv,
IN mlx_boolean value )

Definition at line 1205 of file mlx_port.c.

1208 {
1211
1213 MLX_CHECK_STATUS(port_priv->device, status, set_err,
1214 "nodnic_port_set failed");
1215set_err:
1216 return status;
1217}
pseudo_bit_t value[0x00020]
Definition arbel.h:2

References buffer, IN, MLX_CHECK_STATUS, MLX_SUCCESS, nodnic_port_option_port_promisc_en, nodnic_port_set(), status, and value.

Referenced by flexboot_nodnic_eth_close(), and flexboot_nodnic_eth_open().

◆ nodnic_port_set_promisc_multicast()

mlx_status nodnic_port_set_promisc_multicast ( IN nodnic_port_priv * port_priv,
IN mlx_boolean value )

Definition at line 1220 of file mlx_port.c.

1223 {
1226
1228 MLX_CHECK_STATUS(port_priv->device, status, set_err,
1229 "nodnic_port_set failed");
1230set_err:
1231 return status;
1232}

References buffer, IN, MLX_CHECK_STATUS, MLX_SUCCESS, nodnic_port_option_port_promisc_multicast_en, nodnic_port_set(), status, and value.

◆ nodnic_port_init()

mlx_status nodnic_port_init ( IN nodnic_port_priv * port_priv)

Definition at line 1235 of file mlx_port.c.

1238{
1240
1241 if( port_priv == NULL ){
1243 goto bad_param;
1244 }
1245
1246 status = nodnic_port_set_network(port_priv, TRUE);
1248 "nodnic_port_set_network failed");
1249set_err:
1250bad_param:
1251 return status;
1252}
static mlx_status nodnic_port_set_network(IN nodnic_port_priv *port_priv, IN mlx_boolean value)
Definition mlx_port.c:1134
#define TRUE
Definition tlan.h:46

References IN, MLX_FATAL_CHECK_STATUS, MLX_INVALID_PARAMETER, MLX_SUCCESS, nodnic_port_set_network(), NULL, status, and TRUE.

Referenced by flexboot_nodnic_eth_open().

◆ nodnic_port_close()

mlx_status nodnic_port_close ( IN nodnic_port_priv * port_priv)

Definition at line 1255 of file mlx_port.c.

1258{
1260
1261 if( port_priv == NULL ){
1263 goto bad_param;
1264 }
1265
1266 status = nodnic_port_set_network(port_priv, FALSE);
1268 "nodnic_port_set_network failed");
1269set_err:
1270bad_param:
1271 return status;
1272}
#define FALSE
Definition tlan.h:45

References FALSE, IN, MLX_FATAL_CHECK_STATUS, MLX_INVALID_PARAMETER, MLX_SUCCESS, nodnic_port_set_network(), NULL, and status.

Referenced by flexboot_nodnic_eth_close(), and flexboot_nodnic_eth_open().

◆ nodnic_port_enable_dma()

mlx_status nodnic_port_enable_dma ( IN nodnic_port_priv * port_priv)

Definition at line 1275 of file mlx_port.c.

1278{
1280
1281 if( port_priv == NULL ){
1283 goto bad_param;
1284 }
1285
1287 MLX_CHECK_STATUS(port_priv->device, status, set_err,
1288 "nodnic_port_check_and_set_dma failed");
1289set_err:
1290bad_param:
1291 return status;
1292}
static mlx_status nodnic_port_check_and_set_dma(IN nodnic_port_priv *port_priv, IN mlx_boolean value)
Definition mlx_port.c:1180

References IN, MLX_CHECK_STATUS, MLX_INVALID_PARAMETER, MLX_SUCCESS, nodnic_port_check_and_set_dma(), NULL, status, and TRUE.

Referenced by flexboot_nodnic_enable_dma(), and flexboot_nodnic_eth_open().

◆ nodnic_port_disable_dma()

mlx_status nodnic_port_disable_dma ( IN nodnic_port_priv * port_priv)

Definition at line 1295 of file mlx_port.c.

1298{
1300
1301 if( port_priv == NULL ){
1303 goto bad_param;
1304 }
1305
1307 MLX_CHECK_STATUS(port_priv->device, status, set_err,
1308 "nodnic_port_check_and_set_dma failed");
1309set_err:
1310bad_param:
1311 return status;
1312}

References FALSE, IN, MLX_CHECK_STATUS, MLX_INVALID_PARAMETER, MLX_SUCCESS, nodnic_port_check_and_set_dma(), NULL, and status.

Referenced by flexboot_nodnic_port_disable_dma().

◆ nodnic_port_read_reset_needed()

mlx_status nodnic_port_read_reset_needed ( IN nodnic_port_priv * port_priv,
OUT mlx_boolean * reset_needed )

Definition at line 221 of file mlx_port.c.

225{
227 mlx_uint32 out = 0;
228 status = nodnic_port_query(port_priv,
230 MLX_CHECK_STATUS(port_priv->device, status, query_err,
231 "nodnic_port_query failed");
232 *reset_needed = (mlx_boolean)out;
233query_err:
234 return status;
235}

References IN, MLX_CHECK_STATUS, MLX_SUCCESS, nodnic_port_option_reset_needed, nodnic_port_query(), OUT, out, and status.

Referenced by nodnic_port_thin_init().

◆ nodnic_port_read_port_management_change_event()

mlx_status nodnic_port_read_port_management_change_event ( IN nodnic_port_priv * port_priv,
OUT mlx_boolean * change_event )

Definition at line 238 of file mlx_port.c.

242{
244 mlx_uint32 out = 0;
245 status = nodnic_port_query(port_priv,
247 MLX_CHECK_STATUS(port_priv->device, status, query_err,
248 "nodnic_port_query failed");
249 *change_event = (mlx_boolean)out;
250query_err:
251 return status;
252}

References IN, MLX_CHECK_STATUS, MLX_SUCCESS, nodnic_port_option_port_management_change_event, nodnic_port_query(), OUT, out, and status.

◆ nodnic_port_set_send_uar_offset()

mlx_status nodnic_port_set_send_uar_offset ( IN nodnic_port_priv * port_priv)

Definition at line 197 of file mlx_port.c.

200{
202 mlx_uint32 out = 0;
203
204 if ( ! port_priv->device->device_cap.support_uar_tx_db ) {
205 MLX_DEBUG_INFO1 ( port_priv, "nodnic_port_set_send_uar_offset: tx db using uar is not supported \n");
207 goto uar_not_supported;
208 }
209
210 status = nodnic_port_query(port_priv,
212 MLX_CHECK_STATUS(port_priv->device, status, query_err,
213 "nodnic_port_query failed");
214 port_priv->device->uar.offset = out << port_priv->device->device_cap.log_uar_page_size;
215uar_not_supported:
216query_err:
217 return status;
218}
#define MLX_DEBUG_INFO1(...)
Definition mlx_logging.h:31
#define MLX_UNSUPPORTED

References IN, MLX_CHECK_STATUS, MLX_DEBUG_INFO1, MLX_SUCCESS, MLX_UNSUPPORTED, nodnic_port_option_send_ring0_uar_index, nodnic_port_query(), out, and status.

Referenced by flexboot_nodnic_alloc_uar().

◆ nodnic_port_update_tx_db_func()

mlx_status nodnic_port_update_tx_db_func ( IN nodnic_device_priv * device_priv,
IN nodnic_port_priv * port_priv )

References IN.