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.