mirror-linux/drivers/net/dsa
Christian Marangi ec60222356 net: dsa: qca8k: fix wrong length value for mgmt eth packet
commit 9807ae6974 upstream.

The assumption that Documentation was right about how this value work was
wrong. It was discovered that the length value of the mgmt header is in
step of word size.

As an example to process 4 byte of data the correct length to set is 2.
To process 8 byte 4, 12 byte 6, 16 byte 8...

Odd values will always return the next size on the ack packet.
(length of 3 (6 byte) will always return 8 bytes of data)

This means that a value of 15 (0xf) actually means reading/writing 32 bytes
of data instead of 16 bytes. This behaviour is totally absent and not
documented in the switch Documentation.

In fact from Documentation the max value that mgmt eth can process is
16 byte of data while in reality it can process 32 bytes at once.

To handle this we always round up the length after deviding it for word
size. We check if the result is odd and we round another time to align
to what the switch will provide in the ack packet.
The workaround for the length limit of 15 is still needed as the length
reg max value is 0xf(15)

Reported-by: Ronald Wahl <ronald.wahl@raritan.com>
Tested-by: Ronald Wahl <ronald.wahl@raritan.com>
Fixes: 90386223f4 ("net: dsa: qca8k: add support for larger read/write size with mgmt Ethernet")
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
Cc: stable@vger.kernel.org # v5.18+
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2023-01-12 12:02:47 +01:00
..
b53 net: dsa: b53: remove unnecessary set_drvdata() 2022-09-22 19:30:34 -07:00
hirschmann net: dsa: hellcreek: Offload per-tc max SDU from tc-taprio 2022-09-29 18:52:06 -07:00
microchip net: dsa: microchip: remove IRQF_TRIGGER_FALLING in request_threaded_irq 2022-12-31 13:32:56 +01:00
mv88e6xxx net: dsa: mv88e6xxx: depend on PTP conditionally 2023-01-12 12:02:02 +01:00
ocelot net: dsa: felix: offload per-tc max SDU from tc-taprio 2022-09-29 18:52:05 -07:00
qca net: dsa: qca8k: fix wrong length value for mgmt eth packet 2023-01-12 12:02:47 +01:00
realtek net: dsa: realtek: remove unnecessary set_drvdata() 2022-09-22 19:30:39 -07:00
sja1105 net: dsa: sja1105: avoid out of bounds access in sja1105_init_l2_policing() 2022-12-08 09:38:31 -08:00
xrs700x * 'remove' callback converted to return void. Big change with trivial 2022-10-04 18:54:33 -07:00
Kconfig net: dsa: LAN9303: Add basic support for LAN9354 2022-09-07 11:06:04 +01:00
Makefile net: dsa: qca8k: move driver to qca dir 2022-07-15 11:57:13 +01:00
bcm_sf2.c net: dsa: bcm_sf2: remove unnecessary platform_set_drvdata() 2022-09-22 19:30:35 -07:00
bcm_sf2.h net: dsa: bcm_sf2: refactor LED regs access 2021-12-30 17:28:32 -08:00
bcm_sf2_cfp.c net: dsa: introduce dsa_port_get_master() 2022-09-20 10:32:35 +02:00
bcm_sf2_regs.h net: dsa: bcm_sf2: refactor LED regs access 2021-12-30 17:28:32 -08:00
dsa_loop.c net: dsa: Fix possible memory leaks in dsa_loop_init() 2022-10-28 10:32:59 +01:00
dsa_loop.h
dsa_loop_bdinfo.c
lan9303-core.c net: lan9303: Fix read error execution path 2022-12-31 13:32:28 +01:00
lan9303.h
lan9303_i2c.c * 'remove' callback converted to return void. Big change with trivial 2022-10-04 18:54:33 -07:00
lan9303_mdio.c net: dsa: lan9303: remove unnecessary dev_set_drvdata() 2022-09-22 19:30:36 -07:00
lantiq_gswip.c net: dsa: lantiq_gswip: remove unnecessary platform_set_drvdata() 2022-09-22 19:30:36 -07:00
lantiq_pce.h
mt7530.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2022-09-29 14:30:51 -07:00
mt7530.h net: dsa: mt7530: add support for in-band link status 2022-09-23 11:58:37 +01:00
mv88e6060.c net: dsa: mv88e6060: remove unnecessary dev_set_drvdata() 2022-09-22 19:30:37 -07:00
mv88e6060.h
rzn1_a5psw.c net: dsa: rzn1-a5psw: remove unnecessary platform_set_drvdata() 2022-09-22 19:30:39 -07:00
rzn1_a5psw.h net: dsa: rzn1-a5psw: add FDB support 2022-06-27 11:37:55 +01:00
vitesse-vsc73xx-core.c net: dsa: vsc73xxx: Get rid of duplicate of_node assignment 2021-12-03 14:13:02 +00:00
vitesse-vsc73xx-platform.c net: dsa: vitesse-vsc73xx: remove unnecessary set_drvdata() 2022-09-22 19:30:39 -07:00
vitesse-vsc73xx-spi.c net: dsa: vitesse-vsc73xx: remove unnecessary set_drvdata() 2022-09-22 19:30:39 -07:00
vitesse-vsc73xx.h net: dsa: vsc73xxx: Make vsc73xx_remove() return void 2021-11-15 13:15:07 +00:00