|  | @@ -772,6 +772,7 @@ static int arbel_alloc_qpn ( struct ib_device *ibdev,
 | 
		
	
		
			
			| 772 | 772 |  		qp->qpn = ( arbel->special_qpn_base + 2 + port_offset );
 | 
		
	
		
			
			| 773 | 773 |  		return 0;
 | 
		
	
		
			
			| 774 | 774 |  	case IB_QPT_UD:
 | 
		
	
		
			
			|  | 775 | +	case IB_QPT_RC:
 | 
		
	
		
			
			| 775 | 776 |  		/* Find a free queue pair number */
 | 
		
	
		
			
			| 776 | 777 |  		qpn_offset = arbel_bitmask_alloc ( arbel->qp_inuse,
 | 
		
	
		
			
			| 777 | 778 |  						   ARBEL_MAX_QPS );
 | 
		
	
	
		
			
			|  | @@ -822,6 +823,7 @@ static uint8_t arbel_qp_st[] = {
 | 
		
	
		
			
			| 822 | 823 |  	[IB_QPT_SMI] = ARBEL_ST_MLX,
 | 
		
	
		
			
			| 823 | 824 |  	[IB_QPT_GSI] = ARBEL_ST_MLX,
 | 
		
	
		
			
			| 824 | 825 |  	[IB_QPT_UD] = ARBEL_ST_UD,
 | 
		
	
		
			
			|  | 826 | +	[IB_QPT_RC] = ARBEL_ST_RC,
 | 
		
	
		
			
			| 825 | 827 |  };
 | 
		
	
		
			
			| 826 | 828 |  
 | 
		
	
		
			
			| 827 | 829 |  /**
 | 
		
	
	
		
			
			|  | @@ -948,6 +950,18 @@ static int arbel_create_qp ( struct ib_device *ibdev,
 | 
		
	
		
			
			| 948 | 950 |  	physaddr_t wqe_base_adr;
 | 
		
	
		
			
			| 949 | 951 |  	int rc;
 | 
		
	
		
			
			| 950 | 952 |  
 | 
		
	
		
			
			|  | 953 | +	/* Warn about dysfunctional code
 | 
		
	
		
			
			|  | 954 | +	 *
 | 
		
	
		
			
			|  | 955 | +	 * Arbel seems to crash the system as soon as the first send
 | 
		
	
		
			
			|  | 956 | +	 * WQE completes on an RC queue pair.  (NOPs complete
 | 
		
	
		
			
			|  | 957 | +	 * successfully, so this is a problem specific to the work
 | 
		
	
		
			
			|  | 958 | +	 * queue rather than the completion queue.)  The cause of this
 | 
		
	
		
			
			|  | 959 | +	 * problem has remained unknown for over a year.  Patches to
 | 
		
	
		
			
			|  | 960 | +	 * fix this are welcome.
 | 
		
	
		
			
			|  | 961 | +	 */
 | 
		
	
		
			
			|  | 962 | +	if ( qp->type == IB_QPT_RC )
 | 
		
	
		
			
			|  | 963 | +		DBG ( "*** WARNING: Arbel RC support is non-functional ***\n" );
 | 
		
	
		
			
			|  | 964 | +
 | 
		
	
		
			
			| 951 | 965 |  	/* Calculate queue pair number */
 | 
		
	
		
			
			| 952 | 966 |  	if ( ( rc = arbel_alloc_qpn ( ibdev, qp ) ) != 0 )
 | 
		
	
		
			
			| 953 | 967 |  		goto err_alloc_qpn;
 | 
		
	
	
		
			
			|  | @@ -1021,7 +1035,11 @@ static int arbel_create_qp ( struct ib_device *ibdev,
 | 
		
	
		
			
			| 1021 | 1035 |  		     ( send_wqe_base_adr >> 6 ) );
 | 
		
	
		
			
			| 1022 | 1036 |  	MLX_FILL_1 ( &qpctx, 35, qpc_eec_data.snd_db_record_index,
 | 
		
	
		
			
			| 1023 | 1037 |  		     arbel_qp->send.doorbell_idx );
 | 
		
	
		
			
			| 1024 |  | -	MLX_FILL_1 ( &qpctx, 38, qpc_eec_data.rsc, 1 );
 | 
		
	
		
			
			|  | 1038 | +	MLX_FILL_4 ( &qpctx, 38,
 | 
		
	
		
			
			|  | 1039 | +		     qpc_eec_data.rre, 1,
 | 
		
	
		
			
			|  | 1040 | +		     qpc_eec_data.rwe, 1,
 | 
		
	
		
			
			|  | 1041 | +		     qpc_eec_data.rae, 1,
 | 
		
	
		
			
			|  | 1042 | +		     qpc_eec_data.rsc, 1 );
 | 
		
	
		
			
			| 1025 | 1043 |  	MLX_FILL_1 ( &qpctx, 41, qpc_eec_data.cqn_rcv, qp->recv.cq->cqn );
 | 
		
	
		
			
			| 1026 | 1044 |  	MLX_FILL_1 ( &qpctx, 42, qpc_eec_data.rcv_wqe_base_adr_l,
 | 
		
	
		
			
			| 1027 | 1045 |  		     ( recv_wqe_base_adr >> 6 ) );
 | 
		
	
	
		
			
			|  | @@ -1084,7 +1102,30 @@ static int arbel_modify_qp ( struct ib_device *ibdev,
 | 
		
	
		
			
			| 1084 | 1102 |  		memset ( &qpctx, 0, sizeof ( qpctx ) );
 | 
		
	
		
			
			| 1085 | 1103 |  		MLX_FILL_2 ( &qpctx, 4,
 | 
		
	
		
			
			| 1086 | 1104 |  			     qpc_eec_data.mtu, ARBEL_MTU_2048,
 | 
		
	
		
			
			| 1087 |  | -			     qpc_eec_data.msg_max, 11 /* 2^11 = 2048 */ );
 | 
		
	
		
			
			|  | 1105 | +			     qpc_eec_data.msg_max, 31 );
 | 
		
	
		
			
			|  | 1106 | +		MLX_FILL_1 ( &qpctx, 7,
 | 
		
	
		
			
			|  | 1107 | +			     qpc_eec_data.remote_qpn_een, qp->av.qpn );
 | 
		
	
		
			
			|  | 1108 | +		MLX_FILL_2 ( &qpctx, 11,
 | 
		
	
		
			
			|  | 1109 | +			     qpc_eec_data.primary_address_path.rnr_retry,
 | 
		
	
		
			
			|  | 1110 | +			     ARBEL_RETRY_MAX,
 | 
		
	
		
			
			|  | 1111 | +			     qpc_eec_data.primary_address_path.rlid,
 | 
		
	
		
			
			|  | 1112 | +			     qp->av.lid );
 | 
		
	
		
			
			|  | 1113 | +		MLX_FILL_2 ( &qpctx, 12,
 | 
		
	
		
			
			|  | 1114 | +			     qpc_eec_data.primary_address_path.ack_timeout,
 | 
		
	
		
			
			|  | 1115 | +			     14 /* 4.096us * 2^(14) = 67ms */,
 | 
		
	
		
			
			|  | 1116 | +			     qpc_eec_data.primary_address_path.max_stat_rate,
 | 
		
	
		
			
			|  | 1117 | +			     arbel_rate ( &qp->av ) );
 | 
		
	
		
			
			|  | 1118 | +		memcpy ( &qpctx.u.dwords[14], &qp->av.gid,
 | 
		
	
		
			
			|  | 1119 | +			 sizeof ( qp->av.gid ) );
 | 
		
	
		
			
			|  | 1120 | +		MLX_FILL_1 ( &qpctx, 30,
 | 
		
	
		
			
			|  | 1121 | +			     qpc_eec_data.retry_count, ARBEL_RETRY_MAX );
 | 
		
	
		
			
			|  | 1122 | +		MLX_FILL_1 ( &qpctx, 39,
 | 
		
	
		
			
			|  | 1123 | +			     qpc_eec_data.next_rcv_psn, qp->recv.psn );
 | 
		
	
		
			
			|  | 1124 | +		MLX_FILL_1 ( &qpctx, 40,
 | 
		
	
		
			
			|  | 1125 | +			     qpc_eec_data.ra_buff_indx,
 | 
		
	
		
			
			|  | 1126 | +			     ( arbel->limits.reserved_rdbs +
 | 
		
	
		
			
			|  | 1127 | +			       ( ( qp->qpn & ~ARBEL_QPN_RANDOM_MASK ) -
 | 
		
	
		
			
			|  | 1128 | +				 arbel->special_qpn_base ) ) );
 | 
		
	
		
			
			| 1088 | 1129 |  		if ( ( rc = arbel_cmd_init2rtr_qpee ( arbel, qp->qpn,
 | 
		
	
		
			
			| 1089 | 1130 |  						      &qpctx ) ) != 0 ) {
 | 
		
	
		
			
			| 1090 | 1131 |  			DBGC ( arbel, "Arbel %p QPN %#lx INIT2RTR_QPEE failed:"
 | 
		
	
	
		
			
			|  | @@ -1097,6 +1138,15 @@ static int arbel_modify_qp ( struct ib_device *ibdev,
 | 
		
	
		
			
			| 1097 | 1138 |  	/* Transition queue to RTS state, if applicable */
 | 
		
	
		
			
			| 1098 | 1139 |  	if ( arbel_qp->state < ARBEL_QP_ST_RTS ) {
 | 
		
	
		
			
			| 1099 | 1140 |  		memset ( &qpctx, 0, sizeof ( qpctx ) );
 | 
		
	
		
			
			|  | 1141 | +		MLX_FILL_1 ( &qpctx, 11,
 | 
		
	
		
			
			|  | 1142 | +			     qpc_eec_data.primary_address_path.rnr_retry,
 | 
		
	
		
			
			|  | 1143 | +			     ARBEL_RETRY_MAX );
 | 
		
	
		
			
			|  | 1144 | +		MLX_FILL_1 ( &qpctx, 12,
 | 
		
	
		
			
			|  | 1145 | +			     qpc_eec_data.primary_address_path.ack_timeout,
 | 
		
	
		
			
			|  | 1146 | +			     14 /* 4.096us * 2^(14) = 67ms */ );
 | 
		
	
		
			
			|  | 1147 | +		MLX_FILL_2 ( &qpctx, 30,
 | 
		
	
		
			
			|  | 1148 | +			     qpc_eec_data.retry_count, ARBEL_RETRY_MAX,
 | 
		
	
		
			
			|  | 1149 | +			     qpc_eec_data.sic, 1 );
 | 
		
	
		
			
			| 1100 | 1150 |  		MLX_FILL_1 ( &qpctx, 32,
 | 
		
	
		
			
			| 1101 | 1151 |  			     qpc_eec_data.next_send_psn, qp->send.psn );
 | 
		
	
		
			
			| 1102 | 1152 |  		if ( ( rc = arbel_cmd_rtr2rts_qpee ( arbel, qp->qpn,
 | 
		
	
	
		
			
			|  | @@ -1288,6 +1338,36 @@ static size_t arbel_fill_mlx_send_wqe ( struct ib_device *ibdev,
 | 
		
	
		
			
			| 1288 | 1338 |  	return ( offsetof ( typeof ( wqe->mlx ), data[2] ) >> 4 );
 | 
		
	
		
			
			| 1289 | 1339 |  }
 | 
		
	
		
			
			| 1290 | 1340 |  
 | 
		
	
		
			
			|  | 1341 | +/**
 | 
		
	
		
			
			|  | 1342 | + * Construct RC send work queue entry
 | 
		
	
		
			
			|  | 1343 | + *
 | 
		
	
		
			
			|  | 1344 | + * @v ibdev		Infiniband device
 | 
		
	
		
			
			|  | 1345 | + * @v qp		Queue pair
 | 
		
	
		
			
			|  | 1346 | + * @v av		Address vector
 | 
		
	
		
			
			|  | 1347 | + * @v iobuf		I/O buffer
 | 
		
	
		
			
			|  | 1348 | + * @v wqe		Send work queue entry
 | 
		
	
		
			
			|  | 1349 | + * @v next		Previous work queue entry's "next" field
 | 
		
	
		
			
			|  | 1350 | + * @ret nds		Work queue entry size
 | 
		
	
		
			
			|  | 1351 | + */
 | 
		
	
		
			
			|  | 1352 | +static size_t arbel_fill_rc_send_wqe ( struct ib_device *ibdev,
 | 
		
	
		
			
			|  | 1353 | +				       struct ib_queue_pair *qp __unused,
 | 
		
	
		
			
			|  | 1354 | +				       struct ib_address_vector *av __unused,
 | 
		
	
		
			
			|  | 1355 | +				       struct io_buffer *iobuf,
 | 
		
	
		
			
			|  | 1356 | +				       union arbel_send_wqe *wqe ) {
 | 
		
	
		
			
			|  | 1357 | +	struct arbel *arbel = ib_get_drvdata ( ibdev );
 | 
		
	
		
			
			|  | 1358 | +
 | 
		
	
		
			
			|  | 1359 | +	/* Construct this work queue entry */
 | 
		
	
		
			
			|  | 1360 | +	MLX_FILL_1 ( &wqe->rc.ctrl, 0, always1, 1 );
 | 
		
	
		
			
			|  | 1361 | +	MLX_FILL_1 ( &wqe->rc.data[0], 0, byte_count, iob_len ( iobuf ) );
 | 
		
	
		
			
			|  | 1362 | +	MLX_FILL_1 ( &wqe->rc.data[0], 1, l_key, arbel->lkey );
 | 
		
	
		
			
			|  | 1363 | +	MLX_FILL_H ( &wqe->rc.data[0], 2,
 | 
		
	
		
			
			|  | 1364 | +		     local_address_h, virt_to_bus ( iobuf->data ) );
 | 
		
	
		
			
			|  | 1365 | +	MLX_FILL_1 ( &wqe->rc.data[0], 3,
 | 
		
	
		
			
			|  | 1366 | +		     local_address_l, virt_to_bus ( iobuf->data ) );
 | 
		
	
		
			
			|  | 1367 | +
 | 
		
	
		
			
			|  | 1368 | +	return ( offsetof ( typeof ( wqe->rc ), data[1] ) >> 4 );
 | 
		
	
		
			
			|  | 1369 | +}
 | 
		
	
		
			
			|  | 1370 | +
 | 
		
	
		
			
			| 1291 | 1371 |  /** Work queue entry constructors */
 | 
		
	
		
			
			| 1292 | 1372 |  static size_t
 | 
		
	
		
			
			| 1293 | 1373 |  ( * arbel_fill_send_wqe[] ) ( struct ib_device *ibdev,
 | 
		
	
	
		
			
			|  | @@ -1298,6 +1378,7 @@ static size_t
 | 
		
	
		
			
			| 1298 | 1378 |  	[IB_QPT_SMI] = arbel_fill_mlx_send_wqe,
 | 
		
	
		
			
			| 1299 | 1379 |  	[IB_QPT_GSI] = arbel_fill_mlx_send_wqe,
 | 
		
	
		
			
			| 1300 | 1380 |  	[IB_QPT_UD] = arbel_fill_ud_send_wqe,
 | 
		
	
		
			
			|  | 1381 | +	[IB_QPT_RC] = arbel_fill_rc_send_wqe,
 | 
		
	
		
			
			| 1301 | 1382 |  };
 | 
		
	
		
			
			| 1302 | 1383 |  
 | 
		
	
		
			
			| 1303 | 1384 |  /**
 | 
		
	
	
		
			
			|  | @@ -1495,6 +1576,7 @@ static int arbel_complete ( struct ib_device *ibdev,
 | 
		
	
		
			
			| 1495 | 1576 |  			    sizeof ( arbel_recv_wq->wqe[0] ) );
 | 
		
	
		
			
			| 1496 | 1577 |  		assert ( wqe_idx < qp->recv.num_wqes );
 | 
		
	
		
			
			| 1497 | 1578 |  	}
 | 
		
	
		
			
			|  | 1579 | +
 | 
		
	
		
			
			| 1498 | 1580 |  	DBGCP ( arbel, "Arbel %p CQN %#lx QPN %#lx %s WQE %#lx completed:\n",
 | 
		
	
		
			
			| 1499 | 1581 |  		arbel, cq->cqn, qp->qpn, ( is_send ? "send" : "recv" ),
 | 
		
	
		
			
			| 1500 | 1582 |  		wqe_idx );
 | 
		
	
	
		
			
			|  | @@ -1542,6 +1624,9 @@ static int arbel_complete ( struct ib_device *ibdev,
 | 
		
	
		
			
			| 1542 | 1624 |  			av->gid_present = MLX_GET ( &cqe->normal, g );
 | 
		
	
		
			
			| 1543 | 1625 |  			memcpy ( &av->gid, &grh->sgid, sizeof ( av->gid ) );
 | 
		
	
		
			
			| 1544 | 1626 |  			break;
 | 
		
	
		
			
			|  | 1627 | +		case IB_QPT_RC:
 | 
		
	
		
			
			|  | 1628 | +			av = &qp->av;
 | 
		
	
		
			
			|  | 1629 | +			break;
 | 
		
	
		
			
			| 1545 | 1630 |  		default:
 | 
		
	
		
			
			| 1546 | 1631 |  			assert ( 0 );
 | 
		
	
		
			
			| 1547 | 1632 |  			return -EINVAL;
 | 
		
	
	
		
			
			|  | @@ -2297,7 +2382,8 @@ static int arbel_alloc_icm ( struct arbel *arbel,
 | 
		
	
		
			
			| 2297 | 2382 |  	log_num_eqs = fls ( arbel->limits.reserved_eqs + ARBEL_MAX_EQS - 1 );
 | 
		
	
		
			
			| 2298 | 2383 |  	log_num_mtts = fls ( arbel->limits.reserved_mtts - 1 );
 | 
		
	
		
			
			| 2299 | 2384 |  	log_num_mpts = fls ( arbel->limits.reserved_mrws + 1 - 1 );
 | 
		
	
		
			
			| 2300 |  | -	log_num_rdbs = fls ( arbel->limits.reserved_rdbs - 1 );
 | 
		
	
		
			
			|  | 2385 | +	log_num_rdbs = fls ( arbel->limits.reserved_rdbs +
 | 
		
	
		
			
			|  | 2386 | +			     ARBEL_RSVD_SPECIAL_QPS + ARBEL_MAX_QPS - 1 );
 | 
		
	
		
			
			| 2301 | 2387 |  	log_num_uars = fls ( arbel->limits.reserved_uars +
 | 
		
	
		
			
			| 2302 | 2388 |  			     1 /* single UAR used */ - 1 );
 | 
		
	
		
			
			| 2303 | 2389 |  	log_num_mcs = ARBEL_LOG_MULTICAST_HASH_SIZE;
 | 
		
	
	
		
			
			|  | @@ -2614,13 +2700,18 @@ static int arbel_setup_mpt ( struct arbel *arbel ) {
 | 
		
	
		
			
			| 2614 | 2700 |  
 | 
		
	
		
			
			| 2615 | 2701 |  	/* Initialise memory protection table */
 | 
		
	
		
			
			| 2616 | 2702 |  	memset ( &mpt, 0, sizeof ( mpt ) );
 | 
		
	
		
			
			| 2617 |  | -	MLX_FILL_4 ( &mpt, 0,
 | 
		
	
		
			
			| 2618 |  | -		     r_w, 1,
 | 
		
	
		
			
			| 2619 |  | -		     pa, 1,
 | 
		
	
		
			
			|  | 2703 | +	MLX_FILL_7 ( &mpt, 0,
 | 
		
	
		
			
			|  | 2704 | +		     a, 1,
 | 
		
	
		
			
			|  | 2705 | +		     rw, 1,
 | 
		
	
		
			
			|  | 2706 | +		     rr, 1,
 | 
		
	
		
			
			|  | 2707 | +		     lw, 1,
 | 
		
	
		
			
			| 2620 | 2708 |  		     lr, 1,
 | 
		
	
		
			
			| 2621 |  | -		     lw, 1 );
 | 
		
	
		
			
			|  | 2709 | +		     pa, 1,
 | 
		
	
		
			
			|  | 2710 | +		     r_w, 1 );
 | 
		
	
		
			
			| 2622 | 2711 |  	MLX_FILL_1 ( &mpt, 2, mem_key, key );
 | 
		
	
		
			
			| 2623 |  | -	MLX_FILL_1 ( &mpt, 3, pd, ARBEL_GLOBAL_PD );
 | 
		
	
		
			
			|  | 2712 | +	MLX_FILL_2 ( &mpt, 3,
 | 
		
	
		
			
			|  | 2713 | +		     pd, ARBEL_GLOBAL_PD,
 | 
		
	
		
			
			|  | 2714 | +		     rae, 1 );
 | 
		
	
		
			
			| 2624 | 2715 |  	MLX_FILL_1 ( &mpt, 6, reg_wnd_len_h, 0xffffffffUL );
 | 
		
	
		
			
			| 2625 | 2716 |  	MLX_FILL_1 ( &mpt, 7, reg_wnd_len_l, 0xffffffffUL );
 | 
		
	
		
			
			| 2626 | 2717 |  	if ( ( rc = arbel_cmd_sw2hw_mpt ( arbel, arbel->limits.reserved_mrws,
 | 
		
	
	
		
			
			|  | @@ -2751,6 +2842,8 @@ static int arbel_probe ( struct pci_device *pci ) {
 | 
		
	
		
			
			| 2751 | 2842 |  	/* Set up memory protection */
 | 
		
	
		
			
			| 2752 | 2843 |  	if ( ( rc = arbel_setup_mpt ( arbel ) ) != 0 )
 | 
		
	
		
			
			| 2753 | 2844 |  		goto err_setup_mpt;
 | 
		
	
		
			
			|  | 2845 | +	for ( i = 0 ; i < ARBEL_NUM_PORTS ; i++ )
 | 
		
	
		
			
			|  | 2846 | +		arbel->ibdev[i]->rdma_key = arbel->lkey;
 | 
		
	
		
			
			| 2754 | 2847 |  
 | 
		
	
		
			
			| 2755 | 2848 |  	/* Set up event queue */
 | 
		
	
		
			
			| 2756 | 2849 |  	if ( ( rc = arbel_create_eq ( arbel ) ) != 0 )
 |