mbox series

[net-next,v2,0/9] net: dsa: microchip: add support for phylink mac config and link up

Message ID 20220724092823.24567-1-arun.ramadoss@microchip.com (mailing list archive)
Headers show
Series net: dsa: microchip: add support for phylink mac config and link up | expand

Message

Arun Ramadoss July 24, 2022, 9:28 a.m. UTC
This patch series add support common phylink mac config and link up for the ksz
series switches. At present, ksz8795 and ksz9477 doesn't implement the phylink
mac config and link up. It configures the mac interface in the port setup hook.
ksz8830 series switch does not mac link configuration. For lan937x switches, in
the part support patch series has support only for MII and RMII configuration.
Some group of switches have some register address and bit fields common and
others are different. So, this patch aims to have common phylink implementation
which configures the register based on the chip id.

Changes in v2
- combined the modification of duplex, tx_pause and rx_pause into single
  function.

Changes in v1
- Squash the reading rgmii value from dt to patch which apply the rgmii value
- Created the new function ksz_port_set_xmii_speed
- Seperated the namespace values for xmii_ctrl_0 and xmii_ctrl_1 register
- Applied the rgmii delay value based on the rx/tx-internal-delay-ps

Arun Ramadoss (9):
  net: dsa: microchip: add common gigabit set and get function
  net: dsa: microchip: add common ksz port xmii speed selection function
  net: dsa: microchip: add common duplex and flow control function
  net: dsa: microchip: add support for common phylink mac link up
  net: dsa: microchip: lan937x: add support for configuing xMII register
  net: dsa: microchip: apply rgmii tx and rx delay in phylink mac config
  net: dsa: microchip: ksz9477: use common xmii function
  net: dsa: microchip: ksz8795: use common xmii function
  net: dsa: microchip: add support for phylink mac config

 drivers/net/dsa/microchip/ksz8795.c      |  40 ---
 drivers/net/dsa/microchip/ksz8795_reg.h  |   8 -
 drivers/net/dsa/microchip/ksz9477.c      | 183 +------------
 drivers/net/dsa/microchip/ksz9477_reg.h  |  24 --
 drivers/net/dsa/microchip/ksz_common.c   | 312 ++++++++++++++++++++++-
 drivers/net/dsa/microchip/ksz_common.h   |  54 ++++
 drivers/net/dsa/microchip/lan937x.h      |   8 +-
 drivers/net/dsa/microchip/lan937x_main.c | 125 +++------
 drivers/net/dsa/microchip/lan937x_reg.h  |  32 ++-
 9 files changed, 431 insertions(+), 355 deletions(-)


base-commit: 502c6f8cedcce7889ccdefeb88ce36b39acd522f

Comments

Vladimir Oltean July 24, 2022, 9:54 p.m. UTC | #1
On Sun, Jul 24, 2022 at 02:58:14PM +0530, Arun Ramadoss wrote:
> This patch series add support common phylink mac config and link up for the ksz
> series switches. At present, ksz8795 and ksz9477 doesn't implement the phylink
> mac config and link up. It configures the mac interface in the port setup hook.
> ksz8830 series switch does not mac link configuration. For lan937x switches, in
> the part support patch series has support only for MII and RMII configuration.
> Some group of switches have some register address and bit fields common and
> others are different. So, this patch aims to have common phylink implementation
> which configures the register based on the chip id.

I don't see something problematic with this patch set.

Reviewed-by: Vladimir Oltean <olteanv@gmail.com>

> 
> Changes in v2
> - combined the modification of duplex, tx_pause and rx_pause into single
>   function.
> 
> Changes in v1
> - Squash the reading rgmii value from dt to patch which apply the rgmii value
> - Created the new function ksz_port_set_xmii_speed
> - Seperated the namespace values for xmii_ctrl_0 and xmii_ctrl_1 register
> - Applied the rgmii delay value based on the rx/tx-internal-delay-ps
> 
> Arun Ramadoss (9):
>   net: dsa: microchip: add common gigabit set and get function
>   net: dsa: microchip: add common ksz port xmii speed selection function
>   net: dsa: microchip: add common duplex and flow control function
>   net: dsa: microchip: add support for common phylink mac link up
>   net: dsa: microchip: lan937x: add support for configuing xMII register
>   net: dsa: microchip: apply rgmii tx and rx delay in phylink mac config
>   net: dsa: microchip: ksz9477: use common xmii function
>   net: dsa: microchip: ksz8795: use common xmii function
>   net: dsa: microchip: add support for phylink mac config
> 
>  drivers/net/dsa/microchip/ksz8795.c      |  40 ---
>  drivers/net/dsa/microchip/ksz8795_reg.h  |   8 -
>  drivers/net/dsa/microchip/ksz9477.c      | 183 +------------
>  drivers/net/dsa/microchip/ksz9477_reg.h  |  24 --
>  drivers/net/dsa/microchip/ksz_common.c   | 312 ++++++++++++++++++++++-
>  drivers/net/dsa/microchip/ksz_common.h   |  54 ++++
>  drivers/net/dsa/microchip/lan937x.h      |   8 +-
>  drivers/net/dsa/microchip/lan937x_main.c | 125 +++------
>  drivers/net/dsa/microchip/lan937x_reg.h  |  32 ++-
>  9 files changed, 431 insertions(+), 355 deletions(-)
> 
> 
> base-commit: 502c6f8cedcce7889ccdefeb88ce36b39acd522f
> -- 
> 2.36.1
>
patchwork-bot+netdevbpf@kernel.org July 27, 2022, 8:50 a.m. UTC | #2
Hello:

This series was applied to netdev/net-next.git (master)
by David S. Miller <davem@davemloft.net>:

On Sun, 24 Jul 2022 14:58:14 +0530 you wrote:
> This patch series add support common phylink mac config and link up for the ksz
> series switches. At present, ksz8795 and ksz9477 doesn't implement the phylink
> mac config and link up. It configures the mac interface in the port setup hook.
> ksz8830 series switch does not mac link configuration. For lan937x switches, in
> the part support patch series has support only for MII and RMII configuration.
> Some group of switches have some register address and bit fields common and
> others are different. So, this patch aims to have common phylink implementation
> which configures the register based on the chip id.
> 
> [...]

Here is the summary with links:
  - [net-next,v2,1/9] net: dsa: microchip: add common gigabit set and get function
    https://git.kernel.org/netdev/net-next/c/46f80fa8981b
  - [net-next,v2,2/9] net: dsa: microchip: add common ksz port xmii speed selection function
    https://git.kernel.org/netdev/net-next/c/aa5b8b73d4bd
  - [net-next,v2,3/9] net: dsa: microchip: add common duplex and flow control function
    https://git.kernel.org/netdev/net-next/c/8560664fd32a
  - [net-next,v2,4/9] net: dsa: microchip: add support for common phylink mac link up
    https://git.kernel.org/netdev/net-next/c/da8cd08520f3
  - [net-next,v2,5/9] net: dsa: microchip: lan937x: add support for configuing xMII register
    https://git.kernel.org/netdev/net-next/c/dc1c596edba5
  - [net-next,v2,6/9] net: dsa: microchip: apply rgmii tx and rx delay in phylink mac config
    https://git.kernel.org/netdev/net-next/c/b19ac41faa3f
  - [net-next,v2,7/9] net: dsa: microchip: ksz9477: use common xmii function
    https://git.kernel.org/netdev/net-next/c/0ab7f6bf1675
  - [net-next,v2,8/9] net: dsa: microchip: ksz8795: use common xmii function
    https://git.kernel.org/netdev/net-next/c/c476bede4b0f
  - [net-next,v2,9/9] net: dsa: microchip: add support for phylink mac config
    https://git.kernel.org/netdev/net-next/c/f3d890f5f90e

You are awesome, thank you!
Oleksij Rempel Aug. 30, 2022, 6:55 a.m. UTC | #3
Hi Arun,

starting with this patch set I have following regression on ksz8873
switch. Can you please take a look at it:
 8<--- cut here ---
 Unable to handle kernel NULL pointer dereference at virtual address 00000005
 ksz8863-switch gpio-0:00: nonfatal error -34 setting MTU to 1500 on port 0
...
 Modules linked in:                                          
 CPU: 0 PID: 16 Comm: kworker/0:1 Not tainted 6.0.0-rc2-00436-g3da285df1324 #74
 Hardware name: Freescale i.MX6 Quad/DualLite (Device Tree)
 Workqueue: events_power_efficient phylink_resolve
 PC is at ksz_set_gbit+0x5c/0xa4
 LR is at arch_atomic_cmpxchg_relaxed+0x1c/0x38
....
 Backtrace: 
  ksz_set_gbit from ksz_phylink_mac_link_up+0x15c/0x1c8
  ksz_phylink_mac_link_up from dsa_port_phylink_mac_link_up+0x7c/0x80
  dsa_port_phylink_mac_link_up from phylink_resolve+0x304/0x3d0
  phylink_resolve from process_one_work+0x214/0x31c
  process_one_work from worker_thread+0x254/0x2d4
  worker_thread from kthread+0xfc/0x108
  kthread from ret_from_fork+0x14/0x2c
...
 ksz8863-switch gpio-0:00 lan2 (uninitialized): PHY [dsa-0.0:01] driver [Micrel KSZ8851 Ethernet MAC or KSZ886X Switch] (irq=POLL)
 ksz8863-switch gpio-0:00: nonfatal error -34 setting MTU to 1500 on port 1
 device eth0 entered promiscuous mode
 DSA: tree 0 setup
 ---[ end trace 0000000000000000 ]---

Regards,
Oleksij

On Sun, Jul 24, 2022 at 02:58:14PM +0530, Arun Ramadoss wrote:
> This patch series add support common phylink mac config and link up for the ksz
> series switches. At present, ksz8795 and ksz9477 doesn't implement the phylink
> mac config and link up. It configures the mac interface in the port setup hook.
> ksz8830 series switch does not mac link configuration. For lan937x switches, in
> the part support patch series has support only for MII and RMII configuration.
> Some group of switches have some register address and bit fields common and
> others are different. So, this patch aims to have common phylink implementation
> which configures the register based on the chip id.

> Changes in v2
> - combined the modification of duplex, tx_pause and rx_pause into single
>   function.
> 
> Changes in v1
> - Squash the reading rgmii value from dt to patch which apply the rgmii value
> - Created the new function ksz_port_set_xmii_speed
> - Seperated the namespace values for xmii_ctrl_0 and xmii_ctrl_1 register
> - Applied the rgmii delay value based on the rx/tx-internal-delay-ps
> 
> Arun Ramadoss (9):
>   net: dsa: microchip: add common gigabit set and get function
>   net: dsa: microchip: add common ksz port xmii speed selection function
>   net: dsa: microchip: add common duplex and flow control function
>   net: dsa: microchip: add support for common phylink mac link up
>   net: dsa: microchip: lan937x: add support for configuing xMII register
>   net: dsa: microchip: apply rgmii tx and rx delay in phylink mac config
>   net: dsa: microchip: ksz9477: use common xmii function
>   net: dsa: microchip: ksz8795: use common xmii function
>   net: dsa: microchip: add support for phylink mac config
> 
>  drivers/net/dsa/microchip/ksz8795.c      |  40 ---
>  drivers/net/dsa/microchip/ksz8795_reg.h  |   8 -
>  drivers/net/dsa/microchip/ksz9477.c      | 183 +------------
>  drivers/net/dsa/microchip/ksz9477_reg.h  |  24 --
>  drivers/net/dsa/microchip/ksz_common.c   | 312 ++++++++++++++++++++++-
>  drivers/net/dsa/microchip/ksz_common.h   |  54 ++++
>  drivers/net/dsa/microchip/lan937x.h      |   8 +-
>  drivers/net/dsa/microchip/lan937x_main.c | 125 +++------
>  drivers/net/dsa/microchip/lan937x_reg.h  |  32 ++-
>  9 files changed, 431 insertions(+), 355 deletions(-)
> 
> 
> base-commit: 502c6f8cedcce7889ccdefeb88ce36b39acd522f
> -- 
> 2.36.1
>
Arun Ramadoss Aug. 30, 2022, 8:15 a.m. UTC | #4
Hi Oleksij,
Is this Bug related to fix in 
https://lore.kernel.org/lkml/20220829105810.577903823@linuxfoundation.org/
. 
It is observed in ksz8794 switch. I think after applying this bug fix
patch it should work. I don't have ksz8 series to test. I ran the
regression only for ksz9 series switches. 


On Tue, 2022-08-30 at 08:55 +0200, Oleksij Rempel wrote:
> EXTERNAL EMAIL: Do not click links or open attachments unless you
> know the content is safe
> 
> Hi Arun,
> 
> starting with this patch set I have following regression on ksz8873
> switch. Can you please take a look at it:
>  8<--- cut here ---
>  Unable to handle kernel NULL pointer dereference at virtual address
> 00000005
>  ksz8863-switch gpio-0:00: nonfatal error -34 setting MTU to 1500 on
> port 0
> ...
>  Modules linked in:
>  CPU: 0 PID: 16 Comm: kworker/0:1 Not tainted 6.0.0-rc2-00436-
> g3da285df1324 #74
>  Hardware name: Freescale i.MX6 Quad/DualLite (Device Tree)
>  Workqueue: events_power_efficient phylink_resolve
>  PC is at ksz_set_gbit+0x5c/0xa4
>  LR is at arch_atomic_cmpxchg_relaxed+0x1c/0x38
> ....
>  Backtrace:
>   ksz_set_gbit from ksz_phylink_mac_link_up+0x15c/0x1c8
>   ksz_phylink_mac_link_up from dsa_port_phylink_mac_link_up+0x7c/0x80
>   dsa_port_phylink_mac_link_up from phylink_resolve+0x304/0x3d0
>   phylink_resolve from process_one_work+0x214/0x31c
>   process_one_work from worker_thread+0x254/0x2d4
>   worker_thread from kthread+0xfc/0x108
>   kthread from ret_from_fork+0x14/0x2c
> ...
>  ksz8863-switch gpio-0:00 lan2 (uninitialized): PHY [dsa-0.0:01]
> driver [Micrel KSZ8851 Ethernet MAC or KSZ886X Switch] (irq=POLL)
>  ksz8863-switch gpio-0:00: nonfatal error -34 setting MTU to 1500 on
> port 1
>  device eth0 entered promiscuous mode
>  DSA: tree 0 setup
>  ---[ end trace 0000000000000000 ]---
> 
> Regards,
> Oleksij
> 
> On Sun, Jul 24, 2022 at 02:58:14PM +0530, Arun Ramadoss wrote:
> > This patch series add support common phylink mac config and link up
> > for the ksz
> > series switches. At present, ksz8795 and ksz9477 doesn't implement
> > the phylink
> > mac config and link up. It configures the mac interface in the port
> > setup hook.
> > ksz8830 series switch does not mac link configuration. For lan937x
> > switches, in
> > the part support patch series has support only for MII and RMII
> > configuration.
> > Some group of switches have some register address and bit fields
> > common and
> > others are different. So, this patch aims to have common phylink
> > implementation
> > which configures the register based on the chip id.
> > Changes in v2
> > - combined the modification of duplex, tx_pause and rx_pause into
> > single
> >   function.
> > 
> > Changes in v1
> > - Squash the reading rgmii value from dt to patch which apply the
> > rgmii value
> > - Created the new function ksz_port_set_xmii_speed
> > - Seperated the namespace values for xmii_ctrl_0 and xmii_ctrl_1
> > register
> > - Applied the rgmii delay value based on the rx/tx-internal-delay-
> > ps
> > 
> > Arun Ramadoss (9):
> >   net: dsa: microchip: add common gigabit set and get function
> >   net: dsa: microchip: add common ksz port xmii speed selection
> > function
> >   net: dsa: microchip: add common duplex and flow control function
> >   net: dsa: microchip: add support for common phylink mac link up
> >   net: dsa: microchip: lan937x: add support for configuing xMII
> > register
> >   net: dsa: microchip: apply rgmii tx and rx delay in phylink mac
> > config
> >   net: dsa: microchip: ksz9477: use common xmii function
> >   net: dsa: microchip: ksz8795: use common xmii function
> >   net: dsa: microchip: add support for phylink mac config
> > 
> >  drivers/net/dsa/microchip/ksz8795.c      |  40 ---
> >  drivers/net/dsa/microchip/ksz8795_reg.h  |   8 -
> >  drivers/net/dsa/microchip/ksz9477.c      | 183 +------------
> >  drivers/net/dsa/microchip/ksz9477_reg.h  |  24 --
> >  drivers/net/dsa/microchip/ksz_common.c   | 312
> > ++++++++++++++++++++++-
> >  drivers/net/dsa/microchip/ksz_common.h   |  54 ++++
> >  drivers/net/dsa/microchip/lan937x.h      |   8 +-
> >  drivers/net/dsa/microchip/lan937x_main.c | 125 +++------
> >  drivers/net/dsa/microchip/lan937x_reg.h  |  32 ++-
> >  9 files changed, 431 insertions(+), 355 deletions(-)
> > 
> > 
> > base-commit: 502c6f8cedcce7889ccdefeb88ce36b39acd522f
> > --
> > 2.36.1
> > 
> 
> --
> Pengutronix
> e.K.                           |                             |
> Steuerwalder Str. 21                       | 
> http://www.pengutronix.de/e/  |
> 31137 Hildesheim, Germany                  | Phone: +49-5121-206917-
> 0    |
> Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-
> 5555 |
Vladimir Oltean Aug. 30, 2022, 9:58 a.m. UTC | #5
Hello,

On Tue, Aug 30, 2022 at 08:15:59AM +0000, Arun.Ramadoss@microchip.com wrote:
> On Tue, 2022-08-30 at 08:55 +0200, Oleksij Rempel wrote:
> > Hi Arun,
> > 
> > starting with this patch set I have following regression on ksz8873
> > switch. Can you please take a look at it:
> >  8<--- cut here ---
> >  Unable to handle kernel NULL pointer dereference at virtual address 00000005
> >  ksz8863-switch gpio-0:00: nonfatal error -34 setting MTU to 1500 on port 0
> > ...
> >  Modules linked in:
> >  CPU: 0 PID: 16 Comm: kworker/0:1 Not tainted 6.0.0-rc2-00436-
> > g3da285df1324 #74
> >  Hardware name: Freescale i.MX6 Quad/DualLite (Device Tree)
> >  Workqueue: events_power_efficient phylink_resolve
> >  PC is at ksz_set_gbit+0x5c/0xa4
> >  LR is at arch_atomic_cmpxchg_relaxed+0x1c/0x38
> > ....
> >  Backtrace:
> >   ksz_set_gbit from ksz_phylink_mac_link_up+0x15c/0x1c8
> >   ksz_phylink_mac_link_up from dsa_port_phylink_mac_link_up+0x7c/0x80
> >   dsa_port_phylink_mac_link_up from phylink_resolve+0x304/0x3d0
> >   phylink_resolve from process_one_work+0x214/0x31c
> >   process_one_work from worker_thread+0x254/0x2d4
> >   worker_thread from kthread+0xfc/0x108
> >   kthread from ret_from_fork+0x14/0x2c
> > ...
> >  ksz8863-switch gpio-0:00 lan2 (uninitialized): PHY [dsa-0.0:01] driver [Micrel KSZ8851 Ethernet MAC or KSZ886X Switch] (irq=POLL)
> >  ksz8863-switch gpio-0:00: nonfatal error -34 setting MTU to 1500 on port 1
> >  device eth0 entered promiscuous mode
> >  DSA: tree 0 setup
> >  ---[ end trace 0000000000000000 ]---
> 
> Hi Oleksij,
> Is this Bug related to fix in 
> https://lore.kernel.org/lkml/20220829105810.577903823@linuxfoundation.org/
> . 
> It is observed in ksz8794 switch. I think after applying this bug fix
> patch it should work. I don't have ksz8 series to test. I ran the
> regression only for ksz9 series switches. 

I find it unlikely that the cited patch will fix a NULL pointer
dereference in ksz_get_gbit(). But rather, some pointer to a structure
is NULL, and we then dereference a member located at its offset 0x5, no?

My eyes are on this:

	const u8 *bitval = dev->info->xmii_ctrl1;

		data8 |= FIELD_PREP(P_GMII_1GBIT_M, bitval[P_GMII_NOT_1GBIT]);
							   ~~~~~~~~~~~~~~~~
							   this is coincidentally
							   also 5

See, looking at the struct ksz_chip_data[] array element for KSZ8873
that Oleksij mentions as broken, I do not see xmii_ctrl1 and xmii_ctrl2
as being pointers to anything.

	[KSZ8830] = {
		.chip_id = KSZ8830_CHIP_ID,
		.dev_name = "KSZ8863/KSZ8873",
		.num_vlans = 16,
		.num_alus = 0,
		.num_statics = 8,
		.cpu_ports = 0x4,	/* can be configured as cpu port */
		.port_cnt = 3,
		.ops = &ksz8_dev_ops,
		.mib_names = ksz88xx_mib_names,
		.mib_cnt = ARRAY_SIZE(ksz88xx_mib_names),
		.reg_mib_cnt = MIB_COUNTER_NUM,
		.regs = ksz8863_regs,
		.masks = ksz8863_masks,
		.shifts = ksz8863_shifts,
		.supports_mii = {false, false, true},
		.supports_rmii = {false, false, true},
		.internal_phy = {true, true, false},
	},

Should we point them to ksz8795_xmii_ctrl0 and ksz8795_xmii_ctrl1? I don't know.
Could you find out what these should be set to?
Oleksij Rempel Aug. 30, 2022, 4:05 p.m. UTC | #6
On Tue, Aug 30, 2022 at 12:58:30PM +0300, Vladimir Oltean wrote:
> Hello,
> 
> On Tue, Aug 30, 2022 at 08:15:59AM +0000, Arun.Ramadoss@microchip.com wrote:
...
> > Hi Oleksij,
> > Is this Bug related to fix in 
> > https://lore.kernel.org/lkml/20220829105810.577903823@linuxfoundation.org/
> > . 
> > It is observed in ksz8794 switch. I think after applying this bug fix
> > patch it should work. I don't have ksz8 series to test. I ran the
> > regression only for ksz9 series switches. 
> 
> I find it unlikely that the cited patch will fix a NULL pointer
> dereference in ksz_get_gbit(). But rather, some pointer to a structure
> is NULL, and we then dereference a member located at its offset 0x5, no?
> 
> My eyes are on this:
> 
> 	const u8 *bitval = dev->info->xmii_ctrl1;
> 
> 		data8 |= FIELD_PREP(P_GMII_1GBIT_M, bitval[P_GMII_NOT_1GBIT]);
> 							   ~~~~~~~~~~~~~~~~
> 							   this is coincidentally
> 							   also 5

ack.

> See, looking at the struct ksz_chip_data[] array element for KSZ8873
> that Oleksij mentions as broken, I do not see xmii_ctrl1 and xmii_ctrl2
> as being pointers to anything.
> 
> 	[KSZ8830] = {
> 		.chip_id = KSZ8830_CHIP_ID,
> 		.dev_name = "KSZ8863/KSZ8873",
> 		.num_vlans = 16,
> 		.num_alus = 0,
> 		.num_statics = 8,
> 		.cpu_ports = 0x4,	/* can be configured as cpu port */
> 		.port_cnt = 3,
> 		.ops = &ksz8_dev_ops,
> 		.mib_names = ksz88xx_mib_names,
> 		.mib_cnt = ARRAY_SIZE(ksz88xx_mib_names),
> 		.reg_mib_cnt = MIB_COUNTER_NUM,
> 		.regs = ksz8863_regs,
> 		.masks = ksz8863_masks,
> 		.shifts = ksz8863_shifts,
> 		.supports_mii = {false, false, true},
> 		.supports_rmii = {false, false, true},
> 		.internal_phy = {true, true, false},
> 	},
> 
> Should we point them to ksz8795_xmii_ctrl0 and ksz8795_xmii_ctrl1? I don't know.
> Could you find out what these should be set to?

xmii_ctrl0/1 are missing and it make no sense to add it.
KSZ8873 switch is controlling CPU port MII configuration over global,
not port based register.

I'll better define separate ops for this chip.

Regards,
Oleksij
Oleksij Rempel Aug. 31, 2022, 7:43 a.m. UTC | #7
On Tue, Aug 30, 2022 at 06:05:46PM +0200, Oleksij Rempel wrote:
> On Tue, Aug 30, 2022 at 12:58:30PM +0300, Vladimir Oltean wrote:
> > Hello,
> > 
> > On Tue, Aug 30, 2022 at 08:15:59AM +0000, Arun.Ramadoss@microchip.com wrote:
> ...
> > > Hi Oleksij,
> > > Is this Bug related to fix in 
> > > https://lore.kernel.org/lkml/20220829105810.577903823@linuxfoundation.org/
> > > . 
> > > It is observed in ksz8794 switch. I think after applying this bug fix
> > > patch it should work. I don't have ksz8 series to test. I ran the
> > > regression only for ksz9 series switches. 
> > 
> > I find it unlikely that the cited patch will fix a NULL pointer
> > dereference in ksz_get_gbit(). But rather, some pointer to a structure
> > is NULL, and we then dereference a member located at its offset 0x5, no?
> > 
> > My eyes are on this:
> > 
> > 	const u8 *bitval = dev->info->xmii_ctrl1;
> > 
> > 		data8 |= FIELD_PREP(P_GMII_1GBIT_M, bitval[P_GMII_NOT_1GBIT]);
> > 							   ~~~~~~~~~~~~~~~~
> > 							   this is coincidentally
> > 							   also 5
> 
> ack.
> 
> > See, looking at the struct ksz_chip_data[] array element for KSZ8873
> > that Oleksij mentions as broken, I do not see xmii_ctrl1 and xmii_ctrl2
> > as being pointers to anything.
> > 
> > 	[KSZ8830] = {
> > 		.chip_id = KSZ8830_CHIP_ID,
> > 		.dev_name = "KSZ8863/KSZ8873",
> > 		.num_vlans = 16,
> > 		.num_alus = 0,
> > 		.num_statics = 8,
> > 		.cpu_ports = 0x4,	/* can be configured as cpu port */
> > 		.port_cnt = 3,
> > 		.ops = &ksz8_dev_ops,
> > 		.mib_names = ksz88xx_mib_names,
> > 		.mib_cnt = ARRAY_SIZE(ksz88xx_mib_names),
> > 		.reg_mib_cnt = MIB_COUNTER_NUM,
> > 		.regs = ksz8863_regs,
> > 		.masks = ksz8863_masks,
> > 		.shifts = ksz8863_shifts,
> > 		.supports_mii = {false, false, true},
> > 		.supports_rmii = {false, false, true},
> > 		.internal_phy = {true, true, false},
> > 	},
> > 
> > Should we point them to ksz8795_xmii_ctrl0 and ksz8795_xmii_ctrl1? I don't know.
> > Could you find out what these should be set to?
> 
> xmii_ctrl0/1 are missing and it make no sense to add it.
> KSZ8873 switch is controlling CPU port MII configuration over global,
> not port based register.
> 
> I'll better define separate ops for this chip.

Hm, not only KSZ8830/KSZ8863/KSZ8873 are affected. ksz8795 compatible
series with defined .xmii_ctrl0/.xmii_ctrl1 are broken too. Because it
is writing to the global config register over ksz_pwrite8 function. It
means, we are writing to 0xa6 instead of 0x06. And to 0xf6 instead of
0x56.
Vladimir Oltean Aug. 31, 2022, 3:18 p.m. UTC | #8
On Wed, Aug 31, 2022 at 09:43:24AM +0200, Oleksij Rempel wrote:
> > > Should we point them to ksz8795_xmii_ctrl0 and ksz8795_xmii_ctrl1? I don't know.
> > > Could you find out what these should be set to?
> > 
> > xmii_ctrl0/1 are missing and it make no sense to add it.
> > KSZ8873 switch is controlling CPU port MII configuration over global,
> > not port based register.
> > 
> > I'll better define separate ops for this chip.
> 
> Hm, not only KSZ8830/KSZ8863/KSZ8873 are affected. ksz8795 compatible
> series with defined .xmii_ctrl0/.xmii_ctrl1 are broken too. Because it
> is writing to the global config register over ksz_pwrite8 function. It
> means, we are writing to 0xa6 instead of 0x06. And to 0xf6 instead of
> 0x56.

What do you mean by "global config register"? The Is_1Gbps bit is still
part of a port register, it's just that this particular register is only
defined for the 5th port (port #4, the only xMII port on KSZ7895 AFAIU).
That doesn't necessarily make it a "global" register.

Datasheet says:

Register 22 (0x16): Reserved
Register 38 (0x26): Reserved
Register 54 (0x36): Reserved
Register 70 (0x46): Reserved
Register 86 (0x56): Port 5 Interface Control 6

I wonder if it's ok to modify the regs table like this, because we
should then only touch P_XMII_CTRL_1 using port 4:

 static const u16 ksz8795_regs[] = {
 	[REG_IND_CTRL_0]		= 0x6E,
 	[REG_IND_DATA_8]		= 0x70,
 	[REG_IND_DATA_CHECK]		= 0x72,
 	[REG_IND_DATA_HI]		= 0x71,
 	[REG_IND_DATA_LO]		= 0x75,
 	[REG_IND_MIB_CHECK]		= 0x74,
 	[REG_IND_BYTE]			= 0xA0,
 	[P_FORCE_CTRL]			= 0x0C,
 	[P_LINK_STATUS]			= 0x0E,
 	[P_LOCAL_CTRL]			= 0x07,
 	[P_NEG_RESTART_CTRL]		= 0x0D,
 	[P_REMOTE_STATUS]		= 0x08,
 	[P_SPEED_STATUS]		= 0x09,
 	[S_TAIL_TAG_CTRL]		= 0x0C,
 	[P_STP_CTRL]			= 0x02,
 	[S_START_CTRL]			= 0x01,
 	[S_BROADCAST_CTRL]		= 0x06,
 	[S_MULTICAST_CTRL]		= 0x04,
 	[P_XMII_CTRL_0]			= 0x06,
-	[P_XMII_CTRL_1]			= 0x56,
+	[P_XMII_CTRL_1]			= 0x06,
 };

Arun, what is your proposed solution?
Oleksij Rempel Aug. 31, 2022, 4:10 p.m. UTC | #9
On Wed, Aug 31, 2022 at 06:18:59PM +0300, Vladimir Oltean wrote:
> On Wed, Aug 31, 2022 at 09:43:24AM +0200, Oleksij Rempel wrote:
> > > > Should we point them to ksz8795_xmii_ctrl0 and ksz8795_xmii_ctrl1? I don't know.
> > > > Could you find out what these should be set to?
> > > 
> > > xmii_ctrl0/1 are missing and it make no sense to add it.
> > > KSZ8873 switch is controlling CPU port MII configuration over global,
> > > not port based register.
> > > 
> > > I'll better define separate ops for this chip.
> > 
> > Hm, not only KSZ8830/KSZ8863/KSZ8873 are affected. ksz8795 compatible
> > series with defined .xmii_ctrl0/.xmii_ctrl1 are broken too. Because it
> > is writing to the global config register over ksz_pwrite8 function. It
> > means, we are writing to 0xa6 instead of 0x06. And to 0xf6 instead of
> > 0x56.
> 
> What do you mean by "global config register"? The Is_1Gbps bit is still
> part of a port register, it's just that this particular register is only
> defined for the 5th port (port #4, the only xMII port on KSZ7895 AFAIU).
> That doesn't necessarily make it a "global" register.
> 
> Datasheet says:
> 
> Register 22 (0x16): Reserved
> Register 38 (0x26): Reserved
> Register 54 (0x36): Reserved
> Register 70 (0x46): Reserved
> Register 86 (0x56): Port 5 Interface Control 6
> 
> I wonder if it's ok to modify the regs table like this, because we
> should then only touch P_XMII_CTRL_1 using port 4:
> 
>  static const u16 ksz8795_regs[] = {
>  	[REG_IND_CTRL_0]		= 0x6E,
>  	[REG_IND_DATA_8]		= 0x70,
>  	[REG_IND_DATA_CHECK]		= 0x72,
>  	[REG_IND_DATA_HI]		= 0x71,
>  	[REG_IND_DATA_LO]		= 0x75,
>  	[REG_IND_MIB_CHECK]		= 0x74,
>  	[REG_IND_BYTE]			= 0xA0,
>  	[P_FORCE_CTRL]			= 0x0C,
>  	[P_LINK_STATUS]			= 0x0E,
>  	[P_LOCAL_CTRL]			= 0x07,
>  	[P_NEG_RESTART_CTRL]		= 0x0D,
>  	[P_REMOTE_STATUS]		= 0x08,
>  	[P_SPEED_STATUS]		= 0x09,
>  	[S_TAIL_TAG_CTRL]		= 0x0C,
>  	[P_STP_CTRL]			= 0x02,
>  	[S_START_CTRL]			= 0x01,
>  	[S_BROADCAST_CTRL]		= 0x06,
>  	[S_MULTICAST_CTRL]		= 0x04,
>  	[P_XMII_CTRL_0]			= 0x06,
> -	[P_XMII_CTRL_1]			= 0x56,
> +	[P_XMII_CTRL_1]			= 0x06,
>  };
> 

Speed configuration on ksz8795 is done over two registers:
Register 86 (0x56): Port 5 Interface Control 6: Is_1Gbps - BIT(6)
and
Register 6 (0x06): Global Control 4: Switch SW5-MII/RMII Speed -BIT(4)

both are accessed on wrong offsets.

I would prefer to do following steps:
- remove everything from ksz_phylink_mac_link_up() except of
  dev->dev_ops->phylink_mac_link_up
- move ksz_duplex_flowctrl(), ksz_port_set_xmii_speed()... to ksz9477.c
  and rename them. Assign ksz9477_phylink_mac_link_up()
  dev->dev_ops->phylink_mac_link_up
- create separate function ksz8795_phylink_mac_link_up()
- use documented, not generic register names.
Arun Ramadoss Sept. 1, 2022, 8:51 a.m. UTC | #10
On Wed, 2022-08-31 at 18:10 +0200, Oleksij Rempel wrote:
> EXTERNAL EMAIL: Do not click links or open attachments unless you
> know the content is safe
> 
> On Wed, Aug 31, 2022 at 06:18:59PM +0300, Vladimir Oltean wrote:
> > On Wed, Aug 31, 2022 at 09:43:24AM +0200, Oleksij Rempel wrote:
> > > > > Should we point them to ksz8795_xmii_ctrl0 and
> > > > > ksz8795_xmii_ctrl1? I don't know.
> > > > > Could you find out what these should be set to?
> > > > 
> > > > xmii_ctrl0/1 are missing and it make no sense to add it.
> > > > KSZ8873 switch is controlling CPU port MII configuration over
> > > > global,
> > > > not port based register.
> > > > 
> > > > I'll better define separate ops for this chip.
> > > 
> > > Hm, not only KSZ8830/KSZ8863/KSZ8873 are affected. ksz8795
> > > compatible
> > > series with defined .xmii_ctrl0/.xmii_ctrl1 are broken too.
> > > Because it
> > > is writing to the global config register over ksz_pwrite8
> > > function. It
> > > means, we are writing to 0xa6 instead of 0x06. And to 0xf6
> > > instead of
> > > 0x56.
> > What do you mean by "global config register"? The Is_1Gbps bit is
> > still
> > part of a port register, it's just that this particular register is
> > only
> > defined for the 5th port (port #4, the only xMII port on KSZ7895
> > AFAIU).
> > That doesn't necessarily make it a "global" register.
> > 
> > Datasheet says:
> > 
> > Register 22 (0x16): Reserved
> > Register 38 (0x26): Reserved
> > Register 54 (0x36): Reserved
> > Register 70 (0x46): Reserved
> > Register 86 (0x56): Port 5 Interface Control 6
> > 
> > I wonder if it's ok to modify the regs table like this, because we
> > should then only touch P_XMII_CTRL_1 using port 4:
> > 
> >  static const u16 ksz8795_regs[] = {
> >       [REG_IND_CTRL_0]                = 0x6E,
> >       [REG_IND_DATA_8]                = 0x70,
> >       [REG_IND_DATA_CHECK]            = 0x72,
> >       [REG_IND_DATA_HI]               = 0x71,
> >       [REG_IND_DATA_LO]               = 0x75,
> >       [REG_IND_MIB_CHECK]             = 0x74,
> >       [REG_IND_BYTE]                  = 0xA0,
> >       [P_FORCE_CTRL]                  = 0x0C,
> >       [P_LINK_STATUS]                 = 0x0E,
> >       [P_LOCAL_CTRL]                  = 0x07,
> >       [P_NEG_RESTART_CTRL]            = 0x0D,
> >       [P_REMOTE_STATUS]               = 0x08,
> >       [P_SPEED_STATUS]                = 0x09,
> >       [S_TAIL_TAG_CTRL]               = 0x0C,
> >       [P_STP_CTRL]                    = 0x02,
> >       [S_START_CTRL]                  = 0x01,
> >       [S_BROADCAST_CTRL]              = 0x06,
> >       [S_MULTICAST_CTRL]              = 0x04,
> >       [P_XMII_CTRL_0]                 = 0x06,
> > -     [P_XMII_CTRL_1]                 = 0x56,
> > +     [P_XMII_CTRL_1]                 = 0x06,
> >  };
> > 
> 
> Speed configuration on ksz8795 is done over two registers:
> Register 86 (0x56): Port 5 Interface Control 6: Is_1Gbps - BIT(6)
> and
> Register 6 (0x06): Global Control 4: Switch SW5-MII/RMII Speed
> -BIT(4)
> 
> both are accessed on wrong offsets.
> 
> I would prefer to do following steps:
> - remove everything from ksz_phylink_mac_link_up() except of
>   dev->dev_ops->phylink_mac_link_up
> - move ksz_duplex_flowctrl(), ksz_port_set_xmii_speed()... to
> ksz9477.c
>   and rename them. Assign ksz9477_phylink_mac_link_up()
>   dev->dev_ops->phylink_mac_link_up
> - create separate function ksz8795_phylink_mac_link_up()
> - use documented, not generic register names.
> 

In the original code, the ksz8795_cpu_interface_select (which does the
xmii and speed configuration) is called only ksz87xx switch not for the
ksz88x3.
During refactoring, I intentionally did not add the P_XMII_CTRL0/1 for
the ksz88xx in the chip_data structure.
I added check that if switch belong to ksz88x3 then return in the
phylink_mac_config function but I missed to add in the
phylink_mac_link_up. Thats the mistake I have done. So, for the ksz88xx
switch code breakage, it could be fixed by adding the check in the
phylink_mac_link_up as well.

For the code breakage in ksz8795/ksz8794, the original code has only
provision for configuring xmii mode and choosing the 100/1000Mbps speed
selection which could be selected using is_1Gbps bit of
port5_interface_control6 register (0x56). But it didn't have provision
to select speed between 10/100Mbps, flow control and duplex.

As per vladimir suggestion, P_XMII_CTRL1 can be changed from 0x56 to
0x06. It fixes the problem for ksz_set_xmii, ksz_set_gbit since this is
the port based register not the global register.

The global register 0x06 responsibilities are bit 4 for 10/100mbps
speed selection, bit 5 for flow control and bit 6  for duplex
operation. Since these three are new features added during refactoring
I overlooked it. 
To fix this, either I need to return from the ksz_set_100_10mbit &
ksz_duplex_flowctrl function if the chip_id is ksz87xx or add dev-
>dev_ops for this alone. 
Kindly suggest on how to proceed.



> --
> Pengutronix
> e.K.                           |                             |
> Steuerwalder Str. 21                       | 
> http://www.pengutronix.de/e/  |
> 31137 Hildesheim, Germany                  | Phone: +49-5121-206917-
> 0    |
> Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-
> 5555 |
Oleksij Rempel Sept. 1, 2022, 11:27 a.m. UTC | #11
On Thu, Sep 01, 2022 at 08:51:44AM +0000, Arun.Ramadoss@microchip.com wrote:
> On Wed, 2022-08-31 at 18:10 +0200, Oleksij Rempel wrote:
> > EXTERNAL EMAIL: Do not click links or open attachments unless you
> > know the content is safe
> > 
> > On Wed, Aug 31, 2022 at 06:18:59PM +0300, Vladimir Oltean wrote:
> > > On Wed, Aug 31, 2022 at 09:43:24AM +0200, Oleksij Rempel wrote:
> > > > > > Should we point them to ksz8795_xmii_ctrl0 and
> > > > > > ksz8795_xmii_ctrl1? I don't know.
> > > > > > Could you find out what these should be set to?
> > > > > 
> > > > > xmii_ctrl0/1 are missing and it make no sense to add it.
> > > > > KSZ8873 switch is controlling CPU port MII configuration over
> > > > > global,
> > > > > not port based register.
> > > > > 
> > > > > I'll better define separate ops for this chip.
> > > > 
> > > > Hm, not only KSZ8830/KSZ8863/KSZ8873 are affected. ksz8795
> > > > compatible
> > > > series with defined .xmii_ctrl0/.xmii_ctrl1 are broken too.
> > > > Because it
> > > > is writing to the global config register over ksz_pwrite8
> > > > function. It
> > > > means, we are writing to 0xa6 instead of 0x06. And to 0xf6
> > > > instead of
> > > > 0x56.
> > > What do you mean by "global config register"? The Is_1Gbps bit is
> > > still
> > > part of a port register, it's just that this particular register is
> > > only
> > > defined for the 5th port (port #4, the only xMII port on KSZ7895
> > > AFAIU).
> > > That doesn't necessarily make it a "global" register.
> > > 
> > > Datasheet says:
> > > 
> > > Register 22 (0x16): Reserved
> > > Register 38 (0x26): Reserved
> > > Register 54 (0x36): Reserved
> > > Register 70 (0x46): Reserved
> > > Register 86 (0x56): Port 5 Interface Control 6
> > > 
> > > I wonder if it's ok to modify the regs table like this, because we
> > > should then only touch P_XMII_CTRL_1 using port 4:
> > > 
> > >  static const u16 ksz8795_regs[] = {
> > >       [REG_IND_CTRL_0]                = 0x6E,
> > >       [REG_IND_DATA_8]                = 0x70,
> > >       [REG_IND_DATA_CHECK]            = 0x72,
> > >       [REG_IND_DATA_HI]               = 0x71,
> > >       [REG_IND_DATA_LO]               = 0x75,
> > >       [REG_IND_MIB_CHECK]             = 0x74,
> > >       [REG_IND_BYTE]                  = 0xA0,
> > >       [P_FORCE_CTRL]                  = 0x0C,
> > >       [P_LINK_STATUS]                 = 0x0E,
> > >       [P_LOCAL_CTRL]                  = 0x07,
> > >       [P_NEG_RESTART_CTRL]            = 0x0D,
> > >       [P_REMOTE_STATUS]               = 0x08,
> > >       [P_SPEED_STATUS]                = 0x09,
> > >       [S_TAIL_TAG_CTRL]               = 0x0C,
> > >       [P_STP_CTRL]                    = 0x02,
> > >       [S_START_CTRL]                  = 0x01,
> > >       [S_BROADCAST_CTRL]              = 0x06,
> > >       [S_MULTICAST_CTRL]              = 0x04,
> > >       [P_XMII_CTRL_0]                 = 0x06,
> > > -     [P_XMII_CTRL_1]                 = 0x56,
> > > +     [P_XMII_CTRL_1]                 = 0x06,
> > >  };
> > > 
> > 
> > Speed configuration on ksz8795 is done over two registers:
> > Register 86 (0x56): Port 5 Interface Control 6: Is_1Gbps - BIT(6)
> > and
> > Register 6 (0x06): Global Control 4: Switch SW5-MII/RMII Speed
> > -BIT(4)
> > 
> > both are accessed on wrong offsets.
> > 
> > I would prefer to do following steps:
> > - remove everything from ksz_phylink_mac_link_up() except of
> >   dev->dev_ops->phylink_mac_link_up
> > - move ksz_duplex_flowctrl(), ksz_port_set_xmii_speed()... to
> > ksz9477.c
> >   and rename them. Assign ksz9477_phylink_mac_link_up()
> >   dev->dev_ops->phylink_mac_link_up
> > - create separate function ksz8795_phylink_mac_link_up()
> > - use documented, not generic register names.
> > 
> 
> In the original code, the ksz8795_cpu_interface_select (which does the
> xmii and speed configuration) is called only ksz87xx switch not for the
> ksz88x3.
> During refactoring, I intentionally did not add the P_XMII_CTRL0/1 for
> the ksz88xx in the chip_data structure.
> I added check that if switch belong to ksz88x3 then return in the
> phylink_mac_config function but I missed to add in the
> phylink_mac_link_up. Thats the mistake I have done. So, for the ksz88xx
> switch code breakage, it could be fixed by adding the check in the
> phylink_mac_link_up as well.
> 
> For the code breakage in ksz8795/ksz8794, the original code has only
> provision for configuring xmii mode and choosing the 100/1000Mbps speed
> selection which could be selected using is_1Gbps bit of
> port5_interface_control6 register (0x56). But it didn't have provision
> to select speed between 10/100Mbps, flow control and duplex.
> 
> As per vladimir suggestion, P_XMII_CTRL1 can be changed from 0x56 to
> 0x06. It fixes the problem for ksz_set_xmii, ksz_set_gbit since this is
> the port based register not the global register.
> 
> The global register 0x06 responsibilities are bit 4 for 10/100mbps
> speed selection, bit 5 for flow control and bit 6  for duplex
> operation. Since these three are new features added during refactoring
> I overlooked it. 
> To fix this, either I need to return from the ksz_set_100_10mbit &
> ksz_duplex_flowctrl function if the chip_id is ksz87xx or add dev-
> >dev_ops for this alone. 
> Kindly suggest on how to proceed.

Do not worry, every one makes mistakes ;)

I just scared how easy it is to make them in this driver. I assume, that
initially the good idea to make things more generic in this driver is
working against us. The register- and bit-mapping functionally is
already biting us:
- it is hard to review, due to different register naming schema for
  different switch families. Especially the old ones.
- we are using naming from one documentation to map to other
  documentation.
- some times we need to map some registers multiple times with different
  names: P_REMOTE_STATUS and P_LINK_STATUS

I would prefer to got ops way, to clean things up.

Regards,
Oleksij
Vladimir Oltean Sept. 1, 2022, 12:47 p.m. UTC | #12
On Thu, Sep 01, 2022 at 01:27:21PM +0200, Oleksij Rempel wrote:
> > The global register 0x06 responsibilities are bit 4 for 10/100mbps
> > speed selection, bit 5 for flow control and bit 6  for duplex
> > operation. Since these three are new features added during refactoring
> > I overlooked it. 
> > To fix this, either I need to return from the ksz_set_100_10mbit &
> > ksz_duplex_flowctrl function if the chip_id is ksz87xx or add
> > dev->dev_ops for this alone.  Kindly suggest on how to proceed.
> 
> I would prefer to got ops way, to clean things up.

I can't say that that one approach is better or worse than the other.
Indirect function calls are going to be more expensive than conditionals
on dev->chip_id, but we aren't in a fast path here, so it doesn't matter
too much.

Having indirect function calls will in theory help simplify the logic of
the main function, but will require good forethought for what constitutes
an atom of functionality, in a high enough level such as to abstract
switch differences. Whereas conditionals don't require thinking that far,
you put them where you need them.

Also, indirect function calls will move the bloat somewhere else. I have
seen complaints in the past about the mv88e6xxx driver's layered structure,
making it difficult to see exactly what gets done for a certain chip.

It is probable that we don't want to mix these styles too much within a
single driver, so if work has already started towards dev_ops for
everything, then dev_ops be it, I guess.

Oleksij, are you going to submit patches with your proposal?
Oleksij Rempel Sept. 2, 2022, 9:57 a.m. UTC | #13
Hi Vladimir,

On Thu, Sep 01, 2022 at 03:47:37PM +0300, Vladimir Oltean wrote:
> On Thu, Sep 01, 2022 at 01:27:21PM +0200, Oleksij Rempel wrote:
> > > The global register 0x06 responsibilities are bit 4 for 10/100mbps
> > > speed selection, bit 5 for flow control and bit 6  for duplex
> > > operation. Since these three are new features added during refactoring
> > > I overlooked it. 
> > > To fix this, either I need to return from the ksz_set_100_10mbit &
> > > ksz_duplex_flowctrl function if the chip_id is ksz87xx or add
> > > dev->dev_ops for this alone.  Kindly suggest on how to proceed.
> > 
> > I would prefer to got ops way, to clean things up.
> 
> I can't say that that one approach is better or worse than the other.
> Indirect function calls are going to be more expensive than conditionals
> on dev->chip_id, but we aren't in a fast path here, so it doesn't matter
> too much.
> 
> Having indirect function calls will in theory help simplify the logic of
> the main function, but will require good forethought for what constitutes
> an atom of functionality, in a high enough level such as to abstract
> switch differences. Whereas conditionals don't require thinking that far,
> you put them where you need them.
> 
> Also, indirect function calls will move the bloat somewhere else. I have
> seen complaints in the past about the mv88e6xxx driver's layered structure,
> making it difficult to see exactly what gets done for a certain chip.
> 
> It is probable that we don't want to mix these styles too much within a
> single driver, so if work has already started towards dev_ops for
> everything, then dev_ops be it, I guess.
> 
> Oleksij, are you going to submit patches with your proposal?

I have send one simple patch for net to make it work. After this
one will pop-up in then net-next i'll send other patches depending on
this patch.

Regards,
Oleksij