iPXE
Data Structures | Macros | Functions
ib_mi.h File Reference

Infiniband management interfaces. More...

#include <ipxe/list.h>
#include <ipxe/retry.h>
#include <ipxe/tables.h>
#include <ipxe/infiniband.h>

Go to the source code of this file.

Data Structures

struct  ib_mad_agent
 An Infiniband management agent. More...
 
struct  ib_mad_transaction_operations
 Infiniband management transaction operations. More...
 
struct  ib_mad_transaction
 An Infiniband management transaction. More...
 
struct  ib_mad_interface
 An Infiniband management interface. More...
 

Macros

#define IB_MAD_AGENTS   __table ( struct ib_mad_agent, "ib_mad_agents" )
 Infiniband management agents. More...
 
#define __ib_mad_agent   __table_entry ( IB_MAD_AGENTS, 01 )
 Declare an Infiniband management agent. More...
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
static __always_inline void ib_madx_set_ownerdata (struct ib_mad_transaction *madx, void *priv)
 Set Infiniband management transaction owner-private data. More...
 
static __always_inline void * ib_madx_get_ownerdata (struct ib_mad_transaction *madx)
 Get Infiniband management transaction owner-private data. More...
 
int ib_mi_send (struct ib_device *ibdev, struct ib_mad_interface *mi, union ib_mad *mad, struct ib_address_vector *av)
 Transmit MAD. More...
 
struct ib_mad_transactionib_create_madx (struct ib_device *ibdev, struct ib_mad_interface *mi, union ib_mad *mad, struct ib_address_vector *av, struct ib_mad_transaction_operations *op)
 Create management transaction. More...
 
void ib_destroy_madx (struct ib_device *ibdev, struct ib_mad_interface *mi, struct ib_mad_transaction *madx)
 
int ib_create_mi (struct ib_device *ibdev, enum ib_queue_pair_type type, struct ib_mad_interface **new_mi)
 Create management interface. More...
 
void ib_destroy_mi (struct ib_device *ibdev, struct ib_mad_interface *mi)
 Destroy management interface. More...
 

Detailed Description

Infiniband management interfaces.

Definition in file ib_mi.h.

Macro Definition Documentation

◆ IB_MAD_AGENTS

#define IB_MAD_AGENTS   __table ( struct ib_mad_agent, "ib_mad_agents" )

Infiniband management agents.

Definition at line 43 of file ib_mi.h.

◆ __ib_mad_agent

#define __ib_mad_agent   __table_entry ( IB_MAD_AGENTS, 01 )

Declare an Infiniband management agent.

Definition at line 46 of file ib_mi.h.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ ib_madx_set_ownerdata()

static __always_inline void ib_madx_set_ownerdata ( struct ib_mad_transaction madx,
void *  priv 
)
inlinestatic

Set Infiniband management transaction owner-private data.

Parameters
madxManagement transaction
privPrivate data

Definition at line 106 of file ib_mi.h.

106  {
107  madx->owner_priv = priv;
108 }
static struct tlan_private * priv
Definition: tlan.c:224
void * owner_priv
Owner private data.
Definition: ib_mi.h:84

References ib_mad_transaction::owner_priv, and priv.

Referenced by ib_cm_path_complete(), ib_create_path(), ib_mcast_join(), xsigo_discover(), and xsigo_xds_complete().

◆ ib_madx_get_ownerdata()

static __always_inline void* ib_madx_get_ownerdata ( struct ib_mad_transaction madx)
inlinestatic

Get Infiniband management transaction owner-private data.

Parameters
madxManagement transaction
Return values
privPrivate data

Definition at line 117 of file ib_mi.h.

117  {
118  return madx->owner_priv;
119 }
void * owner_priv
Owner private data.
Definition: ib_mi.h:84

References ib_mad_transaction::owner_priv.

Referenced by ib_cm_req_complete(), ib_mcast_complete(), ib_path_complete(), xsigo_xcm_complete(), and xsigo_xds_complete().

◆ ib_mi_send()

int ib_mi_send ( struct ib_device ibdev,
struct ib_mad_interface mi,
union ib_mad mad,
struct ib_address_vector av 
)

Transmit MAD.

Parameters
ibdevInfiniband device
miManagement interface
madMAD
avDestination address vector
Return values
rcReturn status code

Definition at line 187 of file ib_mi.c.

188  {
189  struct ib_mad_hdr *hdr = &mad->hdr;
190  struct io_buffer *iobuf;
191  int rc;
192 
193  /* Set common fields */
194  hdr->base_version = IB_MGMT_BASE_VERSION;
195  if ( ( hdr->tid.high == 0 ) && ( hdr->tid.low == 0 ) ) {
196  hdr->tid.high = htonl ( IB_MI_TID_MAGIC );
197  hdr->tid.low = htonl ( ++next_tid );
198  }
199  DBGC ( mi, "MI %p TX TID %08x%08x (%02x,%02x,%02x,%04x) status "
200  "%04x\n", mi, ntohl ( hdr->tid.high ), ntohl ( hdr->tid.low ),
201  hdr->mgmt_class, hdr->class_version, hdr->method,
202  ntohs ( hdr->attr_id ), ntohs ( hdr->status ) );
203  DBGC2_HDA ( mi, 0, mad, sizeof ( *mad ) );
204 
205  /* Construct directed route portion of response, if necessary */
206  if ( hdr->mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE ) {
207  struct ib_mad_smp *smp = &mad->smp;
208  unsigned int hop_pointer;
209  unsigned int hop_count;
210 
211  smp->mad_hdr.status |= htons ( IB_SMP_STATUS_D_INBOUND );
212  hop_pointer = smp->mad_hdr.class_specific.smp.hop_pointer;
213  hop_count = smp->mad_hdr.class_specific.smp.hop_count;
215  if ( hop_pointer < ( sizeof ( smp->return_path.hops ) /
216  sizeof ( smp->return_path.hops[0] ) ) ) {
217  smp->return_path.hops[hop_pointer] = ibdev->port;
218  } else {
219  DBGC ( mi, "MI %p TX TID %08x%08x invalid hop pointer "
220  "%d\n", mi, ntohl ( hdr->tid.high ),
221  ntohl ( hdr->tid.low ), hop_pointer );
222  return -EINVAL;
223  }
224  }
225 
226  /* Construct I/O buffer */
227  iobuf = alloc_iob ( sizeof ( *mad ) );
228  if ( ! iobuf ) {
229  DBGC ( mi, "MI %p could not allocate buffer for TID "
230  "%08x%08x\n",
231  mi, ntohl ( hdr->tid.high ), ntohl ( hdr->tid.low ) );
232  return -ENOMEM;
233  }
234  memcpy ( iob_put ( iobuf, sizeof ( *mad ) ), mad, sizeof ( *mad ) );
235 
236  /* Send I/O buffer */
237  if ( ( rc = ib_post_send ( ibdev, mi->qp, av, iobuf ) ) != 0 ) {
238  DBGC ( mi, "MI %p TX TID %08x%08x failed: %s\n",
239  mi, ntohl ( hdr->tid.high ), ntohl ( hdr->tid.low ),
240  strerror ( rc ) );
241  free_iob ( iobuf );
242  return rc;
243  }
244 
245  return 0;
246 }
#define EINVAL
Invalid argument.
Definition: errno.h:428
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define iob_put(iobuf, len)
Definition: iobuf.h:120
struct ib_smp_class_specific smp
Definition: ib_mad.h:12
struct golan_inbox_hdr hdr
Message header.
Definition: CIB_PRM.h:28
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:146
#define DBGC(...)
Definition: compiler.h:505
A subnet management MAD.
Definition: ib_mad.h:587
#define ntohl(value)
Definition: byteswap.h:134
#define ntohs(value)
Definition: byteswap.h:136
uint8_t hop_pointer
Definition: ib_mad.h:196
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition: iobuf.c:129
#define htonl(value)
Definition: byteswap.h:133
struct ib_queue_pair * qp
Queue pair.
Definition: ib_mi.h:94
#define IB_SMP_STATUS_D_INBOUND
Subnet management direction bit.
Definition: ib_mad.h:40
#define ENOMEM
Not enough space.
Definition: errno.h:534
void * memcpy(void *dest, const void *src, size_t len) __nonnull
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define DBGC2_HDA(...)
Definition: compiler.h:523
unsigned int port
Port number.
Definition: infiniband.h:418
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
struct ib_mad_smp smp
Definition: ib_mad.h:612
uint8_t hop_pointer
Definition: ib_mad.h:11
A management datagram common header.
Definition: ib_mad.h:538
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
struct ib_mad_hdr hdr
Definition: ib_mad.h:611
#define IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE
Definition: ib_mad.h:556
#define IB_MI_TID_MAGIC
TID magic signature.
Definition: ib_mi.c:63
#define IB_MGMT_BASE_VERSION
Definition: ib_mad.h:552
uint8_t hop_count
Definition: ib_mad.h:12
static unsigned int next_tid
TID to use for next MAD.
Definition: ib_mi.c:66
#define htons(value)
Definition: byteswap.h:135
union ib_mad mad
Definition: arbel.h:12
A persistent I/O buffer.
Definition: iobuf.h:33

References alloc_iob(), assert(), DBGC, DBGC2_HDA, EINVAL, ENOMEM, free_iob(), ib_mad::hdr, hdr, hop_count, ib_smp_class_specific::hop_count, hop_pointer, ib_smp_class_specific::hop_pointer, htonl, htons, IB_MGMT_BASE_VERSION, IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE, IB_MI_TID_MAGIC, ib_post_send(), IB_SMP_STATUS_D_INBOUND, iob_put, mad, memcpy(), next_tid, ntohl, ntohs, ib_device::port, ib_mad_interface::qp, rc, smp, ib_mad::smp, and strerror().

Referenced by ib_cm_send_drep(), ib_cm_send_rtu(), ib_mcast_leave(), ib_mi_timer_expired(), ib_sma_guid_info(), ib_sma_node_desc(), ib_sma_node_info(), ib_sma_pkey_table(), and ib_sma_port_info().

◆ ib_create_madx()

struct ib_mad_transaction* ib_create_madx ( struct ib_device ibdev,
struct ib_mad_interface mi,
union ib_mad mad,
struct ib_address_vector av,
struct ib_mad_transaction_operations op 
)

Create management transaction.

Parameters
ibdevInfiniband device
miManagement interface
madMAD to send
avDestination address, or NULL to use SM's GSI
opManagement transaction operations
Return values
madxManagement transaction, or NULL

Definition at line 287 of file ib_mi.c.

289  {
290  struct ib_mad_transaction *madx;
291 
292  /* Allocate and initialise structure */
293  madx = zalloc ( sizeof ( *madx ) );
294  if ( ! madx )
295  return NULL;
296  timer_init ( &madx->timer, ib_mi_timer_expired, NULL );
297  madx->mi = mi;
298  madx->op = op;
299 
300  /* Determine address vector */
301  if ( av ) {
302  memcpy ( &madx->av, av, sizeof ( madx->av ) );
303  } else {
304  madx->av.lid = ibdev->sm_lid;
305  madx->av.sl = ibdev->sm_sl;
306  madx->av.qpn = IB_QPN_GSI;
307  madx->av.qkey = IB_QKEY_GSI;
308  }
309 
310  /* Copy MAD */
311  memcpy ( &madx->mad, mad, sizeof ( madx->mad ) );
312 
313  /* Add to list and start timer to send initial MAD */
314  list_add ( &madx->list, &mi->madx );
315  start_timer_nodelay ( &madx->timer );
316 
317  return madx;
318 }
struct ib_address_vector av
Destination address vector.
Definition: ib_mi.h:78
static void start_timer_nodelay(struct retry_timer *timer)
Start timer with no delay.
Definition: retry.h:99
#define list_add(new, head)
Add a new entry to the head of a list.
Definition: list.h:69
struct list_head list
List of transactions.
Definition: ib_mi.h:74
#define IB_QKEY_GSI
General service interface queue key.
Definition: infiniband.h:30
void * memcpy(void *dest, const void *src, size_t len) __nonnull
unsigned long qkey
Queue key.
Definition: infiniband.h:79
An Infiniband management transaction.
Definition: ib_mi.h:70
uint16_t sm_lid
Subnet manager LID.
Definition: infiniband.h:445
uint8_t sm_sl
Subnet manager SL.
Definition: infiniband.h:447
#define IB_QPN_GSI
General service interface QPN.
Definition: infiniband.h:27
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:624
struct ib_mad_transaction_operations * op
Transaction operations.
Definition: ib_mi.h:82
unsigned long qpn
Queue Pair Number.
Definition: infiniband.h:74
unsigned int sl
Service level.
Definition: infiniband.h:88
static uint16_t struct vmbus_xfer_pages_operations * op
Definition: netvsc.h:327
struct ib_mad_interface * mi
Associated management interface.
Definition: ib_mi.h:72
static void ib_mi_timer_expired(struct retry_timer *timer, int expired)
Handle management transaction timer expiry.
Definition: ib_mi.c:254
union ib_mad mad
MAD being sent.
Definition: ib_mi.h:80
unsigned int lid
Local ID.
Definition: infiniband.h:81
struct list_head madx
List of management transactions.
Definition: ib_mi.h:96
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
union ib_mad mad
Definition: arbel.h:12
struct retry_timer timer
Retry timer.
Definition: ib_mi.h:76

References ib_mad_transaction::av, ib_mi_timer_expired(), IB_QKEY_GSI, IB_QPN_GSI, ib_address_vector::lid, ib_mad_transaction::list, list_add, mad, ib_mad_transaction::mad, ib_mad_interface::madx, memcpy(), ib_mad_transaction::mi, NULL, ib_mad_transaction::op, op, ib_address_vector::qkey, ib_address_vector::qpn, ib_address_vector::sl, ib_device::sm_lid, ib_device::sm_sl, start_timer_nodelay(), ib_mad_transaction::timer, and zalloc().

Referenced by ib_cm_path_complete(), ib_create_path(), ib_create_service_madx(), ib_mcast_join(), and xsigo_xds_complete().

◆ ib_destroy_madx()

void ib_destroy_madx ( struct ib_device ibdev,
struct ib_mad_interface mi,
struct ib_mad_transaction madx 
)

◆ ib_create_mi()

int ib_create_mi ( struct ib_device ibdev,
enum ib_queue_pair_type  type,
struct ib_mad_interface **  new_mi 
)

Create management interface.

Parameters
ibdevInfiniband device
typeQueue pair type
new_miNew management interface to fill in
Return values
rcReturn status code

Definition at line 347 of file ib_mi.c.

348  {
349  struct ib_mad_interface *mi;
350  const char *name;
351  int rc;
352 
353  /* Allocate and initialise fields */
354  mi = zalloc ( sizeof ( *mi ) );
355  if ( ! mi ) {
356  rc = -ENOMEM;
357  goto err_alloc;
358  }
359  mi->ibdev = ibdev;
360  INIT_LIST_HEAD ( &mi->madx );
361 
362  /* Create completion queue */
364  &mi->cq ) ) != 0 ) {
365  DBGC ( mi, "MI %p could not create completion queue: %s\n",
366  mi, strerror ( rc ) );
367  goto err_create_cq;
368  }
369 
370  /* Create queue pair */
371  name = ( ( type == IB_QPT_SMI ) ? "SMI" : "GSI" );
372  if ( ( rc = ib_create_qp ( ibdev, type, IB_MI_NUM_SEND_WQES, mi->cq,
373  IB_MI_NUM_RECV_WQES, mi->cq,
374  &ib_mi_queue_pair_ops, name, &mi->qp ) )!=0){
375  DBGC ( mi, "MI %p could not create queue pair: %s\n",
376  mi, strerror ( rc ) );
377  goto err_create_qp;
378  }
379  ib_qp_set_ownerdata ( mi->qp, mi );
380  DBGC ( mi, "MI %p (%s) running on QPN %#lx\n",
381  mi, mi->qp->name, mi->qp->qpn );
382 
383  /* Set queue key */
384  mi->qp->qkey = ( ( type == IB_QPT_SMI ) ? IB_QKEY_SMI : IB_QKEY_GSI );
385  if ( ( rc = ib_modify_qp ( ibdev, mi->qp ) ) != 0 ) {
386  DBGC ( mi, "MI %p could not set queue key: %s\n",
387  mi, strerror ( rc ) );
388  goto err_modify_qp;
389  }
390 
391  /* Fill receive ring */
392  ib_refill_recv ( ibdev, mi->qp );
393  *new_mi = mi;
394  return 0;
395 
396  err_modify_qp:
397  ib_destroy_qp ( ibdev, mi->qp );
398  err_create_qp:
399  ib_destroy_cq ( ibdev, mi->cq );
400  err_create_cq:
401  free ( mi );
402  err_alloc:
403  return rc;
404 }
struct ib_device * ibdev
Infiniband device.
Definition: ib_mi.h:90
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define IB_MI_NUM_RECV_WQES
Management interface number of receive WQEs.
Definition: ib_mi.c:54
const char * name
Definition: ath9k_hw.c:1984
#define IB_QKEY_SMI
Subnet management interface queue key.
Definition: infiniband.h:24
int ib_modify_qp(struct ib_device *ibdev, struct ib_queue_pair *qp)
Modify queue pair.
Definition: infiniband.c:294
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_refill_recv(struct ib_device *ibdev, struct ib_queue_pair *qp)
Refill receive work queue.
Definition: infiniband.c:556
#define DBGC(...)
Definition: compiler.h:505
An Infiniband management interface.
Definition: ib_mi.h:88
#define IB_QKEY_GSI
General service interface queue key.
Definition: infiniband.h:30
unsigned long qkey
Queue key.
Definition: infiniband.h:176
void ib_destroy_cq(struct ib_device *ibdev, struct ib_completion_queue *cq)
Destroy completion queue.
Definition: infiniband.c:145
struct ib_queue_pair * qp
Queue pair.
Definition: ib_mi.h:94
#define ENOMEM
Not enough space.
Definition: errno.h:534
static struct ib_completion_queue_operations ib_mi_completion_ops
Management interface completion operations.
Definition: ib_mi.c:169
struct ib_completion_queue * cq
Completion queue.
Definition: ib_mi.h:92
#define IB_MI_NUM_SEND_WQES
Management interface number of send WQEs.
Definition: ib_mi.c:48
const char * name
Queue pair name.
Definition: infiniband.h:163
unsigned long qpn
Queue pair number.
Definition: infiniband.h:165
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:624
void ib_destroy_qp(struct ib_device *ibdev, struct ib_queue_pair *qp)
Destroy queue pair.
Definition: infiniband.c:314
static struct ib_queue_pair_operations ib_mi_queue_pair_ops
Management interface queue pair operations.
Definition: ib_mi.c:174
#define IB_MI_NUM_CQES
Management interface number of completion queue entries.
Definition: ib_mi.c:60
#define INIT_LIST_HEAD(list)
Initialise a list head.
Definition: list.h:45
uint32_t type
Operating system type.
Definition: ena.h:12
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
struct list_head madx
List of management transactions.
Definition: ib_mi.h:96
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:653

References ib_mad_interface::cq, DBGC, ENOMEM, free, ib_create_cq(), ib_create_qp(), ib_destroy_cq(), ib_destroy_qp(), ib_mi_completion_ops, IB_MI_NUM_CQES, IB_MI_NUM_RECV_WQES, IB_MI_NUM_SEND_WQES, ib_mi_queue_pair_ops, ib_modify_qp(), IB_QKEY_GSI, IB_QKEY_SMI, ib_qp_set_ownerdata(), IB_QPT_SMI, ib_refill_recv(), ib_mad_interface::ibdev, INIT_LIST_HEAD, ib_mad_interface::madx, ib_queue_pair::name, name, ib_queue_pair::qkey, ib_mad_interface::qp, ib_queue_pair::qpn, rc, strerror(), type, and zalloc().

Referenced by ib_open().

◆ ib_destroy_mi()

void ib_destroy_mi ( struct ib_device ibdev,
struct ib_mad_interface mi 
)

Destroy management interface.

Parameters
miManagement interface

Definition at line 411 of file ib_mi.c.

411  {
412  struct ib_mad_transaction *madx;
413  struct ib_mad_transaction *tmp;
414 
415  /* Flush any outstanding requests */
416  list_for_each_entry_safe ( madx, tmp, &mi->madx, list ) {
417  DBGC ( mi, "MI %p destroyed while TID %08x%08x in progress\n",
418  mi, ntohl ( madx->mad.hdr.tid.high ),
419  ntohl ( madx->mad.hdr.tid.low ) );
420  madx->op->complete ( ibdev, mi, madx, -ECANCELED, NULL, NULL );
421  }
422 
423  ib_destroy_qp ( ibdev, mi->qp );
424  ib_destroy_cq ( ibdev, mi->cq );
425  free ( mi );
426 }
#define DBGC(...)
Definition: compiler.h:505
struct list_head list
List of transactions.
Definition: ib_mi.h:74
#define ntohl(value)
Definition: byteswap.h:134
#define ECANCELED
Operation canceled.
Definition: errno.h:343
void ib_destroy_cq(struct ib_device *ibdev, struct ib_completion_queue *cq)
Destroy completion queue.
Definition: infiniband.c:145
struct ib_queue_pair * qp
Queue pair.
Definition: ib_mi.h:94
unsigned long tmp
Definition: linux_pci.h:53
uint32_t low
Definition: ib_mad.h:531
struct ib_completion_queue * cq
Completion queue.
Definition: ib_mi.h:92
An Infiniband management transaction.
Definition: ib_mi.h:70
#define list_for_each_entry_safe(pos, tmp, head, member)
Iterate over entries in a list, safe against deletion of the current entry.
Definition: list.h:458
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
void ib_destroy_qp(struct ib_device *ibdev, struct ib_queue_pair *qp)
Destroy queue pair.
Definition: infiniband.c:314
struct ib_mad_transaction_operations * op
Transaction operations.
Definition: ib_mi.h:82
struct ib_mad_tid tid
Definition: ib_mad.h:545
struct ib_mad_hdr hdr
Definition: ib_mad.h:611
struct ib_mad_interface * mi
Associated management interface.
Definition: ib_mi.h:72
uint32_t high
Definition: ib_mad.h:530
union ib_mad mad
MAD being sent.
Definition: ib_mi.h:80
void(* complete)(struct ib_device *ibdev, struct ib_mad_interface *mi, struct ib_mad_transaction *madx, int rc, union ib_mad *mad, struct ib_address_vector *av)
Handle transaction completion.
Definition: ib_mi.h:62
struct list_head madx
List of management transactions.
Definition: ib_mi.h:96
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References ib_mad_transaction_operations::complete, ib_mad_interface::cq, DBGC, ECANCELED, free, ib_mad::hdr, ib_mad_tid::high, ib_destroy_cq(), ib_destroy_qp(), ib_mad_transaction::list, list_for_each_entry_safe, ib_mad_tid::low, ib_mad_transaction::mad, ib_mad_interface::madx, ib_mad_transaction::mi, ntohl, NULL, ib_mad_transaction::op, ib_mad_interface::qp, ib_mad_hdr::tid, and tmp.

Referenced by ib_close(), and ib_open().