Revision 73a511de

b/hw/etraxfs_dma.c
401 401
	uint32_t saved_data_buf;
402 402
	unsigned char buf[2 * 1024];
403 403

  
404
	struct dma_context_metadata meta;
405
	bool send_context = true;
406

  
404 407
	if (ctrl->channels[c].eol)
405 408
		return 0;
406 409

  
407 410
	do {
411
		bool out_eop;
408 412
		D(printf("ch=%d buf=%x after=%x\n",
409 413
			 c,
410 414
			 (uint32_t)ctrl->channels[c].current_d.buf,
411 415
			 (uint32_t)ctrl->channels[c].current_d.after));
412 416

  
417
		if (send_context) {
418
			if (ctrl->channels[c].client->client.metadata_push) {
419
				meta.metadata = ctrl->channels[c].current_d.md;
420
				ctrl->channels[c].client->client.metadata_push(
421
					ctrl->channels[c].client->client.opaque,
422
					&meta);
423
			}
424
			send_context = false;
425
		}
426

  
413 427
		channel_load_d(ctrl, c);
414 428
		saved_data_buf = channel_reg(ctrl, c, RW_SAVED_DATA_BUF);
415 429
		len = (uint32_t)(unsigned long)
......
420 434
			len = sizeof buf;
421 435
		cpu_physical_memory_read (saved_data_buf, buf, len);
422 436

  
423
		D(printf("channel %d pushes %x %u bytes\n", c, 
424
			 saved_data_buf, len));
437
		out_eop = ((saved_data_buf + len) ==
438
		           ctrl->channels[c].current_d.after) &&
439
			ctrl->channels[c].current_d.out_eop;
440

  
441
		D(printf("channel %d pushes %x %u bytes eop=%u\n", c,
442
		         saved_data_buf, len, out_eop));
425 443

  
426 444
		if (ctrl->channels[c].client->client.push)
427 445
			ctrl->channels[c].client->client.push(
428 446
				ctrl->channels[c].client->client.opaque,
429
				buf, len);
447
				buf, len, out_eop);
430 448
		else
431 449
			printf("WARNING: DMA ch%d dataloss,"
432 450
			       " no attached client.\n", c);
......
437 455
				ctrl->channels[c].current_d.after) {
438 456
			/* Done. Step to next.  */
439 457
			if (ctrl->channels[c].current_d.out_eop) {
440
				/* TODO: signal eop to the client.  */
441
				D(printf("signal eop\n"));
458
				send_context = true;
442 459
			}
443 460
			if (ctrl->channels[c].current_d.intr) {
444
				/* TODO: signal eop to the client.  */
445 461
				/* data intr.  */
446 462
				D(printf("signal intr %d eol=%d\n",
447 463
					len, ctrl->channels[c].current_d.eol));
b/hw/etraxfs_dma.h
1
struct dma_context_metadata {
2
	/* data descriptor md */
3
	uint16_t metadata;
4
};
5

  
1 6
struct etraxfs_dma_client
2 7
{
3 8
	/* DMA controller. */
......
5 10
	void *ctrl;
6 11

  
7 12
	/* client.  */
8
	struct
9
	{
10
		int (*push)(void *opaque, unsigned char *buf, int len);
13
	struct {
14
		int (*push)(void *opaque, unsigned char *buf,
15
		            int len, bool eop);
11 16
		void (*pull)(void *opaque);
17
		void (*metadata_push)(void *opaque,
18
		                      const struct dma_context_metadata *md);
12 19
		void *opaque;
13 20
	} client;
14 21
};
b/hw/etraxfs_eth.c
540 540
        return size;
541 541
}
542 542

  
543
static int eth_tx_push(void *opaque, unsigned char *buf, int len)
543
static int eth_tx_push(void *opaque, unsigned char *buf, int len, bool eop)
544 544
{
545 545
	struct fs_eth *eth = opaque;
546 546

  

Also available in: Unified diff