summaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* Merge branch 'for-next/rockchip' into nextnextSascha Hauer13 hours28-367/+1162
|\
| * arm: boards: add wolfvision pf5 mainboardMichael Riesch7 days10-0/+201
| | | | | | | | | | | | | | | | | | Add support for the WolfVision PF5 mainboard, which features the Rockchip RK3568 SoC and can be extended with different expansion boards. Signed-off-by: Michael Riesch <michael.riesch@wolfvision.net> Link: https://lore.barebox.org/20240412-feature-wolfvision-pf5-v2-4-7e277cc8831b@wolfvision.net Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * common: add wolfvision board code libraryMichael Riesch7 days5-0/+180
| | | | | | | | | | | | | | | | Add board code library for all WolfVision boards. Signed-off-by: Michael Riesch <michael.riesch@wolfvision.net> Link: https://lore.barebox.org/20240412-feature-wolfvision-pf5-v2-3-7e277cc8831b@wolfvision.net Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * arm: dts: add common state for wolfvision boardsMichael Riesch7 days1-0/+71
| | | | | | | | | | | | | | | | | | | | | | Add a common state device tree include that features - the boot state - the MAC address envisaged for the use in all WolfVision boards. Signed-off-by: Michael Riesch <michael.riesch@wolfvision.net> Link: https://lore.barebox.org/20240412-feature-wolfvision-pf5-v2-2-7e277cc8831b@wolfvision.net Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * arm: dts: copy pf5 device tree from mainline linuxMichael Riesch7 days2-0/+665
| | | | | | | | | | | | | | | | | | | | | | | | | | The device tree for the WolfVision PF5 mainboard and the overlay for the PF5 IO Expander have been accepted for inclusion in Linux v6.10: https://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip.git/log/?h=v6.10-armsoc/dts64 Once the device tree changes are merged and then integrated into barebox these files should vanish. Signed-off-by: Michael Riesch <michael.riesch@wolfvision.net> Link: https://lore.barebox.org/20240412-feature-wolfvision-pf5-v2-1-7e277cc8831b@wolfvision.net Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * ARM: Rockchip: bbu: allow forcing barebox update handler despite sizeAhmad Fatoum7 days1-3/+3
| | | | | | | | | | | | | | | | | | | | | | | | The update handler correctly refuses to write a bootloader when it would interfere with partitioning. Depending on use case, the user may want to override this check though, so allow the barebox update force parameter to override it. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20240415052815.366527-3-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * ARM: Rockchip: bbu: output unallocated space size on errorAhmad Fatoum7 days1-2/+2
| | | | | | | | | | | | | | | | | | | | While devinfo can be used to deduce the unallocated size before the first partition, let's just print it out on error to improve the user experience. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20240415052815.366527-2-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * ARM: Rockchip: bbu: rename rk3568_bbu_mmc_register to rockchip_*Ahmad Fatoum7 days7-20/+20
| | | | | | | | | | | | | | | | | | | | | | | | The update handler isn't restricted to the RK3568, but is also usable for other RKNS SoCs. With minor modification, it is also usable for the RK3399 and perhaps even older SoCs, so let's rename it to rockchip_bbu_mmc_handler instead. We can always do SoC-type checks inside to handle differences. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20240415052815.366527-1-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * clk: rk3568: sync PLL rates with LinuxAhmad Fatoum8 days1-0/+10
| | | | | | | | | | | | | | | | | | The Linux driver has gained additional PLL rates since we last synchronized. Add their parameters to barebox as well. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20240415053154.368546-1-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * ARM: dts: rockchip: drop unreferenced rockchip-pinconf.dtsiAhmad Fatoum8 days1-344/+0
| | | | | | | | | | | | | | | | | | | | This file is no longer used in barebox and existing drivers instead use the upstream variant. Therefore drop our unreferenced and possibly stale copy. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20240415053212.368779-1-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * ARM: dts: rk356x: describe serial reboot modeAhmad Fatoum8 days1-0/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The PMUGRF (Power Management Unit - General Register File) of the RK3568 has a general purpose register checked by the BootROM on power-on to decide on whether to drop to recovery mode (rk-usb-loader/rkdeveloptool). Describe this in the device tree, so it's possible to use, e.g. global.system.reboot_mode.next=serial reset to force falling into serial (USB) boot mode. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20240415053253.369354-1-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
* | Merge branch 'for-next/pwm' into nextSascha Hauer13 hours14-94/+502
|\ \
| * | ARM: dts: rk356x: add aliases for PWM controllersAhmad Fatoum8 days1-0/+19
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The Rockchip PWM driver will identify the different PWM chips by their MMIO address. Make the names shorter and easier to handle by assigning 0-based aliases according to their numbering in the TRM. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20240415053600.370622-8-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | PWM: rockchip: add driver supportAhmad Fatoum8 days3-0/+356
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Import the Linux v6.8 state of the driver to enable barebox control of PWM LEDs and other peripherals. This has been tested on the RK3566. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20240415053600.370622-7-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | PWM: core: add definition for PWM_POLARITY_INVERSEDAhmad Fatoum8 days2-2/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | PWM_POLARITY_INVERTED is the macro used in the DT binding, while PWM_POLARITY_INVERSED is the Linux driver macro that it is translated to. They are the same value, but Linux PWM chip drivers will use the latter, so define it as well. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20240415053600.370622-6-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | PWM: align struct pwm_state member names with LinuxAhmad Fatoum8 days10-76/+76
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This introduces no functional change, but removes some churn of porting Linux drivers by aligning the naming of the frequently used struct pwm_state. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20240415053600.370622-5-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | PWM: core: adopt Linux prototype for struct pwm_ops::applyAhmad Fatoum8 days7-7/+18
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In Linux, a pwm_chip can have more one pwm_device, one for each channel. Therefore, pwm_apply takes a pwm_device as argument to identify, which channel is the one being operated on. In barebox, there's a 1:1 relationship between the two, but let's add pwm_device as extra, so far unused, parameter to make porting kernel code slightly easier. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20240415053600.370622-4-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | PWM: core: add struct pwm_chip::devAhmad Fatoum8 days7-9/+16
| | | | | | | | | | | | | | | | | | | | | | | | | | | For compatibility with Linux, let's add a dev member into struct pwm_chip instead of passing it as argument to pwmchip_add Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20240415053600.370622-3-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | PWM: core: check that struct pwm_chip::devname is setAhmad Fatoum8 days1-0/+3
| |/ | | | | | | | | | | | | | | | | | | | | There's no equivalent to devname in the Linux API, but it's required for barebox and not populating the pointer in struct pwm_chip will lead to a crash inside pwmchip_add. Check that the pointer is non-NULL to catch this case. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20240415053600.370622-2-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
* | Merge branch 'for-next/pci' into nextSascha Hauer13 hours25-153/+970
|\ \
| * | pci: ignore BAR when it doesn't fit into bus resourceSascha Hauer2024-04-041-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | It can happen that a BAR doesn't fit into the bus resource. In this case just ignore the BAR instead of failing the device. This is what Linux does as well. This helps me on the Protonic MECSBC where a NVME drive offers a 1GiB BAR which doesn't seem to be needed to make the driver work. Link: https://lore.barebox.org/20240403080703.4098404-3-s.hauer@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | phy: rockchip: add pcie3 phy driverSascha Hauer2024-04-043-0/+323
| | | | | | | | | | | | | | | | | | | | | | | | This adds support for the Rockchip PCIe3 phy found on RK35x8 SoCs. The code is taken from Linux as of Linux-6.9-rc2. Link: https://lore.barebox.org/20240403080703.4098404-2-s.hauer@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | of: add of_property_read_variable_uxx_array()Sascha Hauer2024-04-042-20/+220
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This adds of_property_read_variable_uxx_array() which allow to read arrays from properties with min/max size boundaries. Code is directly taken from Linux. We already had of_property_read_variable_u64_array(), but without min/max arguments. This one is updated to match the Kernel code. Link: https://lore.barebox.org/20240403080703.4098404-1-s.hauer@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | ARM: dts: rk3588-rock-5b: remove pci ranges quirksSascha Hauer2024-04-041-15/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We did not support non 1:1 mappings between CPU and PCI bus, so we had to adjust the ranges property to be 1:1 instead to make PCIe work on the Rock-5b board. This has been fixed now, so we can remove the overwritten ranges property. Link: https://lore.barebox.org/20240326100746.471532-17-s.hauer@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | pci: pcie-designware: iterate over windowsSascha Hauer2024-04-041-14/+13
| | | | | | | | | | | | | | | | | | | | | | | | | | | The ranges property has already been parsed in pci_controller_init(), so instead of iterating over the ranges again, use the result stored in the resource_entry list to initialize the controller base addresses. Link: https://lore.barebox.org/20240326100746.471532-16-s.hauer@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | pci: pcie-designware: remove dra7xx quirksSascha Hauer2024-04-042-35/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The pcie-designware driver has several quirks needed only for dra7xx which we currently do not support in barebox. In Linux these quirks have been moved to the dra7xx glue code over time. Remove the quirks to cleanup the driver a bit. See these Linux commits for more explanations: 9cdce1cdc0c4 ("Revert "PCI: designware: Program ATU with untranslated address"") 883cc17cb193 ("PCI: designware: Move calculation of bus addresses to DRA7xx") Link: https://lore.barebox.org/20240326100746.471532-15-s.hauer@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | pci: pcie-designware: drop duplicate resource assigningSascha Hauer2024-04-041-11/+2
| | | | | | | | | | | | | | | | | | | | | The resources in the pci_controller are already assigned in Link: https://lore.barebox.org/20240326100746.471532-14-s.hauer@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | pci: add of_pci_bridge_init()Sascha Hauer2024-04-044-0/+115
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | So far we assume a 1:1 mapping between the CPU and bus address space. This is not always the case and different mappings are described in the ranges device tree property. Parse the property and call pci_add_resource_offset() accordingly. The code is based on the corresponding Kernel code. Link: https://lore.barebox.org/20240326100746.471532-13-s.hauer@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | pci: drop resources from struct pci_busSascha Hauer2024-04-022-22/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | struct pci_bus has resources attached to it. They pointers are copied from the pci_controller to the pci_bus and from there to the child buses. Drop them and use the resources from the pci_controller directly. Link: https://lore.barebox.org/20240326100746.471532-12-s.hauer@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | pci: pcie-dw-rockchip: wait for linkSascha Hauer2024-04-021-0/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | Wait for the link to be established before continuing the probe. While in some configurations the link might come up fast enough, on a RK3568 no device was found without it. Link: https://lore.barebox.org/20240326100746.471532-11-s.hauer@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | pci: pcie-designware: Speed up waiting for linkSascha Hauer2024-04-022-7/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When the link is not up the first time we test for it, then we wait for 100ms before trying again. This adds unnecessary delays when the link is up considerably faster than 100ms. As we do not have anything useful to do with our CPU time during polling for link we can equally well poll as fast as we can. Link: https://lore.barebox.org/20240326100746.471532-10-s.hauer@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | pci: support non 1:1 mappingsSascha Hauer2024-04-025-3/+133
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Currently we assume that the addresses on the PCI bus are mapped 1:1 to the host CPU. This is not always true. Specifically on Rockchip RK3568 and RK3588 we have ranges properties in the device tree which introduce a different mapping. We already worked around this by changing the ranges property to a 1:1 mapping in b10ee53 ("ARM: rockchip: rock-5a: Disable non working devices"). To get rid of the workaround this patch introduces support for non 1:1 mappings. We do this by porting the bare minimum from Linux drivers/pci/host-bridge.c over to barebox. Link: https://lore.barebox.org/20240326100746.471532-9-s.hauer@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | pci: add pci_controller_init()Sascha Hauer2024-04-028-3/+21
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Upcoming patches will add a list to struct pci_controller. To make sure we have a single point to initialize the list introduce a pci_controller_init() and call it from all drivers which use register_pci_controller(). Make sure host->parent is set correctly before calling register_pci_controller() as that will be needed for device tree parsing later. Link: https://lore.barebox.org/20240326100746.471532-8-s.hauer@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | pci: dwc: Drop support for config space in 'ranges'Sascha Hauer2024-04-022-15/+2
| | | | | | | | | | | | | | | | | | | | | | | | Following Linux commit 2f5ab5afe018 ("PCI: dwc: Drop support for config space in 'ranges'") let's do the same for barebox. Link: https://lore.barebox.org/20240326100746.471532-7-s.hauer@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | pci: pcie-designware: remove unused variableSascha Hauer2024-04-022-3/+0
| | | | | | | | | | | | | | | | | | | | | struct pcie_port::mem_base is set but not used. Remove it. Link: https://lore.barebox.org/20240326100746.471532-6-s.hauer@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | add support for resource listsSascha Hauer2024-04-022-0/+97
| | | | | | | | | | | | | | | | | | | | | | | | | | | Linux has support for resource_lists. These are for collecting resources along with a translation offset on a list. Copy it over to barebox for use in our pci support. Link: https://lore.barebox.org/20240326100746.471532-5-s.hauer@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | pci: rename parent_bus to parentSascha Hauer2024-04-023-3/+3
| | | | | | | | | | | | | | | | | | | | | | | | In Linux struct pci_bus has a pointer to its parent bus named 'parent'. Rename parent_bus to parent to be more conform with Linux. Link: https://lore.barebox.org/20240326100746.471532-4-s.hauer@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | pci: add 'self' member to struct pci_busSascha Hauer2024-04-022-5/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In Linux struct pci_bus has a 'parent' member which is a pointer to the parent pci_bus. In barebox we also have a 'parent' member, but it is of type struct device *. To be closer to Linux remove the parent member and replace its usage with a struct pci_dev *self member (which also exists in Linux). Link: https://lore.barebox.org/20240326100746.471532-3-s.hauer@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | net: phy: realtek: add phy for RTL8168 internal phySascha Hauer2024-04-021-0/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The integrated PHY's of later RTL8168 network chips report the generic PHYID 0x001cc800 (Realtek OUI, model and revision number both set to zero) and therefore currently the genphy driver is used. To be able to use the paged version of e.g. phy_write() we need a PHY driver with the read_page and write_page callbacks implemented. Link: https://lore.barebox.org/20240326100746.471532-2-s.hauer@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
* | | Merge branch 'for-next/net' into nextSascha Hauer13 hours3-51/+88
|\ \ \
| * | | net: usb: smsc95xx: disable HW checksumming in driverAhmad Fatoum2024-04-051-29/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We currently enable hardware checksumming, which means the NIC will add two bytes of checksum after each packet with the computed checksum. We don't use those two bytes however and will recompute the checksum anyway. Because we also don't adjust the size reported to the network stack to be 2 bytes shorter, we trigger the newly introduced WARN_ON_ONCE when DEBUG is #define'd that checks this condition, so let's just disable the checksumming altogether and remove left-over dead code associated with it. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20240404184001.1532897-11-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | | net: usb: smsc95xx: fix handling of multiple packets per urbAhmad Fatoum2024-04-051-2/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | len is the actual length of the USB bulk transfer, while size is the length of the current packet, which may be different if we have multiple packets per transfer. We don't seem to run into this in barebox, perhaps because of our MTU, but let's fix it anyway. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20240404184001.1532897-10-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | | net: usb: smsc95xx: don't blindly trust hardware sizeAhmad Fatoum2024-04-051-0/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is a port of Linux commit ff821092cf02a70c2bccd2d19269f01e29aa52cf: | Author: Szymon Heidrich <szymon.heidrich@gmail.com> | AuthorDate: Thu Mar 16 11:19:54 2023 +0100 | | net: usb: smsc95xx: Limit packet length to skb->len | | Packet length retrieved from descriptor may be larger than | the actual socket buffer length. In such case the cloned | skb passed up the network stack will leak kernel memory | contents. | | Fixes: 2f7ca802bdae ("net: Add SMSC LAN9500 USB2.0 10/100 ethernet adapter driver") | Signed-off-by: Szymon Heidrich <szymon.heidrich@gmail.com> | Reviewed-by: Jakub Kicinski <kuba@kernel.org> | Link: https://lore.kernel.org/r/20230316101954.75836-1-szymon.heidrich@gmail.com | Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20240404184001.1532897-9-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | | net: usb: smsc95xx: don't opencode get/put_aligned_le32Ahmad Fatoum2024-04-051-8/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This introduces no functional change, but makes code easier to read and aligns us some more with the current Linux state of the driver. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20240404184001.1532897-8-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | | net: cpsw: report correct frame size to network stackAhmad Fatoum2024-04-051-1/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If the NIC reports that there is a computed CRC appended to the frame content, we need to subtract its size from the total length before passing that further down the network stack. This fixes a WARN_ON_ONCE reported by the network stack when built with #define DEBUG, because the expected size as indicated by the IP header is not the same as what's reported by the driver. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20240404184001.1532897-7-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | | net: icmp: don't overrun buffer on sendAhmad Fatoum2024-04-051-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | len is the size of the ICMP echo request and the ICMP echo response will have the exact same size, but the code erroneously, copied ETHER_HDR_SIZE bytes worth of extra data beyond the buffer and sent that out. Fix this by using the correct length. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20240404184001.1532897-6-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | | net: icmp: properly set IP TTL and fragement fieldsAhmad Fatoum2024-04-051-1/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We shouldn't keep using the TTL value of the ICMP echo request, as we are sending a fresh packet, therefore restore it to the maximum value. While at it, also fix the frag_off field: A fragment offset of 0 on its own doesn't mean that there's no fragmentation, but that this is the first fragment. Writing 0x4000 there sets the "Don't fragment" bit, which we are already setting for all other IP communication and should be setting here as well. Suggested-by: Jan Lübbe <j.luebbe@pengutronix.de> Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20240404184001.1532897-5-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | | net: icmp: don't blindly trust driver supplied frame sizeAhmad Fatoum2024-04-051-1/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The barebox network stack calls ping_reply() to handle ICMP echo requests. The function copies destination addresses to source addresses, fixes up some fields, recalculates checksums and then sends back the ICMP echo response. There are two checksums involved: The IP checksum over the IP header and the ICMP header spanning the ICMP payload, which extends to the end of packet. The number of bytes that the ICMP checksum should be computed for was being calculated as total_size_reported_by_nic - iphdr_size - ethhdr_size. This is wrong as it assumes that the IP payload extends until the end of packet. There are multiple reasons this may not be the case: - The packet is smaller than the minimum and is thus padded. - The sender adds trailing bytes after the IP payload for no reason. - The network driver reports a wrong size, because it doesn't correctly handle extra bytes added by hardware checksum offloading. The last one affects the barebox cpsw and smsc95xx drivers, which will be fixed up in follow-up commits. The proper solution is to use the same length for the payload and for its checksum. Do this by using the new ip_verify_size(), which will take care to fix up the size discrepancy. This issue was found by trying to ping a Raspberry Pi 3b running barebox sitting behind a router employing conntrack, which apparently discarded the ping responses due to the wrong ICMP checksum. These issues did not occur without such a router in-beween, because the ping command itself doesn't bother to verify the checksum. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20240404184001.1532897-4-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | | net: ip: don't blindly trust driver supplied frame sizeAhmad Fatoum2024-04-051-3/+40
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We currently assume that the size reported by the network driver reflects the number of bytes actually transmitted over the wire, but this is apparently not always the case, at least for the barebox cpsw and smc95xx drivers. These don't handle hardware checksum offloading correctly and thus pass extraneous checksum bytes inserted by the hardware to the network stack as if these were part of the transmitted frame. These drivers will be fixed in follow-up commits, but on the off-chance more drivers are affected, let's use the size reported in the IP header when doing IP packet processing. As the old size is needed to dump the packet in net_bad_packet(), this is moved inside the new function. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20240404184001.1532897-3-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
| * | | net: free packets with net_free_packetAhmad Fatoum2024-04-051-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | While ultimately the same (net_free_packet == dma_free == free), this will not necessarily be always the case, so let's use the dedicated net_free_packet function to free the packets. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20240404184001.1532897-2-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>