hermon );
return qpn_offset;
}
- qp->qpn = ( hermon->qpn_base + qpn_offset );
+ qp->qpn = ( ( random() & HERMON_QPN_RANDOM_MASK ) |
+ ( hermon->qpn_base + qpn_offset ) );
return 0;
default:
DBGC ( hermon, "Hermon %p unsupported QP type %d\n",
struct hermon *hermon = ib_get_drvdata ( ibdev );
int qpn_offset;
- qpn_offset = ( qp->qpn - hermon->qpn_base );
+ qpn_offset = ( ( qp->qpn & ~HERMON_QPN_RANDOM_MASK )
+ - hermon->qpn_base );
if ( qpn_offset >= 0 )
hermon_bitmask_free ( hermon->qp_inuse, qpn_offset, 1 );
}
int rc;
/* Special QP block must be aligned on its own size */
- hermon->special_qpn_base = ( ( HERMON_QPN_BASE +
- hermon->cap.reserved_qps +
+ hermon->special_qpn_base = ( ( hermon->cap.reserved_qps +
HERMON_NUM_SPECIAL_QPS - 1 )
& ~( HERMON_NUM_SPECIAL_QPS - 1 ) );
hermon->qpn_base = ( hermon->special_qpn_base +
*/
#define HERMON_MAX_QPS 8
-/** Base queue pair number */
-#define HERMON_QPN_BASE 0x550000
+/** Queue pair number randomisation mask */
+#define HERMON_QPN_RANDOM_MASK 0xfff000
/** Hermon queue pair state */
enum hermon_queue_pair_state {