=== Week -1: Modify JMicron driver, RX offloading === === May 2nd to May 12th === == Chanloading with undionly image == Stefanha pointed out that I should try if JMicron driver can be chanloaded like: gPXE(jme driver)->gPXE(UNDI driver). Due to the UNDI interface would trigger .irq() function of net_device_operations. First I spend a lot of time trying to figure out why chainloading with: syslinux->jme.lkrm->undionly.kpxe keeps crash(reboot) after some actions. After a few tests, I found out that: * syslinux->gPXE(jme.lkrm)->undionly.kkpxe * Vendor PXE->gPXE(jme.pxe)->undionly.kkpxe * Vendor PXE->gPXE(jme.kpxe)->undionly.kkpxe All worked fine. So I guess that it's an issue with the chainloading processes, instead of in-correct driver implement. == Implement RX checksum offloading == Testing results can be found in this note: [[soc:2010:cooldavid:notes:benchmark|TCP Window Size and RX Csum Offload Benchmark]] == Modify JMicron driver according to stefanha suggestions == - jme_process_receive() isn't using a read memory barrier. - Allocate/Free Ring buffers on open/close. - Using jme_free_?x_resources() for allocation fail recover. - Simply use struct io_buffer, instead of jme_buffer_info. - There is no need to discard pending TX buffers. - extra memset in probe. - Ring size tune, performance test. Detailed modifications can reference the [[http://git.etherboot.org/?p=people/cooldavid/gpxe.git;a=shortlog;h=refs/heads/jme_driver_bak|jme_driver_bak branch of my git tree]].