Hello. I'm not quite sure what the issue is. Is the packet sending? If it's sending, just leave it alone -- the RTL8139 (or at least QEMU's emulation of it) is a little iffy.
If it's not sending: Are you receiving the Tx OK interrupt? Use QEMU with '-net dump,file=netdump.wcap' -- open the file in Wireshark or any other competent packet sniffer.
Also:
What? This might be why your code is failing.
Look at the datasheet/programmer's guide.
Only bits 0 - 12 (13 bits) are the packet's size. Everything above that is for something else, so (size << 16) is setting a bunch wrong bits in the wrong place.
Next -- don't use your uint8_t* data variable directly. The card /needs/ a physical address below 4GB and possibly has some kind of alignment need -- passing any old pointer and writing that to the card is not going to cut it.
Finally, don't poll the IO port directly. Have your interrupt handler set a flag, then loop based on that flag.