On an 82599 card, the PHY type is not known until the SFP+ module is connected. If no module is installed when the driver loads, the PHY type will be set to ixgbe_phy_none in ixgbe_identify_phy_82599(). Once it is set there, it will never be re-set, even after a cable is plugged in. SFP+ modules which require initialization won't get it.
The detection logic in ixgbe_sfp_probe() won't do anything unless the PHY type is set to ixgbe_phy_nl, so it works on 82598 cards but not on 82599 cards.
Fix: Add PHY detection logic to ixgbe_handle_mod().
Add locking to ixgbe_handle_mod() and ixgbe_handle_msf() since PHY detection sometimes fails without it.
Since mod_task will call msf_task if necessary, simplify logic in ixgbe_config_link().
Patch attached with submission follows:
How-To-Repeat: Install an 82599 card but no SFP+ module. Boot the system, then install a cable (copper or optical).
Over to maintainer(s).
Bugzilla is making it hard to tell where this applies to, but it *should* be applied to if_ix.c ... I think.
(In reply to aboyer from comment #0)
Can you take a look at the review I've put up as I had to redo the patch after ixgbe(4) got an overhaul.
A commit references this bug:
Date: Thu Jan 7 17:02:34 UTC 2016
New revision: 293334
Fixup SFP module insertion on the 82599 when insertion happens after
the system is booted and running.
Add PHY detection logic to ixgbe_handle_mod() and add locking to
ixgbe_handle_msf() as well.
Submitted by: email@example.com
MFC after: 2 weeks
Differential Revision: https://reviews.freebsd.org/D3188