wouldn't a good strategy be to use programmed I/O (non-DMA) to write the non-data items such as when opening a socket with a given protocol and setting the destination address, then for transferring a large (say, more than 100 bytes) amount of data to go into the transmitted packet (IP case), use DMA. Conversely, when a packet arrives, there's an interrupt and one can decide on use DMA yes/no based on how much data is in the on-chip buffer?
In the FreeRTOS driver I did for the 5100 chip, I had no option for DMA. I had a tricky time doing the loop to SPI-transfer of 1000+ bytes in or out, with interrupts enabled because data can arrive on a different socket and cause an interrupt while the non-interrupt level loop was running.