Hi Vladimir, Thanks for the comment. On Wed, 2022-05-04 at 23:07 +0300, Vladimir Oltean wrote: > EXTERNAL EMAIL: Do not click links or open attachments unless you > know the content is safe > > On Wed, May 04, 2022 at 08:47:49PM +0530, Arun Ramadoss wrote: > > This patch add the SPI driver for the LAN937x switches. It uses the > > lan937x_main.c and lan937x_dev.c functions. > > > > Signed-off-by: Arun Ramadoss <arun.ramadoss@xxxxxxxxxxxxx> > > --- > > drivers/net/dsa/microchip/Makefile | 1 + > > drivers/net/dsa/microchip/ksz_common.h | 1 + > > drivers/net/dsa/microchip/lan937x_dev.c | 7 + > > drivers/net/dsa/microchip/lan937x_spi.c | 236 > > ++++++++++++++++++++++++ > > 4 files changed, 245 insertions(+) > > create mode 100644 drivers/net/dsa/microchip/lan937x_spi.c > > > > diff --git a/drivers/net/dsa/microchip/Makefile > > b/drivers/net/dsa/microchip/Makefile > > index d32ff38dc240..28d8eb62a795 100644 > > --- a/drivers/net/dsa/microchip/Makefile > > +++ b/drivers/net/dsa/microchip/Makefile > > @@ -10,3 +10,4 @@ obj-$(CONFIG_NET_DSA_MICROCHIP_KSZ8863_SMI) += > > ksz8863_smi.o > > obj-$(CONFIG_NET_DSA_MICROCHIP_LAN937X) += lan937x.o > > lan937x-objs := lan937x_dev.o > > lan937x-objs += lan937x_main.o > > +lan937x-objs += lan937x_spi.o > > diff --git a/drivers/net/dsa/microchip/ksz_common.h > > b/drivers/net/dsa/microchip/ksz_common.h > > index 5671f580948d..fd9e0705d2d2 100644 > > --- a/drivers/net/dsa/microchip/ksz_common.h > > +++ b/drivers/net/dsa/microchip/ksz_common.h > > @@ -151,6 +151,7 @@ void ksz_switch_remove(struct ksz_device *dev); > > int ksz8_switch_register(struct ksz_device *dev); > > int ksz9477_switch_register(struct ksz_device *dev); > > int lan937x_switch_register(struct ksz_device *dev); > > +int lan937x_check_device_id(struct ksz_device *dev); > > > > void ksz_update_port_member(struct ksz_device *dev, int port); > > void ksz_init_mib_timer(struct ksz_device *dev); > > diff --git a/drivers/net/dsa/microchip/lan937x_dev.c > > b/drivers/net/dsa/microchip/lan937x_dev.c > > index 3f1797cc1d16..f430a8711775 100644 > > --- a/drivers/net/dsa/microchip/lan937x_dev.c > > +++ b/drivers/net/dsa/microchip/lan937x_dev.c > > @@ -386,8 +386,15 @@ static int lan937x_mdio_register(struct > > ksz_device *dev) > > > > static int lan937x_switch_init(struct ksz_device *dev) > > { > > + int ret; > > + > > dev->ds->ops = &lan937x_switch_ops; > > > > + /* Check device tree */ > > + ret = lan937x_check_device_id(dev); > > + if (ret < 0) > > + return ret; > > + > > Can't this be called from lan937x_spi_probe() directly, why do you > need > to go through lan937x_switch_register() first? lan937x_check_device_id function compares the dev->chip_id with the lan937x_switch_chip array and populate the some of the parameters of struct ksz_dev. The dev->chip_id is populated using the dev->dev_ops- >detect in the ksz_switch_register function. If lan937x_check_device_id needs to be called in spi_probe, then chip_id has to be identified as part of spi_probe function. Since ksz_switch_register handles the identifying the chip_id, checking the device_id is part of switch_init. if (dev->dev_ops->detect(dev)) return -EINVAL; ret = dev->dev_ops->init(dev); if (ret) return ret; As per the comment, enable_spi_indirect_access function called twice https://lore.kernel.org/netdev/20220408232557.b62l3lksotq5vuvm@skbuf/ I have removed the enable_spi_indirect_access in the lan937x_setup function in v13 patch 6. But it actually failed our regression. The SPI indirect is required for accessing the Internal phy registers. We have enabled it in lan937x_init before registering the mdio_register. We need it for reading the phy id. And another place enabled in lan937x_setup after lan937x_switch_reset function. When I removed enabling in setup function, switch_reset disables the spi indirecting addressing. Because of that further phy register r/w fails. In Summary, we need to enable spi indirect access in both the places, one for mdio_register and another after switch_reset. Can I enable it both the places? Kindly suggest. > > > dev->port_mask = (1 << dev->port_cnt) - 1; > > > > dev->ports = devm_kzalloc(dev->dev,