Revision 73a511de hw/etraxfs_dma.c

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));

Also available in: Unified diff