The new ability added to the driver to use mii_bus to handle MII related
ioctls is causing compile issues when the driver is compiled into the
kernel (i.e. not a module).

The simple solution of requiring the driver to be compiled as a module when
MDIO_BUS is a module, causes a recursion Kconfig issue due to IPSec
dependencies.

So created another Kconfig option for ixgbe, to enable mdio_bus support for
DSA devices.  This solution solves the problem when the ixgbe driver is
compiled into the kernel and MDIO_BUS is compiled as a module.  In this
case, the IXGBE_MDIO option is disabled and the code is not compiled
into the driver.

CC: Dave Jones <da...@codemonkey.org.uk>
CC: Steve Douthit <steph...@silicom-usa.com>
CC: Florian Fainelli <f.faine...@gmail.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirs...@intel.com>
---
 drivers/net/ethernet/intel/Kconfig            | 11 ++++++++++-
 drivers/net/ethernet/intel/ixgbe/ixgbe.h      |  4 ++++
 drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 12 ++++++++++--
 drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c  |  4 ++++
 drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h  |  3 ++-
 5 files changed, 30 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/intel/Kconfig 
b/drivers/net/ethernet/intel/Kconfig
index 31fb76ee9d82..35317ecdd0c3 100644
--- a/drivers/net/ethernet/intel/Kconfig
+++ b/drivers/net/ethernet/intel/Kconfig
@@ -159,7 +159,6 @@ config IXGBE
        tristate "Intel(R) 10GbE PCI Express adapters support"
        depends on PCI
        select MDIO
-       select MDIO_DEVICE
        imply PTP_1588_CLOCK
        ---help---
          This driver supports Intel(R) 10GbE PCI Express family of
@@ -210,6 +209,16 @@ config IXGBE_IPSEC
        ---help---
          Enable support for IPSec offload in ixgbe.ko
 
+config IXGBE_MDIO
+       bool "MDIO Support for DSA devices"
+       default n
+       depends on IXGBE && MDIO_BUS && !(IXGBE=y && MDIO_BUS=m)
+       ---help---
+         Say Y here if you want MDIO_BUS support for DSA devices in the
+         driver.
+
+         If unsure, say N.
+
 config IXGBEVF
        tristate "Intel(R) 10GbE PCI Express Virtual Function Ethernet support"
        depends on PCI_MSI
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h 
b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
index 08d85e336bd4..9d7496508ee0 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
@@ -12,7 +12,9 @@
 #include <linux/aer.h>
 #include <linux/if_vlan.h>
 #include <linux/jiffies.h>
+#ifdef CONFIG_IXGBE_MDIO
 #include <linux/phy.h>
+#endif
 
 #include <linux/timecounter.h>
 #include <linux/net_tstamp.h>
@@ -562,7 +564,9 @@ struct ixgbe_adapter {
        struct net_device *netdev;
        struct bpf_prog *xdp_prog;
        struct pci_dev *pdev;
+#ifdef CONFIG_IXGBE_MDIO
        struct mii_bus *mii_bus;
+#endif
 
        unsigned long state;
 
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c 
b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index d2ce7f0bc32d..afa0337f7ba0 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -39,7 +39,9 @@
 #include "ixgbe.h"
 #include "ixgbe_common.h"
 #include "ixgbe_dcb_82599.h"
+#ifdef CONFIG_IXGBE_MDIO
 #include "ixgbe_phy.h"
+#endif
 #include "ixgbe_sriov.h"
 #include "ixgbe_model.h"
 #include "ixgbe_txrx_common.h"
@@ -8791,6 +8793,7 @@ ixgbe_mdio_read(struct net_device *netdev, int prtad, int 
devad, u16 addr)
        u16 value;
        int rc;
 
+#ifdef CONFIG_IXGBE_MDIO
        if (adapter->mii_bus) {
                int regnum = addr;
 
@@ -8799,7 +8802,7 @@ ixgbe_mdio_read(struct net_device *netdev, int prtad, int 
devad, u16 addr)
 
                return mdiobus_read(adapter->mii_bus, prtad, regnum);
        }
-
+#endif
        if (prtad != hw->phy.mdio.prtad)
                return -EINVAL;
        rc = hw->phy.ops.read_reg(hw, addr, devad, &value);
@@ -8814,6 +8817,7 @@ static int ixgbe_mdio_write(struct net_device *netdev, 
int prtad, int devad,
        struct ixgbe_adapter *adapter = netdev_priv(netdev);
        struct ixgbe_hw *hw = &adapter->hw;
 
+#ifdef CONFIG_IXGBE_MDIO
        if (adapter->mii_bus) {
                int regnum = addr;
 
@@ -8822,7 +8826,7 @@ static int ixgbe_mdio_write(struct net_device *netdev, 
int prtad, int devad,
 
                return mdiobus_write(adapter->mii_bus, prtad, regnum, value);
        }
-
+#endif
        if (prtad != hw->phy.mdio.prtad)
                return -EINVAL;
        return hw->phy.ops.write_reg(hw, addr, devad, value);
@@ -11141,7 +11145,9 @@ static int ixgbe_probe(struct pci_dev *pdev, const 
struct pci_device_id *ent)
                        IXGBE_LINK_SPEED_10GB_FULL | IXGBE_LINK_SPEED_1GB_FULL,
                        true);
 
+#ifdef CONFIG_IXGBE_MDIO
        ixgbe_mii_bus_init(hw);
+#endif
 
        return 0;
 
@@ -11193,8 +11199,10 @@ static void ixgbe_remove(struct pci_dev *pdev)
        set_bit(__IXGBE_REMOVING, &adapter->state);
        cancel_work_sync(&adapter->service_task);
 
+#ifdef CONFIG_IXGBE_MDIO
        if (adapter->mii_bus)
                mdiobus_unregister(adapter->mii_bus);
+#endif
 
 #ifdef CONFIG_IXGBE_DCA
        if (adapter->flags & IXGBE_FLAG_DCA_ENABLED) {
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c 
b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c
index cc4907f9ff02..05da21920863 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c
@@ -3,7 +3,9 @@
 
 #include <linux/pci.h>
 #include <linux/delay.h>
+#ifdef CONFIG_IXGBE_MDIO
 #include <linux/iopoll.h>
+#endif
 #include <linux/sched.h>
 
 #include "ixgbe.h"
@@ -659,6 +661,7 @@ s32 ixgbe_write_phy_reg_generic(struct ixgbe_hw *hw, u32 
reg_addr,
        return status;
 }
 
+#ifdef CONFIG_IXGBE_MDIO
 #define IXGBE_HW_READ_REG(addr) IXGBE_READ_REG(hw, addr)
 
 /**
@@ -956,6 +959,7 @@ s32 ixgbe_mii_bus_init(struct ixgbe_hw *hw)
        adapter->mii_bus = NULL;
        return -ENODEV;
 }
+#endif
 
 /**
  *  ixgbe_setup_phy_link_generic - Set and restart autoneg
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h 
b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h
index 214b01085718..88b851178d7e 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h
@@ -120,8 +120,9 @@
 /* SFP+ SFF-8472 Compliance code */
 #define IXGBE_SFF_SFF_8472_UNSUP      0x00
 
+#ifdef CONFIG_IXGBE_MDIO
 s32 ixgbe_mii_bus_init(struct ixgbe_hw *hw);
-
+#endif
 s32 ixgbe_identify_phy_generic(struct ixgbe_hw *hw);
 s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw);
 s32 ixgbe_read_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
-- 
2.20.1

Reply via email to