arbel );
return qpn_offset;
}
- qp->qpn = ( arbel->qpn_base + qpn_offset );
+ qp->qpn = ( ( random() & ARBEL_QPN_RANDOM_MASK ) |
+ ( arbel->qpn_base + qpn_offset ) );
return 0;
default:
DBGC ( arbel, "Arbel %p unsupported QP type %d\n",
struct arbel *arbel = ib_get_drvdata ( ibdev );
int qpn_offset;
- qpn_offset = ( qp->qpn - arbel->qpn_base );
+ qpn_offset = ( ( qp->qpn & ~ARBEL_QPN_RANDOM_MASK ) - arbel->qpn_base );
if ( qpn_offset >= 0 )
arbel_bitmask_free ( arbel->qp_inuse, qpn_offset );
}
*/
#define ARBEL_MAX_QPS 8
-/** Base queue pair number */
-#define ARBEL_QPN_BASE 0x550000
+/** Queue pair number randomisation mask */
+#define ARBEL_QPN_RANDOM_MASK 0xfff000
/** An Arbel queue pair */
struct arbel_queue_pair {
*/
static inline unsigned int
arbel_send_doorbell_idx ( struct arbel *arbel, struct ib_queue_pair *qp ) {
- return ( ARBEL_MAX_CQS + ( qp->qpn - arbel->special_qpn_base ) );
+ return ( ARBEL_MAX_CQS +
+ ( ( qp->qpn & ~ARBEL_QPN_RANDOM_MASK ) -
+ arbel->special_qpn_base ) );
}
/**
static inline unsigned int
arbel_recv_doorbell_idx ( struct arbel *arbel, struct ib_queue_pair *qp ) {
return ( ARBEL_MAX_DOORBELL_RECORDS - ARBEL_MAX_CQS -
- ( qp->qpn - arbel->special_qpn_base ) - 1 );
+ ( ( qp->qpn & ~ARBEL_QPN_RANDOM_MASK ) -
+ arbel->special_qpn_base ) - 1 );
}
/**