There is a popular set of Lantiq xrx200 router boards by AVM in Germany (AVM Fritzbox 3390, 3490, 5490, 5491 and 7490) which have the strange implementation of having the wifi cards connected to a separate memory only ATH79 based SoC. It has no persistent storage and no access to any resource on the Lantiq host, but is connect to the Lantiq GSWIP switch on an additional fixed internal network port. This kernel module is to support booting the secondary SoC called Wireless Assistant Support Processor (WASP). After turning it on, a small network boot firmware is sent to the SoC by using mdio and when it is started, an initramfs linux image is sent to the SoC using raw ethernet frames. The whole procedure takes about 6 seconds, if there is no error. So far tested on 3490, 5490 and 7490 devices based on OpenWrt, 3390 takes about 20 seconds. Patch 1/3 adds the vendor name Patch 2/3 adds the dt-bindings Patch 3/3 adds the remoteproc driver To build and run, there is OpenWrt PR 5075. Please review. Changes in v5: - Replace names for properties and descriptions as requested in the device tree documentation and change the driver to accept them - Change example in the device tree documentation - Restructure constants and defines in the beginning of the driver source for better readability - Combine m_start_addr and m_exec_addr into a single constant and change avm_wasp_netboot_write_header to use only this one constant - Change variable startup_gpio to power_gpio in driver Changes in v4: - Fix compiler warnings with W=2 option Changes in v3: - Replace generic avm,fritzboxx490-wasp with actual device names for device tree documentation and change the driver to accept them - Add maxItems to device tree documentation - Change example in the device tree documentation - Fix wait time to make the Wasp upload work for 3390 more reliable - Enable the SOC on driver load, use reset instead of disable/enable while driver is loaded and disable on unloading the driver - Change some messages printed to adhere to standards (e.g. remove !) Changes in v2: - Remove firmware names from dt-binding and add as kmod parameters - Rename other bindings with vender prefix and fix gpios suffix - Change descriptions in dt-binding - Replace/Remove asynch load of firmware with request_firmware_direct - Fix comments to use the errno define instead of the number - Implement wait loops with read_poll_timeout() macro - Wrap read_poll_timeout() macro in function saving 6k module size - Return -ETIMEDOUT for all errors returned by read_poll_timeout - Replace mdio writes/reads with mdiobus_write and mdiobus_read and add return codes and their handling - Remove mutex for mdiobus_lock and add return code checking for mdio ops - Replaced the mdio register array with directly specifying registers - As a result of the previous 3 changes remove the functions for mdio - Consolidate error messages for mdio writes into a single one saved 1k for module size - Replaced mdelay with usleep_range saved 0,7k module size - Remove unneeded include <linux/interrupt.h> and <linux/error.h> - Wrap all blocks with {} and fix some indentation errors - Change const len in to size_t in avm_wasp_netboot_write_chunk - Make all methods static to fix kernel bot warning - Change read variable name in avm_wasp_load_initramfs_image - Change ssize_t variables to size_t in avm_wasp_load_initramfs_image - avm_wasp_netboot_write_chunk change for loop for 2 byte divisibility - Change uint32_t to u32 - Change int count = -1 to u32 with U32_MAX initialisation - Add check for firmware len divisable by 4 - Replace big endian bit shift operations with be32_to_cpu - Change loop to write 14 byte firmware chuncks like suggested - Change WASP_CHUNK_SIZE to ARRAY_SIZE(mac_data) for readability - Change int done to boolean - Change unsigned ints to u32 - Change int to size_t for send_len - Use int for numbytes because kernel_recvmsg returns error or number - Two sockets are not needed, so reduce to one socket usage - Remove struct timeval definition, replace with __kernel_old_timeval - __kernel_old_timeval is depracated, but arch mips is 32bit platform - Replace &avmwasp->pdev->dev with local dev - Check if wasp network interface is up and fail if not in start method - Remove setsockopt for SO_REUSEADDR and SO_BINDTODEVICE - Remove packet_counter - Move firmware and firmware_end out of RESP_DISCOVER to make sure that they are initialized if RESP_DISCOVER is not happening first - indend break; - Move second half of the send/receive paket while loop to RESP_OK and let RESP_DISCOVER fall through - Remove bringing up the wasp network interface - Check if wasp network interface is up in probe and defer if not - Remove the check for the root device and replace it with match data for WASP device identification - Move of_read and find of mdio bus to rproc_start but delete reference after using it in the rproc_start method - Replace dev_set_drvdata with platform_set_drvdata - Remove avm_wasp_rproc_boot_addr because its not needed and move setting the fw struct pointer to avm_wasp_rproc_load - Move avm_wasp.h definitions to kernel module Reported-by: kernel test robot <lkp@xxxxxxxxx> Daniel Kestrel (3): dt-bindings: vendor-prefixes: Add AVM dt-bindings: remoteproc: Add AVM WASP remoteproc: Add AVM WASP driver .../bindings/remoteproc/avm,wasp-rproc.yaml | 61 + .../devicetree/bindings/vendor-prefixes.yaml | 2 + drivers/remoteproc/Kconfig | 10 + drivers/remoteproc/Makefile | 1 + drivers/remoteproc/avm_wasp.c | 1051 +++++++++++++++++ 5 files changed, 1125 insertions(+) create mode 100644 Documentation/devicetree/bindings/remoteproc/avm,wasp-rproc.yaml create mode 100644 drivers/remoteproc/avm_wasp.c -- 2.17.1