Michael Decker: Driver Development
Week A
30 July
This is my first entry for week A. As you can see, I've decided to go hex with my week numbers. This is because I'm just that cool.
It's been a few days since my last journal entry, so let's have a quick state of the code address. Within my repository, you'll find the eepro100 branch and the skge branch.
The eepro100 is now stable according to testing by mdc and myself. This driver was converted from the Etherboot version. It was then transformed a great deal into a mostly new beast. I've identified one issue the Linux driver addresses which the gPXE driver does not - that is a rare rx-hang bug in an 82559B-based NIC. This is addressable by owners via an EEPROM update, however.
The skge is not yet stable. Testing with DOS over AoE, I haven't encountered any problems. However, mdc has found some intermittent problems with this driver with iSCSI. This driver is a stripped-down version of the Linux driver. I don't have any datasheet for this device, and haven't reproduced the error, so debugging is .. difficult.
I converted the atlx Linux driver in hopes of supporting the Attansic L2 on-board NIC on my test machine. However, it seems this driver may not fully support the L2 as of yet. I don't have an L1 to test this with, so I have abandoned this code for now. I decided to push it anyway, as someone else may find my hard work useful. Who knows, it may just work with an L1 as-is. All removed code is just commented out, so it will be easy to modify.
I have a few 3c905-based NICs to work with here. There is an existing Etherboot driver for these cards, but mdc said that driver is no good. He gave the go-ahead to convert the Linux driver for these cards, so that is next on my plate.
31 July
The 3c905 is under development. Two commits have been made. The Linux driver was added:
Transition from Linux to gPXE API is in-progress:
This is a sizable driver, and progress is slow and steady. I've already converted a Linux driver twice before, so I have a list of changes to follow. I posted these in a soc-mentors email, but I'll post them here for others to reference:
The following functions were replaced with nothing:
pci_unmap_addr_set
pci_unmap_len_set
pci_unmap_single
pci_unmap_page
pci_dma_sync_single_for_cpu
pci_dma_sync_single_for_device
netif_tx_lock_bh
netif_tx_unlock_bh
skb_padto(skb,ETH_ZLEN) (io_buffer already pads)
netif_stop_queue
netif_msg_X
netif_wake_queue
netif_queue_stopped
__netif_rx_complete
spin_lock_irqsave
spin_unlock_irqrestore
netif_napi_add
spin_lock_bh
spin_unlock_bh
napi_enable (after open() will enable polling)
spin_lock_irq
spin_unlock_irq
pci_release_regions
pci_disable_device
The following features were considered unneeded and relevant code was omitted:
wol
ethtool
tx/rx checksum offload
jumbo frames
skb fragments
power management
The following function replacements were made:
pci_alloc_consistent
malloc_dma, virt_to_phys, memset
pci_free_consistent
free_dma
pci_map_single
virt_to_phys
smp_wmb
wmb
netif_running
mostly nothing, a few netdev_link_ok
netif_receive_skb
netdev_rx
netif_carrier_off
netdev_link_down
skb_copy_from_linear_data
memcpy
netdev_alloc_skb
alloc_iob, memset
kcalloc
malloc_dma, memset
dev_kfree_skb
free_iob
kzalloc
malloc_dma, memset
This is not an all-inclusive list, as I have already made some replacements that I haven't added here. I will update the list as I have time to review the code.
Also, the skge driver was updated. Linux performs a memory clear during pci_alloc_consistent and netdev_alloc_skb, which I hadn't duplicated.
My next goal is to get the 3c59x running. This shouldn't be more than a few days of hard work if no problems are encountered.