iPXE
flexboot_nodnic.c File Reference

Go to the source code of this file.

Macros

#define ARM_CQ_UAR_CQ_CI_MASK   0xffffff
#define ARM_CQ_UAR_CMDSN_MASK   3
#define ARM_CQ_UAR_CMDSN_OFFSET   28
#define ARM_CQ_UAR_CQ_CI_OFFSET   0x20
#define FLEX_NODNIC_TX_POLL_TOUT   500000
#define FLEX_NODNIC_TX_POLL_USLEEP   10
#define FLEXBOOT_NODNIC_ETH_NUM_SEND_WQES   64
 Number of flexboot_nodnic Ethernet send work queue entries.
#define FLEXBOOT_NODNIC_ETH_NUM_RECV_WQES   64
 Number of flexboot_nodnic Ethernet receive work queue entries.

Functions

 FILE_LICENCE (GPL2_OR_LATER)
static int flexboot_nodnic_arm_cq (struct flexboot_nodnic_port *port)
static int flexboot_nodnic_create_cq (struct ib_device *ibdev, struct ib_completion_queue *cq)
 Create completion queue.
static void flexboot_nodnic_destroy_cq (struct ib_device *ibdev, struct ib_completion_queue *cq)
 Destroy completion queue.
static struct ib_work_queueflexboot_nodnic_find_wq (struct ib_device *ibdev, struct ib_completion_queue *cq, unsigned long qpn, int is_send)
static int flexboot_nodnic_complete (struct ib_device *ibdev, struct ib_completion_queue *cq, struct cqe_data *cqe_data)
 Handle completion.
static void flexboot_nodnic_poll_cq (struct ib_device *ibdev, struct ib_completion_queue *cq)
 Poll completion queue.
static int flexboot_nodnic_create_qp (struct ib_device *ibdev, struct ib_queue_pair *qp)
 Create queue pair.
static int flexboot_nodnic_modify_qp (struct ib_device *ibdev, struct ib_queue_pair *qp)
 Modify queue pair.
static void flexboot_nodnic_destroy_qp (struct ib_device *ibdev, struct ib_queue_pair *qp)
 Destroy queue pair.
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 void flexboot_nodnic_poll_eq (struct ib_device *ibdev)
static int flexboot_nodnic_mcast_attach (struct ib_device *ibdev, struct ib_queue_pair *qp, union ib_gid *gid)
static void flexboot_nodnic_mcast_detach (struct ib_device *ibdev, struct ib_queue_pair *qp, union ib_gid *gid)
static int flexboot_nodnic_ib_open (struct ib_device *ibdev)
 Initialise Infiniband link.
static void flexboot_nodnic_ib_close (struct ib_device *ibdev)
 Close Infiniband link.
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_complete_all_tx (struct flexboot_nodnic_port *port)
static void flexboot_nodnic_port_disable_dma (struct flexboot_nodnic_port *port)
static int flexboot_nodnic_eth_transmit (struct net_device *netdev, struct io_buffer *iobuf)
 Transmit packet via flexboot_nodnic Ethernet device.
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 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 void flexboot_nodnic_eth_poll (struct net_device *netdev)
 Poll flexboot_nodnic Ethernet device.
static int flexboot_nodnic_eth_open (struct net_device *netdev)
 Open flexboot_nodnic Ethernet device.
static void flexboot_nodnic_eth_close (struct net_device *netdev)
 Close flexboot_nodnic Ethernet device.
void flexboot_nodnic_eth_irq (struct net_device *netdev, int enable)
static int flexboot_nodnic_register_netdev (struct flexboot_nodnic *flexboot_nodnic, struct flexboot_nodnic_port *port)
 Register flexboot_nodnic Ethernet device.
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.
static mlx_status flexboot_nodnic_allocate_infiniband_devices (struct flexboot_nodnic *flexboot_nodnic_priv)
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)
static mlx_status flexboot_nodnic_ports_register_dev (struct flexboot_nodnic *flexboot_nodnic_priv)
static mlx_status flexboot_nodnic_ports_unregister_dev (struct flexboot_nodnic *flexboot_nodnic_priv)
static void flexboot_nodnic_enable_dma (struct flexboot_nodnic *nodnic)
static void flexboot_nodnic_disable_dma (struct flexboot_nodnic *nodnic)
int flexboot_nodnic_is_supported (struct pci_device *pci)
void flexboot_nodnic_copy_mac (uint8_t mac_addr[], uint32_t low_byte, uint16_t high_byte)
static mlx_status flexboot_nodnic_get_factory_mac (struct flexboot_nodnic *flexboot_nodnic_priv, uint8_t port)
static int flexboot_nodnic_set_port_masking (struct flexboot_nodnic *flexboot_nodnic)
 Set port masking.
int init_mlx_utils (mlx_utils **utils, struct pci_device *pci)
void free_mlx_utils (mlx_utils **utils)
static int flexboot_nodnic_alloc_uar (struct flexboot_nodnic *flexboot_nodnic)
 Initialise Nodnic PCI parameters.
static int flexboot_nodnic_dealloc_uar (struct flexboot_nodnic *flexboot_nodnic)
int flexboot_nodnic_probe (struct pci_device *pci, struct flexboot_nodnic_callbacks *callbacks, void *drv_priv)
void flexboot_nodnic_remove (struct pci_device *pci)

Variables

static struct ib_device_operations flexboot_nodnic_ib_operations
 flexboot_nodnic Infiniband operations
static struct ib_queue_pair_operations flexboot_nodnic_eth_qp_op
 flexboot nodnic Ethernet queue pair operations
static struct ib_completion_queue_operations flexboot_nodnic_eth_cq_op
 flexboot_nodnic Ethernet device completion operations
static struct net_device_operations flexboot_nodnic_eth_operations
 flexboot_nodnic Ethernet network device operations
static struct flexboot_nodnic_port_type flexboot_nodnic_port_type_eth
 flexboot_nodnic Ethernet port type

Macro Definition Documentation

◆ ARM_CQ_UAR_CQ_CI_MASK

#define ARM_CQ_UAR_CQ_CI_MASK   0xffffff

Referenced by flexboot_nodnic_arm_cq().

◆ ARM_CQ_UAR_CMDSN_MASK

#define ARM_CQ_UAR_CMDSN_MASK   3

Referenced by flexboot_nodnic_arm_cq().

◆ ARM_CQ_UAR_CMDSN_OFFSET

#define ARM_CQ_UAR_CMDSN_OFFSET   28

Referenced by flexboot_nodnic_arm_cq().

◆ ARM_CQ_UAR_CQ_CI_OFFSET

#define ARM_CQ_UAR_CQ_CI_OFFSET   0x20

Referenced by flexboot_nodnic_arm_cq().

◆ FLEX_NODNIC_TX_POLL_TOUT

#define FLEX_NODNIC_TX_POLL_TOUT   500000

Definition at line 704 of file flexboot_nodnic.c.

Referenced by flexboot_nodnic_complete_all_tx().

◆ FLEX_NODNIC_TX_POLL_USLEEP

#define FLEX_NODNIC_TX_POLL_USLEEP   10

Definition at line 705 of file flexboot_nodnic.c.

Referenced by flexboot_nodnic_complete_all_tx().

◆ FLEXBOOT_NODNIC_ETH_NUM_SEND_WQES

#define FLEXBOOT_NODNIC_ETH_NUM_SEND_WQES   64

Number of flexboot_nodnic Ethernet send work queue entries.

Definition at line 751 of file flexboot_nodnic.c.

Referenced by flexboot_nodnic_eth_open().

◆ FLEXBOOT_NODNIC_ETH_NUM_RECV_WQES

#define FLEXBOOT_NODNIC_ETH_NUM_RECV_WQES   64

Number of flexboot_nodnic Ethernet receive work queue entries.

Definition at line 754 of file flexboot_nodnic.c.

Referenced by flexboot_nodnic_eth_open().

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER )

◆ flexboot_nodnic_arm_cq()

int flexboot_nodnic_arm_cq ( struct flexboot_nodnic_port * port)
static

Definition at line 56 of file flexboot_nodnic.c.

56 {
57#ifndef DEVICE_CX3
58 mlx_uint32 val32 = 0;
59 union arm_cq_uar cq_uar;
60
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 ) {
66 cq_uar.dword[0] = cpu_to_be32((port->eth_cq->next_idx & ARM_CQ_UAR_CQ_CI_MASK) |
68 cq_uar.dword[1] = cpu_to_be32(port->eth_cq->cqn);
69 wmb();
70 writeq(cq_uar.qword, port->port_priv.device->uar.virt + ARM_CQ_UAR_CQ_CI_OFFSET);
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];
73 } else {
74 val32 = ( port->eth_cq->next_idx & 0xffffff );
75 if ( nodnic_port_set ( & port->port_priv, nodnic_port_option_arm_cq, val32 ) ) {
76 MLX_DEBUG_ERROR( port->port_priv.device, "Failed to arm the CQ\n" );
77 return MLX_FAILED;
78 }
79 }
80#else
81 mlx_utils *utils = port->port_priv.device->utils;
82 nodnic_port_data_flow_gw *ptr = port->port_priv.data_flow_gw;
83 mlx_uint32 data = 0;
84 mlx_uint32 val = 0;
85
86 if ( port->port_priv.device->device_cap.crspace_doorbells == 0 ) {
87 val = ( port->eth_cq->next_idx & 0xffff );
88 if ( nodnic_port_set ( & port->port_priv, nodnic_port_option_arm_cq, val ) ) {
89 MLX_DEBUG_ERROR( port->port_priv.device, "Failed to arm the CQ\n" );
90 return MLX_FAILED;
91 }
92 } else {
93 /* Arming the CQ with CQ CI should be with this format -
94 * 16 bit - CQ CI - same endianness as the FW (don't swap bytes)
95 * 15 bit - reserved
96 * 1 bit - arm CQ - must correct the endianness with the reserved above */
97 data = ( ( ( port->eth_cq->next_idx & 0xffff ) << 16 ) | 0x0080 );
98 /* Write the new index and update FW that new data was submitted */
100 ( mlx_uintn ) & ( ptr->armcq_cq_ci_dword ), 1, &data );
101 }
102#endif
103 return 0;
104}
u8 port
Port number.
Definition CIB_PRM.h:3
uint8_t data[48]
Additional event data.
Definition ena.h:11
#define ARM_CQ_UAR_CQ_CI_MASK
#define ARM_CQ_UAR_CQ_CI_OFFSET
#define ARM_CQ_UAR_CMDSN_OFFSET
#define ARM_CQ_UAR_CMDSN_MASK
#define cpu_to_be32(value)
Definition byteswap.h:111
#define wmb()
Definition io.h:546
#define writeq(data, io_addr)
Definition io.h:273
void __asmcall int val
Definition setjmp.h:12
#define MLX_DEBUG_ERROR(...)
Definition mlx_logging.h:29
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)
Definition mlx_pci.c:116
@ MlxPciWidthUint32
Definition mlx_pci.h:30
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
@ nodnic_port_option_arm_cq
Definition mlx_port.h:45
uint32_t mlx_uint32
#define MLX_FAILED
unsigned long mlx_uintn

References ARM_CQ_UAR_CMDSN_MASK, ARM_CQ_UAR_CMDSN_OFFSET, ARM_CQ_UAR_CQ_CI_MASK, ARM_CQ_UAR_CQ_CI_OFFSET, cpu_to_be32, data, arm_cq_uar::dword, MLX_DEBUG_ERROR, MLX_FAILED, mlx_pci_mem_write(), MlxPciWidthUint32, nodnic_port_option_arm_cq, nodnic_port_set(), port, arm_cq_uar::qword, val, wmb, and writeq.

Referenced by flexboot_nodnic_eth_irq().

◆ flexboot_nodnic_create_cq()

int flexboot_nodnic_create_cq ( struct ib_device * ibdev,
struct ib_completion_queue * cq )
static

Create completion queue.

Parameters
ibdevInfiniband device
cqCompletion queue
Return values
rcReturn status code

Definition at line 113 of file flexboot_nodnic.c.

114 {
117 struct flexboot_nodnic_completion_queue *flexboot_nodnic_cq;
120
121 flexboot_nodnic_cq = (struct flexboot_nodnic_completion_queue *)
122 zalloc(sizeof(*flexboot_nodnic_cq));
123 if ( flexboot_nodnic_cq == NULL ) {
125 goto qp_alloc_err;
126 }
127
128 status = nodnic_port_create_cq(&port->port_priv,
129 cq->num_cqes *
131 &flexboot_nodnic_cq->nodnic_completion_queue
132 );
133 MLX_FATAL_CHECK_STATUS(status, create_err,
134 "nodnic_port_create_cq failed");
136 flexboot_nodnic_cq->nodnic_completion_queue->cq_virt,
137 cq->num_cqes);
139 status = nodnic_port_query(&port->port_priv,
141 (mlx_uint32 *)&cqn );
142 MLX_FATAL_CHECK_STATUS(status, read_cqn_err,
143 "failed to query cqn");
144 cq->cqn = cqn;
145 }
146
147 ib_cq_set_drvdata ( cq, flexboot_nodnic_cq );
148 return status;
149read_cqn_err:
150create_err:
151 free(flexboot_nodnic_cq);
152qp_alloc_err:
153 return status;
154}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
__be32 cqn
Definition CIB_PRM.h:1
uint8_t status
Status.
Definition ena.h:5
static __always_inline void * ib_get_drvdata(struct ib_device *ibdev)
Get Infiniband device driver-private data.
Definition infiniband.h:709
static __always_inline void ib_cq_set_drvdata(struct ib_completion_queue *cq, void *priv)
Set Infiniband completion queue driver-private data.
Definition infiniband.h:676
void * zalloc(size_t size)
Allocate cleared memory.
Definition malloc.c:662
#define MLX_FATAL_CHECK_STATUS(status, label, message)
Definition mlx_bail.h:29
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
@ nodnic_port_option_cq_n_index
Definition mlx_port.h:52
mlx_status nodnic_port_create_cq(IN nodnic_port_priv *port_priv, IN mlx_size cq_size, OUT nodnic_cq **cq)
Definition mlx_port.c:360
#define MLX_SUCCESS
int mlx_status
#define MLX_OUT_OF_RESOURCES
static void(* free)(struct refcnt *refcnt))
Definition refcnt.h:55
mlx_void * cq_virt
cq entries
nodnic_device_capabilites device_cap
mlx_status(* cqe_set_owner)(void *cq, unsigned int num_cqes)
A flexboot nodnic port.
struct ib_device * ibdev
Infiniband device.
A flexboot_nodnic device.
nodnic_device_priv device_priv
nodnic device
struct flexboot_nodnic_callbacks * callbacks
nic specific data
struct flexboot_nodnic_port port[FLEXBOOT_NODNIC_MAX_PORTS]
flexboot_nodnic ports
unsigned long cqn
Completion queue number.
Definition infiniband.h:231
unsigned int num_cqes
Number of completion queue entries.
Definition infiniband.h:233
unsigned int port
Port number.
Definition infiniband.h:419

References flexboot_nodnic::callbacks, _nodnic_cq::cq_virt, flexboot_nodnic_callbacks::cqe_set_owner, cqn, ib_completion_queue::cqn, _nodnic_device_priv::device_cap, flexboot_nodnic::device_priv, free, flexboot_nodnic_callbacks::get_cqe_size, ib_cq_set_drvdata(), ib_get_drvdata(), flexboot_nodnic_port::ibdev, MLX_FATAL_CHECK_STATUS, MLX_OUT_OF_RESOURCES, MLX_SUCCESS, flexboot_nodnic_completion_queue::nodnic_completion_queue, nodnic_port_create_cq(), nodnic_port_option_cq_n_index, nodnic_port_query(), NULL, ib_completion_queue::num_cqes, flexboot_nodnic::port, ib_device::port, port, status, _nodnic_device_capabilites::support_bar_cq_ctrl, and zalloc().

◆ flexboot_nodnic_destroy_cq()

void flexboot_nodnic_destroy_cq ( struct ib_device * ibdev,
struct ib_completion_queue * cq )
static

Destroy completion queue.

Parameters
ibdevInfiniband device
cqCompletion queue

Definition at line 162 of file flexboot_nodnic.c.

163 {
166 struct flexboot_nodnic_completion_queue *flexboot_nodnic_cq = ib_cq_get_drvdata ( cq );
167
168 nodnic_port_destroy_cq(&port->port_priv,
169 flexboot_nodnic_cq->nodnic_completion_queue);
170
171 free(flexboot_nodnic_cq);
172}
static __always_inline void * ib_cq_get_drvdata(struct ib_completion_queue *cq)
Get Infiniband completion queue driver-private data.
Definition infiniband.h:687
mlx_status nodnic_port_destroy_cq(IN nodnic_port_priv *port_priv, IN nodnic_cq *cq)
Definition mlx_port.c:426

References free, ib_cq_get_drvdata(), ib_get_drvdata(), flexboot_nodnic_port::ibdev, flexboot_nodnic_completion_queue::nodnic_completion_queue, nodnic_port_destroy_cq(), flexboot_nodnic::port, ib_device::port, and port.

◆ flexboot_nodnic_find_wq()

struct ib_work_queue * flexboot_nodnic_find_wq ( struct ib_device * ibdev,
struct ib_completion_queue * cq,
unsigned long qpn,
int is_send )
static

Definition at line 175 of file flexboot_nodnic.c.

177 {
178 struct ib_work_queue *wq;
179 struct flexboot_nodnic_queue_pair *flexboot_nodnic_qp;
182 struct nodnic_ring *ring;
183 mlx_uint32 out_qpn;
184 list_for_each_entry ( wq, &cq->work_queues, list ) {
185 flexboot_nodnic_qp = ib_qp_get_drvdata ( wq->qp );
186 if( wq->is_send == is_send && wq->is_send == TRUE ) {
187 ring = &flexboot_nodnic_qp->nodnic_queue_pair->send.nodnic_ring;
188 } else if( wq->is_send == is_send && wq->is_send == FALSE ) {
189 ring = &flexboot_nodnic_qp->nodnic_queue_pair->receive.nodnic_ring;
190 } else {
191 continue;
192 }
193 nodnic_port_get_qpn(&port->port_priv, ring, &out_qpn);
194 if ( out_qpn == qpn )
195 return wq;
196 }
197 return NULL;
198}
__be32 qpn
Definition CIB_PRM.h:1
static __always_inline void * ib_qp_get_drvdata(struct ib_queue_pair *qp)
Get Infiniband queue pair driver-private data.
Definition infiniband.h:643
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition list.h:432
mlx_status nodnic_port_get_qpn(IN nodnic_port_priv *port_priv, IN struct nodnic_ring *ring, OUT mlx_uint32 *qpn)
Definition mlx_port.c:796
struct nodnic_send_ring send
struct nodnic_recv_ring receive
A flexboot nodnic queue pair.
struct list_head work_queues
List of work queues completing to this queue.
Definition infiniband.h:243
An Infiniband Work Queue.
Definition infiniband.h:101
struct ib_queue_pair * qp
Containing queue pair.
Definition infiniband.h:103
int is_send
"Is a send queue" flag
Definition infiniband.h:105
struct nodnic_ring nodnic_ring
struct nodnic_ring nodnic_ring
#define TRUE
Definition tlan.h:46
#define FALSE
Definition tlan.h:45

References FALSE, ib_get_drvdata(), ib_qp_get_drvdata(), flexboot_nodnic_port::ibdev, ib_work_queue::is_send, list_for_each_entry, nodnic_port_get_qpn(), flexboot_nodnic_queue_pair::nodnic_queue_pair, nodnic_recv_ring::nodnic_ring, nodnic_send_ring::nodnic_ring, NULL, flexboot_nodnic::port, ib_device::port, port, ib_work_queue::qp, qpn, _nodnic_qp::receive, _nodnic_qp::send, TRUE, and ib_completion_queue::work_queues.

Referenced by flexboot_nodnic_complete().

◆ flexboot_nodnic_complete()

int flexboot_nodnic_complete ( struct ib_device * ibdev,
struct ib_completion_queue * cq,
struct cqe_data * cqe_data )
static

Handle completion.

Parameters
ibdevInfiniband device
cqCompletion queue
cqeHardware completion queue entry
Return values
rcReturn status code

Definition at line 208 of file flexboot_nodnic.c.

210 {
212 struct ib_work_queue *wq;
213 struct ib_queue_pair *qp;
214 struct io_buffer *iobuf;
215 struct ib_address_vector recv_dest;
216 struct ib_address_vector recv_source;
217 unsigned long qpn;
218 unsigned long wqe_idx;
219 unsigned long wqe_idx_mask;
220 size_t len;
221 int rc = 0;
222
223 /* Parse completion */
224 qpn = cqe_data->qpn;
225
226 if ( cqe_data->is_error == TRUE ) {
227 DBGC ( flexboot_nodnic, "flexboot_nodnic %p CQN %#lx syndrome %x vendor %x\n",
230 rc = -EIO;
231 /* Don't return immediately; propagate error to completer */
232 }
233
234 /* Identify work queue */
235 wq = flexboot_nodnic_find_wq( ibdev, cq, qpn, cqe_data->is_send );
236 if ( wq == NULL ) {
238 "flexboot_nodnic %p CQN %#lx unknown %s QPN %#lx\n",
239 flexboot_nodnic, cq->cqn,
240 ( cqe_data->is_send ? "send" : "recv" ), qpn );
241 return -EIO;
242 }
243 qp = wq->qp;
244
245 /* Identify work queue entry */
246 wqe_idx = cqe_data->wqe_counter;
247 wqe_idx_mask = ( wq->num_wqes - 1 );
249 "NODNIC %p CQN %#lx QPN %#lx %s WQE %#lx completed:\n",
250 flexboot_nodnic, cq->cqn, qp->qpn,
251 ( cqe_data->is_send ? "send" : "recv" ),
252 wqe_idx );
253
254 /* Identify I/O buffer */
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",
259 flexboot_nodnic, cq->cqn, qp->qpn,
260 ( cqe_data->is_send ? "send" : "recv" ), wqe_idx );
261 return -EIO;
262 }
263 wq->iobufs[wqe_idx & wqe_idx_mask] = NULL;
264
265 if ( cqe_data->is_send == TRUE ) {
266 /* Hand off to completion handler */
267 ib_complete_send ( ibdev, qp, iobuf, rc );
268 } else if ( rc != 0 ) {
269 /* Propagate error to receive completion handler */
270 ib_complete_recv ( ibdev, qp, NULL, NULL, iobuf, rc );
271 } else {
272 /* Set received length */
274 assert ( len <= iob_tailroom ( iobuf ) );
275 iob_put ( iobuf, len );
276 memset ( &recv_dest, 0, sizeof ( recv_dest ) );
277 recv_dest.qpn = qpn;
278 memset ( &recv_source, 0, sizeof ( recv_source ) );
279 switch ( qp->type ) {
280 case IB_QPT_SMI:
281 case IB_QPT_GSI:
282 case IB_QPT_UD:
283 case IB_QPT_RC:
284 break;
285 case IB_QPT_ETH:
286 break;
287 default:
288 assert ( 0 );
289 return -EINVAL;
290 }
291 /* Hand off to completion handler */
292 ib_complete_recv ( ibdev, qp, &recv_dest,
293 &recv_source, iobuf, rc );
294 }
295
296 return rc;
297}
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
struct arbelprm_qp_db_record qp
Definition arbel.h:2
#define assert(condition)
Assert a condition at run-time.
Definition assert.h:50
ring len
Length.
Definition dwmac.h:226
static struct ib_work_queue * flexboot_nodnic_find_wq(struct ib_device *ibdev, struct ib_completion_queue *cq, unsigned long qpn, int is_send)
#define DBGCP(...)
Definition compiler.h:539
#define DBGC(...)
Definition compiler.h:505
#define EINVAL
Invalid argument.
Definition errno.h:429
#define EIO
Input/output error.
Definition errno.h:434
void * memset(void *dest, int character, size_t len) __nonnull
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.
Definition infiniband.c:536
void ib_complete_send(struct ib_device *ibdev, struct ib_queue_pair *qp, struct io_buffer *iobuf, int rc)
Complete send work queue entry.
Definition infiniband.c:515
@ IB_QPT_ETH
Definition infiniband.h:144
@ IB_QPT_UD
Definition infiniband.h:142
@ IB_QPT_GSI
Definition infiniband.h:141
@ IB_QPT_RC
Definition infiniband.h:143
@ IB_QPT_SMI
Definition infiniband.h:140
#define iob_put(iobuf, len)
Definition iobuf.h:125
static size_t iob_tailroom(struct io_buffer *iobuf)
Calculate available space at end of an I/O buffer.
Definition iobuf.h:180
mlx_uint32 vendor_err_syndrome
mlx_uint32 syndrome
mlx_uint32 byte_cnt
mlx_uint32 is_send
mlx_uint32 wqe_counter
mlx_uint32 is_error
mlx_uint32 qpn
An Infiniband Address Vector.
Definition infiniband.h:73
An Infiniband Queue Pair.
Definition infiniband.h:158
struct io_buffer ** iobufs
I/O buffers assigned to work queue.
Definition infiniband.h:125
unsigned int num_wqes
Number of work queue entries.
Definition infiniband.h:113
A persistent I/O buffer.
Definition iobuf.h:38

References assert, cqe_data::byte_cnt, ib_completion_queue::cqn, DBGC, DBGCP, EINVAL, EIO, flexboot_nodnic_find_wq(), ib_complete_recv(), ib_complete_send(), ib_get_drvdata(), IB_QPT_ETH, IB_QPT_GSI, IB_QPT_RC, IB_QPT_SMI, IB_QPT_UD, iob_put, iob_tailroom(), ib_work_queue::iobufs, cqe_data::is_error, cqe_data::is_send, len, memset(), NULL, ib_work_queue::num_wqes, ib_work_queue::qp, qp, cqe_data::qpn, ib_address_vector::qpn, qpn, rc, cqe_data::syndrome, TRUE, cqe_data::vendor_err_syndrome, and cqe_data::wqe_counter.

Referenced by flexboot_nodnic_poll_cq().

◆ flexboot_nodnic_poll_cq()

void flexboot_nodnic_poll_cq ( struct ib_device * ibdev,
struct ib_completion_queue * cq )
static

Poll completion queue.

Parameters
ibdevInfiniband device
cqCompletion queues

Definition at line 304 of file flexboot_nodnic.c.

305 {
307 struct flexboot_nodnic_completion_queue *flexboot_nodnic_cq = ib_cq_get_drvdata ( cq );
308 void *cqe;
309 mlx_size cqe_size;
310 struct cqe_data cqe_data;
311 unsigned int cqe_idx_mask;
312 int rc;
313
315 while ( TRUE ) {
316 /* Look for completion entry */
317 cqe_idx_mask = ( cq->num_cqes - 1 );
318 cqe = ((uint8_t *)flexboot_nodnic_cq->nodnic_completion_queue->cq_virt) +
319 cqe_size * (cq->next_idx & cqe_idx_mask);
320
321 /* TODO: check fill_completion */
323 if ( cqe_data.owner ^
324 ( ( cq->next_idx & cq->num_cqes ) ? 1 : 0 ) ) {
325 /* Entry still owned by hardware; end of poll */
326 break;
327 }
328 /* Handle completion */
329 rc = flexboot_nodnic_complete ( ibdev, cq, &cqe_data );
330 if ( rc != 0 ) {
331 DBGC ( flexboot_nodnic, "flexboot_nodnic %p CQN %#lx failed to complete: %s\n",
332 flexboot_nodnic, cq->cqn, strerror ( rc ) );
333 DBGC_HDA ( flexboot_nodnic, virt_to_phys ( cqe ),
334 cqe, sizeof ( *cqe ) );
335 }
336
337 /* Update completion queue's index */
338 cq->next_idx++;
339 }
340}
unsigned char uint8_t
Definition stdint.h:10
static int flexboot_nodnic_complete(struct ib_device *ibdev, struct ib_completion_queue *cq, struct cqe_data *cqe_data)
Handle completion.
#define DBGC_HDA(...)
Definition compiler.h:506
size_t mlx_size
char * strerror(int errno)
Retrieve string representation of error number.
Definition strerror.c:79
mlx_boolean owner
mlx_status(* fill_completion)(void *cqe, struct cqe_data *cqe_data)
unsigned long next_idx
Next completion queue entry index.
Definition infiniband.h:241

References flexboot_nodnic::callbacks, _nodnic_cq::cq_virt, ib_completion_queue::cqn, DBGC, DBGC_HDA, flexboot_nodnic_callbacks::fill_completion, flexboot_nodnic_complete(), flexboot_nodnic_callbacks::get_cqe_size, ib_cq_get_drvdata(), ib_get_drvdata(), ib_completion_queue::next_idx, flexboot_nodnic_completion_queue::nodnic_completion_queue, ib_completion_queue::num_cqes, cqe_data::owner, rc, strerror(), and TRUE.

◆ flexboot_nodnic_create_qp()

int flexboot_nodnic_create_qp ( struct ib_device * ibdev,
struct ib_queue_pair * qp )
static

Create queue pair.

Parameters
ibdevInfiniband device
qpQueue pair
Return values
rcReturn status code

Definition at line 356 of file flexboot_nodnic.c.

357 {
360 struct flexboot_nodnic_queue_pair *flexboot_nodnic_qp;
362
363 flexboot_nodnic_qp = (struct flexboot_nodnic_queue_pair *)zalloc(sizeof(*flexboot_nodnic_qp));
364 if ( flexboot_nodnic_qp == NULL ) {
366 goto qp_alloc_err;
367 }
368
369 status = nodnic_port_create_qp(&port->port_priv,
371 qp->send.num_wqes * sizeof(struct nodnic_send_wqbb),
372 qp->send.num_wqes,
373 qp->recv.num_wqes * sizeof(struct nodnic_recv_wqe),
374 qp->recv.num_wqes,
375 &flexboot_nodnic_qp->nodnic_queue_pair);
376 MLX_FATAL_CHECK_STATUS(status, create_err,
377 "nodnic_port_create_qp failed");
378 ib_qp_set_drvdata ( qp, flexboot_nodnic_qp );
379 return status;
380create_err:
381 free(flexboot_nodnic_qp);
382qp_alloc_err:
383 return status;
384}
static __always_inline void ib_qp_set_drvdata(struct ib_queue_pair *qp, void *priv)
Set Infiniband queue pair driver-private data.
Definition infiniband.h:632
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 mlx_port.c:585

References free, ib_get_drvdata(), ib_qp_set_drvdata(), flexboot_nodnic_port::ibdev, MLX_FATAL_CHECK_STATUS, MLX_OUT_OF_RESOURCES, MLX_SUCCESS, nodnic_port_create_qp(), flexboot_nodnic_queue_pair::nodnic_queue_pair, NULL, flexboot_nodnic::port, ib_device::port, port, qp, status, and zalloc().

◆ flexboot_nodnic_modify_qp()

int flexboot_nodnic_modify_qp ( struct ib_device * ibdev,
struct ib_queue_pair * qp )
static

Modify queue pair.

Parameters
ibdevInfiniband device
qpQueue pair
Return values
rcReturn status code

Definition at line 393 of file flexboot_nodnic.c.

394 {
395 /*not needed*/
396 return 0;
397}

References __unused, and qp.

◆ flexboot_nodnic_destroy_qp()

void flexboot_nodnic_destroy_qp ( struct ib_device * ibdev,
struct ib_queue_pair * qp )
static

Destroy queue pair.

Parameters
ibdevInfiniband device
qpQueue pair

Definition at line 405 of file flexboot_nodnic.c.

406 {
409 struct flexboot_nodnic_queue_pair *flexboot_nodnic_qp = ib_qp_get_drvdata ( qp );
410
411 nodnic_port_destroy_qp(&port->port_priv,
413 flexboot_nodnic_qp->nodnic_queue_pair);
414
415 free(flexboot_nodnic_qp);
416}
mlx_status nodnic_port_destroy_qp(IN nodnic_port_priv *port_priv, IN nodnic_queue_pair_type type, IN nodnic_qp *qp)
Definition mlx_port.c:726

References free, ib_get_drvdata(), ib_qp_get_drvdata(), flexboot_nodnic_port::ibdev, nodnic_port_destroy_qp(), flexboot_nodnic_queue_pair::nodnic_queue_pair, flexboot_nodnic::port, ib_device::port, port, and qp.

◆ flexboot_nodnic_post_send()

int flexboot_nodnic_post_send ( struct ib_device * ibdev,
struct ib_queue_pair * qp,
struct ib_address_vector * av,
struct io_buffer * iobuf )
static

Post send work queue entry.

Parameters
ibdevInfiniband device
qpQueue pair
avAddress vector
iobufI/O buffer
Return values
rcReturn status code

Definition at line 434 of file flexboot_nodnic.c.

437 {
438
440 struct flexboot_nodnic_queue_pair *flexboot_nodnic_qp = ib_qp_get_drvdata ( qp );
442 struct ib_work_queue *wq = &qp->send;
443 struct nodnic_send_wqbb *wqbb;
444 nodnic_qp *nodnic_qp = flexboot_nodnic_qp->nodnic_queue_pair;
445 struct nodnic_send_ring *send_ring = &nodnic_qp->send;
447 unsigned int wqe_idx_mask;
448 unsigned long wqe_idx;
449
450 if ( ( port->port_priv.dma_state == FALSE ) ||
451 ( port->port_priv.port_state & NODNIC_PORT_DISABLING_DMA ) ) {
452 DBGC ( flexboot_nodnic, "flexboot_nodnic DMA disabled\n");
453 status = -ENETDOWN;
454 goto post_send_done;
455 }
456
457 /* Allocate work queue entry */
458 wqe_idx = wq->next_idx;
459 wqe_idx_mask = ( wq->num_wqes - 1 );
460 if ( wq->iobufs[wqe_idx & wqe_idx_mask] ) {
461 DBGC ( flexboot_nodnic, "flexboot_nodnic %p QPN %#lx send queue full\n",
462 flexboot_nodnic, qp->qpn );
463 status = -ENOBUFS;
464 goto post_send_done;
465 }
466 wqbb = &send_ring->wqe_virt[wqe_idx & wqe_idx_mask];
467 wq->iobufs[wqe_idx & wqe_idx_mask] = iobuf;
468
470 fill_send_wqe[qp->type] != NULL );
472 fill_send_wqe[qp->type] ( ibdev, qp, av, iobuf,
473 wqbb, wqe_idx );
474 if ( status != 0 ) {
475 DBGC ( flexboot_nodnic, "flexboot_nodnic %p QPN %#lx fill send wqe failed\n",
476 flexboot_nodnic, qp->qpn );
477 goto post_send_done;
478 }
479
480 wq->next_idx++;
481
482 status = port->port_priv.send_doorbell ( &port->port_priv,
483 &send_ring->nodnic_ring, ( mlx_uint16 ) wq->next_idx );
486 }
487 if ( status != 0 ) {
488 DBGC ( flexboot_nodnic, "flexboot_nodnic %p ring send doorbell failed\n", flexboot_nodnic );
489 }
490
491post_send_done:
492 return status;
493}
#define ENOBUFS
No buffer space available.
Definition errno.h:499
#define ENETDOWN
Network is down.
Definition errno.h:479
struct _nodnic_qp nodnic_qp
#define NODNIC_PORT_DISABLING_DMA
uint16_t mlx_uint16
mlx_status(* tx_uar_send_doorbell_fn)(struct ib_device *ibdev, struct nodnic_send_wqbb *wqbb)
unsigned long next_idx
Next work queue entry index.
Definition infiniband.h:123
struct nodnic_send_wqbb * wqe_virt

References assert, flexboot_nodnic::callbacks, DBGC, ENETDOWN, ENOBUFS, FALSE, ib_get_drvdata(), ib_qp_get_drvdata(), flexboot_nodnic_port::ibdev, ib_work_queue::iobufs, MLX_SUCCESS, ib_work_queue::next_idx, NODNIC_PORT_DISABLING_DMA, flexboot_nodnic_queue_pair::nodnic_queue_pair, nodnic_send_ring::nodnic_ring, NULL, ib_work_queue::num_wqes, flexboot_nodnic::port, ib_device::port, port, qp, status, flexboot_nodnic_callbacks::tx_uar_send_doorbell_fn, and nodnic_send_ring::wqe_virt.

◆ flexboot_nodnic_post_recv()

int flexboot_nodnic_post_recv ( struct ib_device * ibdev,
struct ib_queue_pair * qp,
struct io_buffer * iobuf )
static

Post receive work queue entry.

Parameters
ibdevInfiniband device
qpQueue pair
iobufI/O buffer
Return values
rcReturn status code

Definition at line 503 of file flexboot_nodnic.c.

505 {
507 struct flexboot_nodnic_queue_pair *flexboot_nodnic_qp = ib_qp_get_drvdata ( qp );
509 struct ib_work_queue *wq = &qp->recv;
510 nodnic_qp *nodnic_qp = flexboot_nodnic_qp->nodnic_queue_pair;
511 struct nodnic_recv_ring *recv_ring = &nodnic_qp->receive;
512 struct nodnic_recv_wqe *wqe;
513 unsigned int wqe_idx_mask;
515
516 /* Allocate work queue entry */
517 wqe_idx_mask = ( wq->num_wqes - 1 );
518 if ( wq->iobufs[wq->next_idx & wqe_idx_mask] ) {
520 "flexboot_nodnic %p QPN %#lx receive queue full\n",
521 flexboot_nodnic, qp->qpn );
522 status = -ENOBUFS;
523 goto post_recv_done;
524 }
525 wq->iobufs[wq->next_idx & wqe_idx_mask] = iobuf;
526 wqe = &((struct nodnic_recv_wqe*)recv_ring->wqe_virt)[wq->next_idx & wqe_idx_mask];
527
528 MLX_FILL_1 ( &wqe->data[0], 0, byte_count, iob_tailroom ( iobuf ) );
529 MLX_FILL_1 ( &wqe->data[0], 1, l_key, flexboot_nodnic->device_priv.lkey );
530 MLX_FILL_H ( &wqe->data[0], 2,
531 local_address_h, virt_to_bus ( iobuf->data ) );
532 MLX_FILL_1 ( &wqe->data[0], 3,
533 local_address_l, virt_to_bus ( iobuf->data ) );
534
535 wq->next_idx++;
536
537 status = port->port_priv.recv_doorbell ( &port->port_priv,
538 &recv_ring->nodnic_ring, ( mlx_uint16 ) wq->next_idx );
539 if ( status != 0 ) {
540 DBGC ( flexboot_nodnic, "flexboot_nodnic %p ring receive doorbell failed\n", flexboot_nodnic );
541 }
542post_recv_done:
543 return status;
544}
__be32 byte_count
Definition CIB_PRM.h:0
static __always_inline unsigned long virt_to_bus(volatile const void *addr)
Convert virtual address to a bus address.
Definition io.h:184
#define MLX_FILL_H(_structure_st, _index, _field, _address)
Definition mlx_bitops.h:240
#define MLX_FILL_1(_ptr, _index,...)
Definition mlx_bitops.h:167
void * data
Start of data.
Definition iobuf.h:53
struct nodnic_wqe_segment_data_ptr data[NODNIC_MAX_SCATTER]
Definition nodnic_prm.h:44

References byte_count, io_buffer::data, nodnic_recv_wqe::data, DBGC, flexboot_nodnic::device_priv, ENOBUFS, ib_get_drvdata(), ib_qp_get_drvdata(), flexboot_nodnic_port::ibdev, iob_tailroom(), ib_work_queue::iobufs, _nodnic_device_priv::lkey, MLX_FILL_1, MLX_FILL_H, MLX_SUCCESS, ib_work_queue::next_idx, flexboot_nodnic_queue_pair::nodnic_queue_pair, nodnic_recv_ring::nodnic_ring, ib_work_queue::num_wqes, flexboot_nodnic::port, ib_device::port, port, qp, status, virt_to_bus(), and nodnic_recv_ring::wqe_virt.

◆ flexboot_nodnic_poll_eq()

void flexboot_nodnic_poll_eq ( struct ib_device * ibdev)
static

Definition at line 553 of file flexboot_nodnic.c.

553 {
556 struct net_device *netdev;
559
560 if ( ! ibdev ) {
561 DBG ( "%s: ibdev = NULL!!!\n", __FUNCTION__ );
562 return;
563 }
564
566 port = &flexboot_nodnic->port[ibdev->port - 1];
567 netdev = port->netdev;
568
569 if ( ! netdev_is_open ( netdev ) ) {
570 DBG2( "%s: port %d is closed\n", __FUNCTION__, port->ibdev->port );
571 return;
572 }
573
574 /* we don't poll EQ. Just poll link status if it's not active */
575 if ( ! netdev_link_ok ( netdev ) ) {
576 status = nodnic_port_get_state ( &port->port_priv, &state );
577 MLX_FATAL_CHECK_STATUS(status, state_err, "nodnic_port_get_state failed");
578
580 DBG( "%s: port %d physical link is up\n", __FUNCTION__,
581 port->ibdev->port );
582 port->type->state_change ( flexboot_nodnic, port, 1 );
583 }
584 }
585state_err:
586 return;
587}
uint8_t state
State.
Definition eth_slow.h:36
static struct net_device * netdev
Definition gdbudp.c:53
#define DBG2(...)
Definition compiler.h:515
#define DBG(...)
Print a debugging message.
Definition compiler.h:498
mlx_status nodnic_port_get_state(IN nodnic_port_priv *port_priv, OUT nodnic_port_state *state)
Definition mlx_port.c:88
nodnic_port_state
Definition mlx_port.h:69
@ nodnic_port_state_active
Definition mlx_port.h:73
static int netdev_is_open(struct net_device *netdev)
Check whether or not network device is open.
Definition netdevice.h:662
static int netdev_link_ok(struct net_device *netdev)
Check link state of network device.
Definition netdevice.h:640
A network device.
Definition netdevice.h:353

References DBG, DBG2, ib_get_drvdata(), MLX_FATAL_CHECK_STATUS, netdev, netdev_is_open(), netdev_link_ok(), nodnic_port_get_state(), nodnic_port_state_active, flexboot_nodnic::port, ib_device::port, port, state, and status.

◆ flexboot_nodnic_mcast_attach()

int flexboot_nodnic_mcast_attach ( struct ib_device * ibdev,
struct ib_queue_pair * qp,
union ib_gid * gid )
static

Definition at line 595 of file flexboot_nodnic.c.

597 {
602
603 switch (qp->type) {
604 case IB_QPT_ETH:
605 memcpy(&mac, gid, sizeof(mac));
608 "nodnic_port_add_mac_filter failed");
609 break;
610 default:
611 break;
612 }
613mac_err:
614 return status;
615}
u8 gid[16]
Definition CIB_PRM.h:3
uint8_t mac[ETH_ALEN]
MAC address.
Definition ena.h:13
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#define MLX_CHECK_STATUS(id, status, label, message)
Definition mlx_bail.h:37
mlx_status nodnic_port_add_mac_filter(IN nodnic_port_priv *port_priv, IN mlx_mac_address mac)
Definition mlx_port.c:992

References flexboot_nodnic::device_priv, gid, ib_get_drvdata(), IB_QPT_ETH, flexboot_nodnic_port::ibdev, mac, memcpy(), MLX_CHECK_STATUS, MLX_SUCCESS, nodnic_port_add_mac_filter(), flexboot_nodnic::port, ib_device::port, port, qp, and status.

◆ flexboot_nodnic_mcast_detach()

void flexboot_nodnic_mcast_detach ( struct ib_device * ibdev,
struct ib_queue_pair * qp,
union ib_gid * gid )
static

Definition at line 616 of file flexboot_nodnic.c.

618 {
623
624 switch (qp->type) {
625 case IB_QPT_ETH:
626 memcpy(&mac, gid, sizeof(mac));
629 "nodnic_port_remove_mac_filter failed");
630 break;
631 default:
632 break;
633 }
634mac_err:
635 return;
636}
mlx_status nodnic_port_remove_mac_filter(IN nodnic_port_priv *port_priv, IN mlx_mac_address mac)
Definition mlx_port.c:1073

References flexboot_nodnic::device_priv, gid, ib_get_drvdata(), IB_QPT_ETH, flexboot_nodnic_port::ibdev, mac, memcpy(), MLX_CHECK_STATUS, MLX_SUCCESS, nodnic_port_remove_mac_filter(), flexboot_nodnic::port, ib_device::port, port, qp, and status.

◆ flexboot_nodnic_ib_open()

int flexboot_nodnic_ib_open ( struct ib_device * ibdev)
static

Initialise Infiniband link.

Parameters
ibdevInfiniband device
Return values
rcReturn status code

Definition at line 650 of file flexboot_nodnic.c.

650 {
651 int rc = 0;
652
653 /*TODO: add implementation*/
654 return rc;
655}

References __unused, and rc.

◆ flexboot_nodnic_ib_close()

void flexboot_nodnic_ib_close ( struct ib_device * ibdev)
static

Close Infiniband link.

Parameters
ibdevInfiniband device

Definition at line 662 of file flexboot_nodnic.c.

662 {
663 /*TODO: add implementation*/
664}

References __unused.

◆ flexboot_nodnic_inform_sma()

int flexboot_nodnic_inform_sma ( struct ib_device * ibdev,
union ib_mad * mad )
static

Inform embedded subnet management agent of a received MAD.

Parameters
ibdevInfiniband device
madMAD
Return values
rcReturn status code

Definition at line 673 of file flexboot_nodnic.c.

674 {
675 /*TODO: add implementation*/
676 return 0;
677}

References __unused, and mad.

◆ flexboot_nodnic_complete_all_tx()

void flexboot_nodnic_complete_all_tx ( struct flexboot_nodnic_port * port)
static

Definition at line 707 of file flexboot_nodnic.c.

707 {
708 struct ib_device *ibdev = port->ibdev;
709 struct ib_completion_queue *cq;
710 struct ib_work_queue *wq;
711 int keep_polling = 0;
713
714 list_for_each_entry ( cq, &ibdev->cqs, list ) {
715 do {
716 ib_poll_cq ( ibdev, cq );
717 keep_polling = 0;
719 if ( wq->is_send )
720 keep_polling += ( wq->fill > 0 );
721 }
723 } while ( keep_polling && ( timeout-- > 0 ) );
724 }
725}
void timeout(int)
#define FLEX_NODNIC_TX_POLL_TOUT
#define FLEX_NODNIC_TX_POLL_USLEEP
void ib_poll_cq(struct ib_device *ibdev, struct ib_completion_queue *cq)
Poll completion queue.
Definition infiniband.c:161
An Infiniband Completion Queue.
Definition infiniband.h:225
An Infiniband device.
Definition infiniband.h:399
struct list_head cqs
List of completion queues.
Definition infiniband.h:413
unsigned int fill
Number of occupied work queue entries.
Definition infiniband.h:115
struct ib_completion_queue * cq
Associated completion queue.
Definition infiniband.h:107
struct list_head list
List of work queues on this completion queue.
Definition infiniband.h:109
void udelay(unsigned long usecs)
Delay for a fixed number of microseconds.
Definition timer.c:61

References ib_work_queue::cq, ib_device::cqs, ib_work_queue::fill, FLEX_NODNIC_TX_POLL_TOUT, FLEX_NODNIC_TX_POLL_USLEEP, ib_poll_cq(), ib_work_queue::is_send, ib_work_queue::list, list_for_each_entry, port, timeout(), udelay(), and ib_completion_queue::work_queues.

Referenced by flexboot_nodnic_port_disable_dma().

◆ flexboot_nodnic_port_disable_dma()

void flexboot_nodnic_port_disable_dma ( struct flexboot_nodnic_port * port)
static

Definition at line 727 of file flexboot_nodnic.c.

727 {
728 nodnic_port_priv *port_priv = & ( port->port_priv );
730
731 if ( ! ( port_priv->port_state & NODNIC_PORT_OPENED ) )
732 return;
733
736 if ( ( status = nodnic_port_disable_dma ( port_priv ) ) ) {
737 MLX_DEBUG_WARN ( port, "Failed to disable DMA %d\n", status );
738 }
739
741}
static void flexboot_nodnic_complete_all_tx(struct flexboot_nodnic_port *port)
#define MLX_DEBUG_WARN(...)
Definition mlx_logging.h:30
struct _nodnic_port_priv nodnic_port_priv
#define NODNIC_PORT_OPENED
mlx_status nodnic_port_disable_dma(IN nodnic_port_priv *port_priv)
Definition mlx_port.c:1295

References flexboot_nodnic_complete_all_tx(), MLX_DEBUG_WARN, nodnic_port_disable_dma(), NODNIC_PORT_DISABLING_DMA, NODNIC_PORT_OPENED, port, _nodnic_port_priv::port_state, and status.

Referenced by flexboot_nodnic_disable_dma(), and flexboot_nodnic_eth_close().

◆ flexboot_nodnic_eth_transmit()

int flexboot_nodnic_eth_transmit ( struct net_device * netdev,
struct io_buffer * iobuf )
static

Transmit packet via flexboot_nodnic Ethernet device.

Parameters
netdevNetwork device
iobufI/O buffer
Return values
rcReturn status code

Definition at line 767 of file flexboot_nodnic.c.

768 {
769 struct flexboot_nodnic_port *port = netdev->priv;
770 struct ib_device *ibdev = port->ibdev;
772 int rc;
773
774 rc = ib_post_send ( ibdev, port->eth_qp, NULL, iobuf);
775 /* Transmit packet */
776 if ( rc != 0) {
777 DBGC ( flexboot_nodnic, "NODNIC %p port %d could not transmit: %s\n",
778 flexboot_nodnic, ibdev->port, strerror ( rc ) );
779 return rc;
780 }
781
782 return 0;
783}
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.
Definition infiniband.c:416

References DBGC, ib_get_drvdata(), ib_post_send(), netdev, NULL, ib_device::port, port, rc, and strerror().

◆ flexboot_nodnic_eth_complete_send()

void flexboot_nodnic_eth_complete_send ( struct ib_device * ibdev,
struct ib_queue_pair * qp,
struct io_buffer * iobuf,
int rc )
static

Handle flexboot_nodnic Ethernet device send completion.

Parameters
ibdevInfiniband device
qpQueue pair
iobufI/O buffer
rcCompletion status code

Definition at line 793 of file flexboot_nodnic.c.

796 {
798
799 netdev_tx_complete_err ( netdev, iobuf, rc );
800}
static __always_inline void * ib_qp_get_ownerdata(struct ib_queue_pair *qp)
Get Infiniband queue pair owner-private data.
Definition infiniband.h:665
void netdev_tx_complete_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Complete network transmission.
Definition netdevice.c:471

References __unused, ib_qp_get_ownerdata(), netdev, netdev_tx_complete_err(), qp, and rc.

◆ flexboot_nodnic_eth_complete_recv()

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 )
static

Handle flexboot_nodnic Ethernet device receive completion.

Parameters
ibdevInfiniband device
qpQueue pair
avAddress vector, or NULL
iobufI/O buffer
rcCompletion status code

Definition at line 811 of file flexboot_nodnic.c.

816 {
818
819 if ( rc != 0 ) {
820 DBG ( "Received packet with error\n" );
821 netdev_rx_err ( netdev, iobuf, rc );
822 return;
823 }
824
825 if ( source == NULL ) {
826 DBG ( "Received packet without address vector\n" );
827 netdev_rx_err ( netdev, iobuf, -ENOTTY );
828 return;
829 }
830
831 netdev_rx ( netdev, iobuf );
832}
#define ENOTTY
Inappropriate I/O control operation.
Definition errno.h:595
void netdev_rx(struct net_device *netdev, struct io_buffer *iobuf)
Add packet to receive queue.
Definition netdevice.c:549
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition netdevice.c:587

References __unused, DBG, dest, ENOTTY, ib_qp_get_ownerdata(), netdev, netdev_rx(), netdev_rx_err(), NULL, qp, and rc.

◆ flexboot_nodnic_eth_poll()

void flexboot_nodnic_eth_poll ( struct net_device * netdev)
static

Poll flexboot_nodnic Ethernet device.

Parameters
netdevNetwork device

Definition at line 845 of file flexboot_nodnic.c.

845 {
846 struct flexboot_nodnic_port *port = netdev->priv;
847 struct ib_device *ibdev = port->ibdev;
848
849 ib_poll_eq ( ibdev );
850}
void ib_poll_eq(struct ib_device *ibdev)
Poll event queue.
Definition infiniband.c:878

References ib_poll_eq(), netdev, and port.

◆ flexboot_nodnic_eth_open()

int flexboot_nodnic_eth_open ( struct net_device * netdev)
static

Open flexboot_nodnic Ethernet device.

Parameters
netdevNetwork device
Return values
rcReturn status code

Definition at line 858 of file flexboot_nodnic.c.

858 {
859 struct flexboot_nodnic_port *port = netdev->priv;
860 struct ib_device *ibdev = port->ibdev;
863 struct ib_completion_queue *dummy_cq = NULL;
864 struct flexboot_nodnic_queue_pair *flexboot_nodnic_qp = NULL;
865 mlx_uint64 cq_size = 0;
866 mlx_uint32 qpn = 0;
868 int rc;
869
870 if ( port->port_priv.port_state & NODNIC_PORT_OPENED ) {
871 DBGC ( flexboot_nodnic, "%s: port %d is already opened\n",
872 __FUNCTION__, port->ibdev->port );
873 return 0;
874 }
875
876 port->port_priv.port_state |= NODNIC_PORT_OPENED;
877
878 dummy_cq = zalloc ( sizeof ( struct ib_completion_queue ) );
879 if ( dummy_cq == NULL ) {
880 DBGC ( flexboot_nodnic, "%s: Failed to allocate dummy CQ\n", __FUNCTION__ );
882 goto err_create_dummy_cq;
883 }
884 INIT_LIST_HEAD ( &dummy_cq->work_queues );
885
886 if ( ( rc = ib_create_qp ( ibdev, IB_QPT_ETH,
890 &port->eth_qp ) ) != 0 ) {
891 DBGC ( flexboot_nodnic, "flexboot_nodnic %p port %d could not create queue pair\n",
892 flexboot_nodnic, ibdev->port );
894 goto err_create_qp;
895 }
896
897 ib_qp_set_ownerdata ( port->eth_qp, netdev );
898
899 status = nodnic_port_get_cq_size(&port->port_priv, &cq_size);
900 MLX_FATAL_CHECK_STATUS(status, get_cq_size_err,
901 "nodnic_port_get_cq_size failed");
902
903 if ( ( rc = ib_create_cq ( ibdev, cq_size, &flexboot_nodnic_eth_cq_op,
904 &port->eth_cq ) ) != 0 ) {
906 "flexboot_nodnic %p port %d could not create completion queue\n",
907 flexboot_nodnic, ibdev->port );
909 goto err_create_cq;
910 }
911 port->eth_qp->send.cq = port->eth_cq;
912 list_del(&port->eth_qp->send.list);
913 list_add ( &port->eth_qp->send.list, &port->eth_cq->work_queues );
914 port->eth_qp->recv.cq = port->eth_cq;
915 port->cmdsn = 0;
916 list_del(&port->eth_qp->recv.list);
917 list_add ( &port->eth_qp->recv.list, &port->eth_cq->work_queues );
918
919 status = nodnic_port_allocate_eq(&port->port_priv,
921 MLX_FATAL_CHECK_STATUS(status, eq_alloc_err,
922 "nodnic_port_allocate_eq failed");
923
924 status = nodnic_port_init(&port->port_priv);
926 "nodnic_port_init failed");
927
928 /* update qp - qpn */
929 flexboot_nodnic_qp = ib_qp_get_drvdata ( port->eth_qp );
930 status = nodnic_port_get_qpn(&port->port_priv,
931 &flexboot_nodnic_qp->nodnic_queue_pair->send.nodnic_ring,
932 &qpn);
934 "nodnic_port_get_qpn failed");
935 port->eth_qp->qpn = qpn;
936
937 /* Fill receive rings */
938 ib_refill_recv ( ibdev, port->eth_qp );
939
940 status = nodnic_port_enable_dma(&port->port_priv);
942 "nodnic_port_enable_dma failed");
943
945 status = nodnic_port_set_promisc(&port->port_priv, TRUE);
946 MLX_FATAL_CHECK_STATUS(status, promisc_err,
947 "nodnic_port_set_promisc failed");
948 }
949
950 status = nodnic_port_get_state(&port->port_priv, &state);
952 "nodnic_port_get_state failed");
953
954 port->type->state_change (
956
957 DBGC ( flexboot_nodnic, "%s: port %d opened (link is %s)\n",
958 __FUNCTION__, port->ibdev->port,
959 ( ( state == nodnic_port_state_active ) ? "Up" : "Down" ) );
960
961 free(dummy_cq);
962 return 0;
963state_err:
964promisc_err:
965dma_err:
966qpn_err:
967 nodnic_port_close(&port->port_priv);
968init_err:
969 nodnic_port_free_eq(&port->port_priv);
970eq_alloc_err:
971err_create_cq:
972get_cq_size_err:
973 ib_destroy_qp(ibdev, port->eth_qp );
974err_create_qp:
975 free(dummy_cq);
976err_create_dummy_cq:
977 port->port_priv.port_state &= ~NODNIC_PORT_OPENED;
978 return status;
979}
#define FLEXBOOT_NODNIC_ETH_NUM_RECV_WQES
Number of flexboot_nodnic Ethernet receive work queue entries.
static struct ib_completion_queue_operations flexboot_nodnic_eth_cq_op
flexboot_nodnic Ethernet device completion operations
static struct ib_queue_pair_operations flexboot_nodnic_eth_qp_op
flexboot nodnic Ethernet queue pair operations
#define FLEXBOOT_NODNIC_ETH_NUM_SEND_WQES
Number of flexboot_nodnic Ethernet send work queue entries.
void ib_refill_recv(struct ib_device *ibdev, struct ib_queue_pair *qp)
Refill receive work queue.
Definition infiniband.c:556
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.
Definition infiniband.c:98
void ib_destroy_qp(struct ib_device *ibdev, struct ib_queue_pair *qp)
Destroy queue pair.
Definition infiniband.c:314
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.
Definition infiniband.c:199
static __always_inline void ib_qp_set_ownerdata(struct ib_queue_pair *qp, void *priv)
Set Infiniband queue pair owner-private data.
Definition infiniband.h:654
#define list_del(list)
Delete an entry from a list.
Definition list.h:120
#define INIT_LIST_HEAD(list)
Initialise a list head.
Definition list.h:46
#define list_add(new, head)
Add a new entry to the head of a list.
Definition list.h:70
mlx_status nodnic_port_init(IN nodnic_port_priv *port_priv)
Definition mlx_port.c:1235
mlx_status nodnic_port_get_cq_size(IN nodnic_port_priv *port_priv, OUT mlx_uint64 *cq_size)
Definition mlx_port.c:899
mlx_status nodnic_port_enable_dma(IN nodnic_port_priv *port_priv)
Definition mlx_port.c:1275
mlx_status nodnic_port_close(IN nodnic_port_priv *port_priv)
Definition mlx_port.c:1255
mlx_status nodnic_port_allocate_eq(IN nodnic_port_priv *port_priv, IN mlx_uint8 log_eq_size)
Definition mlx_port.c:915
mlx_status nodnic_port_free_eq(IN nodnic_port_priv *port_priv)
Definition mlx_port.c:968
@ nodnic_port_state_down
Definition mlx_port.h:70
mlx_status nodnic_port_set_promisc(IN nodnic_port_priv *port_priv, IN mlx_boolean value)
Definition mlx_port.c:1205
uint64_t mlx_uint64

References DBGC, _nodnic_device_priv::device_cap, flexboot_nodnic::device_priv, flexboot_nodnic_eth_cq_op, FLEXBOOT_NODNIC_ETH_NUM_RECV_WQES, FLEXBOOT_NODNIC_ETH_NUM_SEND_WQES, flexboot_nodnic_eth_qp_op, free, ib_create_cq(), ib_create_qp(), ib_destroy_qp(), ib_get_drvdata(), ib_qp_get_drvdata(), ib_qp_set_ownerdata(), IB_QPT_ETH, ib_refill_recv(), INIT_LIST_HEAD, list_add, list_del, _nodnic_device_capabilites::log_working_buffer_size, MLX_FATAL_CHECK_STATUS, MLX_OUT_OF_RESOURCES, MLX_SUCCESS, netdev, nodnic_port_allocate_eq(), nodnic_port_close(), nodnic_port_enable_dma(), nodnic_port_free_eq(), nodnic_port_get_cq_size(), nodnic_port_get_qpn(), nodnic_port_get_state(), nodnic_port_init(), NODNIC_PORT_OPENED, nodnic_port_set_promisc(), nodnic_port_state_active, nodnic_port_state_down, flexboot_nodnic_queue_pair::nodnic_queue_pair, nodnic_send_ring::nodnic_ring, NULL, ib_device::port, port, qpn, rc, _nodnic_qp::send, state, status, _nodnic_device_capabilites::support_promisc_filter, TRUE, ib_completion_queue::work_queues, and zalloc().

◆ flexboot_nodnic_eth_close()

void flexboot_nodnic_eth_close ( struct net_device * netdev)
static

Close flexboot_nodnic Ethernet device.

Parameters
netdevNetwork device

Definition at line 986 of file flexboot_nodnic.c.

986 {
987 struct flexboot_nodnic_port *port = netdev->priv;
988 struct ib_device *ibdev = port->ibdev;
991
992 if ( ! ( port->port_priv.port_state & NODNIC_PORT_OPENED ) ) {
993 DBGC ( flexboot_nodnic, "%s: port %d is already closed\n",
994 __FUNCTION__, port->ibdev->port );
995 return;
996 }
997
999 if ( ( status = nodnic_port_set_promisc( &port->port_priv, FALSE ) ) ) {
1001 "nodnic_port_set_promisc failed (status = %d)\n", status );
1002 }
1003 }
1004
1006
1007 port->port_priv.port_state &= ~NODNIC_PORT_OPENED;
1008
1009 port->type->state_change ( flexboot_nodnic, port, FALSE );
1010
1011 /* Close port */
1012 status = nodnic_port_close(&port->port_priv);
1013 if ( status != MLX_SUCCESS ) {
1014 DBGC ( flexboot_nodnic, "flexboot_nodnic %p port %d could not close port: %s\n",
1015 flexboot_nodnic, ibdev->port, strerror ( status ) );
1016 /* Nothing we can do about this */
1017 }
1018
1019 ib_destroy_qp ( ibdev, port->eth_qp );
1020 port->eth_qp = NULL;
1021 ib_destroy_cq ( ibdev, port->eth_cq );
1022 port->eth_cq = NULL;
1023
1024 nodnic_port_free_eq(&port->port_priv);
1025
1026 DBGC ( flexboot_nodnic, "%s: port %d closed\n", __FUNCTION__, port->ibdev->port );
1027}
static void flexboot_nodnic_port_disable_dma(struct flexboot_nodnic_port *port)
void ib_destroy_cq(struct ib_device *ibdev, struct ib_completion_queue *cq)
Destroy completion queue.
Definition infiniband.c:145

References DBGC, _nodnic_device_priv::device_cap, flexboot_nodnic::device_priv, FALSE, flexboot_nodnic_port_disable_dma(), ib_destroy_cq(), ib_destroy_qp(), ib_get_drvdata(), MLX_SUCCESS, netdev, nodnic_port_close(), nodnic_port_free_eq(), NODNIC_PORT_OPENED, nodnic_port_set_promisc(), NULL, ib_device::port, port, status, strerror(), and _nodnic_device_capabilites::support_promisc_filter.

◆ flexboot_nodnic_eth_irq()

void flexboot_nodnic_eth_irq ( struct net_device * netdev,
int enable )

Definition at line 1029 of file flexboot_nodnic.c.

1029 {
1030 struct flexboot_nodnic_port *port = netdev->priv;
1031
1032 if ( enable ) {
1033 if ( ( port->port_priv.port_state & NODNIC_PORT_OPENED ) &&
1034 ! ( port->port_priv.port_state & NODNIC_PORT_DISABLING_DMA ) ) {
1036 } else {
1037 /* do nothing */
1038 }
1039 } else {
1040 nodnic_device_clear_int( port->port_priv.device );
1041 }
1042}
static int flexboot_nodnic_arm_cq(struct flexboot_nodnic_port *port)
mlx_status nodnic_device_clear_int(IN nodnic_device_priv *device_priv)
Definition mlx_device.c:165

References flexboot_nodnic_arm_cq(), netdev, nodnic_device_clear_int(), NODNIC_PORT_DISABLING_DMA, NODNIC_PORT_OPENED, and port.

◆ flexboot_nodnic_register_netdev()

int flexboot_nodnic_register_netdev ( struct flexboot_nodnic * flexboot_nodnic,
struct flexboot_nodnic_port * port )
static

Register flexboot_nodnic Ethernet device.

Definition at line 1055 of file flexboot_nodnic.c.

1056 {
1058 struct net_device *netdev;
1059 struct ib_device *ibdev = port->ibdev;
1060 union {
1061 uint8_t bytes[8];
1062 uint32_t dwords[2];
1063 } mac;
1064
1065 /* Allocate network devices */
1066 netdev = alloc_etherdev ( 0 );
1067 if ( netdev == NULL ) {
1068 DBGC ( flexboot_nodnic, "flexboot_nodnic %p port %d could not allocate net device\n",
1069 flexboot_nodnic, ibdev->port );
1071 goto alloc_err;
1072 }
1073 port->netdev = netdev;
1075 netdev->dev = ibdev->dev;
1076 netdev->priv = port;
1077
1078 status = nodnic_port_query(&port->port_priv,
1080 &mac.dwords[0]);
1082 "failed to query mac high");
1083 status = nodnic_port_query(&port->port_priv,
1085 &mac.dwords[1]);
1087 "failed to query mac low");
1088 mac.dwords[0] = htonl(mac.dwords[0]);
1089 mac.dwords[1] = htonl(mac.dwords[1]);
1090 memcpy ( netdev->hw_addr,
1091 &mac.bytes[2], ETH_ALEN);
1092 /* Register network device */
1094 if ( status != MLX_SUCCESS ) {
1096 "flexboot_nodnic %p port %d could not register network device: %s\n",
1097 flexboot_nodnic, ibdev->port, strerror ( status ) );
1098 goto reg_err;
1099 }
1100 return status;
1101reg_err:
1102mac_err:
1103 netdev_put ( netdev );
1104alloc_err:
1105 return status;
1106}
unsigned int uint32_t
Definition stdint.h:12
struct net_device * alloc_etherdev(size_t priv_size)
Allocate Ethernet device.
Definition ethernet.c:265
static struct net_device_operations flexboot_nodnic_eth_operations
flexboot_nodnic Ethernet network device operations
uint8_t bytes[64]
Definition ib_mad.h:5
#define ETH_ALEN
Definition if_ether.h:9
#define htonl(value)
Definition byteswap.h:134
@ nodnic_port_option_mac_high
Definition mlx_port.h:32
@ nodnic_port_option_mac_low
Definition mlx_port.h:31
int register_netdev(struct net_device *netdev)
Register network device.
Definition netdevice.c:760
static void netdev_init(struct net_device *netdev, struct net_device_operations *op)
Initialise a network device.
Definition netdevice.h:519
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition netdevice.h:576
struct device * dev
Underlying device.
Definition infiniband.h:411

References alloc_etherdev(), bytes, DBGC, ib_device::dev, ETH_ALEN, flexboot_nodnic_eth_operations, htonl, mac, memcpy(), MLX_FATAL_CHECK_STATUS, MLX_OUT_OF_RESOURCES, MLX_SUCCESS, netdev, netdev_init(), netdev_put(), nodnic_port_option_mac_high, nodnic_port_option_mac_low, nodnic_port_query(), NULL, ib_device::port, port, register_netdev(), status, and strerror().

◆ flexboot_nodnic_state_change_netdev()

void flexboot_nodnic_state_change_netdev ( struct flexboot_nodnic * flexboot_nodnic,
struct flexboot_nodnic_port * port,
int link_up )
static

Handle flexboot_nodnic Ethernet device port state change.

Definition at line 1111 of file flexboot_nodnic.c.

1113 {
1114 struct net_device *netdev = port->netdev;
1115
1116 if ( link_up )
1118 else
1120
1121}
void netdev_link_down(struct net_device *netdev)
Mark network device as having link down.
Definition netdevice.c:231
static void netdev_link_up(struct net_device *netdev)
Mark network device as having link up.
Definition netdevice.h:789

References __unused, netdev, netdev_link_down(), netdev_link_up(), and port.

◆ flexboot_nodnic_unregister_netdev()

void flexboot_nodnic_unregister_netdev ( struct flexboot_nodnic * flexboot_nodnic,
struct flexboot_nodnic_port * port )
static

Unregister flexboot_nodnic Ethernet device.

Definition at line 1126 of file flexboot_nodnic.c.

1127 {
1128 struct net_device *netdev = port->netdev;
1131 netdev_put ( netdev );
1132}
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition netdevice.c:942
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition netdevice.h:532

References __unused, netdev, netdev_nullify(), netdev_put(), port, and unregister_netdev().

◆ flexboot_nodnic_allocate_infiniband_devices()

mlx_status flexboot_nodnic_allocate_infiniband_devices ( struct flexboot_nodnic * flexboot_nodnic_priv)
static

Definition at line 1149 of file flexboot_nodnic.c.

1149 {
1151 nodnic_device_priv *device_priv = &flexboot_nodnic_priv->device_priv;
1152 struct pci_device *pci = flexboot_nodnic_priv->pci;
1153 struct ib_device *ibdev = NULL;
1154 unsigned int i = 0;
1155
1156 /* Allocate Infiniband devices */
1157 for (; i < device_priv->device_cap.num_ports; i++) {
1158 if ( ! ( flexboot_nodnic_priv->port_mask & ( i + 1 ) ) )
1159 continue;
1160 ibdev = alloc_ibdev(0);
1161 if (ibdev == NULL) {
1163 goto err_alloc_ibdev;
1164 }
1165 flexboot_nodnic_priv->port[i].ibdev = ibdev;
1167 ibdev->dev = &pci->dev;
1168 ibdev->port = ( FLEXBOOT_NODNIC_PORT_BASE + i);
1169 ibdev->ports = device_priv->device_cap.num_ports;
1170 ib_set_drvdata(ibdev, flexboot_nodnic_priv);
1171 }
1172 return status;
1173err_alloc_ibdev:
1174 for ( i-- ; ( signed int ) i >= 0 ; i-- )
1175 ibdev_put ( flexboot_nodnic_priv->port[i].ibdev );
1176 return status;
1177}
static struct ib_device_operations flexboot_nodnic_ib_operations
flexboot_nodnic Infiniband operations
#define FLEXBOOT_NODNIC_PORT_BASE
struct ib_device * alloc_ibdev(size_t priv_size)
Allocate Infiniband device.
Definition infiniband.c:917
static __always_inline void ib_set_drvdata(struct ib_device *ibdev, void *priv)
Set Infiniband device driver-private data.
Definition infiniband.h:698
static __always_inline void ibdev_put(struct ib_device *ibdev)
Drop reference to Infiniband device.
Definition infiniband.h:599
struct _nodnic_device_priv nodnic_device_priv
struct pci_device * pci
PCI device.
u16 port_mask
Port masking.
unsigned int ports
Total ports on device.
Definition infiniband.h:421
struct ib_device_operations * op
Infiniband operations.
Definition infiniband.h:417
A PCI device.
Definition pci.h:211
struct device dev
Generic device.
Definition pci.h:213

References alloc_ibdev(), ib_device::dev, pci_device::dev, _nodnic_device_priv::device_cap, flexboot_nodnic::device_priv, flexboot_nodnic_ib_operations, FLEXBOOT_NODNIC_PORT_BASE, ib_set_drvdata(), flexboot_nodnic_port::ibdev, ibdev_put(), MLX_OUT_OF_RESOURCES, MLX_SUCCESS, NULL, _nodnic_device_capabilites::num_ports, ib_device::op, flexboot_nodnic::pci, flexboot_nodnic::port, ib_device::port, flexboot_nodnic::port_mask, ib_device::ports, and status.

Referenced by flexboot_nodnic_probe().

◆ flexboot_nodnic_thin_init_ports()

mlx_status flexboot_nodnic_thin_init_ports ( struct flexboot_nodnic * flexboot_nodnic_priv)
static

Definition at line 1181 of file flexboot_nodnic.c.

1181 {
1183 nodnic_device_priv *device_priv = &flexboot_nodnic_priv->device_priv;
1184 nodnic_port_priv *port_priv = NULL;
1185 unsigned int i = 0;
1186
1187 for ( i = 0; i < device_priv->device_cap.num_ports; i++ ) {
1188 if ( ! ( flexboot_nodnic_priv->port_mask & ( i + 1 ) ) )
1189 continue;
1190 port_priv = &flexboot_nodnic_priv->port[i].port_priv;
1191 status = nodnic_port_thin_init( device_priv, port_priv, i );
1192 MLX_FATAL_CHECK_STATUS(status, thin_init_err,
1193 "flexboot_nodnic_thin_init_ports failed");
1194 }
1195thin_init_err:
1196 return status;
1197}
mlx_status nodnic_port_thin_init(IN nodnic_device_priv *device_priv, IN nodnic_port_priv *port_priv, IN mlx_uint8 port_index)
Definition mlx_port.c:1315
nodnic_port_priv port_priv
nodic port

References _nodnic_device_priv::device_cap, flexboot_nodnic::device_priv, MLX_FATAL_CHECK_STATUS, MLX_SUCCESS, nodnic_port_thin_init(), NULL, _nodnic_device_capabilites::num_ports, flexboot_nodnic::port, flexboot_nodnic::port_mask, flexboot_nodnic_port::port_priv, and status.

Referenced by flexboot_nodnic_probe().

◆ flexboot_nodnic_set_ports_type()

mlx_status flexboot_nodnic_set_ports_type ( struct flexboot_nodnic * flexboot_nodnic_priv)
static

Definition at line 1202 of file flexboot_nodnic.c.

1202 {
1204 nodnic_device_priv *device_priv = &flexboot_nodnic_priv->device_priv;
1205 nodnic_port_priv *port_priv = NULL;
1207 unsigned int i = 0;
1208
1209 for ( i = 0 ; i < device_priv->device_cap.num_ports ; i++ ) {
1210 if ( ! ( flexboot_nodnic_priv->port_mask & ( i + 1 ) ) )
1211 continue;
1212 port_priv = &flexboot_nodnic_priv->port[i].port_priv;
1213 status = nodnic_port_get_type(port_priv, &type);
1215 "nodnic_port_get_type failed");
1216 switch ( type ) {
1218 DBGC ( flexboot_nodnic_priv, "Port %d type is Ethernet\n", i );
1219 flexboot_nodnic_priv->port[i].type = &flexboot_nodnic_port_type_eth;
1220 break;
1222 DBGC ( flexboot_nodnic_priv, "Port %d type is Infiniband\n", i );
1224 goto type_err;
1225 default:
1226 DBGC ( flexboot_nodnic_priv, "Port %d type is unknown\n", i );
1228 goto type_err;
1229 }
1230 }
1231type_err:
1232 return status;
1233}
uint32_t type
Operating system type.
Definition ena.h:1
static struct flexboot_nodnic_port_type flexboot_nodnic_port_type_eth
flexboot_nodnic Ethernet port type
@ NODNIC_PORT_TYPE_UNKNOWN
mlx_status nodnic_port_get_type(IN nodnic_port_priv *port_priv, OUT nodnic_port_type *type)
Definition mlx_port.c:105
#define MLX_UNSUPPORTED
struct flexboot_nodnic_port_type * type
Port type.

References DBGC, _nodnic_device_priv::device_cap, flexboot_nodnic::device_priv, flexboot_nodnic_port_type_eth, MLX_FATAL_CHECK_STATUS, MLX_SUCCESS, MLX_UNSUPPORTED, nodnic_port_get_type(), NODNIC_PORT_TYPE_ETH, NODNIC_PORT_TYPE_IB, NODNIC_PORT_TYPE_UNKNOWN, NULL, _nodnic_device_capabilites::num_ports, flexboot_nodnic::port, flexboot_nodnic::port_mask, flexboot_nodnic_port::port_priv, status, flexboot_nodnic_port::type, and type.

Referenced by flexboot_nodnic_probe().

◆ flexboot_nodnic_ports_register_dev()

mlx_status flexboot_nodnic_ports_register_dev ( struct flexboot_nodnic * flexboot_nodnic_priv)
static

Definition at line 1237 of file flexboot_nodnic.c.

1237 {
1239 nodnic_device_priv *device_priv = &flexboot_nodnic_priv->device_priv;
1240 struct flexboot_nodnic_port *port = NULL;
1241 unsigned int i = 0;
1242
1243 for (; i < device_priv->device_cap.num_ports; i++) {
1244 if ( ! ( flexboot_nodnic_priv->port_mask & ( i + 1 ) ) )
1245 continue;
1246 port = &flexboot_nodnic_priv->port[i];
1247 status = port->type->register_dev ( flexboot_nodnic_priv, port );
1249 "port register_dev failed");
1250 }
1251reg_err:
1252 return status;
1253}

References _nodnic_device_priv::device_cap, flexboot_nodnic::device_priv, MLX_FATAL_CHECK_STATUS, MLX_SUCCESS, NULL, _nodnic_device_capabilites::num_ports, flexboot_nodnic::port, port, flexboot_nodnic::port_mask, and status.

Referenced by flexboot_nodnic_probe().

◆ flexboot_nodnic_ports_unregister_dev()

mlx_status flexboot_nodnic_ports_unregister_dev ( struct flexboot_nodnic * flexboot_nodnic_priv)
static

Definition at line 1257 of file flexboot_nodnic.c.

1257 {
1258 struct flexboot_nodnic_port *port;
1259 nodnic_device_priv *device_priv = &flexboot_nodnic_priv->device_priv;
1260 int i = (device_priv->device_cap.num_ports - 1);
1261
1262 for (; i >= 0; i--) {
1263 if ( ! ( flexboot_nodnic_priv->port_mask & ( i + 1 ) ) )
1264 continue;
1265 port = &flexboot_nodnic_priv->port[i];
1266 port->type->unregister_dev(flexboot_nodnic_priv, port);
1267 ibdev_put(flexboot_nodnic_priv->port[i].ibdev);
1268 }
1269 return MLX_SUCCESS;
1270}

References _nodnic_device_priv::device_cap, flexboot_nodnic::device_priv, flexboot_nodnic_port::ibdev, ibdev_put(), MLX_SUCCESS, _nodnic_device_capabilites::num_ports, flexboot_nodnic::port, port, and flexboot_nodnic::port_mask.

Referenced by flexboot_nodnic_probe(), and flexboot_nodnic_remove().

◆ flexboot_nodnic_enable_dma()

void flexboot_nodnic_enable_dma ( struct flexboot_nodnic * nodnic)
static

Definition at line 1278 of file flexboot_nodnic.c.

1278 {
1279 nodnic_port_priv *port_priv;
1281 int i;
1282
1283 for ( i = 0; i < nodnic->device_priv.device_cap.num_ports; i++ ) {
1284 if ( ! ( nodnic->port_mask & ( i + 1 ) ) )
1285 continue;
1286 port_priv = & ( nodnic->port[i].port_priv );
1287 if ( ! ( port_priv->port_state & NODNIC_PORT_OPENED ) )
1288 continue;
1289
1290 if ( ( status = nodnic_port_enable_dma ( port_priv ) ) ) {
1291 MLX_DEBUG_WARN ( nodnic, "Failed to enable DMA %d\n", status );
1292 }
1293 }
1294}

References __unused, _nodnic_device_priv::device_cap, flexboot_nodnic::device_priv, MLX_DEBUG_WARN, nodnic_port_enable_dma(), NODNIC_PORT_OPENED, _nodnic_device_capabilites::num_ports, flexboot_nodnic::port, flexboot_nodnic::port_mask, flexboot_nodnic_port::port_priv, _nodnic_port_priv::port_state, and status.

◆ flexboot_nodnic_disable_dma()

void flexboot_nodnic_disable_dma ( struct flexboot_nodnic * nodnic)
static

Definition at line 1296 of file flexboot_nodnic.c.

1296 {
1297 int i;
1298
1299 for ( i = 0; i < nodnic->device_priv.device_cap.num_ports; i++ ) {
1300 if ( ! ( nodnic->port_mask & ( i + 1 ) ) )
1301 continue;
1302 flexboot_nodnic_port_disable_dma ( & ( nodnic->port[i] ) );
1303 }
1304}

References __unused, _nodnic_device_priv::device_cap, flexboot_nodnic::device_priv, flexboot_nodnic_port_disable_dma(), _nodnic_device_capabilites::num_ports, flexboot_nodnic::port, and flexboot_nodnic::port_mask.

◆ flexboot_nodnic_is_supported()

int flexboot_nodnic_is_supported ( struct pci_device * pci)

Definition at line 1306 of file flexboot_nodnic.c.

1306 {
1307 mlx_utils utils;
1310 int is_supported = 0;
1311
1312 DBG ( "%s: start\n", __FUNCTION__ );
1313
1314 memset ( &utils, 0, sizeof ( utils ) );
1315
1316 status = mlx_utils_init ( &utils, pci );
1317 MLX_CHECK_STATUS ( pci, status, utils_init_err, "mlx_utils_init failed" );
1318
1319 status = mlx_pci_gw_init ( &utils );
1320 MLX_CHECK_STATUS ( pci, status, pci_gw_init_err, "mlx_pci_gw_init failed" );
1321
1324
1325 if ( status == MLX_SUCCESS ) {
1327 is_supported = ( buffer & 0x1 );
1328 }
1329
1330 mlx_pci_gw_teardown( &utils );
1331
1332pci_gw_init_err:
1333 mlx_utils_teardown(&utils);
1334utils_init_err:
1335 DBG ( "%s: NODNIC is %s supported (status = %d)\n",
1336 __FUNCTION__, ( is_supported ? "": "not" ), status );
1337 return is_supported;
1338}
uint32_t buffer
Buffer index (or NETVSC_RNDIS_NO_BUFFER)
Definition netvsc.h:5
#define NODNIC_NIC_INTERFACE_SUPPORTED_BIT
Definition mlx_device.h:41
#define NODNIC_NIC_INTERFACE_SUPPORTED_OFFSET
Definition mlx_device.h:33
mlx_status mlx_pci_gw_teardown(IN mlx_utils *utils)
Definition mlx_pci_gw.c:247
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)
Definition mlx_pci_gw.c:258
mlx_status mlx_pci_gw_init(IN mlx_utils *utils)
Definition mlx_pci_gw.c:218
mlx_uint32 mlx_pci_gw_buffer
Definition mlx_pci_gw.h:52
#define PCI_GW_SPACE_NODNIC
Definition mlx_pci_gw.h:47
mlx_status mlx_utils_init(IN mlx_utils *utils, IN mlx_pci *pci)
Definition mlx_utils.c:28
mlx_status mlx_utils_teardown(IN mlx_utils *utils)
Definition mlx_utils.c:46

References buffer, DBG, memset(), MLX_CHECK_STATUS, mlx_pci_gw_init(), mlx_pci_gw_read(), mlx_pci_gw_teardown(), MLX_SUCCESS, mlx_utils_init(), mlx_utils_teardown(), NODNIC_NIC_INTERFACE_SUPPORTED_BIT, NODNIC_NIC_INTERFACE_SUPPORTED_OFFSET, PCI_GW_SPACE_NODNIC, and status.

Referenced by shomron_nodnic_is_supported().

◆ flexboot_nodnic_copy_mac()

void flexboot_nodnic_copy_mac ( uint8_t mac_addr[],
uint32_t low_byte,
uint16_t high_byte )

Definition at line 1341 of file flexboot_nodnic.c.

1342 {
1343 union mac_addr {
1344 struct {
1345 uint32_t low_byte;
1346 uint16_t high_byte;
1347 };
1348 uint8_t mac_addr[ETH_ALEN];
1349 } mac_addr_aux;
1350
1351 mac_addr_aux.high_byte = high_byte;
1352 mac_addr_aux.low_byte = low_byte;
1353
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];
1360}
unsigned short uint16_t
Definition stdint.h:11

References ETH_ALEN.

◆ flexboot_nodnic_get_factory_mac()

mlx_status flexboot_nodnic_get_factory_mac ( struct flexboot_nodnic * flexboot_nodnic_priv,
uint8_t port )
static

Definition at line 1362 of file flexboot_nodnic.c.

1363 {
1364 struct mlx_vmac_query_virt_mac virt_mac;
1366
1367 memset ( & virt_mac, 0, sizeof ( virt_mac ) );
1368 status = mlx_vmac_query_virt_mac ( flexboot_nodnic_priv->device_priv.utils,
1369 &virt_mac );
1370 if ( ! status ) {
1371 DBGC ( flexboot_nodnic_priv, "NODNIC %p Failed to set the virtual MAC\n"
1372 ,flexboot_nodnic_priv );
1373 }
1374
1375 return status;
1376}
mlx_status mlx_vmac_query_virt_mac(IN mlx_utils *utils, OUT struct mlx_vmac_query_virt_mac *virt_mac)
Definition mlx_vmac.c:27

References __unused, DBGC, flexboot_nodnic::device_priv, memset(), mlx_vmac_query_virt_mac(), port, status, and _nodnic_device_priv::utils.

Referenced by flexboot_nodnic_probe().

◆ flexboot_nodnic_set_port_masking()

int flexboot_nodnic_set_port_masking ( struct flexboot_nodnic * flexboot_nodnic)
static

Set port masking.

Parameters
flexboot_nodnicnodnic device
Return values
rcReturn status code

Definition at line 1385 of file flexboot_nodnic.c.

1385 {
1386 unsigned int i;
1388
1390 for ( i = 0; i < device_priv->device_cap.num_ports; i++ ) {
1391 flexboot_nodnic->port_mask |= (i + 1);
1392 }
1393
1394 if ( ! flexboot_nodnic->port_mask ) {
1395 /* No port was enabled */
1396 DBGC ( flexboot_nodnic, "NODNIC %p No port was enabled for "
1397 "booting\n", flexboot_nodnic );
1398 return -ENETUNREACH;
1399 }
1400
1401 return 0;
1402}
#define ENETUNREACH
Network unreachable.
Definition errno.h:489

References DBGC, _nodnic_device_priv::device_cap, flexboot_nodnic::device_priv, ENETUNREACH, _nodnic_device_capabilites::num_ports, and flexboot_nodnic::port_mask.

Referenced by flexboot_nodnic_probe().

◆ init_mlx_utils()

int init_mlx_utils ( mlx_utils ** utils,
struct pci_device * pci )

Definition at line 1404 of file flexboot_nodnic.c.

1404 {
1405 int rc = 0;
1406
1407 *utils = ( mlx_utils * ) zalloc ( sizeof ( mlx_utils ) );
1408 if ( *utils == NULL ) {
1409 DBGC ( utils, "%s: Failed to allocate utils\n", __FUNCTION__ );
1410 rc = -1;
1411 goto err_utils_alloc;
1412 }
1413 if ( mlx_utils_init ( *utils, pci ) ) {
1414 DBGC ( utils, "%s: mlx_utils_init failed\n", __FUNCTION__ );
1415 rc = -1;
1416 goto err_utils_init;
1417 }
1418 if ( mlx_pci_gw_init ( *utils ) ){
1419 DBGC ( utils, "%s: mlx_pci_gw_init failed\n", __FUNCTION__ );
1420 rc = -1;
1421 goto err_cmd_init;
1422 }
1423
1424 return 0;
1425
1426 mlx_pci_gw_teardown ( *utils );
1427err_cmd_init:
1428 mlx_utils_teardown ( *utils );
1429err_utils_init:
1430 free ( *utils );
1431err_utils_alloc:
1432 *utils = NULL;
1433
1434 return rc;
1435}

References DBGC, free, mlx_pci_gw_init(), mlx_pci_gw_teardown(), mlx_utils_init(), mlx_utils_teardown(), NULL, rc, and zalloc().

Referenced by flexboot_nodnic_probe(), golan_probe_normal(), and golan_set_link_speed().

◆ free_mlx_utils()

void free_mlx_utils ( mlx_utils ** utils)

Definition at line 1437 of file flexboot_nodnic.c.

1437 {
1438
1439 mlx_pci_gw_teardown ( *utils );
1440 mlx_utils_teardown ( *utils );
1441 free ( *utils );
1442 *utils = NULL;
1443}

References free, mlx_pci_gw_teardown(), mlx_utils_teardown(), and NULL.

Referenced by flexboot_nodnic_probe(), flexboot_nodnic_remove(), golan_probe_normal(), golan_remove_normal(), and golan_set_link_speed().

◆ flexboot_nodnic_alloc_uar()

int flexboot_nodnic_alloc_uar ( struct flexboot_nodnic * flexboot_nodnic)
static

Initialise Nodnic PCI parameters.

Parameters
hermonNodnic device

Definition at line 1450 of file flexboot_nodnic.c.

1450 {
1452 struct pci_device *pci = flexboot_nodnic->pci;
1454
1456 DBGC ( flexboot_nodnic, "%s: tx db using uar is not supported \n", __FUNCTION__ );
1457 return -ENOTSUP;
1458 }
1459 /* read uar offset then allocate */
1461 DBGC ( flexboot_nodnic, "%s: nodnic_port_set_send_uar_offset failed,"
1462 "status = %d\n", __FUNCTION__, status );
1463 return -EINVAL;
1464 }
1465 uar->phys = ( pci_bar_start ( pci, FLEXBOOT_NODNIC_HCA_BAR ) + (mlx_uint32)uar->offset );
1466 uar->virt = ( void * )( pci_ioremap ( pci, uar->phys, FLEXBOOT_NODNIC_PAGE_SIZE ) );
1467
1468 return status;
1469}
#define FLEXBOOT_NODNIC_HCA_BAR
#define FLEXBOOT_NODNIC_PAGE_SIZE
#define ENOTSUP
Operation not supported.
Definition errno.h:590
void * pci_ioremap(struct pci_device *pci, unsigned long bus_addr, size_t len)
Map PCI bus address as an I/O address.
struct _nodnic_uar_priv nodnic_uar
mlx_status nodnic_port_set_send_uar_offset(IN nodnic_port_priv *port_priv)
Definition mlx_port.c:197
unsigned long pci_bar_start(struct pci_device *pci, unsigned int reg)
Find the start of a PCI BAR.
Definition pci.c:97
nodnic_device_priv * device

References DBGC, _nodnic_port_priv::device, _nodnic_device_priv::device_cap, flexboot_nodnic::device_priv, EINVAL, ENOTSUP, FLEXBOOT_NODNIC_HCA_BAR, FLEXBOOT_NODNIC_PAGE_SIZE, MLX_SUCCESS, nodnic_port_set_send_uar_offset(), _nodnic_uar_priv::offset, flexboot_nodnic::pci, pci_bar_start(), pci_ioremap(), _nodnic_uar_priv::phys, flexboot_nodnic::port, flexboot_nodnic_port::port_priv, status, _nodnic_device_capabilites::support_uar_tx_db, _nodnic_device_priv::uar, and _nodnic_uar_priv::virt.

Referenced by flexboot_nodnic_probe().

◆ flexboot_nodnic_dealloc_uar()

int flexboot_nodnic_dealloc_uar ( struct flexboot_nodnic * flexboot_nodnic)
static

Definition at line 1471 of file flexboot_nodnic.c.

1471 {
1473
1474 if ( uar->virt ) {
1475 iounmap( uar->virt );
1476 uar->virt = NULL;
1477 }
1478
1479 return MLX_SUCCESS;
1480}
void iounmap(volatile const void *io_addr)
Unmap I/O address.

References _nodnic_port_priv::device, iounmap(), MLX_SUCCESS, NULL, flexboot_nodnic::port, flexboot_nodnic_port::port_priv, _nodnic_device_priv::uar, and _nodnic_uar_priv::virt.

Referenced by flexboot_nodnic_probe(), and flexboot_nodnic_remove().

◆ flexboot_nodnic_probe()

int flexboot_nodnic_probe ( struct pci_device * pci,
struct flexboot_nodnic_callbacks * callbacks,
void * drv_priv )

Definition at line 1483 of file flexboot_nodnic.c.

1485 {
1487 struct flexboot_nodnic *flexboot_nodnic_priv = NULL;
1489 int i = 0;
1490
1491 if ( ( pci == NULL ) || ( callbacks == NULL ) ) {
1492 DBGC ( flexboot_nodnic_priv, "%s: Bad Parameter\n", __FUNCTION__ );
1493 return -EINVAL;
1494 }
1495
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;
1501 }
1502
1503 /* Register settings
1504 * Note that pci->priv will be the device private data */
1505 flexboot_nodnic_priv->pci = pci;
1506 flexboot_nodnic_priv->callbacks = callbacks;
1507 pci_set_drvdata ( pci, flexboot_nodnic_priv );
1508
1509 device_priv = &flexboot_nodnic_priv->device_priv;
1510 /* init mlx utils */
1512 MLX_FATAL_CHECK_STATUS(status, err_utils_init,
1513 "init_mlx_utils failed");
1514
1515 /* init device */
1517 MLX_FATAL_CHECK_STATUS(status, device_init_err,
1518 "nodnic_device_init failed");
1519
1521 MLX_FATAL_CHECK_STATUS(status, get_cap_err,
1522 "nodnic_device_get_cap failed");
1523
1525 MLX_DEBUG_ERROR( device_priv->utils, "Failed to set admin mtu\n" );
1526 }
1527
1528 status = flexboot_nodnic_set_port_masking ( flexboot_nodnic_priv );
1529 MLX_FATAL_CHECK_STATUS(status, err_set_masking,
1530 "flexboot_nodnic_set_port_masking failed");
1531
1532 status = flexboot_nodnic_allocate_infiniband_devices( flexboot_nodnic_priv );
1533 MLX_FATAL_CHECK_STATUS(status, err_alloc_ibdev,
1534 "flexboot_nodnic_allocate_infiniband_devices failed");
1535
1536 /* port init */
1537 status = flexboot_nodnic_thin_init_ports( flexboot_nodnic_priv );
1538 MLX_FATAL_CHECK_STATUS(status, err_thin_init_ports,
1539 "flexboot_nodnic_thin_init_ports failed");
1540
1541 if ( ( status = flexboot_nodnic_alloc_uar ( flexboot_nodnic_priv ) ) ) {
1542 DBGC(flexboot_nodnic_priv, "%s: flexboot_nodnic_alloc_uar failed"
1543 " ( status = %d )\n",__FUNCTION__, status );
1544 }
1545
1546 /* device reg */
1547 status = flexboot_nodnic_set_ports_type( flexboot_nodnic_priv );
1548 MLX_CHECK_STATUS( flexboot_nodnic_priv, status, err_set_ports_types,
1549 "flexboot_nodnic_set_ports_type failed");
1550
1551 status = flexboot_nodnic_ports_register_dev( flexboot_nodnic_priv );
1553 "flexboot_nodnic_ports_register_dev failed");
1554
1555 for ( i = 0; i < device_priv->device_cap.num_ports; i++ ) {
1556 if ( ! ( flexboot_nodnic_priv->port_mask & ( i + 1 ) ) )
1557 continue;
1558 flexboot_nodnic_get_factory_mac ( flexboot_nodnic_priv, i );
1559 }
1560
1561 /* Update ETH operations with IRQ function if supported */
1562 DBGC ( flexboot_nodnic_priv, "%s: %s IRQ function\n",
1563 __FUNCTION__, ( callbacks->irq ? "Valid" : "No" ) );
1565 return 0;
1566
1567 flexboot_nodnic_ports_unregister_dev ( flexboot_nodnic_priv );
1568reg_err:
1569err_set_ports_types:
1570 flexboot_nodnic_dealloc_uar ( flexboot_nodnic_priv );
1571err_thin_init_ports:
1572err_alloc_ibdev:
1573err_set_masking:
1574get_cap_err:
1576device_init_err:
1578err_utils_init:
1579 free ( flexboot_nodnic_priv );
1580device_err_alloc:
1581 return status;
1582}
static mlx_status flexboot_nodnic_allocate_infiniband_devices(struct flexboot_nodnic *flexboot_nodnic_priv)
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 mlx_status flexboot_nodnic_get_factory_mac(struct flexboot_nodnic *flexboot_nodnic_priv, uint8_t port)
static mlx_status flexboot_nodnic_ports_unregister_dev(struct flexboot_nodnic *flexboot_nodnic_priv)
int init_mlx_utils(mlx_utils **utils, struct pci_device *pci)
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)
static int flexboot_nodnic_dealloc_uar(struct flexboot_nodnic *flexboot_nodnic)
void free_mlx_utils(mlx_utils **utils)
static mlx_status flexboot_nodnic_ports_register_dev(struct flexboot_nodnic *flexboot_nodnic_priv)
#define EN_DEFAULT_ADMIN_MTU
mlx_status nodnic_device_init(IN nodnic_device_priv *device_priv)
Definition mlx_device.c:195
mlx_status nodnic_device_teardown(IN nodnic_device_priv *device_priv)
Definition mlx_device.c:218
mlx_status nodnic_device_get_cap(IN nodnic_device_priv *device_priv)
Definition mlx_device.c:230
mlx_status mlx_set_admin_mtu(IN mlx_utils *utils, IN mlx_uint8 port_num, IN mlx_uint32 admin_mtu)
Definition mlx_mtu.c:63
static void pci_set_drvdata(struct pci_device *pci, void *priv)
Set PCI driver-private data.
Definition pci.h:366
void(* irq)(struct net_device *netdev, int enable)

References __unused, flexboot_nodnic::callbacks, DBGC, _nodnic_device_priv::device_cap, flexboot_nodnic::device_priv, EINVAL, EN_DEFAULT_ADMIN_MTU, flexboot_nodnic_alloc_uar(), flexboot_nodnic_allocate_infiniband_devices(), flexboot_nodnic_dealloc_uar(), flexboot_nodnic_eth_operations, flexboot_nodnic_get_factory_mac(), flexboot_nodnic_ports_register_dev(), flexboot_nodnic_ports_unregister_dev(), flexboot_nodnic_set_port_masking(), flexboot_nodnic_set_ports_type(), flexboot_nodnic_thin_init_ports(), free, free_mlx_utils(), init_mlx_utils(), flexboot_nodnic_callbacks::irq, MLX_CHECK_STATUS, MLX_DEBUG_ERROR, MLX_FATAL_CHECK_STATUS, MLX_OUT_OF_RESOURCES, mlx_set_admin_mtu(), MLX_SUCCESS, nodnic_device_get_cap(), nodnic_device_init(), nodnic_device_teardown(), NULL, _nodnic_device_capabilites::num_ports, flexboot_nodnic::pci, pci_set_drvdata(), flexboot_nodnic::port_mask, status, _nodnic_device_priv::utils, and zalloc().

Referenced by golan_probe().

◆ flexboot_nodnic_remove()

void flexboot_nodnic_remove ( struct pci_device * pci)

Definition at line 1584 of file flexboot_nodnic.c.

1585{
1586 struct flexboot_nodnic *flexboot_nodnic_priv = pci_get_drvdata ( pci );
1587 nodnic_device_priv *device_priv = & ( flexboot_nodnic_priv->device_priv );
1588
1589 flexboot_nodnic_dealloc_uar ( flexboot_nodnic_priv );
1590 flexboot_nodnic_ports_unregister_dev ( flexboot_nodnic_priv );
1593 free( flexboot_nodnic_priv );
1594}
static void * pci_get_drvdata(struct pci_device *pci)
Get PCI driver-private data.
Definition pci.h:376

References flexboot_nodnic::device_priv, flexboot_nodnic_dealloc_uar(), flexboot_nodnic_ports_unregister_dev(), free, free_mlx_utils(), nodnic_device_teardown(), flexboot_nodnic::pci, pci_get_drvdata(), and _nodnic_device_priv::utils.

Referenced by golan_remove().

Variable Documentation

◆ flexboot_nodnic_ib_operations

struct ib_device_operations flexboot_nodnic_ib_operations
static
Initial value:
= {
.set_port_info = flexboot_nodnic_inform_sma,
.set_pkey_table = flexboot_nodnic_inform_sma,
}
static int flexboot_nodnic_mcast_attach(struct ib_device *ibdev, struct ib_queue_pair *qp, union ib_gid *gid)
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 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_poll_eq(struct ib_device *ibdev)
static void flexboot_nodnic_destroy_cq(struct ib_device *ibdev, struct ib_completion_queue *cq)
Destroy completion queue.
static void flexboot_nodnic_ib_close(struct ib_device *ibdev)
Close Infiniband link.
static void flexboot_nodnic_destroy_qp(struct ib_device *ibdev, struct ib_queue_pair *qp)
Destroy queue pair.
static int flexboot_nodnic_inform_sma(struct ib_device *ibdev, union ib_mad *mad)
Inform embedded subnet management agent of a received MAD.
static int flexboot_nodnic_create_qp(struct ib_device *ibdev, struct ib_queue_pair *qp)
Create queue pair.
static void flexboot_nodnic_poll_cq(struct ib_device *ibdev, struct ib_completion_queue *cq)
Poll completion queue.
static int flexboot_nodnic_create_cq(struct ib_device *ibdev, struct ib_completion_queue *cq)
Create completion queue.

flexboot_nodnic Infiniband operations

Definition at line 680 of file flexboot_nodnic.c.

680 {
681 .create_cq = flexboot_nodnic_create_cq,
682 .destroy_cq = flexboot_nodnic_destroy_cq,
683 .create_qp = flexboot_nodnic_create_qp,
684 .modify_qp = flexboot_nodnic_modify_qp,
685 .destroy_qp = flexboot_nodnic_destroy_qp,
686 .post_send = flexboot_nodnic_post_send,
687 .post_recv = flexboot_nodnic_post_recv,
688 .poll_cq = flexboot_nodnic_poll_cq,
689 .poll_eq = flexboot_nodnic_poll_eq,
692 .mcast_attach = flexboot_nodnic_mcast_attach,
693 .mcast_detach = flexboot_nodnic_mcast_detach,
694 .set_port_info = flexboot_nodnic_inform_sma,
695 .set_pkey_table = flexboot_nodnic_inform_sma,
696};

Referenced by flexboot_nodnic_allocate_infiniband_devices().

◆ flexboot_nodnic_eth_qp_op

struct ib_queue_pair_operations flexboot_nodnic_eth_qp_op
static
Initial value:
= {
.alloc_iob = alloc_iob,
}
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition iobuf.c:131

flexboot nodnic Ethernet queue pair operations

Definition at line 756 of file flexboot_nodnic.c.

756 {
757 .alloc_iob = alloc_iob,
758};

Referenced by flexboot_nodnic_eth_open().

◆ flexboot_nodnic_eth_cq_op

struct ib_completion_queue_operations flexboot_nodnic_eth_cq_op
static
Initial value:
= {
}
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 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.

flexboot_nodnic Ethernet device completion operations

Definition at line 835 of file flexboot_nodnic.c.

835 {
836 .complete_send = flexboot_nodnic_eth_complete_send,
837 .complete_recv = flexboot_nodnic_eth_complete_recv,
838};

Referenced by flexboot_nodnic_eth_open().

◆ flexboot_nodnic_eth_operations

struct net_device_operations flexboot_nodnic_eth_operations
static
Initial value:
= {
}
static void flexboot_nodnic_eth_poll(struct net_device *netdev)
Poll flexboot_nodnic Ethernet device.
static void flexboot_nodnic_eth_close(struct net_device *netdev)
Close flexboot_nodnic Ethernet device.
static int flexboot_nodnic_eth_transmit(struct net_device *netdev, struct io_buffer *iobuf)
Transmit packet via flexboot_nodnic Ethernet device.
static int flexboot_nodnic_eth_open(struct net_device *netdev)
Open flexboot_nodnic Ethernet device.

flexboot_nodnic Ethernet network device operations

Definition at line 1045 of file flexboot_nodnic.c.

1045 {
1048 .transmit = flexboot_nodnic_eth_transmit,
1050};

Referenced by flexboot_nodnic_probe(), and flexboot_nodnic_register_netdev().

◆ flexboot_nodnic_port_type_eth

struct flexboot_nodnic_port_type flexboot_nodnic_port_type_eth
static
Initial value:
= {
}
static int flexboot_nodnic_register_netdev(struct flexboot_nodnic *flexboot_nodnic, struct flexboot_nodnic_port *port)
Register flexboot_nodnic Ethernet device.
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.

flexboot_nodnic Ethernet port type

Definition at line 1135 of file flexboot_nodnic.c.

1135 {
1136 .register_dev = flexboot_nodnic_register_netdev,
1138 .unregister_dev = flexboot_nodnic_unregister_netdev,
1139};

Referenced by flexboot_nodnic_set_ports_type().