On 1/3/19 4:35 PM, Jeff Kirsher wrote: > 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.
This is also useful for accessing the entire clause 22/45 address space, which may be worth a mention in the help text. > + 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, > Just tested this against a DSA dev in hardware and it works, but I still think the simpler solution would be to just select PHYLIB: diff --git a/drivers/net/ethernet/intel/Kconfig b/drivers/net/ethernet/intel/Kconfig index 31fb76ee9d82..a1246e89aad4 100644 --- a/drivers/net/ethernet/intel/Kconfig +++ b/drivers/net/ethernet/intel/Kconfig @@ -159,7 +159,7 @@ config IXGBE tristate "Intel(R) 10GbE PCI Express adapters support" depends on PCI select MDIO - select MDIO_DEVICE + select PHYLIB imply PTP_1588_CLOCK ---help--- This driver supports Intel(R) 10GbE PCI Express family of That seems to be the pattern for most of the other ethernet adapters: $ grep -r 'select PHYLIB' drivers/net/ethernet/ | wc -l 71 vs checking MDIO_BUS (not counting this patch): $ grep -r 'depends on.*MDIO_BUS' drivers/net/ethernet/ | wc -l 0 AFAICT in the Kconfig language a || between two dependency expressions returns the max() of the two expr where (n, m, y) = (0, 1, 2). So in the case of multiple drivers selecting the same symbol if any are built-in then the selected symbol must also be built-in. This has held true for the little bit of poking around I've done via menuconfig, but I'm definitely not a Kconfig expert. In any case you can have my: Tested-by: Stephen Douthit <steph...@silicom-usa.com>