Ver código fonte

arbel_post_send() has been observed to transmit a packet!

tags/v0.9.3
Michael Brown 17 anos atrás
pai
commit
970951666f

+ 12
- 0
src/drivers/net/mlx_ipoib/ib_mt25218.c Ver arquivo

@@ -1122,9 +1122,14 @@ static int post_send_req(void *qph, void *wqeh, __u8 num_gather)
1122 1122
 	struct send_doorbell_st dbell;
1123 1123
 	__u32 nds;
1124 1124
 
1125
+	DBG ( "Work queue entry:\n" );
1126
+	DBG_HD ( snd_wqe, sizeof ( *snd_wqe ) );
1127
+
1125 1128
 	qp->post_send_counter++;
1126 1129
 
1127 1130
 	WRITE_WORD_VOL(qp->send_uar_context, 2, htons(qp->post_send_counter));
1131
+	DBG ( "Doorbell record:\n" );
1132
+	DBG_HD ( qp->send_uar_context, 8 );
1128 1133
 
1129 1134
 	memset(&dbell, 0, sizeof dbell);
1130 1135
 	INS_FLD(XDEV_NOPCODE_SEND, &dbell, arbelprm_send_doorbell_st, nopcode);
@@ -1148,6 +1153,10 @@ static int post_send_req(void *qph, void *wqeh, __u8 num_gather)
1148 1153
 		INS_FLD_TO_BE(XDEV_NOPCODE_SEND,
1149 1154
 			      &qp->last_posted_snd_wqe->next.next,
1150 1155
 			      arbelprm_wqe_segment_next_st, nopcode);
1156
+
1157
+		DBG ( "Previous work queue entry's next field:\n" );
1158
+		DBG_HD ( &qp->last_posted_snd_wqe->next.next,
1159
+			 sizeof ( qp->last_posted_snd_wqe->next.next ) );
1151 1160
 	}
1152 1161
 
1153 1162
 	rc = cmd_post_doorbell(&dbell, POST_SND_OFFSET);
@@ -1965,6 +1974,9 @@ static void dev_post_dbell(void *dbell, __u32 offset)
1965 1974
 	address = (unsigned long)(memfree_pci_dev.uar) + offset;
1966 1975
 	tprintf("va=0x%lx pa=0x%lx", address,
1967 1976
 		virt_to_bus((const void *)address));
1977
+	DBG ( "dev_post_dbell %08lx:%08lx to %lx\n",
1978
+	      htonl ( ptr[0] ), htonl ( ptr[1] ),
1979
+	      virt_to_phys ( memfree_pci_dev.uar + offset ) );
1968 1980
 	writel(htonl(ptr[0]), memfree_pci_dev.uar + offset);
1969 1981
 	barrier();
1970 1982
 	address += 4;

+ 40
- 20
src/drivers/net/mlx_ipoib/mt25218.c Ver arquivo

@@ -115,7 +115,7 @@ static int arbel_post_send ( struct ib_device *ibdev, struct io_buffer *iobuf,
115 115
 			     struct ib_queue_pair *qp );
116 116
 
117 117
 static struct io_buffer *tx_ring[NUM_IPOIB_SND_WQES];
118
-static int tx_posted = 0;
118
+static int next_tx_idx = 0;
119 119
 
120 120
 static int mlx_transmit_direct ( struct net_device *netdev,
121 121
 				 struct io_buffer *iobuf ) {
@@ -128,7 +128,7 @@ static int mlx_transmit_direct ( struct net_device *netdev,
128 128
 	};
129 129
 	struct arbel_send_work_queue arbel_send_queue = {
130 130
 		.doorbell_idx = IPOIB_SND_QP_DB_IDX,
131
-		.wqe_u = ( (struct udqp_st *) ipoib_data.ipoib_qph )->snd_wq,
131
+		.wqe_u = ( (struct udqp_st *) mlx->ipoib_qph )->snd_wq,
132 132
 	};
133 133
 	struct ib_device ibdev = {
134 134
 		.priv = &arbel,
@@ -137,7 +137,7 @@ static int mlx_transmit_direct ( struct net_device *netdev,
137 137
 		.qpn = ib_get_qpn ( mlx->ipoib_qph ),
138 138
 		.send = {
139 139
 			.num_wqes = NUM_IPOIB_SND_WQES,
140
-			.posted = tx_posted,
140
+			.next_idx = next_tx_idx,
141 141
 			.iobufs = tx_ring,
142 142
 			.priv = &arbel_send_queue,
143 143
 		},
@@ -156,7 +156,7 @@ static int mlx_transmit_direct ( struct net_device *netdev,
156 156
 
157 157
 	rc = arbel_post_send ( &ibdev, iobuf, &av, &qp );
158 158
 
159
-	tx_posted = qp.send.posted;
159
+	next_tx_idx = qp.send.next_idx;
160 160
 
161 161
 	return rc;
162 162
 }
@@ -286,7 +286,11 @@ static void mlx_irq ( struct net_device *netdev, int enable ) {
286 286
 static struct net_device_operations mlx_operations = {
287 287
 	.open		= mlx_open,
288 288
 	.close		= mlx_close,
289
+#if 0
290
+	.transmit	= mlx_transmit,
291
+#else
289 292
 	.transmit	= mlx_transmit_direct,
293
+#endif
290 294
 	.poll		= mlx_poll,
291 295
 	.irq		= mlx_irq,
292 296
 };
@@ -301,6 +305,10 @@ static void arbel_ring_doorbell ( struct arbel *arbel, void *db_reg,
301 305
 				  unsigned int offset ) {
302 306
 	uint32_t *db_reg_dword = db_reg;
303 307
 
308
+	DBG ( "arbel_ring_doorbell %08lx:%08lx to %lx\n",
309
+	      db_reg_dword[0], db_reg_dword[1],
310
+	      virt_to_phys ( arbel->uar + offset ) );
311
+
304 312
 	barrier();
305 313
 	writel ( db_reg_dword[0], ( arbel->uar + offset + 0 ) );
306 314
 	barrier();
@@ -314,8 +322,6 @@ static int arbel_post_send ( struct ib_device *ibdev, struct io_buffer *iobuf,
314 322
 	struct ib_work_queue *wq = &qp->send;
315 323
 	struct arbel_send_work_queue *arbel_wq = wq->priv;
316 324
 	unsigned int wqe_idx_mask = ( wq->num_wqes - 1 );
317
-	unsigned int prev_wqe_idx;
318
-	unsigned int wqe_idx;
319 325
 	struct ud_send_wqe_st *prev_wqe;
320 326
 	struct ud_send_wqe_st *wqe;
321 327
 	struct ib_gid *gid;
@@ -324,17 +330,17 @@ static int arbel_post_send ( struct ib_device *ibdev, struct io_buffer *iobuf,
324 330
 	struct send_doorbell_st db_reg;
325 331
 
326 332
 	/* Allocate work queue entry */
327
-	prev_wqe_idx = wq->posted;
328
-	wqe_idx = ( prev_wqe_idx + 1 );
329
-	if ( wq->iobufs[wqe_idx & wqe_idx_mask] ) {
333
+	if ( wq->iobufs[wq->next_idx & wqe_idx_mask] ) {
330 334
 		DBGC ( arbel, "ARBEL %p send queue full", arbel );
331 335
 		return -ENOBUFS;
332 336
 	}
333
-	wq->iobufs[wqe_idx & wqe_idx_mask] = iobuf;
334
-	prev_wqe = &arbel_wq->wqe_u[prev_wqe_idx & wqe_idx_mask].wqe_cont.wqe;
335
-	wqe = &arbel_wq->wqe_u[wqe_idx & wqe_idx_mask].wqe_cont.wqe;
337
+	wq->iobufs[wq->next_idx & wqe_idx_mask] = iobuf;
338
+	prev_wqe = &arbel_wq->wqe_u[(wq->next_idx - 1) & wqe_idx_mask].wqe_cont.wqe;
339
+	wqe = &arbel_wq->wqe_u[wq->next_idx & wqe_idx_mask].wqe_cont.wqe;
336 340
 
337 341
 	/* Construct work queue entry */
342
+	MLX_POPULATE_1 ( &wqe->next.next, arbelprm_wqe_segment_next_st, 1,
343
+			 always1, 1 );
338 344
 	memset ( &wqe->next.control, 0,
339 345
 		 sizeof ( wqe->next.control ) );
340 346
 	MLX_POPULATE_1 ( &wqe->next.control,
@@ -359,13 +365,22 @@ static int arbel_post_send ( struct ib_device *ibdev, struct io_buffer *iobuf,
359 365
 			 destination_qp, av->dest_qp );
360 366
 	MLX_POPULATE_1 ( &wqe->udseg, arbelprm_wqe_segment_ud_st, 9,
361 367
 			 q_key, av->qkey );
362
-	wqe->mpointer[0].local_addr_l =
363
-		cpu_to_be32 ( virt_to_bus ( iobuf->data ) );
368
+
369
+	//	wqe->mpointer[0].local_addr_l =
370
+	//	cpu_to_be32 ( virt_to_bus ( iobuf->data ) );
371
+
372
+	memcpy ( bus_to_virt ( be32_to_cpu ( wqe->mpointer[0].local_addr_l ) ),
373
+		 iobuf->data, iob_len ( iobuf ) );
374
+
375
+
364 376
 	wqe->mpointer[0].byte_count = cpu_to_be32 ( iob_len ( iobuf ) );
365 377
 
378
+	DBG ( "Work queue entry:\n" );
379
+	DBG_HD ( wqe, sizeof ( *wqe ) );
380
+
366 381
 	/* Update previous work queue entry's "next" field */
367
-	nds = ( offsetof ( typeof ( *wqe ), mpointer ) +
368
-		sizeof ( wqe->mpointer[0] ) );
382
+	nds = ( ( offsetof ( typeof ( *wqe ), mpointer ) +
383
+		  sizeof ( wqe->mpointer[0] ) ) >> 4 );
369 384
 	MLX_MODIFY ( &prev_wqe->next.next, arbelprm_wqe_segment_next_st, 0,
370 385
 		     nopcode, XDEV_NOPCODE_SEND );
371 386
 	MLX_POPULATE_3 ( &prev_wqe->next.next, arbelprm_wqe_segment_next_st, 1,
@@ -373,25 +388,30 @@ static int arbel_post_send ( struct ib_device *ibdev, struct io_buffer *iobuf,
373 388
 			 f, 1,
374 389
 			 always1, 1 );
375 390
 
391
+	DBG ( "Previous work queue entry's next field:\n" );
392
+	DBG_HD ( &prev_wqe->next.next, sizeof ( prev_wqe->next.next ) );
393
+
376 394
 	/* Update doorbell record */
377 395
 	db_rec = &arbel->db_rec[arbel_wq->doorbell_idx];
378 396
 	MLX_POPULATE_1 ( db_rec, arbelprm_qp_db_record_st, 0, 
379
-			 counter, ( wqe_idx & 0xffff ) );
397
+			 counter, ( ( wq->next_idx + 1 ) & 0xffff ) );
380 398
 	barrier();
399
+	DBG ( "Doorbell record:\n" );
400
+	DBG_HD ( db_rec, 8 );
381 401
 
382 402
 	/* Ring doorbell register */
383 403
 	MLX_POPULATE_4 ( &db_reg, arbelprm_send_doorbell_st, 0,
384 404
 			 nopcode, XDEV_NOPCODE_SEND,
385 405
 			 f, 1,
386
-			 wqe_counter, ( prev_wqe_idx & 0xffff ),
406
+			 wqe_counter, ( wq->next_idx & 0xffff ),
387 407
 			 wqe_cnt, 1 );
388 408
 	MLX_POPULATE_2 ( &db_reg, arbelprm_send_doorbell_st, 1,
389 409
 			 nds, nds,
390 410
 			 qpn, qp->qpn );
391 411
 	arbel_ring_doorbell ( arbel, &db_reg, POST_SND_OFFSET );
392 412
 
393
-	/* Update work queue's posted index */
394
-	wq->posted = wqe_idx;
413
+	/* Update work queue's index */
414
+	wq->next_idx++;
395 415
 
396 416
 	return 0;
397 417
 }

+ 4
- 3
src/include/gpxe/infiniband.h Ver arquivo

@@ -68,11 +68,12 @@ struct ibhdr {
68 68
 struct ib_work_queue {
69 69
 	/** Number of work queue entries */
70 70
 	unsigned int num_wqes;
71
-	/** Posted index
71
+	/** Next work queue entry index
72 72
 	 *
73
-	 * This is the index of the most recently posted entry.
73
+	 * This is the index of the next entry to be filled (i.e. the
74
+	 * first empty entry).
74 75
 	 */
75
-	unsigned int posted;
76
+	unsigned int next_idx;
76 77
 	/** I/O buffers assigned to work queue */
77 78
 	struct io_buffer **iobufs;
78 79
 	/** Driver private data */

Carregando…
Cancelar
Salvar