Some other things to think about when comparing to the intel code in FreeBSD/Linux:
igb_read_phy_reg_gs40g/igb_write_phy_reg_gs40g clearing of GS40G_CS_POWER_DOW to power up phy i210 specific part of igb_has_link() igb_acquire_swfw_sync_i210/igb_release_swfw_sync_i210 igb_init_nvm_params_i210/igb_get_flash_presence_i210 etc The phy seems to be a marvell one instead of the intel? one used in the 82580/i350, ie compare the callbacks case I82580_I_PHY_ID: case I350_I_PHY_ID: phy->type = e1000_phy_82580; phy->ops.force_speed_duplex = igb_phy_force_speed_duplex_82580; phy->ops.get_cable_length = igb_get_cable_length_82580; phy->ops.get_phy_info = igb_get_phy_info_82580; phy->ops.set_d0_lplu_state = igb_set_d0_lplu_state_82580; phy->ops.set_d3_lplu_state = igb_set_d3_lplu_state_82580; break; case I210_I_PHY_ID: phy->type = e1000_phy_i210; phy->ops.check_polarity = igb_check_polarity_m88; phy->ops.get_phy_info = igb_get_phy_info_m88; phy->ops.get_cable_length = igb_get_cable_length_m88_gen2; phy->ops.set_d0_lplu_state = igb_set_d0_lplu_state_82580; phy->ops.set_d3_lplu_state = igb_set_d3_lplu_state_82580; phy->ops.force_speed_duplex = igb_phy_force_speed_duplex_m88; A new phy type should be added rather than using em_phy_82580. And if you want to look at offloading with the legacy descriptor format on the 75+ server adapters it seems the first descriptor has to be used rather than the last. See http://mail-index.netbsd.org/source-changes/2012/08/29/msg036938.html for a writeup.