Diff below allows ix(4) to support 1Gb LX SFP in its SFP+ port. It is
https://github.com/torvalds/linux/commit/345be204dcbb2cc7580a63bc377a185125a6f822.patch
ported to our driver. Small changes to the 3rd hunk of the ixgbe_phy.c
patch as we don't have the "enforce_sfp" flag that Linux has.

Goes from this:

ix1 at pci1 dev 0 function 1 "Intel 82599" rev 0x01: Unsupported SFP+ Module

to a working interface, albeit with wrong media flag in ifconfig:

# ifconfig ix1
ix1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        lladdr 00:1b:21:c0:25:bd
        priority: 0
        groups: egress
        media: Ethernet autoselect (1000baseT full-duplex,rxpause,txpause)
        status: active
        inet 192.168.42.216 netmask 0xffffff00 broadcast 192.168.42.255

OK?


Index: if_bnx.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_bnx.c,v
retrieving revision 1.110
diff -u -p -r1.110 if_bnx.c
--- if_bnx.c    10 Mar 2015 15:28:48 -0000      1.110
+++ if_bnx.c    30 Apr 2015 11:54:29 -0000
@@ -4085,7 +4085,7 @@ bnx_init_rx_chain(struct bnx_softc *sc)
                rxbd->rx_bd_haddr_lo = addr;
        }
 
-       if_rxr_init(&sc->rx_ring, 2, sc->max_rx_bd);
+       if_rxr_init(&sc->rx_ring, 16, sc->max_rx_bd);
 
        /* Fill up the RX chain. */
        bnx_fill_rx_chain(sc);
Index: ixgbe_82599.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/ixgbe_82599.c,v
retrieving revision 1.10
diff -u -p -r1.10 ixgbe_82599.c
--- ixgbe_82599.c       5 Aug 2013 19:58:06 -0000       1.10
+++ ixgbe_82599.c       30 Apr 2015 11:54:29 -0000
@@ -372,6 +372,8 @@ int32_t ixgbe_get_link_capabilities_8259
        /* Check if 1G SFP module. */
        if (hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0 ||
            hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1 ||
+           hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core0 ||
+           hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core1 ||
            hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 ||
            hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1) {
                *speed = IXGBE_LINK_SPEED_1GB_FULL;
Index: ixgbe_phy.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/ixgbe_phy.c,v
retrieving revision 1.12
diff -u -p -r1.12 ixgbe_phy.c
--- ixgbe_phy.c 25 Aug 2014 14:26:25 -0000      1.12
+++ ixgbe_phy.c 30 Apr 2015 11:54:29 -0000
@@ -1112,6 +1112,13 @@ int32_t ixgbe_identify_sfp_module_generi
                                else
                                        hw->phy.sfp_type =
                                                ixgbe_sfp_type_1g_sx_core1;
+                       } else if (comp_codes_1g & IXGBE_SFF_1GBASELX_CAPABLE) {
+                               if (hw->bus.lan_id == 0)
+                                       hw->phy.sfp_type =
+                                               ixgbe_sfp_type_1g_lx_core0;
+                               else
+                                       hw->phy.sfp_type =
+                                               ixgbe_sfp_type_1g_lx_core1;
                        } else {
                                hw->phy.sfp_type = ixgbe_sfp_type_unknown;
                        }
@@ -1199,6 +1206,8 @@ int32_t ixgbe_identify_sfp_module_generi
                if (comp_codes_10g == 0 &&
                    !(hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1 ||
                      hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0 ||
+                     hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core0 ||
+                     hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core1 ||
                      hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 ||
                      hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1)) {
                        hw->phy.type = ixgbe_phy_sfp_unsupported;
@@ -1258,12 +1267,16 @@ int32_t ixgbe_get_sfp_init_sequence_offs
         * SR modules
         */
        if (sfp_type == ixgbe_sfp_type_da_act_lmt_core0 ||
+           sfp_type == ixgbe_sfp_type_1g_lx_core0 ||
            sfp_type == ixgbe_sfp_type_1g_cu_core0 ||
-           sfp_type == ixgbe_sfp_type_1g_sx_core0)
+           sfp_type == ixgbe_sfp_type_1g_sx_core0 ||
+           sfp_type == ixgbe_sfp_type_1g_lx_core0)
                sfp_type = ixgbe_sfp_type_srlr_core0;
        else if (sfp_type == ixgbe_sfp_type_da_act_lmt_core1 ||
+                sfp_type == ixgbe_sfp_type_1g_lx_core1 ||
                 sfp_type == ixgbe_sfp_type_1g_cu_core1 ||
-                sfp_type == ixgbe_sfp_type_1g_sx_core1)
+                sfp_type == ixgbe_sfp_type_1g_sx_core1 ||
+                sfp_type == ixgbe_sfp_type_1g_lx_core1)
                sfp_type = ixgbe_sfp_type_srlr_core1;
 
        /* Read offset to PHY init contents */
Index: ixgbe_type.h
===================================================================
RCS file: /cvs/src/sys/dev/pci/ixgbe_type.h,v
retrieving revision 1.20
diff -u -p -r1.20 ixgbe_type.h
--- ixgbe_type.h        25 Aug 2014 14:26:25 -0000      1.20
+++ ixgbe_type.h        30 Apr 2015 11:54:29 -0000
@@ -2798,6 +2798,8 @@ enum ixgbe_sfp_type {
        ixgbe_sfp_type_1g_cu_core1 = 10,
        ixgbe_sfp_type_1g_sx_core0 = 11,
        ixgbe_sfp_type_1g_sx_core1 = 12,
+       ixgbe_sfp_type_1g_lx_core0 = 13,
+       ixgbe_sfp_type_1g_lx_core1 = 14,
        ixgbe_sfp_type_not_present = 0xFFFE,
        ixgbe_sfp_type_unknown = 0xFFFF
 };

Reply via email to