Take the dame codes of one ethernet chip which PCI based as example: ./drivers/net/pci-skeleton.c. Maybe this code is old style of ethernet driver, but it's userful for study.
The packet receive flow: netdrv_rx_interrupt() --> allocate/replace sk_buff --> call netif_rx() passing the packet/sk_buff received to upper stack layer;
The packet send flow: netdrv_start_xmit();
The device init flow: one can start from init_module();
The common functions can be found in ./net/core/dev.c, such as netif_rx...;