Browse Source

arbel_post_send() has been observed to transmit a packet!

tags/v0.9.3
Michael Brown 17 years ago
parent
commit
970951666f

+ 12
- 0
src/drivers/net/mlx_ipoib/ib_mt25218.c View File

1122
 	struct send_doorbell_st dbell;
1122
 	struct send_doorbell_st dbell;
1123
 	__u32 nds;
1123
 	__u32 nds;
1124
 
1124
 
1125
+	DBG ( "Work queue entry:\n" );
1126
+	DBG_HD ( snd_wqe, sizeof ( *snd_wqe ) );
1127
+
1125
 	qp->post_send_counter++;
1128
 	qp->post_send_counter++;
1126
 
1129
 
1127
 	WRITE_WORD_VOL(qp->send_uar_context, 2, htons(qp->post_send_counter));
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
 	memset(&dbell, 0, sizeof dbell);
1134
 	memset(&dbell, 0, sizeof dbell);
1130
 	INS_FLD(XDEV_NOPCODE_SEND, &dbell, arbelprm_send_doorbell_st, nopcode);
1135
 	INS_FLD(XDEV_NOPCODE_SEND, &dbell, arbelprm_send_doorbell_st, nopcode);
1148
 		INS_FLD_TO_BE(XDEV_NOPCODE_SEND,
1153
 		INS_FLD_TO_BE(XDEV_NOPCODE_SEND,
1149
 			      &qp->last_posted_snd_wqe->next.next,
1154
 			      &qp->last_posted_snd_wqe->next.next,
1150
 			      arbelprm_wqe_segment_next_st, nopcode);
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
 	rc = cmd_post_doorbell(&dbell, POST_SND_OFFSET);
1162
 	rc = cmd_post_doorbell(&dbell, POST_SND_OFFSET);
1965
 	address = (unsigned long)(memfree_pci_dev.uar) + offset;
1974
 	address = (unsigned long)(memfree_pci_dev.uar) + offset;
1966
 	tprintf("va=0x%lx pa=0x%lx", address,
1975
 	tprintf("va=0x%lx pa=0x%lx", address,
1967
 		virt_to_bus((const void *)address));
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
 	writel(htonl(ptr[0]), memfree_pci_dev.uar + offset);
1980
 	writel(htonl(ptr[0]), memfree_pci_dev.uar + offset);
1969
 	barrier();
1981
 	barrier();
1970
 	address += 4;
1982
 	address += 4;

+ 40
- 20
src/drivers/net/mlx_ipoib/mt25218.c View File

115
 			     struct ib_queue_pair *qp );
115
 			     struct ib_queue_pair *qp );
116
 
116
 
117
 static struct io_buffer *tx_ring[NUM_IPOIB_SND_WQES];
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
 static int mlx_transmit_direct ( struct net_device *netdev,
120
 static int mlx_transmit_direct ( struct net_device *netdev,
121
 				 struct io_buffer *iobuf ) {
121
 				 struct io_buffer *iobuf ) {
128
 	};
128
 	};
129
 	struct arbel_send_work_queue arbel_send_queue = {
129
 	struct arbel_send_work_queue arbel_send_queue = {
130
 		.doorbell_idx = IPOIB_SND_QP_DB_IDX,
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
 	struct ib_device ibdev = {
133
 	struct ib_device ibdev = {
134
 		.priv = &arbel,
134
 		.priv = &arbel,
137
 		.qpn = ib_get_qpn ( mlx->ipoib_qph ),
137
 		.qpn = ib_get_qpn ( mlx->ipoib_qph ),
138
 		.send = {
138
 		.send = {
139
 			.num_wqes = NUM_IPOIB_SND_WQES,
139
 			.num_wqes = NUM_IPOIB_SND_WQES,
140
-			.posted = tx_posted,
140
+			.next_idx = next_tx_idx,
141
 			.iobufs = tx_ring,
141
 			.iobufs = tx_ring,
142
 			.priv = &arbel_send_queue,
142
 			.priv = &arbel_send_queue,
143
 		},
143
 		},
156
 
156
 
157
 	rc = arbel_post_send ( &ibdev, iobuf, &av, &qp );
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
 	return rc;
161
 	return rc;
162
 }
162
 }
286
 static struct net_device_operations mlx_operations = {
286
 static struct net_device_operations mlx_operations = {
287
 	.open		= mlx_open,
287
 	.open		= mlx_open,
288
 	.close		= mlx_close,
288
 	.close		= mlx_close,
289
+#if 0
290
+	.transmit	= mlx_transmit,
291
+#else
289
 	.transmit	= mlx_transmit_direct,
292
 	.transmit	= mlx_transmit_direct,
293
+#endif
290
 	.poll		= mlx_poll,
294
 	.poll		= mlx_poll,
291
 	.irq		= mlx_irq,
295
 	.irq		= mlx_irq,
292
 };
296
 };
301
 				  unsigned int offset ) {
305
 				  unsigned int offset ) {
302
 	uint32_t *db_reg_dword = db_reg;
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
 	barrier();
312
 	barrier();
305
 	writel ( db_reg_dword[0], ( arbel->uar + offset + 0 ) );
313
 	writel ( db_reg_dword[0], ( arbel->uar + offset + 0 ) );
306
 	barrier();
314
 	barrier();
314
 	struct ib_work_queue *wq = &qp->send;
322
 	struct ib_work_queue *wq = &qp->send;
315
 	struct arbel_send_work_queue *arbel_wq = wq->priv;
323
 	struct arbel_send_work_queue *arbel_wq = wq->priv;
316
 	unsigned int wqe_idx_mask = ( wq->num_wqes - 1 );
324
 	unsigned int wqe_idx_mask = ( wq->num_wqes - 1 );
317
-	unsigned int prev_wqe_idx;
318
-	unsigned int wqe_idx;
319
 	struct ud_send_wqe_st *prev_wqe;
325
 	struct ud_send_wqe_st *prev_wqe;
320
 	struct ud_send_wqe_st *wqe;
326
 	struct ud_send_wqe_st *wqe;
321
 	struct ib_gid *gid;
327
 	struct ib_gid *gid;
324
 	struct send_doorbell_st db_reg;
330
 	struct send_doorbell_st db_reg;
325
 
331
 
326
 	/* Allocate work queue entry */
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
 		DBGC ( arbel, "ARBEL %p send queue full", arbel );
334
 		DBGC ( arbel, "ARBEL %p send queue full", arbel );
331
 		return -ENOBUFS;
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
 	/* Construct work queue entry */
341
 	/* Construct work queue entry */
342
+	MLX_POPULATE_1 ( &wqe->next.next, arbelprm_wqe_segment_next_st, 1,
343
+			 always1, 1 );
338
 	memset ( &wqe->next.control, 0,
344
 	memset ( &wqe->next.control, 0,
339
 		 sizeof ( wqe->next.control ) );
345
 		 sizeof ( wqe->next.control ) );
340
 	MLX_POPULATE_1 ( &wqe->next.control,
346
 	MLX_POPULATE_1 ( &wqe->next.control,
359
 			 destination_qp, av->dest_qp );
365
 			 destination_qp, av->dest_qp );
360
 	MLX_POPULATE_1 ( &wqe->udseg, arbelprm_wqe_segment_ud_st, 9,
366
 	MLX_POPULATE_1 ( &wqe->udseg, arbelprm_wqe_segment_ud_st, 9,
361
 			 q_key, av->qkey );
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
 	wqe->mpointer[0].byte_count = cpu_to_be32 ( iob_len ( iobuf ) );
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
 	/* Update previous work queue entry's "next" field */
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
 	MLX_MODIFY ( &prev_wqe->next.next, arbelprm_wqe_segment_next_st, 0,
384
 	MLX_MODIFY ( &prev_wqe->next.next, arbelprm_wqe_segment_next_st, 0,
370
 		     nopcode, XDEV_NOPCODE_SEND );
385
 		     nopcode, XDEV_NOPCODE_SEND );
371
 	MLX_POPULATE_3 ( &prev_wqe->next.next, arbelprm_wqe_segment_next_st, 1,
386
 	MLX_POPULATE_3 ( &prev_wqe->next.next, arbelprm_wqe_segment_next_st, 1,
373
 			 f, 1,
388
 			 f, 1,
374
 			 always1, 1 );
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
 	/* Update doorbell record */
394
 	/* Update doorbell record */
377
 	db_rec = &arbel->db_rec[arbel_wq->doorbell_idx];
395
 	db_rec = &arbel->db_rec[arbel_wq->doorbell_idx];
378
 	MLX_POPULATE_1 ( db_rec, arbelprm_qp_db_record_st, 0, 
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
 	barrier();
398
 	barrier();
399
+	DBG ( "Doorbell record:\n" );
400
+	DBG_HD ( db_rec, 8 );
381
 
401
 
382
 	/* Ring doorbell register */
402
 	/* Ring doorbell register */
383
 	MLX_POPULATE_4 ( &db_reg, arbelprm_send_doorbell_st, 0,
403
 	MLX_POPULATE_4 ( &db_reg, arbelprm_send_doorbell_st, 0,
384
 			 nopcode, XDEV_NOPCODE_SEND,
404
 			 nopcode, XDEV_NOPCODE_SEND,
385
 			 f, 1,
405
 			 f, 1,
386
-			 wqe_counter, ( prev_wqe_idx & 0xffff ),
406
+			 wqe_counter, ( wq->next_idx & 0xffff ),
387
 			 wqe_cnt, 1 );
407
 			 wqe_cnt, 1 );
388
 	MLX_POPULATE_2 ( &db_reg, arbelprm_send_doorbell_st, 1,
408
 	MLX_POPULATE_2 ( &db_reg, arbelprm_send_doorbell_st, 1,
389
 			 nds, nds,
409
 			 nds, nds,
390
 			 qpn, qp->qpn );
410
 			 qpn, qp->qpn );
391
 	arbel_ring_doorbell ( arbel, &db_reg, POST_SND_OFFSET );
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
 	return 0;
416
 	return 0;
397
 }
417
 }

+ 4
- 3
src/include/gpxe/infiniband.h View File

68
 struct ib_work_queue {
68
 struct ib_work_queue {
69
 	/** Number of work queue entries */
69
 	/** Number of work queue entries */
70
 	unsigned int num_wqes;
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
 	/** I/O buffers assigned to work queue */
77
 	/** I/O buffers assigned to work queue */
77
 	struct io_buffer **iobufs;
78
 	struct io_buffer **iobufs;
78
 	/** Driver private data */
79
 	/** Driver private data */

Loading…
Cancel
Save