Try to use a separate descriptor for the "next" argument in alt_avalon_sgdma_construct_mem_to_stream_desc.
Maybe something like
alt_avalon_sgdma_construct_mem_to_stream_desc(
(alt_sgdma_descriptor *) desc, // descriptor I want to work with
((alt_sgdma_descriptor *) desc)+1,// pointer to "next"
(alt_u32 *)ActualData, // starting read address
(length), //# bytes
1, // don't read from constant address
1, // generate sop
1, // generate endofpacket signal
0); // atlantic channel (don't know/don't care: set to 0)
I'm not sure about what happens if you make the descriptor point to itself as "next".
If that's not it, I don't have any other idea... I never had this problem with the SGDMA.